2 * Copyright (c) 2014 The WebM project authors. All Rights Reserved.
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
13 #include "./vpx_config.h"
15 #include "vpx_dsp/inv_txfm.h"
16 #include "vpx_ports/mem.h"
18 static INLINE void LD_16x8(
47 static INLINE void ADD_DIFF_16x8(
57 *q8u8 = vqaddq_u8(*q8u8, qdiffu8);
58 *q9u8 = vqaddq_u8(*q9u8, qdiffu8);
59 *q10u8 = vqaddq_u8(*q10u8, qdiffu8);
60 *q11u8 = vqaddq_u8(*q11u8, qdiffu8);
61 *q12u8 = vqaddq_u8(*q12u8, qdiffu8);
62 *q13u8 = vqaddq_u8(*q13u8, qdiffu8);
63 *q14u8 = vqaddq_u8(*q14u8, qdiffu8);
64 *q15u8 = vqaddq_u8(*q15u8, qdiffu8);
68 static INLINE void SUB_DIFF_16x8(
78 *q8u8 = vqsubq_u8(*q8u8, qdiffu8);
79 *q9u8 = vqsubq_u8(*q9u8, qdiffu8);
80 *q10u8 = vqsubq_u8(*q10u8, qdiffu8);
81 *q11u8 = vqsubq_u8(*q11u8, qdiffu8);
82 *q12u8 = vqsubq_u8(*q12u8, qdiffu8);
83 *q13u8 = vqsubq_u8(*q13u8, qdiffu8);
84 *q14u8 = vqsubq_u8(*q14u8, qdiffu8);
85 *q15u8 = vqsubq_u8(*q15u8, qdiffu8);
89 static INLINE void ST_16x8(
118 void vp9_idct32x32_1_add_neon(
122 uint8x16_t q0u8, q8u8, q9u8, q10u8, q11u8, q12u8, q13u8, q14u8, q15u8;
123 int i, j, dest_stride8;
125 int16_t a1, cospi_16_64 = 11585;
126 int16_t out = dct_const_round_shift(input[0] * cospi_16_64);
128 out = dct_const_round_shift(out * cospi_16_64);
129 a1 = ROUND_POWER_OF_TWO(out, 6);
131 dest_stride8 = dest_stride * 8;
132 if (a1 >= 0) { // diff_positive_32_32
133 a1 = a1 < 0 ? 0 : a1 > 255 ? 255 : a1;
134 q0u8 = vdupq_n_u8(a1);
135 for (i = 0; i < 2; i++, dest += 16) { // diff_positive_32_32_loop
137 for (j = 0; j < 4; j++) {
138 LD_16x8(d, dest_stride, &q8u8, &q9u8, &q10u8, &q11u8,
139 &q12u8, &q13u8, &q14u8, &q15u8);
140 ADD_DIFF_16x8(q0u8, &q8u8, &q9u8, &q10u8, &q11u8,
141 &q12u8, &q13u8, &q14u8, &q15u8);
142 ST_16x8(d, dest_stride, &q8u8, &q9u8, &q10u8, &q11u8,
143 &q12u8, &q13u8, &q14u8, &q15u8);
147 } else { // diff_negative_32_32
149 a1 = a1 < 0 ? 0 : a1 > 255 ? 255 : a1;
150 q0u8 = vdupq_n_u8(a1);
151 for (i = 0; i < 2; i++, dest += 16) { // diff_negative_32_32_loop
153 for (j = 0; j < 4; j++) {
154 LD_16x8(d, dest_stride, &q8u8, &q9u8, &q10u8, &q11u8,
155 &q12u8, &q13u8, &q14u8, &q15u8);
156 SUB_DIFF_16x8(q0u8, &q8u8, &q9u8, &q10u8, &q11u8,
157 &q12u8, &q13u8, &q14u8, &q15u8);
158 ST_16x8(d, dest_stride, &q8u8, &q9u8, &q10u8, &q11u8,
159 &q12u8, &q13u8, &q14u8, &q15u8);