3 * Mesa 3-D graphics library
6 * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
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:
15 * The above copyright notice and this permission notice shall be included
16 * in all copies or substantial portions of the Software.
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.
28 #include "xform_args.h"
32 #define FRAME_OFFSET 4
36 GLOBL GLNAME( _mesa_3dnow_transform_points2_general )
37 HIDDEN(_mesa_3dnow_transform_points2_general)
38 GLNAME( _mesa_3dnow_transform_points2_general ):
42 MOV_L ( ARG_DEST, ECX )
43 MOV_L ( ARG_MATRIX, ESI )
44 MOV_L ( ARG_SOURCE, EAX )
45 MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) )
46 OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) )
47 MOV_L ( REGOFF(V4F_COUNT, EAX), EDX )
48 MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) )
52 MOV_L ( REGOFF(V4F_START, ECX), EDX )
54 MOV_L ( REGOFF(V4F_COUNT, EAX), ESI )
55 MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI )
56 MOV_L ( REGOFF(V4F_START, EAX), EAX )
59 JZ ( LLBL( G3TPGR_3 ) )
61 MOVD ( REGIND(ECX), MM0 ) /* | m00 */
62 PUNPCKLDQ ( REGOFF(16, ECX), MM0 ) /* m10 | m00 */
64 MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */
65 PUNPCKLDQ ( REGOFF(20, ECX), MM1 ) /* m11 | m01 */
67 MOVD ( REGOFF(8, ECX), MM2 ) /* | m02 */
68 PUNPCKLDQ ( REGOFF(24, ECX), MM2 ) /* m12 | m02 */
70 MOVD ( REGOFF(12, ECX), MM3 ) /* | m03 */
71 PUNPCKLDQ ( REGOFF(28, ECX), MM3 ) /* m13 | m03 */
73 MOVQ ( REGOFF(48, ECX), MM4 ) /* m31 | m30 */
74 MOVQ ( REGOFF(56, ECX), MM5 ) /* m33 | m32 */
79 MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */
80 MOVQ ( MM6, MM7 ) /* x1 | x0 */
82 PFMUL ( MM0, MM6 ) /* x1*m10 | x0*m00 */
83 PFMUL ( MM1, MM7 ) /* x1*m11 | x0*m01 */
85 PFACC ( MM7, MM6 ) /* x0*m01+x1*m11 | x0*x00+x1*m10 */
86 PFADD ( MM4, MM6 ) /* x0*...*m11+m31 | x0*...*m10+m30 */
88 MOVQ ( MM6, REGIND(EDX) ) /* write r1, r0 */
89 MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */
91 MOVQ ( MM6, MM7 ) /* x1 | x0 */
92 PFMUL ( MM2, MM6 ) /* x1*m12 | x0*m02 */
94 PFMUL ( MM3, MM7 ) /* x1*m13 | x0*m03 */
95 ADD_L ( EDI, EAX ) /* next vertex */
97 PFACC ( MM7, MM6 ) /* x0*m03+x1*m13 | x0*x02+x1*m12 */
98 PFADD ( MM5, MM6 ) /* x0*...*m13+m33 | x0*...*m12+m32 */
100 MOVQ ( MM6, REGOFF(8, EDX) ) /* write r3, r2 */
101 ADD_L ( CONST(16), EDX ) /* next r */
103 DEC_L ( ESI ) /* decrement vertex counter */
104 JNZ ( LLBL( G3TPGR_2 ) ) /* cnt > 0 ? -> process next vertex */
117 GLOBL GLNAME( _mesa_3dnow_transform_points2_perspective )
118 HIDDEN(_mesa_3dnow_transform_points2_perspective)
119 GLNAME( _mesa_3dnow_transform_points2_perspective ):
123 MOV_L ( ARG_DEST, ECX )
124 MOV_L ( ARG_MATRIX, ESI )
125 MOV_L ( ARG_SOURCE, EAX )
126 MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) )
127 OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) )
128 MOV_L ( REGOFF(V4F_COUNT, EAX), EDX )
129 MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) )
133 MOV_L ( REGOFF(V4F_START, ECX), EDX )
135 MOV_L ( REGOFF(V4F_COUNT, EAX), ESI )
136 MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI )
137 MOV_L ( REGOFF(V4F_START, EAX), EAX )
140 JZ ( LLBL( G3TPPR_3 ) )
142 MOVD ( REGIND(ECX), MM0 ) /* | m00 */
143 PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */
145 MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */
150 MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */
151 PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */
153 MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */
154 MOVQ ( MM3, REGOFF(8, EDX) ) /* write r2 (=m32), r3 (=0) */
156 ADD_L ( EDI, EAX ) /* next vertex */
157 ADD_L ( CONST(16), EDX ) /* next r */
159 DEC_L ( ESI ) /* decrement vertex counter */
160 JNZ ( LLBL( G3TPPR_2 ) ) /* cnt > 0 ? -> process next vertex */
173 GLOBL GLNAME( _mesa_3dnow_transform_points2_3d )
174 HIDDEN(_mesa_3dnow_transform_points2_3d)
175 GLNAME( _mesa_3dnow_transform_points2_3d ):
179 MOV_L ( ARG_DEST, ECX )
180 MOV_L ( ARG_MATRIX, ESI )
181 MOV_L ( ARG_SOURCE, EAX )
182 MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) )
183 OR_B ( CONST(VEC_SIZE_3 ), REGOFF(V4F_FLAGS, ECX) )
184 MOV_L ( REGOFF(V4F_COUNT, EAX), EDX )
185 MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) )
189 MOV_L ( REGOFF(V4F_START, ECX), EDX )
191 MOV_L ( REGOFF(V4F_COUNT, EAX), ESI )
192 MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI )
193 MOV_L ( REGOFF(V4F_START, EAX), EAX )
196 JZ ( LLBL( G3TP3R_3 ) )
198 MOVD ( REGIND(ECX), MM0 ) /* | m00 */
199 PUNPCKLDQ ( REGOFF(16, ECX), MM0 ) /* m10 | m00 */
201 MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */
202 PUNPCKLDQ ( REGOFF(20, ECX), MM1 ) /* m11 | m01 */
204 MOVD ( REGOFF(8, ECX), MM2 ) /* | m02 */
205 PUNPCKLDQ ( REGOFF(24, ECX), MM2 ) /* m12 | m02 */
207 MOVQ ( REGOFF(48, ECX), MM4 ) /* m31 | m30 */
208 MOVD ( REGOFF(56, ECX), MM5 ) /* | m32 */
213 MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */
214 MOVQ ( MM6, MM7 ) /* x1 | x0 */
216 PFMUL ( MM0, MM6 ) /* x1*m10 | x0*m00 */
217 PFMUL ( MM1, MM7 ) /* x1*m11 | x0*m01 */
219 PFACC ( MM7, MM6 ) /* x0*m01+x1*m11 | x0*x00+x1*m10 */
220 PFADD ( MM4, MM6 ) /* x0*...*m11+m31 | x0*...*m10+m30 */
222 MOVQ ( MM6, REGIND(EDX) ) /* write r1, r0 */
223 MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */
225 MOVQ ( MM6, MM7 ) /* x1 | x0 */
226 PFMUL ( MM2, MM6 ) /* x1*m12 | x0*m02 */
228 PFACC ( MM7, MM6 ) /* ***trash*** | x0*x02+x1*m12 */
229 PFADD ( MM5, MM6 ) /* ***trash*** | x0*...*m12+m32 */
231 MOVD ( MM6, REGOFF(8, EDX) ) /* write r2 */
232 ADD_L ( EDI, EAX ) /* next vertex */
234 ADD_L ( CONST(16), EDX ) /* next r */
235 DEC_L ( ESI ) /* decrement vertex counter */
237 JNZ ( LLBL( G3TP3R_2 ) ) /* cnt > 0 ? -> process next vertex */
250 GLOBL GLNAME( _mesa_3dnow_transform_points2_3d_no_rot )
251 HIDDEN(_mesa_3dnow_transform_points2_3d_no_rot)
252 GLNAME( _mesa_3dnow_transform_points2_3d_no_rot ):
256 MOV_L ( ARG_DEST, ECX )
257 MOV_L ( ARG_MATRIX, ESI )
258 MOV_L ( ARG_SOURCE, EAX )
259 MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) )
260 OR_B ( CONST(VEC_SIZE_3 ), REGOFF(V4F_FLAGS, ECX) )
261 MOV_L ( REGOFF(V4F_COUNT, EAX), EDX )
262 MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) )
266 MOV_L ( REGOFF(V4F_START, ECX), EDX )
268 MOV_L ( REGOFF(V4F_COUNT, EAX), ESI )
269 MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI )
270 MOV_L ( REGOFF(V4F_START, EAX), EAX )
273 JZ ( LLBL( G3TP3NRR_3 ) )
275 MOVD ( REGIND(ECX), MM0 ) /* | m00 */
276 PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */
278 MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */
279 MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */
284 MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */
285 PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */
287 PFADD ( MM2, MM4 ) /* x1*m11+m31 | x0*m00+m30 */
288 MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */
290 MOVD ( MM3, REGOFF(8, EDX) ) /* write r2 */
291 ADD_L ( EDI, EAX ) /* next vertex */
293 ADD_L ( CONST(16), EDX ) /* next r */
294 DEC_L ( ESI ) /* decrement vertex counter */
296 JNZ ( LLBL( G3TP3NRR_2 ) ) /* cnt > 0 ? -> process next vertex */
309 GLOBL GLNAME( _mesa_3dnow_transform_points2_2d )
310 HIDDEN(_mesa_3dnow_transform_points2_2d)
311 GLNAME( _mesa_3dnow_transform_points2_2d ):
315 MOV_L ( ARG_DEST, ECX )
316 MOV_L ( ARG_MATRIX, ESI )
317 MOV_L ( ARG_SOURCE, EAX )
318 MOV_L ( CONST(2), REGOFF(V4F_SIZE, ECX) )
319 OR_B ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) )
320 MOV_L ( REGOFF(V4F_COUNT, EAX), EDX )
321 MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) )
325 MOV_L ( REGOFF(V4F_START, ECX), EDX )
327 MOV_L ( REGOFF(V4F_COUNT, EAX), ESI )
328 MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI )
329 MOV_L ( REGOFF(V4F_START, EAX), EAX )
332 JZ ( LLBL( G3TP2R_3 ) )
334 MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */
335 MOVQ ( REGOFF(16, ECX), MM1 ) /* m11 | m10 */
337 MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */
342 MOVD ( REGIND(EAX), MM4 ) /* | x0 */
343 MOVD ( REGOFF(4, EAX), MM5 ) /* | x1 */
345 PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */
346 ADD_L ( EDI, EAX ) /* next vertex */
348 PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */
349 PUNPCKLDQ ( MM5, MM5 ) /* x1 | x1 */
351 PFMUL ( MM1, MM5 ) /* x1*m11 | x1*m10 */
352 PFADD ( MM2, MM4 ) /* x...x1*m11+31 | x0*..*m10+m30 */
354 PFADD ( MM5, MM4 ) /* x0*m01+x1*m11 | x0*m00+x1*m10 */
355 MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */
357 ADD_L ( CONST(16), EDX ) /* next r */
358 DEC_L ( ESI ) /* decrement vertex counter */
360 JNZ ( LLBL( G3TP2R_2 ) ) /* cnt > 0 ? -> process next vertex */
373 GLOBL GLNAME( _mesa_3dnow_transform_points2_2d_no_rot )
374 HIDDEN(_mesa_3dnow_transform_points2_2d_no_rot)
375 GLNAME( _mesa_3dnow_transform_points2_2d_no_rot ):
379 MOV_L ( ARG_DEST, ECX )
380 MOV_L ( ARG_MATRIX, ESI )
381 MOV_L ( ARG_SOURCE, EAX )
382 MOV_L ( CONST(2), REGOFF(V4F_SIZE, ECX) )
383 OR_B ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) )
384 MOV_L ( REGOFF(V4F_COUNT, EAX), EDX )
385 MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) )
389 MOV_L ( REGOFF(V4F_START, ECX), EDX )
391 MOV_L ( REGOFF(V4F_COUNT, EAX), ESI )
392 MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI )
393 MOV_L ( REGOFF(V4F_START, EAX), EAX )
396 JZ ( LLBL( G3TP2NRR_3 ) )
398 MOVD ( REGIND(ECX), MM0 ) /* | m00 */
399 PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */
401 MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */
406 MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */
407 ADD_L ( EDI, EAX ) /* next vertex */
409 PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */
410 PFADD ( MM2, MM4 ) /* m31 | x0*m00+m30 */
412 MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */
413 ADD_L ( CONST(16), EDX ) /* next r */
415 DEC_L ( ESI ) /* decrement vertex counter */
416 JNZ ( LLBL( G3TP2NRR_2 ) ) /* cnt > 0 ? -> process next vertex */
429 GLOBL GLNAME( _mesa_3dnow_transform_points2_identity )
430 HIDDEN(_mesa_3dnow_transform_points2_identity)
431 GLNAME( _mesa_3dnow_transform_points2_identity ):
435 MOV_L ( ARG_DEST, ECX )
436 MOV_L ( ARG_MATRIX, ESI )
437 MOV_L ( ARG_SOURCE, EAX )
438 MOV_L ( CONST(2), REGOFF(V4F_SIZE, ECX) )
439 OR_B ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) )
440 MOV_L ( REGOFF(V4F_COUNT, EAX), EDX )
441 MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) )
445 MOV_L ( REGOFF(V4F_START, ECX), EDX )
447 MOV_L ( REGOFF(V4F_COUNT, EAX), ESI )
448 MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI )
449 MOV_L ( REGOFF(V4F_START, EAX), EAX )
452 JZ ( LLBL( G3TPIR_3 ) )
457 MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */
458 ADD_L ( EDI, EAX ) /* next vertex */
460 MOVQ ( MM0, REGIND(EDX) ) /* r1 | r0 */
461 ADD_L ( CONST(16), EDX ) /* next r */
463 DEC_L ( ESI ) /* decrement vertex counter */
464 JNZ ( LLBL( G3TPIR_3 ) ) /* cnt > 0 ? -> process next vertex */
474 #if defined (__ELF__) && defined (__linux__)
475 .section .note.GNU-stack,"",%progbits