[FFmpeg-devel] [PATCH 05/15] vp9/x86: simplify ABSSUM_CMP by inverting the comparison meaning.

Ronald S. Bultje rsbultje at gmail.com
Sat Dec 27 17:02:40 CET 2014


---
 libavcodec/x86/vp9lpf.asm | 103 +++++++++++++++++++++++-----------------------
 1 file changed, 52 insertions(+), 51 deletions(-)

diff --git a/libavcodec/x86/vp9lpf.asm b/libavcodec/x86/vp9lpf.asm
index 44db472..613a104 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) {
-- 
2.1.2



More information about the ffmpeg-devel mailing list