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;

Reply via email to