From 112a619379968ff451e2282537ddf864c3c331c1 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Thu, 24 Nov 2016 22:48:13 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/config/i386/i386.md | 41 +++++++++++++++++++++-------------------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a20c48ac097..4244a98fd95 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-11-24 Uros Bizjak + + * 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 PR rtl-optimization/77541 diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 5f4cdebfc23..f80aa40b85e 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))) -- 2.30.2