1
2/*
3 * Mesa 3-D graphics library
4 *
5 * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23 * OTHER DEALINGS IN THE SOFTWARE.
24 */
25
26#ifdef USE_3DNOW_ASM
27#include "assyntax.h"
28#define MATH_ASM_PTR_SIZE 4
29#include "math/m_vector_asm.h"
30#include "xform_args.h"
31
32    SEG_TEXT
33
34#define FRAME_OFFSET	4
35
36
37ALIGNTEXT16
38GLOBL GLNAME( _mesa_3dnow_transform_points1_general )
39HIDDEN(_mesa_3dnow_transform_points1_general)
40GLNAME( _mesa_3dnow_transform_points1_general ):
41    _CET_ENDBR
42    PUSH_L    ( ESI )
43
44    MOV_L     ( ARG_DEST, ECX )
45    MOV_L     ( ARG_MATRIX, ESI )
46    MOV_L     ( ARG_SOURCE, EAX )
47    MOV_L     ( CONST(4), REGOFF(V4F_SIZE, ECX) )
48    OR_B      ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) )
49    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
50    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
51
52    PUSH_L    ( EDI )
53
54    MOV_L     ( REGOFF(4, ECX), EDX )
55    MOV_L     ( ESI, ECX )
56    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
57    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
58    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
59
60    TEST_L    ( ESI, ESI )
61    JZ        ( LLBL( G3TPGR_3 ) )
62
63    MOVQ      ( REGIND(ECX), MM0 )	/* m01             | m00             */
64    MOVQ      ( REGOFF(8, ECX), MM1 )	/* m03             | m02             */
65
66    MOVQ      ( REGOFF(48, ECX), MM2 )	/* m31             | m30             */
67    MOVQ      ( REGOFF(56, ECX), MM3 )	/* m33             | m32             */
68
69ALIGNTEXT16
70LLBL( G3TPGR_2 ):
71
72    MOVD      ( REGIND(EAX), MM4 )	/*                 | x0              */
73    PUNPCKLDQ ( MM4, MM4 )		/* x0              | x0              */
74
75    MOVQ      ( MM4, MM5 )		/* x0              | x0              */
76    PFMUL     ( MM0, MM4 )		/* x0*m01          | x0*m00          */
77
78    PFMUL     ( MM1, MM5 )		/* x0*m03          | x0*m02          */
79    PFADD     ( MM2, MM4 )		/* x0*m01+m31      | x0*m00+m30      */
80
81    PFADD     ( MM3, MM5 )		/* x0*m03+m33      | x0*m02+m32      */
82    MOVQ      ( MM4, REGIND(EDX) )	/* write r1, r0                      */
83
84    MOVQ      ( MM5, REGOFF(8, EDX) )	/* write r3, r2                      */
85    ADD_L     ( EDI, EAX )		/* next vertex                       */
86
87    ADD_L     ( CONST(16), EDX )	/* next r                            */
88    DEC_L     ( ESI )			/* decrement vertex counter          */
89
90    JNZ       ( LLBL( G3TPGR_2 ) )	/* cnt > 0 ? -> process next vertex  */
91
92LLBL( G3TPGR_3 ):
93
94    FEMMS
95    POP_L     ( EDI )
96    POP_L     ( ESI )
97    RET
98
99
100
101
102ALIGNTEXT16
103GLOBL GLNAME( _mesa_3dnow_transform_points1_identity )
104HIDDEN(_mesa_3dnow_transform_points1_identity)
105GLNAME( _mesa_3dnow_transform_points1_identity ):
106    _CET_ENDBR
107    PUSH_L    ( ESI )
108
109    MOV_L     ( ARG_DEST, ECX )
110    MOV_L     ( ARG_MATRIX, ESI )
111    MOV_L     ( ARG_SOURCE, EAX )
112    MOV_L     ( CONST(1), REGOFF(V4F_SIZE, ECX) )
113    OR_B      ( CONST(VEC_SIZE_1), REGOFF(V4F_FLAGS, ECX) )
114    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
115    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
116
117    PUSH_L    ( EDI )
118
119    MOV_L     ( REGOFF(4, ECX), EDX )
120    MOV_L     ( ESI, ECX )
121    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
122    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
123    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
124
125    TEST_L    ( ESI, ESI )
126    JZ        ( LLBL( G3TPIR_4) )
127
128ALIGNTEXT16
129LLBL( G3TPIR_3 ):
130
131    MOVD      ( REGIND(EAX), MM0 )	/*                 | x0              */
132    ADD_L     ( EDI, EAX )		/* next vertex                       */
133
134    MOVD      ( MM0, REGIND(EDX) )	/*                 | r0              */
135    ADD_L     ( CONST(16), EDX )	/* next r                            */
136
137    DEC_L     ( ESI )			/* decrement vertex counter          */
138    JNZ       ( LLBL( G3TPIR_3 ) )	/* cnt > 0 ? -> process next vertex  */
139
140LLBL( G3TPIR_4 ):
141
142    FEMMS
143    POP_L     ( EDI )
144    POP_L     ( ESI )
145    RET
146
147
148
149
150ALIGNTEXT16
151GLOBL GLNAME( _mesa_3dnow_transform_points1_3d_no_rot )
152HIDDEN(_mesa_3dnow_transform_points1_3d_no_rot)
153GLNAME( _mesa_3dnow_transform_points1_3d_no_rot ):
154    _CET_ENDBR
155    PUSH_L    ( ESI )
156
157    MOV_L     ( ARG_DEST, ECX )
158    MOV_L     ( ARG_MATRIX, ESI )
159    MOV_L     ( ARG_SOURCE, EAX )
160    MOV_L     ( CONST(3), REGOFF(V4F_SIZE, ECX) )
161    OR_B      ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) )
162    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
163    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
164
165    PUSH_L    ( EDI )
166
167    MOV_L     ( REGOFF(4, ECX), EDX )
168    MOV_L     ( ESI, ECX )
169    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
170    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
171    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
172
173    TEST_L    ( ESI, ESI )
174    JZ        ( LLBL( G3TP3NRR_3 ) )
175
176    MOVD      ( REGIND(ECX), MM0 )	/*                 | m00             */
177    MOVQ      ( REGOFF(48, ECX), MM2 )	/* m31             | m30             */
178
179    MOVD      ( REGOFF(56, ECX), MM3 )	/*                 | m32             */
180
181ALIGNTEXT16
182LLBL( G3TP3NRR_2 ):
183
184    MOVD      ( REGIND(EAX), MM4 )	/*                 | x0              */
185    PFMUL     ( MM0, MM4 )		/*                 | x0*m00          */
186
187    PFADD     ( MM2, MM4 )		/* m31             | x0*m00+m30      */
188    MOVQ      ( MM4, REGIND(EDX) )	/* write r1, r0                      */
189
190    MOVD      ( MM3, REGOFF(8, EDX) )	/* write r2                          */
191    ADD_L     ( EDI, EAX )		/* next vertex                       */
192
193    ADD_L     ( CONST(16), EDX )	/* next r                            */
194    DEC_L     ( ESI )			/* decrement vertex counter          */
195
196    JNZ       ( LLBL( G3TP3NRR_2 ) )	/* cnt > 0 ? -> process next vertex  */
197
198LLBL( G3TP3NRR_3 ):
199
200    FEMMS
201    POP_L     ( EDI )
202    POP_L     ( ESI )
203    RET
204
205
206
207
208ALIGNTEXT16
209GLOBL GLNAME( _mesa_3dnow_transform_points1_perspective )
210HIDDEN(_mesa_3dnow_transform_points1_perspective)
211GLNAME( _mesa_3dnow_transform_points1_perspective ):
212    _CET_ENDBR
213    PUSH_L    ( ESI )
214
215    MOV_L     ( ARG_DEST, ECX )
216    MOV_L     ( ARG_MATRIX, ESI )
217    MOV_L     ( ARG_SOURCE, EAX )
218    MOV_L     ( CONST(4), REGOFF(V4F_SIZE, ECX) )
219    OR_B      ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) )
220    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
221    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
222
223    PUSH_L    ( EDI )
224
225    MOV_L     ( REGOFF(4, ECX), EDX )
226    MOV_L     ( ESI, ECX )
227    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
228    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
229    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
230
231    TEST_L    ( ESI, ESI )
232    JZ        ( LLBL( G3TPPR_3 ) )
233
234    MOVD      ( REGIND(ECX), MM0 )	/*                 | m00             */
235    MOVD      ( REGOFF(56, ECX), MM3 )	/*                 | m32             */
236
237ALIGNTEXT16
238LLBL( G3TPPR_2 ):
239
240    MOVD      ( REGIND(EAX), MM4 )	/* 0               | x0              */
241    PFMUL     ( MM0, MM4 )		/* 0               | x0*m00          */
242
243    MOVQ      ( MM4, REGIND(EDX) )	/* write r1, r0                      */
244    MOVQ      ( MM3, REGOFF(8, EDX) )	/* write r2  (=m32), r3 (=0)         */
245
246    ADD_L     ( EDI, EAX )		/* next vertex                       */
247    ADD_L     ( CONST(16), EDX )	/* next r                            */
248
249    DEC_L     ( ESI )			/* decrement vertex counter          */
250    JNZ       ( LLBL( G3TPPR_2 ) )	/* cnt > 0 ? -> process next vertex  */
251
252LLBL( G3TPPR_3 ):
253
254    FEMMS
255    POP_L     ( EDI )
256    POP_L     ( ESI )
257    RET
258
259
260
261
262ALIGNTEXT16
263GLOBL GLNAME( _mesa_3dnow_transform_points1_2d )
264HIDDEN(_mesa_3dnow_transform_points1_2d)
265GLNAME( _mesa_3dnow_transform_points1_2d ):
266    _CET_ENDBR
267    PUSH_L    ( ESI )
268
269    MOV_L     ( ARG_DEST, ECX )
270    MOV_L     ( ARG_MATRIX, ESI )
271    MOV_L     ( ARG_SOURCE, EAX )
272    MOV_L     ( CONST(2), REGOFF(V4F_SIZE, ECX) )
273    OR_B      ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) )
274    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
275    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
276
277    PUSH_L    ( EDI )
278
279    MOV_L     ( REGOFF(4, ECX), EDX )
280    MOV_L     ( ESI, ECX )
281    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
282    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
283    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
284
285    TEST_L    ( ESI, ESI )
286    JZ        ( LLBL( G3TP2R_3 ) )
287
288    MOVQ      ( REGIND(ECX), MM0 )	/* m01             | m00             */
289    MOVQ      ( REGOFF(48, ECX), MM2 )	/* m31             | m30             */
290
291ALIGNTEXT16
292LLBL( G3TP2R_2 ):
293
294    MOVD      ( REGIND(EAX), MM4 )	/*                 | x0              */
295    PUNPCKLDQ ( MM4, MM4 )		/* x0              | x0              */
296
297    PFMUL     ( MM0, MM4 )		/* x0*m01          | x0*m00          */
298    PFADD     ( MM2, MM4 )		/* x0*m01+m31      | x0*m00+m30      */
299
300    MOVQ      ( MM4, REGIND(EDX) )	/* write r1, r0                      */
301    ADD_L     ( EDI, EAX )		/* next vertex                       */
302
303    ADD_L     ( CONST(16), EDX )	/* next r                            */
304    DEC_L     ( ESI )			/* decrement vertex counter          */
305
306    JNZ       ( LLBL( G3TP2R_2 ) )	/* cnt > 0 ? -> process next vertex  */
307
308LLBL( G3TP2R_3 ):
309
310    FEMMS
311    POP_L     ( EDI )
312    POP_L     ( ESI )
313    RET
314
315
316
317
318ALIGNTEXT16
319GLOBL GLNAME( _mesa_3dnow_transform_points1_2d_no_rot )
320HIDDEN(_mesa_3dnow_transform_points1_2d_no_rot)
321GLNAME( _mesa_3dnow_transform_points1_2d_no_rot ):
322    _CET_ENDBR
323    PUSH_L    ( ESI )
324
325    MOV_L     ( ARG_DEST, ECX )
326    MOV_L     ( ARG_MATRIX, ESI )
327    MOV_L     ( ARG_SOURCE, EAX )
328    MOV_L     ( CONST(2), REGOFF(V4F_SIZE, ECX) )
329    OR_B      ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) )
330    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
331    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
332
333    PUSH_L    ( EDI )
334
335    MOV_L     ( REGOFF(4, ECX), EDX )
336    MOV_L     ( ESI, ECX )
337    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
338    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
339    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
340
341    TEST_L    ( ESI, ESI )
342    JZ        ( LLBL( G3TP2NRR_3 ) )
343
344    MOVD      ( REGIND(ECX), MM0 )	/*                 | m00             */
345    MOVQ      ( REGOFF(48, ECX), MM2 )	/* m31             | m30             */
346
347ALIGNTEXT16
348LLBL( G3TP2NRR_2 ):
349
350    MOVD      ( REGIND(EAX), MM4 )	/*                 | x0              */
351    ADD_L     ( EDI, EAX )		/* next vertex                       */
352
353    PFMUL     ( MM0, MM4 )		/*                 | x0*m00          */
354    PFADD     ( MM2, MM4 )		/* m31             | x0*m00+m30      */
355
356    MOVQ      ( MM4, REGIND(EDX) )	/* write r1, r0                      */
357    ADD_L     ( CONST(16), EDX )	/* next r                            */
358
359    DEC_L     ( ESI )			/* decrement vertex counter          */
360    JNZ       ( LLBL( G3TP2NRR_2 ) )	/* cnt > 0 ? -> process next vertex  */
361
362LLBL( G3TP2NRR_3 ):
363
364    FEMMS
365    POP_L     ( EDI )
366    POP_L     ( ESI )
367    RET
368
369
370
371
372ALIGNTEXT16
373GLOBL GLNAME( _mesa_3dnow_transform_points1_3d )
374HIDDEN(_mesa_3dnow_transform_points1_3d)
375GLNAME( _mesa_3dnow_transform_points1_3d ):
376    _CET_ENDBR
377    PUSH_L    ( ESI )
378
379    MOV_L     ( ARG_DEST, ECX )
380    MOV_L     ( ARG_MATRIX, ESI )
381    MOV_L     ( ARG_SOURCE, EAX )
382    MOV_L     ( CONST(3), REGOFF(V4F_SIZE, ECX) )
383    OR_B      ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) )
384    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
385    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
386
387    PUSH_L    ( EDI )
388
389    MOV_L     ( REGOFF(4, ECX), EDX )
390    MOV_L     ( ESI, ECX )
391    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
392    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
393    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
394
395    TEST_L    ( ESI, ESI )
396    JZ        ( LLBL( G3TP3R_3 ) )
397
398    MOVQ      ( REGIND(ECX), MM0 )	/* m01             | m00             */
399    MOVD      ( REGOFF(8, ECX), MM1 )	/*                 | m02             */
400
401    MOVQ      ( REGOFF(48, ECX), MM2 )	/* m31             | m30             */
402    MOVD      ( REGOFF(56, ECX), MM3 )	/*                 | m32             */
403
404ALIGNTEXT16
405LLBL( G3TP3R_2 ):
406
407    MOVD      ( REGIND(EAX), MM4 )	/*                 | x0              */
408    PUNPCKLDQ ( MM4, MM4 )		/* x0              | x0              */
409
410    MOVQ      ( MM4, MM5 )		/*                 | x0              */
411    PFMUL     ( MM0, MM4 )		/* x0*m01          | x0*m00          */
412
413    PFMUL     ( MM1, MM5 )		/*                 | x0*m02          */
414    PFADD     ( MM2, MM4 )		/* x0*m01+m31      | x0*m00+m30      */
415
416    PFADD     ( MM3, MM5 )		/*                 | x0*m02+m32      */
417    MOVQ      ( MM4, REGIND(EDX) )	/* write r1, r0                      */
418
419    MOVD      ( MM5, REGOFF(8, EDX) )	/* write r2                          */
420    ADD_L     ( EDI, EAX )		/* next vertex                       */
421
422    ADD_L     ( CONST(16), EDX )	/* next r                            */
423    DEC_L     ( ESI )			/* decrement vertex counter          */
424
425    JNZ       ( LLBL( G3TP3R_2 ) )	/* cnt > 0 ? -> process next vertex  */
426
427LLBL( G3TP3R_3 ):
428
429    FEMMS
430    POP_L     ( EDI )
431    POP_L     ( ESI )
432    RET
433
434#endif
435
436#if defined (__ELF__) && defined (__linux__)
437	.section .note.GNU-stack,"",%progbits
438#endif
439