chiark / gitweb /
Added check for windows to check for SSE2 instructions. Needs a custom executable :(
authordaid <daid303@gmail.com>
Wed, 22 Feb 2012 14:58:22 +0000 (15:58 +0100)
committerdaid <daid303@gmail.com>
Wed, 22 Feb 2012 14:58:22 +0000 (15:58 +0100)
SkeinPyPy/skeinforge_application/skeinforge.py
build.sh
checkSSE2/Makefile [new file with mode: 0644]
checkSSE2/main.c [new file with mode: 0644]

index 33279a9a7e3dbd1de88ae16b841a1ae48cfd43bd..9afb64e843f402b38bbb0a1b742da435104d0162 100755 (executable)
@@ -579,6 +579,14 @@ class SkeinforgeRepository:
                self.executeTitle = 'Skeinforge a file...'
        
        def getPyPyExe(self):
+               if platform.system() == "Windows":
+                       checkSSE2exe = os.path.dirname(os.path.abspath(__file__)) + "/checkSSE2.exe"
+                       if os.path.exists(checkSSE2exe):
+                               if subprocess.call(checkSSE2exe) != 0:
+                                       print "*****************************************************"
+                                       print "* Your CPU is lacking SSE2 support, cannot use PyPy *"
+                                       print "*****************************************************"
+                                       return False
                if platform.system() == "Windows":
                        pypyExe = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../../pypy/pypy.exe"));
                else:
index 675b5b824825bb065aadce4d83159b3a58a2895e..5240d64ba932b1d5f647de3caa05fcbfaddacbb9 100755 (executable)
--- a/build.sh
+++ b/build.sh
@@ -110,6 +110,15 @@ fi
 #add Skeinforge
 cp -a SkeinPyPy ${TARGET_DIR}/SkeinPyPy
 
+#Add the SSE2 check if we can build it
+if [ $BUILD_TARGET = "win32" ]; then
+       WINCC=`whereis i386-mingw32-gcc`
+       if [ "$WINCC" != "" ]; then
+               make -C checkSSE2 CC=${WINCC} TARGET=checkSSE2.exe
+               cp checkSSE2/checkSSE2.exe ${TARGET_DIR}/SkeinPyPy
+       fi
+fi
+
 #add printrun
 mv Printrun ${TARGET_DIR}/Printrun
 
diff --git a/checkSSE2/Makefile b/checkSSE2/Makefile
new file mode 100644 (file)
index 0000000..02d7b57
--- /dev/null
@@ -0,0 +1,6 @@
+CC ?= gcc
+TARGET ?= checkSSE2
+
+$(TARGET): main.c
+       $(CC) -o $(TARGET) main.c -Os
+
diff --git a/checkSSE2/main.c b/checkSSE2/main.c
new file mode 100644 (file)
index 0000000..9c66aa9
--- /dev/null
@@ -0,0 +1,21 @@
+#include <stdlib.h>
+#include <stdio.h>
+
+//Read CPU flags, and return 0 if we support SSE2, else return 1
+//See: http://en.wikipedia.org/wiki/CPUID#EAX.3D1:_Processor_Info_and_Feature_Bits
+
+int main(int argc, char** argv)
+{
+       int features;
+       
+       //Read the CPU features.
+       asm("mov $1, %%eax\n"
+               "cpuid\n"
+               "mov %%edx, %0"
+               : "=r"(features) : : "%eax", "%edx", "%ecx");
+       
+       //Check bit 26, this indicates SSE2 support
+       if (features & (1 << 26))
+               return 0;
+       return 1;
+}
\ No newline at end of file