Regression tests for SSE3 support.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@5997 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/tests/cputest.c b/tests/cputest.c
index 9975c36..da39100 100644
--- a/tests/cputest.c
+++ b/tests/cputest.c
@@ -1,6 +1,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <assert.h>
 
 // We return:
 // - 0 if the machine matches the asked-for cpu
@@ -56,42 +57,52 @@
 
 static Bool go(char* cpu)
 { 
-   unsigned int level = 0, mask = 0, a, b, c, d;
+   unsigned int level = 0, cmask = 0, dmask = 0, a, b, c, d;
 
    if ( strcmp( cpu, "x86" ) == 0 ) {
      return True;
    } else if ( strcmp( cpu, "x86-fpu" ) == 0 ) {
      level = 1;
-     mask = 1 << 0;
+     dmask = 1 << 0;
    } else if ( strcmp( cpu, "x86-cmov" ) == 0 ) {
      level = 1;
-     mask = 1 << 15;
+     dmask = 1 << 15;
    } else if ( strcmp( cpu, "x86-mmx" ) == 0 ) {
      level = 1;
-     mask = 1 << 23;
+     dmask = 1 << 23;
    } else if ( strcmp( cpu, "x86-mmxext" ) == 0 ) {
      level = 0x80000001;
-     mask = 1 << 22;
+     dmask = 1 << 22;
    } else if ( strcmp( cpu, "x86-sse" ) == 0 ) {
      level = 1;
-     mask = 1 << 25;
+     dmask = 1 << 25;
    } else if ( strcmp( cpu, "x86-sse2" ) == 0 ) {
      level = 1;
-     mask = 1 << 26;
+     dmask = 1 << 26;
+   } else if ( strcmp( cpu, "x86-sse3" ) == 0 ) {
+     level = 1;
+     cmask = 1 << 0;
 #if defined(__x86_64__)
    } else if ( strcmp( cpu, "amd64" ) == 0 ) {
      return True;
+   } else if ( strcmp( cpu, "amd64-sse3" ) == 0 ) {
+     level = 1;
+     cmask = 1 << 0;
 #endif
    } else {
      return False;
    }
 
+   assert( !(cmask != 0 && dmask != 0) );
+   assert( !(cmask == 0 && dmask == 0) );
+
    cpuid( level & 0x80000000, &a, &b, &c, &d );
 
    if ( a >= level ) {
       cpuid( level, &a, &b, &c, &d );
 
-      if ( ( d & mask ) != 0 ) return True;
+      if (dmask > 0 && (d & dmask) != 0) return True;
+      if (cmask > 0 && (c & cmask) != 0) return True;
    }
    return False;
 }