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));
}
}