sse4_1-round.h (do_round): Fix inline asm statements.
authorUros Bizjak <ubizjak@gmail.com>
Tue, 8 Dec 2015 18:21:15 +0000 (19:21 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Tue, 8 Dec 2015 18:21:15 +0000 (19:21 +0100)
* gcc.target/i386/sse4_1-round.h (do_round): Fix inline asm statements.
* gcc.target/i386/sse4_1-roundsd-4.c (do_round): Ditto.
* gcc.target/i386/sse4_1-roundss-4.c (do_round): Ditto.

From-SVN: r231418

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/sse4_1-round.h
gcc/testsuite/gcc.target/i386/sse4_1-roundsd-4.c
gcc/testsuite/gcc.target/i386/sse4_1-roundss-4.c

index 669f69fb1eaf8aa3b710b8fdb9c171f6ba1fc3c6..80f85c836e68939a860c28e5cb1f0ecb25a9fde9 100644 (file)
@@ -1,3 +1,9 @@
+2015-12-08  Uros Bizjak  <ubizjak@gmail.com>
+
+       * gcc.target/i386/sse4_1-round.h (do_round): Fix inline asm statements.
+       * gcc.target/i386/sse4_1-roundsd-4.c (do_round): Ditto.
+       * gcc.target/i386/sse4_1-roundss-4.c (do_round): Ditto.
+
 2015-12-08  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc.dg/sso-9.c (foo): Robustify trick.
index 0210ac130b6e0216dedd4902a69f83df47c1895a..dfb0b778cdcf6be1e26c293c577012a31479493e 100644 (file)
@@ -28,7 +28,7 @@ init_round (FP_T *src)
 static FP_T
 do_round (FP_T f, int type)
 {
-  short saved_cw, new_cw, clr_mask;
+  unsigned short saved_cw, new_cw, clr_mask;
   FP_T ret;
 
   if ((type & 4))
@@ -42,16 +42,15 @@ do_round (FP_T f, int type)
       clr_mask = ~0x0C3F;
     }
 
-  __asm__ ("fld" ASM_SUFFIX " %0" : : "m" (*&f));
+  __asm__ ("fnstcw %0" : "=m" (saved_cw));
 
-  __asm__ ("fstcw %0" : "=m" (*&saved_cw));
   new_cw = saved_cw & clr_mask;
   new_cw |= type;
-  __asm__ ("fldcw %0" : : "m" (*&new_cw));
 
-  __asm__ ("frndint\n"
-          "fstp" ASM_SUFFIX " %0\n" : "=m" (*&ret));
-  __asm__ ("fldcw %0" : : "m" (*&saved_cw));
+  __asm__ ("fldcw %2\n\t"
+          "frndint\n\t"
+          "fldcw %3" : "=t" (ret)
+                     : "0" (f), "m" (new_cw), "m" (saved_cw));
   return ret;
 }
 
index 124f825021d6218fdcbd29434edd29cdb8d431ba..ff8b09eeba62f771ab3d6802e986c7b9bd91e225 100644 (file)
@@ -36,7 +36,7 @@ init_round (double *src)
 static double
 do_round (double f, int type)
 {
-  short saved_cw, new_cw, clr_mask;
+  unsigned short saved_cw, new_cw, clr_mask;
   double ret;
 
   if ((type & 4))
@@ -50,16 +50,15 @@ do_round (double f, int type)
       clr_mask = ~0x0C3F;
     }
 
-  __asm__ ("fldl %0" : : "m" (*&f));
+  __asm__ ("fnstcw %0" : "=m" (saved_cw));
 
-  __asm__ ("fstcw %0" : "=m" (*&saved_cw));
   new_cw = saved_cw & clr_mask;
   new_cw |= type;
-  __asm__ ("fldcw %0" : : "m" (*&new_cw));
 
-  __asm__ ("frndint\n"
-          "fstpl %0\n" : "=m" (*&ret));
-  __asm__ ("fldcw %0" : : "m" (*&saved_cw));
+  __asm__ ("fldcw %2\n\t"
+          "frndint\n\t"
+          "fldcw %3" : "=t" (ret)
+                     : "0" (f), "m" (new_cw), "m" (saved_cw));
   return ret;
 }
 
index 71042d1b77765367b92f53ce37017f28ae28801a..95488908630181827898498216bb2ac0f9f59af7 100644 (file)
@@ -36,7 +36,7 @@ init_round (float *src)
 static float
 do_round (float f, int type)
 {
-  short saved_cw, new_cw, clr_mask;
+  unsigned short saved_cw, new_cw, clr_mask;
   float ret;
 
   if ((type & 4))
@@ -50,16 +50,15 @@ do_round (float f, int type)
       clr_mask = ~0x0C3F;
     }
 
-  __asm__ ("flds %0" : : "m" (*&f));
+  __asm__ ("fnstcw %0" : "=m" (saved_cw));
 
-  __asm__ ("fstcw %0" : "=m" (*&saved_cw));
   new_cw = saved_cw & clr_mask;
   new_cw |= type;
-  __asm__ ("fldcw %0" : : "m" (*&new_cw));
 
-  __asm__ ("frndint\n"
-          "fstps %0\n" : "=m" (*&ret));
-  __asm__ ("fldcw %0" : : "m" (*&saved_cw));
+  __asm__ ("fldcw %2\n\t"
+          "frndint\n\t"
+          "fldcw %3" : "=t" (ret)
+                     : "0" (f), "m" (new_cw), "m" (saved_cw));
   return ret;
 }