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