diff options
author | uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-07-21 21:20:59 +0000 |
---|---|---|
committer | uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-07-21 21:20:59 +0000 |
commit | 8cddd4c123bd1794e5c198a70fb735e058a896d9 (patch) | |
tree | 2fbcb549531d379cdeb84949830acff9d9faaa81 /gcc/config/i386/i386.md | |
parent | 1329af872c6c4ad094415cf6b5fb4bd1483eef57 (diff) | |
download | gcc-8cddd4c123bd1794e5c198a70fb735e058a896d9.tar.gz |
Backport from mainline
2011-07-04 Uros Bizjak <ubizjak@gmail.com>
PR target/49600
* config/i386/i386.md (SSE2 int->float split): Push operand 1 in
general register to memory for !TARGET_INTER_UNIT_MOVES.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@176589 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/i386/i386.md')
-rw-r--r-- | gcc/config/i386/i386.md | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 3bfa0b3d6f3..cf874981427 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -5280,11 +5280,20 @@ if (GET_CODE (op1) == SUBREG) op1 = SUBREG_REG (op1); - if (GENERAL_REG_P (op1) && TARGET_INTER_UNIT_MOVES) + if (GENERAL_REG_P (op1)) { operands[4] = simplify_gen_subreg (V4SImode, operands[0], <MODE>mode, 0); - emit_insn (gen_sse2_loadld (operands[4], - CONST0_RTX (V4SImode), operands[1])); + if (TARGET_INTER_UNIT_MOVES) + emit_insn (gen_sse2_loadld (operands[4], + CONST0_RTX (V4SImode), operands[1])); + else + { + operands[5] = ix86_force_to_memory (GET_MODE (operands[1]), + operands[1]); + emit_insn (gen_sse2_loadld (operands[4], + CONST0_RTX (V4SImode), operands[5])); + ix86_free_from_memory (GET_MODE (operands[1])); + } } /* We can ignore possible trapping value in the high part of SSE register for non-trapping math. */ |