Use mem_neon.h helpers consistently in convolution paths
Tidy up the Neon convolution paths by using the load/store helper
functions in mem_neon.h consistently.
Also remove unnecessary parentheses when incrementing pointers.
Change-Id: I93a5b3c33b370906ca727df0998fa63fb0ceeea5
diff --git a/aom_dsp/arm/loopfilter_neon.c b/aom_dsp/arm/loopfilter_neon.c
index f3f86a2..b51413c 100644
--- a/aom_dsp/arm/loopfilter_neon.c
+++ b/aom_dsp/arm/loopfilter_neon.c
@@ -628,7 +628,7 @@
// row1: x p6 p5 p4 p3 p2 p1 p0 | q0 q1 q2 q3 q4 q5 q6 y
// row2: x p6 p5 p4 p3 p2 p1 p0 | q0 q1 q2 q3 q4 q5 q6 y
// row3: x p6 p5 p4 p3 p2 p1 p0 | q0 q1 q2 q3 q4 q5 q6 y
- load_u8_8x16(src - 8, stride, &row0, &row1, &row2, &row3);
+ load_u8_16x4(src - 8, stride, &row0, &row1, &row2, &row3);
pxp3 = vget_low_u8(row0);
p6p2 = vget_low_u8(row1);
diff --git a/aom_dsp/arm/mem_neon.h b/aom_dsp/arm/mem_neon.h
index 70e88c8..92ad769 100644
--- a/aom_dsp/arm/mem_neon.h
+++ b/aom_dsp/arm/mem_neon.h
@@ -73,8 +73,8 @@
#endif // __GNUC__ < 9
#endif // defined(__GNUC__) && !defined(__clang__)
-static INLINE void store_row2_u8_8x8(uint8_t *s, int p, const uint8x8_t s0,
- const uint8x8_t s1) {
+static INLINE void store_u8_8x2(uint8_t *s, ptrdiff_t p, const uint8x8_t s0,
+ const uint8x8_t s1) {
vst1_u8(s, s0);
s += p;
vst1_u8(s, s1);
@@ -111,16 +111,24 @@
*s7 = vld1_u8(s);
}
-static INLINE void load_u8_8x16(const uint8_t *s, ptrdiff_t p,
- uint8x16_t *const s0, uint8x16_t *const s1,
- uint8x16_t *const s2, uint8x16_t *const s3) {
- *s0 = vld1q_u8(s);
+static INLINE void load_u8_8x7(const uint8_t *s, ptrdiff_t p,
+ uint8x8_t *const s0, uint8x8_t *const s1,
+ uint8x8_t *const s2, uint8x8_t *const s3,
+ uint8x8_t *const s4, uint8x8_t *const s5,
+ uint8x8_t *const s6) {
+ *s0 = vld1_u8(s);
s += p;
- *s1 = vld1q_u8(s);
+ *s1 = vld1_u8(s);
s += p;
- *s2 = vld1q_u8(s);
+ *s2 = vld1_u8(s);
s += p;
- *s3 = vld1q_u8(s);
+ *s3 = vld1_u8(s);
+ s += p;
+ *s4 = vld1_u8(s);
+ s += p;
+ *s5 = vld1_u8(s);
+ s += p;
+ *s6 = vld1_u8(s);
}
static INLINE void load_u8_8x4(const uint8_t *s, const ptrdiff_t p,
@@ -161,6 +169,36 @@
s += p;
}
+static INLINE void load_s16_4x11(const int16_t *s, ptrdiff_t p,
+ int16x4_t *const s0, int16x4_t *const s1,
+ int16x4_t *const s2, int16x4_t *const s3,
+ int16x4_t *const s4, int16x4_t *const s5,
+ int16x4_t *const s6, int16x4_t *const s7,
+ int16x4_t *const s8, int16x4_t *const s9,
+ int16x4_t *const s10) {
+ *s0 = vld1_s16(s);
+ s += p;
+ *s1 = vld1_s16(s);
+ s += p;
+ *s2 = vld1_s16(s);
+ s += p;
+ *s3 = vld1_s16(s);
+ s += p;
+ *s4 = vld1_s16(s);
+ s += p;
+ *s5 = vld1_s16(s);
+ s += p;
+ *s6 = vld1_s16(s);
+ s += p;
+ *s7 = vld1_s16(s);
+ s += p;
+ *s8 = vld1_s16(s);
+ s += p;
+ *s9 = vld1_s16(s);
+ s += p;
+ *s10 = vld1_s16(s);
+}
+
static INLINE void load_s16_4x8(const int16_t *s, ptrdiff_t p,
int16x4_t *const s0, int16x4_t *const s1,
int16x4_t *const s2, int16x4_t *const s3,
@@ -183,6 +221,41 @@
*s7 = vld1_s16(s);
}
+static INLINE void load_s16_4x7(const int16_t *s, ptrdiff_t p,
+ int16x4_t *const s0, int16x4_t *const s1,
+ int16x4_t *const s2, int16x4_t *const s3,
+ int16x4_t *const s4, int16x4_t *const s5,
+ int16x4_t *const s6) {
+ *s0 = vld1_s16(s);
+ s += p;
+ *s1 = vld1_s16(s);
+ s += p;
+ *s2 = vld1_s16(s);
+ s += p;
+ *s3 = vld1_s16(s);
+ s += p;
+ *s4 = vld1_s16(s);
+ s += p;
+ *s5 = vld1_s16(s);
+ s += p;
+ *s6 = vld1_s16(s);
+}
+
+static INLINE void load_s16_4x5(const int16_t *s, ptrdiff_t p,
+ int16x4_t *const s0, int16x4_t *const s1,
+ int16x4_t *const s2, int16x4_t *const s3,
+ int16x4_t *const s4) {
+ *s0 = vld1_s16(s);
+ s += p;
+ *s1 = vld1_s16(s);
+ s += p;
+ *s2 = vld1_s16(s);
+ s += p;
+ *s3 = vld1_s16(s);
+ s += p;
+ *s4 = vld1_s16(s);
+}
+
static INLINE void load_s16_4x4(const int16_t *s, ptrdiff_t p,
int16x4_t *const s0, int16x4_t *const s1,
int16x4_t *const s2, int16x4_t *const s3) {
@@ -197,6 +270,11 @@
/* These intrinsics require immediate values, so we must use #defines
to enforce that. */
+#define store_u8_2x1(s, s0, lane) \
+ do { \
+ vst1_lane_u16((uint16_t *)(s), vreinterpret_u16_u8(s0), lane); \
+ } while (0)
+
#define store_u8_4x1(s, s0, lane) \
do { \
vst1_lane_u32((uint32_t *)(s), vreinterpret_u32_u8(s0), lane); \
@@ -328,6 +406,13 @@
vst1_s16(s, s3);
}
+/* These intrinsics require immediate values, so we must use #defines
+ to enforce that. */
+#define store_s16_2x1(s, s0, lane) \
+ do { \
+ vst1_lane_s32((int32_t *)(s), vreinterpret_s32_s16(s0), lane); \
+ } while (0)
+
static INLINE void store_s16_8x4(int16_t *s, ptrdiff_t dst_stride,
const int16x8_t s0, const int16x8_t s1,
const int16x8_t s2, const int16x8_t s3) {
@@ -340,6 +425,36 @@
vst1q_s16(s, s3);
}
+static INLINE void load_s16_8x11(const int16_t *s, ptrdiff_t p,
+ int16x8_t *const s0, int16x8_t *const s1,
+ int16x8_t *const s2, int16x8_t *const s3,
+ int16x8_t *const s4, int16x8_t *const s5,
+ int16x8_t *const s6, int16x8_t *const s7,
+ int16x8_t *const s8, int16x8_t *const s9,
+ int16x8_t *const s10) {
+ *s0 = vld1q_s16(s);
+ s += p;
+ *s1 = vld1q_s16(s);
+ s += p;
+ *s2 = vld1q_s16(s);
+ s += p;
+ *s3 = vld1q_s16(s);
+ s += p;
+ *s4 = vld1q_s16(s);
+ s += p;
+ *s5 = vld1q_s16(s);
+ s += p;
+ *s6 = vld1q_s16(s);
+ s += p;
+ *s7 = vld1q_s16(s);
+ s += p;
+ *s8 = vld1q_s16(s);
+ s += p;
+ *s9 = vld1q_s16(s);
+ s += p;
+ *s10 = vld1q_s16(s);
+}
+
static INLINE void load_s16_8x8(const int16_t *s, ptrdiff_t p,
int16x8_t *const s0, int16x8_t *const s1,
int16x8_t *const s2, int16x8_t *const s3,
@@ -362,6 +477,41 @@
*s7 = vld1q_s16(s);
}
+static INLINE void load_s16_8x7(const int16_t *s, ptrdiff_t p,
+ int16x8_t *const s0, int16x8_t *const s1,
+ int16x8_t *const s2, int16x8_t *const s3,
+ int16x8_t *const s4, int16x8_t *const s5,
+ int16x8_t *const s6) {
+ *s0 = vld1q_s16(s);
+ s += p;
+ *s1 = vld1q_s16(s);
+ s += p;
+ *s2 = vld1q_s16(s);
+ s += p;
+ *s3 = vld1q_s16(s);
+ s += p;
+ *s4 = vld1q_s16(s);
+ s += p;
+ *s5 = vld1q_s16(s);
+ s += p;
+ *s6 = vld1q_s16(s);
+}
+
+static INLINE void load_s16_8x5(const int16_t *s, ptrdiff_t p,
+ int16x8_t *const s0, int16x8_t *const s1,
+ int16x8_t *const s2, int16x8_t *const s3,
+ int16x8_t *const s4) {
+ *s0 = vld1q_s16(s);
+ s += p;
+ *s1 = vld1q_s16(s);
+ s += p;
+ *s2 = vld1q_s16(s);
+ s += p;
+ *s3 = vld1q_s16(s);
+ s += p;
+ *s4 = vld1q_s16(s);
+}
+
static INLINE void load_s16_8x4(const int16_t *s, ptrdiff_t p,
int16x8_t *const s0, int16x8_t *const s1,
int16x8_t *const s2, int16x8_t *const s3) {
diff --git a/av1/common/arm/convolve_neon.c b/av1/common/arm/convolve_neon.c
index 012b3f7..af9312e 100644
--- a/av1/common/arm/convolve_neon.c
+++ b/av1/common/arm/convolve_neon.c
@@ -280,10 +280,7 @@
uint8x8_t d01, d23;
do {
- s0 = vld1q_u8(src + 0 * src_stride);
- s1 = vld1q_u8(src + 1 * src_stride);
- s2 = vld1q_u8(src + 2 * src_stride);
- s3 = vld1q_u8(src + 3 * src_stride);
+ load_u8_16x4(src, src_stride, &s0, &s1, &s2, &s3);
t0 = convolve8_4_usdot(s0, x_filter, permute_tbl, vdupq_n_s32(0));
t1 = convolve8_4_usdot(s1, x_filter, permute_tbl, vdupq_n_s32(0));
@@ -303,26 +300,18 @@
d23 = vqmovun_s16(t23);
if (w == 2) {
- vst1_lane_u16((uint16_t *)(dst + 0 * dst_stride),
- vreinterpret_u16_u8(d01), 0);
- vst1_lane_u16((uint16_t *)(dst + 1 * dst_stride),
- vreinterpret_u16_u8(d01), 2);
+ store_u8_2x1(dst + 0 * dst_stride, d01, 0);
+ store_u8_2x1(dst + 1 * dst_stride, d01, 2);
if (h != 2) {
- vst1_lane_u16((uint16_t *)(dst + 2 * dst_stride),
- vreinterpret_u16_u8(d23), 0);
- vst1_lane_u16((uint16_t *)(dst + 3 * dst_stride),
- vreinterpret_u16_u8(d23), 2);
+ store_u8_2x1(dst + 2 * dst_stride, d23, 0);
+ store_u8_2x1(dst + 3 * dst_stride, d23, 2);
}
} else {
- vst1_lane_u32((uint32_t *)(dst + 0 * dst_stride),
- vreinterpret_u32_u8(d01), 0);
- vst1_lane_u32((uint32_t *)(dst + 1 * dst_stride),
- vreinterpret_u32_u8(d01), 1);
+ store_u8_4x1(dst + 0 * dst_stride, d01, 0);
+ store_u8_4x1(dst + 1 * dst_stride, d01, 1);
if (h != 2) {
- vst1_lane_u32((uint32_t *)(dst + 2 * dst_stride),
- vreinterpret_u32_u8(d23), 0);
- vst1_lane_u32((uint32_t *)(dst + 3 * dst_stride),
- vreinterpret_u32_u8(d23), 1);
+ store_u8_4x1(dst + 2 * dst_stride, d23, 0);
+ store_u8_4x1(dst + 3 * dst_stride, d23, 1);
}
}
@@ -343,10 +332,7 @@
uint8_t *d = dst;
do {
- s0 = vld1q_u8(s + 0 * src_stride);
- s1 = vld1q_u8(s + 1 * src_stride);
- s2 = vld1q_u8(s + 2 * src_stride);
- s3 = vld1q_u8(s + 3 * src_stride);
+ load_u8_16x4(s, src_stride, &s0, &s1, &s2, &s3);
t0 = convolve8_8_usdot(s0, x_filter, permute_tbl, vdupq_n_s32(0),
shift_round_0);
@@ -428,10 +414,7 @@
uint8x8_t d01, d23;
do {
- s0 = vld1q_u8(src + 0 * src_stride);
- s1 = vld1q_u8(src + 1 * src_stride);
- s2 = vld1q_u8(src + 2 * src_stride);
- s3 = vld1q_u8(src + 3 * src_stride);
+ load_u8_16x4(src, src_stride, &s0, &s1, &s2, &s3);
t0 = convolve8_4_sdot(s0, x_filter, correction, range_limit, permute_tbl);
t1 = convolve8_4_sdot(s1, x_filter, correction, range_limit, permute_tbl);
@@ -451,26 +434,18 @@
d23 = vqmovun_s16(t23);
if (w == 2) {
- vst1_lane_u16((uint16_t *)(dst + 0 * dst_stride),
- vreinterpret_u16_u8(d01), 0);
- vst1_lane_u16((uint16_t *)(dst + 1 * dst_stride),
- vreinterpret_u16_u8(d01), 2);
+ store_u8_2x1(dst + 0 * dst_stride, d01, 0);
+ store_u8_2x1(dst + 1 * dst_stride, d01, 2);
if (h != 2) {
- vst1_lane_u16((uint16_t *)(dst + 2 * dst_stride),
- vreinterpret_u16_u8(d23), 0);
- vst1_lane_u16((uint16_t *)(dst + 3 * dst_stride),
- vreinterpret_u16_u8(d23), 2);
+ store_u8_2x1(dst + 2 * dst_stride, d23, 0);
+ store_u8_2x1(dst + 3 * dst_stride, d23, 2);
}
} else {
- vst1_lane_u32((uint32_t *)(dst + 0 * dst_stride),
- vreinterpret_u32_u8(d01), 0);
- vst1_lane_u32((uint32_t *)(dst + 1 * dst_stride),
- vreinterpret_u32_u8(d01), 1);
+ store_u8_4x1(dst + 0 * dst_stride, d01, 0);
+ store_u8_4x1(dst + 1 * dst_stride, d01, 1);
if (h != 2) {
- vst1_lane_u32((uint32_t *)(dst + 2 * dst_stride),
- vreinterpret_u32_u8(d23), 0);
- vst1_lane_u32((uint32_t *)(dst + 3 * dst_stride),
- vreinterpret_u32_u8(d23), 1);
+ store_u8_4x1(dst + 2 * dst_stride, d23, 0);
+ store_u8_4x1(dst + 3 * dst_stride, d23, 1);
}
}
@@ -491,10 +466,7 @@
uint8_t *d = dst;
do {
- s0 = vld1q_u8(s + 0 * src_stride);
- s1 = vld1q_u8(s + 1 * src_stride);
- s2 = vld1q_u8(s + 2 * src_stride);
- s3 = vld1q_u8(s + 3 * src_stride);
+ load_u8_16x4(s, src_stride, &s0, &s1, &s2, &s3);
t0 = convolve8_8_sdot(s0, x_filter, correction, range_limit,
permute_tbl, shift_round_0);
@@ -628,11 +600,8 @@
s10 = vget_low_s16(vreinterpretq_s16_u16(vmovl_u8(t3)));
d0 = convolve8_4x4(s0, s1, s2, s3, s4, s5, s6, s7, x_filter);
-
d1 = convolve8_4x4(s1, s2, s3, s4, s5, s6, s7, s8, x_filter);
-
d2 = convolve8_4x4(s2, s3, s4, s5, s6, s7, s8, s9, x_filter);
-
d3 = convolve8_4x4(s3, s4, s5, s6, s7, s8, s9, s10, x_filter);
d01_temp = vqrshlq_s16(vcombine_s16(d0, d1), shift_round_0);
@@ -646,24 +615,16 @@
transpose_u8_4x4(&d01, &d23);
- if (w != 2) {
- vst1_lane_u32((uint32_t *)(dst + 0 * dst_stride), // 00 01 02 03
- vreinterpret_u32_u8(d01), 0);
- vst1_lane_u32((uint32_t *)(dst + 1 * dst_stride), // 10 11 12 13
- vreinterpret_u32_u8(d23), 0);
- vst1_lane_u32((uint32_t *)(dst + 2 * dst_stride), // 20 21 22 23
- vreinterpret_u32_u8(d01), 1);
- vst1_lane_u32((uint32_t *)(dst + 3 * dst_stride), // 30 31 32 33
- vreinterpret_u32_u8(d23), 1);
+ if (w == 2) {
+ store_u8_2x1(dst + 0 * dst_stride, d01, 0);
+ store_u8_2x1(dst + 1 * dst_stride, d23, 0);
+ store_u8_2x1(dst + 2 * dst_stride, d01, 2);
+ store_u8_2x1(dst + 3 * dst_stride, d23, 2);
} else {
- vst1_lane_u16((uint16_t *)(dst + 0 * dst_stride), // 00 01
- vreinterpret_u16_u8(d01), 0);
- vst1_lane_u16((uint16_t *)(dst + 1 * dst_stride), // 10 11
- vreinterpret_u16_u8(d23), 0);
- vst1_lane_u16((uint16_t *)(dst + 2 * dst_stride), // 20 21
- vreinterpret_u16_u8(d01), 2);
- vst1_lane_u16((uint16_t *)(dst + 3 * dst_stride), // 30 31
- vreinterpret_u16_u8(d23), 2);
+ store_u8_4x1(dst + 0 * dst_stride, d01, 0);
+ store_u8_4x1(dst + 1 * dst_stride, d23, 0);
+ store_u8_4x1(dst + 2 * dst_stride, d01, 1);
+ store_u8_4x1(dst + 3 * dst_stride, d23, 1);
}
s0 = s4;
@@ -739,71 +700,31 @@
transpose_u8_8x4(&t0, &t1, &t2, &t3);
- if ((w == 4) && (h > 4)) {
- vst1_lane_u32((uint32_t *)dst, vreinterpret_u32_u8(t0),
- 0); // 00 01 02 03
- dst += dst_stride;
- vst1_lane_u32((uint32_t *)dst, vreinterpret_u32_u8(t1),
- 0); // 10 11 12 13
- dst += dst_stride;
- vst1_lane_u32((uint32_t *)dst, vreinterpret_u32_u8(t2),
- 0); // 20 21 22 23
- dst += dst_stride;
- vst1_lane_u32((uint32_t *)dst, vreinterpret_u32_u8(t3),
- 0); // 30 31 32 33
- dst += dst_stride;
- vst1_lane_u32((uint32_t *)dst, vreinterpret_u32_u8(t0),
- 1); // 40 41 42 43
- dst += dst_stride;
- vst1_lane_u32((uint32_t *)dst, vreinterpret_u32_u8(t1),
- 1); // 50 51 52 53
- dst += dst_stride;
- vst1_lane_u32((uint32_t *)dst, vreinterpret_u32_u8(t2),
- 1); // 60 61 62 63
- dst += dst_stride;
- vst1_lane_u32((uint32_t *)dst, vreinterpret_u32_u8(t3),
- 1); // 70 71 72 73
- dst += dst_stride;
- } else if ((w == 4) && (h == 2)) {
- vst1_lane_u32((uint32_t *)dst, vreinterpret_u32_u8(t0),
- 0); // 00 01 02 03
- dst += dst_stride;
- vst1_lane_u32((uint32_t *)dst, vreinterpret_u32_u8(t1),
- 0); // 10 11 12 13
- dst += dst_stride;
- } else if ((w == 2) && (h > 4)) {
- vst1_lane_u16((uint16_t *)dst, vreinterpret_u16_u8(t0),
- 0); // 00 01
- dst += dst_stride;
- vst1_lane_u16((uint16_t *)dst, vreinterpret_u16_u8(t1),
- 0); // 10 11
- dst += dst_stride;
- vst1_lane_u16((uint16_t *)dst, vreinterpret_u16_u8(t2),
- 0); // 20 21
- dst += dst_stride;
- vst1_lane_u16((uint16_t *)dst, vreinterpret_u16_u8(t3),
- 0); // 30 31
- dst += dst_stride;
- vst1_lane_u16((uint16_t *)dst, vreinterpret_u16_u8(t0),
- 2); // 40 41
- dst += dst_stride;
- vst1_lane_u16((uint16_t *)dst, vreinterpret_u16_u8(t1),
- 2); // 50 51
- dst += dst_stride;
- vst1_lane_u16((uint16_t *)dst, vreinterpret_u16_u8(t2),
- 2); // 60 61
- dst += dst_stride;
- vst1_lane_u16((uint16_t *)dst, vreinterpret_u16_u8(t3),
- 2); // 70 71
- dst += dst_stride;
- } else if ((w == 2) && (h == 2)) {
- vst1_lane_u16((uint16_t *)dst, vreinterpret_u16_u8(t0),
- 0); // 00 01
- dst += dst_stride;
- vst1_lane_u16((uint16_t *)dst, vreinterpret_u16_u8(t1),
- 0); // 10 11
- dst += dst_stride;
+ if (w == 4) {
+ store_u8_4x1(dst + 0 * dst_stride, t0, 0);
+ store_u8_4x1(dst + 1 * dst_stride, t1, 0);
+ if (h > 4) {
+ store_u8_4x1(dst + 2 * dst_stride, t2, 0);
+ store_u8_4x1(dst + 3 * dst_stride, t3, 0);
+ store_u8_4x1(dst + 4 * dst_stride, t0, 1);
+ store_u8_4x1(dst + 5 * dst_stride, t1, 1);
+ store_u8_4x1(dst + 6 * dst_stride, t2, 1);
+ store_u8_4x1(dst + 7 * dst_stride, t3, 1);
+ }
+ } else if (w == 2) {
+ store_u8_2x1(dst + 0 * dst_stride, t0, 0);
+ store_u8_2x1(dst + 1 * dst_stride, t1, 0);
+ if (h > 4) {
+ store_u8_2x1(dst + 2 * dst_stride, t2, 0);
+ store_u8_2x1(dst + 3 * dst_stride, t3, 0);
+ store_u8_2x1(dst + 4 * dst_stride, t0, 2);
+ store_u8_2x1(dst + 5 * dst_stride, t1, 2);
+ store_u8_2x1(dst + 6 * dst_stride, t2, 2);
+ store_u8_2x1(dst + 7 * dst_stride, t3, 2);
+ }
}
+
+ dst += 8 * dst_stride;
h -= 8;
} while (h > 0);
#else
@@ -834,11 +755,10 @@
shift_round_0_low, shift_by_bits_low);
if (w == 4) {
- vst1_lane_u32((uint32_t *)dst, vreinterpret_u32_u8(t0),
- 0); // 00 01 02 03
+ store_u8_4x1(dst, t0, 0);
dst += dst_stride;
} else if (w == 2) {
- vst1_lane_u16((uint16_t *)dst, vreinterpret_u16_u8(t0), 0); // 00 01
+ store_u8_2x1(dst, t0, 0);
dst += dst_stride;
}
h -= 1;
@@ -894,34 +814,29 @@
t0 = convolve8_horiz_8x8(s0, s1, s2, s3, s4, s5, s6, s7, x_filter,
shift_round_0, shift_by_bits);
-
t1 = convolve8_horiz_8x8(s1, s2, s3, s4, s5, s6, s7, s8, x_filter,
shift_round_0, shift_by_bits);
-
t2 = convolve8_horiz_8x8(s2, s3, s4, s5, s6, s7, s8, s9, x_filter,
shift_round_0, shift_by_bits);
-
t3 = convolve8_horiz_8x8(s3, s4, s5, s6, s7, s8, s9, s10, x_filter,
shift_round_0, shift_by_bits);
-
t4 = convolve8_horiz_8x8(s4, s5, s6, s7, s8, s9, s10, s11, x_filter,
shift_round_0, shift_by_bits);
-
t5 = convolve8_horiz_8x8(s5, s6, s7, s8, s9, s10, s11, s12, x_filter,
shift_round_0, shift_by_bits);
-
t6 = convolve8_horiz_8x8(s6, s7, s8, s9, s10, s11, s12, s13, x_filter,
shift_round_0, shift_by_bits);
-
t7 = convolve8_horiz_8x8(s7, s8, s9, s10, s11, s12, s13, s14,
x_filter, shift_round_0, shift_by_bits);
transpose_u8_8x8(&t0, &t1, &t2, &t3, &t4, &t5, &t6, &t7);
+
if (h != 2) {
store_u8_8x8(d, dst_stride, t0, t1, t2, t3, t4, t5, t6, t7);
} else {
- store_row2_u8_8x8(d, dst_stride, t0, t1);
+ store_u8_8x2(d, dst_stride, t0, t1);
}
+
s0 = s8;
s1 = s9;
s2 = s10;
@@ -1048,41 +963,23 @@
d01 = vqrshrun_n_s16(vcombine_s16(d0, d1), FILTER_BITS - 1);
d23 = vqrshrun_n_s16(vcombine_s16(d2, d3), FILTER_BITS - 1);
- if ((w == 4) && (h != 2)) {
- vst1_lane_u32((uint32_t *)dst, vreinterpret_u32_u8(d01),
- 0); // 00 01 02 03
- dst += dst_stride;
- vst1_lane_u32((uint32_t *)dst, vreinterpret_u32_u8(d01),
- 1); // 10 11 12 13
- dst += dst_stride;
- vst1_lane_u32((uint32_t *)dst, vreinterpret_u32_u8(d23),
- 0); // 20 21 22 23
- dst += dst_stride;
- vst1_lane_u32((uint32_t *)dst, vreinterpret_u32_u8(d23),
- 1); // 30 31 32 33
- dst += dst_stride;
- } else if ((w == 4) && (h == 2)) {
- vst1_lane_u32((uint32_t *)dst, vreinterpret_u32_u8(d01),
- 0); // 00 01 02 03
- dst += dst_stride;
- vst1_lane_u32((uint32_t *)dst, vreinterpret_u32_u8(d01),
- 1); // 10 11 12 13
- dst += dst_stride;
- } else if ((w == 2) && (h != 2)) {
- vst1_lane_u16((uint16_t *)dst, vreinterpret_u16_u8(d01), 0); // 00 01
- dst += dst_stride;
- vst1_lane_u16((uint16_t *)dst, vreinterpret_u16_u8(d01), 2); // 10 11
- dst += dst_stride;
- vst1_lane_u16((uint16_t *)dst, vreinterpret_u16_u8(d23), 0); // 20 21
- dst += dst_stride;
- vst1_lane_u16((uint16_t *)dst, vreinterpret_u16_u8(d23), 2); // 30 31
- dst += dst_stride;
- } else if ((w == 2) && (h == 2)) {
- vst1_lane_u16((uint16_t *)dst, vreinterpret_u16_u8(d01), 0); // 00 01
- dst += dst_stride;
- vst1_lane_u16((uint16_t *)dst, vreinterpret_u16_u8(d01), 2); // 10 11
- dst += dst_stride;
+
+ if (w == 2) {
+ store_u8_2x1(dst + 0 * dst_stride, d01, 0);
+ store_u8_2x1(dst + 1 * dst_stride, d01, 2);
+ if (h != 2) {
+ store_u8_2x1(dst + 2 * dst_stride, d23, 0);
+ store_u8_2x1(dst + 3 * dst_stride, d23, 2);
+ }
+ } else {
+ store_u8_4x1(dst + 0 * dst_stride, d01, 0);
+ store_u8_4x1(dst + 1 * dst_stride, d01, 1);
+ if (h != 2) {
+ store_u8_4x1(dst + 2 * dst_stride, d23, 0);
+ store_u8_4x1(dst + 3 * dst_stride, d23, 1);
+ }
}
+
s0 = s4;
s1 = s5;
s2 = s6;
@@ -1090,6 +987,7 @@
s4 = s8;
s5 = s9;
s6 = s10;
+ dst += 4 * dst_stride;
h -= 4;
#else
__builtin_prefetch(dst + 0 * dst_stride);
@@ -1100,11 +998,9 @@
d01 = vqrshrun_n_s16(vcombine_s16(d0, d0), FILTER_BITS - 1);
if (w == 4) {
- vst1_lane_u32((uint32_t *)dst, vreinterpret_u32_u8(d01), 0);
- dst += dst_stride;
+ store_u8_4x1(dst, d01, 0);
} else if (w == 2) {
- vst1_lane_u16((uint16_t *)dst, vreinterpret_u16_u8(d01), 0);
- dst += dst_stride;
+ store_u8_2x1(dst, d01, 0);
}
s0 = s1;
s1 = s2;
@@ -1113,6 +1009,7 @@
s4 = s5;
s5 = s6;
s6 = s7;
+ dst += dst_stride;
h -= 1;
#endif
} while (h > 0);
@@ -1175,20 +1072,11 @@
t1 = convolve8_vert_8x4(s1, s2, s3, s4, s5, s6, s7, s8, y_filter);
t2 = convolve8_vert_8x4(s2, s3, s4, s5, s6, s7, s8, s9, y_filter);
t3 = convolve8_vert_8x4(s3, s4, s5, s6, s7, s8, s9, s10, y_filter);
+
if (h != 2) {
- vst1_u8(d, t0);
- d += dst_stride;
- vst1_u8(d, t1);
- d += dst_stride;
- vst1_u8(d, t2);
- d += dst_stride;
- vst1_u8(d, t3);
- d += dst_stride;
+ store_u8_8x4(d, dst_stride, t0, t1, t2, t3);
} else {
- vst1_u8(d, t0);
- d += dst_stride;
- vst1_u8(d, t1);
- d += dst_stride;
+ store_u8_8x2(d, dst_stride, t0, t1);
}
s0 = s4;
s1 = s5;
@@ -1197,6 +1085,7 @@
s4 = s8;
s5 = s9;
s6 = s10;
+ d += 4 * dst_stride;
height -= 4;
#else
__builtin_prefetch(d);
@@ -1309,8 +1198,7 @@
uint16x8_t t0 = vaddw_u8(vreinterpretq_u16_s16(horiz_const), s0);
int16x8_t d0 = vqrshlq_s16(vreinterpretq_s16_u16(t0), shift_round_0);
if (w == 2) {
- vst1q_lane_s32((int32_t *)(dst_ptr + i * dst_stride),
- vreinterpretq_s32_s16(d0), 0);
+ store_s16_2x1(dst_ptr + i * dst_stride, vget_low_s16(d0), 0);
} else if (w == 4) {
vst1_s16(dst_ptr + i * dst_stride, vget_low_s16(d0));
} else {
@@ -1340,10 +1228,7 @@
uint8x16_t s0, s1, s2, s3;
int16x4_t d0, d1, d2, d3;
- s0 = vld1q_u8(s + 0 * src_stride);
- s1 = vld1q_u8(s + 1 * src_stride);
- s2 = vld1q_u8(s + 2 * src_stride);
- s3 = vld1q_u8(s + 3 * src_stride);
+ load_u8_16x4(s, src_stride, &s0, &s1, &s2, &s3);
d0 = convolve12_4_usdot(s0, x_filter, permute_tbl, horiz_const,
shift_round_0);
@@ -1355,19 +1240,12 @@
shift_round_0);
if (w == 2) {
- vst1_lane_s32((int32_t *)(d + 0 * dst_stride),
- vreinterpret_s32_s16(d0), 0);
- vst1_lane_s32((int32_t *)(d + 1 * dst_stride),
- vreinterpret_s32_s16(d1), 0);
- vst1_lane_s32((int32_t *)(d + 2 * dst_stride),
- vreinterpret_s32_s16(d2), 0);
- vst1_lane_s32((int32_t *)(d + 3 * dst_stride),
- vreinterpret_s32_s16(d3), 0);
+ store_s16_2x1(d + 0 * dst_stride, d0, 0);
+ store_s16_2x1(d + 1 * dst_stride, d1, 0);
+ store_s16_2x1(d + 2 * dst_stride, d2, 0);
+ store_s16_2x1(d + 3 * dst_stride, d3, 0);
} else {
- vst1_s16(d + 0 * dst_stride, d0);
- vst1_s16(d + 1 * dst_stride, d1);
- vst1_s16(d + 2 * dst_stride, d2);
- vst1_s16(d + 3 * dst_stride, d3);
+ store_s16_4x4(d, dst_stride, d0, d1, d2, d3);
}
s += 4;
@@ -1395,7 +1273,7 @@
shift_round_0);
if (w == 2) {
- vst1_lane_s32((int32_t *)d, vreinterpret_s32_s16(d0), 0);
+ store_s16_2x1(d, d0, 0);
} else {
vst1_s16(d, d0);
}
@@ -1418,14 +1296,8 @@
uint8x16_t s0[2], s1[2], s2[2], s3[2];
int16x8_t d0, d1, d2, d3;
- s0[0] = vld1q_u8(s + 0 * src_stride);
- s1[0] = vld1q_u8(s + 1 * src_stride);
- s2[0] = vld1q_u8(s + 2 * src_stride);
- s3[0] = vld1q_u8(s + 3 * src_stride);
- s0[1] = vld1q_u8(s + 0 * src_stride + 4);
- s1[1] = vld1q_u8(s + 1 * src_stride + 4);
- s2[1] = vld1q_u8(s + 2 * src_stride + 4);
- s3[1] = vld1q_u8(s + 3 * src_stride + 4);
+ load_u8_16x4(s, src_stride, &s0[0], &s1[0], &s2[0], &s3[0]);
+ load_u8_16x4(s + 4, src_stride, &s0[1], &s1[1], &s2[1], &s3[1]);
d0 = convolve12_8_usdot(s0[0], s0[1], x_filter, permute_tbl,
horiz_const, shift_round_0);
@@ -1436,10 +1308,7 @@
d3 = convolve12_8_usdot(s3[0], s3[1], x_filter, permute_tbl,
horiz_const, shift_round_0);
- vst1q_s16(d + 0 * dst_stride, d0);
- vst1q_s16(d + 1 * dst_stride, d1);
- vst1q_s16(d + 2 * dst_stride, d2);
- vst1q_s16(d + 3 * dst_stride, d3);
+ store_s16_8x4(d, dst_stride, d0, d1, d2, d3);
s += 8;
d += 8;
@@ -1573,8 +1442,7 @@
uint16x8_t t0 = vaddw_u8(vreinterpretq_u16_s16(horiz_const), s0);
int16x8_t d0 = vqrshlq_s16(vreinterpretq_s16_u16(t0), shift_round_0);
if (w == 2) {
- vst1q_lane_s32((int32_t *)(dst_ptr + i * dst_stride),
- vreinterpretq_s32_s16(d0), 0);
+ store_s16_2x1(dst_ptr + i * dst_stride, vget_low_s16(d0), 0);
} else if (w == 4) {
vst1_s16(dst_ptr + i * dst_stride, vget_low_s16(d0));
} else {
@@ -1612,10 +1480,7 @@
uint8x16_t s0, s1, s2, s3;
int16x4_t d0, d1, d2, d3;
- s0 = vld1q_u8(s + 0 * src_stride);
- s1 = vld1q_u8(s + 1 * src_stride);
- s2 = vld1q_u8(s + 2 * src_stride);
- s3 = vld1q_u8(s + 3 * src_stride);
+ load_u8_16x4(s, src_stride, &s0, &s1, &s2, &s3);
d0 = convolve12_4_sdot(s0, x_filter, correction, range_limit,
permute_tbl, shift_round_0);
@@ -1627,19 +1492,12 @@
permute_tbl, shift_round_0);
if (w == 2) {
- vst1_lane_s32((int32_t *)(d + 0 * dst_stride),
- vreinterpret_s32_s16(d0), 0);
- vst1_lane_s32((int32_t *)(d + 1 * dst_stride),
- vreinterpret_s32_s16(d1), 0);
- vst1_lane_s32((int32_t *)(d + 2 * dst_stride),
- vreinterpret_s32_s16(d2), 0);
- vst1_lane_s32((int32_t *)(d + 3 * dst_stride),
- vreinterpret_s32_s16(d3), 0);
+ store_s16_2x1(d + 0 * dst_stride, d0, 0);
+ store_s16_2x1(d + 1 * dst_stride, d1, 0);
+ store_s16_2x1(d + 2 * dst_stride, d2, 0);
+ store_s16_2x1(d + 3 * dst_stride, d3, 0);
} else {
- vst1_s16(d + 0 * dst_stride, d0);
- vst1_s16(d + 1 * dst_stride, d1);
- vst1_s16(d + 2 * dst_stride, d2);
- vst1_s16(d + 3 * dst_stride, d3);
+ store_s16_4x4(d, dst_stride, d0, d1, d2, d3);
}
s += 4;
@@ -1667,7 +1525,7 @@
permute_tbl, shift_round_0);
if (w == 2) {
- vst1_lane_s32((int32_t *)d, vreinterpret_s32_s16(d0), 0);
+ store_s16_2x1(d, d0, 0);
} else {
vst1_s16(d, d0);
}
@@ -1690,14 +1548,8 @@
uint8x16_t s0[2], s1[2], s2[2], s3[2];
int16x8_t d0, d1, d2, d3;
- s0[0] = vld1q_u8(s + 0 * src_stride);
- s1[0] = vld1q_u8(s + 1 * src_stride);
- s2[0] = vld1q_u8(s + 2 * src_stride);
- s3[0] = vld1q_u8(s + 3 * src_stride);
- s0[1] = vld1q_u8(s + 0 * src_stride + 4);
- s1[1] = vld1q_u8(s + 1 * src_stride + 4);
- s2[1] = vld1q_u8(s + 2 * src_stride + 4);
- s3[1] = vld1q_u8(s + 3 * src_stride + 4);
+ load_u8_16x4(s, src_stride, &s0[0], &s1[0], &s2[0], &s3[0]);
+ load_u8_16x4(s + 4, src_stride, &s0[1], &s1[1], &s2[1], &s3[1]);
d0 = convolve12_8_sdot(s0[0], s0[1], x_filter, correction,
range_limit, permute_tbl, shift_round_0);
@@ -1708,10 +1560,7 @@
d3 = convolve12_8_sdot(s3[0], s3[1], x_filter, correction,
range_limit, permute_tbl, shift_round_0);
- vst1q_s16(d + 0 * dst_stride, d0);
- vst1q_s16(d + 1 * dst_stride, d1);
- vst1q_s16(d + 2 * dst_stride, d2);
- vst1q_s16(d + 3 * dst_stride, d3);
+ store_s16_8x4(d, dst_stride, d0, d1, d2, d3);
s += 8;
d += 8;
@@ -1825,7 +1674,7 @@
horiz_const, shift_round_0);
if (w == 2) {
- vst1_lane_s32((int32_t *)d, vreinterpret_s32_s16(d0), 0);
+ store_s16_2x1(d, d0, 0);
} else {
vst1_s16(d, d0);
}
@@ -1906,19 +1755,12 @@
transpose_s16_4x4d(&d0, &d1, &d2, &d3);
if (w == 2) {
- vst1_lane_s32((int32_t *)(d + 0 * dst_stride), vreinterpret_s32_s16(d0),
- 0);
- vst1_lane_s32((int32_t *)(d + 1 * dst_stride), vreinterpret_s32_s16(d1),
- 0);
- vst1_lane_s32((int32_t *)(d + 2 * dst_stride), vreinterpret_s32_s16(d2),
- 0);
- vst1_lane_s32((int32_t *)(d + 3 * dst_stride), vreinterpret_s32_s16(d3),
- 0);
+ store_s16_2x1(d + 0 * dst_stride, d0, 0);
+ store_s16_2x1(d + 1 * dst_stride, d1, 0);
+ store_s16_2x1(d + 2 * dst_stride, d2, 0);
+ store_s16_2x1(d + 3 * dst_stride, d3, 0);
} else {
- vst1_s16((d + 0 * dst_stride), d0);
- vst1_s16((d + 1 * dst_stride), d1);
- vst1_s16((d + 2 * dst_stride), d2);
- vst1_s16((d + 3 * dst_stride), d3);
+ store_s16_4x4(d, dst_stride, d0, d1, d2, d3);
}
s0 = s4;
@@ -1978,14 +1820,12 @@
int16x8_t dd01, dd23;
uint8x8_t d01, d23;
- load_s16_4x8(src_ptr, src_stride, &s0, &s1, &s2, &s3, &s4, &s5, &s6, &s7);
- src_ptr += (8 * src_stride);
- load_s16_4x4(src_ptr, src_stride, &s8, &s9, &s10, &s11);
- src_ptr += (3 * src_stride);
+ load_s16_4x11(src_ptr, src_stride, &s0, &s1, &s2, &s3, &s4, &s5, &s6, &s7,
+ &s8, &s9, &s10);
+ src_ptr += 11 * src_stride;
do {
load_s16_4x4(src_ptr, src_stride, &s11, &s12, &s13, &s14);
- src_ptr += 4 * src_stride;
d0 = convolve12_vert_4x4_s32(
s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, y_filter_0_7,
@@ -2007,26 +1847,18 @@
d23 = vqmovun_s16(dd23);
if (w == 2) {
- vst1_lane_u16((uint16_t *)dst_ptr, vreinterpret_u16_u8(d01), 0);
- dst_ptr += dst_stride;
- vst1_lane_u16((uint16_t *)dst_ptr, vreinterpret_u16_u8(d01), 2);
- dst_ptr += dst_stride;
+ store_u8_2x1(dst_ptr + 0 * dst_stride, d01, 0);
+ store_u8_2x1(dst_ptr + 1 * dst_stride, d01, 2);
if (h != 2) {
- vst1_lane_u16((uint16_t *)dst_ptr, vreinterpret_u16_u8(d23), 0);
- dst_ptr += dst_stride;
- vst1_lane_u16((uint16_t *)dst_ptr, vreinterpret_u16_u8(d23), 2);
- dst_ptr += dst_stride;
+ store_u8_2x1(dst_ptr + 2 * dst_stride, d23, 0);
+ store_u8_2x1(dst_ptr + 3 * dst_stride, d23, 2);
}
} else {
- vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d01), 0);
- dst_ptr += dst_stride;
- vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d01), 1);
- dst_ptr += dst_stride;
+ store_u8_4x1(dst_ptr + 0 * dst_stride, d01, 0);
+ store_u8_4x1(dst_ptr + 1 * dst_stride, d01, 1);
if (h != 2) {
- vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d23), 0);
- dst_ptr += dst_stride;
- vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d23), 1);
- dst_ptr += dst_stride;
+ store_u8_4x1(dst_ptr + 2 * dst_stride, d23, 0);
+ store_u8_4x1(dst_ptr + 3 * dst_stride, d23, 1);
}
}
@@ -2041,6 +1873,8 @@
s8 = s12;
s9 = s13;
s10 = s14;
+ src_ptr += 4 * src_stride;
+ dst_ptr += 4 * dst_stride;
h -= 4;
} while (h > 0);
@@ -2054,14 +1888,12 @@
int height = h;
- load_s16_8x8(s, src_stride, &s0, &s1, &s2, &s3, &s4, &s5, &s6, &s7);
- s += (8 * src_stride);
- load_s16_8x4(s, src_stride, &s8, &s9, &s10, &s11);
- s += (3 * src_stride);
+ load_s16_8x11(s, src_stride, &s0, &s1, &s2, &s3, &s4, &s5, &s6, &s7, &s8,
+ &s9, &s10);
+ s += 11 * src_stride;
do {
load_s16_8x4(s, src_stride, &s11, &s12, &s13, &s14);
- s += 4 * src_stride;
d0 = convolve12_vert_8x4_s32(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9,
s10, s11, y_filter_0_7, y_filter_8_11,
@@ -2080,15 +1912,10 @@
round_shift_vec, offset_const,
sub_const_vec, vec_round_bits);
- vst1_u8(d, d0);
- d += dst_stride;
- vst1_u8(d, d1);
- d += dst_stride;
if (h != 2) {
- vst1_u8(d, d2);
- d += dst_stride;
- vst1_u8(d, d3);
- d += dst_stride;
+ store_u8_8x4(d, dst_stride, d0, d1, d2, d3);
+ } else {
+ store_u8_8x2(d, dst_stride, d0, d1);
}
s0 = s4;
@@ -2102,6 +1929,8 @@
s8 = s12;
s9 = s13;
s10 = s14;
+ s += 4 * src_stride;
+ d += 4 * dst_stride;
height -= 4;
} while (height > 0);
@@ -2142,7 +1971,7 @@
do {
assert(height >= 4);
- load_u8_8x16(src_ptr, src_stride, &s0, &s1, &s2, &s3);
+ load_u8_16x4(src_ptr, src_stride, &s0, &s1, &s2, &s3);
t0 = convolve8_4_usdot(s0, x_filter, permute_tbl, horiz_const);
t1 = convolve8_4_usdot(s1, x_filter, permute_tbl, horiz_const);
@@ -2155,19 +1984,12 @@
d3 = vqrshl_s16(vmovn_s32(t3), shift_round_0);
if (w == 2) {
- vst1_lane_u32((uint32_t *)(dst_ptr + 0 * dst_stride),
- vreinterpret_u32_s16(d0), 0);
- vst1_lane_u32((uint32_t *)(dst_ptr + 1 * dst_stride),
- vreinterpret_u32_s16(d1), 0);
- vst1_lane_u32((uint32_t *)(dst_ptr + 2 * dst_stride),
- vreinterpret_u32_s16(d2), 0);
- vst1_lane_u32((uint32_t *)(dst_ptr + 3 * dst_stride),
- vreinterpret_u32_s16(d3), 0);
+ store_s16_2x1(dst_ptr + 0 * dst_stride, d0, 0);
+ store_s16_2x1(dst_ptr + 1 * dst_stride, d1, 0);
+ store_s16_2x1(dst_ptr + 2 * dst_stride, d2, 0);
+ store_s16_2x1(dst_ptr + 3 * dst_stride, d3, 0);
} else {
- vst1_s16(dst_ptr + 0 * dst_stride, d0);
- vst1_s16(dst_ptr + 1 * dst_stride, d1);
- vst1_s16(dst_ptr + 2 * dst_stride, d2);
- vst1_s16(dst_ptr + 3 * dst_stride, d3);
+ store_s16_4x4(dst_ptr, dst_stride, d0, d1, d2, d3);
}
src_ptr += 4 * src_stride;
@@ -2184,7 +2006,7 @@
d0 = vqrshl_s16(vmovn_s32(t0), shift_round_0);
if (w == 2) {
- vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_s16(d0), 0);
+ store_s16_2x1(dst_ptr, d0, 0);
} else {
vst1_s16(dst_ptr, d0);
}
@@ -2208,10 +2030,7 @@
int width = w;
do {
- s0 = vld1q_u8(s + 0 * src_stride);
- s1 = vld1q_u8(s + 1 * src_stride);
- s2 = vld1q_u8(s + 2 * src_stride);
- s3 = vld1q_u8(s + 3 * src_stride);
+ load_u8_16x4(s, src_stride, &s0, &s1, &s2, &s3);
d0 = convolve8_8_usdot(s0, x_filter, permute_tbl, horiz_const,
shift_round_0);
@@ -2222,10 +2041,7 @@
d3 = convolve8_8_usdot(s3, x_filter, permute_tbl, horiz_const,
shift_round_0);
- vst1q_s16(d + 0 * dst_stride, d0);
- vst1q_s16(d + 1 * dst_stride, d1);
- vst1q_s16(d + 2 * dst_stride, d2);
- vst1q_s16(d + 3 * dst_stride, d3);
+ store_s16_8x4(d, dst_stride, d0, d1, d2, d3);
s += 8;
d += 8;
@@ -2299,7 +2115,7 @@
do {
assert(height >= 4);
- load_u8_8x16(src_ptr, src_stride, &s0, &s1, &s2, &s3);
+ load_u8_16x4(src_ptr, src_stride, &s0, &s1, &s2, &s3);
t0 = convolve8_4_sdot(s0, x_filter, correction, range_limit, permute_tbl);
t1 = convolve8_4_sdot(s1, x_filter, correction, range_limit, permute_tbl);
@@ -2312,19 +2128,12 @@
d3 = vqrshl_s16(vmovn_s32(t3), shift_round_0);
if (w == 2) {
- vst1_lane_u32((uint32_t *)(dst_ptr + 0 * dst_stride),
- vreinterpret_u32_s16(d0), 0);
- vst1_lane_u32((uint32_t *)(dst_ptr + 1 * dst_stride),
- vreinterpret_u32_s16(d1), 0);
- vst1_lane_u32((uint32_t *)(dst_ptr + 2 * dst_stride),
- vreinterpret_u32_s16(d2), 0);
- vst1_lane_u32((uint32_t *)(dst_ptr + 3 * dst_stride),
- vreinterpret_u32_s16(d3), 0);
+ store_s16_2x1(dst_ptr + 0 * dst_stride, d0, 0);
+ store_s16_2x1(dst_ptr + 1 * dst_stride, d1, 0);
+ store_s16_2x1(dst_ptr + 2 * dst_stride, d2, 0);
+ store_s16_2x1(dst_ptr + 3 * dst_stride, d3, 0);
} else {
- vst1_s16(dst_ptr + 0 * dst_stride, d0);
- vst1_s16(dst_ptr + 1 * dst_stride, d1);
- vst1_s16(dst_ptr + 2 * dst_stride, d2);
- vst1_s16(dst_ptr + 3 * dst_stride, d3);
+ store_s16_4x4(dst_ptr, dst_stride, d0, d1, d2, d3);
}
src_ptr += 4 * src_stride;
@@ -2342,7 +2151,7 @@
d0 = vqrshl_s16(vmovn_s32(t0), shift_round_0);
if (w == 2) {
- vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_s16(d0), 0);
+ store_s16_2x1(dst_ptr, d0, 0);
} else {
vst1_s16(dst_ptr, d0);
}
@@ -2366,10 +2175,7 @@
int width = w;
do {
- s0 = vld1q_u8(s + 0 * src_stride);
- s1 = vld1q_u8(s + 1 * src_stride);
- s2 = vld1q_u8(s + 2 * src_stride);
- s3 = vld1q_u8(s + 3 * src_stride);
+ load_u8_16x4(s, src_stride, &s0, &s1, &s2, &s3);
d0 = convolve8_8_sdot(s0, x_filter, correction, range_limit,
permute_tbl, shift_round_0);
@@ -2380,10 +2186,7 @@
d3 = convolve8_8_sdot(s3, x_filter, correction, range_limit,
permute_tbl, shift_round_0);
- vst1q_s16(d + 0 * dst_stride, d0);
- vst1q_s16(d + 1 * dst_stride, d1);
- vst1q_s16(d + 2 * dst_stride, d2);
- vst1q_s16(d + 3 * dst_stride, d3);
+ store_s16_8x4(d, dst_stride, d0, d1, d2, d3);
s += 8;
d += 8;
@@ -2504,7 +2307,7 @@
horiz_const, shift_round_0);
if (width == 2) {
- vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_s16(d0), 0);
+ store_s16_2x1(dst_ptr, d0, 0);
} else {
vst1_s16(dst_ptr, d0);
}
@@ -2577,19 +2380,12 @@
transpose_s16_4x4d(&d0, &d1, &d2, &d3);
if (w == 2) {
- vst1_lane_u32((uint32_t *)(dst_ptr + 0 * dst_stride),
- vreinterpret_u32_s16(d0), 0);
- vst1_lane_u32((uint32_t *)(dst_ptr + 1 * dst_stride),
- vreinterpret_u32_s16(d1), 0);
- vst1_lane_u32((uint32_t *)(dst_ptr + 2 * dst_stride),
- vreinterpret_u32_s16(d2), 0);
- vst1_lane_u32((uint32_t *)(dst_ptr + 3 * dst_stride),
- vreinterpret_u32_s16(d3), 0);
+ store_s16_2x1(dst_ptr + 0 * dst_stride, d0, 0);
+ store_s16_2x1(dst_ptr + 1 * dst_stride, d1, 0);
+ store_s16_2x1(dst_ptr + 2 * dst_stride, d2, 0);
+ store_s16_2x1(dst_ptr + 3 * dst_stride, d3, 0);
} else {
- vst1_s16((dst_ptr + 0 * dst_stride), d0);
- vst1_s16((dst_ptr + 1 * dst_stride), d1);
- vst1_s16((dst_ptr + 2 * dst_stride), d2);
- vst1_s16((dst_ptr + 3 * dst_stride), d3);
+ store_s16_4x4(dst_ptr, dst_stride, d0, d1, d2, d3);
}
src_ptr += 4 * src_stride;
@@ -2809,13 +2605,12 @@
int16_t *s = src_ptr;
uint8_t *d = dst_ptr;
- load_s16_4x8(s, src_stride, &s0, &s1, &s2, &s3, &s4, &s5, &s6, &s7);
- s += (7 * src_stride);
+ load_s16_4x7(s, src_stride, &s0, &s1, &s2, &s3, &s4, &s5, &s6);
+ s += 7 * src_stride;
do {
#if defined(__aarch64__)
load_s16_4x4(s, src_stride, &s7, &s8, &s9, &s10);
- s += (4 * src_stride);
d0 = convolve8_vert_4x4_s32(s0, s1, s2, s3, s4, s5, s6, s7, y_filter,
round_shift_vec, offset_const, sub_const_vec);
@@ -2832,27 +2627,19 @@
d01 = vqmovun_s16(dd0);
d23 = vqmovun_s16(dd1);
- if (w == 4) {
- vst1_lane_u32((uint32_t *)d, vreinterpret_u32_u8(d01), 0);
- d += dst_stride;
- vst1_lane_u32((uint32_t *)d, vreinterpret_u32_u8(d01), 1);
- d += dst_stride;
+ if (w == 2) {
+ store_u8_2x1(d + 0 * dst_stride, d01, 0);
+ store_u8_2x1(d + 1 * dst_stride, d01, 2);
if (h != 2) {
- vst1_lane_u32((uint32_t *)d, vreinterpret_u32_u8(d23), 0);
- d += dst_stride;
- vst1_lane_u32((uint32_t *)d, vreinterpret_u32_u8(d23), 1);
- d += dst_stride;
+ store_u8_2x1(d + 2 * dst_stride, d23, 0);
+ store_u8_2x1(d + 3 * dst_stride, d23, 2);
}
} else {
- vst1_lane_u16((uint16_t *)d, vreinterpret_u16_u8(d01), 0);
- d += dst_stride;
- vst1_lane_u16((uint16_t *)d, vreinterpret_u16_u8(d01), 2);
- d += dst_stride;
+ store_u8_4x1(d + 0 * dst_stride, d01, 0);
+ store_u8_4x1(d + 1 * dst_stride, d01, 1);
if (h != 2) {
- vst1_lane_u16((uint16_t *)d, vreinterpret_u16_u8(d23), 0);
- d += dst_stride;
- vst1_lane_u16((uint16_t *)d, vreinterpret_u16_u8(d23), 2);
- d += dst_stride;
+ store_u8_4x1(d + 2 * dst_stride, d23, 0);
+ store_u8_4x1(d + 3 * dst_stride, d23, 1);
}
}
@@ -2863,6 +2650,8 @@
s4 = s8;
s5 = s9;
s6 = s10;
+ s += 4 * src_stride;
+ d += 4 * dst_stride;
h -= 4;
#else // !defined(__aarch64__)
s7 = vld1_s16(s);
@@ -2875,11 +2664,9 @@
d01 = vqmovun_s16(dd0);
if (w == 2) {
- vst1_lane_u16((uint16_t *)d, vreinterpret_u16_u8(d01), 0);
- d += dst_stride;
+ store_u8_2x1(d, d01, 0);
} else {
- vst1_lane_u32((uint32_t *)d, vreinterpret_u32_u8(d01), 0);
- d += dst_stride;
+ store_u8_4x1(d, d01, 0);
}
s0 = s1;
@@ -2889,6 +2676,7 @@
s4 = s5;
s5 = s6;
s6 = s7;
+ d += dst_stride;
h--;
#endif // defined(__aarch64__)
} while (h > 0);
@@ -2906,13 +2694,12 @@
int16_t *s = src_ptr;
uint8_t *d = dst_ptr;
- load_s16_8x8(s, src_stride, &s0, &s1, &s2, &s3, &s4, &s5, &s6, &s7);
- s += (7 * src_stride);
+ load_s16_8x7(s, src_stride, &s0, &s1, &s2, &s3, &s4, &s5, &s6);
+ s += 7 * src_stride;
do {
#if defined(__aarch64__)
load_s16_8x4(s, src_stride, &s7, &s8, &s9, &s10);
- s += (4 * src_stride);
d0 = convolve8_vert_8x4_s32(s0, s1, s2, s3, s4, s5, s6, s7, y_filter,
round_shift_vec, offset_const,
@@ -2926,16 +2713,10 @@
d3 = convolve8_vert_8x4_s32(s3, s4, s5, s6, s7, s8, s9, s10, y_filter,
round_shift_vec, offset_const,
sub_const_vec, vec_round_bits);
-
- vst1_u8(d, d0);
- d += dst_stride;
- vst1_u8(d, d1);
- d += dst_stride;
if (h != 2) {
- vst1_u8(d, d2);
- d += dst_stride;
- vst1_u8(d, d3);
- d += dst_stride;
+ store_u8_8x4(d, dst_stride, d0, d1, d2, d3);
+ } else {
+ store_u8_8x2(d, dst_stride, d0, d1);
}
s0 = s4;
@@ -2945,17 +2726,16 @@
s4 = s8;
s5 = s9;
s6 = s10;
+ s += 4 * src_stride;
+ d += 4 * dst_stride;
height -= 4;
#else // !defined(__aarch64__)
s7 = vld1q_s16(s);
- s += src_stride;
d0 = convolve8_vert_8x4_s32(s0, s1, s2, s3, s4, s5, s6, s7, y_filter,
round_shift_vec, offset_const,
sub_const_vec, vec_round_bits);
-
vst1_u8(d, d0);
- d += dst_stride;
s0 = s1;
s1 = s2;
@@ -2964,6 +2744,8 @@
s4 = s5;
s5 = s6;
s6 = s7;
+ s += src_stride;
+ d += dst_stride;
height--;
#endif // defined(__aarch64__)
} while (height > 0);
@@ -3066,17 +2848,12 @@
int16_t *s = src_ptr;
uint8_t *d = dst_ptr;
- s0 = vld1_s16(s + 0 * src_stride);
- s1 = vld1_s16(s + 1 * src_stride);
- s2 = vld1_s16(s + 2 * src_stride);
- s3 = vld1_s16(s + 3 * src_stride);
- s4 = vld1_s16(s + 4 * src_stride);
- s += (5 * src_stride);
+ load_s16_4x5(s, src_stride, &s0, &s1, &s2, &s3, &s4);
+ s += 5 * src_stride;
do {
#if defined(__aarch64__)
load_s16_4x4(s, src_stride, &s5, &s6, &s7, &s8);
- s += (4 * src_stride);
d0 = convolve6_vert_4x4_s32(s0, s1, s2, s3, s4, s5, y_filter,
round_shift_vec, offset_const, sub_const_vec);
@@ -3093,27 +2870,19 @@
d01 = vqmovun_s16(dd0);
d23 = vqmovun_s16(dd1);
- if (w == 4) {
- vst1_lane_u32((uint32_t *)d, vreinterpret_u32_u8(d01), 0);
- d += dst_stride;
- vst1_lane_u32((uint32_t *)d, vreinterpret_u32_u8(d01), 1);
- d += dst_stride;
+ if (w == 2) {
+ store_u8_2x1(d + 0 * dst_stride, d01, 0);
+ store_u8_2x1(d + 1 * dst_stride, d01, 2);
if (h != 2) {
- vst1_lane_u32((uint32_t *)d, vreinterpret_u32_u8(d23), 0);
- d += dst_stride;
- vst1_lane_u32((uint32_t *)d, vreinterpret_u32_u8(d23), 1);
- d += dst_stride;
+ store_u8_2x1(d + 2 * dst_stride, d23, 0);
+ store_u8_2x1(d + 3 * dst_stride, d23, 2);
}
} else {
- vst1_lane_u16((uint16_t *)d, vreinterpret_u16_u8(d01), 0);
- d += dst_stride;
- vst1_lane_u16((uint16_t *)d, vreinterpret_u16_u8(d01), 2);
- d += dst_stride;
+ store_u8_4x1(d + 0 * dst_stride, d01, 0);
+ store_u8_4x1(d + 1 * dst_stride, d01, 1);
if (h != 2) {
- vst1_lane_u16((uint16_t *)d, vreinterpret_u16_u8(d23), 0);
- d += dst_stride;
- vst1_lane_u16((uint16_t *)d, vreinterpret_u16_u8(d23), 2);
- d += dst_stride;
+ store_u8_4x1(d + 2 * dst_stride, d23, 0);
+ store_u8_4x1(d + 3 * dst_stride, d23, 1);
}
}
@@ -3122,10 +2891,11 @@
s2 = s6;
s3 = s7;
s4 = s8;
+ s += 4 * src_stride;
+ d += 4 * dst_stride;
h -= 4;
#else // !defined(__aarch64__)
s5 = vld1_s16(s);
- s += src_stride;
d0 = convolve6_vert_4x4_s32(s0, s1, s2, s3, s4, s5, y_filter,
round_shift_vec, offset_const, sub_const_vec);
@@ -3134,11 +2904,9 @@
d01 = vqmovun_s16(dd0);
if (w == 2) {
- vst1_lane_u16((uint16_t *)d, vreinterpret_u16_u8(d01), 0);
- d += dst_stride;
+ store_u8_2x1(d, d01, 0);
} else {
- vst1_lane_u32((uint32_t *)d, vreinterpret_u32_u8(d01), 0);
- d += dst_stride;
+ store_u8_4x1(d, d01, 0);
}
s0 = s1;
@@ -3146,6 +2914,8 @@
s2 = s3;
s3 = s4;
s4 = s5;
+ s += src_stride;
+ d += dst_stride;
h--;
#endif // defined(__aarch64__)
} while (h > 0);
@@ -3163,17 +2933,12 @@
int16_t *s = src_ptr;
uint8_t *d = dst_ptr;
- s0 = vld1q_s16(s + 0 * src_stride);
- s1 = vld1q_s16(s + 1 * src_stride);
- s2 = vld1q_s16(s + 2 * src_stride);
- s3 = vld1q_s16(s + 3 * src_stride);
- s4 = vld1q_s16(s + 4 * src_stride);
- s += (5 * src_stride);
+ load_s16_8x5(s, src_stride, &s0, &s1, &s2, &s3, &s4);
+ s += 5 * src_stride;
do {
#if defined(__aarch64__)
load_s16_8x4(s, src_stride, &s5, &s6, &s7, &s8);
- s += (4 * src_stride);
d0 = convolve6_vert_8x4_s32(s0, s1, s2, s3, s4, s5, y_filter,
round_shift_vec, offset_const,
@@ -3188,15 +2953,10 @@
round_shift_vec, offset_const,
sub_const_vec, vec_round_bits);
- vst1_u8(d, d0);
- d += dst_stride;
- vst1_u8(d, d1);
- d += dst_stride;
if (h != 2) {
- vst1_u8(d, d2);
- d += dst_stride;
- vst1_u8(d, d3);
- d += dst_stride;
+ store_u8_8x4(d, dst_stride, d0, d1, d2, d3);
+ } else {
+ store_u8_8x2(d, dst_stride, d0, d1);
}
s0 = s4;
@@ -3204,23 +2964,24 @@
s2 = s6;
s3 = s7;
s4 = s8;
+ s += 4 * src_stride;
+ d += 4 * dst_stride;
height -= 4;
#else // !defined(__aarch64__)
s5 = vld1q_s16(s);
- s += src_stride;
d0 = convolve6_vert_8x4_s32(s0, s1, s2, s3, s4, s5, y_filter,
round_shift_vec, offset_const,
sub_const_vec, vec_round_bits);
-
vst1_u8(d, d0);
- d += dst_stride;
s0 = s1;
s1 = s2;
s2 = s3;
s3 = s4;
s4 = s5;
+ s += src_stride;
+ d += dst_stride;
height--;
#endif // defined(__aarch64__)
} while (height > 0);
@@ -3329,7 +3090,7 @@
tt = convolve8_4(t[0], t[1], t[2], t[3], t[4], t[5], t[6], t[7],
filters);
d = vqrshrun_n_s16(vcombine_s16(tt, tt), 7);
- vst1_lane_u32((uint32_t *)&temp[4 * z], vreinterpret_u32_u8(d), 0);
+ store_u8_4x1(&temp[4 * z], d, 0);
} else {
int i;
for (i = 0; i < 4; ++i) {
@@ -3342,14 +3103,10 @@
// transpose the 4x4 filters values back to dst
{
const uint8x8x4_t d4 = vld4_u8(temp);
- vst1_lane_u32((uint32_t *)&dst[x + 0 * dst_stride],
- vreinterpret_u32_u8(d4.val[0]), 0);
- vst1_lane_u32((uint32_t *)&dst[x + 1 * dst_stride],
- vreinterpret_u32_u8(d4.val[1]), 0);
- vst1_lane_u32((uint32_t *)&dst[x + 2 * dst_stride],
- vreinterpret_u32_u8(d4.val[2]), 0);
- vst1_lane_u32((uint32_t *)&dst[x + 3 * dst_stride],
- vreinterpret_u32_u8(d4.val[3]), 0);
+ store_u8_4x1(&dst[x + 0 * dst_stride], d4.val[0], 0);
+ store_u8_4x1(&dst[x + 1 * dst_stride], d4.val[1], 0);
+ store_u8_4x1(&dst[x + 2 * dst_stride], d4.val[2], 0);
+ store_u8_4x1(&dst[x + 3 * dst_stride], d4.val[3], 0);
}
x += 4;
} while (x < w);
@@ -3403,14 +3160,8 @@
load_u8_8x8(temp, 8, &d[0], &d[1], &d[2], &d[3], &d[4], &d[5], &d[6],
&d[7]);
transpose_u8_8x8(&d[0], &d[1], &d[2], &d[3], &d[4], &d[5], &d[6], &d[7]);
- vst1_u8(&dst[x + 0 * dst_stride], d[0]);
- vst1_u8(&dst[x + 1 * dst_stride], d[1]);
- vst1_u8(&dst[x + 2 * dst_stride], d[2]);
- vst1_u8(&dst[x + 3 * dst_stride], d[3]);
- vst1_u8(&dst[x + 4 * dst_stride], d[4]);
- vst1_u8(&dst[x + 5 * dst_stride], d[5]);
- vst1_u8(&dst[x + 6 * dst_stride], d[6]);
- vst1_u8(&dst[x + 7 * dst_stride], d[7]);
+ store_u8_8x8(dst + x, dst_stride, d[0], d[1], d[2], d[3], d[4], d[5],
+ d[6], d[7]);
x += 8;
} while (x < w);
@@ -3449,7 +3200,7 @@
tt = convolve8_4(t[0], t[1], t[2], t[3], t[4], t[5], t[6], t[7], filters);
d = vqrshrun_n_s16(vcombine_s16(tt, tt), 7);
- vst1_lane_u32((uint32_t *)dst, vreinterpret_u32_u8(d), 0);
+ store_u8_4x1(dst, d, 0);
} else {
memcpy(dst, &src_y[3 * src_stride], w);
}
diff --git a/av1/common/arm/jnt_convolve_neon.c b/av1/common/arm/jnt_convolve_neon.c
index 36c8f9c..6aa2d43 100644
--- a/av1/common/arm/jnt_convolve_neon.c
+++ b/av1/common/arm/jnt_convolve_neon.c
@@ -303,10 +303,7 @@
int16x4_t d0, d1, d2, d3;
do {
- s0 = vld1q_u8(src + 0 * src_stride);
- s1 = vld1q_u8(src + 1 * src_stride);
- s2 = vld1q_u8(src + 2 * src_stride);
- s3 = vld1q_u8(src + 3 * src_stride);
+ load_u8_16x4(src, src_stride, &s0, &s1, &s2, &s3);
t0 = convolve8_4_usdot(s0, x_filter, permute_tbl, horiz_const);
t1 = convolve8_4_usdot(s1, x_filter, permute_tbl, horiz_const);
@@ -318,10 +315,7 @@
d2 = vqrshl_s16(vmovn_s32(t2), shift_round_0);
d3 = vqrshl_s16(vmovn_s32(t3), shift_round_0);
- vst1_s16((dst_ptr + 0 * dst_stride), d0);
- vst1_s16((dst_ptr + 1 * dst_stride), d1);
- vst1_s16((dst_ptr + 2 * dst_stride), d2);
- vst1_s16((dst_ptr + 3 * dst_stride), d3);
+ store_s16_4x4(dst_ptr, dst_stride, d0, d1, d2, d3);
src += 4 * src_stride;
dst_ptr += 4 * dst_stride;
@@ -341,10 +335,7 @@
d = dst_ptr;
do {
- s0 = vld1q_u8(s + 0 * src_stride);
- s1 = vld1q_u8(s + 1 * src_stride);
- s2 = vld1q_u8(s + 2 * src_stride);
- s3 = vld1q_u8(s + 3 * src_stride);
+ load_u8_16x4(s, src_stride, &s0, &s1, &s2, &s3);
d0 = convolve8_8_usdot(s0, x_filter, permute_tbl, horiz_const,
shift_round_0);
@@ -355,10 +346,7 @@
d3 = convolve8_8_usdot(s3, x_filter, permute_tbl, horiz_const,
shift_round_0);
- vst1q_s16(d + 0 * dst_stride, d0);
- vst1q_s16(d + 1 * dst_stride, d1);
- vst1q_s16(d + 2 * dst_stride, d2);
- vst1q_s16(d + 3 * dst_stride, d3);
+ store_s16_8x4(d, dst_stride, d0, d1, d2, d3);
s += 8;
d += 8;
@@ -399,10 +387,7 @@
int16x4_t d0, d1, d2, d3;
do {
- s0 = vld1q_u8(src + 0 * src_stride);
- s1 = vld1q_u8(src + 1 * src_stride);
- s2 = vld1q_u8(src + 2 * src_stride);
- s3 = vld1q_u8(src + 3 * src_stride);
+ load_u8_16x4(src, src_stride, &s0, &s1, &s2, &s3);
t0 = convolve8_4_sdot(s0, x_filter, correction, range_limit, permute_tbl);
t1 = convolve8_4_sdot(s1, x_filter, correction, range_limit, permute_tbl);
@@ -414,10 +399,7 @@
d2 = vqrshl_s16(vmovn_s32(t2), shift_round_0);
d3 = vqrshl_s16(vmovn_s32(t3), shift_round_0);
- vst1_s16((dst_ptr + 0 * dst_stride), d0);
- vst1_s16((dst_ptr + 1 * dst_stride), d1);
- vst1_s16((dst_ptr + 2 * dst_stride), d2);
- vst1_s16((dst_ptr + 3 * dst_stride), d3);
+ store_s16_4x4(dst_ptr, dst_stride, d0, d1, d2, d3);
src += 4 * src_stride;
dst_ptr += 4 * dst_stride;
@@ -437,10 +419,7 @@
d = dst_ptr;
do {
- s0 = vld1q_u8(s + 0 * src_stride);
- s1 = vld1q_u8(s + 1 * src_stride);
- s2 = vld1q_u8(s + 2 * src_stride);
- s3 = vld1q_u8(s + 3 * src_stride);
+ load_u8_16x4(s, src_stride, &s0, &s1, &s2, &s3);
d0 = convolve8_8_sdot(s0, x_filter, correction, range_limit,
permute_tbl, shift_round_0);
@@ -451,10 +430,7 @@
d3 = convolve8_8_sdot(s3, x_filter, correction, range_limit,
permute_tbl, shift_round_0);
- vst1q_s16(d + 0 * dst_stride, d0);
- vst1q_s16(d + 1 * dst_stride, d1);
- vst1q_s16(d + 2 * dst_stride, d2);
- vst1q_s16(d + 3 * dst_stride, d3);
+ store_s16_8x4(d, dst_stride, d0, d1, d2, d3);
s += 8;
d += 8;
@@ -546,10 +522,7 @@
transpose_s16_4x4d(&d0, &d1, &d2, &d3);
- vst1_s16((dst_ptr + 0 * dst_stride), d0);
- vst1_s16((dst_ptr + 1 * dst_stride), d1);
- vst1_s16((dst_ptr + 2 * dst_stride), d2);
- vst1_s16((dst_ptr + 3 * dst_stride), d3);
+ store_s16_4x4(dst_ptr, dst_stride, d0, d1, d2, d3);
src += 4 * src_stride;
dst_ptr += 4 * dst_stride;
@@ -749,11 +722,7 @@
uint8x8_t d23_u8;
#endif
- s0 = vld1_s16(src_ptr + 0 * src_stride);
- s1 = vld1_s16(src_ptr + 1 * src_stride);
- s2 = vld1_s16(src_ptr + 2 * src_stride);
- s3 = vld1_s16(src_ptr + 3 * src_stride);
- s4 = vld1_s16(src_ptr + 4 * src_stride);
+ load_s16_4x5(src_ptr, src_stride, &s0, &s1, &s2, &s3, &s4);
src_ptr += 5 * src_stride;
do {
@@ -776,14 +745,11 @@
bck_offset, sub_const_vec, round_bits,
use_dist_wtd_comp_avg, &d01_u8, &d23_u8);
- vst1_lane_u32((uint32_t *)dst8_ptr, vreinterpret_u32_u8(d01_u8), 0);
- dst8_ptr += dst8_stride;
- vst1_lane_u32((uint32_t *)dst8_ptr, vreinterpret_u32_u8(d01_u8), 1);
- dst8_ptr += dst8_stride;
- vst1_lane_u32((uint32_t *)dst8_ptr, vreinterpret_u32_u8(d23_u8), 0);
- dst8_ptr += dst8_stride;
- vst1_lane_u32((uint32_t *)dst8_ptr, vreinterpret_u32_u8(d23_u8), 1);
- dst8_ptr += dst8_stride;
+ store_u8_4x1(dst8_ptr + 0 * dst8_stride, d01_u8, 0);
+ store_u8_4x1(dst8_ptr + 1 * dst8_stride, d01_u8, 1);
+ store_u8_4x1(dst8_ptr + 2 * dst8_stride, d23_u8, 0);
+ store_u8_4x1(dst8_ptr + 3 * dst8_stride, d23_u8, 1);
+ dst8_ptr += 4 * dst8_stride;
} else {
store_u16_4x4(dst_ptr, dst_stride, d0, d1, d2, d3);
}
@@ -793,7 +759,6 @@
s2 = s6;
s3 = s7;
s4 = s8;
-
src_ptr += 4 * src_stride;
dst_ptr += 4 * dst_stride;
h -= 4;
@@ -809,18 +774,17 @@
compute_avg_4x1(dd0, d0, fwd_offset, bck_offset, sub_const_vec,
round_bits, use_dist_wtd_comp_avg, &d01_u8);
- vst1_lane_u32((uint32_t *)dst8_ptr, vreinterpret_u32_u8(d01_u8), 0);
+ store_u8_4x1(dst8_ptr, d01_u8, 0);
dst8_ptr += dst8_stride;
-
} else {
vst1_u16(dst_ptr, d0);
}
+
s0 = s1;
s1 = s2;
s2 = s3;
s3 = s4;
s4 = s5;
-
src_ptr += src_stride;
dst_ptr += dst_stride;
h--;
@@ -844,11 +808,7 @@
uint8_t *d_u8 = dst8_ptr;
int height = h;
- s0 = vld1q_s16(s + 0 * src_stride);
- s1 = vld1q_s16(s + 1 * src_stride);
- s2 = vld1q_s16(s + 2 * src_stride);
- s3 = vld1q_s16(s + 3 * src_stride);
- s4 = vld1q_s16(s + 4 * src_stride);
+ load_s16_8x5(s, src_stride, &s0, &s1, &s2, &s3, &s4);
s += 5 * src_stride;
do {
@@ -872,14 +832,8 @@
use_dist_wtd_comp_avg, &d0_u8, &d1_u8, &d2_u8,
&d3_u8);
- vst1_u8(d_u8, d0_u8);
- d_u8 += dst8_stride;
- vst1_u8(d_u8, d1_u8);
- d_u8 += dst8_stride;
- vst1_u8(d_u8, d2_u8);
- d_u8 += dst8_stride;
- vst1_u8(d_u8, d3_u8);
- d_u8 += dst8_stride;
+ store_u8_8x4(d_u8, dst8_stride, d0_u8, d1_u8, d2_u8, d3_u8);
+ d_u8 += 4 * dst8_stride;
} else {
store_u16_8x4(d, dst_stride, d0, d1, d2, d3);
}
@@ -889,7 +843,6 @@
s2 = s6;
s3 = s7;
s4 = s8;
-
s += 4 * src_stride;
d += 4 * dst_stride;
height -= 4;
@@ -907,7 +860,6 @@
vst1_u8(d_u8, d0_u8);
d_u8 += dst8_stride;
-
} else {
vst1q_u16(d, d0);
}
@@ -965,7 +917,7 @@
uint8x8_t d23_u8;
#endif
- load_s16_4x8(src_ptr, src_stride, &s0, &s1, &s2, &s3, &s4, &s5, &s6, &s7);
+ load_s16_4x7(src_ptr, src_stride, &s0, &s1, &s2, &s3, &s4, &s5, &s6);
src_ptr += 7 * src_stride;
do {
@@ -988,14 +940,11 @@
bck_offset, sub_const_vec, round_bits,
use_dist_wtd_comp_avg, &d01_u8, &d23_u8);
- vst1_lane_u32((uint32_t *)dst8_ptr, vreinterpret_u32_u8(d01_u8), 0);
- dst8_ptr += dst8_stride;
- vst1_lane_u32((uint32_t *)dst8_ptr, vreinterpret_u32_u8(d01_u8), 1);
- dst8_ptr += dst8_stride;
- vst1_lane_u32((uint32_t *)dst8_ptr, vreinterpret_u32_u8(d23_u8), 0);
- dst8_ptr += dst8_stride;
- vst1_lane_u32((uint32_t *)dst8_ptr, vreinterpret_u32_u8(d23_u8), 1);
- dst8_ptr += dst8_stride;
+ store_u8_4x1(dst8_ptr + 0 * dst8_stride, d01_u8, 0);
+ store_u8_4x1(dst8_ptr + 1 * dst8_stride, d01_u8, 1);
+ store_u8_4x1(dst8_ptr + 2 * dst8_stride, d23_u8, 0);
+ store_u8_4x1(dst8_ptr + 3 * dst8_stride, d23_u8, 1);
+ dst8_ptr += 4 * dst8_stride;
} else {
store_u16_4x4(dst_ptr, dst_stride, d0, d1, d2, d3);
}
@@ -1007,7 +956,6 @@
s4 = s8;
s5 = s9;
s6 = s10;
-
src_ptr += 4 * src_stride;
dst_ptr += 4 * dst_stride;
h -= 4;
@@ -1023,12 +971,12 @@
compute_avg_4x1(dd0, d0, fwd_offset, bck_offset, sub_const_vec,
round_bits, use_dist_wtd_comp_avg, &d01_u8);
- vst1_lane_u32((uint32_t *)dst8_ptr, vreinterpret_u32_u8(d01_u8), 0);
+ store_u8_4x1(dst8_ptr, d01_u8, 0);
dst8_ptr += dst8_stride;
-
} else {
vst1_u16(dst_ptr, d0);
}
+
s0 = s1;
s1 = s2;
s2 = s3;
@@ -1036,7 +984,6 @@
s4 = s5;
s5 = s6;
s6 = s7;
-
src_ptr += src_stride;
dst_ptr += dst_stride;
h--;
@@ -1060,7 +1007,7 @@
uint8_t *d_u8 = dst8_ptr;
int height = h;
- load_s16_8x8(s, src_stride, &s0, &s1, &s2, &s3, &s4, &s5, &s6, &s7);
+ load_s16_8x7(s, src_stride, &s0, &s1, &s2, &s3, &s4, &s5, &s6);
s += 7 * src_stride;
do {
@@ -1084,14 +1031,8 @@
use_dist_wtd_comp_avg, &d0_u8, &d1_u8, &d2_u8,
&d3_u8);
- vst1_u8(d_u8, d0_u8);
- d_u8 += dst8_stride;
- vst1_u8(d_u8, d1_u8);
- d_u8 += dst8_stride;
- vst1_u8(d_u8, d2_u8);
- d_u8 += dst8_stride;
- vst1_u8(d_u8, d3_u8);
- d_u8 += dst8_stride;
+ store_u8_8x4(d_u8, dst8_stride, d0_u8, d1_u8, d2_u8, d3_u8);
+ d_u8 += 4 * dst8_stride;
} else {
store_u16_8x4(d, dst_stride, d0, d1, d2, d3);
}
@@ -1103,7 +1044,6 @@
s4 = s8;
s5 = s9;
s6 = s10;
-
s += 4 * src_stride;
d += 4 * dst_stride;
height -= 4;
@@ -1121,7 +1061,6 @@
vst1_u8(d_u8, d0_u8);
d_u8 += dst8_stride;
-
} else {
vst1q_u16(d, d0);
}
@@ -1133,7 +1072,6 @@
s4 = s5;
s5 = s6;
s6 = s7;
-
s += src_stride;
d += dst_stride;
height--;
@@ -1243,16 +1181,10 @@
conv_params->use_dist_wtd_comp_avg, &tmp_shift0,
&tmp_shift1, &tmp_shift2, &tmp_shift3);
- vst1_u8(dst8_1 + (0 * dst8_stride), tmp_shift0);
- vst1_u8(dst8_1 + (1 * dst8_stride), tmp_shift1);
- vst1_u8(dst8_1 + (2 * dst8_stride), tmp_shift2);
- vst1_u8(dst8_1 + (3 * dst8_stride), tmp_shift3);
-
+ store_u8_8x4(dst8_1, dst8_stride, tmp_shift0, tmp_shift1, tmp_shift2,
+ tmp_shift3);
} else {
- vst1q_u16(dst_1 + (0 * dst_stride), res_q0);
- vst1q_u16(dst_1 + (1 * dst_stride), res_q1);
- vst1q_u16(dst_1 + (2 * dst_stride), res_q2);
- vst1q_u16(dst_1 + (3 * dst_stride), res_q3);
+ store_u16_8x4(dst_1, dst_stride, res_q0, res_q1, res_q2, res_q3);
}
src1 = src1 + 8;
dst_1 = dst_1 + 8;
@@ -1286,22 +1218,12 @@
sub_const_vec, bits, conv_params->use_dist_wtd_comp_avg,
&tmp_shift0, &tmp_shift1);
- vst1_lane_u32((uint32_t *)(dst8_1), vreinterpret_u32_u8(tmp_shift0), 0);
- dst8_1 += dst8_stride;
- vst1_lane_u32((uint32_t *)(dst8_1), vreinterpret_u32_u8(tmp_shift0), 1);
- dst8_1 += dst8_stride;
- vst1_lane_u32((uint32_t *)(dst8_1), vreinterpret_u32_u8(tmp_shift1), 0);
- dst8_1 += dst8_stride;
- vst1_lane_u32((uint32_t *)(dst8_1), vreinterpret_u32_u8(tmp_shift1), 1);
-
+ store_u8_4x1(dst8_1 + 0 * dst8_stride, tmp_shift0, 0);
+ store_u8_4x1(dst8_1 + 1 * dst8_stride, tmp_shift0, 1);
+ store_u8_4x1(dst8_1 + 2 * dst8_stride, tmp_shift1, 0);
+ store_u8_4x1(dst8_1 + 3 * dst8_stride, tmp_shift1, 1);
} else {
- vst1_u16(dst_1, res4);
- dst_1 += dst_stride;
- vst1_u16(dst_1, res5);
- dst_1 += dst_stride;
- vst1_u16(dst_1, res6);
- dst_1 += dst_stride;
- vst1_u16(dst_1, res7);
+ store_u16_4x4(dst_1, dst_stride, res4, res5, res6, res7);
}
src += src_stride * 4;
dst += dst_stride * 4;
@@ -1361,10 +1283,7 @@
uint16x4_t dd0, dd1, dd2, dd3;
uint8x8_t d01_u8, d23_u8;
- s0 = vld1q_u8(src_ptr + 0 * src_stride);
- s1 = vld1q_u8(src_ptr + 1 * src_stride);
- s2 = vld1q_u8(src_ptr + 2 * src_stride);
- s3 = vld1q_u8(src_ptr + 3 * src_stride);
+ load_u8_16x4(src_ptr, src_stride, &s0, &s1, &s2, &s3);
d0 = convolve8_4_usdot(s0, x_filter, permute_tbl, vdupq_n_s32(0));
d1 = convolve8_4_usdot(s1, x_filter, permute_tbl, vdupq_n_s32(0));
@@ -1384,14 +1303,7 @@
d23 = vaddq_s16(d23, round_offset128);
if (conv_params->do_average) {
- dd0 = vld1_u16(dst_ptr);
- dst_ptr += dst_stride;
- dd1 = vld1_u16(dst_ptr);
- dst_ptr += dst_stride;
- dd2 = vld1_u16(dst_ptr);
- dst_ptr += dst_stride;
- dd3 = vld1_u16(dst_ptr);
- dst_ptr += dst_stride;
+ load_u16_4x4(dst_ptr, dst_stride, &dd0, &dd1, &dd2, &dd3);
compute_avg_4x4(dd0, dd1, dd2, dd3,
vreinterpret_u16_s16(vget_low_s16(d01)),
@@ -1401,26 +1313,21 @@
bck_offset, round_offset64, round_bits,
use_dist_wtd_comp_avg, &d01_u8, &d23_u8);
- vst1_lane_u32((uint32_t *)dst_u8_ptr, vreinterpret_u32_u8(d01_u8), 0);
- dst_u8_ptr += dst8_stride;
- vst1_lane_u32((uint32_t *)dst_u8_ptr, vreinterpret_u32_u8(d01_u8), 1);
- dst_u8_ptr += dst8_stride;
- vst1_lane_u32((uint32_t *)dst_u8_ptr, vreinterpret_u32_u8(d23_u8), 0);
- dst_u8_ptr += dst8_stride;
- vst1_lane_u32((uint32_t *)dst_u8_ptr, vreinterpret_u32_u8(d23_u8), 1);
- dst_u8_ptr += dst8_stride;
+ store_u8_4x1(dst_u8_ptr + 0 * dst8_stride, d01_u8, 0);
+ store_u8_4x1(dst_u8_ptr + 1 * dst8_stride, d01_u8, 1);
+ store_u8_4x1(dst_u8_ptr + 2 * dst8_stride, d23_u8, 0);
+ store_u8_4x1(dst_u8_ptr + 3 * dst8_stride, d23_u8, 1);
} else {
- vst1q_lane_u64((uint64_t *)dst_ptr, vreinterpretq_u64_s16(d01), 0);
- dst_ptr += dst_stride;
- vst1q_lane_u64((uint64_t *)dst_ptr, vreinterpretq_u64_s16(d01), 1);
- dst_ptr += dst_stride;
- vst1q_lane_u64((uint64_t *)dst_ptr, vreinterpretq_u64_s16(d23), 0);
- dst_ptr += dst_stride;
- vst1q_lane_u64((uint64_t *)dst_ptr, vreinterpretq_u64_s16(d23), 1);
- dst_ptr += dst_stride;
+ store_u16_4x4(dst_ptr, dst_stride,
+ vreinterpret_u16_s16(vget_low_s16(d01)),
+ vreinterpret_u16_s16(vget_high_s16(d01)),
+ vreinterpret_u16_s16(vget_low_s16(d23)),
+ vreinterpret_u16_s16(vget_high_s16(d23)));
}
src_ptr += 4 * src_stride;
+ dst_ptr += 4 * dst_stride;
+ dst_u8_ptr += 4 * dst8_stride;
height -= 4;
} while (height > 0);
} else {
@@ -1438,10 +1345,7 @@
uint16x8_t dd0, dd1, dd2, dd3;
uint8x8_t d0_u8, d1_u8, d2_u8, d3_u8;
- s0 = vld1q_u8(s + 0 * src_stride);
- s1 = vld1q_u8(s + 1 * src_stride);
- s2 = vld1q_u8(s + 2 * src_stride);
- s3 = vld1q_u8(s + 3 * src_stride);
+ load_u8_16x4(s, src_stride, &s0, &s1, &s2, &s3);
d0 = convolve8_8_usdot(s0, x_filter, permute_tbl, vdupq_n_s32(0),
shift_round_0);
@@ -1547,10 +1451,7 @@
uint16x4_t dd0, dd1, dd2, dd3;
uint8x8_t d01_u8, d23_u8;
- s0 = vld1q_u8(src_ptr + 0 * src_stride);
- s1 = vld1q_u8(src_ptr + 1 * src_stride);
- s2 = vld1q_u8(src_ptr + 2 * src_stride);
- s3 = vld1q_u8(src_ptr + 3 * src_stride);
+ load_u8_16x4(src_ptr, src_stride, &s0, &s1, &s2, &s3);
d0 = convolve8_4_sdot(s0, x_filter, correction, range_limit, permute_tbl);
d1 = convolve8_4_sdot(s1, x_filter, correction, range_limit, permute_tbl);
@@ -1570,14 +1471,7 @@
d23 = vaddq_s16(d23, round_offset128);
if (conv_params->do_average) {
- dd0 = vld1_u16(dst_ptr);
- dst_ptr += dst_stride;
- dd1 = vld1_u16(dst_ptr);
- dst_ptr += dst_stride;
- dd2 = vld1_u16(dst_ptr);
- dst_ptr += dst_stride;
- dd3 = vld1_u16(dst_ptr);
- dst_ptr += dst_stride;
+ load_u16_4x4(dst_ptr, dst_stride, &dd0, &dd1, &dd2, &dd3);
compute_avg_4x4(dd0, dd1, dd2, dd3,
vreinterpret_u16_s16(vget_low_s16(d01)),
@@ -1587,26 +1481,21 @@
bck_offset, round_offset64, round_bits,
use_dist_wtd_comp_avg, &d01_u8, &d23_u8);
- vst1_lane_u32((uint32_t *)dst_u8_ptr, vreinterpret_u32_u8(d01_u8), 0);
- dst_u8_ptr += dst8_stride;
- vst1_lane_u32((uint32_t *)dst_u8_ptr, vreinterpret_u32_u8(d01_u8), 1);
- dst_u8_ptr += dst8_stride;
- vst1_lane_u32((uint32_t *)dst_u8_ptr, vreinterpret_u32_u8(d23_u8), 0);
- dst_u8_ptr += dst8_stride;
- vst1_lane_u32((uint32_t *)dst_u8_ptr, vreinterpret_u32_u8(d23_u8), 1);
- dst_u8_ptr += dst8_stride;
+ store_u8_4x1(dst_u8_ptr + 0 * dst8_stride, d01_u8, 0);
+ store_u8_4x1(dst_u8_ptr + 1 * dst8_stride, d01_u8, 1);
+ store_u8_4x1(dst_u8_ptr + 2 * dst8_stride, d23_u8, 0);
+ store_u8_4x1(dst_u8_ptr + 3 * dst8_stride, d23_u8, 1);
} else {
- vst1q_lane_u64((uint64_t *)dst_ptr, vreinterpretq_u64_s16(d01), 0);
- dst_ptr += dst_stride;
- vst1q_lane_u64((uint64_t *)dst_ptr, vreinterpretq_u64_s16(d01), 1);
- dst_ptr += dst_stride;
- vst1q_lane_u64((uint64_t *)dst_ptr, vreinterpretq_u64_s16(d23), 0);
- dst_ptr += dst_stride;
- vst1q_lane_u64((uint64_t *)dst_ptr, vreinterpretq_u64_s16(d23), 1);
- dst_ptr += dst_stride;
+ store_u16_4x4(dst_ptr, dst_stride,
+ vreinterpret_u16_s16(vget_low_s16(d01)),
+ vreinterpret_u16_s16(vget_high_s16(d01)),
+ vreinterpret_u16_s16(vget_low_s16(d23)),
+ vreinterpret_u16_s16(vget_high_s16(d23)));
}
src_ptr += 4 * src_stride;
+ dst_ptr += 4 * dst_stride;
+ dst_u8_ptr += 4 * dst8_stride;
height -= 4;
} while (height > 0);
} else {
@@ -1624,10 +1513,7 @@
uint16x8_t dd0, dd1, dd2, dd3;
uint8x8_t d0_u8, d1_u8, d2_u8, d3_u8;
- s0 = vld1q_u8(s + 0 * src_stride);
- s1 = vld1q_u8(s + 1 * src_stride);
- s2 = vld1q_u8(s + 2 * src_stride);
- s3 = vld1q_u8(s + 3 * src_stride);
+ load_u8_16x4(s, src_stride, &s0, &s1, &s2, &s3);
d0 = convolve8_8_sdot(s0, x_filter, correction, range_limit,
permute_tbl, shift_round_0);
@@ -1825,17 +1711,10 @@
round_offset_vec, round_bits, use_dist_wtd_comp_avg,
&t0, &t1);
- vst1_lane_u32((uint32_t *)d_u8, vreinterpret_u32_u8(t0),
- 0); // 00 01 02 03
- vst1_lane_u32((uint32_t *)(d_u8 + dst8_stride),
- vreinterpret_u32_u8(t0),
- 1); // 10 11 12 13
- vst1_lane_u32((uint32_t *)(d_u8 + 2 * dst8_stride),
- vreinterpret_u32_u8(t1),
- 0); // 20 21 22 23
- vst1_lane_u32((uint32_t *)(d_u8 + 3 * dst8_stride),
- vreinterpret_u32_u8(t1),
- 1); // 30 31 32 33
+ store_u8_4x1(d_u8 + 0 * dst8_stride, t0, 0);
+ store_u8_4x1(d_u8 + 1 * dst8_stride, t0, 1);
+ store_u8_4x1(d_u8 + 2 * dst8_stride, t1, 0);
+ store_u8_4x1(d_u8 + 3 * dst8_stride, t1, 1);
} else {
store_u16_4x4(d, dst_stride, vreinterpret_u16_s16(d0),
vreinterpret_u16_s16(d1), vreinterpret_u16_s16(d2),
@@ -1849,15 +1728,14 @@
s4 = s8;
s5 = s9;
s6 = s10;
-
s += 4;
- width -= 4;
d += 4;
d_u8 += 4;
+ width -= 4;
} while (width > 0);
- src_ptr += (src_stride << 2);
- dst_ptr += (dst_stride << 2);
- dst_u8_ptr += (dst8_stride << 2);
+ src_ptr += 4 * src_stride;
+ dst_ptr += 4 * dst_stride;
+ dst_u8_ptr += 4 * dst8_stride;
height -= 4;
#else
t0 = vld1_u8(s); // a0 a1 a2 a3 a4 a5 a6 a7
@@ -1896,20 +1774,19 @@
bck_offset, round_offset_vec, round_bits,
use_dist_wtd_comp_avg, &t0);
- vst1_lane_u32((uint32_t *)d_u8, vreinterpret_u32_u8(t0),
- 0); // 00 01 02 03
+ store_u8_4x1(d_u8, t0, 0);
} else {
vst1_u16(d, vreinterpret_u16_s16(d0));
}
s += 4;
- width -= 4;
d += 4;
d_u8 += 4;
+ width -= 4;
} while (width > 0);
- src_ptr += (src_stride);
- dst_ptr += (dst_stride);
- dst_u8_ptr += (dst8_stride);
+ src_ptr += src_stride;
+ dst_ptr += dst_stride;
+ dst_u8_ptr += dst8_stride;
height--;
#endif
} while (height > 0);
@@ -2020,7 +1897,7 @@
if (conv_params->do_average) {
load_u16_8x4(d_tmp, dst_stride, &res8, &res9, &res10, &res11);
- d_tmp += (dst_stride << 2);
+ d_tmp += 4 * dst_stride;
compute_avg_8x4(res8, res9, res10, res11, vreinterpretq_u16_s16(res0),
vreinterpretq_u16_s16(res1),
@@ -2030,10 +1907,10 @@
&t0, &t1, &t2, &t3);
store_u8_8x4(d_u8, dst8_stride, t0, t1, t2, t3);
- d_u8 += (dst8_stride << 2);
+ d_u8 += 4 * dst8_stride;
load_u16_8x4(d_tmp, dst_stride, &res8, &res9, &res10, &res11);
- d_tmp += (dst_stride << 2);
+ d_tmp += 4 * dst_stride;
compute_avg_8x4(res8, res9, res10, res11, vreinterpretq_u16_s16(res4),
vreinterpretq_u16_s16(res5),
@@ -2043,7 +1920,7 @@
&t0, &t1, &t2, &t3);
store_u8_8x4(d_u8, dst8_stride, t0, t1, t2, t3);
- d_u8 += (dst8_stride << 2);
+ d_u8 += 4 * dst8_stride;
} else {
store_u16_8x8(
d_tmp, dst_stride, vreinterpretq_u16_s16(res0),
@@ -2051,7 +1928,7 @@
vreinterpretq_u16_s16(res3), vreinterpretq_u16_s16(res4),
vreinterpretq_u16_s16(res5), vreinterpretq_u16_s16(res6),
vreinterpretq_u16_s16(res7));
- d_tmp += (dst_stride << 3);
+ d_tmp += 8 * dst_stride;
}
s0 = s8;
@@ -2063,8 +1940,8 @@
s6 = s14;
s += 8;
d += 8;
- width -= 8;
d_u8_tmp += 8;
+ width -= 8;
} while (width > 0);
src_ptr += 8 * src_stride;
dst_ptr += 8 * dst_stride;
@@ -2108,17 +1985,17 @@
if (conv_params->do_average) {
res8 = vld1q_u16(d_tmp);
- d_tmp += (dst_stride);
+ d_tmp += dst_stride;
compute_avg_8x1(res8, vreinterpretq_u16_s16(res0), fwd_offset,
bck_offset, round_offset64, round_bits,
use_dist_wtd_comp_avg, &t0);
vst1_u8(d_u8, t0);
- d_u8 += (dst8_stride);
+ d_u8 += dst8_stride;
} else {
vst1q_u16(d_tmp, vreinterpretq_u16_s16(res0));
- d_tmp += (dst_stride);
+ d_tmp += dst_stride;
}
s += 8;
@@ -2233,7 +2110,7 @@
__builtin_prefetch(d + 2 * dst_stride);
__builtin_prefetch(d + 3 * dst_stride);
- s += (7 * src_stride);
+ s += 7 * src_stride;
do {
#if defined(__aarch64__)
load_unaligned_u8_4x4(s, src_stride, &tu0, &tu1);
@@ -2271,7 +2148,6 @@
__builtin_prefetch(d_u8 + 3 * dst8_stride);
load_u16_4x4(d, dst_stride, &res4, &res5, &res6, &res7);
- d += (dst_stride << 2);
compute_avg_4x4(res4, res5, res6, res7, vreinterpret_u16_s16(d0),
vreinterpret_u16_s16(d1), vreinterpret_u16_s16(d2),
@@ -2279,19 +2155,14 @@
round_offset64, round_bits, use_dist_wtd_comp_avg,
&t0, &t1);
- vst1_lane_u32((uint32_t *)d_u8, vreinterpret_u32_u8(t0), 0);
- d_u8 += dst8_stride;
- vst1_lane_u32((uint32_t *)d_u8, vreinterpret_u32_u8(t0), 1);
- d_u8 += dst8_stride;
- vst1_lane_u32((uint32_t *)d_u8, vreinterpret_u32_u8(t1), 0);
- d_u8 += dst8_stride;
- vst1_lane_u32((uint32_t *)d_u8, vreinterpret_u32_u8(t1), 1);
- d_u8 += dst8_stride;
+ store_u8_4x1(d_u8 + 0 * dst8_stride, t0, 0);
+ store_u8_4x1(d_u8 + 1 * dst8_stride, t0, 1);
+ store_u8_4x1(d_u8 + 2 * dst8_stride, t1, 0);
+ store_u8_4x1(d_u8 + 3 * dst8_stride, t1, 1);
} else {
store_u16_4x4(d, dst_stride, vreinterpret_u16_s16(d0),
vreinterpret_u16_s16(d1), vreinterpret_u16_s16(d2),
vreinterpret_u16_s16(d3));
- d += (dst_stride << 2);
}
s0 = s4;
@@ -2301,8 +2172,9 @@
s4 = s8;
s5 = s9;
s6 = s10;
-
- s += (src_stride << 2);
+ s += 4 * src_stride;
+ d += 4 * dst_stride;
+ d_u8 += 4 * dst8_stride;
height -= 4;
#else
load_unaligned_u8_4x1(s, src_stride, &tu0);
@@ -2318,17 +2190,14 @@
__builtin_prefetch(d);
res4 = vld1_u16(d);
- d += (dst_stride);
compute_avg_4x1(res4, vreinterpret_u16_s16(d0), fwd_offset,
bck_offset, round_offset64, round_bits,
use_dist_wtd_comp_avg, &t0);
- vst1_lane_u32((uint32_t *)d_u8, vreinterpret_u32_u8(t0), 0);
- d_u8 += dst8_stride;
+ store_u8_4x1(d_u8, t0, 0);
} else {
vst1_u16(d, vreinterpret_u16_s16(d0));
- d += (dst_stride);
}
s0 = s1;
@@ -2338,8 +2207,9 @@
s4 = s5;
s5 = s6;
s6 = s7;
-
- s += (src_stride);
+ s += src_stride;
+ d += dst_stride;
+ d_u8 += dst8_stride;
height--;
#endif
} while (height > 0);
@@ -2353,7 +2223,7 @@
int16x8_t s0, s1, s2, s3, s4, s5, s6, s7;
int16x8_t res0;
uint16x8_t res8;
- uint8x8_t t0, t1, t2, t3, t4, t5, t6, t7;
+ uint8x8_t t0, t1, t2, t3, t4, t5, t6;
const int16x8_t round_offset128 = vdupq_n_s16(round_offset);
const int16x8_t shift_vec = vdupq_n_s16(-shift_value);
const int16x4_t round_offset64 = vdup_n_s16(round_offset);
@@ -2361,7 +2231,8 @@
#if defined(__aarch64__)
int16x8_t s8, s9, s10, s11, s12, s13, s14;
int16x8_t res1, res2, res3, res4, res5, res6, res7;
- uint16x8_t res10, res11, res9;
+ uint16x8_t res9, res10, res11;
+ uint8x8_t t7;
#endif
dst_ptr = dst;
dst_u8_ptr = dst8;
@@ -2374,7 +2245,7 @@
__builtin_prefetch(src_ptr + 5 * src_stride);
__builtin_prefetch(src_ptr + 6 * src_stride);
__builtin_prefetch(src_ptr + 7 * src_stride);
- load_u8_8x8(src_ptr, src_stride, &t0, &t1, &t2, &t3, &t4, &t5, &t6, &t7);
+ load_u8_8x7(src_ptr, src_stride, &t0, &t1, &t2, &t3, &t4, &t5, &t6);
s0 = vreinterpretq_s16_u16(vmovl_u8(t0));
s1 = vreinterpretq_s16_u16(vmovl_u8(t1));
@@ -2439,7 +2310,7 @@
__builtin_prefetch(d_tmp + 3 * dst8_stride);
load_u16_8x4(d_tmp, dst_stride, &res8, &res9, &res10, &res11);
- d_tmp += (dst_stride << 2);
+ d_tmp += 4 * dst_stride;
compute_avg_8x4(res8, res9, res10, res11, vreinterpretq_u16_s16(res0),
vreinterpretq_u16_s16(res1),
@@ -2449,10 +2320,10 @@
&t0, &t1, &t2, &t3);
store_u8_8x4(d_u8, dst8_stride, t0, t1, t2, t3);
- d_u8 += (dst8_stride << 2);
+ d_u8 += 4 * dst8_stride;
load_u16_8x4(d_tmp, dst_stride, &res8, &res9, &res10, &res11);
- d_tmp += (dst_stride << 2);
+ d_tmp += 4 * dst_stride;
compute_avg_8x4(res8, res9, res10, res11, vreinterpretq_u16_s16(res4),
vreinterpretq_u16_s16(res5),
@@ -2462,7 +2333,7 @@
&t0, &t1, &t2, &t3);
store_u8_8x4(d_u8, dst8_stride, t0, t1, t2, t3);
- d_u8 += (dst8_stride << 2);
+ d_u8 += 4 * dst8_stride;
} else {
store_u16_8x8(
d_tmp, dst_stride, vreinterpretq_u16_s16(res0),
@@ -2470,7 +2341,7 @@
vreinterpretq_u16_s16(res3), vreinterpretq_u16_s16(res4),
vreinterpretq_u16_s16(res5), vreinterpretq_u16_s16(res6),
vreinterpretq_u16_s16(res7));
- d_tmp += (dst_stride << 3);
+ d_tmp += 8 * dst_stride;
}
s0 = s8;
@@ -2480,7 +2351,7 @@
s4 = s12;
s5 = s13;
s6 = s14;
- s += (8 * src_stride);
+ s += 8 * src_stride;
height -= 8;
#else
s7 = vreinterpretq_s16_u16(vmovl_u8(vld1_u8(s)));
@@ -2503,20 +2374,20 @@
__builtin_prefetch(d_tmp);
res8 = vld1q_u16(d_tmp);
- d_tmp += (dst_stride);
+ d_tmp += dst_stride;
compute_avg_8x1(res8, vreinterpretq_u16_s16(res0), fwd_offset,
bck_offset, round_offset64, round_bits,
use_dist_wtd_comp_avg, &t0);
vst1_u8(d_u8, t0);
- d_u8 += (dst8_stride);
+ d_u8 += dst8_stride;
} else {
vst1q_u16(d_tmp, vreinterpretq_u16_s16(res0));
d_tmp += dst_stride;
}
- s += (src_stride);
+ s += src_stride;
height--;
#endif
} while (height > 0);
diff --git a/av1/common/arm/wiener_convolve_neon.c b/av1/common/arm/wiener_convolve_neon.c
index 0a12c88..1d36f68 100644
--- a/av1/common/arm/wiener_convolve_neon.c
+++ b/av1/common/arm/wiener_convolve_neon.c
@@ -248,21 +248,11 @@
int16x8_t s0, s1, s2, s3, s4, s5, s6, s7;
uint8x8_t t0;
s = src_tmp_ptr;
- s0 = vld1q_s16(s);
- s += src_stride;
- s1 = vld1q_s16(s);
- s += src_stride;
- s2 = vld1q_s16(s);
- s += src_stride;
- s3 = vld1q_s16(s);
- s += src_stride;
- s4 = vld1q_s16(s);
- s += src_stride;
- s5 = vld1q_s16(s);
- s += src_stride;
- s6 = vld1q_s16(s);
- s += src_stride;
d = dst_tmp_ptr;
+
+ load_s16_8x7(s, src_stride, &s0, &s1, &s2, &s3, &s4, &s5, &s6);
+ s += 7 * src_stride;
+
height = h;
do {
@@ -273,14 +263,7 @@
__builtin_prefetch(dst_tmp_ptr + 2 * dst_stride);
__builtin_prefetch(dst_tmp_ptr + 3 * dst_stride);
- s7 = vld1q_s16(s);
- s += src_stride;
- s8 = vld1q_s16(s);
- s += src_stride;
- s9 = vld1q_s16(s);
- s += src_stride;
- s10 = vld1q_s16(s);
- s += src_stride;
+ load_s16_8x4(s, src_stride, &s7, &s8, &s9, &s10);
t0 = wiener_convolve8_vert_4x8(s0, s1, s2, s3, s4, s5, s6, filter_y_tmp,
bd, conv_params->round_1);
@@ -291,14 +274,7 @@
t3 = wiener_convolve8_vert_4x8(s3, s4, s5, s6, s7, s8, s9, filter_y_tmp,
bd, conv_params->round_1);
- vst1_u8(d, t0);
- d += dst_stride;
- vst1_u8(d, t1);
- d += dst_stride;
- vst1_u8(d, t2);
- d += dst_stride;
- vst1_u8(d, t3);
- d += dst_stride;
+ store_u8_8x4(d, dst_stride, t0, t1, t2, t3);
s0 = s4;
s1 = s5;
@@ -307,6 +283,8 @@
s4 = s8;
s5 = s9;
s6 = s10;
+ s += 4 * src_stride;
+ d += 4 * dst_stride;
height -= 4;
} while (height > 3);
@@ -336,21 +314,11 @@
uint8x8_t t0;
int16x8_t s0, s1, s2, s3, s4, s5, s6, s7;
s = src_tmp_ptr;
- s0 = vld1q_s16(s);
- s += src_stride;
- s1 = vld1q_s16(s);
- s += src_stride;
- s2 = vld1q_s16(s);
- s += src_stride;
- s3 = vld1q_s16(s);
- s += src_stride;
- s4 = vld1q_s16(s);
- s += src_stride;
- s5 = vld1q_s16(s);
- s += src_stride;
- s6 = vld1q_s16(s);
- s += src_stride;
d = dst_tmp_ptr;
+
+ load_s16_8x7(s, src_stride, &s0, &s1, &s2, &s3, &s4, &s5, &s6);
+ s += 7 * src_stride;
+
height = h;
PROCESS_ROW_FOR_VERTICAL_FILTER