Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1901 serge 1
 
2
 * Mesa 3-D graphics library
3
 * Version:  3.5
4
 *
5
 * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
6
 *
7
 * Permission is hereby granted, free of charge, to any person obtaining a
8
 * copy of this software and associated documentation files (the "Software"),
9
 * to deal in the Software without restriction, including without limitation
10
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11
 * and/or sell copies of the Software, and to permit persons to whom the
12
 * Software is furnished to do so, subject to the following conditions:
13
 *
14
 * The above copyright notice and this permission notice shall be included
15
 * in all copies or substantial portions of the Software.
16
 *
17
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
 */
24
25
 
26
#include "assyntax.h"
27
#include "matypes.h"
28
#include "xform_args.h"
29
30
 
31
32
 
33
34
 
35
 
36
GLOBL GLNAME( _mesa_3dnow_transform_points4_general )
37
HIDDEN(_mesa_3dnow_transform_points4_general)
38
GLNAME( _mesa_3dnow_transform_points4_general ):
39
40
 
41
42
 
43
    MOV_L     ( ARG_MATRIX, ESI )
44
    MOV_L     ( ARG_SOURCE, EAX )
45
    MOV_L     ( CONST(4), REGOFF(V4F_SIZE, ECX) )
46
    OR_B      ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) )
47
    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
48
    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
49
50
 
51
52
 
53
    MOV_L     ( ESI, ECX )
54
    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
55
    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
56
    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
57
58
 
59
    JZ        ( LLBL( G3TPGR_2 ) )
60
61
 
62
63
 
64
LLBL( G3TPGR_1 ):
65
66
 
67
68
 
69
    MOVQ      ( REGOFF(8, EAX), MM4 )	/* x3            | x2                */
70
71
 
72
    PREFETCH  ( REGIND(EAX) )
73
74
 
75
    MOVQ      ( MM4, MM6 )		/* x3              | x2              */
76
77
 
78
    PUNPCKHDQ ( MM2, MM2 )		/* x1              | x1              */
79
80
 
81
    ADD_L     ( CONST(16), EDX )	/* next r                            */
82
83
 
84
    MOVQ      ( MM2, MM3 )		/* x1              | x1              */
85
86
 
87
    PUNPCKLDQ ( MM4, MM4 )		/* x2              | x2              */
88
89
 
90
    MOVQ      ( MM4, MM5 )		/* x2              | x2              */
91
92
 
93
    PUNPCKHDQ ( MM6, MM6 )		/* x3              | x3              */
94
95
 
96
    MOVQ      ( MM6, MM7 )		/* x3              | x3              */
97
98
 
99
    PFADD     ( MM0, MM2 )
100
101
 
102
    PFADD     ( MM1, MM3 )
103
104
 
105
    PFADD     ( MM4, MM6 )
106
107
 
108
    PFADD     ( MM2, MM6 )
109
110
 
111
    MOVQ      ( MM6, REGOFF(-16, EDX) )
112
113
 
114
115
 
116
    JNZ       ( LLBL( G3TPGR_1 ) )	/* cnt > 0 ? -> process next vertex  */
117
118
 
119
120
 
121
    POP_L     ( EDI )
122
    POP_L     ( ESI )
123
    RET
124
125
 
126
 
127
 
128
 
129
GLOBL GLNAME( _mesa_3dnow_transform_points4_perspective )
130
HIDDEN(_mesa_3dnow_transform_points4_perspective)
131
GLNAME( _mesa_3dnow_transform_points4_perspective ):
132
133
 
134
135
 
136
    MOV_L     ( ARG_MATRIX, ESI )
137
    MOV_L     ( ARG_SOURCE, EAX )
138
    MOV_L     ( CONST(4), REGOFF(V4F_SIZE, ECX) )
139
    OR_B      ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) )
140
    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
141
    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
142
143
 
144
145
 
146
    MOV_L     ( ESI, ECX )
147
    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
148
    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
149
    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
150
151
 
152
    JZ        ( LLBL( G3TPPR_2 ) )
153
154
 
155
    PREFETCHW ( REGIND(EDX) )
156
157
 
