856
|
1 // $HeadURL$
|
|
2 // $Date$
|
|
3 // $Author$
|
709
|
4
|
|
5 // @author@ Thomas Kuehne <thomas-dloop@kuehne.cn>
|
|
6
|
|
7 module /*dstress.*/addon.cpuinfo;
|
|
8
|
|
9 version(D_InlineAsm){
|
769
|
10 version(X86){
|
|
11 const bool haveX86InlineAsm = true;
|
|
12 version = haveX86InlineAsm;
|
|
13 }else version(X86_64){
|
|
14 const bool haveX86InlineAsm = true;
|
|
15 version = haveX86InlineAsm;
|
|
16 }else{
|
1002
|
17 pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
|
769
|
18 const bool haveX86InlineAsm = false;
|
709
|
19 }
|
769
|
20 }else version(D_InlineAsm_X86){
|
|
21 const bool haveX86InlineAsm = true;
|
|
22 version = haveX86InlineAsm;
|
990
|
23 }else version(D_InlineAsm_X86_X64){
|
|
24 const bool haveX86InlineAsm = true;
|
|
25 version = haveX86InlineAsm;
|
769
|
26 }else{
|
1002
|
27 pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
|
769
|
28 const bool haveX86InlineAsm = false;
|
|
29 }
|
|
30
|
990
|
31
|
|
32 template haveCMOV(){
|
|
33 void haveCMOV(){
|
|
34 uint a = 0;
|
769
|
35
|
990
|
36 version(haveX86InlineAsm){
|
|
37 asm{
|
|
38 mov EAX, 1;
|
|
39 cpuid;
|
|
40 mov a, EDX;
|
|
41 }
|
1002
|
42 }else{
|
|
43 pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
|
709
|
44 }
|
769
|
45
|
990
|
46 if(!((a >> 15) & 1)){
|
|
47 throw new Exception("DSTRESS{XFAIL}: no CMOV support present");
|
|
48 }
|
769
|
49 }
|
|
50 }
|
1002
|
51
|
769
|
52 void haveCX8(){
|
|
53 uint a = 0;
|
|
54
|
|
55 version(haveX86InlineAsm){
|
709
|
56 asm{
|
|
57 mov EAX, 1;
|
|
58 cpuid;
|
|
59 mov a, EDX;
|
|
60 }
|
769
|
61 }
|
|
62
|
|
63 if(!((a >> 8) & 1)){
|
|
64 throw new Exception("no X86 CX8 support present");
|
709
|
65 }
|
769
|
66 }
|
|
67
|
990
|
68 template haveFPU(){
|
|
69 void haveFPU(){
|
|
70 uint a = 0;
|
1002
|
71
|
990
|
72 version(haveX86InlineAsm){
|
|
73 asm{
|
|
74 mov EAX, 1;
|
|
75 cpuid;
|
|
76 mov a, EDX;
|
|
77 }
|
1002
|
78 }else{
|
|
79 pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
|
709
|
80 }
|
1002
|
81
|
990
|
82 if(!(a & 1)){
|
|
83 throw new Exception("DSTRESS{XFAIL}: no X86 FPU present");
|
|
84 }
|
709
|
85 }
|
769
|
86 }
|
|
87
|
1002
|
88 template haveMMX(){
|
|
89 void haveMMX(){
|
|
90 uint a = 0;
|
|
91
|
|
92 version(haveX86InlineAsm){
|
|
93 asm{
|
|
94 mov EAX, 1;
|
|
95 cpuid;
|
|
96 mov a, EDX;
|
|
97 }
|
|
98 }else{
|
|
99 pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
|
769
|
100 }
|
1002
|
101
|
|
102 if(!((a >> 23) & 1)){
|
|
103 throw new Exception("DSTRESS{XFAIL}: no MMX support present");
|
|
104 }
|
769
|
105 }
|
|
106 }
|
709
|
107
|
1002
|
108 template haveSSE(){
|
|
109 void haveSSE(){
|
|
110 uint a = 0;
|
|
111
|
|
112 version(haveX86InlineAsm){
|
|
113 asm{
|
|
114 mov EAX, 1;
|
|
115 cpuid;
|
|
116 mov a, EDX;
|
|
117 }
|
|
118 }else{
|
|
119 pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
|
|
120 }
|
|
121
|
|
122 if(!((a >> 25) & 1)){
|
|
123 throw new Exception("DSTRESS{XFAIL}: no SSE support present");
|
709
|
124 }
|
769
|
125 }
|
|
126 }
|
|
127
|
1002
|
128 template haveSSE2(){
|
|
129 void haveSSE2(){
|
|
130 uint a = 0;
|
|
131
|
|
132 version(haveX86InlineAsm){
|
|
133 asm{
|
|
134 mov EAX, 1;
|
|
135 cpuid;
|
|
136 mov a, EDX;
|
|
137 }
|
|
138 }else{
|
|
139 pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
|
709
|
140 }
|
769
|
141
|
1002
|
142 if(!((a >> 26) & 1)){
|
|
143 throw new Exception("DSTRESS{XFAIL}: no SSE2 support present");
|
|
144 }
|
769
|
145 }
|
|
146 }
|
993
|
147
|
|
148 template haveSSE3(){
|
|
149 void haveSSE3(){
|
|
150 uint a = 1;
|
|
151 uint b = 0;
|
1002
|
152
|
993
|
153 version(haveX86InlineAsm){
|
|
154 asm{
|
|
155 mov EAX, a;
|
|
156 cpuid;
|
|
157 mov b, ECX;
|
|
158 }
|
1002
|
159 }else{
|
|
160 pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
|
993
|
161 }
|
1002
|
162
|
993
|
163 if(!(a & 1)){
|
|
164 throw new Exception("DSTRESS{XFAIL}: no SSE3 support present");
|
709
|
165 }
|
|
166 }
|
769
|
167 }
|