summaryrefslogtreecommitdiffstats
path: root/src/mesa/x86/mmx_blend.S
blob: 88908bd3455ef3975056570bd09b445cd4b46e0b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
#include "matypes.h"


SEG_TEXT


ALIGNTEXT16
GLOBL GLNAME(_mesa_mmx_blend_transparency)

/*
 * void blend_transparency( GLcontext *ctx,
 *                          GLuint n, 
 *                          const GLubyte mask[],
 *                          GLchan rgba[][4], 
 *                          CONST GLchan dest[][4] )
 * 
 * Common transparency blending mode.
 */
GLNAME( _mesa_mmx_blend_transparency ):
    PUSH_L    ( EBP )
    MOV_L     ( ESP, EBP )
    SUB_L     ( CONST(52), ESP )
    PUSH_L    ( EBX )

    MOV_L     ( CONST(16711680), REGOFF(-8, EBP) )
    MOV_L     ( CONST(16711680), REGOFF(-4, EBP) )
    MOV_L     ( CONST(0), REGOFF(-16, EBP) )
    MOV_L     ( CONST(-1), REGOFF(-12, EBP) )
    MOV_L     ( CONST(-1), REGOFF(-24, EBP) )
    MOV_L     ( CONST(0), REGOFF(-20, EBP) )
    MOV_L     ( REGOFF(24, EBP), EAX )		/* rgba */
    ADD_L     ( CONST(4), EAX )
    MOV_L     ( EAX, EDX )
    AND_L     ( REGOFF(20, EBP), EDX )		/* mask */
    MOV_L     ( EDX, EAX )
    AND_L     ( CONST(4), EAX )
    CMP_L     ( CONST(8), EAX )
    JNE       ( LLBL(GMBT_no_align) )
    MOV_L     ( REGOFF(20, EBP), EAX )
    ADD_L     ( CONST(3), EAX )
    XOR_L     ( EDX, EDX )
    MOV_B     ( REGIND(EAX), DL )
    MOV_L     ( EDX, REGOFF(-32, EBP) )
    MOV_L     ( CONST(255), EAX )
    MOV_L     ( EAX, EBX )
    SUB_L     ( REGOFF(-32, EBP), EBX )
    MOV_L     ( EBX, REGOFF(-36, EBP) )
    MOV_L     ( REGOFF(20, EBP), EAX )
    XOR_L     ( EDX, EDX )
    MOV_B     ( REGIND(EAX), DL )
    MOV_L     ( EDX, EAX )
    IMUL_L    ( REGOFF(-32, EBP), EAX )
    MOV_L     ( REGOFF(24, EBP), EDX )
    XOR_L     ( ECX, ECX )
    MOV_B     ( REGIND(EDX), CL )
    MOV_L     ( ECX, EDX )
    IMUL_L    ( REGOFF(-36, EBP), EDX )
    ADD_L     ( EDX, EAX )
    MOV_L     ( EAX, EBX )
    SAR_L     ( CONST(8), EBX )
    MOV_L     ( EBX, REGOFF(-40, EBP) )
    MOV_L     ( REGOFF(20, EBP), EAX )
    INC_L     ( EAX )
    XOR_L     ( EDX, EDX )
    MOV_B     ( REGIND(EAX), DL )
    MOV_L     ( EDX, EAX )
    IMUL_L    ( REGOFF(-32, EBP), EAX )
    MOV_L     ( REGOFF(24, EBP), EDX )
    INC_L     ( EDX )
    XOR_L     ( ECX, ECX )
    MOV_B     ( REGIND(EDX), CL )
    MOV_L     ( ECX, EDX )
    IMUL_L    ( REGOFF(-36, EBP), EDX )
    ADD_L     ( EDX, EAX )
    MOV_L     ( EAX, EBX )
    SAR_L     ( CONST(8), EBX )
    MOV_L     ( EBX, REGOFF(-44, EBP) )
    MOV_L     ( REGOFF(20, EBP), EAX )
    ADD_L     ( CONST(2), EAX )
    XOR_L     ( EDX, EDX )
    MOV_B     ( REGIND(EAX), DL )
    MOV_L     ( EDX, EAX )
    IMUL_L    ( REGOFF(-32, EBP), EAX )
    MOV_L     ( REGOFF(24, EBP), EDX )
    ADD_L     ( CONST(2), EDX )
    XOR_L     ( ECX, ECX )
    MOV_B     ( REGIND(EDX), CL )
    MOV_L     ( ECX, EDX )
    IMUL_L    ( REGOFF(-36, EBP), EDX )
    ADD_L     ( EDX, EAX )
    MOV_L     ( EAX, EBX )
    SAR_L     ( CONST(8), EBX )
    MOV_L     ( EBX, REGOFF(-48, EBP) )
    MOV_L     ( REGOFF(20, EBP), EAX )
    ADD_L     ( CONST(3), EAX )
    XOR_L     ( EDX, EDX )
    MOV_B     ( REGIND(EAX), DL )
    MOV_L     ( EDX, EAX )
    IMUL_L    ( REGOFF(-32, EBP), EAX )
    MOV_L     ( REGOFF(24, EBP), EDX )
    ADD_L     ( CONST(3), EDX )
    XOR_L     ( ECX, ECX )
    MOV_B     ( REGIND(EDX), CL )
    MOV_L     ( ECX, EDX )
    IMUL_L    ( REGOFF(-36, EBP), EDX )
    ADD_L     ( EDX, EAX )
    MOV_L     ( EAX, EBX )
    SAR_L     ( CONST(8), EBX )
    MOV_L     ( EBX, REGOFF(-52, EBP) )
    MOV_L     ( REGOFF(20, EBP), EAX )
    MOV_B     ( REGOFF(-40, EBP), DL )
    MOV_B     ( DL, REGIND(EAX) )
    MOV_L     ( REGOFF(20, EBP), EAX )
    INC_L     ( EAX )
    MOV_B     ( REGOFF(-44, EBP), DL )
    MOV_B     ( DL, REGIND(EAX) )
    MOV_L     ( REGOFF(20, EBP), EAX )
    ADD_L     ( CONST(2), EAX )
    MOV_B     ( REGOFF(-48, EBP), DL )
    MOV_B     ( DL, REGIND(EAX) )
    MOV_L     ( REGOFF(20, EBP), EAX )
    ADD_L     ( CONST(3), EAX )
    MOV_B     ( REGOFF(-52, EBP), DL )
    MOV_B     ( DL, REGIND(EAX) )
    INC_L     ( REGOFF(16, EBP) )
    ADD_L     ( CONST(4), REGOFF(20, EBP) )
    ADD_L     ( CONST(4), REGOFF(24, EBP) )
    DEC_L     ( REGOFF(12, EBP) )
