Hello! Attached patch emits necessary emms instructions to fix mixed V2SFmode/SFmode runtime test on 32bit x86 targets. The patch also reorders functions a bit to group together MMX argument handlings, so it becomes less fragile w.r.t. MMX/x87 interactions.
2013-12-15 Uros Bizjak <ubiz...@gmail.com> * gcc.dg/vect/vect-nop-move.c (foo32x2_be): Call __builtin_ia32_emms for 32bit x86 targets. (foo32x2_le): Ditto. (main): Reorder function calls. Tested on x86_64-pc-linux-gnu {,-m32} and committed to mainline. Uros.
Index: gcc.dg/vect/vect-nop-move.c =================================================================== --- gcc.dg/vect/vect-nop-move.c (revision 205996) +++ gcc.dg/vect/vect-nop-move.c (working copy) @@ -30,12 +30,21 @@ bar (float a) NOINLINE float foo32x2_be (float32x2_t x) { +#ifdef __i386__ + /* ix86 passes float32x2 vector arguments in mmx registers. We need to + emit emms to empty MMS state and reenable x87 stack before float value + can be loaded to and passed in x87 floating-point return register. */ + __builtin_ia32_emms (); +#endif return bar (x[1]); } NOINLINE float foo32x2_le (float32x2_t x) { +#ifdef __i386__ + __builtin_ia32_emms (); +#endif return bar (x[0]); } @@ -45,16 +54,16 @@ main() float32x4_t a = { 0.0f, 1.0f, 2.0f, 3.0f }; float32x2_t b = { 0.0f, 1.0f }; - if (foo32x4_be (a) != 3.0f) + if (foo32x2_be (b) != 1.0f) abort (); - if (foo32x4_le (a) != 0.0f) + if (foo32x2_le (b) != 0.0f) abort (); - if (foo32x2_be (b) != 1.0f) + if (foo32x4_be (a) != 3.0f) abort (); - if (foo32x2_le (b) != 0.0f) + if (foo32x4_le (a) != 0.0f) abort (); return 0;