]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
i386.c (output_fix_trunc): Add code to emulate non-popping DImode case.
authorJim Wilson <wilson@cygnus.com>
Tue, 5 May 1998 00:40:04 +0000 (00:40 +0000)
committerJeff Law <law@gcc.gnu.org>
Tue, 5 May 1998 00:40:04 +0000 (18:40 -0600)
        * i386.c (output_fix_trunc): Add code to emulate non-popping DImode
        case.
Regression fix from Jim.

From-SVN: r19537

gcc/ChangeLog
gcc/config/i386/i386.c

index a0777b17f2b4eb22aa6d436baacc6abc3b5e55fd..1355e681da16b2711c80ca05e880ba96333acc43 100644 (file)
@@ -1,3 +1,8 @@
+Thu Apr 30 19:28:16 1998  Jim Wilson  <wilson@cygnus.com>
+
+       * i386.c (output_fix_trunc): Add code to emulate non-popping DImode
+       case.
+
 Thu Apr 23 01:41:02 1998  Jeffrey A Law  (law@cygnus.com)
 
        * version.c: Bump for 1.0.3 pre-release.
index b9b7e5d256f0208f7fa64e95d61deaf3bc9d9ed2..8be76dce7de96eced79b6281b45d3bcfb7af6bea 100644 (file)
@@ -3731,8 +3731,7 @@ output_fix_trunc (insn, operands)
   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
   rtx xops[2];
 
-  if (! STACK_TOP_P (operands[1]) ||
-      (GET_MODE (operands[0]) == DImode && ! stack_top_dies))
+  if (! STACK_TOP_P (operands[1]))
     abort ();
 
   xops[0] = GEN_INT (12);
@@ -3750,6 +3749,17 @@ output_fix_trunc (insn, operands)
     {
       if (stack_top_dies)
        output_asm_insn (AS1 (fistp%z0,%0), operands);
+      else if (GET_MODE (operands[0]) == DImode && ! stack_top_dies)
+       {
+         /* There is no DImode version of this without a stack pop, so
+            we must emulate it.  It doesn't matter much what the second
+            instruction is, because the value being pushed on the FP stack
+            is not used except for the following stack popping store.
+            This case can only happen without optimization, so it doesn't
+            matter that it is inefficient.  */
+         output_asm_insn (AS1 (fistp%z0,%0), operands);
+         output_asm_insn (AS1 (fild%z0,%0), operands);
+       }
       else
        output_asm_insn (AS1 (fist%z0,%0), operands);
     }