]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR target/58779
authoruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Oct 2013 18:35:53 +0000 (18:35 +0000)
committeruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Oct 2013 18:35:53 +0000 (18:35 +0000)
* config/i386/i386.c (put_condition_code) <case GTU, case LEU>:
Remove CCCmode handling.
<case LTU>: Return 'c' suffix for CCCmode.
<case GEU>: Return 'nc' suffix for CCCmode.
(ix86_cc_mode) <case GTU, case LEU>: Do not generate overflow checks.
* config/i386/i386.md (*sub<mode>3_cconly_overflow): Remove.
(*sub<mode>3_cc_overflow): Ditto.
(*subsi3_zext_cc_overflow): Ditto.

testsuite/ChangeLog:

PR target/58779
* gcc.target/i386/pr30315.c: Remove MINUSCC, DECCC, MINUSCCONLY
and MINUSCCZEXT defines. Update scan-assembler dg directive.
* gcc.dg/torture/pr58779.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@203935 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/config/i386/i386.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr58779.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr30315.c

index 71fdd7d4b10ad277761adf9ea2bd34c840b02965..3f96894f7c32832cbe0b6d894bbcc1911ffc47ce 100644 (file)
@@ -1,3 +1,15 @@
+2013-10-22  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/58779
+       * config/i386/i386.c (put_condition_code) <case GTU, case LEU>:
+       Remove CCCmode handling.
+       <case LTU>: Return 'c' suffix for CCCmode.
+       <case GEU>: Return 'nc' suffix for CCCmode.
+       (ix86_cc_mode) <case GTU, case LEU>: Do not generate overflow checks.
+       * config/i386/i386.md (*sub<mode>3_cconly_overflow): Remove.
+       (*sub<mode>3_cc_overflow): Ditto.
+       (*subsi3_zext_cc_overflow): Ditto.
+
 2013-10-22  Steve Ellcey  <sellcey@mips.com>
 
        * config/mips/mips.c (mips_rtx_costs):  Fix cost estimate for nor
index af4cef724bdabd1bb36eda81146776b0a356b780..73049b9466c9832b4faab60e5edd2b64b954d711 100644 (file)
@@ -14103,8 +14103,6 @@ put_condition_code (enum rtx_code code, enum machine_mode mode, bool reverse,
         Those same assemblers have the same but opposite lossage on cmov.  */
       if (mode == CCmode)
        suffix = fp ? "nbe" : "a";
-      else if (mode == CCCmode)
-       suffix = "b";
       else
        gcc_unreachable ();
       break;
@@ -14126,8 +14124,12 @@ put_condition_code (enum rtx_code code, enum machine_mode mode, bool reverse,
        }
       break;
     case LTU:
-      gcc_assert (mode == CCmode || mode == CCCmode);
-      suffix = "b";
+      if (mode == CCmode)
+       suffix = "b";
+      else if (mode == CCCmode)
+       suffix = "c";
+      else
+       gcc_unreachable ();
       break;
     case GE:
       switch (mode)
@@ -14147,20 +14149,20 @@ put_condition_code (enum rtx_code code, enum machine_mode mode, bool reverse,
        }
       break;
     case GEU:
-      /* ??? As above.  */
-      gcc_assert (mode == CCmode || mode == CCCmode);
-      suffix = fp ? "nb" : "ae";
+      if (mode == CCmode)
+       suffix = fp ? "nb" : "ae";
+      else if (mode == CCCmode)
+       suffix = "nc";
+      else
+       gcc_unreachable ();
       break;
     case LE:
       gcc_assert (mode == CCmode || mode == CCGCmode || mode == CCNOmode);
       suffix = "le";
       break;
     case LEU:
-      /* ??? As above.  */
       if (mode == CCmode)
        suffix = "be";
-      else if (mode == CCCmode)
-       suffix = fp ? "nb" : "ae";
       else
        gcc_unreachable ();
       break;
@@ -18862,12 +18864,7 @@ ix86_cc_mode (enum rtx_code code, rtx op0, rtx op1)
        return CCmode;
     case GTU:                  /* CF=0 & ZF=0 */
     case LEU:                  /* CF=1 | ZF=1 */
-      /* Detect overflow checks.  They need just the carry flag.  */
-      if (GET_CODE (op0) == MINUS
-         && rtx_equal_p (op1, XEXP (op0, 0)))
-       return CCCmode;
-      else
-       return CCmode;
+      return CCmode;
       /* Codes possibly doable only with sign flag when
          comparing against zero.  */
     case GE:                   /* SF=OF   or   SF=0 */
index 5413526a75b06536d1ebe7f2587ac3d1dd7e027c..d06de40b927e5123734949344b91d3788a3dd91f 100644 (file)
    (set_attr "use_carry" "1")
    (set_attr "mode" "<MODE>")])
 \f
