Subversion Repositories shark

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
70 giacomo 1
/* $Id: 3dnow_xform2.s,v 1.1 2003-03-13 12:11:48 giacomo Exp $ */
2
 
3
/*
4
 * Mesa 3-D graphics library
5
 * Version:  3.5
6
 *
7
 * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
8
 *
9
 * Permission is hereby granted, free of charge, to any person obtaining a
10
 * copy of this software and associated documentation files (the "Software"),
11
 * to deal in the Software without restriction, including without limitation
12
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13
 * and/or sell copies of the Software, and to permit persons to whom the
14
 * Software is furnished to do so, subject to the following conditions:
15
 *
16
 * The above copyright notice and this permission notice shall be included
17
 * in all copies or substantial portions of the Software.
18
 *
19
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
 */
26
 
27
#include "matypes.h"
28
#include "xform_args.h"
29
 
30
    SEG_TEXT
31
 
32
#define FRAME_OFFSET	4
33
 
34
 
35
ALIGNTEXT16
36
GLOBL GLNAME( _mesa_3dnow_transform_points2_general )
37
GLNAME( _mesa_3dnow_transform_points2_general ):
38
 
39
    PUSH_L    ( ESI )
40
 
41
    MOV_L     ( ARG_DEST, ECX )
42
    MOV_L     ( ARG_MATRIX, ESI )
43
    MOV_L     ( ARG_SOURCE, EAX )
44
    MOV_L     ( CONST(4), REGOFF(V4F_SIZE, ECX) )
45
    OR_B      ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) )
46
    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
47
    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
48
 
49
    PUSH_L    ( EDI )
50
 
51
    MOV_L     ( REGOFF(V4F_START, ECX), EDX )
52
    MOV_L     ( ESI, ECX )
53
    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
54
    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
55
    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
56
 
57
    TEST_L    ( ESI, ESI )
58
    JZ        ( LLBL( G3TPGR_3 ) )
59
 
60
    MOVD      ( REGIND(ECX), MM0 )	/*                 | m00             */
61
    PUNPCKLDQ ( REGOFF(16, ECX), MM0 )	/* m10             | m00             */
62
 
63
    MOVD      ( REGOFF(4, ECX), MM1 )	/*                 | m01             */
64
    PUNPCKLDQ ( REGOFF(20, ECX), MM1 )	/* m11             | m01             */
65
 
66
    MOVD      ( REGOFF(8, ECX), MM2 )	/*                 | m02             */
67
    PUNPCKLDQ ( REGOFF(24, ECX), MM2 )	/* m12             | m02             */
68
 
69
    MOVD      ( REGOFF(12, ECX), MM3 )	/*                 | m03             */
70
    PUNPCKLDQ ( REGOFF(28, ECX), MM3 )	/* m13             | m03             */
71
 
72
    MOVQ      ( REGOFF(48, ECX), MM4 )	/* m31             | m30             */
73
    MOVQ      ( REGOFF(56, ECX), MM5 )	/* m33             | m32             */
74
 
75
ALIGNTEXT16
76
LLBL( G3TPGR_2 ):
77
 
78
    MOVQ      ( REGIND(EAX), MM6 )	/* x1              | x0              */
79
    MOVQ      ( MM6, MM7 )		/* x1              | x0              */
80
 
81
    PFMUL     ( MM0, MM6 )		/* x1*m10          | x0*m00          */
82
    PFMUL     ( MM1, MM7 )		/* x1*m11          | x0*m01          */
83
 
84
    PFACC     ( MM7, MM6 )		/* x0*m01+x1*m11   | x0*x00+x1*m10   */
85
    PFADD     ( MM4, MM6 )		/* x0*...*m11+m31  | x0*...*m10+m30  */
86
 
87
    MOVQ      ( MM6, REGIND(EDX) )	/* write r1, r0                      */
88
    MOVQ      ( REGIND(EAX), MM6 )	/* x1              | x0              */
89
 
90
    MOVQ      ( MM6, MM7 )		/* x1              | x0              */
91
    PFMUL     ( MM2, MM6 )		/* x1*m12          | x0*m02          */
92
 
93
    PFMUL     ( MM3, MM7 )		/* x1*m13          | x0*m03          */
94
    ADD_L     ( EDI, EAX )		/* next vertex                       */
