Move the CLPF damping adjustment for strength up in the call chain Rather than having the adjustment in the leaf functions, do the adjustment in the top-level function. Optimising compilers would figure this out themselves as far as the functions are inlined, but probably no further and this patch gives a slightly reduced object code size. Change-Id: I104750962f613fa665391c9b2a9e99bcc6f47f93
diff --git a/av1/common/clpf_simd.h b/av1/common/clpf_simd.h index 0be61be..7217131 100644 --- a/av1/common/clpf_simd.h +++ b/av1/common/clpf_simd.h
@@ -13,20 +13,19 @@ #include "aom_ports/mem.h" #include "aom_ports/bitops.h" -// sign(a-b) * min(abs(a-b), strength - (abs(a-b) >> (dmp-log2(strength)))) +// sign(a - b) * min(abs(a - b), max(0, strength - (abs(a - b) >> adjdamp))) SIMD_INLINE v128 constrain(v128 a, v128 b, unsigned int strength, - unsigned int damping) { + unsigned int adjdamp) { const v128 diff = v128_sub_8(v128_max_u8(a, b), v128_min_u8(a, b)); const v128 sign = v128_cmpeq_8(v128_min_u8(a, b), a); // -(a <= b) - const v128 s = v128_ssub_u8(v128_dup_8(strength), - v128_shr_u8(diff, damping - get_msb(strength))); + const v128 s = v128_ssub_u8(v128_dup_8(strength), v128_shr_u8(diff, adjdamp)); return v128_xor(v128_add_8(sign, v128_min_u8(diff, s)), sign); } -// delta = 1/16 * constrain(a, x, s) + 3/16 * constrain(b, x, s) + -// 1/16 * constrain(c, x, s) + 3/16 * constrain(d, x, s) + -// 3/16 * constrain(e, x, s) + 1/16 * constrain(f, x, s) + -// 3/16 * constrain(g, x, s) + 1/16 * constrain(h, x, s) +// delta = 1/16 * constrain(a, x, s, d) + 3/16 * constrain(b, x, s, d) + +// 1/16 * constrain(c, x, s, d) + 3/16 * constrain(d, x, s, d) + +// 3/16 * constrain(e, x, s, d) + 1/16 * constrain(f, x, s, d) + +// 3/16 * constrain(g, x, s, d) + 1/16 * constrain(h, x, s, d) SIMD_INLINE v128 calc_delta(v128 x, v128 a, v128 b, v128 c, v128 d, v128 e, v128 f, v128 g, v128 h, unsigned int s, unsigned int dmp) { @@ -44,8 +43,8 @@ 4)); } -// delta = 1/8 * constrain(a, x, s) + 3/8 * constrain(b, x, s) + -// 3/8 * constrain(c, x, s) + 1/8 * constrain(d, x, s) + +// delta = 1/8 * constrain(a, x, s, d) + 3/8 * constrain(b, x, s, d) + +// 3/8 * constrain(c, x, s, d) + 1/8 * constrain(d, x, s, d) + SIMD_INLINE v128 calc_hdelta(v128 x, v128 a, v128 b, v128 c, v128 d, unsigned int s, unsigned int dmp) { const v128 bc = v128_add_8(constrain(b, x, s, dmp), constrain(c, x, s, dmp)); @@ -62,7 +61,7 @@ // Process blocks of width 8, two lines at a time, 8 bit. static void clpf_block8(uint8_t *dst, const uint16_t *src, int dstride, int sstride, int sizey, unsigned int strength, - unsigned int dmp) { + unsigned int adjdamp) { int y; for (y = 0; y < sizey; y += 2) { @@ -83,7 +82,7 @@ const v128 f = v128_pack_s16_u8(v128_load_unaligned(src + 2), v128_load_unaligned(src + 2 + sstride)); const v128 o = calc_delta(v128_pack_s16_u8(l1, l2), a, b, c, d, e, f, g, h, - strength, dmp); + strength, adjdamp); v64_store_aligned(dst, v128_high_v64(o)); v64_store_aligned(dst + dstride, v128_low_v64(o)); @@ -95,7 +94,7 @@ // Process blocks of width 4, four lines at a time, 8 bit. static void clpf_block4(uint8_t *dst, const uint16_t *src, int dstride, int sstride, int sizey, unsigned int strength, - unsigned int dmp) { + unsigned int adjdamp) { int y; for (y = 0; y < sizey; y += 4) { @@ -138,7 +137,7 @@ const v128 o = calc_delta( v128_pack_s16_u8(v128_from_v64(l2, l3), v128_from_v64(l4, l5)), a, b, c, - d, e, f, g, h, strength, dmp); + d, e, f, g, h, strength, adjdamp); u32_store_aligned(dst, v128_low_u32(v128_shr_n_byte(o, 12))); u32_store_aligned(dst + dstride, v128_low_u32(v128_shr_n_byte(o, 8))); @@ -152,7 +151,7 @@ static void clpf_hblock8(uint8_t *dst, const uint16_t *src, int dstride, int sstride, int sizey, unsigned int strength, - unsigned int dmp) { + unsigned int adjdamp) { int y; for (y = 0; y < sizey; y += 2) { @@ -167,7 +166,7 @@ const v128 d = v128_pack_s16_u8(v128_load_unaligned(src + 2), v128_load_unaligned(src + 2 + sstride)); const v128 o = - calc_hdelta(v128_pack_s16_u8(l1, l2), a, b, c, d, strength, dmp); + calc_hdelta(v128_pack_s16_u8(l1, l2), a, b, c, d, strength, adjdamp); v64_store_aligned(dst, v128_high_v64(o)); v64_store_aligned(dst + dstride, v128_low_v64(o)); @@ -179,7 +178,7 @@ // Process blocks of width 4, four lines at a time, 8 bit. static void clpf_hblock4(uint8_t *dst, const uint16_t *src, int dstride, int sstride, int sizey, unsigned int strength, - unsigned int dmp) { + unsigned int adjdamp) { int y; for (y = 0; y < sizey; y += 4) { @@ -210,7 +209,7 @@ const v128 o = calc_hdelta( v128_pack_s16_u8(v128_from_v64(l0, l1), v128_from_v64(l2, l3)), a, b, c, - d, strength, dmp); + d, strength, adjdamp); u32_store_aligned(dst, v128_low_u32(v128_shr_n_byte(o, 12))); u32_store_aligned(dst + dstride, v128_low_u32(v128_shr_n_byte(o, 8))); @@ -232,7 +231,7 @@ aom_clpf_block_c(dst, src, dstride, sstride, sizex, sizey, strength, dmp); } else { (sizex == 4 ? clpf_block4 : clpf_block8)(dst, src, dstride, sstride, sizey, - strength, dmp); + strength, dmp - get_msb(strength)); } } @@ -245,26 +244,26 @@ // * block heights not a multiple of 4 if the block width is 4 aom_clpf_hblock_c(dst, src, dstride, sstride, sizex, sizey, strength, dmp); } else { - (sizex == 4 ? clpf_hblock4 : clpf_hblock8)(dst, src, dstride, sstride, - sizey, strength, dmp); + (sizex == 4 ? clpf_hblock4 : clpf_hblock8)( + dst, src, dstride, sstride, sizey, strength, dmp - get_msb(strength)); } } -// sign(a-b) * min(abs(a-b), strength - (abs(a-b) >> (dmp-log2(strength)))) +// sign(a - b) * min(abs(a - b), max(0, strength - (abs(a - b) >> adjdamp))) SIMD_INLINE v128 constrain_hbd(v128 a, v128 b, unsigned int strength, - unsigned int dmp) { + unsigned int adjdamp) { v128 diff = v128_sub_16(a, b); const v128 sign = v128_shr_n_s16(diff, 15); diff = v128_abs_s16(diff); - const v128 s = v128_ssub_u16(v128_dup_16(strength), - v128_shr_u16(diff, dmp - get_msb(strength))); + const v128 s = + v128_ssub_u16(v128_dup_16(strength), v128_shr_u16(diff, adjdamp)); return v128_xor(v128_add_16(sign, v128_min_s16(diff, s)), sign); } -// delta = 1/16 * constrain(a, x, s, dmp) + 3/16 * constrain(b, x, s, dmp) + -// 1/16 * constrain(c, x, s, dmp) + 3/16 * constrain(d, x, s, dmp) + -// 3/16 * constrain(e, x, s, dmp) + 1/16 * constrain(f, x, s, dmp) + -// 3/16 * constrain(g, x, s, dmp) + 1/16 * constrain(h, x, s, dmp) +// delta = 1/16 * constrain(a, x, s, d) + 3/16 * constrain(b, x, s, d) + +// 1/16 * constrain(c, x, s, d) + 3/16 * constrain(d, x, s, d) + +// 3/16 * constrain(e, x, s, d) + 1/16 * constrain(f, x, s, d) + +// 3/16 * constrain(g, x, s, d) + 1/16 * constrain(h, x, s, d) SIMD_INLINE v128 calc_delta_hbd(v128 x, v128 a, v128 b, v128 c, v128 d, v128 e, v128 f, v128 g, v128 h, unsigned int s, unsigned int dmp) { @@ -295,8 +294,9 @@ static void calc_delta_hbd8(v128 o, v128 a, v128 b, v128 c, v128 d, v128 e, v128 f, v128 g, v128 h, uint16_t *dst, - unsigned int s, unsigned int dmp) { - v128_store_aligned(dst, calc_delta_hbd(o, a, b, c, d, e, f, g, h, s, dmp)); + unsigned int s, unsigned int adjdamp) { + v128_store_aligned(dst, + calc_delta_hbd(o, a, b, c, d, e, f, g, h, s, adjdamp)); } // delta = 1/16 * constrain(a, x, s, dmp) + 3/16 * constrain(b, x, s, dmp) + @@ -317,22 +317,23 @@ } static void calc_hdelta_hbd4(v128 o, v128 a, v128 b, v128 c, v128 d, - uint16_t *dst, unsigned int s, unsigned int dmp, - int dstride) { - o = calc_hdelta_hbd(o, a, b, c, d, s, dmp); + uint16_t *dst, unsigned int s, + unsigned int adjdamp, int dstride) { + o = calc_hdelta_hbd(o, a, b, c, d, s, adjdamp); v64_store_aligned(dst, v128_high_v64(o)); v64_store_aligned(dst + dstride, v128_low_v64(o)); } static void calc_hdelta_hbd8(v128 o, v128 a, v128 b, v128 c, v128 d, - uint16_t *dst, unsigned int s, unsigned int dmp) { - v128_store_aligned(dst, calc_hdelta_hbd(o, a, b, c, d, s, dmp)); + uint16_t *dst, unsigned int s, + unsigned int adjdamp) { + v128_store_aligned(dst, calc_hdelta_hbd(o, a, b, c, d, s, adjdamp)); } // Process blocks of width 4, two lines at time. SIMD_INLINE void clpf_block_hbd4(uint16_t *dst, const uint16_t *src, int dstride, int sstride, int sizey, - unsigned int strength, unsigned int dmp) { + unsigned int strength, unsigned int adjdamp) { int y; for (y = 0; y < sizey; y += 2) { @@ -354,7 +355,7 @@ v64_load_unaligned(src + 2 + sstride)); calc_delta_hbd4(v128_from_v64(l1, l2), a, b, c, d, e, f, g, h, dst, - strength, dmp, dstride); + strength, adjdamp, dstride); src += sstride * 2; dst += dstride * 2; } @@ -363,7 +364,7 @@ // The most simple case. Start here if you need to understand the functions. SIMD_INLINE void clpf_block_hbd(uint16_t *dst, const uint16_t *src, int dstride, int sstride, int sizey, unsigned int strength, - unsigned int dmp) { + unsigned int adjdamp) { int y; for (y = 0; y < sizey; y++) { @@ -377,7 +378,7 @@ const v128 e = v128_load_unaligned(src + 1); const v128 f = v128_load_unaligned(src + 2); - calc_delta_hbd8(o, a, b, c, d, e, f, g, h, dst, strength, dmp); + calc_delta_hbd8(o, a, b, c, d, e, f, g, h, dst, strength, adjdamp); src += sstride; dst += dstride; } @@ -386,7 +387,7 @@ // Process blocks of width 4, horizontal filter, two lines at time. SIMD_INLINE void clpf_hblock_hbd4(uint16_t *dst, const uint16_t *src, int dstride, int sstride, int sizey, - unsigned int strength, unsigned int dmp) { + unsigned int strength, unsigned int adjdamp) { int y; for (y = 0; y < sizey; y += 2) { @@ -401,7 +402,7 @@ calc_hdelta_hbd4(v128_from_v64(v64_load_unaligned(src), v64_load_unaligned(src + sstride)), - a, b, c, d, dst, strength, dmp, dstride); + a, b, c, d, dst, strength, adjdamp, dstride); src += sstride * 2; dst += dstride * 2; } @@ -410,7 +411,7 @@ // Process blocks of width 8, horizontal filter, two lines at time. SIMD_INLINE void clpf_hblock_hbd(uint16_t *dst, const uint16_t *src, int dstride, int sstride, int sizey, - unsigned int strength, unsigned int dmp) { + unsigned int strength, unsigned int adjdamp) { int y; for (y = 0; y < sizey; y++) { @@ -420,7 +421,7 @@ const v128 c = v128_load_unaligned(src + 1); const v128 d = v128_load_unaligned(src + 2); - calc_hdelta_hbd8(o, a, b, c, d, dst, strength, dmp); + calc_hdelta_hbd8(o, a, b, c, d, dst, strength, adjdamp); src += sstride; dst += dstride; } @@ -437,8 +438,8 @@ aom_clpf_block_hbd_c(dst, src, dstride, sstride, sizex, sizey, strength, dmp); } else { - (sizex == 4 ? clpf_block_hbd4 : clpf_block_hbd)(dst, src, dstride, sstride, - sizey, strength, dmp); + (sizex == 4 ? clpf_block_hbd4 : clpf_block_hbd)( + dst, src, dstride, sstride, sizey, strength, dmp - get_msb(strength)); } } @@ -454,6 +455,6 @@ dmp); } else { (sizex == 4 ? clpf_hblock_hbd4 : clpf_hblock_hbd)( - dst, src, dstride, sstride, sizey, strength, dmp); + dst, src, dstride, sstride, sizey, strength, dmp - get_msb(strength)); } }