Browse code

Check whether compiler supports xmm registers in asm clobber list

Originally committed as revision 25362 to svn://svn.ffmpeg.org/ffmpeg/trunk

Ramiro Polla authored on 2010/10/06 10:26:13
Showing 2 changed files
... ...
@@ -1074,6 +1074,7 @@ HAVE_LIST="
1074 1074
     VirtualAlloc
1075 1075
     winsock2_h
1076 1076
     xform_asm
1077
+    xmm_clobbers
1077 1078
     yasm
1078 1079
 "
1079 1080
 
... ...
@@ -2585,6 +2586,9 @@ EOF
2585 2585
     check_asm ebx_available '""::"b"(0)' &&
2586 2586
         check_asm ebx_available '"":::"%ebx"'
2587 2587
 
2588
+    # check whether xmm clobbers are supported
2589
+    check_asm xmm_clobbers '"":::"%xmm0"'
2590
+
2588 2591
     # check whether more than 10 operands are supported
2589 2592
     check_cc <<EOF && enable ten_operands
2590 2593
 int main(void) {
... ...
@@ -75,4 +75,24 @@ typedef int x86_reg;
75 75
 #    define BROKEN_RELOCATIONS 1
76 76
 #endif
77 77
 
78
+/*
79
+ * If gcc is not set to support sse (-msse) it will not accept xmm registers
80
+ * in the clobber list for inline asm. XMM_CLOBBERS takes a list of xmm
81
+ * registers to be marked as clobbered and evaluates to nothing if they are
82
+ * not supported, or to the list itself if they are supported. Since a clobber
83
+ * list may not be empty, XMM_CLOBBERS_ONLY should be used if the xmm
84
+ * registers are the only in the clobber list.
85
+ * For example a list with "eax" and "xmm0" as clobbers should become:
86
+ * : XMM_CLOBBERS("xmm0",) "eax"
87
+ * and a list with only "xmm0" should become:
88
+ * XMM_CLOBBERS_ONLY("xmm0")
89
+ */
90
+#if HAVE_XMM_CLOBBERS
91
+#    define XMM_CLOBBERS(...)        __VA_ARGS__
92
+#    define XMM_CLOBBERS_ONLY(...) : __VA_ARGS__
93
+#else
94
+#    define XMM_CLOBBERS(...)
95
+#    define XMM_CLOBBERS_ONLY(...)
96
+#endif
97
+
78 98
 #endif /* AVUTIL_X86_CPU_H */