Arm: Remove unnecessary temporary variables in variance kernels Decrement the block size directly instead of making a separate loop counter 'i' in Neon and Neon DotProd variance kernels. Change-Id: Iea325e5af993514d301ce5f69e430f28e18fe83e
diff --git a/aom_dsp/arm/variance_neon.c b/aom_dsp/arm/variance_neon.c index fb46857..9968c82 100644 --- a/aom_dsp/arm/variance_neon.c +++ b/aom_dsp/arm/variance_neon.c
@@ -28,7 +28,6 @@ // 32767 / 255 ~= 128, but we use an 8-wide accumulator; so 256 4-wide rows. assert(h <= 256); - int i = h; do { uint8x8_t s = load_unaligned_u8(src, src_stride); uint8x8_t r = load_unaligned_u8(ref, ref_stride); @@ -41,8 +40,8 @@ src += 2 * src_stride; ref += 2 * ref_stride; - i -= 2; - } while (i != 0); + h -= 2; + } while (h != 0); *sum = horizontal_add_s16x8(sum_s16); *sse = (uint32_t)horizontal_add_s32x4(sse_s32); @@ -58,7 +57,6 @@ // 32767 / 255 ~= 128 assert(h <= 128); - int i = h; do { uint8x8_t s = vld1_u8(src); uint8x8_t r = vld1_u8(ref); @@ -72,7 +70,7 @@ src += src_stride; ref += ref_stride; - } while (--i != 0); + } while (--h != 0); *sum = horizontal_add_s16x8(sum_s16); *sse = (uint32_t)horizontal_add_s32x4(vaddq_s32(sse_s32[0], sse_s32[1])); @@ -88,7 +86,6 @@ // 32767 / 255 ~= 128, so 128 16-wide rows. assert(h <= 128); - int i = h; do { uint8x16_t s = vld1q_u8(src); uint8x16_t r = vld1q_u8(ref); @@ -112,7 +109,7 @@ src += src_stride; ref += ref_stride; - } while (--i != 0); + } while (--h != 0); *sum = horizontal_add_s16x8(vaddq_s16(sum_s16[0], sum_s16[1])); *sse = (uint32_t)horizontal_add_s32x4(vaddq_s32(sse_s32[0], sse_s32[1])); @@ -283,7 +280,6 @@ uint16x8_t diff[2]; int32x4_t sse_s32[2] = { vdupq_n_s32(0), vdupq_n_s32(0) }; - int i = h; do { s[0] = vld1_u8(src); src += src_stride; @@ -307,8 +303,8 @@ sse_s32[0] = vmlal_s16(sse_s32[0], diff_hi[0], diff_hi[0]); sse_s32[1] = vmlal_s16(sse_s32[1], diff_hi[1], diff_hi[1]); - i -= 2; - } while (i != 0); + h -= 2; + } while (h != 0); sse_s32[0] = vaddq_s32(sse_s32[0], sse_s32[1]); @@ -325,7 +321,6 @@ int32x4_t sse_s32[4] = { vdupq_n_s32(0), vdupq_n_s32(0), vdupq_n_s32(0), vdupq_n_s32(0) }; - int i = h; do { s[0] = vld1q_u8(src); src += src_stride; @@ -361,8 +356,8 @@ sse_s32[2] = vmlal_s16(sse_s32[2], diff_hi[2], diff_hi[2]); sse_s32[3] = vmlal_s16(sse_s32[3], diff_hi[3], diff_hi[3]); - i -= 2; - } while (i != 0); + h -= 2; + } while (h != 0); sse_s32[0] = vaddq_s32(sse_s32[0], sse_s32[1]); sse_s32[2] = vaddq_s32(sse_s32[2], sse_s32[3]);
diff --git a/aom_dsp/arm/variance_neon_dotprod.c b/aom_dsp/arm/variance_neon_dotprod.c index 3a3965e..68a6445 100644 --- a/aom_dsp/arm/variance_neon_dotprod.c +++ b/aom_dsp/arm/variance_neon_dotprod.c
@@ -25,7 +25,6 @@ uint32x4_t ref_sum = vdupq_n_u32(0); uint32x4_t sse_u32 = vdupq_n_u32(0); - int i = h; do { uint8x16_t s = load_unaligned_u8q(src, src_stride); uint8x16_t r = load_unaligned_u8q(ref, ref_stride); @@ -38,8 +37,8 @@ src += 4 * src_stride; ref += 4 * ref_stride; - i -= 4; - } while (i != 0); + h -= 4; + } while (h != 0); int32x4_t sum_diff = vsubq_s32(vreinterpretq_s32_u32(src_sum), vreinterpretq_s32_u32(ref_sum)); @@ -54,7 +53,6 @@ uint32x4_t ref_sum = vdupq_n_u32(0); uint32x4_t sse_u32 = vdupq_n_u32(0); - int i = h; do { uint8x16_t s = vcombine_u8(vld1_u8(src), vld1_u8(src + src_stride)); uint8x16_t r = vcombine_u8(vld1_u8(ref), vld1_u8(ref + ref_stride)); @@ -67,8 +65,8 @@ src += 2 * src_stride; ref += 2 * ref_stride; - i -= 2; - } while (i != 0); + h -= 2; + } while (h != 0); int32x4_t sum_diff = vsubq_s32(vreinterpretq_s32_u32(src_sum), vreinterpretq_s32_u32(ref_sum)); @@ -85,7 +83,6 @@ uint32x4_t ref_sum = vdupq_n_u32(0); uint32x4_t sse_u32 = vdupq_n_u32(0); - int i = h; do { uint8x16_t s = vld1q_u8(src); uint8x16_t r = vld1q_u8(ref); @@ -98,7 +95,7 @@ src += src_stride; ref += ref_stride; - } while (--i != 0); + } while (--h != 0); int32x4_t sum_diff = vsubq_s32(vreinterpretq_s32_u32(src_sum), vreinterpretq_s32_u32(ref_sum)); @@ -115,12 +112,11 @@ uint32x4_t ref_sum = vdupq_n_u32(0); uint32x4_t sse_u32 = vdupq_n_u32(0); - int i = h; do { - int j = 0; + int i = 0; do { - uint8x16_t s = vld1q_u8(src + j); - uint8x16_t r = vld1q_u8(ref + j); + uint8x16_t s = vld1q_u8(src + i); + uint8x16_t r = vld1q_u8(ref + i); src_sum = vdotq_u32(src_sum, s, vdupq_n_u8(1)); ref_sum = vdotq_u32(ref_sum, r, vdupq_n_u8(1)); @@ -128,12 +124,12 @@ uint8x16_t abs_diff = vabdq_u8(s, r); sse_u32 = vdotq_u32(sse_u32, abs_diff, abs_diff); - j += 16; - } while (j < w); + i += 16; + } while (i < w); src += src_stride; ref += ref_stride; - } while (--i != 0); + } while (--h != 0); int32x4_t sum_diff = vsubq_s32(vreinterpretq_s32_u32(src_sum), vreinterpretq_s32_u32(ref_sum)); @@ -254,7 +250,6 @@ unsigned int *sse, int h) { uint32x4_t sse_u32 = vdupq_n_u32(0); - int i = h; do { uint8x16_t s = vcombine_u8(vld1_u8(src), vld1_u8(src + src_stride)); uint8x16_t r = vcombine_u8(vld1_u8(ref), vld1_u8(ref + ref_stride)); @@ -265,8 +260,8 @@ src += 2 * src_stride; ref += 2 * ref_stride; - i -= 2; - } while (i != 0); + h -= 2; + } while (h != 0); *sse = horizontal_add_u32x4(sse_u32); return horizontal_add_u32x4(sse_u32); @@ -279,7 +274,6 @@ unsigned int *sse, int h) { uint32x4_t sse_u32[2] = { vdupq_n_u32(0), vdupq_n_u32(0) }; - int i = h; do { uint8x16_t s0 = vld1q_u8(src); uint8x16_t s1 = vld1q_u8(src + src_stride); @@ -294,8 +288,8 @@ src += 2 * src_stride; ref += 2 * ref_stride; - i -= 2; - } while (i != 0); + h -= 2; + } while (h != 0); *sse = horizontal_add_u32x4(vaddq_u32(sse_u32[0], sse_u32[1])); return horizontal_add_u32x4(vaddq_u32(sse_u32[0], sse_u32[1]));