Hi, came across build issues and the above file..
In particular, it fails when building PIC as the asm code doesn't deal with all the possible cases...

Fortunately the code was already strobed with __GNUC__, so I updated to use the gcc builtin __get_cpuid which does all the work.

I took advantage of the occasion to rectify the ints to be unsigned as we're dealing with registers here.

Patch proposal is attached.

Wanting to test this, I came across an issue here as well for SunOS, so I add as well a second patch to correctly include unistd.h for this platform in IlmImfTest/main.cpp.

Unfortunately the test fails anyway as there is a file not found named 'comp_dwaa_v1.exr'. Can't seem to find it anywhere. Any hints?

cheers
$NetBSD$

--- IlmImf/ImfSystemSpecific.cpp.orig   2014-08-10 04:23:57.000000000 +0000
+++ IlmImf/ImfSystemSpecific.cpp
@@ -40,21 +40,19 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EN
 
 namespace {
 #if defined(IMF_HAVE_SSE2) &&  defined(__GNUC__)
-
+#include <cpuid.h>
     // Helper functions for gcc + SSE enabled
-    void cpuid(int n, int &eax, int &ebx, int &ecx, int &edx)
+    void cpuid(unsigned int n, unsigned int &eax, unsigned int &ebx,
+                                       unsigned int &ecx, unsigned int &edx)
     {
-        __asm__ __volatile__ (
-            "cpuid"
-            : /* Output  */ "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx) 
-            : /* Input   */ "a"(n)
-            : /* Clobber */);
+               __get_cpuid(n, &eax, &ebx, &ecx, &edx);
     }
 
 #else // IMF_HAVE_SSE2 && __GNUC__
 
     // Helper functions for generic compiler - all disabled
-    void cpuid(int n, int &eax, int &ebx, int &ecx, int &edx)
+    void cpuid(unsigned int n, unsigned int &eax, unsigned int &ebx,
+                                       unsigned int &ecx, unsigned int &edx)
     {
         eax = ebx = ecx = edx = 0;
     }
@@ -64,7 +62,7 @@ namespace {
 
 #ifdef OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX
 
-    void xgetbv(int n, int &eax, int &edx)
+    void xgetbv(unsigned int n, unsigned int &eax, unsigned int &edx)
     {
         __asm__ __volatile__ (
             "xgetbv"
@@ -75,7 +73,7 @@ namespace {
 
 #else //  OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX
 
-    void xgetbv(int n, int &eax, int &edx)
+    void xgetbv(unsigned int n, unsigned int &eax, unsigned int &edx)
     {
         eax = edx = 0;
     }
@@ -94,8 +92,8 @@ CpuId::CpuId():
     f16c(false)
 {
     bool osxsave = false;
-    int  max     = 0;
-    int  eax, ebx, ecx, edx;
+    unsigned int  max     = 0;
+    unsigned int  eax, ebx, ecx, edx;
 
     cpuid(0, max, ebx, ecx, edx);
     if (max > 0)
$NetBSD$

--- IlmImfTest/main.cpp.orig    2014-08-10 04:23:59.000000000 +0000
+++ IlmImfTest/main.cpp
@@ -103,6 +103,8 @@
 #if defined(OPENEXR_IMF_HAVE_LINUX_PROCFS) || defined(OPENEXR_IMF_HAVE_DARWIN)
     #include <unistd.h>
     #include <sstream>
+#elif defined(__sun)
+       #include <unistd.h>
 #endif
 
 using namespace std;
_______________________________________________
Openexr-devel mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/openexr-devel

Reply via email to