Commit c24900be by Mikael Pettersson Committed by Jeff Law

re PR target/57583 (large switches with jump tables are horribly broken on m68k)

2017-01-06  Mikael Pettersson  <mikpelinux@gmail.com>

	PR target/57583
	* config/m68k/m68k.opt (LONG_JUMP_TABLE_OFFSETS): New option.
	* config/m68k/linux.h (ASM_RETURN_CASE_JUMP): Handle
	TARGET_LONG_JUMP_TABLE_OFFSETS.
	* config/m68k/m68kelf.h (ASM_RETURN_CASE_JUMP): Likewise.
	* config/m68k/netbsd-elf.h (ASM_RETURN_CASE_JUMP): Likewise.
	* config/m68k/m68k.h (CASE_VECTOR_MODE): Likewise.
	(ASM_OUTPUT_ADDR_DIFF_ELF): Likewise.
	* config/m68k/m68k.md (tablejump expander): Likewise.
	(*tablejump_pcrel_hi): Renamed from unnamed insn, reject
	TARGET_LONG_JUMP_TABLE_OFFSETS.
	(*tablejump_pcrel_si): New insn, handle TARGET_LONG_JUMP_TABLE_OFFSETS.
	* doc/invoke.texi (M68K options): Add -mlong-jump-table-offsets.

