aom_{highbd_}subtract_block_neon(): Change for loops to do/while.
Bug: http://b/217457914
Change-Id: I1cba512df8d2fde420d98cbce251b4afcdb40aff
diff --git a/aom_dsp/arm/subtract_neon.c b/aom_dsp/arm/subtract_neon.c
index 33b70d0..a195c40 100644
--- a/aom_dsp/arm/subtract_neon.c
+++ b/aom_dsp/arm/subtract_neon.c
@@ -20,11 +20,11 @@
ptrdiff_t diff_stride, const uint8_t *src,
ptrdiff_t src_stride, const uint8_t *pred,
ptrdiff_t pred_stride) {
- int r, c;
-
if (cols > 16) {
- for (r = 0; r < rows; ++r) {
- for (c = 0; c < cols; c += 32) {
+ int r = rows;
+ do {
+ int c = 0;
+ do {
const uint8x16_t v_src_00 = vld1q_u8(&src[c + 0]);
const uint8x16_t v_src_16 = vld1q_u8(&src[c + 16]);
const uint8x16_t v_pred_00 = vld1q_u8(&pred[c + 0]);
@@ -41,13 +41,15 @@
vst1q_s16(&diff[c + 8], vreinterpretq_s16_u16(v_diff_hi_00));
vst1q_s16(&diff[c + 16], vreinterpretq_s16_u16(v_diff_lo_16));
vst1q_s16(&diff[c + 24], vreinterpretq_s16_u16(v_diff_hi_16));
- }
+ c += 32;
+ } while (c < cols);
diff += diff_stride;
pred += pred_stride;
src += src_stride;
- }
+ } while (--r != 0);
} else if (cols > 8) {
- for (r = 0; r < rows; ++r) {
+ int r = rows;
+ do {
const uint8x16_t v_src = vld1q_u8(&src[0]);
const uint8x16_t v_pred = vld1q_u8(&pred[0]);
const uint16x8_t v_diff_lo =
@@ -59,9 +61,10 @@
diff += diff_stride;
pred += pred_stride;
src += src_stride;
- }
+ } while (--r != 0);
} else if (cols > 4) {
- for (r = 0; r < rows; ++r) {
+ int r = rows;
+ do {
const uint8x8_t v_src = vld1_u8(&src[0]);
const uint8x8_t v_pred = vld1_u8(&pred[0]);
const uint16x8_t v_diff = vsubl_u8(v_src, v_pred);
@@ -69,15 +72,18 @@
diff += diff_stride;
pred += pred_stride;
src += src_stride;
- }
+ } while (--r != 0);
} else {
- for (r = 0; r < rows; ++r) {
- for (c = 0; c < cols; ++c) diff[c] = src[c] - pred[c];
-
+ int r = rows;
+ do {
+ int c = 0;
+ do {
+ diff[c] = src[c] - pred[c];
+ } while (++c < cols);
diff += diff_stride;
pred += pred_stride;
src += src_stride;
- }
+ } while (--r != 0);
}
}
@@ -86,13 +92,14 @@
ptrdiff_t diff_stride, const uint8_t *src8,
ptrdiff_t src_stride, const uint8_t *pred8,
ptrdiff_t pred_stride) {
- int r, c;
uint16_t *src = CONVERT_TO_SHORTPTR(src8);
uint16_t *pred = CONVERT_TO_SHORTPTR(pred8);
if (cols > 16) {
- for (r = 0; r < rows; ++r) {
- for (c = 0; c < cols; c += 16) {
+ int r = rows;
+ do {
+ int c = 0;
+ do {
const uint16x8_t v_src_00 = vld1q_u16(&src[c + 0]);
const uint16x8_t v_pred_00 = vld1q_u16(&pred[c + 0]);
const uint16x8_t v_diff_00 = vsubq_u16(v_src_00, v_pred_00);
@@ -101,13 +108,15 @@
const uint16x8_t v_diff_08 = vsubq_u16(v_src_08, v_pred_08);
vst1q_s16(&diff[c + 0], vreinterpretq_s16_u16(v_diff_00));
vst1q_s16(&diff[c + 8], vreinterpretq_s16_u16(v_diff_08));
- }
+ c += 16;
+ } while (c < cols);
diff += diff_stride;
pred += pred_stride;
src += src_stride;
- }
+ } while (--r != 0);
} else if (cols > 8) {
- for (r = 0; r < rows; ++r) {
+ int r = rows;
+ do {
const uint16x8_t v_src_00 = vld1q_u16(&src[0]);
const uint16x8_t v_pred_00 = vld1q_u16(&pred[0]);
const uint16x8_t v_diff_00 = vsubq_u16(v_src_00, v_pred_00);
@@ -119,9 +128,10 @@
diff += diff_stride;
pred += pred_stride;
src += src_stride;
- }
+ } while (--r != 0);
} else if (cols > 4) {
- for (r = 0; r < rows; r += 2) {
+ int r = rows;
+ do {
const uint16x8_t v_src_r0 = vld1q_u16(&src[0]);
const uint16x8_t v_src_r1 = vld1q_u16(&src[src_stride]);
const uint16x8_t v_pred_r0 = vld1q_u16(&pred[0]);
@@ -133,9 +143,11 @@
diff += diff_stride << 1;
pred += pred_stride << 1;
src += src_stride << 1;
- }
+ r -= 2;
+ } while (r != 0);
} else {
- for (r = 0; r < rows; r += 2) {
+ int r = rows;
+ do {
const uint16x4_t v_src_r0 = vld1_u16(&src[0]);
const uint16x4_t v_src_r1 = vld1_u16(&src[src_stride]);
const uint16x4_t v_pred_r0 = vld1_u16(&pred[0]);
@@ -147,7 +159,8 @@
diff += diff_stride << 1;
pred += pred_stride << 1;
src += src_stride << 1;
- }
+ r -= 2;
+ } while (r != 0);
}
}
#endif // CONFIG_AV1_HIGHBITDEPTH