3 * Mesa 3-D graphics library
6 * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
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:
15 * The above copyright notice and this permission notice shall be included
16 * in all copies or substantial portions of the Software.
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.
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.
33 #include "xform_args.h"
37 #define FP_ONE 1065353216
40 #define SRC0 REGOFF(0, ESI)
41 #define SRC1 REGOFF(4, ESI)
42 #define SRC2 REGOFF(8, ESI)
43 #define SRC3 REGOFF(12, ESI)
44 #define DST0 REGOFF(0, EDI)
45 #define DST1 REGOFF(4, EDI)
46 #define DST2 REGOFF(8, EDI)
47 #define DST3 REGOFF(12, EDI)
48 #define MAT0 REGOFF(0, EDX)
49 #define MAT1 REGOFF(4, EDX)
50 #define MAT2 REGOFF(8, EDX)
51 #define MAT3 REGOFF(12, EDX)
52 #define MAT4 REGOFF(16, EDX)
53 #define MAT5 REGOFF(20, EDX)
54 #define MAT6 REGOFF(24, EDX)
55 #define MAT7 REGOFF(28, EDX)
56 #define MAT8 REGOFF(32, EDX)
57 #define MAT9 REGOFF(36, EDX)
58 #define MAT10 REGOFF(40, EDX)
59 #define MAT11 REGOFF(44, EDX)
60 #define MAT12 REGOFF(48, EDX)
61 #define MAT13 REGOFF(52, EDX)
62 #define MAT14 REGOFF(56, EDX)
63 #define MAT15 REGOFF(60, EDX)
67 GLOBL GLNAME( _mesa_x86_transform_points2_general )
68 HIDDEN(_mesa_x86_transform_points2_general)
69 GLNAME( _mesa_x86_transform_points2_general ):
71 #define FRAME_OFFSET 8
75 MOV_L( ARG_SOURCE, ESI )
76 MOV_L( ARG_DEST, EDI )
78 MOV_L( ARG_MATRIX, EDX )
79 MOV_L( REGOFF(V4F_COUNT, ESI), ECX )
82 JZ( LLBL(x86_p2_gr_done) )
84 MOV_L( REGOFF(V4F_STRIDE, ESI), EAX )
85 OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) )
87 MOV_L( ECX, REGOFF(V4F_COUNT, EDI) )
88 MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) )
90 SHL_L( CONST(4), ECX )
91 MOV_L( REGOFF(V4F_START, ESI), ESI )
93 MOV_L( REGOFF(V4F_START, EDI), EDI )
99 FLD_S( SRC0 ) /* F4 */
101 FLD_S( SRC0 ) /* F5 F4 */
103 FLD_S( SRC0 ) /* F6 F5 F4 */
105 FLD_S( SRC0 ) /* F7 F6 F5 F4 */
108 FLD_S( SRC1 ) /* F0 F7 F6 F5 F4 */
110 FLD_S( SRC1 ) /* F1 F0 F7 F6 F5 F4 */
112 FLD_S( SRC1 ) /* F2 F1 F0 F7 F6 F5 F4 */
114 FLD_S( SRC1 ) /* F3 F2 F1 F0 F7 F6 F5 F4 */
117 FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */
118 FADDP( ST0, ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */
119 FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */
120 FADDP( ST0, ST(5) ) /* F2 F3 F7 F6 F5 F4 */
121 FADDP( ST0, ST(3) ) /* F3 F7 F6 F5 F4 */
122 FADDP( ST0, ST(1) ) /* F7 F6 F5 F4 */
124 FXCH( ST(3) ) /* F4 F6 F5 F7 */
126 FXCH( ST(2) ) /* F5 F6 F4 F7 */
128 FXCH( ST(1) ) /* F6 F5 F4 F7 */
130 FXCH( ST(3) ) /* F7 F5 F4 F6 */
133 FXCH( ST(2) ) /* F4 F5 F7 F6 */
134 FSTP_S( DST0 ) /* F5 F7 F6 */
135 FSTP_S( DST1 ) /* F7 F6 */
136 FXCH( ST(1) ) /* F6 F7 */
137 FSTP_S( DST2 ) /* F7 */
140 LLBL(x86_p2_gr_skip):
142 ADD_L( CONST(16), EDI )
145 JNE( LLBL(x86_p2_gr_loop) )
147 LLBL(x86_p2_gr_done):
158 GLOBL GLNAME( _mesa_x86_transform_points2_perspective )
159 HIDDEN(_mesa_x86_transform_points2_perspective)
160 GLNAME( _mesa_x86_transform_points2_perspective ):
162 #define FRAME_OFFSET 12
167 MOV_L( ARG_SOURCE, ESI )
168 MOV_L( ARG_DEST, EDI )
170 MOV_L( ARG_MATRIX, EDX )
171 MOV_L( REGOFF(V4F_COUNT, ESI), ECX )
174 JZ( LLBL(x86_p2_pr_done) )
176 MOV_L( REGOFF(V4F_STRIDE, ESI), EAX )
177 OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) )
179 MOV_L( ECX, REGOFF(V4F_COUNT, EDI) )
180 MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) )
182 SHL_L( CONST(4), ECX )
183 MOV_L( REGOFF(V4F_START, ESI), ESI )
185 MOV_L( REGOFF(V4F_START, EDI), EDI )
191 LLBL(x86_p2_pr_loop):
193 FLD_S( SRC0 ) /* F4 */
196 FLD_S( SRC1 ) /* F1 F4 */
199 FXCH( ST(1) ) /* F4 F1 */
200 FSTP_S( DST0 ) /* F1 */
203 MOV_L( CONST(FP_ZERO), DST3 )
205 LLBL(x86_p2_pr_skip):
207 ADD_L( CONST(16), EDI )
210 JNE( LLBL(x86_p2_pr_loop) )
212 LLBL(x86_p2_pr_done):
224 GLOBL GLNAME( _mesa_x86_transform_points2_3d )
225 HIDDEN(_mesa_x86_transform_points2_3d)
226 GLNAME( _mesa_x86_transform_points2_3d ):
228 #define FRAME_OFFSET 8
232 MOV_L( ARG_SOURCE, ESI )
233 MOV_L( ARG_DEST, EDI )
235 MOV_L( ARG_MATRIX, EDX )
236 MOV_L( REGOFF(V4F_COUNT, ESI), ECX )
239 JZ( LLBL(x86_p2_3dr_done) )
241 MOV_L( REGOFF(V4F_STRIDE, ESI), EAX )
242 OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) )
244 MOV_L( ECX, REGOFF(V4F_COUNT, EDI) )
245 MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) )
247 SHL_L( CONST(4), ECX )
248 MOV_L( REGOFF(V4F_START, ESI), ESI )
250 MOV_L( REGOFF(V4F_START, EDI), EDI )
254 LLBL(x86_p2_3dr_loop):
256 FLD_S( SRC0 ) /* F4 */
258 FLD_S( SRC0 ) /* F5 F4 */
260 FLD_S( SRC0 ) /* F6 F5 F4 */
263 FLD_S( SRC1 ) /* F0 F6 F5 F4 */
265 FLD_S( SRC1 ) /* F1 F0 F6 F5 F4 */
267 FLD_S( SRC1 ) /* F2 F1 F0 F6 F5 F4 */
270 FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */
271 FADDP( ST0, ST(5) ) /* F1 F2 F6 F5 F4 */
272 FADDP( ST0, ST(3) ) /* F2 F6 F5 F4 */
273 FADDP( ST0, ST(1) ) /* F6 F5 F4 */
275 FXCH( ST(2) ) /* F4 F5 F6 */
277 FXCH( ST(1) ) /* F5 F4 F6 */
279 FXCH( ST(2) ) /* F6 F4 F5 */
282 FXCH( ST(1) ) /* F4 F6 F5 */
283 FSTP_S( DST0 ) /* F6 F5 */
284 FXCH( ST(1) ) /* F5 F6 */
285 FSTP_S( DST1 ) /* F6 */
288 LLBL(x86_p2_3dr_skip):
290 ADD_L( CONST(16), EDI )
293 JNE( LLBL(x86_p2_3dr_loop) )
295 LLBL(x86_p2_3dr_done):
306 GLOBL GLNAME( _mesa_x86_transform_points2_3d_no_rot )
307 HIDDEN(_mesa_x86_transform_points2_3d_no_rot)
308 GLNAME( _mesa_x86_transform_points2_3d_no_rot ):
310 #define FRAME_OFFSET 12
315 MOV_L( ARG_SOURCE, ESI )
316 MOV_L( ARG_DEST, EDI )
318 MOV_L( ARG_MATRIX, EDX )
319 MOV_L( REGOFF(V4F_COUNT, ESI), ECX )
322 JZ( LLBL(x86_p2_3dnrr_done) )
324 MOV_L( REGOFF(V4F_STRIDE, ESI), EAX )
325 OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) )
327 MOV_L( ECX, REGOFF(V4F_COUNT, EDI) )
328 MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) )
330 SHL_L( CONST(4), ECX )
331 MOV_L( REGOFF(V4F_START, ESI), ESI )
333 MOV_L( REGOFF(V4F_START, EDI), EDI )
339 LLBL(x86_p2_3dnrr_loop):
341 FLD_S( SRC0 ) /* F4 */
344 FLD_S( SRC1 ) /* F1 F4 */
347 FXCH( ST(1) ) /* F4 F1 */
349 FLD_S( MAT13 ) /* F5 F4 F1 */
350 FXCH( ST(2) ) /* F1 F4 F5 */
351 FADDP( ST0, ST(2) ) /* F4 F5 */
353 FSTP_S( DST0 ) /* F5 */
357 LLBL(x86_p2_3dnrr_skip):
359 ADD_L( CONST(16), EDI )
362 JNE( LLBL(x86_p2_3dnrr_loop) )
364 LLBL(x86_p2_3dnrr_done):
376 GLOBL GLNAME( _mesa_x86_transform_points2_2d )
377 HIDDEN(_mesa_x86_transform_points2_2d)
378 GLNAME( _mesa_x86_transform_points2_2d ):
380 #define FRAME_OFFSET 8
384 MOV_L( ARG_SOURCE, ESI )
385 MOV_L( ARG_DEST, EDI )
387 MOV_L( ARG_MATRIX, EDX )
388 MOV_L( REGOFF(V4F_COUNT, ESI), ECX )
391 JZ( LLBL(x86_p2_2dr_done) )
393 MOV_L( REGOFF(V4F_STRIDE, ESI), EAX )
394 OR_L( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, EDI) )
396 MOV_L( ECX, REGOFF(V4F_COUNT, EDI) )
397 MOV_L( CONST(2), REGOFF(V4F_SIZE, EDI) )
399 SHL_L( CONST(4), ECX )
400 MOV_L( REGOFF(V4F_START, ESI), ESI )
402 MOV_L( REGOFF(V4F_START, EDI), EDI )
406 LLBL(x86_p2_2dr_loop):
408 FLD_S( SRC0 ) /* F4 */
410 FLD_S( SRC0 ) /* F5 F4 */
413 FLD_S( SRC1 ) /* F0 F5 F4 */
415 FLD_S( SRC1 ) /* F1 F0 F5 F4 */
418 FXCH( ST(1) ) /* F0 F1 F5 F4 */
419 FADDP( ST0, ST(3) ) /* F1 F5 F4 */
420 FADDP( ST0, ST(1) ) /* F5 F4 */
422 FXCH( ST(1) ) /* F4 F5 */
424 FXCH( ST(1) ) /* F5 F4 */
427 FXCH( ST(1) ) /* F4 F5 */
428 FSTP_S( DST0 ) /* F5 */
431 LLBL(x86_p2_2dr_skip):
433 ADD_L( CONST(16), EDI )
436 JNE( LLBL(x86_p2_2dr_loop) )
438 LLBL(x86_p2_2dr_done):
449 GLOBL GLNAME( _mesa_x86_transform_points2_2d_no_rot )
450 HIDDEN(_mesa_x86_transform_points2_2d_no_rot)
451 GLNAME( _mesa_x86_transform_points2_2d_no_rot ):
453 #define FRAME_OFFSET 8
457 MOV_L( ARG_SOURCE, ESI )
458 MOV_L( ARG_DEST, EDI )
460 MOV_L( ARG_MATRIX, EDX )
461 MOV_L( REGOFF(V4F_COUNT, ESI), ECX )
464 JZ( LLBL(x86_p2_2dnrr_done) )
466 MOV_L( REGOFF(V4F_STRIDE, ESI), EAX )
467 OR_L( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, EDI) )
469 MOV_L( ECX, REGOFF(V4F_COUNT, EDI) )
470 MOV_L( CONST(2), REGOFF(V4F_SIZE, EDI) )
472 SHL_L( CONST(4), ECX )
473 MOV_L( REGOFF(V4F_START, ESI), ESI )
475 MOV_L( REGOFF(V4F_START, EDI), EDI )
479 LLBL(x86_p2_2dnrr_loop):
481 FLD_S( SRC0 ) /* F4 */
484 FLD_S( SRC1 ) /* F1 F4 */
487 FXCH( ST(1) ) /* F4 F1 */
489 FLD_S( MAT13 ) /* F5 F4 F1 */
490 FXCH( ST(2) ) /* F1 F4 F5 */
491 FADDP( ST0, ST(2) ) /* F4 F5 */
493 FSTP_S( DST0 ) /* F5 */
496 LLBL(x86_p2_2dnrr_skip):
498 ADD_L( CONST(16), EDI )
501 JNE( LLBL(x86_p2_2dnrr_loop) )
503 LLBL(x86_p2_2dnrr_done):
514 GLOBL GLNAME( _mesa_x86_transform_points2_identity )
515 HIDDEN(_mesa_x86_transform_points2_identity)
516 GLNAME( _mesa_x86_transform_points2_identity ):
518 #define FRAME_OFFSET 12
523 MOV_L( ARG_SOURCE, ESI )
524 MOV_L( ARG_DEST, EDI )
526 MOV_L( ARG_MATRIX, EDX )
527 MOV_L( REGOFF(V4F_COUNT, ESI), ECX )
530 JZ( LLBL(x86_p2_ir_done) )
532 MOV_L( REGOFF(V4F_STRIDE, ESI), EAX )
533 OR_L( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, EDI) )
535 MOV_L( ECX, REGOFF(V4F_COUNT, EDI) )
536 MOV_L( CONST(2), REGOFF(V4F_SIZE, EDI) )
538 SHL_L( CONST(4), ECX )
539 MOV_L( REGOFF(V4F_START, ESI), ESI )
541 MOV_L( REGOFF(V4F_START, EDI), EDI )
545 JE( LLBL(x86_p2_ir_done) )
548 LLBL(x86_p2_ir_loop):
556 LLBL(x86_p2_ir_skip):
558 ADD_L( CONST(16), EDI )
561 JNE( LLBL(x86_p2_ir_loop) )
563 LLBL(x86_p2_ir_done):
571 #if defined (__ELF__) && defined (__linux__)
572 .section .note.GNU-stack,"",%progbits