2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
5 #include "evas_common.h"
7 #if defined BUILD_MMX || defined BUILD_SSE
13 static void evas_common_copy_pixels_c (DATA32 *src, DATA32 *dst, int len);
14 static void evas_common_copy_pixels_mmx (DATA32 *src, DATA32 *dst, int len);
15 static void evas_common_copy_pixels_mmx2 (DATA32 *src, DATA32 *dst, int len);
16 static void evas_common_copy_pixels_sse/*NB*/ (DATA32 *src, DATA32 *dst, int len);
18 static void evas_common_copy_pixels_rev_c (DATA32 *src, DATA32 *dst, int len);
19 static void evas_common_copy_pixels_rev_mmx (DATA32 *src, DATA32 *dst, int len);
20 static void evas_common_copy_pixels_rev_sse/*NB*/ (DATA32 *src, DATA32 *dst, int len);
22 static void evas_common_copy_rev_pixels_c (DATA32 *src, DATA32 *dst, int len);
26 evas_common_blit_init(void)
31 evas_common_blit_rectangle(const RGBA_Image *src, RGBA_Image *dst, int src_x, int src_y, int w, int h, int dst_x, int dst_y)
35 DATA32 *src_ptr, *dst_ptr;
39 if (src_x + w > src->cache_entry.w) w = src->cache_entry.w - src_x;
50 if (src_y + h > src->cache_entry.h) h = src->cache_entry.h - src_y;
61 if (dst_x + w > dst->cache_entry.w) w = dst->cache_entry.w - dst_x;
72 if (dst_y + h > dst->cache_entry.h) h = dst->cache_entry.h - dst_y;
84 /* src after dst - go forward */
85 if (((src_y * src->cache_entry.w) + src_x) > ((dst_y * dst->cache_entry.w) + dst_x))
87 func = evas_common_draw_func_copy_get(w, 0);
88 for (y = 0; y < h; y++)
90 src_ptr = src->image.data + ((y + src_y) * src->cache_entry.w) + src_x;
91 dst_ptr = dst->image.data + ((y + dst_y) * dst->cache_entry.w) + dst_x;
92 func(src_ptr, dst_ptr, w);
98 func = evas_common_draw_func_copy_get(w, 1);
99 for (y = h - 1; y >= 0; y--)
101 src_ptr = src->image.data + ((y + src_y) * src->cache_entry.w) + src_x;
102 dst_ptr = dst->image.data + ((y + dst_y) * dst->cache_entry.w) + dst_x;
103 func(src_ptr, dst_ptr, w);
109 func = evas_common_draw_func_copy_get(w, 0);
110 for (y = 0; y < h; y++)
112 src_ptr = src->image.data + ((y + src_y) * src->cache_entry.w) + src_x;
113 dst_ptr = dst->image.data + ((y + dst_y) * dst->cache_entry.w) + dst_x;
114 func(src_ptr, dst_ptr, w);
120 /****************************************************************************/
123 evas_common_copy_rev_pixels_c(DATA32 *src, DATA32 *dst, int len)
125 DATA32 *dst_end = dst + len;
128 while (dst < dst_end)
134 evas_common_copy_pixels_c(DATA32 *src, DATA32 *dst, int len)
136 DATA32 *dst_end = dst + len;
138 while (dst < dst_end)
145 evas_common_copy_pixels_mmx(DATA32 *src, DATA32 *dst, int len)
147 DATA32 *dst_end, *dst_end_pre;
152 src_align = (intptr_t)src & 0x3f; /* 64 byte alignment */
153 dst_align = (intptr_t)dst & 0x3f; /* 64 byte alignment */
155 if ((src_align != dst_align) ||
156 ((src_align & 0x3) != 0))
159 evas_common_copy_pixels_c(src, dst, len);
164 while ((src_align > 0) && (len > 0))
168 src_align -= sizeof(DATA32);
170 #endif /* ALIGN_FIX */
173 dst_end_pre = dst + ((len / 16) * 16);
175 while (dst < dst_end_pre)
177 MOVE_16DWORDS_MMX(src, dst);
181 while (dst < dst_end)
188 evas_common_copy_pixels_mmx2(DATA32 *src, DATA32 *dst, int len)
190 DATA32 *dst_end, *dst_end_pre;
195 src_align = (intptr_t)src & 0x3f; /* 64 byte alignment */
196 dst_align = (intptr_t)dst & 0x3f; /* 64 byte alignment */
198 if ((src_align != dst_align) ||
199 ((src_align & 0x3) != 0))
202 evas_common_copy_pixels_c(src, dst, len);
207 while ((src_align > 0) && (len > 0))
211 src_align -= sizeof(DATA32);
216 dst_end_pre = dst + ((len / 16) * 16);
218 while (dst < dst_end_pre)
220 MOVE_16DWORDS_MMX(src, dst);
224 while (dst < dst_end)
231 evas_common_copy_pixels_sse(DATA32 *src, DATA32 *dst, int len)
233 DATA32 *src_ptr, *dst_ptr, *dst_end_ptr;
235 dst_end_ptr = dst + len;
239 while (dst_ptr < dst_end_ptr)
241 MOVE_16DWORDS_MMX2(src_ptr, dst_ptr);
245 dst_end_ptr = dst + len;
246 while (dst_ptr < dst_end_ptr)
257 src_align = (int)src & 0x3f; /* 64 byte alignment */
258 dst_align = (int)dst & 0x3f; /* 64 byte alignment */
260 if ((src_align != dst_align) ||
261 ((src_align & 0x3) != 0))
264 evas_common_copy_pixels_c(src, dst, len);
269 while ((src_align > 0) && (len > 0))
275 src_align -= sizeof(DATA32);
277 #endif /* ALIGN_FIX */
281 dst_end_ptr = dst + len;
282 dst_end_ptr_pre = dst + ((len / 16) * 16);
284 while (dst_ptr < dst_end_ptr_pre)
286 prefetch(&src_ptr[16]);
287 MOVE_16DWORDS_MMX(src_ptr, dst_ptr);
291 while (dst_ptr < dst_end_ptr)
301 /****************************************************************************/
305 evas_common_copy_pixels_rev_c(DATA32 *src, DATA32 *dst, int len)
313 while (dst > dst_end)
320 evas_common_copy_pixels_rev_mmx(DATA32 *src, DATA32 *dst, int len)
322 DATA32 *dst_end, *dst_end_pre;
326 src = src + len - 16;
328 dst_end_pre = dst + len - ((len / 16) * 16);
329 dst = dst + len - 16;
331 while (dst >= dst_end_pre)
333 MOVE_16DWORDS_MMX(src, dst);
339 while (dst >= dst_end)
347 while (dst > dst_end)
355 evas_common_copy_pixels_rev_sse(DATA32 *src, DATA32 *dst, int len)
357 DATA32 *src_ptr, *dst_ptr, *dst_end_ptr, *dst_end_ptr_pre;
359 src_ptr = src + len - 16;
360 dst_ptr = dst + len - 16;
362 dst_end_ptr_pre = dst + len - ((len / 16) * 16);
366 while (dst_ptr >= dst_end_ptr_pre)
368 prefetch(&src_ptr[-16]);
369 MOVE_10DWORDS_MMX(src_ptr, dst_ptr);
375 while (dst_ptr >= dst_end_ptr)
384 src_ptr = src + len - 1;
385 dst_ptr = dst + len - 1;
386 while (dst_ptr >= dst_end_ptr)
398 evas_common_draw_func_copy_get(int pixels, int reverse)
401 return evas_common_copy_rev_pixels_c;
405 if (evas_common_cpu_has_feature(CPU_FEATURE_SSE) && (pixels > 256 * 256))
406 return evas_common_copy_pixels_rev_sse;
412 if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
413 return evas_common_copy_pixels_rev_mmx;
419 return evas_common_copy_pixels_rev_c;
428 if (evas_common_cpu_has_feature(CPU_FEATURE_MMX2))
430 return evas_common_copy_pixels_mmx2;
437 if (evas_common_cpu_has_feature(CPU_FEATURE_SSE) && (pixels > 64 * 64))
439 return evas_common_copy_pixels_sse;
446 if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
448 return evas_common_copy_pixels_mmx;
454 return evas_common_copy_pixels_c;
460 if (evas_common_cpu_has_feature(CPU_FEATURE_SSE) && (pixels > 256 * 256))
461 return evas_common_copy_pixels_sse;
468 if (evas_common_cpu_has_feature(CPU_FEATURE_MMX2))
470 return evas_common_copy_pixels_mmx2;
472 else if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
474 return evas_common_copy_pixels_mmx;
480 return evas_common_copy_pixels_c;
486 return evas_common_copy_pixels_c;