Port-amiga archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

gcc 4.1.2 m68k code generator bug fixed (lang/php5 compilation errors)



Hi!

I got a patch from Gunther Nikl, who works on gcc/AmigaOS, which fixes the
jumptable bug in the 68k code generator of gcc 4.1.2. It is responsible for
the compilation errors in pkgsrc/lang/php5 (php 5.2.6).

This patch comes from a backport from mainline (SVN 128601) to gcc 4.1.0,
but I could apply it to 4.1.2 without bigger problems. You will find it
attached.

Also I have put a new gcc binary for NetBSD/68k 4.0 onto the FTP server:
ftp://ftp.NetBSD.org/pub/NetBSD/misc/phx/gcc-4.1.2-update.tar.gz

It is tested, and lang/php5 compiles now.


-- 
    _  Frank Wille (frank%phoenix.owl.de@localhost)
 _ //  http://sun.hasenbraten.de/~frank/
 \X/   Phx @ #AmigaGer
2008-11-06  nobody

        Backport from mainline (SVN 128601):
        2007-09-19  Roman Zippel <zippel%linux-m68k.org@localhost>

        * 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


Home | Main Index | Thread Index | Old Index