95
 
96
    PFACC     ( MM7, MM6 )		/* x0*m03+x1*m13   | x0*x02+x1*m12   */
97
    PFADD     ( MM5, MM6 )		/* x0*...*m13+m33  | x0*...*m12+m32  */
98
 
99
    MOVQ      ( MM6, REGOFF(8, EDX) )	/* write r3, r2                      */
100
    ADD_L     ( CONST(16), EDX )	/* next r                            */
101
 
102
    DEC_L     ( ESI )			/* decrement vertex counter          */
103
    JNZ       ( LLBL( G3TPGR_2 ) )	/* cnt > 0 ? -> process next vertex  */
104
 
105
LLBL( G3TPGR_3 ):
106
 
107
    FEMMS
108
    POP_L     ( EDI )
109
    POP_L     ( ESI )
110
    RET
111
 
112
 
113
 
114
 
115
ALIGNTEXT16
116
GLOBL GLNAME( _mesa_3dnow_transform_points2_perspective )
117
GLNAME( _mesa_3dnow_transform_points2_perspective ):
118
 
119
    PUSH_L    ( ESI )
120
 
121
    MOV_L     ( ARG_DEST, ECX )
122
    MOV_L     ( ARG_MATRIX, ESI )
123
    MOV_L     ( ARG_SOURCE, EAX )
124
    MOV_L     ( CONST(4), REGOFF(V4F_SIZE, ECX) )
125
    OR_B      ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) )
126
    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
127
    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
128
 
129
    PUSH_L    ( EDI )
130
 
131
    MOV_L     ( REGOFF(V4F_START, ECX), EDX )
132
    MOV_L     ( ESI, ECX )
133
    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
134
    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
135
    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
136
 
137
    TEST_L    ( ESI, ESI )
138
    JZ        ( LLBL( G3TPPR_3 ) )
139
 
140
    MOVD      ( REGIND(ECX), MM0 )	/*                 | m00             */
141
    PUNPCKLDQ ( REGOFF(20, ECX), MM0 )	/* m11             | m00             */
142
 
143
    MOVD      ( REGOFF(56, ECX), MM3 )	/*                 | m32             */
144
 
145
ALIGNTEXT16
146
LLBL( G3TPPR_2 ):
147
 
148
    MOVQ      ( REGIND(EAX), MM4 )	/* x1              | x0              */
149
    PFMUL     ( MM0, MM4 )		/* x1*m11          | x0*m00          */
150
 
151
    MOVQ      ( MM4, REGIND(EDX) )	/* write r1, r0                      */
152
    MOVQ      ( MM3, REGOFF(8, EDX) )	/* write r2  (=m32), r3 (=0)         */
153
 
154
    ADD_L     ( EDI, EAX )		/* next vertex                       */
155
    ADD_L     ( CONST(16), EDX )	/* next r                            */
156
 
157
    DEC_L     ( ESI )			/* decrement vertex counter          */
158
    JNZ       ( LLBL( G3TPPR_2 ) )	/* cnt > 0 ? -> process next vertex  */
159
 
160
LLBL( G3TPPR_3 ):
161
 
162
    FEMMS
163
    POP_L     ( EDI )
164
    POP_L     ( ESI )
165
    RET
166
 
167
 
168
 
169
 
170
ALIGNTEXT16
171
GLOBL GLNAME( _mesa_3dnow_transform_points2_3d )
172
GLNAME( _mesa_3dnow_transform_points2_3d ):
173
 
174
    PUSH_L    ( ESI )
175
 
176
    MOV_L     ( ARG_DEST, ECX )
177
    MOV_L     ( ARG_MATRIX, ESI )
178
    MOV_L     ( ARG_SOURCE, EAX )
179
    MOV_L     ( CONST(3), REGOFF(V4F_SIZE, ECX) )
180
    OR_B      ( CONST(VEC_SIZE_3 ), REGOFF(V4F_FLAGS, ECX) )
181
    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
182
    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
183
 
184
    PUSH_L    ( EDI )
185
 
186
    MOV_L     ( REGOFF(V4F_START, ECX), EDX )
187
    MOV_L     ( ESI, ECX )
188
    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
189
    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
190
    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
191
 
192
    TEST_L    ( ESI, ESI )