-;; Overflow setting add and subtract instructions
+;; Overflow setting add instructions
 
 (define_insn "*add<mode>3_cconly_overflow"
   [(set (reg:CCC FLAGS_REG)
   [(set_attr "type" "alu")
    (set_attr "mode" "<MODE>")])
 
-(define_insn "*sub<mode>3_cconly_overflow"
+(define_insn "*add<mode>3_cc_overflow"
   [(set (reg:CCC FLAGS_REG)
        (compare:CCC
-         (minus:SWI
-           (match_operand:SWI 0 "nonimmediate_operand" "<r>m,<r>")
-           (match_operand:SWI 1 "<general_operand>" "<r><i>,<r>m"))
-         (match_dup 0)))]
-  ""
-  "cmp{<imodesuffix>}\t{%1, %0|%0, %1}"
-  [(set_attr "type" "icmp")
-   (set_attr "mode" "<MODE>")])
-
-(define_insn "*<plusminus_insn><mode>3_cc_overflow"
-  [(set (reg:CCC FLAGS_REG)
-       (compare:CCC
-           (plusminus:SWI
-               (match_operand:SWI 1 "nonimmediate_operand" "<comm>0,0")
+           (plus:SWI
+               (match_operand:SWI 1 "nonimmediate_operand" "%0,0")
                (match_operand:SWI 2 "<general_operand>" "<r><i>,<r>m"))
            (match_dup 1)))
    (set (match_operand:SWI 0 "nonimmediate_operand" "=<r>m,<r>")
-       (plusminus:SWI (match_dup 1) (match_dup 2)))]
-  "ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
-  "<plusminus_mnemonic>{<imodesuffix>}\t{%2, %0|%0, %2}"
+       (plus:SWI (match_dup 1) (match_dup 2)))]
+  "ix86_binary_operator_ok (PLUS, <MODE>mode, operands)"
+  "add{<imodesuffix>}\t{%2, %0|%0, %2}"
   [(set_attr "type" "alu")
    (set_attr "mode" "<MODE>")])
 
-(define_insn "*<plusminus_insn>si3_zext_cc_overflow"
+(define_insn "*addsi3_zext_cc_overflow"
   [(set (reg:CCC FLAGS_REG)
        (compare:CCC
-         (plusminus:SI
-           (match_operand:SI 1 "nonimmediate_operand" "<comm>0")
+         (plus:SI
+           (match_operand:SI 1 "nonimmediate_operand" "%0")
            (match_operand:SI 2 "x86_64_general_operand" "rme"))
          (match_dup 1)))
    (set (match_operand:DI 0 "register_operand" "=r")
-       (zero_extend:DI (plusminus:SI (match_dup 1) (match_dup 2))))]
-  "TARGET_64BIT && ix86_binary_operator_ok (<CODE>, SImode, operands)"
-  "<plusminus_mnemonic>{l}\t{%2, %k0|%k0, %2}"
+       (zero_extend:DI (plus:SI (match_dup 1) (match_dup 2))))]
+  "TARGET_64BIT && ix86_binary_operator_ok (PLUS, SImode, operands)"
+  "add{l}\t{%2, %k0|%k0, %2}"
   [(set_attr "type" "alu")
    (set_attr "mode" "SI")])
 
index fde53419ccab8bef54a3b4bf8235130df24dd442..58639a21e7697ad4fdf615a7027e0add0d2fa66d 100644 (file)
@@ -1,3 +1,10 @@
+2013-10-22  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/58779
+       * gcc.target/i386/pr30315.c: Remove MINUSCC, DECCC, MINUSCCONLY
+       and MINUSCCZEXT defines. Update scan-assembler dg directive.
+       * gcc.dg/torture/pr58779.c: New test.
+
 2013-10-22  Steve Ellcey  <sellcey@mips.com>
 
        * gcc.target/mips/nor.c: New.
@@ -27,8 +34,7 @@
 2013-10-21  Vidya Praveen  <vidyapraveen@arm.com>
 
        * gcc.dg/20050922-1.c: Remove stdlib.h and declare abort().
-       * gcc.dg/20050922-1.c: Remove stdlib.h and declare abort() and
-       exit().
+       * gcc.dg/20050922-1.c: Remove stdlib.h and declare abort() and exit().
 
 2013-10-21  Richard Biener  <rguenther@suse.de>
 
 
 2013-10-14  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
-       * gcc.dg/torture/pr58670.c (ASM_STR) [__i386__ || __x86_64__]: Use
-       btsl.
+       * gcc.dg/torture/pr58670.c (ASM_STR) [__i386__ || __x86_64__]:
+       Use btsl.
 
 2013-10-14  Eric Botcazou  <ebotcazou@adacore.com>
 
diff --git a/gcc/testsuite/gcc.dg/torture/pr58779.c b/gcc/testsuite/gcc.dg/torture/pr58779.c
new file mode 100644 (file)
index 0000000..b0c0c86
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do run } */
+
+int a, c;
+
+int main ()
+{
+  int e = -1;
+  short d = (c <= 0) ^ e;
+  if ((unsigned int) a - (a || d) <= (unsigned int) a)
+    __builtin_abort ();
+  return 0;
+}
index 998d5071e5c0d9f290aac61f3673c9f5b9b31035..557b4f75174e145093ff37ceb862429901654218 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O2" } */
-/* { dg-final { scan-assembler-times "cmp" 4 } } */
+/* { dg-final { scan-assembler-not "cmp" } } */
 
 extern void abort (void);
 int c;
@@ -34,39 +34,10 @@ void pluscconly##t##C (T a, T b)    \
 }
 #define PLUSCCONLY(T, t) PLUSCCONLY1(T, t, a) PLUSCCONLY1(T, t, b)
 
