Tizen 2.0 Release
[profile/ivi/osmesa.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  * 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_points2_general )
69 HIDDEN(_mesa_x86_transform_points2_general)
70 GLNAME( _mesa_x86_transform_points2_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_p2_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_p2_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         FXCH( ST(3) )                   /* F4 F6 F5 F7 */
126         FADD_S( MAT12 )
127         FXCH( ST(2) )                   /* F5 F6 F4 F7 */
128         FADD_S( MAT13 )
129         FXCH( ST(1) )                   /* F6 F5 F4 F7 */
130         FADD_S( MAT14 )
131         FXCH( ST(3) )                   /* F7 F5 F4 F6 */
132         FADD_S( MAT15 )
133
134         FXCH( ST(2) )                   /* F4 F5 F7 F6 */
135         FSTP_S( DST0 )                  /* F5 F7 F6 */
136         FSTP_S( DST1 )                  /* F7 F6 */
137         FXCH( ST(1) )                   /* F6 F7 */
138         FSTP_S( DST2 )                  /* F7 */
139         FSTP_S( DST3 )                  /* */
140
141 LLBL(x86_p2_gr_skip):
142
143         ADD_L( CONST(16), EDI )
144         ADD_L( EAX, ESI )
145         CMP_L( ECX, EDI )
146         JNE( LLBL(x86_p2_gr_loop) )
147
148 LLBL(x86_p2_gr_done):
149
150         POP_L( EDI )
151         POP_L( ESI )
152         RET
153 #undef FRAME_OFFSET
154
155
156
157
158 ALIGNTEXT16
159 GLOBL GLNAME( _mesa_x86_transform_points2_perspective )
160 HIDDEN(_mesa_x86_transform_points2_perspective)
161 GLNAME( _mesa_x86_transform_points2_perspective ):
162
163 #define FRAME_OFFSET 12
164         PUSH_L( ESI )
165         PUSH_L( EDI )
166         PUSH_L( EBX )
167
168         MOV_L( ARG_SOURCE, ESI )
169         MOV_L( ARG_DEST, EDI )
170
171         MOV_L( ARG_MATRIX, EDX )
172         MOV_L( REGOFF(V4F_COUNT, ESI), ECX )
173
174         TEST_L( ECX, ECX )
175         JZ( LLBL(x86_p2_pr_done) )
176
177         MOV_L( REGOFF(V4F_STRIDE, ESI), EAX )
178         OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) )
179
180         MOV_L( ECX, REGOFF(V4F_COUNT, EDI) )
181         MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) )
182
183         SHL_L( CONST(4), ECX )
184         MOV_L( REGOFF(V4F_START, ESI), ESI )
185
186         MOV_L( REGOFF(V4F_START, EDI), EDI )
187         ADD_L( EDI, ECX )
188
189         MOV_L( MAT14, EBX )
190
191 ALIGNTEXT16
192 LLBL(x86_p2_pr_loop):
193
194         FLD_S( SRC0 )                   /* F4 */
195         FMUL_S( MAT0 )
196
197         FLD_S( SRC1 )                   /* F1 F4 */
198         FMUL_S( MAT5 )
199
200         FXCH( ST(1) )                   /* F4 F1 */
201         FSTP_S( DST0   )                /* F1 */
202         FSTP_S( DST1   )                /* */
203         MOV_L( EBX, DST2 )
204         MOV_L( CONST(FP_ZERO), DST3 )
205
206 LLBL(x86_p2_pr_skip):
207
208         ADD_L( CONST(16), EDI )
209         ADD_L( EAX, ESI )
210         CMP_L( ECX, EDI )
211         JNE( LLBL(x86_p2_pr_loop) )
212
213 LLBL(x86_p2_pr_done):
214
215         POP_L( EBX )
216         POP_L( EDI )
217         POP_L( ESI )
218         RET
219 #undef FRAME_OFFSET
220
221
222
223
224 ALIGNTEXT16
225 GLOBL GLNAME( _mesa_x86_transform_points2_3d )
226 HIDDEN(_mesa_x86_transform_points2_3d)
227 GLNAME( _mesa_x86_transform_points2_3d ):
228
229 #define FRAME_OFFSET 8
230         PUSH_L( ESI )
231         PUSH_L( EDI )
232
233         MOV_L( ARG_SOURCE, ESI )
234         MOV_L( ARG_DEST, EDI )
235
236         MOV_L( ARG_MATRIX, EDX )
237         MOV_L( REGOFF(V4F_COUNT, ESI), ECX )
238
239         TEST_L( ECX, ECX )
240         JZ( LLBL(x86_p2_3dr_done) )
241
242         MOV_L( REGOFF(V4F_STRIDE, ESI), EAX )
243         OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) )
244
245         MOV_L( ECX, REGOFF(V4F_COUNT, EDI) )
246         MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) )
247
248         SHL_L( CONST(4), ECX )
249         MOV_L( REGOFF(V4F_START, ESI), ESI )
250
251         MOV_L( REGOFF(V4F_START, EDI), EDI )
252         ADD_L( EDI, ECX )
253
254 ALIGNTEXT16
255 LLBL(x86_p2_3dr_loop):
256
257         FLD_S( SRC0 )                   /* F4 */
258         FMUL_S( MAT0 )
259         FLD_S( SRC0 )                   /* F5 F4 */
260         FMUL_S( MAT1 )
261         FLD_S( SRC0 )                   /* F6 F5 F4 */
262         FMUL_S( MAT2 )
263
264         FLD_S( SRC1 )                   /* F0 F6 F5 F4 */
265         FMUL_S( MAT4 )
266         FLD_S( SRC1 )                   /* F1 F0 F6 F5 F4 */
267         FMUL_S( MAT5 )
268         FLD_S( SRC1 )                   /* F2 F1 F0 F6 F5 F4 */
269         FMUL_S( MAT6 )
270
271         FXCH( ST(2) )                   /* F0 F1 F2 F6 F5 F4 */
272         FADDP( ST0, ST(5) )             /* F1 F2 F6 F5 F4 */
273         FADDP( ST0, ST(3) )             /* F2 F6 F5 F4 */
274         FADDP( ST0, ST(1) )             /* F6 F5 F4 */
275
276         FXCH( ST(2) )                   /* F4 F5 F6 */
277         FADD_S( MAT12 )
278         FXCH( ST(1) )                   /* F5 F4 F6 */
279         FADD_S( MAT13 )
280         FXCH( ST(2) )                   /* F6 F4 F5 */
281         FADD_S( MAT14 )
282
283         FXCH( ST(1) )                   /* F4 F6 F5 */
284         FSTP_S( DST0 )                  /* F6 F5 */
285         FXCH( ST(1) )                   /* F5 F6 */
286         FSTP_S( DST1 )                  /* F6 */
287         FSTP_S( DST2 )                  /* */
288
289 LLBL(x86_p2_3dr_skip):
290
291         ADD_L( CONST(16), EDI )
292         ADD_L( EAX, ESI )
293         CMP_L( ECX, EDI )
294         JNE( LLBL(x86_p2_3dr_loop) )
295
296 LLBL(x86_p2_3dr_done):
297
298         POP_L( EDI )
299         POP_L( ESI )
300         RET
301 #undef FRAME_OFFSET
302
303
304
305
306 ALIGNTEXT16
307 GLOBL GLNAME( _mesa_x86_transform_points2_3d_no_rot )
308 HIDDEN(_mesa_x86_transform_points2_3d_no_rot)
309 GLNAME( _mesa_x86_transform_points2_3d_no_rot ):
310
311 #define FRAME_OFFSET 12
312         PUSH_L( ESI )
313         PUSH_L( EDI )
314         PUSH_L( EBX )
315
316         MOV_L( ARG_SOURCE, ESI )
317         MOV_L( ARG_DEST, EDI )
318
319         MOV_L( ARG_MATRIX, EDX )
320         MOV_L( REGOFF(V4F_COUNT, ESI), ECX )
321
322         TEST_L( ECX, ECX )
323         JZ( LLBL(x86_p2_3dnrr_done) )
324
325         MOV_L( REGOFF(V4F_STRIDE, ESI), EAX )
326         OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) )
327
328         MOV_L( ECX, REGOFF(V4F_COUNT, EDI) )
329         MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) )
330
331         SHL_L( CONST(4), ECX )
332         MOV_L( REGOFF(V4F_START, ESI), ESI )
333
334         MOV_L( REGOFF(V4F_START, EDI), EDI )
335         ADD_L( EDI, ECX )
336
337         MOV_L( MAT14, EBX )
338
339 ALIGNTEXT16
340 LLBL(x86_p2_3dnrr_loop):
341
342         FLD_S( SRC0 )                   /* F4 */
343         FMUL_S( MAT0 )
344
345         FLD_S( SRC1 )                   /* F1 F4 */
346         FMUL_S( MAT5 )
347
348         FXCH( ST(1) )                   /* F4 F1 */
349         FADD_S( MAT12 )
350         FLD_S( MAT13 )          /* F5 F4 F1 */
351         FXCH( ST(2) )                   /* F1 F4 F5 */
352         FADDP( ST0, ST(2) )             /* F4 F5 */
353
354         FSTP_S( DST0 )          /* F5 */
355         FSTP_S( DST1 )          /* */
356         MOV_L( EBX, DST2 )
357
358 LLBL(x86_p2_3dnrr_skip):
359
360         ADD_L( CONST(16), EDI )
361         ADD_L( EAX, ESI )
362         CMP_L( ECX, EDI )
363         JNE( LLBL(x86_p2_3dnrr_loop) )
364
365 LLBL(x86_p2_3dnrr_done):
366
367         POP_L( EBX )
368         POP_L( EDI )
369         POP_L( ESI )
370         RET
371 #undef FRAME_OFFSET
372
373
374
375
376 ALIGNTEXT16
377 GLOBL GLNAME( _mesa_x86_transform_points2_2d )
378 HIDDEN(_mesa_x86_transform_points2_2d)
379 GLNAME( _mesa_x86_transform_points2_2d ):
380
381 #define FRAME_OFFSET 8
382         PUSH_L( ESI )
383         PUSH_L( EDI )
384
385         MOV_L( ARG_SOURCE, ESI )
386         MOV_L( ARG_DEST, EDI )
387
388         MOV_L( ARG_MATRIX, EDX )
389         MOV_L( REGOFF(V4F_COUNT, ESI), ECX )
390
391         TEST_L( ECX, ECX )
392         JZ( LLBL(x86_p2_2dr_done) )
393
394         MOV_L( REGOFF(V4F_STRIDE, ESI), EAX )
395         OR_L( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, EDI) )
396
397         MOV_L( ECX, REGOFF(V4F_COUNT, EDI) )
398         MOV_L( CONST(2), REGOFF(V4F_SIZE, EDI) )
399
400         SHL_L( CONST(4), ECX )
401         MOV_L( REGOFF(V4F_START, ESI), ESI )
402
403         MOV_L( REGOFF(V4F_START, EDI), EDI )
404         ADD_L( EDI, ECX )
405
406 ALIGNTEXT16
407 LLBL(x86_p2_2dr_loop):
408
409         FLD_S( SRC0 )                   /* F4 */
410         FMUL_S( MAT0 )
411         FLD_S( SRC0 )                   /* F5 F4 */
412         FMUL_S( MAT1 )
413
414         FLD_S( SRC1 )                   /* F0 F5 F4 */
415         FMUL_S( MAT4 )
416         FLD_S( SRC1 )                   /* F1 F0 F5 F4 */
417         FMUL_S( MAT5 )
418
419         FXCH( ST(1) )                   /* F0 F1 F5 F4 */
420         FADDP( ST0, ST(3) )             /* F1 F5 F4 */
421         FADDP( ST0, ST(1) )             /* F5 F4 */
422
423         FXCH( ST(1) )                   /* F4 F5 */
424         FADD_S( MAT12 )
425         FXCH( ST(1) )                   /* F5 F4 */
426         FADD_S( MAT13 )
427
428         FXCH( ST(1) )                   /* F4 F5 */
429         FSTP_S( DST0 )          /* F5 */
430         FSTP_S( DST1 )          /* */
431
432 LLBL(x86_p2_2dr_skip):
433
434         ADD_L( CONST(16), EDI )
435         ADD_L( EAX, ESI )
436         CMP_L( ECX, EDI )
437         JNE( LLBL(x86_p2_2dr_loop) )
438
439 LLBL(x86_p2_2dr_done):
440
441         POP_L( EDI )
442         POP_L( ESI )
443         RET
444 #undef FRAME_OFFSET
445
446
447
448
449 ALIGNTEXT4
450 GLOBL GLNAME( _mesa_x86_transform_points2_2d_no_rot )
451 HIDDEN(_mesa_x86_transform_points2_2d_no_rot)
452 GLNAME( _mesa_x86_transform_points2_2d_no_rot ):
453
454 #define FRAME_OFFSET 8
455         PUSH_L( ESI )
456         PUSH_L( EDI )
457
458         MOV_L( ARG_SOURCE, ESI )
459         MOV_L( ARG_DEST, EDI )
460
461         MOV_L( ARG_MATRIX, EDX )
462         MOV_L( REGOFF(V4F_COUNT, ESI), ECX )
463
464         TEST_L( ECX, ECX )
465         JZ( LLBL(x86_p2_2dnrr_done) )
466
467         MOV_L( REGOFF(V4F_STRIDE, ESI), EAX )
468         OR_L( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, EDI) )
469
470         MOV_L( ECX, REGOFF(V4F_COUNT, EDI) )
471         MOV_L( CONST(2), REGOFF(V4F_SIZE, EDI) )
472
473         SHL_L( CONST(4), ECX )
474         MOV_L( REGOFF(V4F_START, ESI), ESI )
475
476         MOV_L( REGOFF(V4F_START, EDI), EDI )
477         ADD_L( EDI, ECX )
478
479 ALIGNTEXT16
480 LLBL(x86_p2_2dnrr_loop):
481
482         FLD_S( SRC0 )                   /* F4 */
483         FMUL_S( MAT0 )
484
485         FLD_S( SRC1 )                   /* F1 F4 */
486         FMUL_S( MAT5 )
487
488         FXCH( ST(1) )                   /* F4 F1 */
489         FADD_S( MAT12 )
490         FLD_S( MAT13 )          /* F5 F4 F1 */
491         FXCH( ST(2) )                   /* F1 F4 F5 */
492         FADDP( ST0, ST(2) )             /* F4 F5 */
493
494         FSTP_S( DST0   )                /* F5 */
495         FSTP_S( DST1   )                /* */
496
497 LLBL(x86_p2_2dnrr_skip):
498
499         ADD_L( CONST(16), EDI )
500         ADD_L( EAX, ESI )
501         CMP_L( ECX, EDI )
502         JNE( LLBL(x86_p2_2dnrr_loop) )
503
504 LLBL(x86_p2_2dnrr_done):
505
506         POP_L( EDI )
507         POP_L( ESI )
508         RET
509 #undef FRAME_OFFSET
510
511
512
513
514 ALIGNTEXT16
515 GLOBL GLNAME( _mesa_x86_transform_points2_identity )
516 HIDDEN(_mesa_x86_transform_points2_identity)
517 GLNAME( _mesa_x86_transform_points2_identity ):
518
519 #define FRAME_OFFSET 12
520         PUSH_L( ESI )
521         PUSH_L( EDI )
522         PUSH_L( EBX )
523
524         MOV_L( ARG_SOURCE, ESI )
525         MOV_L( ARG_DEST, EDI )
526
527         MOV_L( ARG_MATRIX, EDX )
528         MOV_L( REGOFF(V4F_COUNT, ESI), ECX )
529
530         TEST_L( ECX, ECX )
531         JZ( LLBL(x86_p2_ir_done) )
532
533         MOV_L( REGOFF(V4F_STRIDE, ESI), EAX )
534         OR_L( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, EDI) )
535
536         MOV_L( ECX, REGOFF(V4F_COUNT, EDI) )
537         MOV_L( CONST(2), REGOFF(V4F_SIZE, EDI) )
538
539         SHL_L( CONST(4), ECX )
540         MOV_L( REGOFF(V4F_START, ESI), ESI )
541
542         MOV_L( REGOFF(V4F_START, EDI), EDI )
543         ADD_L( EDI, ECX )
544
545         CMP_L( ESI, EDI )
546         JE( LLBL(x86_p2_ir_done) )
547
548 ALIGNTEXT16
549 LLBL(x86_p2_ir_loop):
550
551         MOV_L( SRC0, EBX )
552         MOV_L( SRC1, EDX )
553
554         MOV_L( EBX, DST0 )
555         MOV_L( EDX, DST1 )
556
557 LLBL(x86_p2_ir_skip):
558
559         ADD_L( CONST(16), EDI )
560         ADD_L( EAX, ESI )
561         CMP_L( ECX, EDI )
562         JNE( LLBL(x86_p2_ir_loop) )
563
564 LLBL(x86_p2_ir_done):
565
566         POP_L( EBX )
567         POP_L( EDI )
568         POP_L( ESI )
569         RET
570 #undef FRAME_OFFSET
571         
572 #if defined (__ELF__) && defined (__linux__)
573         .section .note.GNU-stack,"",%progbits
574 #endif