LLBL(GMBT_skip_runin):

    CMP_L     ( CONST(0), REGOFF(12, EBP) )	/* n == 0 */
    JE        ( LLBL(GMBT_zero_length) )
    MOV_L     ( CONST(0), REGOFF(-28, EBP) )	
ALIGNTEXT4
LLBL(GMBT_main_loop):

    MOV_L     ( REGOFF(12, EBP), EDX )
    MOV_L     ( EDX, EAX )
    SHR_L     ( CONST(1), EAX )			/* eax = n/2 */
    CMP_L     ( EAX, REGOFF(-28, EBP) )
    JB        ( LLBL(GMBT_no_jump) )
    JMP       ( LLBL(GMBT_end_loop) )
ALIGNTEXT16
LLBL(GMBT_nojump):

    MOV_L     ( REGOFF(-28, EBP), EAX )
    LEA_L     ( REGDIS(0,EAX,2), EDX )
    MOV_L     ( REGOFF(16, EBP), EAX )		/* mask */
    CMP_B     ( CONST(0), REGBI(EAX,EDX) )
    JE        ( LLBL(GMBT_masked) )
    MOV_L     ( REGOFF(-28, EBP), EAX )
    MOV_L     ( EAX, EDX )
    LEA_L     ( REGDIS(0,EDX,8), ECX )
    MOV_L     ( ECX, EAX )
    ADD_L     ( REGOFF(20, EBP), EAX )
    MOV_L     ( REGOFF(-28, EBP), EDX )
    MOV_L     ( EDX, ECX )
    LEA_L     ( REGDIS(0,ECX,8), EDX )
    MOV_L     ( EDX, ECX )
    ADD_L     ( REGOFF(24, EBP), ECX )

    MOVQ      ( REGIND(EAX), MM4 )
    PXOR      ( MM5, MM5 )
    MOVQ      ( MM4, MM1 )
    MOVQ      ( REGIND(ECX), MM7 )
    PUNPCKLBW ( MM5, MM1 )
    MOVQ      ( MM7, MM6 )
    MOVQ      ( MM1, MM0 )
    PUNPCKLBW ( MM5, MM6 )
    MOVQ      ( MM1, MM2 )
    PSRLQ     ( CONST(48), MM0 )
    PUNPCKHBW ( MM5, MM4 )
    PACKSSDW  ( MM0, MM0 )
    MOVQ      ( MM0, MM3 )
    PUNPCKHBW ( MM5, MM7 )
    PSLLQ     ( CONST(16), MM3 )
    POR       ( REGOFF(-8, EBP), MM0 )
    PUNPCKLWD ( MM6, MM1 )
    PSUBW     ( MM3, MM0 )
    PUNPCKHWD ( MM6, MM2 )
    MOVQ      ( MM4, MM3 )
    PSRLQ     ( CONST(48), MM3 )
    PACKSSDW  ( MM3, MM3 )
    MOVQ      ( MM3, MM6 )
    POR       ( REGOFF(-8, EBP), MM3 )
    PSLLQ     ( CONST(16), MM6 )
    PSUBW     ( MM6, MM3 )
    MOVQ      ( MM4, MM5 )
    PUNPCKLWD ( MM7, MM4 )
    PUNPCKHWD ( MM7, MM5 )
    PMADDWD   ( MM0, MM1 )
    PMADDWD   ( MM3, MM4 )
    PMADDWD   ( MM0, MM2 )
    PMADDWD   ( MM3, MM5 )
    PSRLD     ( CONST(8), MM1 )
    PSRLD     ( CONST(8), MM2 )
    PSRLD     ( CONST(8), MM4 )
    PACKSSDW  ( MM2, MM1 )
    PSRLD     ( CONST(8), MM5 )
    PACKUSWB  ( MM1, MM1 )
    PACKSSDW  ( MM5, MM4 )
    PAND      ( REGOFF(-24, EBP), MM1 )
    PACKUSWB  ( MM4, MM4 )
    PAND      ( REGOFF(-16, EBP), MM4 )
    POR       ( MM1, MM4 )
    MOVQ      ( MM4, REGIND(EAX) )

