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