source: golgotha/src/render/glide/amd3d.h @ 80

Last change on this file since 80 was 80, checked in by Sam Hocevar, 12 years ago
  • Adding the Golgotha source code. Not sure what's going to be interesting in there, but since it's all public domain, there's certainly stuff to pick up.
  • Property svn:keywords set to Id
File size: 10.9 KB
Line 
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 * //#include "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
Note: See TracBrowser for help on using the repository browser.