193
    JZ        ( LLBL( G3TP3R_3 ) )
194
 
195
    MOVD      ( REGIND(ECX), MM0 )	/*                 | m00             */
196
    PUNPCKLDQ ( REGOFF(16, ECX), MM0 )	/* m10             | m00             */
197
 
198
    MOVD      ( REGOFF(4, ECX), MM1 )	/*                 | m01             */
199
    PUNPCKLDQ ( REGOFF(20, ECX), MM1 )	/* m11             | m01             */
200
 
201
    MOVD      ( REGOFF(8, ECX), MM2 )	/*                 | m02             */
202
    PUNPCKLDQ ( REGOFF(24, ECX), MM2 )	/* m12             | m02             */
203
 
204
    MOVQ      ( REGOFF(48, ECX), MM4 )	/* m31             | m30             */
205
    MOVD      ( REGOFF(56, ECX), MM5 )	/*                 | m32             */
206
 
207
ALIGNTEXT16
208
LLBL( G3TP3R_2 ):
209
 
210
    MOVQ      ( REGIND(EAX), MM6 )	/* x1              | x0              */
211
    MOVQ      ( MM6, MM7 )		/* x1              | x0              */
212
 
213
    PFMUL     ( MM0, MM6 )		/* x1*m10          | x0*m00          */
214
    PFMUL     ( MM1, MM7 )		/* x1*m11          | x0*m01          */
215
 
216
    PFACC     ( MM7, MM6 )		/* x0*m01+x1*m11   | x0*x00+x1*m10   */
217
    PFADD     ( MM4, MM6 )		/* x0*...*m11+m31  | x0*...*m10+m30  */
218
 
219
    MOVQ      ( MM6, REGIND(EDX) )	/* write r1, r0                      */
220
    MOVQ      ( REGIND(EAX), MM6 )	/* x1              | x0              */
221
 
222
    MOVQ      ( MM6, MM7 )		/* x1              | x0              */
223
    PFMUL     ( MM2, MM6 )		/* x1*m12          | x0*m02          */
224
 
225
    PFACC     ( MM7, MM6 )		/* ***trash***     | x0*x02+x1*m12   */
226
    PFADD     ( MM5, MM6 )		/* ***trash***     | x0*...*m12+m32  */
227
 
228
    MOVD      ( MM6, REGOFF(8, EDX) )	/* write r2                          */
229
    ADD_L     ( EDI, EAX )		/* next vertex                       */
230
 
231
    ADD_L     ( CONST(16), EDX )	/* next r                            */
232
    DEC_L     ( ESI )			/* decrement vertex counter          */
233
 
234
    JNZ       ( LLBL( G3TP3R_2 ) )	/* cnt > 0 ? -> process next vertex  */
235
 
236
LLBL( G3TP3R_3 ):
237
 
238
    FEMMS
239
    POP_L     ( EDI )
240
    POP_L     ( ESI )
241
    RET
242
 
243
 
244
 
245
 
246
ALIGNTEXT16
247
GLOBL GLNAME( _mesa_3dnow_transform_points2_3d_no_rot )
248
GLNAME( _mesa_3dnow_transform_points2_3d_no_rot ):
249
 
250
    PUSH_L    ( ESI )
251
 
252
    MOV_L     ( ARG_DEST, ECX )
253
    MOV_L     ( ARG_MATRIX, ESI )
254
    MOV_L     ( ARG_SOURCE, EAX )
255
    MOV_L     ( CONST(3), REGOFF(V4F_SIZE, ECX) )
256
    OR_B      ( CONST(VEC_SIZE_3 ), REGOFF(V4F_FLAGS, ECX) )
257
    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
258
    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
259
 
260
    PUSH_L    ( EDI )
261
 
262
    MOV_L     ( REGOFF(V4F_START, ECX), EDX )
263
    MOV_L     ( ESI, ECX )
264
    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
265
    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
266
    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
267
 
268
    TEST_L    ( ESI, ESI )
269
    JZ        ( LLBL( G3TP3NRR_3 ) )
270
 
271
    MOVD      ( REGIND(ECX), MM0 )	/*                 | m00             */
272
    PUNPCKLDQ ( REGOFF(20, ECX), MM0 )	/* m11             | m00             */
273
 
