swr: [rasterizer common] workaround clang for windows __cpuid() bug
authorTim Rowley <timothy.o.rowley@intel.com>
Thu, 26 May 2016 16:51:48 +0000 (10:51 -0600)
committerTim Rowley <timothy.o.rowley@intel.com>
Thu, 23 Jun 2016 15:49:46 +0000 (10:49 -0500)
Reviewed-by: Bruce Cherniak <bruce.cherniak@intel.com>
src/gallium/drivers/swr/rasterizer/common/isa.hpp

index ef381799bc3a6ee94dab1be46ba13f88c490f185..a62350f2b6037cfa9fa36694b5bbfba81413faf5 100644 (file)
 #include <string>
 #include <algorithm>
 
-#if defined(_WIN32)
+// Clang for Windows does supply an intrin.h with __cpuid intrinsics, however...
+// It seems to not realize that a write to "b" (ebx) will kill the value in rbx.
+// This attempts to use the "native" clang / gcc intrinsics instead of the windows
+// compatible ones.
+#if defined(_MSC_VER) && !defined(__clang__)
 #include <intrin.h>
 #else
 #include <string.h>
@@ -128,7 +132,7 @@ private:
 
             // Calling __cpuid with 0x0 as the function_id argument
             // gets the number of the highest valid function ID.
-#if defined(_WIN32)
+#if defined(_MSC_VER) && !defined(__clang__)
             __cpuid(cpui.data(), 0);
             nIds_ = cpui[0];
 #else
@@ -137,7 +141,7 @@ private:
 
             for (int i = 0; i <= nIds_; ++i)
             {
-#if defined(_WIN32)
+#if defined(_MSC_VER) && !defined(__clang__)
                 __cpuidex(cpui.data(), i, 0);
 #else
                 int *data = cpui.data();
@@ -178,7 +182,7 @@ private:
 
             // Calling __cpuid with 0x80000000 as the function_id argument
             // gets the number of the highest valid extended ID.
-#if defined(_WIN32)
+#if defined(_MSC_VER) && !defined(__clang__)
             __cpuid(cpui.data(), 0x80000000);
             nExIds_ = cpui[0];
 #else
@@ -190,7 +194,7 @@ private:
 
             for (unsigned i = 0x80000000; i <= nExIds_; ++i)
             {
-#if defined(_WIN32)
+#if defined(_MSC_VER) && !defined(__clang__)
                 __cpuidex(cpui.data(), i, 0);
 #else
                 int *data = cpui.data();