Tizen 2.0 Release
[profile/ivi/osmesa.git] / src / mesa / x86 / x86_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 /*
27  * NOTE: Avoid using spaces in between '(' ')' and arguments, especially
28  * with macros like CONST, LLBL that expand to CONCAT(...).  Putting spaces
29  * in there will break the build on some platforms.
30  */
31
32 #include "assyntax.h"
33 #include "matypes.h"
34 #include "xform_args.h"
35
36         SEG_TEXT
37
38 #define FP_ONE          1065353216
39 #define FP_ZERO         0
40
41 #define SRC0            REGOFF(0, ESI)
42 #define SRC1            REGOFF(4, ESI)
43 #define SRC2            REGOFF(8, ESI)
44 #define SRC3            REGOFF(12, ESI)
45 #define DST0            REGOFF(0, EDI)
46 #define DST1            REGOFF(4, EDI)
47 #define DST2            REGOFF(8, EDI)
48 #define DST3            REGOFF(12, EDI)
49 #define MAT0            REGOFF(0, EDX)
50 #define MAT1            REGOFF(4, EDX)
51 #define MAT2            REGOFF(8, EDX)
52 #define MAT3            REGOFF(12, EDX)
53 #define MAT4            REGOFF(16, EDX)
54 #define MAT5            REGOFF(20, EDX)
55 #define MAT6            REGOFF(24, EDX)
56 #define MAT7            REGOFF(28, EDX)
57 #define MAT8            REGOFF(32, EDX)
58 #define MAT9            REGOFF(36, EDX)
59 #define MAT10           REGOFF(40, EDX)
60 #define MAT11           REGOFF(44, EDX)
61 #define MAT12           REGOFF(48, EDX)
62 #define MAT13           REGOFF(52, EDX)
63 #define MAT14           REGOFF(56, EDX)
64 #define MAT15           REGOFF(60, EDX)
65
66
67 ALIGNTEXT16
68 GLOBL GLNAME( _mesa_x86_transform_points3_general )
69 HIDDEN(_mesa_x86_transform_points3_general)
70 GLNAME( _mesa_x86_transform_points3_general ):
71
72 #define FRAME_OFFSET 8
73         PUSH_L( ESI )
74         PUSH_L( EDI )
75
76         MOV_L( ARG_SOURCE, ESI )
77         MOV_L( ARG_DEST, EDI )
78
79         MOV_L( ARG_MATRIX, EDX )
80         MOV_L( REGOFF(V4F_COUNT, ESI), ECX )
81
82         TEST_L( ECX, ECX )
83         JZ( LLBL(x86_p3_gr_done) )
84
85         MOV_L( REGOFF(V4F_STRIDE, ESI), EAX )
86         OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) )
87
88         MOV_L( ECX, REGOFF(V4F_COUNT, EDI) )
89         MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) )
90
91         SHL_L( CONST(4), ECX )
92         MOV_L( REGOFF(V4F_START, ESI), ESI )
93
94         MOV_L( REGOFF(V4F_START, EDI), EDI )
95         ADD_L( EDI, ECX )
96
97 ALIGNTEXT16
98 LLBL(x86_p3_gr_loop):
99
100         FLD_S( SRC0 )                   /* F4 */
101         FMUL_S( MAT0 )
102         FLD_S( SRC0 )                   /* F5 F4 */
103         FMUL_S( MAT1 )
104         FLD_S( SRC0 )                   /* F6 F5 F4 */
105         FMUL_S( MAT2 )
106         FLD_S( SRC0 )                   /* F7 F6 F5 F4 */
107         FMUL_S( MAT3 )
108
109         FLD_S( SRC1 )                   /* F0 F7 F6 F5 F4 */
110         FMUL_S( MAT4 )
111         FLD_S( SRC1 )                   /* F1 F0 F7 F6 F5 F4 */
112         FMUL_S( MAT5 )
113         FLD_S( SRC1 )                   /* F2 F1 F0 F7 F6 F5 F4 */
114         FMUL_S( MAT6 )
115         FLD_S( SRC1 )                   /* F3 F2 F1 F0 F7 F6 F5 F4 */
116         FMUL_S( MAT7 )
117
118         FXCH( ST(3) )                   /* F0 F2 F1 F3 F7 F6 F5 F4 */
119         FADDP( ST0, ST(7) )             /* F2 F1 F3 F7 F6 F5 F4 */
120         FXCH( ST(1) )                   /* F1 F2 F3 F7 F6 F5 F4 */
121         FADDP( ST0, ST(5) )             /* F2 F3 F7 F6 F5 F4 */
122         FADDP( ST0, ST(3) )             /* F3 F7 F6 F5 F4 */
123         FADDP( ST0, ST(1) )             /* F7 F6 F5 F4 */
124
125         FLD_S( SRC2 )                   /* F0 F7 F6 F5 F4 */
126         FMUL_S( MAT8 )
127         FLD_S( SRC2 )                   /* F1 F0 F7 F6 F5 F4 */
128         FMUL_S( MAT9 )
129         FLD_S( SRC2 )                   /* F2 F1 F0 F7 F6 F5 F4 */
130         FMUL_S( MAT10 )
131         FLD_S( SRC2 )                   /* F3 F2 F1 F0 F7 F6 F5 F4 */
132         FMUL_S( MAT11 )
133
134         FXCH( ST(3) )                   /* F0 F2 F1 F3 F7 F6 F5 F4 */
135         FADDP( ST0, ST(7) )             /* F2 F1 F3 F7 F6 F5 F4 */
136         FXCH( ST(1) )                   /* F1 F2 F3 F7 F6 F5 F4 */
137         FADDP( ST0, ST(5) )             /* F2 F3 F7 F6 F5 F4 */
138         FADDP( ST0, ST(3) )             /* F3 F7 F6 F5 F4 */
139         FADDP( ST0, ST(1) )             /* F7 F6 F5 F4 */
140
141         FXCH( ST(3) )                   /* F4 F6 F5 F7 */
142         FADD_S( MAT12 )
143         FXCH( ST(2) )                   /* F5 F6 F4 F7 */
144         FADD_S( MAT13 )
145         FXCH( ST(1) )                   /* F6 F5 F4 F7 */
146         FADD_S( MAT14 )
147         FXCH( ST(3) )                   /* F7 F5 F4 F6 */
148         FADD_S( MAT15 )
149
150         FXCH( ST(2) )                   /* F4 F5 F7 F6 */
151         FSTP_S( DST0 )          /* F5 F7 F6 */
152         FSTP_S( DST1 )          /* F7 F6 */
153         FXCH( ST(1) )                   /* F6 F7 */
154         FSTP_S( DST2 )          /* F7 */
155         FSTP_S( DST3 )          /* */
156
157 LLBL(x86_p3_gr_skip):
158
159         ADD_L( CONST(16), EDI )
160         ADD_L( EAX, ESI )
161         CMP_L( ECX, EDI )
162         JNE( LLBL(x86_p3_gr_loop) )
163
164 LLBL(x86_p3_gr_done):
165
166         POP_L( EDI )
167         POP_L( ESI )
168         RET
169 #undef FRAME_OFFSET
170
171
172
173
174 ALIGNTEXT16
175 GLOBL GLNAME( _mesa_x86_transform_points3_perspective )
176 HIDDEN(_mesa_x86_transform_points3_perspective)
177 GLNAME( _mesa_x86_transform_points3_perspective ):
178
179 #define FRAME_OFFSET 12
180         PUSH_L( ESI )
181         PUSH_L( EDI )
182         PUSH_L( EBX )
183
184         MOV_L( ARG_SOURCE, ESI )
185         MOV_L( ARG_DEST, EDI )
186
187         MOV_L( ARG_MATRIX, EDX )
188         MOV_L( REGOFF(V4F_COUNT, ESI), ECX )
189
190         TEST_L( ECX, ECX )
191         JZ( LLBL(x86_p3_pr_done) )
192
193         MOV_L( REGOFF(V4F_STRIDE, ESI), EAX )
194         OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) )
195
196         MOV_L( ECX, REGOFF(V4F_COUNT, EDI) )
197         MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) )
198
199         SHL_L( CONST(4), ECX )
200         MOV_L( REGOFF(V4F_START, ESI), ESI )
201
202         MOV_L( REGOFF(V4F_START, EDI), EDI )
203         ADD_L( EDI, ECX )
204
205 ALIGNTEXT16
206 LLBL(x86_p3_pr_loop):
207
208         FLD_S( SRC0 )                   /* F4 */
209         FMUL_S( MAT0 )
210
211         FLD_S( SRC1 )                   /* F5 F4 */
212         FMUL_S( MAT5 )
213
214         FLD_S( SRC2 )                   /* F0 F5 F4 */
215         FMUL_S( MAT8 )
216         FLD_S( SRC2 )                   /* F1 F0 F5 F4 */
217         FMUL_S( MAT9 )
218         FLD_S( SRC2 )                   /* F2 F1 F0 F5 F4 */
219         FMUL_S( MAT10 )
220
221         FXCH( ST(2) )                   /* F0 F1 F2 F5 F4 */
222         FADDP( ST0, ST(4) )             /* F1 F2 F5 F4 */
223         FADDP( ST0, ST(2) )             /* F2 F5 F4 */
224         FLD_S( MAT14 )          /* F6 F2 F5 F4 */
225         FXCH( ST(1) )                   /* F2 F6 F5 F4 */
226         FADDP( ST0, ST(1) )             /* F6 F5 F4 */
227
228         MOV_L( SRC2, EBX )
229         XOR_L( CONST(-2147483648), EBX )/* change sign */
230
231         FXCH( ST(2) )                   /* F4 F5 F6 */
232         FSTP_S( DST0 )          /* F5 F6 */
233         FSTP_S( DST1 )          /* F6 */
234         FSTP_S( DST2 )          /* */
235         MOV_L( EBX, DST3 )
236
237 LLBL(x86_p3_pr_skip):
238
239         ADD_L( CONST(16), EDI )
240         ADD_L( EAX, ESI )
241         CMP_L( ECX, EDI )
242         JNE( LLBL(x86_p3_pr_loop) )
243
244 LLBL(x86_p3_pr_done):
245
246         POP_L( EBX )
247         POP_L( EDI )
248         POP_L( ESI )
249         RET
250 #undef FRAME_OFFSET
251
252
253
254
255 ALIGNTEXT16
256 GLOBL GLNAME( _mesa_x86_transform_points3_3d )
257 HIDDEN(_mesa_x86_transform_points3_3d)
258 GLNAME( _mesa_x86_transform_points3_3d ):
259
260 #define FRAME_OFFSET 8
261         PUSH_L( ESI )
262         PUSH_L( EDI )
263
264         MOV_L( ARG_SOURCE, ESI )
265         MOV_L( ARG_DEST, EDI )
266
267         MOV_L( ARG_MATRIX, EDX )
268         MOV_L( REGOFF(V4F_COUNT, ESI), ECX )
269
270         TEST_L( ECX, ECX )
271         JZ( LLBL(x86_p3_3dr_done) )
272
273         MOV_L( REGOFF(V4F_STRIDE, ESI), EAX )
274         OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) )
275
276         MOV_L( ECX, REGOFF(V4F_COUNT, EDI) )
277         MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) )
278
279         SHL_L( CONST(4), ECX )
280         MOV_L( REGOFF(V4F_START, ESI), ESI )
281
282         MOV_L( REGOFF(V4F_START, EDI), EDI )
283         ADD_L( EDI, ECX )
284
285 ALIGNTEXT16
286 LLBL(x86_p3_3dr_loop):
287
288         FLD_S( SRC0 )                   /* F4 */
289         FMUL_S( MAT0 )
290         FLD_S( SRC0 )                   /* F5 F4 */
291         FMUL_S( MAT1 )
292         FLD_S( SRC0 )                   /* F6 F5 F4 */
293         FMUL_S( MAT2 )
294
295         FLD_S( SRC1 )                   /* F0 F6 F5 F4 */
296         FMUL_S( MAT4 )
297         FLD_S( SRC1 )                   /* F1 F0 F6 F5 F4 */
298         FMUL_S( MAT5 )
299         FLD_S( SRC1 )                   /* F2 F1 F0 F6 F5 F4 */
300         FMUL_S( MAT6 )
301
302         FXCH( ST(2) )                   /* F0 F1 F2 F6 F5 F4 */
303         FADDP( ST0, ST(5) )             /* F1 F2 F6 F5 F4 */
304         FADDP( ST0, ST(3) )             /* F2 F6 F5 F4 */
305         FADDP( ST0, ST(1) )             /* F6 F5 F4 */
306
307         FLD_S( SRC2 )                   /* F0 F6 F5 F4 */
308         FMUL_S( MAT8 )
309         FLD_S( SRC2 )                   /* F1 F0 F6 F5 F4 */
310         FMUL_S( MAT9 )
311         FLD_S( SRC2 )                   /* F2 F1 F0 F6 F5 F4 */
312         FMUL_S( MAT10 )
313
314         FXCH( ST(2) )                   /* F0 F1 F2 F6 F5 F4 */
315         FADDP( ST0, ST(5) )             /* F1 F2 F6 F5 F4 */
316         FADDP( ST0, ST(3) )             /* F2 F6 F5 F4 */
317         FADDP( ST0, ST(1) )             /* F6 F5 F4 */
318
319         FXCH( ST(2) )                   /* F4 F5 F6 */
320         FADD_S( MAT12 )
321         FXCH( ST(1) )                   /* F5 F4 F6 */
322         FADD_S( MAT13 )
323         FXCH( ST(2) )                   /* F6 F4 F5 */
324         FADD_S( MAT14 )
325
326         FXCH( ST(1) )                   /* F4 F6 F5 */
327         FSTP_S( DST0   )                /* F6 F5 */
328         FXCH( ST(1) )                   /* F5 F6 */
329         FSTP_S( DST1   )                /* F6 */
330         FSTP_S( DST2   )                /* */
331
332 LLBL(x86_p3_3dr_skip):
333
334         ADD_L( CONST(16), EDI )
335         ADD_L( EAX, ESI )
336         CMP_L( ECX, EDI )
337         JNE( LLBL(x86_p3_3dr_loop) )
338
339 LLBL(x86_p3_3dr_done):
340
341         POP_L( EDI )
342         POP_L( ESI )
343         RET
344 #undef FRAME_OFFSET
345
346
347
348
349 ALIGNTEXT16
350 GLOBL GLNAME( _mesa_x86_transform_points3_3d_no_rot )
351 HIDDEN(_mesa_x86_transform_points3_3d_no_rot)
352 GLNAME( _mesa_x86_transform_points3_3d_no_rot ):
353
354 #define FRAME_OFFSET 8
355         PUSH_L( ESI )
356         PUSH_L( EDI )
357
358         MOV_L( ARG_SOURCE, ESI )
359         MOV_L( ARG_DEST, EDI )
360
361
362         MOV_L( ARG_MATRIX, EDX )
363         MOV_L( REGOFF(V4F_COUNT, ESI), ECX )
364
365         TEST_L( ECX, ECX )
366         JZ( LLBL(x86_p3_3dnrr_done) )
367
368         MOV_L( REGOFF(V4F_STRIDE, ESI), EAX )
369         OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) )
370
371         MOV_L( ECX, REGOFF(V4F_COUNT, EDI) )
372         MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) )
373
374         SHL_L( CONST(4), ECX )
375         MOV_L( REGOFF(V4F_START, ESI), ESI )
376
377         MOV_L( REGOFF(V4F_START, EDI), EDI )
378         ADD_L( EDI, ECX )
379
380 ALIGNTEXT16
381 LLBL(x86_p3_3dnrr_loop):
382
383         FLD_S( SRC0 )                   /* F4 */
384         FMUL_S( MAT0 )
385
386         FLD_S( SRC1 )                   /* F1 F4 */
387         FMUL_S( MAT5 )
388
389         FLD_S( SRC2 )                   /* F2 F1 F4 */
390         FMUL_S( MAT10 )
391
392         FXCH( ST(2) )                   /* F4 F1 F2 */
393         FADD_S( MAT12 )
394         FLD_S( MAT13 )          /* F5 F4 F1 F2 */
395         FXCH( ST(2) )                   /* F1 F4 F5 F2 */
396         FADDP( ST0, ST(2) )             /* F4 F5 F2 */
397         FLD_S( MAT14 )          /* F6 F4 F5 F2 */
398         FXCH( ST(3) )                   /* F2 F4 F5 F6 */
399         FADDP( ST0, ST(3) )             /* F4 F5 F6 */
400
401         FSTP_S( DST0   )                /* F5 F6 */
402         FSTP_S( DST1   )                /* F6 */
403         FSTP_S( DST2   )                /* */
404
405 LLBL(x86_p3_3dnrr_skip):
406
407         ADD_L( CONST(16), EDI )
408         ADD_L( EAX, ESI )
409         CMP_L( ECX, EDI )
410         JNE( LLBL(x86_p3_3dnrr_loop) )
411
412 LLBL(x86_p3_3dnrr_done):
413
414         POP_L( EDI )
415         POP_L( ESI )
416         RET
417 #undef FRAME_OFFSET
418
419
420
421
422 ALIGNTEXT16
423 GLOBL GLNAME( _mesa_x86_transform_points3_2d )
424 HIDDEN(_mesa_x86_transform_points3_2d)
425 GLNAME( _mesa_x86_transform_points3_2d ):
426
427 #define FRAME_OFFSET 12
428         PUSH_L( ESI )
429         PUSH_L( EDI )
430         PUSH_L( EBX )
431
432         MOV_L( ARG_SOURCE, ESI )
433         MOV_L( ARG_DEST, EDI )
434
435         MOV_L( ARG_MATRIX, EDX )
436         MOV_L( REGOFF(V4F_COUNT, ESI), ECX )
437
438         TEST_L( ECX, ECX )
439         JZ( LLBL(x86_p3_2dr_done) )
440
441         MOV_L( REGOFF(V4F_STRIDE, ESI), EAX )
442         OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) )
443
444         MOV_L( ECX, REGOFF(V4F_COUNT, EDI) )
445         MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) )
446
447         SHL_L( CONST(4), ECX )
448         MOV_L( REGOFF(V4F_START, ESI), ESI )
449
450         MOV_L( REGOFF(V4F_START, EDI), EDI )
451         ADD_L( EDI, ECX )
452
453 ALIGNTEXT16
454 LLBL(x86_p3_2dr_loop):
455
456         FLD_S( SRC0 )                   /* F4 */
457         FMUL_S( MAT0 )
458         FLD_S( SRC0 )                   /* F5 F4 */
459         FMUL_S( MAT1 )
460
461         FLD_S( SRC1 )                   /* F0 F5 F4 */
462         FMUL_S( MAT4 )
463         FLD_S( SRC1 )                   /* F1 F0 F5 F4 */
464         FMUL_S( MAT5 )
465
466         FXCH( ST(1) )                   /* F0 F1 F5 F4 */
467         FADDP( ST0, ST(3) )             /* F1 F5 F4 */
468         FADDP( ST0, ST(1) )             /* F5 F4 */
469
470         FXCH( ST(1) )                   /* F4 F5 */
471         FADD_S( MAT12 )
472         FXCH( ST(1) )                   /* F5 F4 */
473         FADD_S( MAT13 )
474
475         MOV_L( SRC2, EBX )
476
477         FXCH( ST(1) )                   /* F4 F5 */
478         FSTP_S( DST0   )                /* F5 */
479         FSTP_S( DST1   )                /* */
480         MOV_L( EBX, DST2 )
481
482 LLBL(x86_p3_2dr_skip):
483
484         ADD_L( CONST(16), EDI )
485         ADD_L( EAX, ESI )
486         CMP_L( ECX, EDI )
487         JNE( LLBL(x86_p3_2dr_loop) )
488
489 LLBL(x86_p3_2dr_done):
490
491         POP_L( EBX )
492         POP_L( EDI )
493         POP_L( ESI )
494         RET
495 #undef FRAME_OFFSET
496
497
498
499
500 ALIGNTEXT16
501 GLOBL GLNAME( _mesa_x86_transform_points3_2d_no_rot )
502 HIDDEN(_mesa_x86_transform_points3_2d_no_rot)
503 GLNAME( _mesa_x86_transform_points3_2d_no_rot ):
504
505 #define FRAME_OFFSET 12
506         PUSH_L( ESI )
507         PUSH_L( EDI )
508         PUSH_L( EBX )
509
510         MOV_L( ARG_SOURCE, ESI )
511         MOV_L( ARG_DEST, EDI )
512
513         MOV_L( ARG_MATRIX, EDX )
514         MOV_L( REGOFF(V4F_COUNT, ESI), ECX )
515
516         TEST_L( ECX, ECX )
517         JZ( LLBL(x86_p3_2dnrr_done) )
518
519         MOV_L( REGOFF(V4F_STRIDE, ESI), EAX )
520         OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) )
521
522         MOV_L( ECX, REGOFF(V4F_COUNT, EDI) )
523         MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) )
524
525         SHL_L( CONST(4), ECX )
526         MOV_L( REGOFF(V4F_START, ESI), ESI )
527
528         MOV_L( REGOFF(V4F_START, EDI), EDI )
529         ADD_L( EDI, ECX )
530
531 ALIGNTEXT16
532 LLBL(x86_p3_2dnrr_loop):
533
534         FLD_S( SRC0 )                   /* F4 */
535         FMUL_S( MAT0 )
536
537         FLD_S( SRC1 )                   /* F1 F4 */
538         FMUL_S( MAT5 )
539
540         FXCH( ST(1) )                   /* F4 F1 */
541         FADD_S( MAT12 )
542         FLD_S( MAT13 )          /* F5 F4 F1 */
543
544         FXCH( ST(2) )                   /* F1 F4 F5 */
545         FADDP( ST0, ST(2) )             /* F4 F5 */
546
547         MOV_L( SRC2, EBX )
548
549         FSTP_S( DST0 )          /* F5 */
550         FSTP_S( DST1 )          /* */
551         MOV_L( EBX, DST2 )
552
553 LLBL(x86_p3_2dnrr_skip):
554
555         ADD_L( CONST(16), EDI )
556         ADD_L( EAX, ESI )
557         CMP_L( ECX, EDI )
558         JNE( LLBL(x86_p3_2dnrr_loop) )
559
560 LLBL(x86_p3_2dnrr_done):
561
562         POP_L( EBX )
563         POP_L( EDI )
564         POP_L( ESI )
565         RET
566 #undef FRAME_OFFSET
567
568
569
570
571 ALIGNTEXT16
572 GLOBL GLNAME( _mesa_x86_transform_points3_identity )
573 HIDDEN(_mesa_x86_transform_points3_identity)
574 GLNAME(_mesa_x86_transform_points3_identity ):
575
576 #define FRAME_OFFSET 16
577         PUSH_L( ESI )
578         PUSH_L( EDI )
579         PUSH_L( EBX )
580         PUSH_L( EBP )
581
582         MOV_L( ARG_SOURCE, ESI )
583         MOV_L( ARG_DEST, EDI )
584
585         MOV_L( ARG_MATRIX, EDX )
586         MOV_L( REGOFF(V4F_COUNT, ESI), ECX )
587
588         TEST_L( ECX, ECX )
589         JZ( LLBL(x86_p3_ir_done) )
590
591         MOV_L( REGOFF(V4F_STRIDE, ESI), EAX )
592         OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) )
593
594         MOV_L( ECX, REGOFF(V4F_COUNT, EDI) )
595         MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) )
596
597         SHL_L( CONST(4), ECX )
598         MOV_L( REGOFF(V4F_START, ESI), ESI )
599
600         MOV_L( REGOFF(V4F_START, EDI), EDI )
601         ADD_L( EDI, ECX )
602
603         CMP_L( ESI, EDI )
604         JE( LLBL(x86_p3_ir_done) )
605
606 ALIGNTEXT16
607 LLBL(x86_p3_ir_loop):
608
609 #if 1
610         MOV_L( SRC0, EBX )
611         MOV_L( SRC1, EBP )
612         MOV_L( SRC2, EDX )
613
614         MOV_L( EBX, DST0 )
615         MOV_L( EBP, DST1 )
616         MOV_L( EDX, DST2 )
617 #else
618         FLD_S( SRC0 )
619         FLD_S( SRC1 )
620         FLD_S( SRC2 )
621
622         FSTP_S( DST2 )
623         FSTP_S( DST1 )
624         FSTP_S( DST0 )
625 #endif
626
627 LLBL(x86_p3_ir_skip):
628
629         ADD_L( CONST(16), EDI )
630         ADD_L( EAX, ESI )
631         CMP_L( ECX, EDI )
632         JNE( LLBL(x86_p3_ir_loop) )
633
634 LLBL(x86_p3_ir_done):
635
636         POP_L( EBP )
637         POP_L( EBX )
638         POP_L( EDI )
639         POP_L( ESI )
640         RET
641         
642 #if defined (__ELF__) && defined (__linux__)
643         .section .note.GNU-stack,"",%progbits
644 #endif