1da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian/*
2da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian *  Copyright (c) 2014 The WebM project authors. All Rights Reserved.
3da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian *
4da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian *  Use of this source code is governed by a BSD-style license
5da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian *  that can be found in the LICENSE file in the root of the source
6da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian *  tree. An additional intellectual property rights grant can be found
7da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian *  in the file PATENTS.  All contributing project authors may
8da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian *  be found in the AUTHORS file in the root of the source tree.
9da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian */
10da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
11da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include <arm_neon.h>
12da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "./vpx_config.h"
13da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "vpx_ports/arm.h"
14da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
15da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#ifdef VPX_INCOMPATIBLE_GCC
16da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianstatic INLINE void write_2x4(unsigned char *dst, int pitch,
17da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                             const uint8x8x2_t result) {
187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /*
197bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * uint8x8x2_t result
207bc9febe8749e98a3812a0dc4380ceae75c29450Johann  00 01 02 03 | 04 05 06 07
217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  10 11 12 13 | 14 15 16 17
227bc9febe8749e98a3812a0dc4380ceae75c29450Johann  ---
237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  * after vtrn_u8
247bc9febe8749e98a3812a0dc4380ceae75c29450Johann  00 10 02 12 | 04 14 06 16
257bc9febe8749e98a3812a0dc4380ceae75c29450Johann  01 11 03 13 | 05 15 07 17
267bc9febe8749e98a3812a0dc4380ceae75c29450Johann  */
277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const uint8x8x2_t r01_u8 = vtrn_u8(result.val[0], result.val[1]);
287bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const uint16x4_t x_0_4 = vreinterpret_u16_u8(r01_u8.val[0]);
297bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const uint16x4_t x_1_5 = vreinterpret_u16_u8(r01_u8.val[1]);
307bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vst1_lane_u16((uint16_t *)dst, x_0_4, 0);
317bc9febe8749e98a3812a0dc4380ceae75c29450Johann  dst += pitch;
327bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vst1_lane_u16((uint16_t *)dst, x_1_5, 0);
337bc9febe8749e98a3812a0dc4380ceae75c29450Johann  dst += pitch;
347bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vst1_lane_u16((uint16_t *)dst, x_0_4, 1);
357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  dst += pitch;
367bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vst1_lane_u16((uint16_t *)dst, x_1_5, 1);
377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  dst += pitch;
387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vst1_lane_u16((uint16_t *)dst, x_0_4, 2);
397bc9febe8749e98a3812a0dc4380ceae75c29450Johann  dst += pitch;
407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vst1_lane_u16((uint16_t *)dst, x_1_5, 2);
417bc9febe8749e98a3812a0dc4380ceae75c29450Johann  dst += pitch;
427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vst1_lane_u16((uint16_t *)dst, x_0_4, 3);
437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  dst += pitch;
447bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vst1_lane_u16((uint16_t *)dst, x_1_5, 3);
45da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
46da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
47da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianstatic INLINE void write_2x8(unsigned char *dst, int pitch,
48da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                             const uint8x8x2_t result,
49da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                             const uint8x8x2_t result2) {
50da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  write_2x4(dst, pitch, result);
51da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  dst += pitch * 8;
52da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  write_2x4(dst, pitch, result2);
53da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
54da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#else
55da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianstatic INLINE void write_2x8(unsigned char *dst, int pitch,
56da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                             const uint8x8x2_t result,
57da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                             const uint8x8x2_t result2) {
58da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vst2_lane_u8(dst, result, 0);
59da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  dst += pitch;
60da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vst2_lane_u8(dst, result, 1);
61da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  dst += pitch;
62da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vst2_lane_u8(dst, result, 2);
63da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  dst += pitch;
64da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vst2_lane_u8(dst, result, 3);
65da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  dst += pitch;
66da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vst2_lane_u8(dst, result, 4);
67da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  dst += pitch;
68da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vst2_lane_u8(dst, result, 5);
69da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  dst += pitch;
70da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vst2_lane_u8(dst, result, 6);
71da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  dst += pitch;
72da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vst2_lane_u8(dst, result, 7);
73da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  dst += pitch;
74da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
75da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vst2_lane_u8(dst, result2, 0);
76da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  dst += pitch;
77da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vst2_lane_u8(dst, result2, 1);
78da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  dst += pitch;
79da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vst2_lane_u8(dst, result2, 2);
80da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  dst += pitch;
81da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vst2_lane_u8(dst, result2, 3);
82da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  dst += pitch;
83da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vst2_lane_u8(dst, result2, 4);
84da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  dst += pitch;
85da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vst2_lane_u8(dst, result2, 5);
86da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  dst += pitch;
87da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vst2_lane_u8(dst, result2, 6);
88da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  dst += pitch;
89da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vst2_lane_u8(dst, result2, 7);
90da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
91da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif  // VPX_INCOMPATIBLE_GCC
92da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
93da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#ifdef VPX_INCOMPATIBLE_GCC
947bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic INLINE uint8x8x4_t read_4x8(unsigned char *src, int pitch) {
957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  uint8x8x4_t x;
967bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const uint8x8_t a = vld1_u8(src);
977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const uint8x8_t b = vld1_u8(src + pitch * 1);
987bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const uint8x8_t c = vld1_u8(src + pitch * 2);
997bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const uint8x8_t d = vld1_u8(src + pitch * 3);
1007bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const uint8x8_t e = vld1_u8(src + pitch * 4);
1017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const uint8x8_t f = vld1_u8(src + pitch * 5);
1027bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const uint8x8_t g = vld1_u8(src + pitch * 6);
1037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const uint8x8_t h = vld1_u8(src + pitch * 7);
1047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const uint32x2x2_t r04_u32 =
1057bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vtrn_u32(vreinterpret_u32_u8(a), vreinterpret_u32_u8(e));
1067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const uint32x2x2_t r15_u32 =
1077bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vtrn_u32(vreinterpret_u32_u8(b), vreinterpret_u32_u8(f));
1087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const uint32x2x2_t r26_u32 =
1097bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vtrn_u32(vreinterpret_u32_u8(c), vreinterpret_u32_u8(g));
1107bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const uint32x2x2_t r37_u32 =
1117bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vtrn_u32(vreinterpret_u32_u8(d), vreinterpret_u32_u8(h));
1127bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const uint16x4x2_t r02_u16 = vtrn_u16(vreinterpret_u16_u32(r04_u32.val[0]),
1137bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                        vreinterpret_u16_u32(r26_u32.val[0]));
1147bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const uint16x4x2_t r13_u16 = vtrn_u16(vreinterpret_u16_u32(r15_u32.val[0]),
1157bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                        vreinterpret_u16_u32(r37_u32.val[0]));
1167bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const uint8x8x2_t r01_u8 = vtrn_u8(vreinterpret_u8_u16(r02_u16.val[0]),
1177bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                     vreinterpret_u8_u16(r13_u16.val[0]));
1187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const uint8x8x2_t r23_u8 = vtrn_u8(vreinterpret_u8_u16(r02_u16.val[1]),
1197bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                     vreinterpret_u8_u16(r13_u16.val[1]));
1207bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /*
1217bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * after vtrn_u32
1227bc9febe8749e98a3812a0dc4380ceae75c29450Johann  00 01 02 03 | 40 41 42 43
1237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  10 11 12 13 | 50 51 52 53
1247bc9febe8749e98a3812a0dc4380ceae75c29450Johann  20 21 22 23 | 60 61 62 63
1257bc9febe8749e98a3812a0dc4380ceae75c29450Johann  30 31 32 33 | 70 71 72 73
1267bc9febe8749e98a3812a0dc4380ceae75c29450Johann  ---
1277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  * after vtrn_u16
1287bc9febe8749e98a3812a0dc4380ceae75c29450Johann  00 01 20 21 | 40 41 60 61
1297bc9febe8749e98a3812a0dc4380ceae75c29450Johann  02 03 22 23 | 42 43 62 63
1307bc9febe8749e98a3812a0dc4380ceae75c29450Johann  10 11 30 31 | 50 51 70 71
1317bc9febe8749e98a3812a0dc4380ceae75c29450Johann  12 13 32 33 | 52 52 72 73
132da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
1337bc9febe8749e98a3812a0dc4380ceae75c29450Johann  00 01 20 21 | 40 41 60 61
1347bc9febe8749e98a3812a0dc4380ceae75c29450Johann  10 11 30 31 | 50 51 70 71
1357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  02 03 22 23 | 42 43 62 63
1367bc9febe8749e98a3812a0dc4380ceae75c29450Johann  12 13 32 33 | 52 52 72 73
1377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  ---
1387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  * after vtrn_u8
1397bc9febe8749e98a3812a0dc4380ceae75c29450Johann  00 10 20 30 | 40 50 60 70
1407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  01 11 21 31 | 41 51 61 71
1417bc9febe8749e98a3812a0dc4380ceae75c29450Johann  02 12 22 32 | 42 52 62 72
1427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  03 13 23 33 | 43 53 63 73
1437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  */
1447bc9febe8749e98a3812a0dc4380ceae75c29450Johann  x.val[0] = r01_u8.val[0];
1457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  x.val[1] = r01_u8.val[1];
1467bc9febe8749e98a3812a0dc4380ceae75c29450Johann  x.val[2] = r23_u8.val[0];
1477bc9febe8749e98a3812a0dc4380ceae75c29450Johann  x.val[3] = r23_u8.val[1];
148da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
1497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return x;
150da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
151da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#else
1527bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic INLINE uint8x8x4_t read_4x8(unsigned char *src, int pitch) {
1537bc9febe8749e98a3812a0dc4380ceae75c29450Johann  uint8x8x4_t x;
1547bc9febe8749e98a3812a0dc4380ceae75c29450Johann  x.val[0] = x.val[1] = x.val[2] = x.val[3] = vdup_n_u8(0);
1557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  x = vld4_lane_u8(src, x, 0);
1567bc9febe8749e98a3812a0dc4380ceae75c29450Johann  src += pitch;
1577bc9febe8749e98a3812a0dc4380ceae75c29450Johann  x = vld4_lane_u8(src, x, 1);
1587bc9febe8749e98a3812a0dc4380ceae75c29450Johann  src += pitch;
1597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  x = vld4_lane_u8(src, x, 2);
1607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  src += pitch;
1617bc9febe8749e98a3812a0dc4380ceae75c29450Johann  x = vld4_lane_u8(src, x, 3);
1627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  src += pitch;
1637bc9febe8749e98a3812a0dc4380ceae75c29450Johann  x = vld4_lane_u8(src, x, 4);
1647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  src += pitch;
1657bc9febe8749e98a3812a0dc4380ceae75c29450Johann  x = vld4_lane_u8(src, x, 5);
1667bc9febe8749e98a3812a0dc4380ceae75c29450Johann  src += pitch;
1677bc9febe8749e98a3812a0dc4380ceae75c29450Johann  x = vld4_lane_u8(src, x, 6);
1687bc9febe8749e98a3812a0dc4380ceae75c29450Johann  src += pitch;
1697bc9febe8749e98a3812a0dc4380ceae75c29450Johann  x = vld4_lane_u8(src, x, 7);
1707bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return x;
171da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
172da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif  // VPX_INCOMPATIBLE_GCC
173da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
174da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianstatic INLINE void vp8_loop_filter_simple_vertical_edge_neon(
1757bc9febe8749e98a3812a0dc4380ceae75c29450Johann    unsigned char *s, int p, const unsigned char *blimit) {
1767bc9febe8749e98a3812a0dc4380ceae75c29450Johann  unsigned char *src1;
1777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  uint8x16_t qblimit, q0u8;
1787bc9febe8749e98a3812a0dc4380ceae75c29450Johann  uint8x16_t q3u8, q4u8, q5u8, q6u8, q7u8, q11u8, q12u8, q14u8, q15u8;
1797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int16x8_t q2s16, q13s16, q11s16;
1807bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int8x8_t d28s8, d29s8;
1817bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int8x16_t q2s8, q3s8, q10s8, q11s8, q14s8;
1827bc9febe8749e98a3812a0dc4380ceae75c29450Johann  uint8x8x4_t d0u8x4;  // d6, d7, d8, d9
1837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  uint8x8x4_t d1u8x4;  // d10, d11, d12, d13
1847bc9febe8749e98a3812a0dc4380ceae75c29450Johann  uint8x8x2_t d2u8x2;  // d12, d13
1857bc9febe8749e98a3812a0dc4380ceae75c29450Johann  uint8x8x2_t d3u8x2;  // d14, d15
186da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
1877bc9febe8749e98a3812a0dc4380ceae75c29450Johann  qblimit = vdupq_n_u8(*blimit);
188da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
1897bc9febe8749e98a3812a0dc4380ceae75c29450Johann  src1 = s - 2;
1907bc9febe8749e98a3812a0dc4380ceae75c29450Johann  d0u8x4 = read_4x8(src1, p);
1917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  src1 += p * 8;
1927bc9febe8749e98a3812a0dc4380ceae75c29450Johann  d1u8x4 = read_4x8(src1, p);
193da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
1947bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q3u8 = vcombine_u8(d0u8x4.val[0], d1u8x4.val[0]);  // d6 d10
1957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q4u8 = vcombine_u8(d0u8x4.val[2], d1u8x4.val[2]);  // d8 d12
1967bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q5u8 = vcombine_u8(d0u8x4.val[1], d1u8x4.val[1]);  // d7 d11
1977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q6u8 = vcombine_u8(d0u8x4.val[3], d1u8x4.val[3]);  // d9 d13
198da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
1997bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q15u8 = vabdq_u8(q5u8, q4u8);
2007bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q14u8 = vabdq_u8(q3u8, q6u8);
201da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
2027bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q15u8 = vqaddq_u8(q15u8, q15u8);
2037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q14u8 = vshrq_n_u8(q14u8, 1);
2047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q0u8 = vdupq_n_u8(0x80);
2057bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q11s16 = vdupq_n_s16(3);
2067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q15u8 = vqaddq_u8(q15u8, q14u8);
207da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
2087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q3u8 = veorq_u8(q3u8, q0u8);
2097bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q4u8 = veorq_u8(q4u8, q0u8);
2107bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q5u8 = veorq_u8(q5u8, q0u8);
2117bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q6u8 = veorq_u8(q6u8, q0u8);
212da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
2137bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q15u8 = vcgeq_u8(qblimit, q15u8);
214da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
2157bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q2s16 = vsubl_s8(vget_low_s8(vreinterpretq_s8_u8(q4u8)),
2167bc9febe8749e98a3812a0dc4380ceae75c29450Johann                   vget_low_s8(vreinterpretq_s8_u8(q5u8)));
2177bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q13s16 = vsubl_s8(vget_high_s8(vreinterpretq_s8_u8(q4u8)),
2187bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    vget_high_s8(vreinterpretq_s8_u8(q5u8)));
219da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
2207bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q14s8 = vqsubq_s8(vreinterpretq_s8_u8(q3u8), vreinterpretq_s8_u8(q6u8));
221da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
2227bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q2s16 = vmulq_s16(q2s16, q11s16);
2237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q13s16 = vmulq_s16(q13s16, q11s16);
224da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
2257bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q11u8 = vdupq_n_u8(3);
2267bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q12u8 = vdupq_n_u8(4);
227da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
2287bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q2s16 = vaddw_s8(q2s16, vget_low_s8(q14s8));
2297bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q13s16 = vaddw_s8(q13s16, vget_high_s8(q14s8));
230da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
2317bc9febe8749e98a3812a0dc4380ceae75c29450Johann  d28s8 = vqmovn_s16(q2s16);
2327bc9febe8749e98a3812a0dc4380ceae75c29450Johann  d29s8 = vqmovn_s16(q13s16);
2337bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q14s8 = vcombine_s8(d28s8, d29s8);
234da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
2357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q14s8 = vandq_s8(q14s8, vreinterpretq_s8_u8(q15u8));
236da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
2377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q2s8 = vqaddq_s8(q14s8, vreinterpretq_s8_u8(q11u8));
2387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q3s8 = vqaddq_s8(q14s8, vreinterpretq_s8_u8(q12u8));
2397bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q2s8 = vshrq_n_s8(q2s8, 3);
2407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q14s8 = vshrq_n_s8(q3s8, 3);
241da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
2427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q11s8 = vqaddq_s8(vreinterpretq_s8_u8(q5u8), q2s8);
2437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q10s8 = vqsubq_s8(vreinterpretq_s8_u8(q4u8), q14s8);
244da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
2457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q6u8 = veorq_u8(vreinterpretq_u8_s8(q11s8), q0u8);
2467bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q7u8 = veorq_u8(vreinterpretq_u8_s8(q10s8), q0u8);
247da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
2487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  d2u8x2.val[0] = vget_low_u8(q6u8);   // d12
2497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  d2u8x2.val[1] = vget_low_u8(q7u8);   // d14
2507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  d3u8x2.val[0] = vget_high_u8(q6u8);  // d13
2517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  d3u8x2.val[1] = vget_high_u8(q7u8);  // d15
252da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
2537bc9febe8749e98a3812a0dc4380ceae75c29450Johann  src1 = s - 1;
2547bc9febe8749e98a3812a0dc4380ceae75c29450Johann  write_2x8(src1, p, d2u8x2, d3u8x2);
255da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
256da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
2577bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_loop_filter_bvs_neon(unsigned char *y_ptr, int y_stride,
2587bc9febe8749e98a3812a0dc4380ceae75c29450Johann                              const unsigned char *blimit) {
2597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  y_ptr += 4;
2607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_loop_filter_simple_vertical_edge_neon(y_ptr, y_stride, blimit);
2617bc9febe8749e98a3812a0dc4380ceae75c29450Johann  y_ptr += 4;
2627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_loop_filter_simple_vertical_edge_neon(y_ptr, y_stride, blimit);
2637bc9febe8749e98a3812a0dc4380ceae75c29450Johann  y_ptr += 4;
2647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_loop_filter_simple_vertical_edge_neon(y_ptr, y_stride, blimit);
2657bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return;
266da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
267da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
2687bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_loop_filter_mbvs_neon(unsigned char *y_ptr, int y_stride,
2697bc9febe8749e98a3812a0dc4380ceae75c29450Johann                               const unsigned char *blimit) {
2707bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_loop_filter_simple_vertical_edge_neon(y_ptr, y_stride, blimit);
2717bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return;
272da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
273