diff options
Diffstat (limited to 'gcc/config/i386/sse.md')
-rw-r--r-- | gcc/config/i386/sse.md | 72 |
1 files changed, 66 insertions, 6 deletions
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index 078fac6c0f1..c359aed0791 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -3244,7 +3244,17 @@ (const_int 2) (const_int 3)])))] "TARGET_SSE" - "ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands);") +{ + rtx dst = ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands); + + emit_insn (gen_sse_movhlps (dst, operands[1], operands[2])); + + /* Fix up the destination if needed. */ + if (dst != operands[0]) + emit_move_insn (operands[0], dst); + + DONE; +}) (define_insn "*avx_movhlps" [(set (match_operand:V4SF 0 "nonimmediate_operand" "=x,x,m") @@ -3294,7 +3304,17 @@ (const_int 4) (const_int 5)])))] "TARGET_SSE" - "ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands);") +{ + rtx dst = ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands); + + emit_insn (gen_sse_movlhps (dst, operands[1], operands[2])); + + /* Fix up the destination if needed. */ + if (dst != operands[0]) + emit_move_insn (operands[0], dst); + + DONE; +}) (define_insn "*avx_movlhps" [(set (match_operand:V4SF 0 "nonimmediate_operand" "=x,x,o") @@ -3701,7 +3721,17 @@ (parallel [(const_int 0) (const_int 1)])) (match_operand:V2SF 2 "nonimmediate_operand" "")))] "TARGET_SSE" - "ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands);") +{ + rtx dst = ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands); + + emit_insn (gen_sse_loadhps (dst, operands[1], operands[2])); + + /* Fix up the destination if needed. */ + if (dst != operands[0]) + emit_move_insn (operands[0], dst); + + DONE; +}) (define_insn "*avx_loadhps" [(set (match_operand:V4SF 0 "nonimmediate_operand" "=x,x,o") @@ -3769,7 +3799,17 @@ (match_operand:V4SF 1 "nonimmediate_operand" "") (parallel [(const_int 2) (const_int 3)]))))] "TARGET_SSE" - "ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands);") +{ + rtx dst = ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands); + + emit_insn (gen_sse_loadlps (dst, operands[1], operands[2])); + + /* Fix up the destination if needed. */ + if (dst != operands[0]) + emit_move_insn (operands[0], dst); + + DONE; +}) (define_insn "*avx_loadlps" [(set (match_operand:V4SF 0 "nonimmediate_operand" "=x,x,m") @@ -4898,7 +4938,17 @@ (parallel [(const_int 0)])) (match_operand:DF 2 "nonimmediate_operand" "")))] "TARGET_SSE2" - "ix86_fixup_binary_operands (UNKNOWN, V2DFmode, operands);") +{ + rtx dst = ix86_fixup_binary_operands (UNKNOWN, V2DFmode, operands); + + emit_insn (gen_sse2_loadhpd (dst, operands[1], operands[2])); + + /* Fix up the destination if needed. */ + if (dst != operands[0]) + emit_move_insn (operands[0], dst); + + DONE; +}) ;; Avoid combining registers from different units in a single alternative, ;; see comment above inline_secondary_memory_needed function in i386.c @@ -4957,7 +5007,17 @@ (match_operand:V2DF 1 "nonimmediate_operand" "") (parallel [(const_int 1)]))))] "TARGET_SSE2" - "ix86_fixup_binary_operands (UNKNOWN, V2DFmode, operands);") +{ + rtx dst = ix86_fixup_binary_operands (UNKNOWN, V2DFmode, operands); + + emit_insn (gen_sse2_loadlpd (dst, operands[1], operands[2])); + + /* Fix up the destination if needed. */ + if (dst != operands[0]) + emit_move_insn (operands[0], dst); + + DONE; +}) ;; Avoid combining registers from different units in a single alternative, ;; see comment above inline_secondary_memory_needed function in i386.c |