]> gcc.gnu.org Git - gcc.git/commitdiff
re PR target/14599 (ieee/20000320-1.c fails for -mips16 using -O2 and above)
authorRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 16 Mar 2004 09:22:36 +0000 (09:22 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 16 Mar 2004 09:22:36 +0000 (09:22 +0000)
PR target/14599
* config/mips/mips.md (UNSPEC_GP): New constant.
* config/mips/mips.c (CONST_GP_P): Expect the CONST to contain
an UNSPEC instead of (reg $gp).
(mips16_gp_pseudo_reg): Change accordingly.
(print_operand): Print $gp directly when handling CONST_GP_P.

From-SVN: r79527

gcc/ChangeLog
gcc/config/mips/mips.c
gcc/config/mips/mips.md

index b5f6e95299e82c4aa9cc7f1be8c7d09b2032a6f8..e56a4a9cffc8fa4df9c2af569605d084897061e4 100644 (file)
@@ -1,9 +1,18 @@
-2004-03-16 Richard Zidlicky <rz@linux-m68k.org>
+2004-03-16  Richard Sandiford  <rsandifo@redhat.com>
+
+       PR target/14599
+       * config/mips/mips.md (UNSPEC_GP): New constant.
+       * config/mips/mips.c (CONST_GP_P): Expect the CONST to contain
+       an UNSPEC instead of (reg $gp).
+       (mips16_gp_pseudo_reg): Change accordingly.
+       (print_operand): Print $gp directly when handling CONST_GP_P.
+
+2004-03-16  Richard Zidlicky  <rz@linux-m68k.org>
 
        * config.gcc, config/m68k/linux.h: Implement with-cpu for m68k-linux.
        * longlong.h: Make code 68060 clean when compiling for m68060.
 
-2004-03-16   Richard Zidlicky  <rz@linux-m68k.org>
+2004-03-16  Richard Zidlicky  <rz@linux-m68k.org>
 
        * config/m68k/m68k.md: Fix constraints for bitfield instructions.
        * doc/md.texi: Clarify description of "i" constraint.
index bedf920d385920df3407ff15344a88860fd30f9b..c11a65960a23240c8eb7f7b8f380533e23b85564 100644 (file)
@@ -87,10 +87,12 @@ enum internal_test {
 #define UNSPEC_ADDRESS_TYPE(X) \
   ((enum mips_symbol_type) (XINT (X, 1) - UNSPEC_ADDRESS_FIRST))
 
-/* True if X is (const $gp).  This is used to initialize the mips16
-   gp pseudo register.  */
+/* True if X is (const (unspec [(const_int 0)] UNSPEC_GP)).  This is used
+   to initialize the mips16 gp pseudo register.  */
 #define CONST_GP_P(X) \
-  (GET_CODE (X) == CONST && XEXP (X, 0) == pic_offset_table_rtx)
+  (GET_CODE (X) == CONST                       \
+   && GET_CODE (XEXP (X, 0)) == UNSPEC         \
+   && XINT (XEXP (X, 0), 1) == UNSPEC_GP)
 
 /* The maximum distance between the top of the stack frame and the
    value $sp has when we save & restore registers.
@@ -5564,7 +5566,7 @@ print_operand (FILE *file, rtx op, int letter)
     fputs (code == EQ ? "t" : "f", file);
 
   else if (CONST_GP_P (op))
-    print_operand (file, XEXP (op, 0), letter);
+    fputs (reg_names[GLOBAL_POINTER_REGNUM], file);
 
   else
     output_addr_const (file, op);
@@ -7799,7 +7801,7 @@ mips16_gp_pseudo_reg (void)
 {
   if (cfun->machine->mips16_gp_pseudo_rtx == NULL_RTX)
     {
-      rtx const_gp;
+      rtx unspec;
       rtx insn, scan;
 
       cfun->machine->mips16_gp_pseudo_rtx = gen_reg_rtx (Pmode);
@@ -7807,10 +7809,10 @@ mips16_gp_pseudo_reg (void)
 
       /* We want to initialize this to a value which gcc will believe
          is constant.  */
-      const_gp = gen_rtx_CONST (Pmode, pic_offset_table_rtx);
       start_sequence ();
+      unspec = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, const0_rtx), UNSPEC_GP);
       emit_move_insn (cfun->machine->mips16_gp_pseudo_rtx,
-                     const_gp);
+                     gen_rtx_CONST (Pmode, unspec));
       insn = get_insns ();
       end_sequence ();
 
index 189b59b61cb384d1824f3f6fbb930007a4db24dc..5b3c8465226f6bde2ccaf34e1fbd43815017257e 100644 (file)
@@ -56,6 +56,7 @@
    (UNSPEC_LOADGP              26)
    (UNSPEC_LOAD_CALL           27)
    (UNSPEC_LOAD_GOT            28)
+   (UNSPEC_GP                  29)
 
    (UNSPEC_ADDRESS_FIRST       100)
 
This page took 0.100707 seconds and 5 git commands to generate.