OSDN Git Service

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