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
|
1042
|
31 template have3DNow(){
|
|
32 void have3DNow(){
|
|
33 uint a = 0;
|
|
34
|
|
35 version(haveX86InlineAsm){
|
|
36 asm{
|
|
37 mov EAX, 0x8000_0001;
|
|
38 cpuid;
|
|
39 mov a, EDX;
|
|
40 }
|
|
41 }else{
|
|
42 pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
|
|
43 }
|
|
44
|
|
45 if(!((a >> 30) & 1)){
|
|
46 throw new Exception("DSTRESS{XFAIL}: no 3DNow! support present");
|
|
47 }
|
|
48 }
|
|
49 }
|
990
|
50
|
|
51 template haveCMOV(){
|
|
52 void haveCMOV(){
|
|
53 uint a = 0;
|
769
|
54
|
990
|
55 version(haveX86InlineAsm){
|
|
56 asm{
|
|
57 mov EAX, 1;
|
|
58 cpuid;
|
|
59 mov a, EDX;
|
|
60 }
|
1002
|
61 }else{
|
|
62 pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
|
709
|
63 }
|
769
|
64
|
990
|
65 if(!((a >> 15) & 1)){
|
|
66 throw new Exception("DSTRESS{XFAIL}: no CMOV support present");
|
|
67 }
|
769
|
68 }
|
|
69 }
|
1002
|
70
|
769
|
71 void haveCX8(){
|
|
72 uint a = 0;
|
|
73
|
|
74 version(haveX86InlineAsm){
|
709
|
75 asm{
|
|
76 mov EAX, 1;
|
|
77 cpuid;
|
|
78 mov a, EDX;
|
|
79 }
|
769
|
80 }
|
|
81
|
|
82 if(!((a >> 8) & 1)){
|
|
83 throw new Exception("no X86 CX8 support present");
|
709
|
84 }
|
769
|
85 }
|
|
86
|
990
|
87 template haveFPU(){
|
|
88 void haveFPU(){
|
|
89 uint a = 0;
|
1002
|
90
|
990
|
91 version(haveX86InlineAsm){
|
|
92 asm{
|
|
93 mov EAX, 1;
|
|
94 cpuid;
|
|
95 mov a, EDX;
|
|
96 }
|
1002
|
97 }else{
|
|
98 pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
|
709
|
99 }
|
1002
|
100
|
990
|
101 if(!(a & 1)){
|
|
102 throw new Exception("DSTRESS{XFAIL}: no X86 FPU present");
|
|
103 }
|
709
|
104 }
|
769
|
105 }
|
|
106
|
1002
|
107 template haveMMX(){
|
|
108 void haveMMX(){
|
|
109 uint a = 0;
|
|
110
|
|
111 version(haveX86InlineAsm){
|
|
112 asm{
|
|
113 mov EAX, 1;
|
|
114 cpuid;
|
|
115 mov a, EDX;
|
|
116 }
|
|
117 }else{
|
|
118 pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
|
769
|
119 }
|
1002
|
120
|
|
121 if(!((a >> 23) & 1)){
|
|
122 throw new Exception("DSTRESS{XFAIL}: no MMX support present");
|
|
123 }
|
769
|
124 }
|
|
125 }
|
709
|
126
|
1002
|
127 template haveSSE(){
|
|
128 void haveSSE(){
|
|
129 uint a = 0;
|
|
130
|
|
131 version(haveX86InlineAsm){
|
|
132 asm{
|
|
133 mov EAX, 1;
|
|
134 cpuid;
|
|
135 mov a, EDX;
|
|
136 }
|
|
137 }else{
|
|
138 pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
|
|
139 }
|
|
140
|
|
141 if(!((a >> 25) & 1)){
|
|
142 throw new Exception("DSTRESS{XFAIL}: no SSE support present");
|
709
|
143 }
|
769
|
144 }
|
|
145 }
|
|
146
|
1002
|
147 template haveSSE2(){
|
|
148 void haveSSE2(){
|
|
149 uint a = 0;
|
|
150
|
|
151 version(haveX86InlineAsm){
|
|
152 asm{
|
|
153 mov EAX, 1;
|
|
154 cpuid;
|
|
155 mov a, EDX;
|
|
156 }
|
|
157 }else{
|
|
158 pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
|
709
|
159 }
|
769
|
160
|
1002
|
161 if(!((a >> 26) & 1)){
|
|
162 throw new Exception("DSTRESS{XFAIL}: no SSE2 support present");
|
|
163 }
|
769
|
164 }
|
|
165 }
|
993
|
166
|
|
167 template haveSSE3(){
|
|
168 void haveSSE3(){
|
|
169 uint a = 1;
|
|
170 uint b = 0;
|
1002
|
171
|
993
|
172 version(haveX86InlineAsm){
|
|
173 asm{
|
|
174 mov EAX, a;
|
|
175 cpuid;
|
|
176 mov b, ECX;
|
|
177 }
|
1002
|
178 }else{
|
|
179 pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
|
993
|
180 }
|
1002
|
181
|
993
|
182 if(!(a & 1)){
|
|
183 throw new Exception("DSTRESS{XFAIL}: no SSE3 support present");
|
709
|
184 }
|
|
185 }
|
769
|
186 }
|
1029
|
187
|
|
188 template aligned_new(T){
|
|
189 T[] aligned_new(size_t len, size_t alignment){
|
1266
|
190 ubyte* ptr = (new ubyte[len * T.sizeof + alignment]).ptr;
|
1029
|
191
|
|
192 alignment *= 8;
|
|
193
|
|
194 while((cast(size_t)ptr) % alignment){
|
|
195 ptr++;
|
|
196 }
|
|
197
|
|
198 T[]data = (cast(T*) ptr)[0 .. len];
|
|
199 data[] = T.init;
|
|
200
|
|
201 return data;
|
|
202 }
|
|
203 }
|