rs6000.c (output_toc): Allow 32-bit targets to handle DImode constants.
authorFranz Sirl <Franz.Sirl-kernel@lauterbach.com>
Fri, 9 Feb 2001 03:15:56 +0000 (03:15 +0000)
committerDavid Edelsohn <dje@gcc.gnu.org>
Fri, 9 Feb 2001 03:15:56 +0000 (22:15 -0500)
        * config/rs6000/rs6000.c (output_toc): Allow 32-bit targets to
        handle DImode constants.  Use one TOC entry for SImode and smaller
        constants, aligned properly.

Co-Authored-By: David Edelsohn <edelsohn@gnu.org>
From-SVN: r39557

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index d2562aa40bcb4a3d4d9d610c4293ab9fed6f6f82..654d2223db18580975a803dcb54d69d50e9b908e 100644 (file)
@@ -1,3 +1,10 @@
+2001-02-05  Franz Sirl  <Franz.Sirl-kernel@lauterbach.com>
+           David Edelsohn  <edelsohn@gnu.org>
+
+       * config/rs6000/rs6000.c (output_toc): Allow 32-bit targets to
+       handle DImode constants.  Use one TOC entry for SImode and smaller
+       constants, aligned properly.
+
 2001-02-08  Jason Merrill  <jason@redhat.com>
 
        * config/arm/arm.c (arm_expand_prologue): Do tell the dwarf2 backend
index d64d7772289383f95c416c3ccb6429e834317df2..2640c60c12097130c6acbbc048a017bb9a1e4ecf 100644 (file)
@@ -1783,6 +1783,7 @@ rs6000_emit_move (dest, source, mode)
                                  XEXP (operands[1], 0));
 
   emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
+  return;
 }
 \f
 /* Initialize a variable CUM of type CUMULATIVE_ARGS
@@ -6910,10 +6911,15 @@ output_toc (file, x, labelno, mode)
         integer constants in the TOC we have to pad them.
         (This is still a win over putting the constants in
         a separate constant pool, because then we'd have
-        to have both a TOC entry _and_ the actual constant.)  */
-      if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
+        to have both a TOC entry _and_ the actual constant.)
+
+        For a 32-bit target, CONST_INT values are loaded and shifted
+        entirely within `low' and can be stored in one TOC entry.  */
+
+      if (TARGET_64BIT && POINTER_SIZE < GET_MODE_BITSIZE (mode))
        abort ();/* It would be easy to make this work, but it doesn't now.  */
-      if (mode != Pmode)
+
+      if (POINTER_SIZE > GET_MODE_BITSIZE (mode))
        lshift_double (low, high, POINTER_SIZE - GET_MODE_BITSIZE (mode),
                       POINTER_SIZE, &low, &high, 0);
 
@@ -6928,12 +6934,24 @@ output_toc (file, x, labelno, mode)
        }
       else
        {
-         if (TARGET_MINIMAL_TOC)
-           fprintf (file, "\t.long 0x%lx\n\t.long 0x%lx\n",
-                    (long)high, (long)low);
+         if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
+           {
+             if (TARGET_MINIMAL_TOC)
+               fprintf (file, "\t.long 0x%lx\n\t.long 0x%lx\n",
+                        (long)high, (long)low);
+             else
+               fprintf (file, "\t.tc ID_%lx_%lx[TC],0x%lx,0x%lx\n",
+                        (long)high, (long)low, (long)high, (long)low);
+           }
          else
-           fprintf (file, "\t.tc ID_%lx_%lx[TC],0x%lx,0x%lx\n",
-                    (long)high, (long)low, (long)high, (long)low);
+           {
+             if (TARGET_MINIMAL_TOC)
+               fprintf (file, "\t.long 0x%lx\n",
+                        (long)low);
+             else
+               fprintf (file, "\t.tc IS_%lx[TC],0x%lx\n",
+                        (long)low, (long)low);
+           }
          return;
        }
     }