diff options
author | Ronald S. Bultje | 2014-12-21 19:34:03 -0500 |
---|---|---|
committer | Ronald S. Bultje | 2014-12-27 16:55:12 -0500 |
commit | 418c202c6363c617adbb353a63db983a744e0b34 (patch) | |
tree | 3577442473859c928cf45bac38045c25b272a36e /libavcodec/x86/vp9lpf.asm | |
parent | d1c55654e11c6aa1e032c6a9dc7cc13bfce4c5d5 (diff) |
vp9/x86: simplify ABSSUM_CMP by inverting the comparison meaning.
Diffstat (limited to 'libavcodec/x86/vp9lpf.asm')
-rw-r--r-- | libavcodec/x86/vp9lpf.asm | 103 |
1 files changed, 52 insertions, 51 deletions
diff --git a/libavcodec/x86/vp9lpf.asm b/libavcodec/x86/vp9lpf.asm index 44db472806..613a104cc6 100644 --- a/libavcodec/x86/vp9lpf.asm +++ b/libavcodec/x86/vp9lpf.asm @@ -35,6 +35,7 @@ pb_40: times 16 db 0x40 pb_81: times 16 db 0x81 pb_f8: times 16 db 0xf8 pb_fe: times 16 db 0xfe +pb_ff: times 16 db 0xff cextern pw_4 cextern pw_8 @@ -58,20 +59,18 @@ SECTION .text por %1, %4 %endmacro -; %1 = %1<=%2 -%macro CMP_LTE 3-4 ; src/dst, cmp, tmp, pb_80 -%if %0 == 4 - pxor %1, %4 +; %1 = %1>%2 +%macro CMP_GT 2-3 ; src/dst, cmp, pb_80 +%if %0 == 3 + pxor %1, %3 %endif - pcmpgtb %3, %2, %1 ; cmp > src? - pcmpeqb %1, %2 ; cmp == src? XXX: avoid this with a -1/+1 well placed? - por %1, %3 ; cmp >= src? + pcmpgtb %1, %2 %endmacro -; %1 = abs(%2-%3) <= %4 -%macro ABSSUB_CMP 5-6 [pb_80]; dst, src1, src2, cmp, tmp, [pb_80] +; %1 = abs(%2-%3) > %4 +%macro ABSSUB_GT 5-6 [pb_80]; dst, src1, src2, cmp, tmp, [pb_80] ABSSUB %1, %2, %3, %5 ; dst = abs(src1-src2) - CMP_LTE %1, %4, %5, %6 ; dst <= cmp + CMP_GT %1, %4, %6 ; dst > cmp %endmacro %macro MASK_APPLY 4 ; %1=new_data/dst %2=old_data %3=mask %4=tmp @@ -438,17 +437,17 @@ cglobal vp9_loop_filter_%1_%2_16, 2, 6, 16, %3, dst, stride, mstride, dst2, stri SWAP 10, 6, 14 SWAP 11, 7, 15 %endif - ABSSUB_CMP m5, m8, m9, m2, m7, m0 ; m5 = abs(p3-p2) <= I - ABSSUB_CMP m1, m9, m10, m2, m7, m0 ; m1 = abs(p2-p1) <= I - pand m5, m1 - ABSSUB_CMP m1, m10, m11, m2, m7, m0 ; m1 = abs(p1-p0) <= I - pand m5, m1 - ABSSUB_CMP m1, m12, m13, m2, m7, m0 ; m1 = abs(q1-q0) <= I - pand m5, m1 - ABSSUB_CMP m1, m13, m14, m2, m7, m0 ; m1 = abs(q2-q1) <= I - pand m5, m1 - ABSSUB_CMP m1, m14, m15, m2, m7, m0 ; m1 = abs(q3-q2) <= I - pand m5, m1 + ABSSUB_GT m5, m8, m9, m2, m7, m0 ; m5 = abs(p3-p2) <= I + ABSSUB_GT m1, m9, m10, m2, m7, m0 ; m1 = abs(p2-p1) <= I + por m5, m1 + ABSSUB_GT m1, m10, m11, m2, m7, m0 ; m1 = abs(p1-p0) <= I + por m5, m1 + ABSSUB_GT m1, m12, m13, m2, m7, m0 ; m1 = abs(q1-q0) <= I + por m5, m1 + ABSSUB_GT m1, m13, m14, m2, m7, m0 ; m1 = abs(q2-q1) <= I + por m5, m1 + ABSSUB_GT m1, m14, m15, m2, m7, m0 ; m1 = abs(q3-q2) <= I + por m5, m1 ABSSUB m1, m11, m12, m7 ; abs(p0-q0) paddusb m1, m1 ; abs(p0-q0) * 2 ABSSUB m2, m10, m13, m7 ; abs(p1-q1) @@ -456,19 +455,19 @@ cglobal vp9_loop_filter_%1_%2_16, 2, 6, 16, %3, dst, stride, mstride, dst2, stri psrlq m2, 1 ; abs(p1-q1)/2 paddusb m1, m2 ; abs(p0-q0)*2 + abs(p1-q1)/2 pxor m1, m0 - pcmpgtb m4, m3, m1 ; E > X? - pcmpeqb m3, m1 ; E == X? - por m3, m4 ; E >= X? - pand m3, m5 ; fm final value + pcmpgtb m1, m3 + por m1, m5 ; fm final value + SWAP 1, 3 + pxor m3, [pb_ff] ; (m3: fm, m8..15: p3 p2 p1 p0 q0 q1 q2 q3) ; calc flat8in (if not 44_16) and hev masks mova m6, [pb_81] ; [1 1 1 1 ...] ^ 0x80 %if %2 != 44 - ABSSUB_CMP m2, m8, m11, m6, m5 ; abs(p3 - p0) <= 1 + ABSSUB_GT m2, m8, m11, m6, m5 ; abs(p3 - p0) <= 1 mova m8, [pb_80] - ABSSUB_CMP m1, m9, m11, m6, m5, m8 ; abs(p2 - p0) <= 1 - pand m2, m1 + ABSSUB_GT m1, m9, m11, m6, m5, m8 ; abs(p2 - p0) <= 1 + por m2, m1 ABSSUB m4, m10, m11, m5 ; abs(p1 - p0) %if %2 == 16 %if cpuflag(ssse3) @@ -482,18 +481,19 @@ cglobal vp9_loop_filter_%1_%2_16, 2, 6, 16, %3, dst, stride, mstride, dst2, stri pxor m7, m8 pxor m4, m8 pcmpgtb m0, m4, m7 ; abs(p1 - p0) > H (1/2 hev condition) - CMP_LTE m4, m6, m5 ; abs(p1 - p0) <= 1 - pand m2, m4 ; (flat8in) + CMP_GT m4, m6 ; abs(p1 - p0) <= 1 + por m2, m4 ; (flat8in) ABSSUB m4, m13, m12, m1 ; abs(q1 - q0) pxor m4, m8 pcmpgtb m5, m4, m7 ; abs(q1 - q0) > H (2/2 hev condition) por m0, m5 ; hev final value - CMP_LTE m4, m6, m5 ; abs(q1 - q0) <= 1 - pand m2, m4 ; (flat8in) - ABSSUB_CMP m1, m14, m12, m6, m5, m8 ; abs(q2 - q0) <= 1 - pand m2, m1 - ABSSUB_CMP m1, m15, m12, m6, m5, m8 ; abs(q3 - q0) <= 1 - pand m2, m1 ; flat8in final value + CMP_GT m4, m6 ; abs(q1 - q0) <= 1 + por m2, m4 ; (flat8in) + ABSSUB_GT m1, m14, m12, m6, m5, m8 ; abs(q2 - q0) <= 1 + por m2, m1 + ABSSUB_GT m1, m15, m12, m6, m5, m8 ; abs(q3 - q0) <= 1 + por m2, m1 ; flat8in final value + pxor m2, [pb_ff] %if %2 == 84 || %2 == 48 pand m2, [mask_mix%2] %endif @@ -516,27 +516,28 @@ cglobal vp9_loop_filter_%1_%2_16, 2, 6, 16, %3, dst, stride, mstride, dst2, stri ; calc flat8out mask mova m8, [P7] mova m9, [P6] - ABSSUB_CMP m1, m8, m11, m6, m5 ; abs(p7 - p0) <= 1 - ABSSUB_CMP m7, m9, m11, m6, m5 ; abs(p6 - p0) <= 1 - pand m1, m7 + ABSSUB_GT m1, m8, m11, m6, m5 ; abs(p7 - p0) <= 1 + ABSSUB_GT m7, m9, m11, m6, m5 ; abs(p6 - p0) <= 1 + por m1, m7 mova m8, [P5] mova m9, [P4] - ABSSUB_CMP m7, m8, m11, m6, m5 ; abs(p5 - p0) <= 1 - pand m1, m7 - ABSSUB_CMP m7, m9, m11, m6, m5 ; abs(p4 - p0) <= 1 - pand m1, m7 + ABSSUB_GT m7, m8, m11, m6, m5 ; abs(p5 - p0) <= 1 + por m1, m7 + ABSSUB_GT m7, m9, m11, m6, m5 ; abs(p4 - p0) <= 1 + por m1, m7 mova m14, [Q4] mova m15, [Q5] - ABSSUB_CMP m7, m14, m12, m6, m5 ; abs(q4 - q0) <= 1 - pand m1, m7 - ABSSUB_CMP m7, m15, m12, m6, m5 ; abs(q5 - q0) <= 1 - pand m1, m7 + ABSSUB_GT m7, m14, m12, m6, m5 ; abs(q4 - q0) <= 1 + por m1, m7 + ABSSUB_GT m7, m15, m12, m6, m5 ; abs(q5 - q0) <= 1 + por m1, m7 mova m14, [Q6] mova m15, [Q7] - ABSSUB_CMP m7, m14, m12, m6, m5 ; abs(q4 - q0) <= 1 - pand m1, m7 - ABSSUB_CMP m7, m15, m12, m6, m5 ; abs(q5 - q0) <= 1 - pand m1, m7 ; flat8out final value + ABSSUB_GT m7, m14, m12, m6, m5 ; abs(q4 - q0) <= 1 + por m1, m7 + ABSSUB_GT m7, m15, m12, m6, m5 ; abs(q5 - q0) <= 1 + por m1, m7 ; flat8out final value + pxor m1, [pb_ff] %endif ; if (fm) { |