diff options
author | kyukhin <kyukhin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-08-23 07:33:00 +0000 |
---|---|---|
committer | kyukhin <kyukhin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-08-23 07:33:00 +0000 |
commit | acd305027ca0115136126f0db66ca623f11e5d70 (patch) | |
tree | e834f3387f87e2ca2f390ee92c4ebd939466e136 /gcc/config/i386 | |
parent | a6f8b9b95a49642d99a6355637de1dfd83312cfb (diff) | |
download | gcc-acd305027ca0115136126f0db66ca623f11e5d70.tar.gz |
* gcc/config/i386/predicates.md (ext_sse_reg_operand): New.
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@201936 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/i386')
-rw-r--r-- | gcc/config/i386/i386.md | 20 | ||||
-rw-r--r-- | gcc/config/i386/mmx.md | 5 | ||||
-rw-r--r-- | 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 b55fd6fbe0a..3d7533a12f1 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 681cdb78585..17e24999258 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 b64ef6999ee..3959c3892e4 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") |