diff options
| author | uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-05-25 22:36:10 +0000 |
|---|---|---|
| committer | uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-05-25 22:36:10 +0000 |
| commit | d07131bdcc8def7a168b0ca661728ded83c157af (patch) | |
| tree | d2ea079379840422a1a173736a1a1f4988842dc9 | |
| parent | cd90e13cb2638a2fec1200a5e7a36fe93b27613e (diff) | |
| download | ppe42-gcc-d07131bdcc8def7a168b0ca661728ded83c157af.tar.gz ppe42-gcc-d07131bdcc8def7a168b0ca661728ded83c157af.zip | |
PR target/32065
* target/i386/i386.c (ix86_expand_vector_move): Force SUBREGs of
constants into memory. Expand unaligned memory references for
SSE modes via x86_expand_vector_move_misalign() function.
testsuite/ChangeLog:
PR target/32065
* gcc.target/i386/pr32065.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@125077 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/ChangeLog | 7 | ||||
| -rw-r--r-- | gcc/config/i386/i386.c | 32 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/testsuite/gcc.target/i386/pr32065.c | 7 |
4 files changed, 50 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0fd8e7533bb..4967fc5a793 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-05-26 Uros Bizjak <ubizjak@gmail.com> + + PR target/32065 + * target/i386/i386.c (ix86_expand_vector_move): Force SUBREGs of + constants into memory. Expand unaligned memory references for + SSE modes via x86_expand_vector_move_misalign() function. + 2007-05-25 Uros Bizjak <ubizjak@gmail.com> * config/i386/sse.md (*vec_extractv2di_1_sse2): Do not calculate diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index ca5df2dea4d..dae841c0d21 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -9727,6 +9727,7 @@ void ix86_expand_vector_move (enum machine_mode mode, rtx operands[]) { rtx op0 = operands[0], op1 = operands[1]; + unsigned int align = GET_MODE_ALIGNMENT (mode); /* Force constants other than zero into memory. We do not know how the instructions used to build constants modify the upper 64 bits @@ -9734,10 +9735,39 @@ ix86_expand_vector_move (enum machine_mode mode, rtx operands[]) to handle some of them more efficiently. */ if ((reload_in_progress | reload_completed) == 0 && register_operand (op0, mode) - && CONSTANT_P (op1) + && (CONSTANT_P (op1) + || (GET_CODE (op1) == SUBREG + && CONSTANT_P (SUBREG_REG (op1)))) && standard_sse_constant_p (op1) <= 0) op1 = validize_mem (force_const_mem (mode, op1)); + /* TDmode values are passed as TImode on the stack. Timode values + are moved via xmm registers, and moving them to stack can result in + unaligned memory access. Use ix86_expand_vector_move_misalign() + if memory operand is not aligned correctly. */ + if (!no_new_pseudos + && SSE_REG_MODE_P (mode) + && ((MEM_P (op0) && (MEM_ALIGN (op0) < align)) + || (MEM_P (op1) && (MEM_ALIGN (op1) < align)))) + { + rtx tmp[2]; + + /* ix86_expand_vector_move_misalign() does not like constants ... */ + if (CONSTANT_P (op1) + || (GET_CODE (op1) == SUBREG + && CONSTANT_P (SUBREG_REG (op1)))) + op1 = validize_mem (force_const_mem (mode, op1)); + + /* ... nor both arguments in memory. */ + if (!register_operand (op0, mode) + && !register_operand (op1, mode)) + op1 = force_reg (mode, op1); + + tmp[0] = op0; tmp[1] = op1; + ix86_expand_vector_move_misalign (mode, tmp); + return; + } + /* Make operand1 a register if it isn't already. */ if (!no_new_pseudos && !register_operand (op0, mode) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ed0ee7f7979..59b193945ea 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +007-05-26 Uros Bizjak <ubizjak@gmail.com> + + PR target/32065 + * gcc.target/i386/pr32065.c: New test. + 2007-05-25 Dirk Mueller <dmueller@suse.de> Marcus Meissner <meissner@suse.de> diff --git a/gcc/testsuite/gcc.target/i386/pr32065.c b/gcc/testsuite/gcc.target/i386/pr32065.c new file mode 100644 index 00000000000..d6692b52784 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr32065.c @@ -0,0 +1,7 @@ +/* { dg-do compile { target dfp } } */ +/* { dg-options "-msse" } */ + +_Decimal128 test (void) +{ + return 1234123412341234.123412341234dl; +} |