158
    PUNPCKLDQ ( REGOFF(20, ECX), MM0 )	/* m11             | m00             */
159
160
 
161
    PUNPCKLDQ ( REGOFF(56, ECX), MM1 )	/* m32             | m22             */
162
163
 
164
    PXOR      ( MM7, MM7 )		/* 0               | 0               */
165
166
 
167
LLBL( G3TPPR_1 ):
168
169
 
170
171
 
172
    MOVQ      ( REGOFF(8, EAX), MM5 )	/* x3              | x2              */
173
    MOVD      ( REGOFF(8, EAX), MM3 )	/*                 | x2              */
174
175
 
176
    PREFETCH  ( REGOFF(32, EAX) )	/* hopefully stride is zero          */
177
178
 
179
    PFMUL     ( MM0, MM4 )		/* x1*m11          | x0*m00          */
180
181
 
182
    ADD_L     ( CONST(16), EDX )	/* next r                            */
183
184
 
185
    PFSUBR    ( MM7, MM3 )		/*                 | -x2             */
186
187
 
188
    PFADD     ( MM4, MM5 )		/* x1*m11+x2*m21   | x0*m00+x2*m20   */
189
190
 
191
    MOVQ      ( MM5, REGOFF(-16, EDX) )	/* write r0, r1                      */
192
193
 
194
    DEC_L     ( ESI )			/* decrement vertex counter          */
195
196
 
197
198
 
199
200
 
201
    POP_L     ( EDI )
202
    POP_L     ( ESI )
203
    RET
204
205
 
206
 
207
 
208
 
209
GLOBL GLNAME( _mesa_3dnow_transform_points4_3d )
210
HIDDEN(_mesa_3dnow_transform_points4_3d)
211
GLNAME( _mesa_3dnow_transform_points4_3d ):
212
213
 
214
215
 
216
    MOV_L     ( ARG_MATRIX, ESI )
217
    MOV_L     ( ARG_SOURCE, EAX )
218
    MOV_L     ( CONST(4), REGOFF(V4F_SIZE, ECX) )
219
    OR_B      ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) )
220
    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
221
    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
222
223
 
224
225
 
226
    MOV_L     ( ESI, ECX )
227
    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
228
    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
229
    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
230
231
 
232
    JZ        ( LLBL( G3TP3R_2 ) )
233
234
 
235
    PUNPCKLDQ ( REGOFF(24, ECX), MM6 )	/* m6              | m2              */
236
237
 
238
    PUNPCKLDQ ( REGOFF(56, ECX), MM7 )	/* m14             | m10             */
239
240
 
241
LLBL( G3TP3R_1 ):
242
243
 
244
    PREFETCH  ( REGOFF(32, EAX) )	/* hopefully array is tightly packed */
245
246
 
247
    MOVQ      ( REGOFF(8, EAX), MM3 )	/* x3              | x2              */
248
249
 
250
    MOVQ      ( MM3, MM4 )		/* x3              | x2              */
251
252
 
253
    MOVQ      ( MM4, MM5 )		/* x3              | x2              */
254
255
 
256
    PUNPCKHDQ ( MM1, MM1 )		/* x1              | x1              */
257
258
 
259
    PUNPCKLDQ ( MM3, MM3 )		/* x2              | x2              */
260
261
 
262
    PUNPCKHDQ ( MM4, MM4 )		/* x3              | x3              */
263
264
 
265
    PFADD     ( MM0, MM1 )		/* x0*m1+x1*m5     | x0*m0+x1*m4     */
266
267
 
268
    ADD_L     ( CONST(16), EDX )	/* next r                            */
269
270
 
271
    PFADD     ( MM1, MM3 )		/* x0*m1+..+x2*m9  | x0*m0+...+x2*m8 */
272
273
 
274
    PFADD     ( MM3, MM4 )		/* r1              | r0              */
275
276
 
277
    MOVD      ( REGOFF(12, EAX), MM0 )	/*                 | x3              */
278
279
 
280
    PFACC     ( MM0, MM5 )		/* r3              | r2              */
281
282
 
283
    MOVQ      ( MM5, REGOFF(-8, EDX) )	/* write r2, r3                      */