-#define MINUSCC(T, t)  \
-T minuscc##t (T a, T b)        \
-{      \
-  T difference = a - b;        \
-  if (difference > a)  \
-    abort ();          \
-  return difference;   \
-}
-
-#define DECCC(T, t)    \
-T deccc##t (T a, T b)  \
-{      \
-  T difference = a - b;        \
-  if (difference > a)  \
-    c --;              \
-  return difference;   \
-}
-
-#define MINUSCCONLY(T, t)      \
-void minuscconly##t (T a, T b) \
-{      \
-  T difference = a - b;        \
-  if (difference > a)  \
-    abort ();          \
-}
-
 #define TEST(T, t)     \
   PLUSCC(T, t)         \
   PLUSCCONLY(T, t)     \
-  INCCC(T, t)          \
-  MINUSCC(T, t)                \
-  MINUSCCONLY(T, t)    \
-  DECCC(T, t)
+  INCCC(T, t)
 
 TEST (unsigned long,  l)
 TEST (unsigned int,   i)
@@ -84,14 +55,3 @@ unsigned long pluscczext##C (unsigned int a, unsigned int b) \
 
 PLUSCCZEXT(a)
 PLUSCCZEXT(b)
-
-#define MINUSCCZEXT    \
-unsigned long minuscczext (unsigned int a, unsigned int b)     \
-{      \
-  unsigned int difference = a - b;     \
-  if (difference > a)          \
-    abort ();                  \
-  return difference;           \
-}
-
-MINUSCCZEXT