[OPENGL32]
[reactos.git] / reactos / dll / opengl / 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