move around - flatter.
[profile/ivi/evas.git] / src / lib / engines / common / evas_op_blend / op_blend_mask_color_i386.c
1
2 /* blend mask x color -> dst */
3
4 #ifdef BUILD_MMX
5 static void
6 _op_blend_mas_c_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
7    DATA32 *e = d + l;
8    pxor_r2r(mm0, mm0);
9    MOV_A2R(ALPHA_256, mm6)
10    MOV_P2R(c, mm2, mm0)
11    c = 256 - (c >> 24);
12    MOV_A2R(c, mm4)
13    while (d < e) {
14         l = *m;
15         switch(l)
16           {
17             case 0:
18                 break;
19             case 255:
20                 MOV_P2R(*d, mm1, mm0)
21                 MUL4_256_R2R(mm4, mm1)
22                 paddw_r2r(mm2, mm1);
23                 MOV_R2P(mm1, *d, mm0)
24                 break;
25             default:
26                 l++;
27                 MOV_A2R(l, mm3)
28                 MUL4_256_R2R(mm2, mm3)
29
30                 MOV_RA2R(mm3, mm1)
31                 movq_r2r(mm6, mm7);
32                 psubw_r2r(mm1, mm7);
33
34                 MOV_P2R(*d, mm1, mm0)
35                 MUL4_256_R2R(mm7, mm1)
36
37                 paddw_r2r(mm3, mm1);
38                 MOV_R2P(mm1, *d, mm0)
39                 break;
40           }
41         m++;  d++;
42      }
43 }
44
45 static void
46 _op_blend_mas_can_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
47    DATA32 *e = d + l;
48    pxor_r2r(mm0, mm0);
49    MOV_P2R(c, mm2, mm0)
50    MOV_A2R(ALPHA_255, mm5)
51    while (d < e) {
52         l = *m;
53         switch(l)
54           {
55             case 0:
56                 break;
57             case 255:
58                 *d = c;
59                 break;
60             default:
61                 l++;
62                 MOV_A2R(l, mm3)
63                 MOV_P2R(*d, mm1, mm0)
64                 movq_r2r(mm2, mm4);
65                 INTERP_256_R2R(mm3, mm4, mm1, mm5)
66                 MOV_R2P(mm1, *d, mm0)
67                 break;
68           }
69         m++;  d++;
70      }
71 }
72
73 #define _op_blend_mas_cn_dp_mmx _op_blend_mas_can_dp_mmx
74 #define _op_blend_mas_caa_dp_mmx _op_blend_mas_c_dp_mmx
75
76 #define _op_blend_mas_c_dpan_mmx _op_blend_mas_c_dp_mmx
77 #define _op_blend_mas_cn_dpan_mmx _op_blend_mas_cn_dp_mmx
78 #define _op_blend_mas_can_dpan_mmx _op_blend_mas_can_dp_mmx
79 #define _op_blend_mas_caa_dpan_mmx _op_blend_mas_caa_dp_mmx
80
81 static void
82 init_blend_mask_color_span_funcs_mmx(void)
83 {
84    op_blend_span_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_blend_mas_c_dp_mmx;
85    op_blend_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_mas_cn_dp_mmx;
86    op_blend_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_blend_mas_can_dp_mmx;
87    op_blend_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_blend_mas_caa_dp_mmx;
88
89    op_blend_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_blend_mas_c_dpan_mmx;
90    op_blend_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_mas_cn_dpan_mmx;
91    op_blend_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_blend_mas_can_dpan_mmx;
92    op_blend_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_blend_mas_caa_dpan_mmx;
93 }
94 #endif
95
96 #ifdef BUILD_MMX
97 static void
98 _op_blend_pt_mas_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
99         s = m + 1;
100         MOV_A2R(s, mm3)
101         MOV_A2R(ALPHA_256, mm6)
102         pxor_r2r(mm0, mm0);
103         MOV_P2R(c, mm2, mm0)
104         MUL4_256_R2R(mm2, mm3)
105
106         MOV_RA2R(mm3, mm1)
107         psubw_r2r(mm1, mm6);
108
109         MOV_P2R(*d, mm1, mm0)
110         MUL4_256_R2R(mm6, mm1)
111
112         paddw_r2r(mm3, mm1);
113         MOV_R2P(mm1, *d, mm0)
114 }
115
116
117 #define _op_blend_pt_mas_cn_dp_mmx _op_blend_pt_mas_c_dp_mmx
118 #define _op_blend_pt_mas_can_dp_mmx _op_blend_pt_mas_c_dp_mmx
119 #define _op_blend_pt_mas_caa_dp_mmx _op_blend_pt_mas_c_dp_mmx
120
121 #define _op_blend_pt_mas_c_dpan_mmx _op_blend_pt_mas_c_dp_mmx
122 #define _op_blend_pt_mas_cn_dpan_mmx _op_blend_pt_mas_cn_dp_mmx
123 #define _op_blend_pt_mas_can_dpan_mmx _op_blend_pt_mas_can_dp_mmx
124 #define _op_blend_pt_mas_caa_dpan_mmx _op_blend_pt_mas_caa_dp_mmx
125
126 static void
127 init_blend_mask_color_pt_funcs_mmx(void)
128 {
129    op_blend_pt_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_blend_pt_mas_c_dp_mmx;
130    op_blend_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_pt_mas_cn_dp_mmx;
131    op_blend_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_blend_pt_mas_can_dp_mmx;
132    op_blend_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_blend_pt_mas_caa_dp_mmx;
133
134    op_blend_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_blend_pt_mas_c_dpan_mmx;
135    op_blend_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_mas_cn_dpan_mmx;
136    op_blend_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_blend_pt_mas_can_dpan_mmx;
137    op_blend_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_blend_pt_mas_caa_dpan_mmx;
138 }
139 #endif
140
141 /*-----*/
142
143 /* blend_rel mask x color -> dst */
144
145 #ifdef BUILD_MMX
146 static void
147 _op_blend_rel_mas_c_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
148    DATA32 *e = d + l;
149    pxor_r2r(mm0, mm0);
150    MOV_A2R(ALPHA_256, mm6)
151    MOV_A2R(ALPHA_255, mm5)
152    MOV_P2R(c, mm2, mm0)
153    while (d < e) {
154         l = *m;
155         switch(l)
156           {
157             case 0:
158                 break;
159             default:
160                 l++;
161                 MOV_A2R(l, mm3)
162                 MUL4_256_R2R(mm2, mm3)
163
164                 MOV_RA2R(mm3, mm1)
165                 movq_r2r(mm6, mm7);
166                 psubw_r2r(mm1, mm7);
167
168                 MOV_P2R(*d, mm1, mm0)
169                 MOV_RA2R(mm1, mm4)
170                 MUL4_256_R2R(mm7, mm1)
171
172                 MUL4_SYM_R2R(mm4, mm3, mm5)
173
174                 paddw_r2r(mm3, mm1);
175                 MOV_R2P(mm1, *d, mm0)
176                 break;
177           }
178         m++;  d++;
179      }
180 }
181
182 #define _op_blend_rel_mas_cn_dp_mmx _op_blend_rel_mas_c_dp_mmx
183 #define _op_blend_rel_mas_can_dp_mmx _op_blend_rel_mas_c_dp_mmx
184 #define _op_blend_rel_mas_caa_dp_mmx _op_blend_rel_mas_c_dp_mmx
185
186 #define _op_blend_rel_mas_c_dpan_mmx _op_blend_mas_c_dpan_mmx
187 #define _op_blend_rel_mas_cn_dpan_mmx _op_blend_mas_cn_dpan_mmx
188 #define _op_blend_rel_mas_can_dpan_mmx _op_blend_mas_can_dpan_mmx
189 #define _op_blend_rel_mas_caa_dpan_mmx _op_blend_mas_caa_dpan_mmx
190
191 static void
192 init_blend_rel_mask_color_span_funcs_mmx(void)
193 {
194    op_blend_rel_span_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_blend_rel_mas_c_dp_mmx;
195    op_blend_rel_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_rel_mas_cn_dp_mmx;
196    op_blend_rel_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_blend_rel_mas_can_dp_mmx;
197    op_blend_rel_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_blend_rel_mas_caa_dp_mmx;
198
199    op_blend_rel_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_blend_rel_mas_c_dpan_mmx;
200    op_blend_rel_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_mas_cn_dpan_mmx;
201    op_blend_rel_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_blend_rel_mas_can_dpan_mmx;
202    op_blend_rel_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_mas_caa_dpan_mmx;
203 }
204 #endif
205
206 #ifdef BUILD_MMX
207 static void
208 _op_blend_rel_pt_mas_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
209         pxor_r2r(mm0, mm0);
210         MOV_A2R(ALPHA_256, mm6)
211         MOV_A2R(ALPHA_255, mm5)
212         s = m + 1;
213         MOV_A2R(s, mm3)
214         MOV_P2R(c, mm2, mm0)
215         MUL4_256_R2R(mm2, mm3)
216
217         MOV_RA2R(mm3, mm1)
218         psubw_r2r(mm1, mm6);
219
220         MOV_P2R(*d, mm1, mm0)
221         MOV_RA2R(mm1, mm4)
222         MUL4_256_R2R(mm6, mm1)
223
224         MUL4_SYM_R2R(mm4, mm3, mm5)
225
226         paddw_r2r(mm3, mm1);
227         MOV_R2P(mm1, *d, mm0)
228 }
229
230 #define _op_blend_rel_pt_mas_cn_dp_mmx _op_blend_rel_pt_mas_c_dp_mmx
231 #define _op_blend_rel_pt_mas_can_dp_mmx _op_blend_rel_pt_mas_c_dp_mmx
232 #define _op_blend_rel_pt_mas_caa_dp_mmx _op_blend_rel_pt_mas_c_dp_mmx
233
234 #define _op_blend_rel_pt_mas_c_dpan_mmx _op_blend_pt_mas_c_dpan_mmx
235 #define _op_blend_rel_pt_mas_cn_dpan_mmx _op_blend_pt_mas_cn_dpan_mmx
236 #define _op_blend_rel_pt_mas_can_dpan_mmx _op_blend_pt_mas_can_dpan_mmx
237 #define _op_blend_rel_pt_mas_caa_dpan_mmx _op_blend_pt_mas_caa_dpan_mmx
238
239 static void
240 init_blend_rel_mask_color_pt_funcs_mmx(void)
241 {
242    op_blend_rel_pt_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_blend_rel_pt_mas_c_dp_mmx;
243    op_blend_rel_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_rel_pt_mas_cn_dp_mmx;
244    op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_blend_rel_pt_mas_can_dp_mmx;
245    op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_blend_rel_pt_mas_caa_dp_mmx;
246
247    op_blend_rel_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_blend_rel_pt_mas_c_dpan_mmx;
248    op_blend_rel_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_mas_cn_dpan_mmx;
249    op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_blend_rel_pt_mas_can_dpan_mmx;
250    op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_pt_mas_caa_dpan_mmx;
251 }
252 #endif