This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[m68k 07/13] fix jump table addressing
- From: zippel at linux-m68k dot org
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 30 Jan 2007 12:26:22 +0100
- Subject: [m68k 07/13] fix jump table addressing
- References: <20070130112615.782382000@linux-m68k.org>
Hi,
This removes the workaround for some assemblers to address the jump
table with "Lnnn-LInnn-2.b(%pc)" and simply uses "Lnnn(%pc)" now, this
means the code to generate the extra label can go now.
As a side effect it allows gas to generate the best addressing based on
the offset.
2007-01-30 Roman Zippel <zippel@linux-m68k.org>
* config/m68k/m68k.c (output_move_himode)
config/m68k/m68k.md: remove jump table recognition
* config/m68k/m68k.c (ASM_OUTPUT_CASE_FETCH): use simple pc
relative addressing
---
gcc/config/m68k/m68k.c | 33 ++-------------------------------
gcc/config/m68k/m68k.md | 21 +--------------------
2 files changed, 3 insertions(+), 51 deletions(-)
Index: gcc/gcc/config/m68k/m68k.c
===================================================================
--- gcc.orig/gcc/config/m68k/m68k.c 2006-12-26 01:57:15.000000000 +0100
+++ gcc/gcc/config/m68k/m68k.c 2006-12-26 18:30:51.000000000 +0100
@@ -1819,25 +1819,6 @@ output_move_himode (rtx *operands)
}
else if (CONSTANT_P (operands[1]))
return "move%.l %1,%0";
- /* Recognize the insn before a tablejump, one that refers
- to a table of offsets. Such an insn will need to refer
- to a label on the insn. So output one. Use the label-number
- of the table of offsets to generate this label. This code,
- and similar code below, assumes that there will be at most one
- reference to each table. */
- if (GET_CODE (operands[1]) == MEM
- && GET_CODE (XEXP (operands[1], 0)) == PLUS
- && GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == LABEL_REF
- && GET_CODE (XEXP (XEXP (operands[1], 0), 0)) != PLUS)
- {
- rtx labelref = XEXP (XEXP (operands[1], 0), 1);
- if (MOTOROLA)
- asm_fprintf (asm_out_file, "\t.set %LLI%d,.+2\n",
- CODE_LABEL_NUMBER (XEXP (labelref, 0)));
- else
- (*targetm.asm_out.internal_label) (asm_out_file, "LI",
- CODE_LABEL_NUMBER (XEXP (labelref, 0)));
- }
return "move%.w %1,%0";
}
@@ -2957,16 +2938,6 @@ print_operand (FILE *file, rtx op, int l
It is possible for PIC to generate a (plus (label_ref...) (reg...))
and we handle that just like we would a (plus (symbol_ref...) (reg...)).
- Some SGS assemblers have a bug such that "Lnnn-LInnn-2.b(pc,d0.l*2)"
- fails to assemble. Luckily "Lnnn(pc,d0.l*2)" produces the results
- we want. This difference can be accommodated by using an assembler
- define such "LDnnn" to be either "Lnnn-LInnn-2.b", "Lnnn", or any other
- string, as necessary. This is accomplished via the ASM_OUTPUT_CASE_END
- macro. See m68k/sgs.h for an example; for versions without the bug.
- Some assemblers refuse all the above solutions. The workaround is to
- emit "K(pc,d0.l*2)" with K being a small constant known to give the
- right behavior.
-
They also do not like things like "pea 1.w", so we simple leave off
the .w on small constants.
@@ -2977,10 +2948,10 @@ print_operand (FILE *file, rtx op, int l
#if MOTOROLA
# define ASM_OUTPUT_CASE_FETCH(file, labelno, regname) \
- asm_fprintf (file, "%LL%d-%LLI%d.b(%Rpc,%s.", labelno, labelno, regname)
+ asm_fprintf (file, "%LL%d(%Rpc,%s.", labelno, regname)
#else /* !MOTOROLA */
# define ASM_OUTPUT_CASE_FETCH(file, labelno, regname) \
- asm_fprintf (file, "%Rpc@(%LL%d-%LLI%d-2:b,%s:", labelno, labelno, regname)
+ asm_fprintf (file, "%Rpc@(%LL%d,%s:", labelno, regname)
#endif /* !MOTOROLA */
void
Index: gcc/gcc/config/m68k/m68k.md
===================================================================
--- gcc.orig/gcc/config/m68k/m68k.md 2006-12-26 13:10:54.000000000 +0100
+++ gcc/gcc/config/m68k/m68k.md 2006-12-26 18:30:51.000000000 +0100
@@ -6696,26 +6696,7 @@
[(set (match_operand:SI 0 "nonimmediate_operand" "=a")
(match_operand:QI 1 "address_operand" "p"))]
""
-{
- /* Recognize an insn that refers to a table of offsets. Such an insn will
- need to refer to a label on the insn. So output one. Use the
- label-number of the table of offsets to generate this label. This code,
- and similar code above, assumes that there will be at most one reference
- to each table. */
- if (GET_CODE (operands[1]) == PLUS
- && GET_CODE (XEXP (operands[1], 1)) == LABEL_REF
- && GET_CODE (XEXP (operands[1], 0)) != PLUS)
- {
- rtx labelref = XEXP (operands[1], 1);
- if (MOTOROLA)
- asm_fprintf (asm_out_file, "\\t.set %LLI%d,.+2\\n",
- CODE_LABEL_NUMBER (XEXP (labelref, 0)));
- else
- (*targetm.asm_out.internal_label) (asm_out_file, "LI",
- CODE_LABEL_NUMBER (XEXP (labelref, 0)));
- }
- return "lea %a1,%0";
-})
+ "lea %a1,%0")
;; This is the first machine-dependent peephole optimization.
;; It is useful when a floating value is returned from a function call
--