2008-11-06 nobody Backport from mainline (SVN 128601): 2007-09-19 Roman Zippel * config/m68k/m68k.c (output_move_himode): Remove jump table recognition. config/m68k/m68k.md (lea): Likewise. * config/m68k/m68k.c (print_operand_address): Use simple pc relative addressing. diff -rup gcc-4.1.0-fsf/gcc/config/m68k/m68k.c gcc-4.1.0/gcc/config/m68k/m68k.c --- gcc-4.1.0-fsf/gcc/config/m68k/m68k.c 2005-12-29 16:10:35.000000000 +0100 +++ gcc-4.1.0/gcc/config/m68k/m68k.c 2008-11-06 19:43:10.000000000 +0100 @@ -1791,25 +1791,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"; } @@ -2718,27 +2699,6 @@ print_operand (FILE *file, rtx op, int l assembler syntax for an instruction operand that is a memory reference whose address is ADDR. ADDR is an RTL expression. - Note that this contains a kludge that knows that the only reason - we have an address (plus (label_ref...) (reg...)) when not generating - PIC code is in the insn before a tablejump, and we know that m68k.md - generates a label LInnn: on such an insn. - - 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. - This routine is responsible for distinguishing between -fpic and -fPIC style relocations in an address. When generating -fpic code the offset is output in word mode (e.g. movel a5@(_foo:w), a0). When generating @@ -2746,10 +2706,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 diff -rup gcc-4.1.0-fsf/gcc/config/m68k/m68k.md gcc-4.1.0/gcc/config/m68k/m68k.md --- gcc-4.1.0-fsf/gcc/config/m68k/m68k.md 2005-11-22 21:53:08.000000000 +0100 +++ gcc-4.1.0/gcc/config/m68k/m68k.md 2008-11-06 19:43:10.000000000 +0100 @@ -6327,30 +6327,11 @@ ;; This should not be used unless the add/sub insns can't be. -(define_insn "" +(define_insn "*lea" [(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