Merge branch 'gallium-vertex-linear' into gallium-tex-surfaces
[mesa.git] / src / mesa / x86 / 3dnow_xform2.S
1
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 */
25
26 #ifdef USE_3DNOW_ASM
27 #include "matypes.h"
28 #include "xform_args.h"
29
30 SEG_TEXT
31
32 #define FRAME_OFFSET 4
33
34
35 ALIGNTEXT16
36 GLOBL GLNAME( _mesa_3dnow_transform_points2_general )
37 HIDDEN(_mesa_3dnow_transform_points2_general)
38 GLNAME( _mesa_3dnow_transform_points2_general ):
39
40 PUSH_L ( ESI )
41
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) )
49
50 PUSH_L ( EDI )
51
52 MOV_L ( REGOFF(V4F_START, ECX), EDX )
53 MOV_L ( ESI, ECX )
54 MOV_L ( REGOFF(V4F_COUNT, EAX), ESI )
55 MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI )
56 MOV_L ( REGOFF(V4F_START, EAX), EAX )
57
58 TEST_L ( ESI, ESI )
59 JZ ( LLBL( G3TPGR_3 ) )
60
61 MOVD ( REGIND(ECX), MM0 ) /* | m00 */
62 PUNPCKLDQ ( REGOFF(16, ECX), MM0 ) /* m10 | m00 */
63
64 MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */
65 PUNPCKLDQ ( REGOFF(20, ECX), MM1 ) /* m11 | m01 */
66
67 MOVD ( REGOFF(8, ECX), MM2 ) /* | m02 */
68 PUNPCKLDQ ( REGOFF(24, ECX), MM2 ) /* m12 | m02 */
69
70 MOVD ( REGOFF(12, ECX), MM3 ) /* | m03 */
71 PUNPCKLDQ ( REGOFF(28, ECX), MM3 ) /* m13 | m03 */
72
73 MOVQ ( REGOFF(48, ECX), MM4 ) /* m31 | m30 */
74 MOVQ ( REGOFF(56, ECX), MM5 ) /* m33 | m32 */
75
76 ALIGNTEXT16
77 LLBL( G3TPGR_2 ):
78
79 MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */
80 MOVQ ( MM6, MM7 ) /* x1 | x0 */
81
82 PFMUL ( MM0, MM6 ) /* x1*m10 | x0*m00 */
83 PFMUL ( MM1, MM7 ) /* x1*m11 | x0*m01 */
84
85 PFACC ( MM7, MM6 ) /* x0*m01+x1*m11 | x0*x00+x1*m10 */
86 PFADD ( MM4, MM6 ) /* x0*...*m11+m31 | x0*...*m10+m30 */
87
88 MOVQ ( MM6, REGIND(EDX) ) /* write r1, r0 */
89 MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */
90
91 MOVQ ( MM6, MM7 ) /* x1 | x0 */
92 PFMUL ( MM2, MM6 ) /* x1*m12 | x0*m02 */
93
94 PFMUL ( MM3, MM7 ) /* x1*m13 | x0*m03 */
95 ADD_L ( EDI, EAX ) /* next vertex */
96
97 PFACC ( MM7, MM6 ) /* x0*m03+x1*m13 | x0*x02+x1*m12 */
98 PFADD ( MM5, MM6 ) /* x0*...*m13+m33 | x0*...*m12+m32 */
99
100 MOVQ ( MM6, REGOFF(8, EDX) ) /* write r3, r2 */
101 ADD_L ( CONST(16), EDX ) /* next r */
102
103 DEC_L ( ESI ) /* decrement vertex counter */
104 JNZ ( LLBL( G3TPGR_2 ) ) /* cnt > 0 ? -> process next vertex */
105
106 LLBL( G3TPGR_3 ):
107
108 FEMMS
109 POP_L ( EDI )
110 POP_L ( ESI )
111 RET
112
113
114
115
116 ALIGNTEXT16
117 GLOBL GLNAME( _mesa_3dnow_transform_points2_perspective )
118 HIDDEN(_mesa_3dnow_transform_points2_perspective)
119 GLNAME( _mesa_3dnow_transform_points2_perspective ):
120
121 PUSH_L ( ESI )
122
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) )
130
131 PUSH_L ( EDI )
132
133 MOV_L ( REGOFF(V4F_START, ECX), EDX )
134 MOV_L ( ESI, ECX )
135 MOV_L ( REGOFF(V4F_COUNT, EAX), ESI )
136 MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI )
137 MOV_L ( REGOFF(V4F_START, EAX), EAX )
138
139 TEST_L ( ESI, ESI )
140 JZ ( LLBL( G3TPPR_3 ) )
141
142 MOVD ( REGIND(ECX), MM0 ) /* | m00 */
143 PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */
144
145 MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */
146
147 ALIGNTEXT16
148 LLBL( G3TPPR_2 ):
149
150 MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */
151 PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */
152
153 MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */
154 MOVQ ( MM3, REGOFF(8, EDX) ) /* write r2 (=m32), r3 (=0) */
155
156 ADD_L ( EDI, EAX ) /* next vertex */
157 ADD_L ( CONST(16), EDX ) /* next r */
158
159 DEC_L ( ESI ) /* decrement vertex counter */
160 JNZ ( LLBL( G3TPPR_2 ) ) /* cnt > 0 ? -> process next vertex */
161
162 LLBL( G3TPPR_3 ):
163
164 FEMMS
165 POP_L ( EDI )
166 POP_L ( ESI )
167 RET
168
169
170
171
172 ALIGNTEXT16
173 GLOBL GLNAME( _mesa_3dnow_transform_points2_3d )
174 HIDDEN(_mesa_3dnow_transform_points2_3d)
175 GLNAME( _mesa_3dnow_transform_points2_3d ):
176
177 PUSH_L ( ESI )
178
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) )
186
187 PUSH_L ( EDI )
188
189 MOV_L ( REGOFF(V4F_START, ECX), EDX )
190 MOV_L ( ESI, ECX )
191 MOV_L ( REGOFF(V4F_COUNT, EAX), ESI )
192 MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI )
193 MOV_L ( REGOFF(V4F_START, EAX), EAX )
194
195 TEST_L ( ESI, ESI )
196 JZ ( LLBL( G3TP3R_3 ) )
197
198 MOVD ( REGIND(ECX), MM0 ) /* | m00 */
199 PUNPCKLDQ ( REGOFF(16, ECX), MM0 ) /* m10 | m00 */
200
201 MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */
202 PUNPCKLDQ ( REGOFF(20, ECX), MM1 ) /* m11 | m01 */
203
204 MOVD ( REGOFF(8, ECX), MM2 ) /* | m02 */
205 PUNPCKLDQ ( REGOFF(24, ECX), MM2 ) /* m12 | m02 */
206
207 MOVQ ( REGOFF(48, ECX), MM4 ) /* m31 | m30 */
208 MOVD ( REGOFF(56, ECX), MM5 ) /* | m32 */
209
210 ALIGNTEXT16
211 LLBL( G3TP3R_2 ):
212
213 MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */
214 MOVQ ( MM6, MM7 ) /* x1 | x0 */
215
216 PFMUL ( MM0, MM6 ) /* x1*m10 | x0*m00 */
217 PFMUL ( MM1, MM7 ) /* x1*m11 | x0*m01 */
218
219 PFACC ( MM7, MM6 ) /* x0*m01+x1*m11 | x0*x00+x1*m10 */
220 PFADD ( MM4, MM6 ) /* x0*...*m11+m31 | x0*...*m10+m30 */
221
222 MOVQ ( MM6, REGIND(EDX) ) /* write r1, r0 */
223 MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */
224
225 MOVQ ( MM6, MM7 ) /* x1 | x0 */
226 PFMUL ( MM2, MM6 ) /* x1*m12 | x0*m02 */
227
228 PFACC ( MM7, MM6 ) /* ***trash*** | x0*x02+x1*m12 */
229 PFADD ( MM5, MM6 ) /* ***trash*** | x0*...*m12+m32 */
230
231 MOVD ( MM6, REGOFF(8, EDX) ) /* write r2 */
232 ADD_L ( EDI, EAX ) /* next vertex */
233
234 ADD_L ( CONST(16), EDX ) /* next r */
235 DEC_L ( ESI ) /* decrement vertex counter */
236
237 JNZ ( LLBL( G3TP3R_2 ) ) /* cnt > 0 ? -> process next vertex */
238
239 LLBL( G3TP3R_3 ):
240
241 FEMMS
242 POP_L ( EDI )
243 POP_L ( ESI )
244 RET
245
246
247
248
249 ALIGNTEXT16
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 ):
253
254 PUSH_L ( ESI )
255
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) )
263
264 PUSH_L ( EDI )
265
266 MOV_L ( REGOFF(V4F_START, ECX), EDX )
267 MOV_L ( ESI, ECX )
268 MOV_L ( REGOFF(V4F_COUNT, EAX), ESI )
269 MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI )
270 MOV_L ( REGOFF(V4F_START, EAX), EAX )
271
272 TEST_L ( ESI, ESI )
273 JZ ( LLBL( G3TP3NRR_3 ) )
274
275 MOVD ( REGIND(ECX), MM0 ) /* | m00 */
276 PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */
277
278 MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */
279 MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */
280
281 ALIGNTEXT16
282 LLBL( G3TP3NRR_2 ):
283
284 MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */
285 PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */
286
287 PFADD ( MM2, MM4 ) /* x1*m11+m31 | x0*m00+m30 */
288 MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */
289
290 MOVD ( MM3, REGOFF(8, EDX) ) /* write r2 */
291 ADD_L ( EDI, EAX ) /* next vertex */
292
293 ADD_L ( CONST(16), EDX ) /* next r */
294 DEC_L ( ESI ) /* decrement vertex counter */
295
296 JNZ ( LLBL( G3TP3NRR_2 ) ) /* cnt > 0 ? -> process next vertex */
297
298 LLBL( G3TP3NRR_3 ):
299
300 FEMMS
301 POP_L ( EDI )
302 POP_L ( ESI )
303 RET
304
305
306
307
308 ALIGNTEXT16
309 GLOBL GLNAME( _mesa_3dnow_transform_points2_2d )
310 HIDDEN(_mesa_3dnow_transform_points2_2d)
311 GLNAME( _mesa_3dnow_transform_points2_2d ):
312
313 PUSH_L ( ESI )
314
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) )
322
323 PUSH_L ( EDI )
324
325 MOV_L ( REGOFF(V4F_START, ECX), EDX )
326 MOV_L ( ESI, ECX )
327 MOV_L ( REGOFF(V4F_COUNT, EAX), ESI )
328 MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI )
329 MOV_L ( REGOFF(V4F_START, EAX), EAX )
330
331 TEST_L ( ESI, ESI )
332 JZ ( LLBL( G3TP2R_3 ) )
333
334 MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */
335 MOVQ ( REGOFF(16, ECX), MM1 ) /* m11 | m10 */
336
337 MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */
338
339 ALIGNTEXT16
340 LLBL( G3TP2R_2 ):
341
342 MOVD ( REGIND(EAX), MM4 ) /* | x0 */
343 MOVD ( REGOFF(4, EAX), MM5 ) /* | x1 */
344
345 PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */
346 ADD_L ( EDI, EAX ) /* next vertex */
347
348 PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */
349 PUNPCKLDQ ( MM5, MM5 ) /* x1 | x1 */
350
351 PFMUL ( MM1, MM5 ) /* x1*m11 | x1*m10 */
352 PFADD ( MM2, MM4 ) /* x...x1*m11+31 | x0*..*m10+m30 */
353
354 PFADD ( MM5, MM4 ) /* x0*m01+x1*m11 | x0*m00+x1*m10 */
355 MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */
356
357 ADD_L ( CONST(16), EDX ) /* next r */
358 DEC_L ( ESI ) /* decrement vertex counter */
359
360 JNZ ( LLBL( G3TP2R_2 ) ) /* cnt > 0 ? -> process next vertex */
361
362 LLBL( G3TP2R_3 ):
363
364 FEMMS
365 POP_L ( EDI )
366 POP_L ( ESI )
367 RET
368
369
370
371
372 ALIGNTEXT16
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 ):
376
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(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) )
386
387 PUSH_L ( EDI )
388
389 MOV_L ( REGOFF(V4F_START, 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( G3TP2NRR_3 ) )
397
398 MOVD ( REGIND(ECX), MM0 ) /* | m00 */
399 PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */
400
401 MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */
402
403 ALIGNTEXT16
404 LLBL( G3TP2NRR_2 ):
405
406 MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */
407 ADD_L ( EDI, EAX ) /* next vertex */
408
409 PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */
410 PFADD ( MM2, MM4 ) /* m31 | x0*m00+m30 */
411
412 MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */
413 ADD_L ( CONST(16), EDX ) /* next r */
414
415 DEC_L ( ESI ) /* decrement vertex counter */
416 JNZ ( LLBL( G3TP2NRR_2 ) ) /* cnt > 0 ? -> process next vertex */
417
418 LLBL( G3TP2NRR_3 ):
419
420 FEMMS
421 POP_L ( EDI )
422 POP_L ( ESI )
423 RET
424
425
426
427
428 ALIGNTEXT16
429 GLOBL GLNAME( _mesa_3dnow_transform_points2_identity )
430 HIDDEN(_mesa_3dnow_transform_points2_identity)
431 GLNAME( _mesa_3dnow_transform_points2_identity ):
432
433 PUSH_L ( ESI )
434
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) )
442
443 PUSH_L ( EDI )
444
445 MOV_L ( REGOFF(V4F_START, ECX), EDX )
446 MOV_L ( ESI, ECX )
447 MOV_L ( REGOFF(V4F_COUNT, EAX), ESI )
448 MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI )
449 MOV_L ( REGOFF(V4F_START, EAX), EAX )
450
451 TEST_L ( ESI, ESI )
452 JZ ( LLBL( G3TPIR_3 ) )
453
454 ALIGNTEXT16
455 LLBL( G3TPIR_3 ):
456
457 MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */
458 ADD_L ( EDI, EAX ) /* next vertex */
459
460 MOVQ ( MM0, REGIND(EDX) ) /* r1 | r0 */
461 ADD_L ( CONST(16), EDX ) /* next r */
462
463 DEC_L ( ESI ) /* decrement vertex counter */
464 JNZ ( LLBL( G3TPIR_3 ) ) /* cnt > 0 ? -> process next vertex */
465
466 LLBL( G3TPIR_4 ):
467
468 FEMMS
469 POP_L ( EDI )
470 POP_L ( ESI )
471 RET
472 #endif
473
474 #if defined (__ELF__) && defined (__linux__)
475 .section .note.GNU-stack,"",%progbits
476 #endif