Add support for doing ARM simd detection on Windows
authorJeff Muizelaar <jmuizelaar@mozilla.com>
Wed, 15 Apr 2009 14:38:37 +0000 (10:38 -0400)
committerJeff Muizelaar <jmuizelaar@mozilla.com>
Wed, 15 Apr 2009 14:38:37 +0000 (10:38 -0400)
pixman/pixman-arm-detect-win32.asm [new file with mode: 0644]
pixman/pixman-arm-simd.h
pixman/pixman-pict.c

diff --git a/pixman/pixman-arm-detect-win32.asm b/pixman/pixman-arm-detect-win32.asm
new file mode 100644 (file)
index 0000000..dfe363e
--- /dev/null
@@ -0,0 +1,10 @@
+    area pixman_msvc, code, readonly\r
+\r
+    export  pixman_msvc_try_armv6_op\r
+\r
+pixman_msvc_try_armv6_op\r
+    uqadd8 r0,r0,r1\r
+    mov pc,lr\r
+    endp\r
+\r
+    end\r
index ecaace5..fae7b94 100644 (file)
@@ -28,7 +28,7 @@
 
 #ifdef USE_ARM_SIMD
 
-static inline pixman_bool_t pixman_have_arm_simd(void) { return TRUE; }
+pixman_bool_t pixman_have_arm_simd(void);
 
 #else
 #define pixman_have_arm_simd() FALSE
index 5f3ddd2..82d7160 100644 (file)
 #include "pixman-arm-simd.h"
 #include "pixman-combine32.h"
 
+#if defined(USE_ARM_SIMD) && defined(_MSC_VER)
+/* Needed for EXCEPTION_ILLEGAL_INSTRUCTION */
+#include <windows.h>
+#endif
+
 #define FbFullMask(n)   ((n) == 32 ? (uint32_t)-1 : ((((uint32_t) 1) << n) - 1))
 
 #undef READ
@@ -2190,6 +2195,31 @@ pixman_bool_t pixman_have_vmx (void) {
 #endif /* __APPLE__ */
 #endif /* USE_VMX */
 
+#ifdef USE_ARM_SIMD
+pixman_bool_t
+pixman_have_arm_simd (void)
+{
+#ifdef _MSC_VER
+    static pixman_bool_t initialized = FALSE;
+    static pixman_bool_t have_arm_simd = FALSE;
+
+    if (!initialized) {
+        __try {
+            pixman_msvc_try_armv6_op();
+            have_arm_simd = TRUE;
+        } __except(GetExceptionCode() == EXCEPTION_ILLEGAL_INSTRUCTION) {
+            have_arm_simd = FALSE;
+        }
+       initialized = TRUE;
+    }
+
+    return have_arm_simd;
+#else
+    return TRUE;
+#endif
+}
+#endif
+
 #ifdef USE_MMX
 /* The CPU detection code needs to be in a file not compiled with
  * "-mmmx -msse", as gcc would generate CMOV instructions otherwise