blob: 40e9c2f0a5cdaba9838691505a06f4467b6037b0 [file] [log] [blame]
nethercote288b7662004-01-20 09:24:53 +00001#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4
nethercote1018bdd2004-02-11 23:33:29 +00005static __inline__ void cpuid(unsigned int n,
nethercote288b7662004-01-20 09:24:53 +00006 unsigned int *a, unsigned int *b,
7 unsigned int *c, unsigned int *d)
8{
9 __asm__ __volatile__ (
10 "cpuid"
11 : "=a" (*a), "=b" (*b), "=c" (*c), "=d" (*d) /* output */
12 : "0" (n) /* input */
13 );
14}
15
16int main(int argc, char **argv)
17{
nethercote1018bdd2004-02-11 23:33:29 +000018 unsigned int level = 0;
nethercote288b7662004-01-20 09:24:53 +000019 unsigned int mask = 0;
20 unsigned int a;
21 unsigned int b;
22 unsigned int c;
23 unsigned int d;
24
nethercote1018bdd2004-02-11 23:33:29 +000025 if ( argc == 2 ) {
thughesb76f0dc2004-03-27 18:02:37 +000026 if ( strcmp( argv[1], "fpu" ) == 0 ) {
27 level = 1;
28 mask = 1 << 0;
29 } else if ( strcmp( argv[1], "cmov" ) == 0 ) {
nethercote1018bdd2004-02-11 23:33:29 +000030 level = 1;
31 mask = 1 << 15;
32 } else if ( strcmp( argv[1], "mmx" ) == 0 ) {
33 level = 1;
34 mask = 1 << 23;
35 } else if ( strcmp( argv[1], "mmxext" ) == 0 ) {
36 level = 0x80000001;
37 mask = 1 << 22;
38 } else if ( strcmp( argv[1], "sse" ) == 0 ) {
39 level = 1;
40 mask = 1 << 25;
41 } else if ( strcmp( argv[1], "sse2" ) == 0 ) {
42 level = 1;
43 mask = 1 << 26;
44 }
nethercote288b7662004-01-20 09:24:53 +000045 }
46
nethercote1018bdd2004-02-11 23:33:29 +000047 if ( level == 0 || mask == 0 ) {
48 fprintf( stderr, "usage: cputest [cmov|mmx|mmxext|sse|sse2]\n" );
nethercote288b7662004-01-20 09:24:53 +000049 exit( 1 );
50 }
51
nethercote1018bdd2004-02-11 23:33:29 +000052 cpuid( level & 0x80000000, &a, &b, &c, &d );
nethercote288b7662004-01-20 09:24:53 +000053
nethercote1018bdd2004-02-11 23:33:29 +000054 if ( a >= level ) {
55 cpuid( level, &a, &b, &c, &d );
nethercote288b7662004-01-20 09:24:53 +000056
57 if ( ( d & mask ) != 0 ) exit( 0 );
58 }
59
60 exit( 1 );
61}