diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2016-11-24 22:48:13 +0100 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2016-11-24 22:48:13 +0100 |
commit | 112a619379968ff451e2282537ddf864c3c331c1 (patch) | |
tree | 3e1a54dd136e8eacfbce9e5285c13b19f570e3f8 /gcc | |
parent | 292edab3a7777e08b11dec290cb12092935b04f6 (diff) | |
download | gcc-112a619379968ff451e2282537ddf864c3c331c1.zip gcc-112a619379968ff451e2282537ddf864c3c331c1.tar.gz gcc-112a619379968ff451e2282537ddf864c3c331c1.tar.bz2 |
i386.md (wide AND insn to QImode splitter): Use explicit mode macros.
* config/i386/i386.md (wide AND insn to QImode splitter): Use
explicit mode macros.
(wide OR insn to QImode splitter): Ditto.
From-SVN: r242852
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 41 |
2 files changed, 27 insertions, 20 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a20c48a..4244a98 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-11-24 Uros Bizjak <ubizjak@gmail.com> + + * config/i386/i386.md (wide AND insn to QImode splitter): Use + explicit mode macros. + (wide OR insn to QImode splitter): Ditto. + 2016-11-24 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/77541 diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 5f4cdeb..f80aa40 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -8625,14 +8625,13 @@ ;; of memory mismatch stalls. We may want to do the splitting for optimizing ;; for size, but that can (should?) be handled by generic code instead. (define_split - [(set (match_operand 0 "QIreg_operand") - (and (match_operand 1 "register_operand") - (match_operand 2 "const_int_operand"))) + [(set (match_operand:SWI248 0 "QIreg_operand") + (and:SWI248 (match_operand:SWI248 1 "register_operand") + (match_operand:SWI248 2 "const_int_operand"))) (clobber (reg:CC FLAGS_REG))] "reload_completed && (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun)) - && !(~INTVAL (operands[2]) & ~(255 << 8)) - && GET_MODE (operands[0]) != QImode" + && !(~INTVAL (operands[2]) & ~(255 << 8))" [(parallel [(set (zero_extract:SI (match_dup 0) (const_int 8) (const_int 8)) (and:SI (zero_extract:SI (match_dup 1) (const_int 8) (const_int 8)) @@ -8647,15 +8646,14 @@ ;; Since AND can be encoded with sign extended immediate, this is only ;; profitable when 7th bit is not set. (define_split - [(set (match_operand 0 "any_QIreg_operand") - (and (match_operand 1 "general_operand") - (match_operand 2 "const_int_operand"))) + [(set (match_operand:SWI248 0 "any_QIreg_operand") + (and:SWI248 (match_operand:SWI248 1 "general_operand") + (match_operand:SWI248 2 "const_int_operand"))) (clobber (reg:CC FLAGS_REG))] "reload_completed && (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun)) && !(~INTVAL (operands[2]) & ~255) - && !(INTVAL (operands[2]) & 128) - && GET_MODE (operands[0]) != QImode" + && !(INTVAL (operands[2]) & 128)" [(parallel [(set (strict_low_part (match_dup 0)) (and:QI (match_dup 1) (match_dup 2))) @@ -9020,15 +9018,19 @@ (set_attr "length_immediate" "0") (set_attr "mode" "QI")]) +;; Convert wide OR instructions with immediate operand to shorter QImode +;; equivalents when possible. +;; Don't do the splitting with memory operands, since it introduces risk +;; of memory mismatch stalls. We may want to do the splitting for optimizing +;; for size, but that can (should?) be handled by generic code instead. (define_split - [(set (match_operand 0 "QIreg_operand") - (any_or (match_operand 1 "register_operand") - (match_operand 2 "const_int_operand"))) + [(set (match_operand:SWI248 0 "QIreg_operand") + (any_or:SWI248 (match_operand:SWI248 1 "register_operand") + (match_operand:SWI248 2 "const_int_operand"))) (clobber (reg:CC FLAGS_REG))] "reload_completed && (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun)) - && !(INTVAL (operands[2]) & ~(255 << 8)) - && GET_MODE (operands[0]) != QImode" + && !(INTVAL (operands[2]) & ~(255 << 8))" [(parallel [(set (zero_extract:SI (match_dup 0) (const_int 8) (const_int 8)) (any_or:SI (zero_extract:SI (match_dup 1) (const_int 8) (const_int 8)) @@ -9043,15 +9045,14 @@ ;; Since OR can be encoded with sign extended immediate, this is only ;; profitable when 7th bit is set. (define_split - [(set (match_operand 0 "any_QIreg_operand") - (any_or (match_operand 1 "general_operand") - (match_operand 2 "const_int_operand"))) + [(set (match_operand:SWI248 0 "any_QIreg_operand") + (any_or:SWI248 (match_operand:SWI248 1 "general_operand") + (match_operand:SWI248 2 "const_int_operand"))) (clobber (reg:CC FLAGS_REG))] "reload_completed && (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun)) && !(INTVAL (operands[2]) & ~255) - && (INTVAL (operands[2]) & 128) - && GET_MODE (operands[0]) != QImode" + && (INTVAL (operands[2]) & 128)" [(parallel [(set (strict_low_part (match_dup 0)) (any_or:QI (match_dup 1) (match_dup 2))) |