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
This commit is contained in:
parent
b69195a0f4
commit
c24900be6b
|
@ -1,3 +1,19 @@
|
||||||
|
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
|
||||||
{ \
|
{ \
|
||||||
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 () \
|
||||||
|
|
||||||
/* 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) \
|
||||||
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 @@
|
||||||
{
|
{
|
||||||
#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 @@
|
||||||
[(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
|
||||||
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
|
||||||
{ \
|
{ \
|
||||||
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)
|
||||||
{ \
|
{ \
|
||||||
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}.
|
||||||
-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.
|
||||||
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
|
||||||
|
|
Loading…
Reference in New Issue