From-SVN: r244184
parent b69195a0
2017-01-06 Mikael Pettersson <mikpelinux@gmail.com>
PR target/57583
* config/m68k/m68k.opt (LONG_JUMP_TABLE_OFFSETS): New option.
* config/m68k/linux.h (ASM_RETURN_CASE_JUMP): Handle
TARGET_LONG_JUMP_TABLE_OFFSETS.
* config/m68k/m68kelf.h (ASM_RETURN_CASE_JUMP): Likewise.
* config/m68k/netbsd-elf.h (ASM_RETURN_CASE_JUMP): Likewise.
* config/m68k/m68k.h (CASE_VECTOR_MODE): Likewise.
(ASM_OUTPUT_ADDR_DIFF_ELF): Likewise.
* config/m68k/m68k.md (tablejump expander): Likewise.
(*tablejump_pcrel_hi): Renamed from unnamed insn, reject
TARGET_LONG_JUMP_TABLE_OFFSETS.
(*tablejump_pcrel_si): New insn, handle TARGET_LONG_JUMP_TABLE_OFFSETS.
* doc/invoke.texi (M68K options): Add -mlong-jump-table-offsets.
2017-01-06 Edgar E. Iglesias <edgar.iglesias@xilinx.com> 2017-01-06 Edgar E. Iglesias <edgar.iglesias@xilinx.com>
David Holsgrove <david.holsgrove@xilinx.com> David Holsgrove <david.holsgrove@xilinx.com>
......
...@@ -98,9 +98,13 @@ along with GCC; see the file COPYING3. If not see ...@@ -98,9 +98,13 @@ along with GCC; see the file COPYING3. If not see
{ \ { \
if (ADDRESS_REG_P (operands[0])) \ if (ADDRESS_REG_P (operands[0])) \
return "jmp %%pc@(2,%0:l)"; \ return "jmp %%pc@(2,%0:l)"; \
else if (TARGET_LONG_JUMP_TABLE_OFFSETS) \
return "jmp %%pc@(2,%0:l)"; \
else \ else \
return "ext%.l %0\n\tjmp %%pc@(2,%0:l)"; \ return "ext%.l %0\n\tjmp %%pc@(2,%0:l)"; \
} \ } \
else if (TARGET_LONG_JUMP_TABLE_OFFSETS) \
return "jmp %%pc@(2,%0:l)"; \
else \ else \
return "jmp %%pc@(2,%0:w)"; \ return "jmp %%pc@(2,%0:w)"; \
} while (0) } while (0)
......
...@@ -675,7 +675,7 @@ __transfer_from_trampoline () \ ...@@ -675,7 +675,7 @@ __transfer_from_trampoline () \
/* This address is OK as it stands. */ /* This address is OK as it stands. */
#define PIC_CASE_VECTOR_ADDRESS(index) index #define PIC_CASE_VECTOR_ADDRESS(index) index
#define CASE_VECTOR_MODE HImode #define CASE_VECTOR_MODE (TARGET_LONG_JUMP_TABLE_OFFSETS ? SImode : HImode)
#define CASE_VECTOR_PC_RELATIVE 1 #define CASE_VECTOR_PC_RELATIVE 1
#define DEFAULT_SIGNED_CHAR 1 #define DEFAULT_SIGNED_CHAR 1
...@@ -857,7 +857,11 @@ do { if (cc_prev_status.flags & CC_IN_68881) \ ...@@ -857,7 +857,11 @@ do { if (cc_prev_status.flags & CC_IN_68881) \
asm_fprintf (FILE, "\t.long %LL%d\n", VALUE) asm_fprintf (FILE, "\t.long %LL%d\n", VALUE)
#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
asm_fprintf (FILE, "\t.word %LL%d-%LL%d\n", VALUE, REL) asm_fprintf (FILE, \
TARGET_LONG_JUMP_TABLE_OFFSETS \
? "\t.long %LL%d-%LL%d\n" \
: "\t.word %LL%d-%LL%d\n", \
VALUE, REL)
/* We don't have a way to align to more than a two-byte boundary, so do the /* We don't have a way to align to more than a two-byte boundary, so do the
best we can and don't complain. */ best we can and don't complain. */
......
...@@ -6695,7 +6695,9 @@ ...@@ -6695,7 +6695,9 @@
{ {
#if CASE_VECTOR_PC_RELATIVE #if CASE_VECTOR_PC_RELATIVE
operands[0] = gen_rtx_PLUS (SImode, pc_rtx, operands[0] = gen_rtx_PLUS (SImode, pc_rtx,
gen_rtx_SIGN_EXTEND (SImode, operands[0])); TARGET_LONG_JUMP_TABLE_OFFSETS
? operands[0]
: gen_rtx_SIGN_EXTEND (SImode, operands[0]));
#endif #endif
}) })
...@@ -6710,12 +6712,26 @@ ...@@ -6710,12 +6712,26 @@
[(set_attr "type" "jmp")]) [(set_attr "type" "jmp")])
;; Jump to variable address from dispatch table of relative addresses. ;; Jump to variable address from dispatch table of relative addresses.
(define_insn "" (define_insn "*tablejump_pcrel_si"
[(set (pc)
(plus:SI (pc)
(match_operand:SI 0 "register_operand" "r")))
(use (label_ref (match_operand 1 "" "")))]
"TARGET_LONG_JUMP_TABLE_OFFSETS"
{
#ifdef ASM_RETURN_CASE_JUMP
ASM_RETURN_CASE_JUMP;
#else
return MOTOROLA ? "jmp (2,pc,%0.l)" : "jmp pc@(2,%0:l)";
#endif
})
(define_insn "*tablejump_pcrel_hi"
[(set (pc) [(set (pc)
(plus:SI (pc) (plus:SI (pc)
(sign_extend:SI (match_operand:HI 0 "register_operand" "r")))) (sign_extend:SI (match_operand:HI 0 "register_operand" "r"))))
(use (label_ref (match_operand 1 "" "")))] (use (label_ref (match_operand 1 "" "")))]
"" "!TARGET_LONG_JUMP_TABLE_OFFSETS"
{ {
#ifdef ASM_RETURN_CASE_JUMP #ifdef ASM_RETURN_CASE_JUMP
ASM_RETURN_CASE_JUMP; ASM_RETURN_CASE_JUMP;
......
...@@ -142,6 +142,10 @@ mid-shared-library ...@@ -142,6 +142,10 @@ mid-shared-library
Target Report Mask(ID_SHARED_LIBRARY) Target Report Mask(ID_SHARED_LIBRARY)
Enable ID based shared library. Enable ID based shared library.
mlong-jump-table-offsets
Target Report RejectNegative Mask(LONG_JUMP_TABLE_OFFSETS)
Use 32-bit offsets in jump tables rather than 16-bit offsets.
mnobitfield mnobitfield
Target RejectNegative InverseMask(BITFIELD) Target RejectNegative InverseMask(BITFIELD)
Do not use the bit-field instructions. Do not use the bit-field instructions.
......
...@@ -58,9 +58,13 @@ along with GCC; see the file COPYING3. If not see ...@@ -58,9 +58,13 @@ along with GCC; see the file COPYING3. If not see
{ \ { \
if (ADDRESS_REG_P (operands[0])) \ if (ADDRESS_REG_P (operands[0])) \
return "jmp %%pc@(2,%0:l)"; \ return "jmp %%pc@(2,%0:l)"; \
else if (TARGET_LONG_JUMP_TABLE_OFFSETS) \
return "jmp %%pc@(2,%0:l)"; \
else \ else \
return "ext%.l %0\n\tjmp %%pc@(2,%0:l)"; \ return "ext%.l %0\n\tjmp %%pc@(2,%0:l)"; \
} \ } \
else if (TARGET_LONG_JUMP_TABLE_OFFSETS) \
return "jmp %%pc@(2,%0:l)"; \
else \ else \
return "jmp %%pc@(2,%0:w)"; \ return "jmp %%pc@(2,%0:w)"; \
} while (0) } while (0)
......
...@@ -136,9 +136,13 @@ while (0) ...@@ -136,9 +136,13 @@ while (0)
{ \ { \
if (ADDRESS_REG_P (operands[0])) \ if (ADDRESS_REG_P (operands[0])) \
return "jmp %%pc@(2,%0:l)"; \ return "jmp %%pc@(2,%0:l)"; \
else if (TARGET_LONG_JUMP_TABLE_OFFSETS) \
return "jmp %%pc@(2,%0:l)"; \
else \ else \
return "ext%.l %0\n\tjmp %%pc@(2,%0:l)"; \ return "ext%.l %0\n\tjmp %%pc@(2,%0:l)"; \
} \ } \
else if (TARGET_LONG_JUMP_TABLE_OFFSETS) \
return "jmp %%pc@(2,%0:l)"; \
else \ else \
return "jmp %%pc@(2,%0:w)"; \ return "jmp %%pc@(2,%0:w)"; \
} while (0) } while (0)
......
...@@ -837,7 +837,7 @@ Objective-C and Objective-C++ Dialects}. ...@@ -837,7 +837,7 @@ Objective-C and Objective-C++ Dialects}.
-mno-short -mhard-float -m68881 -msoft-float -mpcrel @gol -mno-short -mhard-float -m68881 -msoft-float -mpcrel @gol
-malign-int -mstrict-align -msep-data -mno-sep-data @gol -malign-int -mstrict-align -msep-data -mno-sep-data @gol
-mshared-library-id=n -mid-shared-library -mno-id-shared-library @gol -mshared-library-id=n -mid-shared-library -mno-id-shared-library @gol
-mxgot -mno-xgot} -mxgot -mno-xgot -mlong-jump-table-offsets}
@emph{MCore Options} @emph{MCore Options}
@gccoptlist{-mhardlit -mno-hardlit -mdiv -mno-div -mrelax-immediates @gol @gccoptlist{-mhardlit -mno-hardlit -mdiv -mno-div -mrelax-immediates @gol
...@@ -18476,6 +18476,11 @@ object file that accesses more than 8192 GOT entries. Very few do. ...@@ -18476,6 +18476,11 @@ object file that accesses more than 8192 GOT entries. Very few do.
These options have no effect unless GCC is generating These options have no effect unless GCC is generating
position-independent code. position-independent code.
@item -mlong-jump-table-offsets
@opindex mlong-jump-table-offsets
Use 32-bit offsets in @code{switch} tables. The default is to use
16-bit offsets.
@end table @end table
@node MCore Options @node MCore Options
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment