Hi,

We are working on a new optimization, which turns off TARGET_MOVX.
GCC generates:

movb %ah, %dil

But %ah can only be used with %[abcd][hl].  This patch adds QIreg_operand
and uses it in *movqi_extv_1_rex64/*movqi_extzv_2_rex64.  OK for trunk
if there is no regression?

Thanks.


H.J.
---
2011-05-24  H.J. Lu  <hongjiu...@intel.com>

        PR target/49142
        * config/i386/i386.md (*movqi_extv_1_rex64): Replace
        q_regs_operand with QIreg_operand.
        (*movqi_extzv_2_rex64): Likewise.

        * config/i386/predicates.md (QIreg_operand): New.

diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 6c158cf..b7f5866 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -2635,7 +2635,7 @@
 }
   [(set (attr "type")
      (if_then_else (and (match_operand:QI 0 "register_operand" "")
-                       (ior (not (match_operand:QI 0 "q_regs_operand" ""))
+                       (ior (not (match_operand:QI 0 "QIreg_operand" ""))
                             (ne (symbol_ref "TARGET_MOVX")
                                 (const_int 0))))
        (const_string "imovx")
@@ -2699,7 +2699,7 @@
     }
 }
   [(set (attr "type")
-     (if_then_else (ior (not (match_operand:QI 0 "q_regs_operand" ""))
+     (if_then_else (ior (not (match_operand:QI 0 "QIreg_operand" ""))
                        (ne (symbol_ref "TARGET_MOVX")
                            (const_int 0)))
        (const_string "imovx")
diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
index 8a89f70..1471f5a 100644
--- a/gcc/config/i386/predicates.md
+++ b/gcc/config/i386/predicates.md
@@ -82,6 +82,10 @@
   (and (match_code "reg")
        (match_test "REGNO (op) == FLAGS_REG")))
 
+;; Return true if op is one of QImode registers: %[abcd][hl].
+(define_predicate "QIreg_operand"
+  (match_test "QI_REG_P (op)"))
+
 ;; Return true if op is a QImode register operand other than
 ;; %[abcd][hl].
 (define_predicate "ext_QIreg_operand"

Reply via email to