mmx_blend.S revision 01bcd83defe1e258007a4449edb8bd3072f008b0
1#include "matypes.h"
2
3
4SEG_TEXT
5
6
7ALIGNTEXT16
8GLOBL GLNAME(_mesa_mmx_blend_transparency)
9
10/*
11 * void blend_transparency( GLcontext *ctx,
12 *                          GLuint n,
13 *                          const GLubyte mask[],
14 *                          GLchan rgba[][4],
15 *                          CONST GLchan dest[][4] )
16 *
17 * Common transparency blending mode.
18 */
19GLNAME( _mesa_mmx_blend_transparency ):
20    PUSH_L    ( EBP )
21    MOV_L     ( ESP, EBP )
22    SUB_L     ( CONST(52), ESP )
23    PUSH_L    ( EBX )
24
25    MOV_L     ( CONST(16711680), REGOFF(-8, EBP) )
26    MOV_L     ( CONST(16711680), REGOFF(-4, EBP) )
27    MOV_L     ( CONST(0), REGOFF(-16, EBP) )
28    MOV_L     ( CONST(-1), REGOFF(-12, EBP) )
29    MOV_L     ( CONST(-1), REGOFF(-24, EBP) )
30    MOV_L     ( CONST(0), REGOFF(-20, EBP) )
31    MOV_L     ( REGOFF(24, EBP), EAX )		/* rgba */
32    ADD_L     ( CONST(4), EAX )
33    MOV_L     ( EAX, EDX )
34    AND_L     ( REGOFF(20, EBP), EDX )		/* mask */
35    MOV_L     ( EDX, EAX )
36    AND_L     ( CONST(4), EAX )
37    CMP_L     ( CONST(8), EAX )
38    JNE       ( LLBL(GMBT_no_align) )
39    MOV_L     ( REGOFF(20, EBP), EAX )
40    ADD_L     ( CONST(3), EAX )
41    XOR_L     ( EDX, EDX )
42    MOV_B     ( REGIND(EAX), DL )
43    MOV_L     ( EDX, REGOFF(-32, EBP) )
44    MOV_L     ( CONST(255), EAX )
45    MOV_L     ( EAX, EBX )
46    SUB_L     ( REGOFF(-32, EBP), EBX )
47    MOV_L     ( EBX, REGOFF(-36, EBP) )
48    MOV_L     ( REGOFF(20, EBP), EAX )
49    XOR_L     ( EDX, EDX )
50    MOV_B     ( REGIND(EAX), DL )
51    MOV_L     ( EDX, EAX )
52    IMUL_L    ( REGOFF(-32, EBP), EAX )
53    MOV_L     ( REGOFF(24, EBP), EDX )
54    XOR_L     ( ECX, ECX )
55    MOV_B     ( REGIND(EDX), CL )
56    MOV_L     ( ECX, EDX )
57    IMUL_L    ( REGOFF(-36, EBP), EDX )
58    ADD_L     ( EDX, EAX )
59    MOV_L     ( EAX, EBX )
60    SAR_L     ( CONST(8), EBX )
61    MOV_L     ( EBX, REGOFF(-40, EBP) )
62    MOV_L     ( REGOFF(20, EBP), EAX )
63    INC_L     ( EAX )
64    XOR_L     ( EDX, EDX )
65    MOV_B     ( REGIND(EAX), DL )
66    MOV_L     ( EDX, EAX )
67    IMUL_L    ( REGOFF(-32, EBP), EAX )
68    MOV_L     ( REGOFF(24, EBP), EDX )
69    INC_L     ( EDX )
70    XOR_L     ( ECX, ECX )
71    MOV_B     ( REGIND(EDX), CL )
72    MOV_L     ( ECX, EDX )
73    IMUL_L    ( REGOFF(-36, EBP), EDX )
74    ADD_L     ( EDX, EAX )
75    MOV_L     ( EAX, EBX )
76    SAR_L     ( CONST(8), EBX )
77    MOV_L     ( EBX, REGOFF(-44, EBP) )
78    MOV_L     ( REGOFF(20, EBP), EAX )
79    ADD_L     ( CONST(2), EAX )
80    XOR_L     ( EDX, EDX )
81    MOV_B     ( REGIND(EAX), DL )
82    MOV_L     ( EDX, EAX )
83    IMUL_L    ( REGOFF(-32, EBP), EAX )
84    MOV_L     ( REGOFF(24, EBP), EDX )
85    ADD_L     ( CONST(2), EDX )
86    XOR_L     ( ECX, ECX )
87    MOV_B     ( REGIND(EDX), CL )
88    MOV_L     ( ECX, EDX )
89    IMUL_L    ( REGOFF(-36, EBP), EDX )
90    ADD_L     ( EDX, EAX )
91    MOV_L     ( EAX, EBX )
92    SAR_L     ( CONST(8), EBX )
93    MOV_L     ( EBX, REGOFF(-48, EBP) )
94    MOV_L     ( REGOFF(20, EBP), EAX )
95    ADD_L     ( CONST(3), EAX )
96    XOR_L     ( EDX, EDX )
97    MOV_B     ( REGIND(EAX), DL )
98    MOV_L     ( EDX, EAX )
99    IMUL_L    ( REGOFF(-32, EBP), EAX )
100    MOV_L     ( REGOFF(24, EBP), EDX )
101    ADD_L     ( CONST(3), EDX )
102    XOR_L     ( ECX, ECX )
103    MOV_B     ( REGIND(EDX), CL )
104    MOV_L     ( ECX, EDX )
105    IMUL_L    ( REGOFF(-36, EBP), EDX )
106    ADD_L     ( EDX, EAX )
107    MOV_L     ( EAX, EBX )
108    SAR_L     ( CONST(8), EBX )
109    MOV_L     ( EBX, REGOFF(-52, EBP) )
110    MOV_L     ( REGOFF(20, EBP), EAX )
111    MOV_B     ( REGOFF(-40, EBP), DL )
112    MOV_B     ( DL, REGIND(EAX) )
113    MOV_L     ( REGOFF(20, EBP), EAX )
114    INC_L     ( EAX )
115    MOV_B     ( REGOFF(-44, EBP), DL )
116    MOV_B     ( DL, REGIND(EAX) )
117    MOV_L     ( REGOFF(20, EBP), EAX )
118    ADD_L     ( CONST(2), EAX )
119    MOV_B     ( REGOFF(-48, EBP), DL )
120    MOV_B     ( DL, REGIND(EAX) )
121    MOV_L     ( REGOFF(20, EBP), EAX )
122    ADD_L     ( CONST(3), EAX )
123    MOV_B     ( REGOFF(-52, EBP), DL )
124    MOV_B     ( DL, REGIND(EAX) )
125    INC_L     ( REGOFF(16, EBP) )
126    ADD_L     ( CONST(4), REGOFF(20, EBP) )
127    ADD_L     ( CONST(4), REGOFF(24, EBP) )
128    DEC_L     ( REGOFF(12, EBP) )
129LLBL(GMBT_skip_runin):
130
131    CMP_L     ( CONST(0), REGOFF(12, EBP) )	/* n == 0 */
132    JE        ( LLBL(GMBT_zero_length) )
133    MOV_L     ( CONST(0), REGOFF(-28, EBP) )
134ALIGNTEXT4
135LLBL(GMBT_main_loop):
136
137    MOV_L     ( REGOFF(12, EBP), EDX )
138    MOV_L     ( EDX, EAX )
139    SHR_L     ( CONST(1), EAX )			/* eax = n/2 */
140    CMP_L     ( EAX, REGOFF(-28, EBP) )
141    JB        ( LLBL(GMBT_no_jump) )
142    JMP       ( LLBL(GMBT_end_loop) )
143ALIGNTEXT16
144LLBL(GMBT_nojump):
145
146    MOV_L     ( REGOFF(-28, EBP), EAX )
147    LEA_L     ( REGDIS(0,EAX,2), EDX )
148    MOV_L     ( REGOFF(16, EBP), EAX )		/* mask */
149    CMP_B     ( CONST(0), REGBI(EAX,EDX) )
150    JE        ( LLBL(GMBT_masked) )
151    MOV_L     ( REGOFF(-28, EBP), EAX )
152    MOV_L     ( EAX, EDX )
153    LEA_L     ( REGDIS(0,EDX,8), ECX )
154    MOV_L     ( ECX, EAX )
155    ADD_L     ( REGOFF(20, EBP), EAX )
156    MOV_L     ( REGOFF(-28, EBP), EDX )
157    MOV_L     ( EDX, ECX )
158    LEA_L     ( REGDIS(0,ECX,8), EDX )
159    MOV_L     ( EDX, ECX )
160    ADD_L     ( REGOFF(24, EBP), ECX )
161
162    MOVQ      ( REGIND(EAX), MM4 )
163    PXOR      ( MM5, MM5 )
164    MOVQ      ( MM4, MM1 )
165    MOVQ      ( REGIND(ECX), MM7 )
166    PUNPCKLBW ( MM5, MM1 )
167    MOVQ      ( MM7, MM6 )
168    MOVQ      ( MM1, MM0 )
169    PUNPCKLBW ( MM5, MM6 )
170    MOVQ      ( MM1, MM2 )
171    PSRLQ     ( CONST(48), MM0 )
172    PUNPCKHBW ( MM5, MM4 )
173    PACKSSDW  ( MM0, MM0 )
174    MOVQ      ( MM0, MM3 )
175    PUNPCKHBW ( MM5, MM7 )
176    PSLLQ     ( CONST(16), MM3 )
177    POR       ( REGOFF(-8, EBP), MM0 )
178    PUNPCKLWD ( MM6, MM1 )
179    PSUBW     ( MM3, MM0 )
180    PUNPCKHWD ( MM6, MM2 )
181    MOVQ      ( MM4, MM3 )
182    PSRLQ     ( CONST(48), MM3 )
183    PACKSSDW  ( MM3, MM3 )
184    MOVQ      ( MM3, MM6 )
185    POR       ( REGOFF(-8, EBP), MM3 )
186    PSLLQ     ( CONST(16), MM6 )
187    PSUBW     ( MM6, MM3 )
188    MOVQ      ( MM4, MM5 )
189    PUNPCKLWD ( MM7, MM4 )
190    PUNPCKHWD ( MM7, MM5 )
191    PMADDWD   ( MM0, MM1 )
192    PMADDWD   ( MM3, MM4 )
193    PMADDWD   ( MM0, MM2 )
194    PMADDWD   ( MM3, MM5 )
195    PSRLD     ( CONST(8), MM1 )
196    PSRLD     ( CONST(8), MM2 )
197    PSRLD     ( CONST(8), MM4 )
198    PACKSSDW  ( MM2, MM1 )
199    PSRLD     ( CONST(8), MM5 )
200    PACKUSWB  ( MM1, MM1 )
201    PACKSSDW  ( MM5, MM4 )
202    PAND      ( REGOFF(-24, EBP), MM1 )
203    PACKUSWB  ( MM4, MM4 )
204    PAND      ( REGOFF(-16, EBP), MM4 )
205    POR       ( MM1, MM4 )
206    MOVQ      ( MM4, REGIND(EAX) )
207
208LLBL(GMBT_masked):
209
210    INC_L     ( REGOFF(-28, EBP) )
211    JMP       ( LLBL(GMBT_main_loop) )
212ALIGNTEXT16
213LLBL(GMBT_end_loop):
214
215
216    EMMS
217
218LLBL(GMBT_runout):
219
220    MOV_L     ( REGOFF(12, EBP), EAX )
221    AND_L     ( CONST(1), EAX )
222    TEST_L    ( EAX, EAX )
223    JE        ( LLBL(GMBT_skip_runout) )
224    MOV_L     ( REGOFF(12, EBP), EAX )
225    LEA_L     ( REGDIS(0,EAX,4), EDX )
226    MOV_L     ( EDX, EAX )
227    ADD_L     ( REGOFF(20, EBP), EAX )
228    LEA_L     ( REGOFF(-1, EAX), EDX )
229    XOR_L     ( EAX, EAX )
230    MOV_B     ( REGIND(EDX), AL )
231    MOV_L     ( EAX, REGOFF(-52, EBP) )
232    MOV_L     ( CONST(255), EAX )
233    MOV_L     ( EAX, EBX )
234    SUB_L     ( REGOFF(-52, EBP), EBX )
235    MOV_L     ( EBX, REGOFF(-48, EBP) )
236    MOV_L     ( REGOFF(12, EBP), EAX )
237    LEA_L     ( REGDIS(0,EAX,4), EDX )
238    MOV_L     ( EDX, EAX )
239    ADD_L     ( REGOFF(20, EBP), EAX )
240    LEA_L     ( REGOFF(-4, EAX), EDX )
241    XOR_L     ( ECX, ECX )
242    MOV_B     ( REGIND(EDX), CL )
243    MOV_L     ( ECX, EAX )
244    IMUL_L    ( REGOFF(-52, EBP), EAX )
245    MOV_L     ( REGOFF(12, EBP), EDX )
246    LEA_L     ( REGDIS(0,EDX,4), ECX )
247    MOV_L     ( ECX, EDX )
248    ADD_L     ( REGOFF(24, EBP), EDX )
249    LEA_L     ( REGOFF(-4, EDX), ECX )
250    XOR_L     ( EDX, EDX )
251    MOV_B     ( REGIND(ECX), DL )
252    MOV_L     ( EDX, ECX )
253    IMUL_L    ( REGOFF(-48, EBP), ECX )
254    ADD_L     ( ECX, EAX )
255    MOV_L     ( EAX, EBX )
256    SAR_L     ( CONST(8), EBX )
257    MOV_L     ( EBX, REGOFF(-44, EBP) )
258    MOV_L     ( REGOFF(12, EBP), EAX )
259    LEA_L     ( REGDIS(0,EAX,4), EDX )
260    MOV_L     ( EDX, EAX )
261    ADD_L     ( REGOFF(20, EBP), EAX )
262    LEA_L     ( REGOFF(-3, EAX), EDX )
263    XOR_L     ( ECX, ECX )
264    MOV_B     ( REGIND(EDX), CL )
265    MOV_L     ( ECX, EAX )
266    IMUL_L    ( REGOFF(-52, EBP), EAX )
267    MOV_L     ( REGOFF(12, EBP), EDX )
268    LEA_L     ( REGDIS(0,EDX,4), ECX )
269    MOV_L     ( ECX, EDX )
270    ADD_L     ( REGOFF(24, EBP), EDX )
271    LEA_L     ( REGOFF(-3, EDX), ECX )
272    XOR_L     ( EDX, EDX )
273    MOV_B     ( REGIND(ECX), DL )
274    MOV_L     ( EDX, ECX )
275    IMUL_L    ( REGOFF(-48, EBP), ECX )
276    ADD_L     ( ECX, EAX )
277    MOV_L     ( EAX, EBX )
278    SAR_L     ( CONST(8), EBX )
279    MOV_L     ( EBX, REGOFF(-40, EBP) )
280    MOV_L     ( REGOFF(12, EBP), EAX )
281    LEA_L     ( REGDIS(0,EAX,4), EDX )
282    MOV_L     ( EDX, EAX )
283    ADD_L     ( REGOFF(20, EBP), EAX )
284    LEA_L     ( REGOFF(-2, EAX), EDX )
285    XOR_L     ( ECX, ECX )
286    MOV_B     ( REGIND(EDX), CL )
287    MOV_L     ( ECX, EAX )
288    IMUL_L    ( REGOFF(-52, EBP), EAX )
289    MOV_L     ( REGOFF(12, EBP), EDX )
290    LEA_L     ( REGDIS(0,EDX,4), ECX )
291    MOV_L     ( ECX, EDX )
292    ADD_L     ( REGOFF(24, EBP), EDX )
293    LEA_L     ( REGOFF(-2, EDX), ECX )
294    XOR_L     ( EDX, EDX )
295    MOV_B     ( REGIND(ECX), DL )
296    MOV_L     ( EDX, ECX )
297    IMUL_L    ( REGOFF(-48, EBP), ECX )
298    ADD_L     ( ECX, EAX )
299    MOV_L     ( EAX, EBX )
300    SAR_L     ( CONST(8), EBX )
301    MOV_L     ( EBX, REGOFF(-36, EBP) )
302    MOV_L     ( REGOFF(12, EBP), EAX )
303    LEA_L     ( REGDIS(0,EAX,4), EDX )
304    MOV_L     ( EDX, EAX )
305    ADD_L     ( REGOFF(20, EBP), EAX )
306    LEA_L     ( REGOFF(-1, EAX), EDX )
307    XOR_L     ( ECX, ECX )
308    MOV_B     ( REGIND(EDX), CL )
309    MOV_L     ( ECX, EAX )
310    IMUL_L    ( REGOFF(-52, EBP), EAX )
311    MOV_L     ( REGOFF(12, EBP), EDX )
312    LEA_L     ( REGDIS(0,EDX,4), ECX )
313    MOV_L     ( ECX, EDX )
314    ADD_L     ( REGOFF(24, EBP), EDX )
315    LEA_L     ( REGOFF(-1, EDX), ECX )
316    XOR_L     ( EDX, EDX )
317    MOV_B     ( REGIND(ECX), DL )
318    MOV_L     ( EDX, ECX )
319    IMUL_L    ( REGOFF(-48, EBP), ECX )
320    ADD_L     ( ECX, EAX )
321    MOV_L     ( EAX, EBX )
322    SAR_L     ( CONST(8), EBX )
323    MOV_L     ( EBX, REGOFF(-32, EBP) )
324    MOV_L     ( REGOFF(12, EBP), EAX )
325    LEA_L     ( REGDIS(0,EAX,4), EDX )
326    MOV_L     ( EDX, EAX )
327    ADD_L     ( REGOFF(20, EBP), EAX )
328    LEA_L     ( REGOFF(-4, EAX), EDX )
329    MOV_B     ( REGOFF(-44, EBP), AL )
330    MOV_B     ( AL, REGIND(EDX) )
331    MOV_L     ( REGOFF(12, EBP), EAX )
332    LEA_L     ( REGDIS(0,EAX,4), EDX )
333    MOV_L     ( EDX, EAX )
334    ADD_L     ( REGOFF(20, EBP), EAX )
335    LEA_L     ( REGOFF(-3, EAX), EDX )
336    MOV_B     ( REGOFF(-40, EBP), AL )
337    MOV_B     ( AL, REGIND(EDX) )
338    MOV_L     ( REGOFF(12, EBP), EAX )
339    LEA_L     ( REGDIS(0,EAX,4), EDX )
340    MOV_L     ( EDX, EAX )
341    ADD_L     ( REGOFF(20, EBP), EAX )
342    LEA_L     ( REGOFF(-2, EAX), EDX )
343    MOV_B     ( REGOFF(-36, EBP), AL )
344    MOV_B     ( AL, REGIND(EDX) )
345    MOV_L     ( REGOFF(12, EBP), EAX )
346    LEA_L     ( REGDIS(0,EAX,4), EDX )
347    MOV_L     ( EDX, EAX )
348    ADD_L     ( REGOFF(20, EBP), EAX )
349    LEA_L     ( REGOFF(-1, EAX), EDX )
350    MOV_B     ( REGOFF(-32, EBP), AL )
351    MOV_B     ( AL, REGIND(EDX) )
352LLBL(GMBT_skip_runout):
353
354    MOV_L     ( REGOFF(-56, EBP), EBX )
355    MOV_L     ( EBP, ESP )
356    POP_L     ( EBP )
357    RET
358