aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/config/i386/i386.md21
-rw-r--r--gcc/testsuite/gcc.target/i386/pr86722.c11
-rw-r--r--gcc/testsuite/gcc.target/i386/pr90356.c9
3 files changed, 30 insertions, 11 deletions
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 46a2663..5b44c65 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -3455,9 +3455,7 @@
&& !(MEM_P (operands[0]) && MEM_P (operands[1]))
&& (lra_in_progress || reload_completed
|| !CONST_DOUBLE_P (operands[1])
- || ((optimize_function_for_size_p (cfun)
- || (ix86_cmodel == CM_LARGE || ix86_cmodel == CM_LARGE_PIC))
- && standard_sse_constant_p (operands[1], TFmode) == 1
+ || (standard_sse_constant_p (operands[1], TFmode) == 1
&& !memory_operand (operands[0], TFmode))
|| (!TARGET_MEMORY_MISMATCH_STALL
&& memory_operand (operands[0], TFmode)))"
@@ -3590,10 +3588,11 @@
|| !CONST_DOUBLE_P (operands[1])
|| ((optimize_function_for_size_p (cfun)
|| (ix86_cmodel == CM_LARGE || ix86_cmodel == CM_LARGE_PIC))
- && ((IS_STACK_MODE (DFmode)
- && standard_80387_constant_p (operands[1]) > 0)
- || (TARGET_SSE2 && TARGET_SSE_MATH
- && standard_sse_constant_p (operands[1], DFmode) == 1))
+ && IS_STACK_MODE (DFmode)
+ && standard_80387_constant_p (operands[1]) > 0
+ && !memory_operand (operands[0], DFmode))
+ || (TARGET_SSE2 && TARGET_SSE_MATH
+ && standard_sse_constant_p (operands[1], DFmode) == 1
&& !memory_operand (operands[0], DFmode))
|| ((TARGET_64BIT || !TARGET_MEMORY_MISMATCH_STALL)
&& memory_operand (operands[0], DFmode))
@@ -3762,10 +3761,10 @@
|| !CONST_DOUBLE_P (operands[1])
|| ((optimize_function_for_size_p (cfun)
|| (ix86_cmodel == CM_LARGE || ix86_cmodel == CM_LARGE_PIC))
- && ((IS_STACK_MODE (SFmode)
- && standard_80387_constant_p (operands[1]) > 0)
- || (TARGET_SSE && TARGET_SSE_MATH
- && standard_sse_constant_p (operands[1], SFmode) == 1)))
+ && IS_STACK_MODE (SFmode)
+ && standard_80387_constant_p (operands[1]) > 0)
+ || (TARGET_SSE && TARGET_SSE_MATH
+ && standard_sse_constant_p (operands[1], SFmode) == 1)
|| memory_operand (operands[0], SFmode)
|| !TARGET_HARD_SF_REGS)"
{
diff --git a/gcc/testsuite/gcc.target/i386/pr86722.c b/gcc/testsuite/gcc.target/i386/pr86722.c
new file mode 100644
index 0000000..1092c4d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr86722.c
@@ -0,0 +1,11 @@
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-O2 -msse" } */
+
+void f(double*d,double*e){
+ for(;d<e;++d)
+ *d=(*d<.5)?.7:0;
+}
+
+/* { dg-final { scan-assembler-not "andnpd" } } */
+/* { dg-final { scan-assembler-not "orpd" } } */
+
diff --git a/gcc/testsuite/gcc.target/i386/pr90356.c b/gcc/testsuite/gcc.target/i386/pr90356.c
new file mode 100644
index 0000000..6f852b3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr90356.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -msse2 -mfpmath=sse" } */
+float doit(float k){
+ float c[2]={0.0};
+ c[1]+=k;
+ return c[0]+c[1];
+}
+
+/* { dg-final { scan-assembler "pxor" } } */