LLBL(GMBT_masked):

    INC_L     ( REGOFF(-28, EBP) )
    JMP       ( LLBL(GMBT_main_loop) )
ALIGNTEXT16
LLBL(GMBT_end_loop):


    EMMS

LLBL(GMBT_runout):

    MOV_L     ( REGOFF(12, EBP), EAX )
    AND_L     ( CONST(1), EAX )
    TEST_L    ( EAX, EAX )
    JE        ( LLBL(GMBT_skip_runout) )
    MOV_L     ( REGOFF(12, EBP), EAX )
    LEA_L     ( REGDIS(0,EAX,4), EDX )
    MOV_L     ( EDX, EAX )
    ADD_L     ( REGOFF(20, EBP), EAX )
    LEA_L     ( REGOFF(-1, EAX), EDX )
    XOR_L     ( EAX, EAX )
    MOV_B     ( REGIND(EDX), AL )
    MOV_L     ( EAX, REGOFF(-52, EBP) )
    MOV_L     ( CONST(255), EAX )
    MOV_L     ( EAX, EBX )
    SUB_L     ( REGOFF(-52, EBP), EBX )
    MOV_L     ( EBX, REGOFF(-48, EBP) )
    MOV_L     ( REGOFF(12, EBP), EAX )
    LEA_L     ( REGDIS(0,EAX,4), EDX )
    MOV_L     ( EDX, EAX )
    ADD_L     ( REGOFF(20, EBP), EAX )
    LEA_L     ( REGOFF(-4, EAX), EDX )
    XOR_L     ( ECX, ECX )
    MOV_B     ( REGIND(EDX), CL )
    MOV_L     ( ECX, EAX )
    IMUL_L    ( REGOFF(-52, EBP), EAX )
    MOV_L     ( REGOFF(12, EBP), EDX )
    LEA_L     ( REGDIS(0,EDX,4), ECX )
    MOV_L     ( ECX, EDX )
    ADD_L     ( REGOFF(24, EBP), EDX )
    LEA_L     ( REGOFF(-4, EDX), ECX )
    XOR_L     ( EDX, EDX )
    MOV_B     ( REGIND(ECX), DL )
    MOV_L     ( EDX, ECX )
    IMUL_L    ( REGOFF(-48, EBP), ECX )
    ADD_L     ( ECX, EAX )
    MOV_L     ( EAX, EBX )
    SAR_L     ( CONST(8), EBX )
    MOV_L     ( EBX, REGOFF(-44, EBP) )
    MOV_L     ( REGOFF(12, EBP), EAX )
    LEA_L     ( REGDIS(0,EAX,4), EDX )
    MOV_L     ( EDX, EAX )
    ADD_L     ( REGOFF(20, EBP), EAX )
    LEA_L     ( REGOFF(-3, EAX), EDX )
    XOR_L     ( ECX, ECX )
    MOV_B     ( REGIND(EDX), CL )
    MOV_L     ( ECX, EAX )
    IMUL_L    ( REGOFF(-52, EBP), EAX )
    MOV_L     ( REGOFF(12, EBP), EDX )
    LEA_L     ( REGDIS(0,EDX,4), ECX )
    MOV_L     ( ECX, EDX )
    ADD_L     ( REGOFF(24, EBP), EDX )
    LEA_L     ( REGOFF(-3, EDX), ECX )
    XOR_L     ( EDX, EDX )
    MOV_B     ( REGIND(ECX), DL )
    MOV_L     ( EDX, ECX )
    IMUL_L    ( REGOFF(-48, EBP), ECX )
    ADD_L     ( ECX, EAX )
    MOV_L     ( EAX, EBX )
    SAR_L     ( CONST(8), EBX )
    MOV_L     ( EBX, REGOFF(-40, EBP) )
    MOV_L     ( REGOFF(12, EBP), EAX )
    LEA_L     ( REGDIS(0,EAX,4), EDX )
    MOV_L     ( EDX, EAX )
    ADD_L     ( REGOFF(20, EBP), EAX )
    LEA_L     ( REGOFF(-2, EAX), EDX )
    XOR_L     ( ECX, ECX )
    MOV_B     ( REGIND(EDX), CL )
    MOV_L     ( ECX, EAX )
    IMUL_L    ( REGOFF(-52, EBP), EAX )
    MOV_L     ( REGOFF(12, EBP), EDX )
    LEA_L     ( REGDIS(0,EDX,4), ECX )
    MOV_L     ( ECX, EDX )
    ADD_L     ( REGOFF(24, EBP), EDX )
    LEA_L     ( REGOFF(-2, EDX), ECX )
    XOR_L     ( EDX, EDX )
    MOV_B     ( REGIND(ECX), DL )
    MOV_L     ( EDX, ECX )
    IMUL_L    ( REGOFF(-48, EBP), ECX )
    ADD_L     ( ECX, EAX )
    MOV_L     ( EAX, EBX )
    SAR_L     ( CONST(8), EBX )
    MOV_L     ( EBX, REGOFF(-36, EBP) )
    MOV_L     ( REGOFF(12, EBP), EAX )
    LEA_L     ( REGDIS(0,EAX,4), EDX )
    MOV_L     ( EDX, EAX )
    ADD_L     ( REGOFF(20, EBP), EAX )
    LEA_L     ( REGOFF(-1, EAX), EDX )
    XOR_L     ( ECX, ECX )
    MOV_B     ( REGIND(EDX), CL )
    MOV_L     ( ECX, EAX )
    IMUL_L    ( REGOFF(-52, EBP), EAX )
    MOV_L     ( REGOFF(12, EBP), EDX )
    LEA_L     ( REGDIS(0,EDX,4), ECX )
    MOV_L     ( ECX, EDX )
    ADD_L     ( REGOFF(24, EBP), EDX )
    LEA_L     ( REGOFF(-1, EDX), ECX )
    XOR_L     ( EDX, EDX )
    MOV_B     ( REGIND(ECX), DL )
    MOV_L     ( EDX, ECX )
    IMUL_L    ( REGOFF(-48, EBP), ECX )
    ADD_L     ( ECX, EAX )
    MOV_L     ( EAX, EBX )
    SAR_L     ( CONST(8), EBX )
    MOV_L     ( EBX, REGOFF(-32, EBP) )
    MOV_L     ( REGOFF(12, EBP), EAX )
    LEA_L     ( REGDIS(0,EAX,4), EDX )
    MOV_L     ( EDX, EAX )
    ADD_L     ( REGOFF(20, EBP), EAX )
    LEA_L     ( REGOFF(-4, EAX), EDX )
    MOV_B     ( REGOFF(-44, EBP), AL )
    MOV_B     ( AL, REGIND(EDX) )
    MOV_L     ( REGOFF(12, EBP), EAX )
    LEA_L     ( REGDIS(0,EAX,4), EDX )
    MOV_L     ( EDX, EAX )
    ADD_L     ( REGOFF(20, EBP), EAX )
    LEA_L     ( REGOFF(-3, EAX), EDX )
    MOV_B     ( REGOFF(-40, EBP), AL )
    MOV_B     ( AL, REGIND(EDX) )
    MOV_L     ( REGOFF(12, EBP), EAX )
    LEA_L     ( REGDIS(0,EAX,4), EDX )
    MOV_L     ( EDX, EAX )
    ADD_L     ( REGOFF(20, EBP), EAX )
    LEA_L     ( REGOFF(-2, EAX), EDX )
    MOV_B     ( REGOFF(-36, EBP), AL )
    MOV_B     ( AL, REGIND(EDX) )
    MOV_L     ( REGOFF(12, EBP), EAX )
    LEA_L     ( REGDIS(0,EAX,4), EDX )
    MOV_L     ( EDX, EAX )
    ADD_L     ( REGOFF(20, EBP), EAX )
    LEA_L     ( REGOFF(-1, EAX), EDX )
    MOV_B     ( REGOFF(-32, EBP), AL )
    MOV_B     ( AL, REGIND(EDX) )
LLBL(GMBT_skip_runout):

    MOV_L     ( REGOFF(-56, EBP), EBX )
    MOV_L     ( EBP, ESP )
    POP_L     ( EBP )
    RET