Remove CVS keywords.
[mesa.git] / src / mesa / x86 / 3dnow_xform3.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_points3_general )
37 HIDDEN(_mesa_3dnow_transform_points3_general)
38 GLNAME( _mesa_3dnow_transform_points3_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_2 ) )
60
61 PREFETCHW ( REGIND(EDX) )
62
63 ALIGNTEXT16
64 LLBL( G3TPGR_1 ):
65
66 PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */
67
68 MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */
69 MOVD ( REGOFF(8, EAX), MM2 ) /* | x2 */
70
71 ADD_L ( EDI, EAX ) /* next vertex */
72 PREFETCH ( REGIND(EAX) )
73
74 MOVQ ( MM0, MM1 ) /* x1 | x0 */
75 PUNPCKLDQ ( MM2, MM2 ) /* x2 | x2 */
76
77 PUNPCKLDQ ( MM0, MM0 ) /* x0 | x0 */
78 MOVQ ( MM2, MM5 ) /* x2 | x2 */
79
80 PUNPCKHDQ ( MM1, MM1 ) /* x1 | x1 */
81 PFMUL ( REGOFF(32, ECX), MM2 ) /* x2*m9 | x2*m8 */
82
83 MOVQ ( MM0, MM3 ) /* x0 | x0 */
84 PFMUL ( REGOFF(40, ECX), MM5 ) /* x2*m11 | x2*m10 */
85
86 MOVQ ( MM1, MM4 ) /* x1 | x1 */
87 PFMUL ( REGIND(ECX), MM0 ) /* x0*m1 | x0*m0 */
88
89 PFADD ( REGOFF(48, ECX), MM2 ) /* x2*m9+m13 | x2*m8+m12 */
90 PFMUL ( REGOFF(16, ECX), MM1 ) /* x1*m5 | x1*m4 */
91
92 PFADD ( REGOFF(56, ECX), MM5 ) /* x2*m11+m15 | x2*m10+m14 */
93 PFADD ( MM0, MM1 ) /* x0*m1+x1*m5 | x0*m0+x1*m4 */
94
95 PFMUL ( REGOFF(8, ECX), MM3 ) /* x0*m3 | x0*m2 */
96 PFADD ( MM1, MM2 ) /* r1 | r0 */
97
98 PFMUL ( REGOFF(24, ECX), MM4 ) /* x1*m7 | x1*m6 */
99 ADD_L ( CONST(16), EDX ) /* next output vertex */
100
101 PFADD ( MM3, MM4 ) /* x0*m3+x1*m7 | x0*m2+x1*m6 */
102 MOVQ ( MM2, REGOFF(-16, EDX) ) /* write r0, r1 */
103
104 PFADD ( MM4, MM5 ) /* r3 | r2 */
105 MOVQ ( MM5, REGOFF(-8, EDX) ) /* write r2, r3 */
106
107 DEC_L ( ESI ) /* decrement vertex counter */
108 JNZ ( LLBL( G3TPGR_1 ) ) /* cnt > 0 ? -> process next vertex */
109
110 LLBL( G3TPGR_2 ):
111
112 FEMMS
113 POP_L ( EDI )
114 POP_L ( ESI )
115 RET
116
117
118
119
120 ALIGNTEXT16
121 GLOBL GLNAME( _mesa_3dnow_transform_points3_perspective )
122 HIDDEN(_mesa_3dnow_transform_points3_perspective)
123 GLNAME( _mesa_3dnow_transform_points3_perspective ):
124
125 PUSH_L ( ESI )
126
127 MOV_L ( ARG_DEST, ECX )
128 MOV_L ( ARG_MATRIX, ESI )
129 MOV_L ( ARG_SOURCE, EAX )
130 MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) )
131 OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) )
132 MOV_L ( REGOFF(V4F_COUNT, EAX), EDX )
133 MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) )
134
135 PUSH_L ( EDI )
136
137 MOV_L ( REGOFF(V4F_START, ECX), EDX )
138 MOV_L ( ESI, ECX )
139 MOV_L ( REGOFF(V4F_COUNT, EAX), ESI )
140 MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI )
141 MOV_L ( REGOFF(V4F_START, EAX), EAX )
142
143 TEST_L ( ESI, ESI )
144 JZ ( LLBL( G3TPPR_2 ) )
145
146 PREFETCH ( REGIND(EAX) )
147 PREFETCHW ( REGIND(EDX) )
148
149 MOVD ( REGIND(ECX), MM0 ) /* | m00 */
150 PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */
151
152 MOVQ ( REGOFF(32, ECX), MM1 ) /* m21 | m20 */
153 MOVD ( REGOFF(40, ECX), MM2 ) /* | m22 */
154
155 MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */
156
157 ALIGNTEXT16
158 LLBL( G3TPPR_1 ):
159
160 PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */
161
162 MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */
163 MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */
164
165 ADD_L ( EDI, EAX ) /* next vertex */
166 PREFETCH ( REGIND(EAX) )
167
168 PXOR ( MM7, MM7 ) /* 0 | 0 */
169 MOVQ ( MM5, MM6 ) /* | x2 */
170
171 PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */
172 PFSUB ( MM5, MM7 ) /* | -x2 */
173
174 PFMUL ( MM2, MM6 ) /* | x2*m22 */
175 PUNPCKLDQ ( MM5, MM5 ) /* x2 | x2 */
176
177 ADD_L ( CONST(16), EDX ) /* next r */
178 PFMUL ( MM1, MM5 ) /* x2*m21 | x2*m20 */
179
180 PFADD ( MM3, MM6 ) /* | x2*m22+m32 */
181 PFADD ( MM4, MM5 ) /* x1*m11+x2*m21 | x0*m00+x2*m20 */
182
183 MOVQ ( MM5, REGOFF(-16, EDX) ) /* write r0, r1 */
184 MOVD ( MM6, REGOFF(-8, EDX) ) /* write r2 */
185
186 MOVD ( MM7, REGOFF(-4, EDX) ) /* write r3 */
187
188 DEC_L ( ESI ) /* decrement vertex counter */
189 JNZ ( LLBL( G3TPPR_1 ) ) /* cnt > 0 ? -> process next vertex */
190
191 LLBL( G3TPPR_2 ):
192
193 FEMMS
194 POP_L ( EDI )
195 POP_L ( ESI )
196 RET
197
198
199
200
201 ALIGNTEXT16
202 GLOBL GLNAME( _mesa_3dnow_transform_points3_3d )
203 HIDDEN(_mesa_3dnow_transform_points3_3d)
204 GLNAME( _mesa_3dnow_transform_points3_3d ):
205
206 PUSH_L ( ESI )
207
208 MOV_L ( ARG_DEST, ECX )
209 MOV_L ( ARG_MATRIX, ESI )
210 MOV_L ( ARG_SOURCE, EAX )
211 MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) )
212 OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) )
213 MOV_L ( REGOFF(V4F_COUNT, EAX), EDX )
214 MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) )
215
216 PUSH_L ( EDI )
217
218 MOV_L ( REGOFF(V4F_START, ECX), EDX )
219 MOV_L ( ESI, ECX )
220 MOV_L ( REGOFF(V4F_COUNT, EAX), ESI )
221 MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI )
222 MOV_L ( REGOFF(V4F_START, EAX), EAX )
223
224 TEST_L ( ESI, ESI )
225 JZ ( LLBL( G3TP3R_2 ) )
226
227 PREFETCH ( REGIND(EAX) )
228 PREFETCH ( REGIND(EDX) )
229
230 MOVD ( REGOFF(8, ECX), MM7 ) /* | m2 */
231 PUNPCKLDQ ( REGOFF(24, ECX), MM7 ) /* m6 | m2 */
232
233
234 ALIGNTEXT16
235 LLBL( G3TP3R_1 ):
236
237 PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */
238
239 MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */
240 MOVD ( REGOFF(8, EAX), MM1 ) /* | x2 */
241
242 ADD_L ( EDI, EAX ) /* next vertex */
243 PREFETCH ( REGIND(EAX) )
244
245 MOVQ ( MM0, MM2 ) /* x1 | x0 */
246 ADD_L ( CONST(16), EDX ) /* next r */
247
248 PUNPCKLDQ ( MM2, MM2 ) /* x0 | x0 */
249 MOVQ ( MM0, MM3 ) /* x1 | x0 */
250
251 PFMUL ( REGIND(ECX), MM2 ) /* x0*m1 | x0*m0 */
252 PUNPCKHDQ ( MM3, MM3 ) /* x1 | x1 */
253
254 MOVQ ( MM1, MM4 ) /* | x2 */
255 PFMUL ( REGOFF(16, ECX), MM3 ) /* x1*m5 | x1*m4 */
256
257 PUNPCKLDQ ( MM4, MM4 ) /* x2 | x2 */
258 PFADD ( MM2, MM3 ) /* x0*m1+x1*m5 | x0*m0+x1*m4 */
259
260 PFMUL ( REGOFF(32, ECX), MM4 ) /* x2*m9 | x2*m8 */
261 PFADD ( REGOFF(48, ECX), MM3 ) /* x0*m1+...+m11 | x0*m0+x1*m4+m12 */
262
263 PFMUL ( MM7, MM0 ) /* x1*m6 | x0*m2 */
264 PFADD ( MM4, MM3 ) /* r1 | r0 */
265
266 PFMUL ( REGOFF(40, ECX), MM1 ) /* | x2*m10 */
267 PUNPCKLDQ ( REGOFF(56, ECX), MM1 ) /* m14 | x2*m10 */
268
269 PFACC ( MM0, MM1 )
270
271 MOVQ ( MM3, REGOFF(-16, EDX) ) /* write r0, r1 */
272 PFACC ( MM1, MM1 ) /* | r2 */
273
274 MOVD ( MM1, REGOFF(-8, EDX) ) /* write r2 */
275
276 DEC_L ( ESI ) /* decrement vertex counter */
277 JNZ ( LLBL( G3TP3R_1 ) ) /* cnt > 0 ? -> process next vertex */
278
279 LLBL( G3TP3R_2 ):
280
281 FEMMS
282 POP_L ( EDI )
283 POP_L ( ESI )
284 RET
285
286
287
288
289 ALIGNTEXT16
290 GLOBL GLNAME( _mesa_3dnow_transform_points3_3d_no_rot )
291 HIDDEN(_mesa_3dnow_transform_points3_3d_no_rot)
292 GLNAME( _mesa_3dnow_transform_points3_3d_no_rot ):
293
294 PUSH_L ( ESI )
295
296 MOV_L ( ARG_DEST, ECX )
297 MOV_L ( ARG_MATRIX, ESI )
298 MOV_L ( ARG_SOURCE, EAX )
299 MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) )
300 OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) )
301 MOV_L ( REGOFF(V4F_COUNT, EAX), EDX )
302 MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) )
303
304 PUSH_L ( EDI )
305
306 MOV_L ( REGOFF(V4F_START, ECX), EDX )
307 MOV_L ( ESI, ECX )
308 MOV_L ( REGOFF(V4F_COUNT, EAX), ESI )
309 MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI )
310 MOV_L ( REGOFF(V4F_START, EAX), EAX )
311
312 TEST_L ( ESI, ESI )
313 JZ ( LLBL( G3TP3NRR_2 ) )
314
315 PREFETCH ( REGIND(EAX) )
316 PREFETCHW ( REGIND(EDX) )
317
318 MOVD ( REGIND(ECX), MM0 ) /* | m00 */
319 PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */
320
321 MOVD ( REGOFF(40, ECX), MM2 ) /* | m22 */
322 PUNPCKLDQ ( MM2, MM2 ) /* m22 | m22 */
323
324 MOVQ ( REGOFF(48, ECX), MM1 ) /* m31 | m30 */
325 MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */
326
327 PUNPCKLDQ ( MM3, MM3 ) /* m32 | m32 */
328
329
330 ALIGNTEXT16
331 LLBL( G3TP3NRR_1 ):
332
333 PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */
334
335 MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */
336 MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */
337
338 ADD_L ( EDI, EAX ) /* next vertex */
339 PREFETCHW ( REGIND(EAX) )
340
341 PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */
342
343 PFADD ( MM1, MM4 ) /* x1*m11+m31 | x0*m00+m30 */
344 PFMUL ( MM2, MM5 ) /* | x2*m22 */
345
346 PFADD ( MM3, MM5 ) /* | x2*m22+m32 */
347 MOVQ ( MM4, REGIND(EDX) ) /* write r0, r1 */
348
349 ADD_L ( CONST(16), EDX ) /* next r */
350 DEC_L ( ESI ) /* decrement vertex counter */
351
352 MOVD ( MM5, REGOFF(-8, EDX) ) /* write r2 */
353 JNZ ( LLBL( G3TP3NRR_1 ) ) /* cnt > 0 ? -> process next vertex */
354
355 LLBL( G3TP3NRR_2 ):
356
357 FEMMS
358 POP_L ( EDI )
359 POP_L ( ESI )
360 RET
361
362
363
364
365 ALIGNTEXT16
366 GLOBL GLNAME( _mesa_3dnow_transform_points3_2d )
367 HIDDEN(_mesa_3dnow_transform_points3_2d)
368 GLNAME( _mesa_3dnow_transform_points3_2d ):
369
370 PUSH_L ( ESI )
371
372 MOV_L ( ARG_DEST, ECX )
373 MOV_L ( ARG_MATRIX, ESI )
374 MOV_L ( ARG_SOURCE, EAX )
375 MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) )
376 OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) )
377 MOV_L ( REGOFF(V4F_COUNT, EAX), EDX )
378 MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) )
379
380 PUSH_L ( EDI )
381
382 MOV_L ( REGOFF(V4F_START, ECX), EDX )
383 MOV_L ( ESI, ECX )
384 MOV_L ( REGOFF(V4F_COUNT, EAX), ESI )
385 MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI )
386 MOV_L ( REGOFF(V4F_START, EAX), EAX )
387
388 TEST_L ( ESI, ESI )
389 JZ ( LLBL( G3TP2R_3) )
390
391 PREFETCH ( REGIND(EAX) )
392 PREFETCHW ( REGIND(EDX) )
393
394 MOVD ( REGIND(ECX), MM0 ) /* | m00 */
395 PUNPCKLDQ ( REGOFF(16, ECX), MM0 ) /* m10 | m00 */
396
397 MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */
398 PUNPCKLDQ ( REGOFF(20, ECX), MM1 ) /* m11 | m01 */
399
400 MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */
401
402 ALIGNTEXT16
403 LLBL( G3TP2R_2 ):
404
405 PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */
406
407 MOVQ ( REGIND(EAX), MM3 ) /* x1 | x0 */
408 MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */
409
410 ADD_L ( EDI, EAX ) /* next vertex */
411 PREFETCH ( REGIND(EAX) )
412
413 MOVQ ( MM3, MM4 ) /* x1 | x0 */
414 PFMUL ( MM0, MM3 ) /* x1*m10 | x0*m00 */
415
416 ADD_L ( CONST(16), EDX ) /* next r */
417 PFMUL ( MM1, MM4 ) /* x1*m11 | x0*m01 */
418
419 PFACC ( MM4, MM3 ) /* x0*m00+x1*m10 | x0*m01+x1*m11 */
420 MOVD ( MM5, REGOFF(-8, EDX) ) /* write r2 (=x2) */
421
422 PFADD ( MM2, MM3 ) /* x0*...*m10+m30 | x0*...*m11+m31 */
423 MOVQ ( MM3, REGOFF(-16, EDX) ) /* write r0, r1 */
424
425 DEC_L ( ESI ) /* decrement vertex counter */
426 JNZ ( LLBL( G3TP2R_2 ) ) /* cnt > 0 ? -> process next vertex */
427
428 LLBL( G3TP2R_3 ):
429
430 FEMMS
431 POP_L ( EDI )
432 POP_L ( ESI )
433 RET
434
435
436
437
438 ALIGNTEXT16
439 GLOBL GLNAME( _mesa_3dnow_transform_points3_2d_no_rot )
440 HIDDEN(_mesa_3dnow_transform_points3_2d_no_rot)
441 GLNAME( _mesa_3dnow_transform_points3_2d_no_rot ):
442
443 PUSH_L ( ESI )
444
445 MOV_L ( ARG_DEST, ECX )
446 MOV_L ( ARG_MATRIX, ESI )
447 MOV_L ( ARG_SOURCE, EAX )
448 MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) )
449 OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) )
450 MOV_L ( REGOFF(V4F_COUNT, EAX), EDX )
451 MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) )
452
453 PUSH_L ( EDI )
454
455 MOV_L ( REGOFF(V4F_START, ECX), EDX )
456 MOV_L ( ESI, ECX )
457 MOV_L ( REGOFF(V4F_COUNT, EAX), ESI )
458 MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI )
459 MOV_L ( REGOFF(V4F_START, EAX), EAX )
460
461 TEST_L ( ESI, ESI )
462 JZ ( LLBL( G3TP2NRR_2 ) )
463
464 PREFETCH ( REGIND(EAX) )
465 PREFETCHW ( REGIND(EDX) )
466
467 MOVD ( REGIND(ECX), MM0 ) /* | m00 */
468 PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */
469
470 MOVQ ( REGOFF(48, ECX), MM1 ) /* m31 | m30 */
471
472
473 ALIGNTEXT16
474 LLBL( G3TP2NRR_1 ):
475
476 PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */
477
478 MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */
479 MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */
480
481 ADD_L ( EDI, EAX ) /* next vertex */
482 PREFETCH ( REGIND(EAX) )
483
484 PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */
485 ADD_L ( CONST(16), EDX ) /* next r */
486
487 PFADD ( MM1, MM4 ) /* x1*m11+m31 | x0*m00+m30 */
488
489 MOVQ ( MM4, REGOFF(-16, EDX) ) /* write r0, r1 */
490 MOVD ( MM5, REGOFF(-8, EDX) ) /* write r2 (=x2) */
491
492 DEC_L ( ESI ) /* decrement vertex counter */
493 JNZ ( LLBL( G3TP2NRR_1 ) ) /* cnt > 0 ? -> process next vertex */
494
495 LLBL( G3TP2NRR_2 ):
496
497 FEMMS
498 POP_L ( EDI )
499 POP_L ( ESI )
500 RET
501
502
503
504
505 ALIGNTEXT16
506 GLOBL GLNAME( _mesa_3dnow_transform_points3_identity )
507 HIDDEN(_mesa_3dnow_transform_points3_identity)
508 GLNAME( _mesa_3dnow_transform_points3_identity ):
509
510 PUSH_L ( ESI )
511
512 MOV_L ( ARG_DEST, ECX )
513 MOV_L ( ARG_MATRIX, ESI )
514 MOV_L ( ARG_SOURCE, EAX )
515 MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) )
516 OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) )
517 MOV_L ( REGOFF(V4F_COUNT, EAX), EDX )
518 MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) )
519
520 PUSH_L ( EDI )
521
522 MOV_L ( REGOFF(V4F_START, ECX), EDX )
523 MOV_L ( ESI, ECX )
524 MOV_L ( REGOFF(V4F_COUNT, EAX), ESI )
525 MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI )
526 MOV_L ( REGOFF(V4F_START, EAX), EAX )
527
528 TEST_L ( ESI, ESI )
529 JZ ( LLBL( G3TPIR_2 ) )
530
531 PREFETCHW ( REGIND(EDX) )
532
533 ALIGNTEXT16
534 LLBL( G3TPIR_1 ):
535
536 PREFETCHW ( REGOFF(32, EDX) )
537
538 MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */
539 MOVD ( REGOFF(8, EAX), MM1 ) /* | x2 */
540
541 ADD_L ( EDI, EAX ) /* next vertex */
542 ADD_L ( CONST(16), EDX ) /* next r */
543
544 DEC_L ( ESI ) /* decrement vertex counter */
545 MOVQ ( MM0, REGOFF(-16, EDX) ) /* r1 | r0 */
546
547 MOVD ( MM1, REGOFF(-8, EDX) ) /* | r2 */
548 JNZ ( LLBL( G3TPIR_1 ) ) /* cnt > 0 ? -> process next vertex */
549
550 LLBL( G3TPIR_2 ):
551
552 FEMMS
553 POP_L ( EDI )
554 POP_L ( ESI )
555 RET
556 #endif
557
558 #if defined (__ELF__) && defined (__linux__)
559 .section .note.GNU-stack,"",%progbits
560 #endif