Use movq for 64-bit operations
authorPeter Collingbourne <pcc@google.com>
Wed, 15 May 2013 18:33:45 +0000 (20:33 +0200)
committerAndreas Jaeger <aj@suse.de>
Wed, 15 May 2013 18:33:45 +0000 (20:33 +0200)
The EXTRACT_WORDS64 and INSERT_WORDS64 macros use movd for a 64-bit
operation.  Somehow gcc manages to turn this into movq, but LLVM won't.

2013-05-15  Peter Collingbourne  <pcc@google.com>

* sysdeps/x86_64/fpu/math_private.h (MOVQ): New macro.
(EXTRACT_WORDS64) Use where appropriate.
(INSERT_WORDS64) Likewise.

ChangeLog
sysdeps/x86_64/fpu/math_private.h

index 4550566..9bdeaaf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2013-05-15  Peter Collingbourne  <pcc@google.com>
 
+       * sysdeps/x86_64/fpu/math_private.h (MOVQ): New macro.
+       (EXTRACT_WORDS64) Use where appropriate.
+       (INSERT_WORDS64) Likewise.
+
        * sysdeps/x86_64/fpu/multiarch/s_fma.c (__fma_fma4): Replace xm
        constraints with x constraints.
        * sysdeps/x86_64/fpu/multiarch/s_fmaf.c (__fmaf_fma4): Likewise.
index 63a699e..027a6a3 100644 (file)
@@ -5,15 +5,17 @@
 
 #if defined __AVX__ || defined SSE2AVX
 # define MOVD "vmovd"
+# define MOVQ "vmovq"
 #else
 # define MOVD "movd"
+# define MOVQ "movq"
 #endif
 
 /* Direct movement of float into integer register.  */
 #define EXTRACT_WORDS64(i, d)                                                \
   do {                                                                       \
     int64_t i_;                                                                      \
-    asm (MOVD " %1, %0" : "=rm" (i_) : "x" ((double) (d)));                  \
+    asm (MOVQ " %1, %0" : "=rm" (i_) : "x" ((double) (d)));                  \
     (i) = i_;                                                                \
   } while (0)
 
@@ -22,7 +24,7 @@
   do {                                                                       \
     int64_t i_ = i;                                                          \
     double d__;                                                                      \
-    asm (MOVD " %1, %0" : "=x" (d__) : "rm" (i_));                           \
+    asm (MOVQ " %1, %0" : "=x" (d__) : "rm" (i_));                           \
     d = d__;                                                                 \
   } while (0)