284
285
 
286
    JNZ       ( LLBL( G3TP3R_1 ) )	/* cnt > 0 ? -> process next vertex  */
287
288
 
289
290
 
291
    POP_L     ( EDI )
292
    POP_L     ( ESI )
293
    RET
294
295
 
296
 
297
 
298
 
299
GLOBL GLNAME( _mesa_3dnow_transform_points4_3d_no_rot )
300
HIDDEN(_mesa_3dnow_transform_points4_3d_no_rot)
301
GLNAME( _mesa_3dnow_transform_points4_3d_no_rot ):
302
303
 
304
    MOV_L     ( ARG_DEST, ECX )
305
    MOV_L     ( ARG_MATRIX, ESI )
306
    MOV_L     ( ARG_SOURCE, EAX )
307
    MOV_L     ( CONST(4), REGOFF(V4F_SIZE, ECX) )
308
    OR_B      ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) )
309
    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
310
    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
311
312
 
313
314
 
315
    MOV_L     ( ESI, ECX )
316
    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
317
    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
318
    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
319
320
 
321
    JZ        ( LLBL( G3TP3NRR_2 ) )
322
323
 
324
    PUNPCKLDQ ( REGOFF(20, ECX), MM0 )	/* m11             | m00             */
325
326
 
327
    PUNPCKLDQ ( REGOFF(56, ECX), MM2 )	/* m32             | m22             */
328
329
 
330
331
 
332
LLBL( G3TP3NRR_1 ):
333
334
 
335
336
 
337
    MOVQ      ( REGOFF(8, EAX), MM5 )	/* x3              | x2              */
338
    MOVD      ( REGOFF(12, EAX), MM7 )	/*                 | x3              */
339
340
 
341
    PREFETCH  ( REGOFF(32, EAX) )	/* hopefully stride is zero          */
342
343
 
344
    PFMUL     ( MM0, MM4 )		/* x1*m11          | x0*m00          */
345
346
 
347
    PFMUL     ( MM2, MM5 )		/* x3*m32          | x2*m22          */
348
349
 
350
    PFACC     ( MM7, MM5 )		/* x3              | x2*m22+x3*m32   */
351
352
 
353
    ADD_L     ( CONST(16), EDX )	/* next r                            */
354
355
 
356
    MOVQ      ( MM5, REGOFF(-8, EDX) )	/* write r2, r3                      */
357
358
 
359
    JNZ       ( LLBL( G3TP3NRR_1 ) )	/* cnt > 0 ? -> process next vertex  */
360
361
 
362
363
 
364
    POP_L     ( EDI )
365
    POP_L     ( ESI )
366
    RET
367
368
 
369
 
370
 
371
 
372
GLOBL GLNAME( _mesa_3dnow_transform_points4_2d )
373
HIDDEN(_mesa_3dnow_transform_points4_2d)
374
GLNAME( _mesa_3dnow_transform_points4_2d ):
375
376
 
377
378
 
379
    MOV_L     ( ARG_MATRIX, ESI )
380
    MOV_L     ( ARG_SOURCE, EAX )
381
    MOV_L     ( CONST(4), REGOFF(V4F_SIZE, ECX) )
382
    OR_B      ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) )
383
    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
384
    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
385
386
 
387
388
 
389
    MOV_L     ( ESI, ECX )
390
    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
391
    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
392
    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
393
394
 
395
    JZ        ( LLBL( G3TP2R_2 ) )
396
397
 
398
    PUNPCKLDQ ( REGOFF(16, ECX), MM0 )	/* m10             | m00             */
399
400
 
401
    PUNPCKLDQ ( REGOFF(20, ECX), MM1 )	/* m11             | m01             */
402
403
 
404
405
 
406
LLBL( G3TP2R_1 ):
407
408
 
409
410
 
411
    MOVQ      ( REGOFF(8, EAX), MM5 )	/* x3              | x2              */
412
413
 
414
    PREFETCH  ( REGIND(EAX) )
415
416
 
417
    MOVQ      ( MM5, MM6 )		/* x3              | x2              */
