revert 213 commits (to 56092) from the last month. 10 still need work to resolve...
[AROS.git] / workbench / libs / mesa / src / mesa / x86 / 3dnow_xform2.S
blob2988fb7bfd3d21f876d2b6bd889d0cfbcea34dcb
2 /*
3  * Mesa 3-D graphics library
4  * Version:  3.5
5  *
6  * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a
9  * copy of this software and associated documentation files (the "Software"),
10  * to deal in the Software without restriction, including without limitation
11  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12  * and/or sell copies of the Software, and to permit persons to whom the
13  * Software is furnished to do so, subject to the following conditions:
14  *
15  * The above copyright notice and this permission notice shall be included
16  * in all copies or substantial portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24  */
26 #ifdef USE_3DNOW_ASM
27 #include "assyntax.h"
28 #include "matypes.h"
29 #include "xform_args.h"
31     SEG_TEXT
33 #define FRAME_OFFSET    4
36 ALIGNTEXT16
37 GLOBL GLNAME( _mesa_3dnow_transform_points2_general )
38 HIDDEN(_mesa_3dnow_transform_points2_general)
39 GLNAME( _mesa_3dnow_transform_points2_general ):
41     PUSH_L    ( ESI )
43     MOV_L     ( ARG_DEST, ECX )
44     MOV_L     ( ARG_MATRIX, ESI )
45     MOV_L     ( ARG_SOURCE, EAX )
46     MOV_L     ( CONST(4), REGOFF(V4F_SIZE, ECX) )
47     OR_B      ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) )
48     MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
49     MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
51     PUSH_L    ( EDI )
53     MOV_L     ( REGOFF(V4F_START, ECX), EDX )
54     MOV_L     ( ESI, ECX )
55     MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
56     MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
57     MOV_L     ( REGOFF(V4F_START, EAX), EAX )
59     TEST_L    ( ESI, ESI )
60     JZ        ( LLBL( G3TPGR_3 ) )
62     MOVD      ( REGIND(ECX), MM0 )      /*                 | m00             */
63     PUNPCKLDQ ( REGOFF(16, ECX), MM0 )  /* m10             | m00             */
65     MOVD      ( REGOFF(4, ECX), MM1 )   /*                 | m01             */
66     PUNPCKLDQ ( REGOFF(20, ECX), MM1 )  /* m11             | m01             */
68     MOVD      ( REGOFF(8, ECX), MM2 )   /*                 | m02             */
69     PUNPCKLDQ ( REGOFF(24, ECX), MM2 )  /* m12             | m02             */
71     MOVD      ( REGOFF(12, ECX), MM3 )  /*                 | m03             */
72     PUNPCKLDQ ( REGOFF(28, ECX), MM3 )  /* m13             | m03             */
74     MOVQ      ( REGOFF(48, ECX), MM4 )  /* m31             | m30             */
75     MOVQ      ( REGOFF(56, ECX), MM5 )  /* m33             | m32             */
77 ALIGNTEXT16
78 LLBL( G3TPGR_2 ):
80     MOVQ      ( REGIND(EAX), MM6 )      /* x1              | x0              */
81     MOVQ      ( MM6, MM7 )              /* x1              | x0              */
83     PFMUL     ( MM0, MM6 )              /* x1*m10          | x0*m00          */
84     PFMUL     ( MM1, MM7 )              /* x1*m11          | x0*m01          */
86     PFACC     ( MM7, MM6 )              /* x0*m01+x1*m11   | x0*x00+x1*m10   */
87     PFADD     ( MM4, MM6 )              /* x0*...*m11+m31  | x0*...*m10+m30  */
89     MOVQ      ( MM6, REGIND(EDX) )      /* write r1, r0                      */
90     MOVQ      ( REGIND(EAX), MM6 )      /* x1              | x0              */
92     MOVQ      ( MM6, MM7 )              /* x1              | x0              */
93     PFMUL     ( MM2, MM6 )              /* x1*m12          | x0*m02          */
95     PFMUL     ( MM3, MM7 )              /* x1*m13          | x0*m03          */
96     ADD_L     ( EDI, EAX )              /* next vertex                       */
98     PFACC     ( MM7, MM6 )              /* x0*m03+x1*m13   | x0*x02+x1*m12   */
99     PFADD     ( MM5, MM6 )              /* x0*...*m13+m33  | x0*...*m12+m32  */
101     MOVQ      ( MM6, REGOFF(8, EDX) )   /* write r3, r2                      */
102     ADD_L     ( CONST(16), EDX )        /* next r                            */
104     DEC_L     ( ESI )                   /* decrement vertex counter          */
105     JNZ       ( LLBL( G3TPGR_2 ) )      /* cnt > 0 ? -> process next vertex  */
107 LLBL( G3TPGR_3 ):
109     FEMMS
110     POP_L     ( EDI )
111     POP_L     ( ESI )
112     RET
117 ALIGNTEXT16
118 GLOBL GLNAME( _mesa_3dnow_transform_points2_perspective )
119 HIDDEN(_mesa_3dnow_transform_points2_perspective)
120 GLNAME( _mesa_3dnow_transform_points2_perspective ):
122     PUSH_L    ( ESI )
124     MOV_L     ( ARG_DEST, ECX )
125     MOV_L     ( ARG_MATRIX, ESI )
126     MOV_L     ( ARG_SOURCE, EAX )
127     MOV_L     ( CONST(4), REGOFF(V4F_SIZE, ECX) )
128     OR_B      ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) )
129     MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
130     MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
132     PUSH_L    ( EDI )
134     MOV_L     ( REGOFF(V4F_START, ECX), EDX )
135     MOV_L     ( ESI, ECX )
136     MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
137     MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
138     MOV_L     ( REGOFF(V4F_START, EAX), EAX )
140     TEST_L    ( ESI, ESI )
141     JZ        ( LLBL( G3TPPR_3 ) )
143     MOVD      ( REGIND(ECX), MM0 )      /*                 | m00             */
144     PUNPCKLDQ ( REGOFF(20, ECX), MM0 )  /* m11             | m00             */
146     MOVD      ( REGOFF(56, ECX), MM3 )  /*                 | m32             */
148 ALIGNTEXT16
149 LLBL( G3TPPR_2 ):
151     MOVQ      ( REGIND(EAX), MM4 )      /* x1              | x0              */
152     PFMUL     ( MM0, MM4 )              /* x1*m11          | x0*m00          */
154     MOVQ      ( MM4, REGIND(EDX) )      /* write r1, r0                      */
155     MOVQ      ( MM3, REGOFF(8, EDX) )   /* write r2  (=m32), r3 (=0)         */
157     ADD_L     ( EDI, EAX )              /* next vertex                       */
158     ADD_L     ( CONST(16), EDX )        /* next r                            */
160     DEC_L     ( ESI )                   /* decrement vertex counter          */
161     JNZ       ( LLBL( G3TPPR_2 ) )      /* cnt > 0 ? -> process next vertex  */
163 LLBL( G3TPPR_3 ):
165     FEMMS
166     POP_L     ( EDI )
167     POP_L     ( ESI )
168     RET
173 ALIGNTEXT16
174 GLOBL GLNAME( _mesa_3dnow_transform_points2_3d )
175 HIDDEN(_mesa_3dnow_transform_points2_3d)
176 GLNAME( _mesa_3dnow_transform_points2_3d ):
178     PUSH_L    ( ESI )
180     MOV_L     ( ARG_DEST, ECX )
181     MOV_L     ( ARG_MATRIX, ESI )
182     MOV_L     ( ARG_SOURCE, EAX )
183     MOV_L     ( CONST(3), REGOFF(V4F_SIZE, ECX) )
184     OR_B      ( CONST(VEC_SIZE_3 ), REGOFF(V4F_FLAGS, ECX) )
185     MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
186     MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
188     PUSH_L    ( EDI )
190     MOV_L     ( REGOFF(V4F_START, ECX), EDX )
191     MOV_L     ( ESI, ECX )
192     MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
193     MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
194     MOV_L     ( REGOFF(V4F_START, EAX), EAX )
196     TEST_L    ( ESI, ESI )
197     JZ        ( LLBL( G3TP3R_3 ) )
199     MOVD      ( REGIND(ECX), MM0 )      /*                 | m00             */
200     PUNPCKLDQ ( REGOFF(16, ECX), MM0 )  /* m10             | m00             */
202     MOVD      ( REGOFF(4, ECX), MM1 )   /*                 | m01             */
203     PUNPCKLDQ ( REGOFF(20, ECX), MM1 )  /* m11             | m01             */
205     MOVD      ( REGOFF(8, ECX), MM2 )   /*                 | m02             */
206     PUNPCKLDQ ( REGOFF(24, ECX), MM2 )  /* m12             | m02             */
208     MOVQ      ( REGOFF(48, ECX), MM4 )  /* m31             | m30             */
209     MOVD      ( REGOFF(56, ECX), MM5 )  /*                 | m32             */
211 ALIGNTEXT16
212 LLBL( G3TP3R_2 ):
214     MOVQ      ( REGIND(EAX), MM6 )      /* x1              | x0              */
215     MOVQ      ( MM6, MM7 )              /* x1              | x0              */
217     PFMUL     ( MM0, MM6 )              /* x1*m10          | x0*m00          */
218     PFMUL     ( MM1, MM7 )              /* x1*m11          | x0*m01          */
220     PFACC     ( MM7, MM6 )              /* x0*m01+x1*m11   | x0*x00+x1*m10   */
221     PFADD     ( MM4, MM6 )              /* x0*...*m11+m31  | x0*...*m10+m30  */
223     MOVQ      ( MM6, REGIND(EDX) )      /* write r1, r0                      */
224     MOVQ      ( REGIND(EAX), MM6 )      /* x1              | x0              */
226     MOVQ      ( MM6, MM7 )              /* x1              | x0              */
227     PFMUL     ( MM2, MM6 )              /* x1*m12          | x0*m02          */
229     PFACC     ( MM7, MM6 )              /* ***trash***     | x0*x02+x1*m12   */
230     PFADD     ( MM5, MM6 )              /* ***trash***     | x0*...*m12+m32  */
232     MOVD      ( MM6, REGOFF(8, EDX) )   /* write r2                          */
233     ADD_L     ( EDI, EAX )              /* next vertex                       */
235     ADD_L     ( CONST(16), EDX )        /* next r                            */
236     DEC_L     ( ESI )                   /* decrement vertex counter          */
238     JNZ       ( LLBL( G3TP3R_2 ) )      /* cnt > 0 ? -> process next vertex  */
240 LLBL( G3TP3R_3 ):
242     FEMMS
243     POP_L     ( EDI )
244     POP_L     ( ESI )
245     RET
250 ALIGNTEXT16
251 GLOBL GLNAME( _mesa_3dnow_transform_points2_3d_no_rot )
252 HIDDEN(_mesa_3dnow_transform_points2_3d_no_rot)
253 GLNAME( _mesa_3dnow_transform_points2_3d_no_rot ):
255     PUSH_L    ( ESI )
257     MOV_L     ( ARG_DEST, ECX )
258     MOV_L     ( ARG_MATRIX, ESI )
259     MOV_L     ( ARG_SOURCE, EAX )
260     MOV_L     ( CONST(3), REGOFF(V4F_SIZE, ECX) )
261     OR_B      ( CONST(VEC_SIZE_3 ), REGOFF(V4F_FLAGS, ECX) )
262     MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
263     MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
265     PUSH_L    ( EDI )
267     MOV_L     ( REGOFF(V4F_START, ECX), EDX )
268     MOV_L     ( ESI, ECX )
269     MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
270     MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
271     MOV_L     ( REGOFF(V4F_START, EAX), EAX )
273     TEST_L    ( ESI, ESI )
274     JZ        ( LLBL( G3TP3NRR_3 ) )
276     MOVD      ( REGIND(ECX), MM0 )      /*                 | m00             */
277     PUNPCKLDQ ( REGOFF(20, ECX), MM0 )  /* m11             | m00             */
279     MOVQ      ( REGOFF(48, ECX), MM2 )  /* m31             | m30             */
280     MOVD      ( REGOFF(56, ECX), MM3 )  /*                 | m32             */
282 ALIGNTEXT16
283 LLBL( G3TP3NRR_2 ):
285     MOVQ      ( REGIND(EAX), MM4 )      /* x1              | x0              */
286     PFMUL     ( MM0, MM4 )              /* x1*m11          | x0*m00          */
288     PFADD     ( MM2, MM4 )              /* x1*m11+m31      | x0*m00+m30      */
289     MOVQ      ( MM4, REGIND(EDX) )      /* write r1, r0                      */
291     MOVD      ( MM3, REGOFF(8, EDX) )   /* write r2                          */
292     ADD_L     ( EDI, EAX )              /* next vertex                       */
294     ADD_L     ( CONST(16), EDX )        /* next r                            */
295     DEC_L     ( ESI )                   /* decrement vertex counter          */
297     JNZ       ( LLBL( G3TP3NRR_2 ) )    /* cnt > 0 ? -> process next vertex  */
299 LLBL( G3TP3NRR_3 ):
301     FEMMS
302     POP_L     ( EDI )
303     POP_L     ( ESI )
304     RET
309 ALIGNTEXT16
310 GLOBL GLNAME( _mesa_3dnow_transform_points2_2d )
311 HIDDEN(_mesa_3dnow_transform_points2_2d)
312 GLNAME( _mesa_3dnow_transform_points2_2d ):
314     PUSH_L    ( ESI )
316     MOV_L     ( ARG_DEST, ECX )
317     MOV_L     ( ARG_MATRIX, ESI )
318     MOV_L     ( ARG_SOURCE, EAX )
319     MOV_L     ( CONST(2), REGOFF(V4F_SIZE, ECX) )
320     OR_B      ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) )
321     MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
322     MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
324     PUSH_L    ( EDI )
326     MOV_L     ( REGOFF(V4F_START, ECX), EDX )
327     MOV_L     ( ESI, ECX )
328     MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
329     MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
330     MOV_L     ( REGOFF(V4F_START, EAX), EAX )
332     TEST_L    ( ESI, ESI )
333     JZ        ( LLBL( G3TP2R_3 ) )
335     MOVQ      ( REGIND(ECX), MM0 )      /* m01             | m00             */
336     MOVQ      ( REGOFF(16, ECX), MM1 )  /* m11             | m10             */
338     MOVQ      ( REGOFF(48, ECX), MM2 )  /* m31             | m30             */
340 ALIGNTEXT16
341 LLBL( G3TP2R_2 ):
343     MOVD      ( REGIND(EAX), MM4 )      /*                 | x0              */
344     MOVD      ( REGOFF(4, EAX), MM5 )   /*                 | x1              */
346     PUNPCKLDQ ( MM4, MM4 )              /* x0              | x0              */
347     ADD_L     ( EDI, EAX )              /* next vertex                       */
349     PFMUL     ( MM0, MM4 )              /* x0*m01          | x0*m00          */
350     PUNPCKLDQ ( MM5, MM5 )              /* x1              | x1              */
352     PFMUL     ( MM1, MM5 )              /* x1*m11          | x1*m10          */
353     PFADD     ( MM2, MM4 )              /* x...x1*m11+31   | x0*..*m10+m30   */
355     PFADD     ( MM5, MM4 )              /* x0*m01+x1*m11   | x0*m00+x1*m10   */
356     MOVQ      ( MM4, REGIND(EDX) )      /* write r1, r0                      */
358     ADD_L     ( CONST(16), EDX )        /* next r                            */
359     DEC_L     ( ESI )                   /* decrement vertex counter          */
361     JNZ       ( LLBL( G3TP2R_2 ) )      /* cnt > 0 ? -> process next vertex  */
363 LLBL( G3TP2R_3 ):
365     FEMMS
366     POP_L     ( EDI )
367     POP_L     ( ESI )
368     RET
373 ALIGNTEXT16
374 GLOBL GLNAME( _mesa_3dnow_transform_points2_2d_no_rot )
375 HIDDEN(_mesa_3dnow_transform_points2_2d_no_rot)
376 GLNAME( _mesa_3dnow_transform_points2_2d_no_rot ):
378     PUSH_L    ( ESI )
380     MOV_L     ( ARG_DEST, ECX )
381     MOV_L     ( ARG_MATRIX, ESI )
382     MOV_L     ( ARG_SOURCE, EAX )
383     MOV_L     ( CONST(2), REGOFF(V4F_SIZE, ECX) )
384     OR_B      ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) )
385     MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
386     MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
388     PUSH_L    ( EDI )
390     MOV_L     ( REGOFF(V4F_START, ECX), EDX )
391     MOV_L     ( ESI, ECX )
392     MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
393     MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
394     MOV_L     ( REGOFF(V4F_START, EAX), EAX )
396     TEST_L    ( ESI, ESI )
397     JZ        ( LLBL( G3TP2NRR_3 ) )
399     MOVD      ( REGIND(ECX), MM0 )      /*                 | m00             */
400     PUNPCKLDQ ( REGOFF(20, ECX), MM0 )  /* m11             | m00             */
402     MOVQ      ( REGOFF(48, ECX), MM2 )  /* m31             | m30             */
404 ALIGNTEXT16
405 LLBL( G3TP2NRR_2 ):
407     MOVQ      ( REGIND(EAX), MM4 )      /* x1              | x0              */
408     ADD_L     ( EDI, EAX )              /* next vertex                       */
410     PFMUL     ( MM0, MM4 )              /* x1*m11          | x0*m00          */
411     PFADD     ( MM2, MM4 )              /* m31             | x0*m00+m30      */
413     MOVQ      ( MM4, REGIND(EDX) )      /* write r1, r0                      */
414     ADD_L     ( CONST(16), EDX )        /* next r                            */
416     DEC_L     ( ESI )                   /* decrement vertex counter          */
417     JNZ       ( LLBL( G3TP2NRR_2 ) )    /* cnt > 0 ? -> process next vertex  */
419 LLBL( G3TP2NRR_3 ):
421     FEMMS
422     POP_L     ( EDI )
423     POP_L     ( ESI )
424     RET
429 ALIGNTEXT16
430 GLOBL GLNAME( _mesa_3dnow_transform_points2_identity )
431 HIDDEN(_mesa_3dnow_transform_points2_identity)
432 GLNAME( _mesa_3dnow_transform_points2_identity ):
434     PUSH_L    ( ESI )
436     MOV_L     ( ARG_DEST, ECX )
437     MOV_L     ( ARG_MATRIX, ESI )
438     MOV_L     ( ARG_SOURCE, EAX )
439     MOV_L     ( CONST(2), REGOFF(V4F_SIZE, ECX) )
440     OR_B      ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) )
441     MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
442     MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
444     PUSH_L    ( EDI )
446     MOV_L     ( REGOFF(V4F_START, ECX), EDX )
447     MOV_L     ( ESI, ECX )
448     MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
449     MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
450     MOV_L     ( REGOFF(V4F_START, EAX), EAX )
452     TEST_L    ( ESI, ESI )
453     JZ        ( LLBL( G3TPIR_3 ) )
455 ALIGNTEXT16
456 LLBL( G3TPIR_3 ):
458     MOVQ      ( REGIND(EAX), MM0 )      /* x1              | x0              */
459     ADD_L     ( EDI, EAX )              /* next vertex                       */
461     MOVQ      ( MM0, REGIND(EDX) )      /* r1              | r0              */
462     ADD_L     ( CONST(16), EDX )        /* next r                            */
464     DEC_L     ( ESI )                   /* decrement vertex counter          */
465     JNZ       ( LLBL( G3TPIR_3 ) )      /* cnt > 0 ? -> process next vertex  */
467 LLBL( G3TPIR_4 ):
469     FEMMS
470     POP_L     ( EDI )
471     POP_L     ( ESI )
472     RET
473 #endif
474         
475 #if defined (__ELF__) && defined (__linux__)
476         .section .note.GNU-stack,"",%progbits
477 #endif