From 9dbf00ebd76054999dbcb9c356d4fb06eb6f712e Mon Sep 17 00:00:00 2001 From: Kfir Itzhak Date: Thu, 22 Mar 2012 08:41:17 +0200 Subject: [PATCH] A big performance improvement for SSE2 delta (32bit RGB only). Should be useful on processors without SSSE3, such as many AMD processors. --- src/zm_image.cpp | 80 ++++++++---------------------------------------- 1 file changed, 12 insertions(+), 68 deletions(-) diff --git a/src/zm_image.cpp b/src/zm_image.cpp index 7186446ca..b6443ef18 100644 --- a/src/zm_image.cpp +++ b/src/zm_image.cpp @@ -3047,9 +3047,6 @@ __attribute__((noinline,__target__("sse2"))) void sse2_delta8_rgba(const uint8_t "mov $0xff, %%eax\n\t" "movd %%eax, %%xmm0\n\t" "pshufd $0x0, %%xmm0, %%xmm0\n\t" - "mov $0x80000000, %%eax\n\t" - "movd %%eax, %%xmm5\n\t" - "pshufd $0x0, %%xmm5, %%xmm5\n\t" "sub $0x10, %0\n\t" "sub $0x10, %1\n\t" "sub $0x4, %2\n\t" @@ -3079,20 +3076,9 @@ __attribute__((noinline,__target__("sse2"))) void sse2_delta8_rgba(const uint8_t "psrld $0x10, %%xmm2\n\t" "pand %%xmm0, %%xmm2\n\t" "paddd %%xmm2, %%xmm1\n\t" - "movdqa %%xmm1, %%xmm3\n\t" - "movdqa %%xmm1, %%xmm2\n\t" - "pand %%xmm0, %%xmm3\n\t" - "pand %%xmm0, %%xmm2\n\t" - "psrldq $0x9, %%xmm2\n\t" - "por %%xmm2, %%xmm3\n\t" - "movdqa %%xmm1, %%xmm2\n\t" - "pand %%xmm0, %%xmm2\n\t" - "psrldq $0x6, %%xmm2\n\t" - "por %%xmm2, %%xmm3\n\t" - "pand %%xmm0, %%xmm1\n\t" - "psrldq $0x3, %%xmm1\n\t" - "por %%xmm1, %%xmm3\n\t" - "movd %%xmm3, %%eax\n\t" + "packssdw %%xmm1, %%xmm1\n\t" + "packuswb %%xmm1, %%xmm1\n\t" + "movd %%xmm1, %%eax\n\t" "movnti %%eax, (%2,%3)\n\t" "sub $0x4, %3\n\t" "jnz sse2_delta8_rgba_iter\n\t" @@ -3116,9 +3102,6 @@ __attribute__((noinline,__target__("sse2"))) void sse2_delta8_bgra(const uint8_t "mov $0xff, %%eax\n\t" "movd %%eax, %%xmm0\n\t" "pshufd $0x0, %%xmm0, %%xmm0\n\t" - "mov $0x80000000, %%eax\n\t" - "movd %%eax, %%xmm5\n\t" - "pshufd $0x0, %%xmm5, %%xmm5\n\t" "sub $0x10, %0\n\t" "sub $0x10, %1\n\t" "sub $0x4, %2\n\t" @@ -3148,20 +3131,9 @@ __attribute__((noinline,__target__("sse2"))) void sse2_delta8_bgra(const uint8_t "pand %%xmm0, %%xmm2\n\t" "paddd %%xmm2, %%xmm2\n\t" "paddd %%xmm2, %%xmm1\n\t" - "movdqa %%xmm1, %%xmm3\n\t" - "movdqa %%xmm1, %%xmm2\n\t" - "pand %%xmm0, %%xmm3\n\t" - "pand %%xmm0, %%xmm2\n\t" - "psrldq $0x9, %%xmm2\n\t" - "por %%xmm2, %%xmm3\n\t" - "movdqa %%xmm1, %%xmm2\n\t" - "pand %%xmm0, %%xmm2\n\t" - "psrldq $0x6, %%xmm2\n\t" - "por %%xmm2, %%xmm3\n\t" - "pand %%xmm0, %%xmm1\n\t" - "psrldq $0x3, %%xmm1\n\t" - "por %%xmm1, %%xmm3\n\t" - "movd %%xmm3, %%eax\n\t" + "packssdw %%xmm1, %%xmm1\n\t" + "packuswb %%xmm1, %%xmm1\n\t" + "movd %%xmm1, %%eax\n\t" "movnti %%eax, (%2,%3)\n\t" "sub $0x4, %3\n\t" "jnz sse2_delta8_bgra_iter\n\t" @@ -3185,9 +3157,6 @@ __attribute__((noinline,__target__("sse2"))) void sse2_delta8_argb(const uint8_t "mov $0xff, %%eax\n\t" "movd %%eax, %%xmm0\n\t" "pshufd $0x0, %%xmm0, %%xmm0\n\t" - "mov $0x80000000, %%eax\n\t" - "movd %%eax, %%xmm5\n\t" - "pshufd $0x0, %%xmm5, %%xmm5\n\t" "sub $0x10, %0\n\t" "sub $0x10, %1\n\t" "sub $0x4, %2\n\t" @@ -3218,20 +3187,9 @@ __attribute__((noinline,__target__("sse2"))) void sse2_delta8_argb(const uint8_t "psrld $0x18, %%xmm2\n\t" "pand %%xmm0, %%xmm2\n\t" "paddd %%xmm2, %%xmm1\n\t" - "movdqa %%xmm1, %%xmm3\n\t" - "movdqa %%xmm1, %%xmm2\n\t" - "pand %%xmm0, %%xmm3\n\t" - "pand %%xmm0, %%xmm2\n\t" - "psrldq $0x9, %%xmm2\n\t" - "por %%xmm2, %%xmm3\n\t" - "movdqa %%xmm1, %%xmm2\n\t" - "pand %%xmm0, %%xmm2\n\t" - "psrldq $0x6, %%xmm2\n\t" - "por %%xmm2, %%xmm3\n\t" - "pand %%xmm0, %%xmm1\n\t" - "psrldq $0x3, %%xmm1\n\t" - "por %%xmm1, %%xmm3\n\t" - "movd %%xmm3, %%eax\n\t" + "packssdw %%xmm1, %%xmm1\n\t" + "packuswb %%xmm1, %%xmm1\n\t" + "movd %%xmm1, %%eax\n\t" "movnti %%eax, (%2,%3)\n\t" "sub $0x4, %3\n\t" "jnz sse2_delta8_argb_iter\n\t" @@ -3255,9 +3213,6 @@ __attribute__((noinline,__target__("sse2"))) void sse2_delta8_abgr(const uint8_t "mov $0xff, %%eax\n\t" "movd %%eax, %%xmm0\n\t" "pshufd $0x0, %%xmm0, %%xmm0\n\t" - "mov $0x80000000, %%eax\n\t" - "movd %%eax, %%xmm5\n\t" - "pshufd $0x0, %%xmm5, %%xmm5\n\t" "sub $0x10, %0\n\t" "sub $0x10, %1\n\t" "sub $0x4, %2\n\t" @@ -3288,20 +3243,9 @@ __attribute__((noinline,__target__("sse2"))) void sse2_delta8_abgr(const uint8_t "pand %%xmm0, %%xmm2\n\t" "paddd %%xmm2, %%xmm2\n\t" "paddd %%xmm2, %%xmm1\n\t" - "movdqa %%xmm1, %%xmm3\n\t" - "movdqa %%xmm1, %%xmm2\n\t" - "pand %%xmm0, %%xmm3\n\t" - "pand %%xmm0, %%xmm2\n\t" - "psrldq $0x9, %%xmm2\n\t" - "por %%xmm2, %%xmm3\n\t" - "movdqa %%xmm1, %%xmm2\n\t" - "pand %%xmm0, %%xmm2\n\t" - "psrldq $0x6, %%xmm2\n\t" - "por %%xmm2, %%xmm3\n\t" - "pand %%xmm0, %%xmm1\n\t" - "psrldq $0x3, %%xmm1\n\t" - "por %%xmm1, %%xmm3\n\t" - "movd %%xmm3, %%eax\n\t" + "packssdw %%xmm1, %%xmm1\n\t" + "packuswb %%xmm1, %%xmm1\n\t" + "movd %%xmm1, %%eax\n\t" "movnti %%eax, (%2,%3)\n\t" "sub $0x4, %3\n\t" "jnz sse2_delta8_abgr_iter\n\t"