1 | /***************************************************************************
|
---|
2 | *
|
---|
3 | * Copyright (c) 1997 ADVANCED MICRO DEVICES, INC. All Rights Reserved.
|
---|
4 | *
|
---|
5 | * This software is unpublished and contains the trade secrets and
|
---|
6 | * confidential proprietary information of AMD. Unless otherwise
|
---|
7 | * provided in the software Agreement associated herewith, it is
|
---|
8 | * licensed in confidence "AS IS" and is not to be reproduced in
|
---|
9 | * whole or part by any means except for backup. Use, duplication,
|
---|
10 | * or disclosure by the Government is subject to the restrictions
|
---|
11 | * in paragraph(b)(3)(B) of the Rights in Technical Data and
|
---|
12 | * Computer Software clause in DFAR 52.227-7013(a)(Oct. 1988).
|
---|
13 | * Software owned by Advanced Micro Devices Inc., One AMD Place
|
---|
14 | * P.O. Box 3453, Sunnyvale, CA 94088-3453
|
---|
15 | ***************************************************************************
|
---|
16 | *
|
---|
17 | * AMD3D.H
|
---|
18 | *
|
---|
19 | * MACRO FORMAT
|
---|
20 | * ============
|
---|
21 | * This file contains inline assembly macros that
|
---|
22 | * generate AMD-3D instructions in binary format.
|
---|
23 | * Therefore, C or C++ programmer can use AMD-3D instructions
|
---|
24 | * without any penalty in their C or C++ source code.
|
---|
25 | *
|
---|
26 | * The macro's name and format conventions are as follow:
|
---|
27 | *
|
---|
28 | *
|
---|
29 | * 1. First argument of macro is a destination and
|
---|
30 | * second argument is a source operand.
|
---|
31 | * ex) _asm PFCMPEQ (m3, m4)
|
---|
32 | * | |
|
---|
33 | * dst src
|
---|
34 | *
|
---|
35 | * 2. The destination operand can be m0 to m7 only.
|
---|
36 | * The source operand can be any one of the register
|
---|
37 | * m0 to m7 or _eax, _ecx, _edx, _ebx, _esi, or _edi
|
---|
38 | * that contains effective address.
|
---|
39 | * ex) _asm PFRCP (M7, M6)
|
---|
40 | * ex) _asm PFRCPIT2 (m0, m4)
|
---|
41 | * ex) _asm PFMUL (m3, _edi)
|
---|
42 | *
|
---|
43 | * 3. The prefetch(w) takes one src operand _eax, ecx, _edx,
|
---|
44 | * _ebx, _esi, or _edi that contains effective address.
|
---|
45 | * ex) _asm PREFETCH (_edi)
|
---|
46 | *
|
---|
47 | * EXAMPLE
|
---|
48 | * =======
|
---|
49 | * Following program doesn't do anything but it shows you
|
---|
50 | * how to use inline assembly AMD-3D instructions in C.
|
---|
51 | * Note that this will only work in flat memory model which
|
---|
52 | * segment registers cs, ds, ss and es point to the same
|
---|
53 | * linear address space total less than 4GB.
|
---|
54 | *
|
---|
55 | * Used Microsoft VC++ 5.0
|
---|
56 | *
|
---|
57 | * //#include <stdio.h>
|
---|
58 | * //# i n c l u d e "amd3d.h"
|
---|
59 | *
|
---|
60 | * void main ()
|
---|
61 | * {
|
---|
62 | * float x = (float)1.25;
|
---|
63 | * float y = (float)1.25;
|
---|
64 | * float z, zz;
|
---|
65 | *
|
---|
66 | * _asm {
|
---|
67 | * movd mm1, x
|
---|
68 | * movd mm2, y
|
---|
69 | * pfmul (m1, m2)
|
---|
70 | * movd z, mm1
|
---|
71 | * femms
|
---|
72 | * }
|
---|
73 | *
|
---|
74 | * printf ("value of z = %f\n", z);
|
---|
75 | *
|
---|
76 | * //
|
---|
77 | * // Demonstration of using the memory instead of
|
---|
78 | * // multimedia register
|
---|
79 | * //
|
---|
80 | * _asm {
|
---|
81 | * movd mm3, x
|
---|
82 | * lea esi, y // load effective address of y
|
---|
83 | * pfmul (m3, _esi)
|
---|
84 | * movd zz, mm3
|
---|
85 | * femms
|
---|
86 | * }
|
---|
87 | *
|
---|
88 | * printf ("value of zz = %f\n", zz);
|
---|
89 | * }
|
---|
90 | ***************************************************************************/
|
---|
91 | #define M0 0xc0
|
---|
92 | #define M1 0xc1
|
---|
93 | #define M2 0xc2
|
---|
94 | #define M3 0xc3
|
---|
95 | #define M4 0xc4
|
---|
96 | #define M5 0xc5
|
---|
97 | #define M6 0xc6
|
---|
98 | #define M7 0xc7
|
---|
99 |
|
---|
100 | #define m0 0xc0
|
---|
101 | #define m1 0xc1
|
---|
102 | #define m2 0xc2
|
---|
103 | #define m3 0xc3
|
---|
104 | #define m4 0xc4
|
---|
105 | #define m5 0xc5
|
---|
106 | #define m6 0xc6
|
---|
107 | #define m7 0xc7
|
---|
108 | #define _EAX 0x00
|
---|
109 | #define _ECX 0x01
|
---|
110 | #define _EDX 0x02
|
---|
111 | #define _EBX 0x03
|
---|
112 | #define _ESI 0x06
|
---|
113 | #define _EDI 0x07
|
---|
114 | #define _eax 0x00
|
---|
115 | #define _ecx 0x01
|
---|
116 | #define _edx 0x02
|
---|
117 | #define _ebx 0x03
|
---|
118 | #define _esi 0x06
|
---|
119 | #define _edi 0x07
|
---|
120 |
|
---|
121 | #define PF2ID(dst, src) \
|
---|
122 | {\
|
---|
123 | _asm _emit 0x0f \
|
---|
124 | _asm _emit 0x0f \
|
---|
125 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
126 | _asm _emit 0x1d \
|
---|
127 | }
|
---|
128 |
|
---|
129 | #define PF2IW(dst, src) \
|
---|
130 | {\
|
---|
131 | _asm _emit 0x0f \
|
---|
132 | _asm _emit 0x0f \
|
---|
133 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
134 | _asm _emit 0x1c \
|
---|
135 | }
|
---|
136 |
|
---|
137 | #define PFACC(dst, src) \
|
---|
138 | {\
|
---|
139 | _asm _emit 0x0f \
|
---|
140 | _asm _emit 0x0f \
|
---|
141 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
142 | _asm _emit 0xae \
|
---|
143 | }
|
---|
144 |
|
---|
145 | #define PFADD(dst, src) \
|
---|
146 | {\
|
---|
147 | _asm _emit 0x0f \
|
---|
148 | _asm _emit 0x0f \
|
---|
149 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
150 | _asm _emit 0x9e \
|
---|
151 | }
|
---|
152 |
|
---|
153 | #define PFCMPEQ(dst, src) \
|
---|
154 | {\
|
---|
155 | _asm _emit 0x0f \
|
---|
156 | _asm _emit 0x0f \
|
---|
157 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
158 | _asm _emit 0xb0 \
|
---|
159 | }
|
---|
160 |
|
---|
161 | #define PFCMPGE(dst, src) \
|
---|
162 | {\
|
---|
163 | _asm _emit 0x0f \
|
---|
164 | _asm _emit 0x0f \
|
---|
165 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
166 | _asm _emit 0x90 \
|
---|
167 | }
|
---|
168 |
|
---|
169 | #define PFCMPGT(dst, src) \
|
---|
170 | {\
|
---|
171 | _asm _emit 0x0f \
|
---|
172 | _asm _emit 0x0f \
|
---|
173 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
174 | _asm _emit 0xa0 \
|
---|
175 | }
|
---|
176 |
|
---|
177 | #define PFMAX(dst, src) \
|
---|
178 | {\
|
---|
179 | _asm _emit 0x0f \
|
---|
180 | _asm _emit 0x0f \
|
---|
181 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
182 | _asm _emit 0xa4 \
|
---|
183 | }
|
---|
184 |
|
---|
185 | #define PFMIN(dst, src) \
|
---|
186 | {\
|
---|
187 | _asm _emit 0x0f \
|
---|
188 | _asm _emit 0x0f \
|
---|
189 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
190 | _asm _emit 0x94 \
|
---|
191 | }
|
---|
192 |
|
---|
193 | #define PFMUL(dst, src) \
|
---|
194 | {\
|
---|
195 | _asm _emit 0x0f \
|
---|
196 | _asm _emit 0x0f \
|
---|
197 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
198 | _asm _emit 0xb4 \
|
---|
199 | }
|
---|
200 |
|
---|
201 | #define PFRCP(dst, src) \
|
---|
202 | {\
|
---|
203 | _asm _emit 0x0f \
|
---|
204 | _asm _emit 0x0f \
|
---|
205 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
206 | _asm _emit 0x96 \
|
---|
207 | }
|
---|
208 |
|
---|
209 | #define PFRCPIT1(dst, src) \
|
---|
210 | {\
|
---|
211 | _asm _emit 0x0f \
|
---|
212 | _asm _emit 0x0f \
|
---|
213 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
214 | _asm _emit 0xa6 \
|
---|
215 | }
|
---|
216 |
|
---|
217 | #define PFRCPIT2(dst, src) \
|
---|
218 | {\
|
---|
219 | _asm _emit 0x0f \
|
---|
220 | _asm _emit 0x0f \
|
---|
221 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
222 | _asm _emit 0xb6 \
|
---|
223 | }
|
---|
224 |
|
---|
225 | #define PFRSQRT(dst, src) \
|
---|
226 | {\
|
---|
227 | _asm _emit 0x0f \
|
---|
228 | _asm _emit 0x0f \
|
---|
229 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
230 | _asm _emit 0x97 \
|
---|
231 | }
|
---|
232 |
|
---|
233 | #define PFRSQIT1(dst, src) \
|
---|
234 | {\
|
---|
235 | _asm _emit 0x0f \
|
---|
236 | _asm _emit 0x0f \
|
---|
237 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
238 | _asm _emit 0xa7 \
|
---|
239 | }
|
---|
240 |
|
---|
241 | #define PFSUB(dst, src) \
|
---|
242 | {\
|
---|
243 | _asm _emit 0x0f \
|
---|
244 | _asm _emit 0x0f \
|
---|
245 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
246 | _asm _emit 0x9a \
|
---|
247 | }
|
---|
248 |
|
---|
249 | #define PFSUBR(dst, src) \
|
---|
250 | {\
|
---|
251 | _asm _emit 0x0f \
|
---|
252 | _asm _emit 0x0f \
|
---|
253 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
254 | _asm _emit 0xaa \
|
---|
255 | }
|
---|
256 |
|
---|
257 | #define PI2FD(dst, src) \
|
---|
258 | {\
|
---|
259 | _asm _emit 0x0f \
|
---|
260 | _asm _emit 0x0f \
|
---|
261 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
262 | _asm _emit 0x0d \
|
---|
263 | }
|
---|
264 |
|
---|
265 | #define PI2FW(dst, src) \
|
---|
266 | {\
|
---|
267 | _asm _emit 0x0f \
|
---|
268 | _asm _emit 0x0f \
|
---|
269 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
270 | _asm _emit 0x0c \
|
---|
271 | }
|
---|
272 |
|
---|
273 | #define FEMMS \
|
---|
274 | {\
|
---|
275 | _asm _emit 0x0f \
|
---|
276 | _asm _emit 0x0e \
|
---|
277 | }
|
---|
278 |
|
---|
279 | #define PAVGUSB(dst, src) \
|
---|
280 | {\
|
---|
281 | _asm _emit 0x0f \
|
---|
282 | _asm _emit 0x0f \
|
---|
283 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
284 | _asm _emit 0xbf \
|
---|
285 | }
|
---|
286 |
|
---|
287 | #define PMULHRW(dst, src) \
|
---|
288 | {\
|
---|
289 | _asm _emit 0x0f \
|
---|
290 | _asm _emit 0x0f \
|
---|
291 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
292 | _asm _emit 0xb7 \
|
---|
293 | }
|
---|
294 |
|
---|
295 | #define PREFETCH(src) \
|
---|
296 | {\
|
---|
297 | _asm _emit 0x0f \
|
---|
298 | _asm _emit 0x0d \
|
---|
299 | _asm _emit 0x00 | src \
|
---|
300 | }
|
---|
301 |
|
---|
302 | #define PREFETCHW(src) \
|
---|
303 | {\
|
---|
304 | _asm _emit 0x0f \
|
---|
305 | _asm _emit 0x0d \
|
---|
306 | _asm _emit 0x08 | src \
|
---|
307 | }
|
---|
308 |
|
---|
309 | #define PSWAPW(dst, src) \
|
---|
310 | {\
|
---|
311 | _asm _emit 0x0f \
|
---|
312 | _asm _emit 0x0f \
|
---|
313 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
314 | _asm _emit 0xbb \
|
---|
315 | }
|
---|
316 |
|
---|
317 | //
|
---|
318 | // Exactly same as above except macro names are all
|
---|
319 | // lower case latter.
|
---|
320 | //
|
---|
321 | #define pf2id(dst, src) \
|
---|
322 | {\
|
---|
323 | _asm _emit 0x0f \
|
---|
324 | _asm _emit 0x0f \
|
---|
325 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
326 | _asm _emit 0x1d \
|
---|
327 | }
|
---|
328 |
|
---|
329 | #define pf2iw(dst, src) \
|
---|
330 | {\
|
---|
331 | _asm _emit 0x0f \
|
---|
332 | _asm _emit 0x0f \
|
---|
333 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
334 | _asm _emit 0x1c \
|
---|
335 | }
|
---|
336 |
|
---|
337 | #define pfacc(dst, src) \
|
---|
338 | {\
|
---|
339 | _asm _emit 0x0f \
|
---|
340 | _asm _emit 0x0f \
|
---|
341 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
342 | _asm _emit 0xae \
|
---|
343 | }
|
---|
344 |
|
---|
345 | #define pfadd(dst, src) \
|
---|
346 | {\
|
---|
347 | _asm _emit 0x0f \
|
---|
348 | _asm _emit 0x0f \
|
---|
349 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
350 | _asm _emit 0x9e \
|
---|
351 | }
|
---|
352 |
|
---|
353 | #define pfcmpeq(dst, src) \
|
---|
354 | {\
|
---|
355 | _asm _emit 0x0f \
|
---|
356 | _asm _emit 0x0f \
|
---|
357 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
358 | _asm _emit 0xb0 \
|
---|
359 | }
|
---|
360 |
|
---|
361 | #define pfcmpge(dst, src) \
|
---|
362 | {\
|
---|
363 | _asm _emit 0x0f \
|
---|
364 | _asm _emit 0x0f \
|
---|
365 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
366 | _asm _emit 0x90 \
|
---|
367 | }
|
---|
368 |
|
---|
369 | #define pfcmpgt(dst, src) \
|
---|
370 | {\
|
---|
371 | _asm _emit 0x0f \
|
---|
372 | _asm _emit 0x0f \
|
---|
373 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
374 | _asm _emit 0xa0 \
|
---|
375 | }
|
---|
376 |
|
---|
377 | #define pfmax(dst, src) \
|
---|
378 | {\
|
---|
379 | _asm _emit 0x0f \
|
---|
380 | _asm _emit 0x0f \
|
---|
381 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
382 | _asm _emit 0xa4 \
|
---|
383 | }
|
---|
384 |
|
---|
385 | #define pfmin(dst, src) \
|
---|
386 | {\
|
---|
387 | _asm _emit 0x0f \
|
---|
388 | _asm _emit 0x0f \
|
---|
389 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
390 | _asm _emit 0x94 \
|
---|
391 | }
|
---|
392 |
|
---|
393 | #define pfmul(dst, src) \
|
---|
394 | {\
|
---|
395 | _asm _emit 0x0f \
|
---|
396 | _asm _emit 0x0f \
|
---|
397 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
398 | _asm _emit 0xb4 \
|
---|
399 | }
|
---|
400 |
|
---|
401 | #define pfrcp(dst, src) \
|
---|
402 | {\
|
---|
403 | _asm _emit 0x0f \
|
---|
404 | _asm _emit 0x0f \
|
---|
405 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
406 | _asm _emit 0x96 \
|
---|
407 | }
|
---|
408 |
|
---|
409 | #define pfrcpit1(dst, src) \
|
---|
410 | {\
|
---|
411 | _asm _emit 0x0f \
|
---|
412 | _asm _emit 0x0f \
|
---|
413 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
414 | _asm _emit 0xa6 \
|
---|
415 | }
|
---|
416 |
|
---|
417 | #define pfrcpit2(dst, src) \
|
---|
418 | {\
|
---|
419 | _asm _emit 0x0f \
|
---|
420 | _asm _emit 0x0f \
|
---|
421 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
422 | _asm _emit 0xb6 \
|
---|
423 | }
|
---|
424 |
|
---|
425 | #define pfrsqrt(dst, src) \
|
---|
426 | {\
|
---|
427 | _asm _emit 0x0f \
|
---|
428 | _asm _emit 0x0f \
|
---|
429 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
430 | _asm _emit 0x97 \
|
---|
431 | }
|
---|
432 |
|
---|
433 | #define pfrsqit1(dst, src) \
|
---|
434 | {\
|
---|
435 | _asm _emit 0x0f \
|
---|
436 | _asm _emit 0x0f \
|
---|
437 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
438 | _asm _emit 0xa7 \
|
---|
439 | }
|
---|
440 |
|
---|
441 | #define pfsub(dst, src) \
|
---|
442 | {\
|
---|
443 | _asm _emit 0x0f \
|
---|
444 | _asm _emit 0x0f \
|
---|
445 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
446 | _asm _emit 0x9a \
|
---|
447 | }
|
---|
448 |
|
---|
449 | #define pfsubr(dst, src) \
|
---|
450 | {\
|
---|
451 | _asm _emit 0x0f \
|
---|
452 | _asm _emit 0x0f \
|
---|
453 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
454 | _asm _emit 0xaa \
|
---|
455 | }
|
---|
456 |
|
---|
457 | #define pi2fd(dst, src) \
|
---|
458 | {\
|
---|
459 | _asm _emit 0x0f \
|
---|
460 | _asm _emit 0x0f \
|
---|
461 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
462 | _asm _emit 0x0d \
|
---|
463 | }
|
---|
464 |
|
---|
465 | #define pi2fw(dst, src) \
|
---|
466 | {\
|
---|
467 | _asm _emit 0x0f \
|
---|
468 | _asm _emit 0x0f \
|
---|
469 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
470 | _asm _emit 0x0c \
|
---|
471 | }
|
---|
472 |
|
---|
473 | #define femms \
|
---|
474 | {\
|
---|
475 | _asm _emit 0x0f \
|
---|
476 | _asm _emit 0x0e \
|
---|
477 | }
|
---|
478 |
|
---|
479 | #define pavgusb(dst, src) \
|
---|
480 | {\
|
---|
481 | _asm _emit 0x0f \
|
---|
482 | _asm _emit 0x0f \
|
---|
483 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
484 | _asm _emit 0xbf \
|
---|
485 | }
|
---|
486 |
|
---|
487 | #define pmulhrw(dst, src) \
|
---|
488 | {\
|
---|
489 | _asm _emit 0x0f \
|
---|
490 | _asm _emit 0x0f \
|
---|
491 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
492 | _asm _emit 0xb7 \
|
---|
493 | }
|
---|
494 |
|
---|
495 | #define prefetch(src) \
|
---|
496 | {\
|
---|
497 | _asm _emit 0x0f \
|
---|
498 | _asm _emit 0x0d \
|
---|
499 | _asm _emit 0x00 | src \
|
---|
500 | }
|
---|
501 |
|
---|
502 | #define prefetchw(src) \
|
---|
503 | {\
|
---|
504 | _asm _emit 0x0f \
|
---|
505 | _asm _emit 0x0d \
|
---|
506 | _asm _emit 0x08 | src \
|
---|
507 | }
|
---|
508 |
|
---|
509 | #define pswapw(dst, src) \
|
---|
510 | {\
|
---|
511 | _asm _emit 0x0f \
|
---|
512 | _asm _emit 0x0f \
|
---|
513 | _asm _emit ((dst & 0x3f) << 3) | src \
|
---|
514 | _asm _emit 0xbb \
|
---|
515 | }
|
---|
516 |
|
---|