OSDN Git Service

PR target/17025
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 9 Dec 2004 17:33:42 +0000 (17:33 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 9 Dec 2004 17:33:42 +0000 (17:33 +0000)
        * config/i386/i386.md (testqi_1_maybe_si, andqi_2_maybe_si): New.
        (test_qi_1, andqi_2): Do not promote to simode.

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

gcc/ChangeLog
gcc/config/i386/i386.md

index 0b3031b..80b36ab 100644 (file)
@@ -1,3 +1,9 @@
+2004-12-09  Richard Henderson  <rth@redhat.com>
+
+       PR target/17025
+       * config/i386/i386.md (testqi_1_maybe_si, andqi_2_maybe_si): New.
+       (test_qi_1, andqi_2): Do not promote to simode.
+
 2004-12-09  Andrew Pinski  <pinskia@physics.uc.edu>
 
        PR tree-opt/18904
index 0d2ccb2..e3346fa 100644 (file)
   ""
   "")
 
-(define_insn "*testqi_1"
+(define_insn "*testqi_1_maybe_si"
   [(set (reg FLAGS_REG)
-        (compare (and:QI (match_operand:QI 0 "nonimmediate_operand" "%!*a,q,qm,r")
-                        (match_operand:QI 1 "general_operand" "n,n,qn,n"))
-                (const_int 0)))]
-  "ix86_match_ccmode (insn, CCNOmode)
-   && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
+        (compare
+         (and:QI
+           (match_operand:QI 0 "nonimmediate_operand" "%!*a,q,qm,r")
+           (match_operand:QI 1 "general_operand" "n,n,qn,n"))
+         (const_int 0)))]
+   "(GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)
+    && ix86_match_ccmode (insn,
+                        GET_CODE (operands[1]) == CONST_INT
+                        && INTVAL (operands[1]) >= 0 ? CCNOmode : CCZmode)"
 {
   if (which_alternative == 3)
     {
-      if (GET_CODE (operands[1]) == CONST_INT
-         && (INTVAL (operands[1]) & 0xffffff00))
+      if (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) < 0)
        operands[1] = GEN_INT (INTVAL (operands[1]) & 0xff);
       return "test{l}\t{%1, %k0|%k0, %1}";
     }
    (set_attr "mode" "QI,QI,QI,SI")
    (set_attr "pent_pair" "uv,np,uv,np")])
 
+(define_insn "*testqi_1"
+  [(set (reg FLAGS_REG)
+        (compare
+         (and:QI
+           (match_operand:QI 0 "nonimmediate_operand" "%!*a,q,qm")
+           (match_operand:QI 1 "general_operand" "n,n,qn"))
+         (const_int 0)))]
+  "(GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)
+   && ix86_match_ccmode (insn, CCNOmode)"
+  "test{b}\t{%1, %0|%0, %1}"
+  [(set_attr "type" "test")
+   (set_attr "modrm" "0,1,1")
+   (set_attr "mode" "QI")
+   (set_attr "pent_pair" "uv,np,uv")])
+
 (define_expand "testqi_ext_ccno_0"
   [(set (reg:CCNO FLAGS_REG)
        (compare:CCNO
   [(set_attr "type" "alu1")
    (set_attr "mode" "QI")])
 
-(define_insn "*andqi_2"
+(define_insn "*andqi_2_maybe_si"
   [(set (reg FLAGS_REG)
        (compare (and:QI
-                  (match_operand:QI 1 "nonimmediate_operand" "%0,0,0")
-                  (match_operand:QI 2 "general_operand" "qim,qi,i"))
+                     (match_operand:QI 1 "nonimmediate_operand" "%0,0,0")
+                     (match_operand:QI 2 "general_operand" "qim,qi,i"))
                 (const_int 0)))
    (set (match_operand:QI 0 "nonimmediate_operand" "=q,qm,*r")
        (and:QI (match_dup 1) (match_dup 2)))]
-  "ix86_match_ccmode (insn, CCNOmode)
-   && ix86_binary_operator_ok (AND, QImode, operands)"
+  "ix86_binary_operator_ok (AND, QImode, operands)
+   && ix86_match_ccmode (insn,
+                        GET_CODE (operands[2]) == CONST_INT
+                        && INTVAL (operands[2]) >= 0 ? CCNOmode : CCZmode)"
 {
   if (which_alternative == 2)
     {
-      if (GET_CODE (operands[2]) == CONST_INT
-          && (INTVAL (operands[2]) & 0xffffff00))
+      if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
         operands[2] = GEN_INT (INTVAL (operands[2]) & 0xff);
       return "and{l}\t{%2, %k0|%k0, %2}";
     }
   [(set_attr "type" "alu")
    (set_attr "mode" "QI,QI,SI")])
 
+(define_insn "*andqi_2"
+  [(set (reg FLAGS_REG)
+       (compare (and:QI
+                  (match_operand:QI 1 "nonimmediate_operand" "%0,0")
+                  (match_operand:QI 2 "general_operand" "qim,qi"))
+                (const_int 0)))
+   (set (match_operand:QI 0 "nonimmediate_operand" "=q,qm")
+       (and:QI (match_dup 1) (match_dup 2)))]
+  "ix86_match_ccmode (insn, CCNOmode)
+   && ix86_binary_operator_ok (AND, QImode, operands)"
+  "and{b}\t{%2, %0|%0, %2}"
+  [(set_attr "type" "alu")
+   (set_attr "mode" "QI")])
+
 (define_insn "*andqi_2_slp"
   [(set (reg FLAGS_REG)
        (compare (and:QI