aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorJames Van Artsdalen <jrv@gnu.org>1993-10-05 05:52:39 +0000
committerJames Van Artsdalen <jrv@gnu.org>1993-10-05 05:52:39 +0000
commit2f17722aa9d902a552925b66b3638b5e0d153afc (patch)
tree5832234291169d20959c2b8e180b00c30be922f2 /gcc/config
parent303872755c1358d1a120c05959a046505d1176c4 (diff)
downloadgcc-2f17722aa9d902a552925b66b3638b5e0d153afc.zip
gcc-2f17722aa9d902a552925b66b3638b5e0d153afc.tar.gz
gcc-2f17722aa9d902a552925b66b3638b5e0d153afc.tar.bz2
(pushxf,movxf,extenddfxf2,extendsfxf2): Handle XFmode write to MEM by eading...
(pushxf,movxf,extenddfxf2,extendsfxf2): Handle XFmode write to MEM by eading back value after write if source doesn't die. (movxf,extenddfxf2,extendsfxf2): Don't emit fld before calling output_to_reg: output_to_reg does that now. From-SVN: r5601
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/i386/i386.md60
1 files changed, 17 insertions, 43 deletions
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 7576554..5a87914 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -1154,13 +1154,10 @@
xops[2] = stack_pointer_rtx;
output_asm_insn (AS2 (sub%L2,%1,%2), xops);
- if (find_regno_note (insn, REG_DEAD, FIRST_STACK_REG))
- output_asm_insn (AS1 (fstp%T0,%0), xops);
- else
- {
- output_asm_insn (AS1 (fld,%y1), operands);
- output_asm_insn (AS1 (fstp%T0,%y0), xops);
- }
+ output_asm_insn (AS1 (fstp%T0,%0), xops);
+ if (! find_regno_note (insn, REG_DEAD, FIRST_STACK_REG))
+ output_asm_insn (AS1 (fld%T0,%0), xops);
+
RET;
}
else
@@ -1211,11 +1208,6 @@
if (STACK_TOP_P (operands[1]) && NON_STACK_REG_P (operands[0]))
{
- if (stack_top_dies == 0)
- {
- output_asm_insn (AS1 (fld,%y1), operands);
- stack_top_dies = 1;
- }
output_to_reg (operands[0], stack_top_dies);
RET;
}
@@ -1224,13 +1216,11 @@
if (STACK_TOP_P (operands[1]))
{
- if (stack_top_dies)
- return AS1 (fstp%z0,%y0);
- else
- {
- output_asm_insn (AS1 (fld,%y1), operands);
- return AS1 (fstp%z0,%y0);
- }
+ output_asm_insn (AS1 (fstp%z0,%y0), operands);
+ if (! stack_top_dies)
+ return AS1 (fld%z0,%y0);
+
+ RET;
}
/* Handle other kinds of reads to the 387 */
@@ -1491,11 +1481,6 @@
if (NON_STACK_REG_P (operands[0]))
{
- if (stack_top_dies == 0)
- {
- output_asm_insn (AS1 (fld,%y1), operands);
- stack_top_dies = 1;
- }
output_to_reg (operands[0], stack_top_dies);
RET;
}
@@ -1505,13 +1490,10 @@
if (GET_CODE (operands[0]) == MEM)
{
- if (stack_top_dies)
- return AS1 (fstp%z0,%y0);
- else
- {
- output_asm_insn (AS1 (fld,%y1), operands);
- return AS1 (fstp%z0,%0);
- }
+ output_asm_insn (AS1 (fstp%z0,%y0), operands);
+ if (! stack_top_dies)
+ return AS1 (fld%z0,%y0);
+ RET;
}
abort ();
@@ -1534,11 +1516,6 @@
if (NON_STACK_REG_P (operands[0]))
{
- if (stack_top_dies == 0)
- {
- output_asm_insn (AS1 (fld,%y1), operands);
- stack_top_dies = 1;
- }
output_to_reg (operands[0], stack_top_dies);
RET;
}
@@ -1548,13 +1525,10 @@
if (GET_CODE (operands[0]) == MEM)
{
- if (stack_top_dies)
- return AS1 (fstp%z0,%y0);
- else
- {
- output_asm_insn (AS1 (fld,%y1), operands);
- return AS1 (fstp%z0,%0);
- }
+ output_asm_insn (AS1 (fstp%z0,%y0), operands);
+ if (! stack_top_dies)
+ return AS1 (fld%z0,%y0);
+ RET;
}
abort ();