Commit 02a4ec28 by Franz Sirl Committed by David Edelsohn

rs6000.c (output_toc): Allow 32-bit targets to handle DImode constants.

        * 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
parent c97036e4
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> 2001-02-08 Jason Merrill <jason@redhat.com>
* config/arm/arm.c (arm_expand_prologue): Do tell the dwarf2 backend * config/arm/arm.c (arm_expand_prologue): Do tell the dwarf2 backend
......
...@@ -1783,6 +1783,7 @@ rs6000_emit_move (dest, source, mode) ...@@ -1783,6 +1783,7 @@ rs6000_emit_move (dest, source, mode)
XEXP (operands[1], 0)); XEXP (operands[1], 0));
emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1])); emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
return;
} }
/* Initialize a variable CUM of type CUMULATIVE_ARGS /* Initialize a variable CUM of type CUMULATIVE_ARGS
...@@ -6910,10 +6911,15 @@ output_toc (file, x, labelno, mode) ...@@ -6910,10 +6911,15 @@ output_toc (file, x, labelno, mode)
integer constants in the TOC we have to pad them. integer constants in the TOC we have to pad them.
(This is still a win over putting the constants in (This is still a win over putting the constants in
a separate constant pool, because then we'd have a separate constant pool, because then we'd have
to have both a TOC entry _and_ the actual constant.) */ to have both a TOC entry _and_ the actual constant.)
if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
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. */ 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), lshift_double (low, high, POINTER_SIZE - GET_MODE_BITSIZE (mode),
POINTER_SIZE, &low, &high, 0); POINTER_SIZE, &low, &high, 0);
...@@ -6928,12 +6934,24 @@ output_toc (file, x, labelno, mode) ...@@ -6928,12 +6934,24 @@ output_toc (file, x, labelno, mode)
} }
else else
{ {
if (TARGET_MINIMAL_TOC) if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
fprintf (file, "\t.long 0x%lx\n\t.long 0x%lx\n", {
(long)high, (long)low); 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 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; return;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment