diff options
author | Martin Storsjö <martin@martin.st> | 2019-03-05 12:43:25 +0300 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2019-03-05 23:20:09 +0300 |
commit | 8f8dc9281629cf187f542a64b023782b50ed1881 (patch) | |
tree | 40057b19b9cbc158d8516f95de8e0286c6e7c6f5 /src/arm/64/cdef.S | |
parent | 4f5261a0ed399dcec88c87f34d1095b0152b9ae1 (diff) |
arm64: cdef: Use a smarter padding constant
Pad with a value which works both as a large unsigned value and a
negative signed value. This allows doing the max operation using
signed max, avoiding the conditional altogether.
Based on the same idea for x86 by Kyle Siefring.
Before: Cortex A53 A72 A73
cdef_filter_4x4_8bpc_neon: 645.5 401.9 422.5
cdef_filter_4x8_8bpc_neon: 1193.7 756.6 782.4
cdef_filter_8x8_8bpc_neon: 2162.4 1361.9 1375.6
After:
cdef_filter_4x4_8bpc_neon: 596.3 377.8 384.8
cdef_filter_4x8_8bpc_neon: 1097.4 705.5 707.1
cdef_filter_8x8_8bpc_neon: 1967.4 1232.3 1239.9
Diffstat (limited to 'src/arm/64/cdef.S')
-rw-r--r-- | src/arm/64/cdef.S | 17 |
1 files changed, 5 insertions, 12 deletions
diff --git a/src/arm/64/cdef.S b/src/arm/64/cdef.S index 8913cde..3dc5c58 100644 --- a/src/arm/64/cdef.S +++ b/src/arm/64/cdef.S @@ -136,8 +136,7 @@ .macro padding_func w, stride, rn, rw function cdef_padding\w\()_neon, export=1 - movi v30.16b, #255 - ushr v30.8h, v30.8h, #1 // INT16_MAX + movi v30.8h, #0x80, lsl #8 mov v31.16b, v30.16b sub x0, x0, #2*(2*\stride+2) tst w6, #4 // CDEF_HAVE_TOP @@ -290,14 +289,10 @@ endconst .endif .endm .macro handle_pixel s1, s2, threshold, thresh_vec, shift, tap - cmeq v16.8h, \s1\().8h, v31.8h - cmeq v17.8h, \s2\().8h, v31.8h - bic v16.16b, \s1\().16b, v16.16b - bic v17.16b, \s2\().16b, v17.16b umin v2.8h, v2.8h, \s1\().8h - umax v3.8h, v3.8h, v16.8h + smax v3.8h, v3.8h, \s1\().8h umin v2.8h, v2.8h, \s2\().8h - umax v3.8h, v3.8h, v17.8h + smax v3.8h, v3.8h, \s2\().8h cbz \threshold, 3f uabd v16.8h, v0.8h, \s1\().8h // abs(diff) @@ -308,8 +303,8 @@ endconst uqsub v21.8h, \thresh_vec, v21.8h // imax(0, threshold - (abs(diff) >> shift)) cmhi v18.8h, v0.8h, \s1\().8h // px > p0 cmhi v22.8h, v0.8h, \s2\().8h // px > p1 - smin v17.8h, v17.8h, v16.8h // imin(abs(diff), imax()) - smin v21.8h, v21.8h, v20.8h // imin(abs(diff), imax()) + umin v17.8h, v17.8h, v16.8h // imin(abs(diff), imax()) + umin v21.8h, v21.8h, v20.8h // imin(abs(diff), imax()) dup v19.8h, \tap // taps[k]/taps[k] neg v16.8h, v17.8h // -imin() neg v20.8h, v21.8h // -imin() @@ -330,10 +325,8 @@ function cdef_filter\w\()_neon, export=1 add x8, x8, w9, uxtw #1 movrel x9, directions\w add x5, x9, w5, uxtw #1 - movi v31.16b, #255 movi v30.8h, #15 dup v28.8h, w6 // damping - ushr v31.8h, v31.8h, #1 // INT16_MAX dup v25.8h, w3 // threshold dup v27.8h, w4 // threshold |