274
    MOVQ      ( REGOFF(48, ECX), MM2 )	/* m31             | m30             */
275
    MOVD      ( REGOFF(56, ECX), MM3 )	/*                 | m32             */
276
 
277
ALIGNTEXT16
278
LLBL( G3TP3NRR_2 ):
279
 
280
    MOVQ      ( REGIND(EAX), MM4 )	/* x1              | x0              */
281
    PFMUL     ( MM0, MM4 )		/* x1*m11          | x0*m00          */
282
 
283
    PFADD     ( MM2, MM4 )		/* x1*m11+m31      | x0*m00+m30      */
284
    MOVQ      ( MM4, REGIND(EDX) )	/* write r1, r0                      */
285
 
286
    MOVD      ( MM3, REGOFF(8, EDX) )	/* write r2                          */
287
    ADD_L     ( EDI, EAX )		/* next vertex                       */
288
 
289
    ADD_L     ( CONST(16), EDX )	/* next r                            */
290
    DEC_L     ( ESI )			/* decrement vertex counter          */
291
 
292
    JNZ       ( LLBL( G3TP3NRR_2 ) )	/* cnt > 0 ? -> process next vertex  */
293
 
294
LLBL( G3TP3NRR_3 ):
295
 
296
    FEMMS
297
    POP_L     ( EDI )
298
    POP_L     ( ESI )
299
    RET
300
 
301
 
302
 
303
 
304
ALIGNTEXT16
305
GLOBL GLNAME( _mesa_3dnow_transform_points2_2d )
306
GLNAME( _mesa_3dnow_transform_points2_2d ):
307
 
308
    PUSH_L    ( ESI )
309
 
310
    MOV_L     ( ARG_DEST, ECX )
311
    MOV_L     ( ARG_MATRIX, ESI )
312
    MOV_L     ( ARG_SOURCE, EAX )
313
    MOV_L     ( CONST(2), REGOFF(V4F_SIZE, ECX) )
314
    OR_B      ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) )
315
    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
316
    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
317
 
318
    PUSH_L    ( EDI )
319
 
320
    MOV_L     ( REGOFF(V4F_START, ECX), EDX )
321
    MOV_L     ( ESI, ECX )
322
    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
323
    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
324
    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
325
 
326
    TEST_L    ( ESI, ESI )
327
    JZ        ( LLBL( G3TP2R_3 ) )
328
 
329
    MOVQ      ( REGIND(ECX), MM0 )	/* m01             | m00             */
330
    MOVQ      ( REGOFF(16, ECX), MM1 )	/* m11             | m10             */
331
 
332
    MOVQ      ( REGOFF(48, ECX), MM2 )	/* m31             | m30             */
333
 
334
ALIGNTEXT16
335
LLBL( G3TP2R_2 ):
336
 
337
    MOVD      ( REGIND(EAX), MM4 )	/*                 | x0              */
338
    MOVD      ( REGOFF(4, EAX), MM5 )	/*                 | x1              */
339
 
340
    PUNPCKLDQ ( MM4, MM4 )		/* x0              | x0              */
341
    ADD_L     ( EDI, EAX )		/* next vertex                       */
342
 
343
    PFMUL     ( MM0, MM4 )		/* x0*m01          | x0*m00          */
344
    PUNPCKLDQ ( MM5, MM5 )		/* x1              | x1              */
345
 
346
    PFMUL     ( MM1, MM5 )		/* x1*m11          | x1*m10          */
347
    PFADD     ( MM2, MM4 )		/* x...x1*m11+31   | x0*..*m10+m30   */
348
 
349
    PFADD     ( MM5, MM4 )		/* x0*m01+x1*m11   | x0*m00+x1*m10   */
350
    MOVQ      ( MM4, REGIND(EDX) )	/* write r1, r0                      */
351
 
352
    ADD_L     ( CONST(16), EDX )	/* next r                            */
353
    DEC_L     ( ESI )			/* decrement vertex counter          */
354
 
355
    JNZ       ( LLBL( G3TP2R_2 ) )	/* cnt > 0 ? -> process next vertex  */
356
 
357
LLBL( G3TP2R_3 ):
358
 
359
    FEMMS
360
    POP_L     ( EDI )
361
    POP_L     ( ESI )
362
    RET
363
 
364
 
365
 
366
 