418
419
 
420
    PUNPCKHDQ ( MM6, MM6 )		/* x3              | x3              */
421
422
 
423
    ADD_L     ( CONST(16), EDX )	/* next r                            */
424
425
 
426
    PFMUL     ( MM2, MM6 )		/* x3*m31          | x3*m30          */
427
428
 
429
    MOVQ      ( MM5, REGOFF(-8, EDX) )	/* write r2, r3                      */
430
431
 
432
433
 
434
    JNZ       ( LLBL( G3TP2R_1 ) )	/* cnt > 0 ? -> process next vertex  */
435
436
 
437
438
 
439
    POP_L     ( EDI )
440
    POP_L     ( ESI )
441
    RET
442
443
 
444
 
445
 
446
 
447
GLOBL GLNAME( _mesa_3dnow_transform_points4_2d_no_rot )
448
HIDDEN(_mesa_3dnow_transform_points4_2d_no_rot)
449
GLNAME( _mesa_3dnow_transform_points4_2d_no_rot ):
450
451
 
452
453
 
454
    MOV_L     ( ARG_MATRIX, ESI )
455
    MOV_L     ( ARG_SOURCE, EAX )
456
    MOV_L     ( CONST(4), REGOFF(V4F_SIZE, ECX) )
457
    OR_B      ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) )
458
    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
459
    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
460
461
 
462
463
 
464
    MOV_L     ( ESI, ECX )
465
    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
466
    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
467
    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
468
469
 
470
    JZ        ( LLBL( G3TP2NRR_3 ) )
471
472
 
473
    PUNPCKLDQ ( REGOFF(20, ECX), MM0 )	/* m11             | m00             */
474
475
 
476
477
 
478
LLBL( G3TP2NRR_2 ):
479
480
 
481
482
 
483
    MOVQ      ( REGOFF(8, EAX), MM5 )	/* x3              | x2              */
484
485
 
486
    PREFETCH  ( REGIND(EAX) )
487
488
 
489
    MOVQ      ( MM5, MM6 )		/* x3              | x2              */
490
491
 
492
    PUNPCKHDQ ( MM6, MM6 )		/* x3              | x3              */
493
494
 
495
    PFADD     ( MM4, MM6 )		/* x1*m11+x3*m31   | x0*m00+x3*m30   */
496
497
 
498
    MOVQ      ( MM5, REGOFF(-8, EDX) )	/* write r2, r3                      */
499
500
 
501
502
 
503
504
 
505
506
 
507
    POP_L     ( EDI )
508
    POP_L     ( ESI )
509
    RET
510
511
 
512
 
513
 
514
 
515
GLOBL GLNAME( _mesa_3dnow_transform_points4_identity )
516
HIDDEN(_mesa_3dnow_transform_points4_identity)
517
GLNAME( _mesa_3dnow_transform_points4_identity ):
518
519
 
520
521
 
522
    MOV_L     ( ARG_MATRIX, ESI )
523
    MOV_L     ( ARG_SOURCE, EAX )
524
    MOV_L     ( CONST(4), REGOFF(V4F_SIZE, ECX) )
525
    OR_B      ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) )
526
    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
527
    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
528
529
 
530
531
 
532
    MOV_L     ( ESI, ECX )
533
    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
534
    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
535
    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
536
537
 
538
    JZ        ( LLBL( G3TPIR_2 ) )
539
540
 
541
LLBL( G3TPIR_1 ):
542
543
 
544
545
 
546
    MOVQ      ( REGOFF(8, EAX), MM1 )	/* x3              | x2              */
547
548
 
549
    PREFETCH  ( REGIND(EAX) )
550
551
 
552
    MOVQ      ( MM0, REGOFF(-16, EDX) )	/* r1              | r0              */
553
554
 
555
556
 
557
    JNZ       ( LLBL( G3TPIR_1 ) )	/* cnt > 0 ? -> process next vertex  */
558
559
 
560
561
 
562
    POP_L     ( EDI )
563
    POP_L     ( ESI )
564
    RET
565
#endif
566
567
 
568
	.section .note.GNU-stack,"",%progbits
569
#endif
570