initial commit
[rofl0r-KOL.git] / Mmx.pas
blobb4cf80e002f46f8c3f8908ec053c4b242ba74daf
1 unit Mmx;
2 {* MMX support unit. By Vladimir Kladov, 2003. }
4 interface
6 {$I KOLDEF.INC}
8 uses
9 Windows, Kol;
11 type
12 TCpuId = ( cpuOld486, cpuNew486, cpuMMX, cpuSSE, cpuSSE2 );
13 {* Enumeration type to represent CPU type.
14 cpuOld486: Old 486 Processor and earlier
15 cpuNew486: New 486 Processor to Pentium1 without MMX
16 cpuMMX : MMX supported (but not SSE or SSE2)
17 cpuSSE : MMX and SSE supported (but not SSE2)
18 cpuSSE2 : MMX, SSE and SSE2 supported
21 function GetCPUType: TCpuId;
22 {* Checks CPU (Intel PC x86 Architecture) for MMX support.
23 |<p><p>
25 Use following constants in shuffle commands (like "pshufw") as third operand
26 to instruct to which locations (0,1,2,3) source parts should be placed: }
27 const
28 SH0000 = $00;
29 SH0001 = $01;
30 SH0002 = $02;
31 SH0003 = $03;
32 SH0010 = $04;
33 SH0011 = $05;
34 SH0012 = $06;
35 SH0013 = $07;
36 SH0020 = $08;
37 SH0021 = $09;
38 SH0022 = $0A;
39 SH0023 = $0B;
40 SH0030 = $0C;
41 SH0031 = $0D;
42 SH0032 = $0E;
43 SH0033 = $0F;
44 SH0100 = $10;
45 SH0101 = $11;
46 SH0102 = $12;
47 SH0103 = $13;
48 SH0110 = $14;
49 SH0111 = $15;
50 SH0112 = $16;
51 SH0113 = $17;
52 SH0120 = $18;
53 SH0121 = $19;
54 SH0122 = $1A;
55 SH0123 = $1B;
56 SH0130 = $1C;
57 SH0131 = $1D;
58 SH0132 = $1E;
59 SH0133 = $1F;
60 SH0200 = $20;
61 SH0201 = $21;
62 SH0202 = $22;
63 SH0203 = $23;
64 SH0210 = $24;
65 SH0211 = $25;
66 SH0212 = $26;
67 SH0213 = $27;
68 SH0220 = $28;
69 SH0221 = $29;
70 SH0222 = $2A;
71 SH0223 = $2B;
72 SH0230 = $2C;
73 SH0231 = $2D;
74 SH0232 = $2E;
75 SH0233 = $2F;
76 SH0300 = $30;
77 SH0301 = $31;
78 SH0302 = $32;
79 SH0303 = $33;
80 SH0310 = $34;
81 SH0311 = $35;
82 SH0312 = $36;
83 SH0313 = $37;
84 SH0320 = $38;
85 SH0321 = $39;
86 SH0322 = $3A;
87 SH0323 = $3B;
88 SH0330 = $3C;
89 SH0331 = $3D;
90 SH0332 = $3E;
91 SH0333 = $3F;
92 SH1000 = $40;
93 SH1001 = $41;
94 SH1002 = $42;
95 SH1003 = $43;
96 SH1010 = $44;
97 SH1011 = $45;
98 SH1012 = $46;
99 SH1013 = $47;
100 SH1020 = $48;
101 SH1021 = $49;
102 SH1022 = $4A;
103 SH1023 = $4B;
104 SH1030 = $4C;
105 SH1031 = $4D;
106 SH1032 = $4E;
107 SH1033 = $4F;
108 SH1100 = $50;
109 SH1101 = $51;
110 SH1102 = $52;
111 SH1103 = $53;
112 SH1110 = $54;
113 SH1111 = $55;
114 SH1112 = $56;
115 SH1113 = $57;
116 SH1120 = $58;
117 SH1121 = $59;
118 SH1122 = $5A;
119 SH1123 = $5B;
120 SH1130 = $5C;
121 SH1131 = $5D;
122 SH1132 = $5E;
123 SH1133 = $5F;
124 SH1200 = $60;
125 SH1201 = $61;
126 SH1202 = $62;
127 SH1203 = $63;
128 SH1210 = $64;
129 SH1211 = $65;
130 SH1212 = $66;
131 SH1213 = $67;
132 SH1220 = $68;
133 SH1221 = $69;
134 SH1222 = $6A;
135 SH1223 = $6B;
136 SH1230 = $6C;
137 SH1231 = $6D;
138 SH1232 = $6E;
139 SH1233 = $6F;
140 SH1300 = $70;
141 SH1301 = $71;
142 SH1302 = $72;
143 SH1303 = $73;
144 SH1310 = $74;
145 SH1311 = $75;
146 SH1312 = $76;
147 SH1313 = $77;
148 SH1320 = $78;
149 SH1321 = $79;
150 SH1322 = $7A;
151 SH1323 = $7B;
152 SH1330 = $7C;
153 SH1331 = $7D;
154 SH1332 = $7E;
155 SH1333 = $7F;
156 SH2000 = $80;
157 SH2001 = $81;
158 SH2002 = $82;
159 SH2003 = $83;
160 SH2010 = $84;
161 SH2011 = $85;
162 SH2012 = $86;
163 SH2013 = $87;
164 SH2020 = $88;
165 SH2021 = $89;
166 SH2022 = $8A;
167 SH2023 = $8B;
168 SH2030 = $8C;
169 SH2031 = $8D;
170 SH2032 = $8E;
171 SH2033 = $8F;
172 SH2100 = $90;
173 SH2101 = $91;
174 SH2102 = $92;
175 SH2103 = $93;
176 SH2110 = $94;
177 SH2111 = $95;
178 SH2112 = $96;
179 SH2113 = $97;
180 SH2120 = $98;
181 SH2121 = $99;
182 SH2122 = $9A;
183 SH2123 = $9B;
184 SH2130 = $9C;
185 SH2131 = $9D;
186 SH2132 = $9E;
187 SH2133 = $9F;
188 SH2200 = $A0;
189 SH2201 = $A1;
190 SH2202 = $A2;
191 SH2203 = $A3;
192 SH2210 = $A4;
193 SH2211 = $A5;
194 SH2212 = $A6;
195 SH2213 = $A7;
196 SH2220 = $A8;
197 SH2221 = $A9;
198 SH2222 = $AA;
199 SH2223 = $AB;
200 SH2230 = $AC;
201 SH2231 = $AD;
202 SH2232 = $AE;
203 SH2233 = $AF;
204 SH2300 = $B0;
205 SH2301 = $B1;
206 SH2302 = $B2;
207 SH2303 = $B3;
208 SH2310 = $B4;
209 SH2311 = $B5;
210 SH2312 = $B6;
211 SH2313 = $B7;
212 SH2320 = $B8;
213 SH2321 = $B9;
214 SH2322 = $BA;
215 SH2323 = $BB;
216 SH2330 = $BC;
217 SH2331 = $BD;
218 SH2332 = $BE;
219 SH2333 = $BF;
220 SH3000 = $C0;
221 SH3001 = $C1;
222 SH3002 = $C2;
223 SH3003 = $C3;
224 SH3010 = $C4;
225 SH3011 = $C5;
226 SH3012 = $C6;
227 SH3013 = $C7;
228 SH3020 = $C8;
229 SH3021 = $C9;
230 SH3022 = $CA;
231 SH3023 = $CB;
232 SH3030 = $CC;
233 SH3031 = $CD;
234 SH3032 = $CE;
235 SH3033 = $CF;
236 SH3100 = $D0;
237 SH3101 = $D1;
238 SH3102 = $D2;
239 SH3103 = $D3;
240 SH3110 = $D4;
241 SH3111 = $D5;
242 SH3112 = $D6;
243 SH3113 = $D7;
244 SH3120 = $D8;
245 SH3121 = $D9;
246 SH3122 = $DA;
247 SH3123 = $DB;
248 SH3130 = $DC;
249 SH3131 = $DD;
250 SH3132 = $DE;
251 SH3133 = $DF;
252 SH3200 = $E0;
253 SH3201 = $E1;
254 SH3202 = $E2;
255 SH3203 = $E3;
256 SH3210 = $E4;
257 SH3211 = $E5;
258 SH3212 = $E6;
259 SH3213 = $E7;
260 SH3220 = $E8;
261 SH3221 = $E9;
262 SH3222 = $EA;
263 SH3223 = $EB;
264 SH3230 = $EC;
265 SH3231 = $ED;
266 SH3232 = $EE;
267 SH3233 = $EF;
268 SH3300 = $F0;
269 SH3301 = $F1;
270 SH3302 = $F2;
271 SH3303 = $F3;
272 SH3310 = $F4;
273 SH3311 = $F5;
274 SH3312 = $F6;
275 SH3313 = $F7;
276 SH3320 = $F8;
277 SH3321 = $F9;
278 SH3322 = $FA;
279 SH3323 = $FB;
280 SH3330 = $FC;
281 SH3331 = $FD;
282 SH3332 = $FE;
283 SH3333 = $FF;
285 implementation
287 function GetCPUType: TCpuId;
288 var I: Integer;
289 begin
290 Result := cpuOld486; // old 486 and earlier
291 I := 0;
292 asm // check if bit 21 of EFLAGS can be set and reset
293 PUSHFD
294 POP EAX
295 OR EAX, 1 shl 21
296 PUSH EAX
297 POPFD
298 PUSHFD
299 POP EAX
300 TEST EAX, 1 shl 21
301 JZ @@1
302 AND EAX, not( 1 shl 21 )
303 PUSH EAX
304 POPFD
305 PUSHFD
306 POP EAX
307 TEST EAX, 1 shl 21
308 JNZ @@1
309 INC [ I ]
310 @@1:
311 end;
312 if I = 0 then Exit; // CPUID not supported
313 Inc( Result ); // cpuNew486
314 asm // get CPU features flags using CPUID command
315 MOV EAX, 1
316 PUSH EDX
317 PUSH EBX
318 PUSH ECX
319 DB $0F, $A2 //CPUID : EAX, EBX, EDX and ECX are changed!!!
320 MOV [ I ], EDX // I := features information
321 POP ECX
322 POP EBX
323 POP EDX
324 end;
325 if (I and (1 shl 23)) = 0 then Exit; // MMX not supported at all
326 Inc( Result ); // MMX supported.
327 if (I and (1 shl 25)) = 0 then Exit;
328 Inc( Result ); // SSE supported.
329 if (I and (1 shl 26)) = 0 then Exit;
330 Inc( Result ); // SSE2 supported.
331 end;
333 end.