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{
|
|
17 pragma(msg, "no Inline ASM support");
|
|
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{
|
|
27 pragma(msg, "no Inline ASM support");
|
|
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 }
|
709
|
42 }
|
769
|
43
|
990
|
44 if(!((a >> 15) & 1)){
|
|
45 throw new Exception("DSTRESS{XFAIL}: no CMOV support present");
|
|
46 }
|
769
|
47 }
|
|
48 }
|
709
|
49
|
769
|
50 void haveCX8(){
|
|
51 uint a = 0;
|
|
52
|
|
53 version(haveX86InlineAsm){
|
709
|
54 asm{
|
|
55 mov EAX, 1;
|
|
56 cpuid;
|
|
57 mov a, EDX;
|
|
58 }
|
769
|
59 }
|
|
60
|
|
61 if(!((a >> 8) & 1)){
|
|
62 throw new Exception("no X86 CX8 support present");
|
709
|
63 }
|
769
|
64 }
|
|
65
|
990
|
66 template haveFPU(){
|
|
67 void haveFPU(){
|
|
68 uint a = 0;
|
709
|
69
|
990
|
70 version(haveX86InlineAsm){
|
|
71 asm{
|
|
72 mov EAX, 1;
|
|
73 cpuid;
|
|
74 mov a, EDX;
|
|
75 }
|
709
|
76 }
|
|
77
|
990
|
78 if(!(a & 1)){
|
|
79 throw new Exception("DSTRESS{XFAIL}: no X86 FPU present");
|
|
80 }
|
709
|
81 }
|
769
|
82 }
|
|
83
|
|
84 void haveMMX(){
|
|
85 uint a = 0;
|
|
86
|
|
87 version(haveX86InlineAsm){
|
|
88 asm{
|
|
89 mov EAX, 1;
|
|
90 cpuid;
|
|
91 mov a, EDX;
|
|
92 }
|
|
93 }
|
|
94
|
|
95 if(!((a >> 23) & 1)){
|
|
96 throw new Exception("no X86 MMX support present");
|
|
97 }
|
|
98 }
|
709
|
99
|
|
100
|
769
|
101 void haveSSE(){
|
|
102 uint a = 0;
|
|
103
|
|
104 version(haveX86InlineAsm){
|
709
|
105 asm{
|
|
106 mov EAX, 1;
|
|
107 cpuid;
|
|
108 mov a, EDX;
|
|
109 }
|
769
|
110 }
|
709
|
111
|
769
|
112 if(!((a >> 25) & 1)){
|
|
113 throw new Exception("no X86 SSE support present");
|
|
114 }
|
|
115 }
|
|
116
|
|
117 void haveSSE2(){
|
|
118 uint a = 0;
|
709
|
119
|
769
|
120 version(haveX86InlineAsm){
|
709
|
121 asm{
|
|
122 mov EAX, 1;
|
|
123 cpuid;
|
|
124 mov a, EDX;
|
|
125 }
|
|
126 }
|
769
|
127
|
|
128 if(!((a >> 26) & 1)){
|
|
129 throw new Exception("no X86 SSE2 support present");
|
|
130 }
|
|
131 }
|
993
|
132
|
|
133 template haveSSE3(){
|
|
134 void haveSSE3(){
|
|
135 uint a = 1;
|
|
136 uint b = 0;
|
709
|
137
|
993
|
138 version(haveX86InlineAsm){
|
|
139 asm{
|
|
140 mov EAX, a;
|
|
141 cpuid;
|
|
142 mov b, ECX;
|
|
143 }
|
|
144 }
|
|
145
|
|
146 if(!(a & 1)){
|
|
147 throw new Exception("DSTRESS{XFAIL}: no SSE3 support present");
|
709
|
148 }
|
|
149 }
|
769
|
150 }
|