Simplifying constrain() and constrain_hbd()
Change-Id: Ie6677376861cb053a946724ba32a98a33d68e123
diff --git a/av1/common/clpf.c b/av1/common/clpf.c
index abd54fb..26f192c 100644
--- a/av1/common/clpf.c
+++ b/av1/common/clpf.c
@@ -17,9 +17,7 @@
static int sign(int i) { return i < 0 ? -1 : 1; }
static int constrain(int x, int s, unsigned int damping) {
- return sign(x) *
- AOMMAX(0, abs(x) - AOMMAX(0, abs(x) - s +
- (abs(x) >> (damping - get_msb(s)))));
+ return sign(x) * AOMMIN(abs(x), s - (abs(x) >> (damping - get_msb(s))));
}
int av1_clpf_sample(int X, int A, int B, int C, int D, int E, int F, int G,
diff --git a/av1/common/clpf_simd.h b/av1/common/clpf_simd.h
index 664ab6b..08d79ea 100644
--- a/av1/common/clpf_simd.h
+++ b/av1/common/clpf_simd.h
@@ -13,16 +13,14 @@
#include "aom_ports/mem.h"
#include "aom_ports/bitops.h"
-// sign(a - b) * max(0, abs(a - b) - max(0, abs(a - b) -
-// strength + (abs(a - b) >> (5 - log2(s)))))
+// sign(a-b) * min(abs(a-b), strength - (abs(a-b) >> (dmp-log2(strength))))
SIMD_INLINE v128 constrain(v128 a, v128 b, unsigned int strength,
unsigned int damping) {
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)));
- return v128_sub_8(v128_xor(sign, v128_ssub_u8(diff, v128_ssub_u8(diff, s))),
- sign);
+ return v128_sub_8(v128_xor(sign, v128_min_u8(diff, s)), sign);
}
// delta = 1/16 * constrain(a, x, s) + 3/16 * constrain(b, x, s) +
@@ -252,8 +250,7 @@
}
}
-// sign(a - b) * max(0, abs(a - b) - max(0, abs(a - b) -
-// strength + (abs(a - b) >> (dmp - log2(s)))))
+// sign(a-b) * min(abs(a-b), strength - (abs(a-b) >> (dmp-log2(strength))))
SIMD_INLINE v128 constrain_hbd(v128 a, v128 b, unsigned int strength,
unsigned int dmp) {
v128 diff = v128_sub_16(a, b);
@@ -263,12 +260,7 @@
const v128 s = v128_max_s16(
zero, v128_sub_16(v128_dup_16(strength),
v128_shr_u16(diff, dmp - get_msb(strength))));
- return v128_sub_16(
- v128_xor(sign,
- v128_max_s16(
- zero, v128_sub_16(
- diff, v128_max_s16(zero, v128_sub_16(diff, s))))),
- sign);
+ return v128_sub_16(v128_xor(sign, v128_min_s16(diff, s)), sign);
}
// delta = 1/16 * constrain(a, x, s, dmp) + 3/16 * constrain(b, x, s, dmp) +