Hello, On 21 Aug 13:02, Richard Henderson wrote: > On 08/21/2013 11:28 AM, Kirill Yukhin wrote: > > (eq_attr "alternative" "12,13") > > - (cond [(ior (not (match_test "TARGET_SSE2")) > > + (cond [(ior (match_test "EXT_REX_SSE_REGNO_P (REGNO > > (operands[0]))") > > + (and (match_test "REG_P (operands[1])") > > + (match_test "EXT_REX_SSE_REGNO_P (REGNO > > (operands[1]))"))) > > + (const_string "XI") > > + (ior (not (match_test "TARGET_SSE2")) > > (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL")) > > (const_string "V4SF") > > (match_test "TARGET_AVX") > > Better. And while it produces the correct results, using match_operand would > be better than embedding a reference to operands within a match_test.
In order to get rid of direct references to operands in attrs of scalar mov*_internal I've introduced new predicate and use it with match_operand instead. ChangeLog: 2013-08-22 Kirill Yukhin <kirill.yuk...@intel.com> * gcc/config/i386/i386.md (*movti_internal): Use predicate to determine if EVEX is needed. (*movsi_internal): Ditto. (*movdf_internal): Ditto. (*movsf_internal): Ditto. * gcc/config/i386/mmx.md (*mov<mode>_internal): Ditto. Testing: 1. Bootstrap pass. 2. make check shows no regressions. 3. Spec 2000 & 2006 build show no regressions both with and without -mavx512f option. 4. Spec 2000 & 2006 run shows no stability regressions without -mavx512f option. Is it ok to install to trunk? -- Thanks, K --- gcc/config/i386/i386.md | 20 ++++++++------------ gcc/config/i386/mmx.md | 5 ++--- gcc/config/i386/predicates.md | 6 ++++++ 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index b55fd6f..3d7533a 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -2059,9 +2059,8 @@ (cond [(eq_attr "alternative" "2") (const_string "SI") (eq_attr "alternative" "12,13") - (cond [(ior (match_test "EXT_REX_SSE_REGNO_P (REGNO (operands[0]))") - (and (match_test "REG_P (operands[1])") - (match_test "EXT_REX_SSE_REGNO_P (REGNO (operands[1]))"))) + (cond [(ior (match_operand 0 "ext_sse_reg_operand") + (match_operand 1 "ext_sse_reg_operand")) (const_string "XI") (ior (not (match_test "TARGET_SSE2")) (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL")) @@ -2192,9 +2191,8 @@ (cond [(eq_attr "alternative" "2,3") (const_string "DI") (eq_attr "alternative" "6,7") - (cond [(ior (match_test "EXT_REX_SSE_REGNO_P (REGNO (operands[0]))") - (and (match_test "REG_P (operands[1])") - (match_test "EXT_REX_SSE_REGNO_P (REGNO (operands[1]))"))) + (cond [(ior (match_operand 0 "ext_sse_reg_operand") + (match_operand 1 "ext_sse_reg_operand")) (const_string "XI") (ior (not (match_test "TARGET_SSE2")) (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL")) @@ -2923,9 +2921,8 @@ /* movaps is one byte shorter for non-AVX targets. */ (eq_attr "alternative" "10,14") - (cond [(ior (match_test "EXT_REX_SSE_REGNO_P (REGNO (operands[0]))") - (and (match_test "REG_P (operands[1])") - (match_test "EXT_REX_SSE_REGNO_P (REGNO (operands[1]))"))) + (cond [(ior (match_operand 0 "ext_sse_reg_operand") + (match_operand 1 "ext_sse_reg_operand")) (const_string "V8DF") (ior (not (match_test "TARGET_SSE2")) (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL")) @@ -3072,9 +3069,8 @@ better to maintain the whole registers in single format to avoid problems on using packed logical operations. */ (eq_attr "alternative" "6") - (cond [(ior (match_test "EXT_REX_SSE_REGNO_P (REGNO (operands[0]))") - (and (match_test "REG_P (operands[1])") - (match_test "EXT_REX_SSE_REGNO_P (REGNO (operands[1]))"))) + (cond [(ior (match_operand 0 "ext_sse_reg_operand") + (match_operand 1 "ext_sse_reg_operand")) (const_string "V16SF") (ior (match_test "TARGET_SSE_PARTIAL_REG_DEPENDENCY") (match_test "TARGET_SSE_SPLIT_REGS")) diff --git a/gcc/config/i386/mmx.md b/gcc/config/i386/mmx.md index 681cdb7..17e2499 100644 --- a/gcc/config/i386/mmx.md +++ b/gcc/config/i386/mmx.md @@ -185,9 +185,8 @@ (cond [(eq_attr "alternative" "2") (const_string "SI") (eq_attr "alternative" "11,12,15,16") - (cond [(ior (match_test "EXT_REX_SSE_REGNO_P (REGNO (operands[0]))") - (and (match_test "REG_P (operands[1])") - (match_test "EXT_REX_SSE_REGNO_P (REGNO (operands[1]))"))) + (cond [(ior (match_operand 0 "ext_sse_reg_operand") + (match_operand 1 "ext_sse_reg_operand")) (const_string "XI") (match_test "<MODE>mode == V2SFmode") (const_string "V4SF") diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md index b64ef69..3959c38 100644 --- a/gcc/config/i386/predicates.md +++ b/gcc/config/i386/predicates.md @@ -47,6 +47,12 @@ (and (match_code "reg") (match_test "SSE_REGNO_P (REGNO (op))"))) +;; True if the operand is an AVX-512 new register. +(define_predicate "ext_sse_reg_operand" + (and (match_code "reg") + (match_test "EXT_REX_SSE_REGNO_P (REGNO (op))"))) + + ;; True if the operand is a Q_REGS class register. (define_predicate "q_regs_operand" (match_operand 0 "register_operand") -- 1.7.11.7