367
ALIGNTEXT16
368
GLOBL GLNAME( _mesa_3dnow_transform_points2_2d_no_rot )
369
GLNAME( _mesa_3dnow_transform_points2_2d_no_rot ):
370
 
371
    PUSH_L    ( ESI )
372
 
373
    MOV_L     ( ARG_DEST, ECX )
374
    MOV_L     ( ARG_MATRIX, ESI )
375
    MOV_L     ( ARG_SOURCE, EAX )
376
    MOV_L     ( CONST(2), REGOFF(V4F_SIZE, ECX) )
377
    OR_B      ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) )
378
    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
379
    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
380
 
381
    PUSH_L    ( EDI )
382
 
383
    MOV_L     ( REGOFF(V4F_START, ECX), EDX )
384
    MOV_L     ( ESI, ECX )
385
    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
386
    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
387
    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
388
 
389
    TEST_L    ( ESI, ESI )
390
    JZ        ( LLBL( G3TP2NRR_3 ) )
391
 
392
    MOVD      ( REGIND(ECX), MM0 )	/*                 | m00             */
393
    PUNPCKLDQ ( REGOFF(20, ECX), MM0 )	/* m11             | m00             */
394
 
395
    MOVQ      ( REGOFF(48, ECX), MM2 )	/* m31             | m30             */
396
 
397
ALIGNTEXT16
398
LLBL( G3TP2NRR_2 ):
399
 
400
    MOVQ      ( REGIND(EAX), MM4 )	/* x1              | x0              */
401
    ADD_L     ( EDI, EAX )		/* next vertex                       */
402
 
403
    PFMUL     ( MM0, MM4 )		/* x1*m11          | x0*m00          */
404
    PFADD     ( MM2, MM4 )		/* m31             | x0*m00+m30      */
405
 
406
    MOVQ      ( MM4, REGIND(EDX) )	/* write r1, r0                      */
407
    ADD_L     ( CONST(16), EDX )	/* next r                            */
408
 
409
    DEC_L     ( ESI )			/* decrement vertex counter          */
410
    JNZ       ( LLBL( G3TP2NRR_2 ) )	/* cnt > 0 ? -> process next vertex  */
411
 
412
LLBL( G3TP2NRR_3 ):
413
 
414
    FEMMS
415
    POP_L     ( EDI )
416
    POP_L     ( ESI )
417
    RET
418
 
419
 
420
 
421
 
422
ALIGNTEXT16
423
GLOBL GLNAME( _mesa_3dnow_transform_points2_identity )
424
GLNAME( _mesa_3dnow_transform_points2_identity ):
425
 
426
    PUSH_L    ( ESI )
427
 
428
    MOV_L     ( ARG_DEST, ECX )
429
    MOV_L     ( ARG_MATRIX, ESI )
430
    MOV_L     ( ARG_SOURCE, EAX )
431
    MOV_L     ( CONST(2), REGOFF(V4F_SIZE, ECX) )
432
    OR_B      ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) )
433
    MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
434
    MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
435
 
436
    PUSH_L    ( EDI )
437
 
438
    MOV_L     ( REGOFF(V4F_START, ECX), EDX )
439
    MOV_L     ( ESI, ECX )
440
    MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
441
    MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
442
    MOV_L     ( REGOFF(V4F_START, EAX), EAX )
443
 
444
    TEST_L    ( ESI, ESI )
445
    JZ        ( LLBL( G3TPIR_3 ) )
446
 
447
ALIGNTEXT16
448
LLBL( G3TPIR_3 ):
449
 
450
    MOVQ      ( REGIND(EAX), MM0 )	/* x1              | x0              */
451
    ADD_L     ( EDI, EAX )		/* next vertex                       */
452
 
453
    MOVQ      ( MM0, REGIND(EDX) )	/* r1              | r0              */
454
    ADD_L     ( CONST(16), EDX )	/* next r                            */
455
 
456
    DEC_L     ( ESI )			/* decrement vertex counter          */
457
    JNZ       ( LLBL( G3TPIR_3 ) )	/* cnt > 0 ? -> process next vertex  */
458
 
459
LLBL( G3TPIR_4 ):
460
 
461
    FEMMS
462
    POP_L     ( EDI )
463
    POP_L     ( ESI )
464
    RET