diff options
Diffstat (limited to 'libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_i386.c')
-rw-r--r-- | libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_i386.c | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_i386.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_i386.c new file mode 100644 index 0000000..9b5abe6 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_i386.c | |||
@@ -0,0 +1,217 @@ | |||
1 | /* blend pixel --> dst */ | ||
2 | |||
3 | #ifdef BUILD_MMX | ||
4 | static void | ||
5 | _op_blend_p_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) { | ||
6 | DATA32 *e = d + l; | ||
7 | pxor_r2r(mm0, mm0); | ||
8 | MOV_A2R(ALPHA_256, mm6) | ||
9 | while (d < e) | ||
10 | { | ||
11 | MOV_P2R(*s, mm2, mm0) | ||
12 | MOV_RA2R(mm2, mm1) | ||
13 | movq_r2r(mm6, mm3); | ||
14 | psubw_r2r(mm1, mm3); | ||
15 | |||
16 | MOV_P2R(*d, mm1, mm0) | ||
17 | MUL4_256_R2R(mm3, mm1) | ||
18 | |||
19 | paddw_r2r(mm2, mm1); | ||
20 | MOV_R2P(mm1, *d, mm0) | ||
21 | s++; d++; | ||
22 | } | ||
23 | } | ||
24 | |||
25 | static void | ||
26 | _op_blend_pas_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) { | ||
27 | _op_blend_p_dp_mmx(s, m, c, d, l); | ||
28 | return; | ||
29 | DATA32 *e = d + l; | ||
30 | pxor_r2r(mm0, mm0); | ||
31 | MOV_A2R(ALPHA_256, mm6) | ||
32 | while (d < e) | ||
33 | { | ||
34 | switch (*s & 0xff000000) | ||
35 | { | ||
36 | case 0: | ||
37 | break; | ||
38 | case 0xff000000: | ||
39 | *d = *s; | ||
40 | break; | ||
41 | default : | ||
42 | MOV_P2R(*s, mm2, mm0) | ||
43 | MOV_RA2R(mm2, mm1) | ||
44 | movq_r2r(mm6, mm3); | ||
45 | psubw_r2r(mm1, mm3); | ||
46 | |||
47 | MOV_P2R(*d, mm1, mm0) | ||
48 | MUL4_256_R2R(mm3, mm1) | ||
49 | |||
50 | paddw_r2r(mm2, mm1); | ||
51 | MOV_R2P(mm1, *d, mm0) | ||
52 | break; | ||
53 | } | ||
54 | s++; d++; | ||
55 | } | ||
56 | } | ||
57 | |||
58 | #define _op_blend_pan_dp_mmx NULL | ||
59 | |||
60 | #define _op_blend_p_dpan_mmx _op_blend_p_dp_mmx | ||
61 | #define _op_blend_pas_dpan_mmx _op_blend_pas_dp_mmx | ||
62 | #define _op_blend_pan_dpan_mmx _op_blend_pan_dp_mmx | ||
63 | |||
64 | static void | ||
65 | init_blend_pixel_span_funcs_mmx(void) | ||
66 | { | ||
67 | op_blend_span_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_blend_p_dp_mmx; | ||
68 | op_blend_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_blend_pas_dp_mmx; | ||
69 | op_blend_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_blend_pan_dp_mmx; | ||
70 | |||
71 | op_blend_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_p_dpan_mmx; | ||
72 | op_blend_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_pas_dpan_mmx; | ||
73 | op_blend_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_pan_dpan_mmx; | ||
74 | } | ||
75 | #endif | ||
76 | |||
77 | #ifdef BUILD_MMX | ||
78 | static void | ||
79 | _op_blend_pt_p_dp_mmx(DATA32 s, DATA8 m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d) { | ||
80 | pxor_r2r(mm0, mm0); | ||
81 | MOV_A2R(ALPHA_256, mm6) | ||
82 | MOV_P2R(s, mm2, mm0) | ||
83 | MOV_RA2R(mm2, mm1) | ||
84 | movq_r2r(mm6, mm3); | ||
85 | psubw_r2r(mm1, mm3); | ||
86 | |||
87 | MOV_P2R(*d, mm1, mm0) | ||
88 | MUL4_256_R2R(mm3, mm1) | ||
89 | |||
90 | paddw_r2r(mm2, mm1); | ||
91 | MOV_R2P(mm1, *d, mm0) | ||
92 | } | ||
93 | |||
94 | |||
95 | #define _op_blend_pt_pan_dp_mmx NULL | ||
96 | #define _op_blend_pt_pas_dp_mmx _op_blend_pt_p_dp_mmx | ||
97 | |||
98 | #define _op_blend_pt_p_dpan_mmx _op_blend_pt_p_dp_mmx | ||
99 | #define _op_blend_pt_pan_dpan_mmx _op_blend_pt_pan_dp_mmx | ||
100 | #define _op_blend_pt_pas_dpan_mmx _op_blend_pt_pas_dp_mmx | ||
101 | |||
102 | static void | ||
103 | init_blend_pixel_pt_funcs_mmx(void) | ||
104 | { | ||
105 | op_blend_pt_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_blend_pt_p_dp_mmx; | ||
106 | op_blend_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_blend_pt_pas_dp_mmx; | ||
107 | op_blend_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_blend_pt_pan_dp_mmx; | ||
108 | |||
109 | op_blend_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_p_dpan_mmx; | ||
110 | op_blend_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_pas_dpan_mmx; | ||
111 | op_blend_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_pan_dpan_mmx; | ||
112 | } | ||
113 | #endif | ||
114 | |||
115 | /*-----*/ | ||
116 | |||
117 | /* blend_rel pixel -> dst */ | ||
118 | |||
119 | #ifdef BUILD_MMX | ||
120 | static void | ||
121 | _op_blend_rel_p_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) { | ||
122 | DATA32 *e = d + l; | ||
123 | pxor_r2r(mm0, mm0); | ||
124 | MOV_A2R(ALPHA_256, mm6) | ||
125 | MOV_A2R(ALPHA_255, mm5) | ||
126 | while (d < e) | ||
127 | { | ||
128 | MOV_P2R(*s, mm2, mm0) | ||
129 | MOV_RA2R(mm2, mm1) | ||
130 | movq_r2r(mm6, mm3); | ||
131 | psubw_r2r(mm1, mm3); | ||
132 | |||
133 | MOV_P2R(*d, mm1, mm0) | ||
134 | MOV_RA2R(mm1, mm4) | ||
135 | MUL4_256_R2R(mm3, mm1) | ||
136 | |||
137 | MUL4_SYM_R2R(mm4, mm2, mm5) | ||
138 | paddw_r2r(mm2, mm1); | ||
139 | MOV_R2P(mm1, *d, mm0) | ||
140 | s++; d++; | ||
141 | } | ||
142 | } | ||
143 | |||
144 | static void | ||
145 | _op_blend_rel_pan_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) { | ||
146 | DATA32 *e = d + l; | ||
147 | pxor_r2r(mm0, mm0); | ||
148 | MOV_A2R(ALPHA_256, mm6) | ||
149 | MOV_A2R(ALPHA_255, mm5) | ||
150 | while (d < e) | ||
151 | { | ||
152 | MOV_P2R(*s, mm2, mm0) | ||
153 | MOV_PA2R(*d, mm1) | ||
154 | MUL4_SYM_R2R(mm2, mm1, mm5) | ||
155 | MOV_R2P(mm1, *d, mm0) | ||
156 | s++; d++; | ||
157 | } | ||
158 | } | ||
159 | |||
160 | #define _op_blend_rel_pas_dp_mmx _op_blend_rel_p_dp_mmx | ||
161 | |||
162 | #define _op_blend_rel_p_dpan_mmx _op_blend_p_dpan_mmx | ||
163 | #define _op_blend_rel_pan_dpan_mmx _op_blend_pan_dpan_mmx | ||
164 | #define _op_blend_rel_pas_dpan_mmx _op_blend_pas_dpan_mmx | ||
165 | |||
166 | static void | ||
167 | init_blend_rel_pixel_span_funcs_mmx(void) | ||
168 | { | ||
169 | op_blend_rel_span_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_blend_rel_p_dp_mmx; | ||
170 | op_blend_rel_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_blend_rel_pas_dp_mmx; | ||
171 | op_blend_rel_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_blend_rel_pan_dp_mmx; | ||
172 | |||
173 | op_blend_rel_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_p_dpan_mmx; | ||
174 | op_blend_rel_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pas_dpan_mmx; | ||
175 | op_blend_rel_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pan_dpan_mmx; | ||
176 | } | ||
177 | #endif | ||
178 | |||
179 | #ifdef BUILD_MMX | ||
180 | static void | ||
181 | _op_blend_rel_pt_p_dp_mmx(DATA32 s, DATA8 m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d) { | ||
182 | pxor_r2r(mm0, mm0); | ||
183 | MOV_A2R(ALPHA_256, mm6) | ||
184 | MOV_A2R(ALPHA_255, mm5) | ||
185 | |||
186 | MOV_P2R(s, mm2, mm0) | ||
187 | MOV_RA2R(mm2, mm1) | ||
188 | psubw_r2r(mm1, mm6); | ||
189 | |||
190 | MOV_P2R(*d, mm1, mm0) | ||
191 | MOV_RA2R(mm1, mm4) | ||
192 | MUL4_256_R2R(mm6, mm1) | ||
193 | |||
194 | MUL4_SYM_R2R(mm4, mm2, mm5) | ||
195 | paddw_r2r(mm2, mm1); | ||
196 | MOV_R2P(mm1, *d, mm0) | ||
197 | } | ||
198 | |||
199 | #define _op_blend_rel_pt_pas_dp_mmx _op_blend_rel_pt_p_dp_mmx | ||
200 | #define _op_blend_rel_pt_pan_dp_mmx _op_blend_rel_pt_p_dp_mmx | ||
201 | |||
202 | #define _op_blend_rel_pt_p_dpan_mmx _op_blend_pt_p_dpan_mmx | ||
203 | #define _op_blend_rel_pt_pas_dpan_mmx _op_blend_pt_pas_dpan_mmx | ||
204 | #define _op_blend_rel_pt_pan_dpan_mmx _op_blend_pt_pan_dpan_mmx | ||
205 | |||
206 | static void | ||
207 | init_blend_rel_pixel_pt_funcs_mmx(void) | ||
208 | { | ||
209 | op_blend_rel_pt_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_blend_rel_pt_p_dp_mmx; | ||
210 | op_blend_rel_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_blend_rel_pt_pas_dp_mmx; | ||
211 | op_blend_rel_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_blend_rel_pt_pan_dp_mmx; | ||
212 | |||
213 | op_blend_rel_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_p_dpan_mmx; | ||
214 | op_blend_rel_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_pas_dpan_mmx; | ||
215 | op_blend_rel_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_pan_dpan_mmx; | ||
216 | } | ||
217 | #endif | ||