OSDN Git Service

* i386.c (output_float_compare): Avoid GNU-C extensions.
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 19 May 1999 01:54:03 +0000 (01:54 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 19 May 1999 01:54:03 +0000 (01:54 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@27005 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 8751ad4..39f4142 100644 (file)
@@ -1,3 +1,7 @@
+Wed May 19 02:47:11 1999  Jan Hubicka  (hubicka@freesoft.cz)
+
+       * i386.c (output_float_compare): Avoid GNU-C extensions.
+
 Wed May 19 00:34:40 1999  Jeffrey A Law  (law@cygnus.com)
 
        * version.c: Bump to distinguish mainline tree from the
index 2e8236d..3efedb6 100644 (file)
@@ -2995,7 +2995,8 @@ put_jump_code (code, reverse, file)
      FILE *file;
 {
   int flags = cc_prev_status.flags;
-  int ieee = (TARGET_IEEE_FP && (flags & CC_IN_80387));
+  int ieee = (TARGET_IEEE_FP && (flags & CC_IN_80387)
+             && !(cc_prev_status.flags & CC_FCOMI));
   const char *suffix;
 
   if (flags & CC_Z_IN_NOT_C)
@@ -3760,7 +3761,7 @@ notice_update_cc (exp)
           if (stack_regs_mentioned_p (SET_SRC (XVECEXP (exp, 0, 0))))
            {
               cc_status.flags |= CC_IN_80387;
-             if (0 && TARGET_CMOVE && stack_regs_mentioned_p
+             if (TARGET_CMOVE && stack_regs_mentioned_p
                  (XEXP (SET_SRC (XVECEXP (exp, 0, 0)), 1)))
                cc_status.flags |= CC_FCOMI;
            }
@@ -4118,7 +4119,8 @@ output_float_compare (insn, operands)
   int cc0_set = 1;
   int i;
 
-  if (0 && TARGET_CMOVE && STACK_REG_P (operands[1]))
+  if (TARGET_CMOVE && STACK_REG_P (operands[1])
+      && STACK_REG_P (operands[0]))
     {
       cc_status.flags |= CC_FCOMI;
       cc_prev_status.flags &= ~CC_TEST_AX;
@@ -4152,7 +4154,8 @@ output_float_compare (insn, operands)
            {
              output_asm_insn (AS2 (fucomip,%y1,%0), operands);
              output_asm_insn (AS1 (fstp, %y0), operands);
-             cc0_set = 0; 
+             if (!TARGET_IEEE_FP)
+               cc0_set = 0; 
            }
          else
            output_asm_insn ("fucompp", operands);
@@ -4163,7 +4166,8 @@ output_float_compare (insn, operands)
            {
              output_asm_insn (AS2 (fcomip, %y1,%0), operands);
              output_asm_insn (AS1 (fstp, %y0), operands);
-             cc0_set = 0; 
+             if (!TARGET_IEEE_FP)
+               cc0_set = 0; 
            }
          else
            output_asm_insn ("fcompp", operands);
@@ -4188,7 +4192,8 @@ output_float_compare (insn, operands)
       if (cc_status.flags & CC_FCOMI)
        {
          output_asm_insn (strcat (buf, AS2 (%z1,%y1,%0)), operands);
-         cc0_set = 0; 
+         if (!TARGET_IEEE_FP)
+           cc0_set = 0; 
        }
       else
         output_asm_insn (strcat (buf, AS1 (%z1,%y1)), operands);
@@ -4211,7 +4216,7 @@ output_float_compare (insn, operands)
           && REGNO (operands[i]) != FIRST_STACK_REG 
           && (!stack_top_dies || REGNO (operands[i]) != FIRST_STACK_REG + 1))
         {
-          rtx xexp[i];
+          rtx xexp[2];
           xexp[0] = gen_rtx_REG (DFmode,
                                 REGNO (operands[i]) - (stack_top_dies != 0));
           output_asm_insn (AS1 (fstp, %y0), xexp);
@@ -4236,17 +4241,19 @@ output_fp_cc0_set (insn)
   rtx next;
   enum rtx_code code;
 
-  xops[0] = gen_rtx_REG (HImode, 0);
-  output_asm_insn (AS1 (fnsts%W0,%0), xops);
+  if (!(cc_status.flags & CC_FCOMI))
+    {
+      xops[0] = gen_rtx_REG (HImode, 0);
+      output_asm_insn (AS1 (fnsts%W0,%0), xops);
+    }
 
   if (! TARGET_IEEE_FP)
     {
       if (!(cc_status.flags & CC_REVERSED))
         {
           next = next_cc0_user (insn);
-
-          if (GET_CODE (next) == JUMP_INSN
-              && GET_CODE (PATTERN (next)) == SET
+  
+          if (GET_CODE (PATTERN (next)) == SET
               && SET_DEST (PATTERN (next)) == pc_rtx
               && GET_CODE (SET_SRC (PATTERN (next))) == IF_THEN_ELSE)
            code = GET_CODE (XEXP (SET_SRC (PATTERN (next)), 0));
@@ -4271,8 +4278,7 @@ output_fp_cc0_set (insn)
   if (next == NULL_RTX)
     abort ();
 
-  if (GET_CODE (next) == JUMP_INSN
-      && GET_CODE (PATTERN (next)) == SET
+  if (GET_CODE (PATTERN (next)) == SET
       && SET_DEST (PATTERN (next)) == pc_rtx
       && GET_CODE (SET_SRC (PATTERN (next))) == IF_THEN_ELSE)
     code = GET_CODE (XEXP (SET_SRC (PATTERN (next)), 0));
@@ -4295,61 +4301,103 @@ output_fp_cc0_set (insn)
   else
     abort ();
 
-  xops[0] = gen_rtx_REG (QImode, 0);
+  if (cc_status.flags & CC_FCOMI)
+    {
+      /* It is very tricky. We have to do it right. */
 
-  switch (code)
+      xops [0] = gen_rtx_REG (QImode, 0);
+
+      switch (code)
+       {
+       case GT:
+       case GE:
+         break;
+
+       case LT:
+         output_asm_insn (AS1 (setb,%b0), xops);
+         output_asm_insn (AS1 (setp,%h0), xops);
+         output_asm_insn (AS2 (cmp%B0,%b0,%h0), xops);
+         break;
+
+       case LE:
+         output_asm_insn (AS1 (setbe,%b0), xops);
+         output_asm_insn (AS1 (setnp,%h0), xops);
+         output_asm_insn (AS2 (xor%B0,%b0,%h0), xops);
+         break;
+
+       case EQ:
+       case NE:
+         output_asm_insn (AS1 (setne,%b0), xops);
+         output_asm_insn (AS1 (setp,%h0), xops);
+         output_asm_insn (AS2 (or%B0,%b0,%h0), xops);
+         break;
+
+       case GTU:
+       case LTU:
+       case GEU:
+       case LEU:
+       default:
+         abort ();
+       }
+    }
+  else
     {
-    case GT:
-      xops[1] = GEN_INT (0x45);
-      output_asm_insn (AS2 (and%B0,%1,%h0), xops);
-      /* je label */
-      break;
+      xops[0] = gen_rtx_REG (QImode, 0);
 
-    case LT:
-      xops[1] = GEN_INT (0x45);
-      xops[2] = GEN_INT (0x01);
-      output_asm_insn (AS2 (and%B0,%1,%h0), xops);
-      output_asm_insn (AS2 (cmp%B0,%2,%h0), xops);
-      /* je label */
-      break;
+      switch (code)
+       {
+       case GT:
+         xops[1] = GEN_INT (0x45);
+         output_asm_insn (AS2 (and%B0,%1,%h0), xops);
+         /* je label */
+         break;
 
-    case GE:
-      xops[1] = GEN_INT (0x05);
-      output_asm_insn (AS2 (and%B0,%1,%h0), xops);
-      /* je label */
-      break;
+       case LT:
+         xops[1] = GEN_INT (0x45);
+         xops[2] = GEN_INT (0x01);
+         output_asm_insn (AS2 (and%B0,%1,%h0), xops);
+         output_asm_insn (AS2 (cmp%B0,%2,%h0), xops);
+         /* je label */
+         break;
 
-    case LE:
-      xops[1] = GEN_INT (0x45);
-      xops[2] = GEN_INT (0x40);
-      output_asm_insn (AS2 (and%B0,%1,%h0), xops);
-      output_asm_insn (AS1 (dec%B0,%h0), xops);
-      output_asm_insn (AS2 (cmp%B0,%2,%h0), xops);
-      /* jb label */
-      break;
+       case GE:
+         xops[1] = GEN_INT (0x05);
+         output_asm_insn (AS2 (and%B0,%1,%h0), xops);
+         /* je label */
+         break;
 
-    case EQ:
-      xops[1] = GEN_INT (0x45);
-      xops[2] = GEN_INT (0x40);
-      output_asm_insn (AS2 (and%B0,%1,%h0), xops);
-      output_asm_insn (AS2 (cmp%B0,%2,%h0), xops);
-      /* je label */
-      break;
+       case LE:
+         xops[1] = GEN_INT (0x45);
+         xops[2] = GEN_INT (0x40);
+         output_asm_insn (AS2 (and%B0,%1,%h0), xops);
+         output_asm_insn (AS1 (dec%B0,%h0), xops);
+         output_asm_insn (AS2 (cmp%B0,%2,%h0), xops);
+         /* jb label */
+         break;
 
-    case NE:
-      xops[1] = GEN_INT (0x44);
-      xops[2] = GEN_INT (0x40);
-      output_asm_insn (AS2 (and%B0,%1,%h0), xops);
-      output_asm_insn (AS2 (xor%B0,%2,%h0), xops);
-      /* jne label */
-      break;
+       case EQ:
+         xops[1] = GEN_INT (0x45);
+         xops[2] = GEN_INT (0x40);
+         output_asm_insn (AS2 (and%B0,%1,%h0), xops);
+         output_asm_insn (AS2 (cmp%B0,%2,%h0), xops);
+         /* je label */
+         break;
 
-    case GTU:
-    case LTU:
-    case GEU:
-    case LEU:
-    default:
-      abort ();
+       case NE:
+         xops[1] = GEN_INT (0x44);
+         xops[2] = GEN_INT (0x40);
+         output_asm_insn (AS2 (and%B0,%1,%h0), xops);
+         output_asm_insn (AS2 (xor%B0,%2,%h0), xops);
+         /* jne label */
+         break;
+
+       case GTU:
+       case LTU:
+       case GEU:
+       case LEU:
+       default:
+         abort ();
+       }
     }
 
   return "";