]> granicus.if.org Git - libvpx/blob - vpx_dsp/arm/idct16x16_add_neon.c
idct16x16,NEON: rm output_stride from pass1 fns
[libvpx] / vpx_dsp / arm / idct16x16_add_neon.c
1 /*
2  *  Copyright (c) 2014 The WebM project authors. All Rights Reserved.
3  *
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.
9  */
10
11 #include <arm_neon.h>
12
13 #include "./vpx_config.h"
14 #include "vpx_dsp/arm/transpose_neon.h"
15 #include "vpx_dsp/txfm_common.h"
16
17 void vpx_idct16x16_256_add_neon_pass1(const int16_t *in, int16_t *out) {
18   int16x4_t d0s16, d1s16, d2s16, d3s16;
19   int16x4_t d8s16, d9s16, d10s16, d11s16, d12s16, d13s16, d14s16, d15s16;
20   int16x4_t d16s16, d17s16, d18s16, d19s16, d20s16, d21s16, d22s16, d23s16;
21   int16x4_t d24s16, d25s16, d26s16, d27s16, d28s16, d29s16, d30s16, d31s16;
22   int16x8_t q0s16, q1s16, q2s16, q3s16, q4s16, q5s16, q6s16, q7s16;
23   int16x8_t q8s16, q9s16, q10s16, q11s16, q12s16, q13s16, q14s16, q15s16;
24   int32x4_t q0s32, q1s32, q2s32, q3s32, q5s32, q6s32, q9s32;
25   int32x4_t q10s32, q11s32, q12s32, q13s32, q15s32;
26   int16x8x2_t q0x2s16;
27
28   q0x2s16 = vld2q_s16(in);
29   q8s16 = q0x2s16.val[0];
30   in += 16;
31   q0x2s16 = vld2q_s16(in);
32   q9s16 = q0x2s16.val[0];
33   in += 16;
34   q0x2s16 = vld2q_s16(in);
35   q10s16 = q0x2s16.val[0];
36   in += 16;
37   q0x2s16 = vld2q_s16(in);
38   q11s16 = q0x2s16.val[0];
39   in += 16;
40   q0x2s16 = vld2q_s16(in);
41   q12s16 = q0x2s16.val[0];
42   in += 16;
43   q0x2s16 = vld2q_s16(in);
44   q13s16 = q0x2s16.val[0];
45   in += 16;
46   q0x2s16 = vld2q_s16(in);
47   q14s16 = q0x2s16.val[0];
48   in += 16;
49   q0x2s16 = vld2q_s16(in);
50   q15s16 = q0x2s16.val[0];
51
52   transpose_s16_8x8(&q8s16, &q9s16, &q10s16, &q11s16, &q12s16, &q13s16, &q14s16,
53                     &q15s16);
54
55   d16s16 = vget_low_s16(q8s16);
56   d17s16 = vget_high_s16(q8s16);
57   d18s16 = vget_low_s16(q9s16);
58   d19s16 = vget_high_s16(q9s16);
59   d20s16 = vget_low_s16(q10s16);
60   d21s16 = vget_high_s16(q10s16);
61   d22s16 = vget_low_s16(q11s16);
62   d23s16 = vget_high_s16(q11s16);
63   d24s16 = vget_low_s16(q12s16);
64   d25s16 = vget_high_s16(q12s16);
65   d26s16 = vget_low_s16(q13s16);
66   d27s16 = vget_high_s16(q13s16);
67   d28s16 = vget_low_s16(q14s16);
68   d29s16 = vget_high_s16(q14s16);
69   d30s16 = vget_low_s16(q15s16);
70   d31s16 = vget_high_s16(q15s16);
71
72   // stage 3
73   d0s16 = vdup_n_s16((int16_t)cospi_28_64);
74   d1s16 = vdup_n_s16((int16_t)cospi_4_64);
75
76   q2s32 = vmull_s16(d18s16, d0s16);
77   q3s32 = vmull_s16(d19s16, d0s16);
78   q5s32 = vmull_s16(d18s16, d1s16);
79   q6s32 = vmull_s16(d19s16, d1s16);
80
81   q2s32 = vmlsl_s16(q2s32, d30s16, d1s16);
82   q3s32 = vmlsl_s16(q3s32, d31s16, d1s16);
83   q5s32 = vmlal_s16(q5s32, d30s16, d0s16);
84   q6s32 = vmlal_s16(q6s32, d31s16, d0s16);
85
86   d2s16 = vdup_n_s16((int16_t)cospi_12_64);
87   d3s16 = vdup_n_s16((int16_t)cospi_20_64);
88
89   d8s16 = vqrshrn_n_s32(q2s32, 14);
90   d9s16 = vqrshrn_n_s32(q3s32, 14);
91   d14s16 = vqrshrn_n_s32(q5s32, 14);
92   d15s16 = vqrshrn_n_s32(q6s32, 14);
93   q4s16 = vcombine_s16(d8s16, d9s16);
94   q7s16 = vcombine_s16(d14s16, d15s16);
95
96   q2s32 = vmull_s16(d26s16, d2s16);
97   q3s32 = vmull_s16(d27s16, d2s16);
98   q9s32 = vmull_s16(d26s16, d3s16);
99   q15s32 = vmull_s16(d27s16, d3s16);
100
101   q2s32 = vmlsl_s16(q2s32, d22s16, d3s16);
102   q3s32 = vmlsl_s16(q3s32, d23s16, d3s16);
103   q9s32 = vmlal_s16(q9s32, d22s16, d2s16);
104   q15s32 = vmlal_s16(q15s32, d23s16, d2s16);
105
106   d10s16 = vqrshrn_n_s32(q2s32, 14);
107   d11s16 = vqrshrn_n_s32(q3s32, 14);
108   d12s16 = vqrshrn_n_s32(q9s32, 14);
109   d13s16 = vqrshrn_n_s32(q15s32, 14);
110   q5s16 = vcombine_s16(d10s16, d11s16);
111   q6s16 = vcombine_s16(d12s16, d13s16);
112
113   // stage 4
114   d30s16 = vdup_n_s16((int16_t)cospi_16_64);
115
116   q2s32 = vmull_s16(d16s16, d30s16);
117   q11s32 = vmull_s16(d17s16, d30s16);
118   q0s32 = vmull_s16(d24s16, d30s16);
119   q1s32 = vmull_s16(d25s16, d30s16);
120
121   d30s16 = vdup_n_s16((int16_t)cospi_24_64);
122   d31s16 = vdup_n_s16((int16_t)cospi_8_64);
123
124   q3s32 = vaddq_s32(q2s32, q0s32);
125   q12s32 = vaddq_s32(q11s32, q1s32);
126   q13s32 = vsubq_s32(q2s32, q0s32);
127   q1s32 = vsubq_s32(q11s32, q1s32);
128
129   d16s16 = vqrshrn_n_s32(q3s32, 14);
130   d17s16 = vqrshrn_n_s32(q12s32, 14);
131   d18s16 = vqrshrn_n_s32(q13s32, 14);
132   d19s16 = vqrshrn_n_s32(q1s32, 14);
133   q8s16 = vcombine_s16(d16s16, d17s16);
134   q9s16 = vcombine_s16(d18s16, d19s16);
135
136   q0s32 = vmull_s16(d20s16, d31s16);
137   q1s32 = vmull_s16(d21s16, d31s16);
138   q12s32 = vmull_s16(d20s16, d30s16);
139   q13s32 = vmull_s16(d21s16, d30s16);
140
141   q0s32 = vmlal_s16(q0s32, d28s16, d30s16);
142   q1s32 = vmlal_s16(q1s32, d29s16, d30s16);
143   q12s32 = vmlsl_s16(q12s32, d28s16, d31s16);
144   q13s32 = vmlsl_s16(q13s32, d29s16, d31s16);
145
146   d22s16 = vqrshrn_n_s32(q0s32, 14);
147   d23s16 = vqrshrn_n_s32(q1s32, 14);
148   d20s16 = vqrshrn_n_s32(q12s32, 14);
149   d21s16 = vqrshrn_n_s32(q13s32, 14);
150   q10s16 = vcombine_s16(d20s16, d21s16);
151   q11s16 = vcombine_s16(d22s16, d23s16);
152
153   q13s16 = vsubq_s16(q4s16, q5s16);
154   q4s16 = vaddq_s16(q4s16, q5s16);
155   q14s16 = vsubq_s16(q7s16, q6s16);
156   q15s16 = vaddq_s16(q6s16, q7s16);
157   d26s16 = vget_low_s16(q13s16);
158   d27s16 = vget_high_s16(q13s16);
159   d28s16 = vget_low_s16(q14s16);
160   d29s16 = vget_high_s16(q14s16);
161
162   // stage 5
163   q0s16 = vaddq_s16(q8s16, q11s16);
164   q1s16 = vaddq_s16(q9s16, q10s16);
165   q2s16 = vsubq_s16(q9s16, q10s16);
166   q3s16 = vsubq_s16(q8s16, q11s16);
167
168   d16s16 = vdup_n_s16((int16_t)cospi_16_64);
169
170   q11s32 = vmull_s16(d26s16, d16s16);
171   q12s32 = vmull_s16(d27s16, d16s16);
172   q9s32 = vmull_s16(d28s16, d16s16);
173   q10s32 = vmull_s16(d29s16, d16s16);
174
175   q6s32 = vsubq_s32(q9s32, q11s32);
176   q13s32 = vsubq_s32(q10s32, q12s32);
177   q9s32 = vaddq_s32(q9s32, q11s32);
178   q10s32 = vaddq_s32(q10s32, q12s32);
179
180   d10s16 = vqrshrn_n_s32(q6s32, 14);
181   d11s16 = vqrshrn_n_s32(q13s32, 14);
182   d12s16 = vqrshrn_n_s32(q9s32, 14);
183   d13s16 = vqrshrn_n_s32(q10s32, 14);
184   q5s16 = vcombine_s16(d10s16, d11s16);
185   q6s16 = vcombine_s16(d12s16, d13s16);
186
187   // stage 6
188   q8s16 = vaddq_s16(q0s16, q15s16);
189   q9s16 = vaddq_s16(q1s16, q6s16);
190   q10s16 = vaddq_s16(q2s16, q5s16);
191   q11s16 = vaddq_s16(q3s16, q4s16);
192   q12s16 = vsubq_s16(q3s16, q4s16);
193   q13s16 = vsubq_s16(q2s16, q5s16);
194   q14s16 = vsubq_s16(q1s16, q6s16);
195   q15s16 = vsubq_s16(q0s16, q15s16);
196
197   // store the data
198   vst1q_s16(out, q8s16);
199   out += 8;
200   vst1q_s16(out, q9s16);
201   out += 8;
202   vst1q_s16(out, q10s16);
203   out += 8;
204   vst1q_s16(out, q11s16);
205   out += 8;
206   vst1q_s16(out, q12s16);
207   out += 8;
208   vst1q_s16(out, q13s16);
209   out += 8;
210   vst1q_s16(out, q14s16);
211   out += 8;
212   vst1q_s16(out, q15s16);
213 }
214
215 void vpx_idct16x16_256_add_neon_pass2(const int16_t *src, int16_t *out,
216                                       int16_t *pass1_output,
217                                       int16_t skip_adding, uint8_t *dest,
218                                       int dest_stride) {
219   uint8_t *d;
220   uint8x8_t d12u8, d13u8;
221   int16x4_t d0s16, d1s16, d2s16, d3s16, d4s16, d5s16, d6s16, d7s16;
222   int16x4_t d8s16, d9s16, d10s16, d11s16, d12s16, d13s16, d14s16, d15s16;
223   int16x4_t d16s16, d17s16, d18s16, d19s16, d20s16, d21s16, d22s16, d23s16;
224   int16x4_t d24s16, d25s16, d26s16, d27s16, d28s16, d29s16, d30s16, d31s16;
225   uint64x1_t d24u64, d25u64, d26u64, d27u64;
226   int64x1_t d12s64, d13s64;
227   uint16x8_t q2u16, q3u16, q4u16, q5u16, q8u16;
228   uint16x8_t q9u16, q12u16, q13u16, q14u16, q15u16;
229   int16x8_t q0s16, q1s16, q2s16, q3s16, q4s16, q5s16, q6s16, q7s16;
230   int16x8_t q8s16, q9s16, q10s16, q11s16, q12s16, q13s16, q14s16, q15s16;
231   int32x4_t q0s32, q1s32, q2s32, q3s32, q4s32, q5s32, q6s32, q8s32, q9s32;
232   int32x4_t q10s32, q11s32, q12s32, q13s32;
233   int16x8x2_t q0x2s16;
234
235   q0x2s16 = vld2q_s16(src);
236   q8s16 = q0x2s16.val[0];
237   src += 16;
238   q0x2s16 = vld2q_s16(src);
239   q9s16 = q0x2s16.val[0];
240   src += 16;
241   q0x2s16 = vld2q_s16(src);
242   q10s16 = q0x2s16.val[0];
243   src += 16;
244   q0x2s16 = vld2q_s16(src);
245   q11s16 = q0x2s16.val[0];
246   src += 16;
247   q0x2s16 = vld2q_s16(src);
248   q12s16 = q0x2s16.val[0];
249   src += 16;
250   q0x2s16 = vld2q_s16(src);
251   q13s16 = q0x2s16.val[0];
252   src += 16;
253   q0x2s16 = vld2q_s16(src);
254   q14s16 = q0x2s16.val[0];
255   src += 16;
256   q0x2s16 = vld2q_s16(src);
257   q15s16 = q0x2s16.val[0];
258
259   transpose_s16_8x8(&q8s16, &q9s16, &q10s16, &q11s16, &q12s16, &q13s16, &q14s16,
260                     &q15s16);
261
262   d16s16 = vget_low_s16(q8s16);
263   d17s16 = vget_high_s16(q8s16);
264   d18s16 = vget_low_s16(q9s16);
265   d19s16 = vget_high_s16(q9s16);
266   d20s16 = vget_low_s16(q10s16);
267   d21s16 = vget_high_s16(q10s16);
268   d22s16 = vget_low_s16(q11s16);
269   d23s16 = vget_high_s16(q11s16);
270   d24s16 = vget_low_s16(q12s16);
271   d25s16 = vget_high_s16(q12s16);
272   d26s16 = vget_low_s16(q13s16);
273   d27s16 = vget_high_s16(q13s16);
274   d28s16 = vget_low_s16(q14s16);
275   d29s16 = vget_high_s16(q14s16);
276   d30s16 = vget_low_s16(q15s16);
277   d31s16 = vget_high_s16(q15s16);
278
279   // stage 3
280   d12s16 = vdup_n_s16((int16_t)cospi_30_64);
281   d13s16 = vdup_n_s16((int16_t)cospi_2_64);
282
283   q2s32 = vmull_s16(d16s16, d12s16);
284   q3s32 = vmull_s16(d17s16, d12s16);
285   q1s32 = vmull_s16(d16s16, d13s16);
286   q4s32 = vmull_s16(d17s16, d13s16);
287
288   q2s32 = vmlsl_s16(q2s32, d30s16, d13s16);
289   q3s32 = vmlsl_s16(q3s32, d31s16, d13s16);
290   q1s32 = vmlal_s16(q1s32, d30s16, d12s16);
291   q4s32 = vmlal_s16(q4s32, d31s16, d12s16);
292
293   d0s16 = vqrshrn_n_s32(q2s32, 14);
294   d1s16 = vqrshrn_n_s32(q3s32, 14);
295   d14s16 = vqrshrn_n_s32(q1s32, 14);
296   d15s16 = vqrshrn_n_s32(q4s32, 14);
297   q0s16 = vcombine_s16(d0s16, d1s16);
298   q7s16 = vcombine_s16(d14s16, d15s16);
299
300   d30s16 = vdup_n_s16((int16_t)cospi_14_64);
301   d31s16 = vdup_n_s16((int16_t)cospi_18_64);
302
303   q2s32 = vmull_s16(d24s16, d30s16);
304   q3s32 = vmull_s16(d25s16, d30s16);
305   q4s32 = vmull_s16(d24s16, d31s16);
306   q5s32 = vmull_s16(d25s16, d31s16);
307
308   q2s32 = vmlsl_s16(q2s32, d22s16, d31s16);
309   q3s32 = vmlsl_s16(q3s32, d23s16, d31s16);
310   q4s32 = vmlal_s16(q4s32, d22s16, d30s16);
311   q5s32 = vmlal_s16(q5s32, d23s16, d30s16);
312
313   d2s16 = vqrshrn_n_s32(q2s32, 14);
314   d3s16 = vqrshrn_n_s32(q3s32, 14);
315   d12s16 = vqrshrn_n_s32(q4s32, 14);
316   d13s16 = vqrshrn_n_s32(q5s32, 14);
317   q1s16 = vcombine_s16(d2s16, d3s16);
318   q6s16 = vcombine_s16(d12s16, d13s16);
319
320   d30s16 = vdup_n_s16((int16_t)cospi_22_64);
321   d31s16 = vdup_n_s16((int16_t)cospi_10_64);
322
323   q11s32 = vmull_s16(d20s16, d30s16);
324   q12s32 = vmull_s16(d21s16, d30s16);
325   q4s32 = vmull_s16(d20s16, d31s16);
326   q5s32 = vmull_s16(d21s16, d31s16);
327
328   q11s32 = vmlsl_s16(q11s32, d26s16, d31s16);
329   q12s32 = vmlsl_s16(q12s32, d27s16, d31s16);
330   q4s32 = vmlal_s16(q4s32, d26s16, d30s16);
331   q5s32 = vmlal_s16(q5s32, d27s16, d30s16);
332
333   d4s16 = vqrshrn_n_s32(q11s32, 14);
334   d5s16 = vqrshrn_n_s32(q12s32, 14);
335   d11s16 = vqrshrn_n_s32(q5s32, 14);
336   d10s16 = vqrshrn_n_s32(q4s32, 14);
337   q2s16 = vcombine_s16(d4s16, d5s16);
338   q5s16 = vcombine_s16(d10s16, d11s16);
339
340   d30s16 = vdup_n_s16((int16_t)cospi_6_64);
341   d31s16 = vdup_n_s16((int16_t)cospi_26_64);
342
343   q10s32 = vmull_s16(d28s16, d30s16);
344   q11s32 = vmull_s16(d29s16, d30s16);
345   q12s32 = vmull_s16(d28s16, d31s16);
346   q13s32 = vmull_s16(d29s16, d31s16);
347
348   q10s32 = vmlsl_s16(q10s32, d18s16, d31s16);
349   q11s32 = vmlsl_s16(q11s32, d19s16, d31s16);
350   q12s32 = vmlal_s16(q12s32, d18s16, d30s16);
351   q13s32 = vmlal_s16(q13s32, d19s16, d30s16);
352
353   d6s16 = vqrshrn_n_s32(q10s32, 14);
354   d7s16 = vqrshrn_n_s32(q11s32, 14);
355   d8s16 = vqrshrn_n_s32(q12s32, 14);
356   d9s16 = vqrshrn_n_s32(q13s32, 14);
357   q3s16 = vcombine_s16(d6s16, d7s16);
358   q4s16 = vcombine_s16(d8s16, d9s16);
359
360   // stage 3
361   q9s16 = vsubq_s16(q0s16, q1s16);
362   q0s16 = vaddq_s16(q0s16, q1s16);
363   q10s16 = vsubq_s16(q3s16, q2s16);
364   q11s16 = vaddq_s16(q2s16, q3s16);
365   q12s16 = vaddq_s16(q4s16, q5s16);
366   q13s16 = vsubq_s16(q4s16, q5s16);
367   q14s16 = vsubq_s16(q7s16, q6s16);
368   q7s16 = vaddq_s16(q6s16, q7s16);
369
370   // stage 4
371   d18s16 = vget_low_s16(q9s16);
372   d19s16 = vget_high_s16(q9s16);
373   d20s16 = vget_low_s16(q10s16);
374   d21s16 = vget_high_s16(q10s16);
375   d26s16 = vget_low_s16(q13s16);
376   d27s16 = vget_high_s16(q13s16);
377   d28s16 = vget_low_s16(q14s16);
378   d29s16 = vget_high_s16(q14s16);
379
380   d30s16 = vdup_n_s16((int16_t)cospi_8_64);
381   d31s16 = vdup_n_s16((int16_t)cospi_24_64);
382
383   q2s32 = vmull_s16(d18s16, d31s16);
384   q3s32 = vmull_s16(d19s16, d31s16);
385   q4s32 = vmull_s16(d28s16, d31s16);
386   q5s32 = vmull_s16(d29s16, d31s16);
387
388   q2s32 = vmlal_s16(q2s32, d28s16, d30s16);
389   q3s32 = vmlal_s16(q3s32, d29s16, d30s16);
390   q4s32 = vmlsl_s16(q4s32, d18s16, d30s16);
391   q5s32 = vmlsl_s16(q5s32, d19s16, d30s16);
392
393   d12s16 = vqrshrn_n_s32(q2s32, 14);
394   d13s16 = vqrshrn_n_s32(q3s32, 14);
395   d2s16 = vqrshrn_n_s32(q4s32, 14);
396   d3s16 = vqrshrn_n_s32(q5s32, 14);
397   q1s16 = vcombine_s16(d2s16, d3s16);
398   q6s16 = vcombine_s16(d12s16, d13s16);
399
400   q3s16 = q11s16;
401   q4s16 = q12s16;
402
403   d30s16 = vdup_n_s16(-cospi_8_64);
404   q11s32 = vmull_s16(d26s16, d30s16);
405   q12s32 = vmull_s16(d27s16, d30s16);
406   q8s32 = vmull_s16(d20s16, d30s16);
407   q9s32 = vmull_s16(d21s16, d30s16);
408
409   q11s32 = vmlsl_s16(q11s32, d20s16, d31s16);
410   q12s32 = vmlsl_s16(q12s32, d21s16, d31s16);
411   q8s32 = vmlal_s16(q8s32, d26s16, d31s16);
412   q9s32 = vmlal_s16(q9s32, d27s16, d31s16);
413
414   d4s16 = vqrshrn_n_s32(q11s32, 14);
415   d5s16 = vqrshrn_n_s32(q12s32, 14);
416   d10s16 = vqrshrn_n_s32(q8s32, 14);
417   d11s16 = vqrshrn_n_s32(q9s32, 14);
418   q2s16 = vcombine_s16(d4s16, d5s16);
419   q5s16 = vcombine_s16(d10s16, d11s16);
420
421   // stage 5
422   q8s16 = vaddq_s16(q0s16, q3s16);
423   q9s16 = vaddq_s16(q1s16, q2s16);
424   q10s16 = vsubq_s16(q1s16, q2s16);
425   q11s16 = vsubq_s16(q0s16, q3s16);
426   q12s16 = vsubq_s16(q7s16, q4s16);
427   q13s16 = vsubq_s16(q6s16, q5s16);
428   q14s16 = vaddq_s16(q6s16, q5s16);
429   q15s16 = vaddq_s16(q7s16, q4s16);
430
431   // stage 6
432   d20s16 = vget_low_s16(q10s16);
433   d21s16 = vget_high_s16(q10s16);
434   d22s16 = vget_low_s16(q11s16);
435   d23s16 = vget_high_s16(q11s16);
436   d24s16 = vget_low_s16(q12s16);
437   d25s16 = vget_high_s16(q12s16);
438   d26s16 = vget_low_s16(q13s16);
439   d27s16 = vget_high_s16(q13s16);
440
441   d14s16 = vdup_n_s16((int16_t)cospi_16_64);
442
443   q3s32 = vmull_s16(d26s16, d14s16);
444   q4s32 = vmull_s16(d27s16, d14s16);
445   q0s32 = vmull_s16(d20s16, d14s16);
446   q1s32 = vmull_s16(d21s16, d14s16);
447
448   q5s32 = vsubq_s32(q3s32, q0s32);
449   q6s32 = vsubq_s32(q4s32, q1s32);
450   q10s32 = vaddq_s32(q3s32, q0s32);
451   q4s32 = vaddq_s32(q4s32, q1s32);
452
453   d4s16 = vqrshrn_n_s32(q5s32, 14);
454   d5s16 = vqrshrn_n_s32(q6s32, 14);
455   d10s16 = vqrshrn_n_s32(q10s32, 14);
456   d11s16 = vqrshrn_n_s32(q4s32, 14);
457   q2s16 = vcombine_s16(d4s16, d5s16);
458   q5s16 = vcombine_s16(d10s16, d11s16);
459
460   q0s32 = vmull_s16(d22s16, d14s16);
461   q1s32 = vmull_s16(d23s16, d14s16);
462   q13s32 = vmull_s16(d24s16, d14s16);
463   q6s32 = vmull_s16(d25s16, d14s16);
464
465   q10s32 = vsubq_s32(q13s32, q0s32);
466   q4s32 = vsubq_s32(q6s32, q1s32);
467   q13s32 = vaddq_s32(q13s32, q0s32);
468   q6s32 = vaddq_s32(q6s32, q1s32);
469
470   d6s16 = vqrshrn_n_s32(q10s32, 14);
471   d7s16 = vqrshrn_n_s32(q4s32, 14);
472   d8s16 = vqrshrn_n_s32(q13s32, 14);
473   d9s16 = vqrshrn_n_s32(q6s32, 14);
474   q3s16 = vcombine_s16(d6s16, d7s16);
475   q4s16 = vcombine_s16(d8s16, d9s16);
476
477   // stage 7
478   if (skip_adding != 0) {
479     d = dest;
480     // load the data in pass1
481     q0s16 = vld1q_s16(pass1_output);
482     pass1_output += 8;
483     q1s16 = vld1q_s16(pass1_output);
484     pass1_output += 8;
485     d12s64 = vld1_s64((int64_t *)dest);
486     dest += dest_stride;
487     d13s64 = vld1_s64((int64_t *)dest);
488     dest += dest_stride;
489
490     q12s16 = vaddq_s16(q0s16, q15s16);
491     q13s16 = vaddq_s16(q1s16, q14s16);
492     q12s16 = vrshrq_n_s16(q12s16, 6);
493     q13s16 = vrshrq_n_s16(q13s16, 6);
494     q12u16 =
495         vaddw_u8(vreinterpretq_u16_s16(q12s16), vreinterpret_u8_s64(d12s64));
496     q13u16 =
497         vaddw_u8(vreinterpretq_u16_s16(q13s16), vreinterpret_u8_s64(d13s64));
498     d12u8 = vqmovun_s16(vreinterpretq_s16_u16(q12u16));
499     d13u8 = vqmovun_s16(vreinterpretq_s16_u16(q13u16));
500     vst1_u64((uint64_t *)d, vreinterpret_u64_u8(d12u8));
501     d += dest_stride;
502     vst1_u64((uint64_t *)d, vreinterpret_u64_u8(d13u8));
503     d += dest_stride;
504     q14s16 = vsubq_s16(q1s16, q14s16);
505     q15s16 = vsubq_s16(q0s16, q15s16);
506
507     q10s16 = vld1q_s16(pass1_output);
508     pass1_output += 8;
509     q11s16 = vld1q_s16(pass1_output);
510     pass1_output += 8;
511     d12s64 = vld1_s64((int64_t *)dest);
512     dest += dest_stride;
513     d13s64 = vld1_s64((int64_t *)dest);
514     dest += dest_stride;
515     q12s16 = vaddq_s16(q10s16, q5s16);
516     q13s16 = vaddq_s16(q11s16, q4s16);
517     q12s16 = vrshrq_n_s16(q12s16, 6);
518     q13s16 = vrshrq_n_s16(q13s16, 6);
519     q12u16 =
520         vaddw_u8(vreinterpretq_u16_s16(q12s16), vreinterpret_u8_s64(d12s64));
521     q13u16 =
522         vaddw_u8(vreinterpretq_u16_s16(q13s16), vreinterpret_u8_s64(d13s64));
523     d12u8 = vqmovun_s16(vreinterpretq_s16_u16(q12u16));
524     d13u8 = vqmovun_s16(vreinterpretq_s16_u16(q13u16));
525     vst1_u64((uint64_t *)d, vreinterpret_u64_u8(d12u8));
526     d += dest_stride;
527     vst1_u64((uint64_t *)d, vreinterpret_u64_u8(d13u8));
528     d += dest_stride;
529     q4s16 = vsubq_s16(q11s16, q4s16);
530     q5s16 = vsubq_s16(q10s16, q5s16);
531
532     q0s16 = vld1q_s16(pass1_output);
533     pass1_output += 8;
534     q1s16 = vld1q_s16(pass1_output);
535     pass1_output += 8;
536     d12s64 = vld1_s64((int64_t *)dest);
537     dest += dest_stride;
538     d13s64 = vld1_s64((int64_t *)dest);
539     dest += dest_stride;
540     q12s16 = vaddq_s16(q0s16, q3s16);
541     q13s16 = vaddq_s16(q1s16, q2s16);
542     q12s16 = vrshrq_n_s16(q12s16, 6);
543     q13s16 = vrshrq_n_s16(q13s16, 6);
544     q12u16 =
545         vaddw_u8(vreinterpretq_u16_s16(q12s16), vreinterpret_u8_s64(d12s64));
546     q13u16 =
547         vaddw_u8(vreinterpretq_u16_s16(q13s16), vreinterpret_u8_s64(d13s64));
548     d12u8 = vqmovun_s16(vreinterpretq_s16_u16(q12u16));
549     d13u8 = vqmovun_s16(vreinterpretq_s16_u16(q13u16));
550     vst1_u64((uint64_t *)d, vreinterpret_u64_u8(d12u8));
551     d += dest_stride;
552     vst1_u64((uint64_t *)d, vreinterpret_u64_u8(d13u8));
553     d += dest_stride;
554     q2s16 = vsubq_s16(q1s16, q2s16);
555     q3s16 = vsubq_s16(q0s16, q3s16);
556
557     q10s16 = vld1q_s16(pass1_output);
558     pass1_output += 8;
559     q11s16 = vld1q_s16(pass1_output);
560     d12s64 = vld1_s64((int64_t *)dest);
561     dest += dest_stride;
562     d13s64 = vld1_s64((int64_t *)dest);
563     dest += dest_stride;
564     q12s16 = vaddq_s16(q10s16, q9s16);
565     q13s16 = vaddq_s16(q11s16, q8s16);
566     q12s16 = vrshrq_n_s16(q12s16, 6);
567     q13s16 = vrshrq_n_s16(q13s16, 6);
568     q12u16 =
569         vaddw_u8(vreinterpretq_u16_s16(q12s16), vreinterpret_u8_s64(d12s64));
570     q13u16 =
571         vaddw_u8(vreinterpretq_u16_s16(q13s16), vreinterpret_u8_s64(d13s64));
572     d12u8 = vqmovun_s16(vreinterpretq_s16_u16(q12u16));
573     d13u8 = vqmovun_s16(vreinterpretq_s16_u16(q13u16));
574     vst1_u64((uint64_t *)d, vreinterpret_u64_u8(d12u8));
575     d += dest_stride;
576     vst1_u64((uint64_t *)d, vreinterpret_u64_u8(d13u8));
577     d += dest_stride;
578     q8s16 = vsubq_s16(q11s16, q8s16);
579     q9s16 = vsubq_s16(q10s16, q9s16);
580
581     // store the data  out 8,9,10,11,12,13,14,15
582     d12s64 = vld1_s64((int64_t *)dest);
583     dest += dest_stride;
584     q8s16 = vrshrq_n_s16(q8s16, 6);
585     q8u16 = vaddw_u8(vreinterpretq_u16_s16(q8s16), vreinterpret_u8_s64(d12s64));
586     d12u8 = vqmovun_s16(vreinterpretq_s16_u16(q8u16));
587     vst1_u64((uint64_t *)d, vreinterpret_u64_u8(d12u8));
588     d += dest_stride;
589
590     d12s64 = vld1_s64((int64_t *)dest);
591     dest += dest_stride;
592     q9s16 = vrshrq_n_s16(q9s16, 6);
593     q9u16 = vaddw_u8(vreinterpretq_u16_s16(q9s16), vreinterpret_u8_s64(d12s64));
594     d12u8 = vqmovun_s16(vreinterpretq_s16_u16(q9u16));
595     vst1_u64((uint64_t *)d, vreinterpret_u64_u8(d12u8));
596     d += dest_stride;
597
598     d12s64 = vld1_s64((int64_t *)dest);
599     dest += dest_stride;
600     q2s16 = vrshrq_n_s16(q2s16, 6);
601     q2u16 = vaddw_u8(vreinterpretq_u16_s16(q2s16), vreinterpret_u8_s64(d12s64));
602     d12u8 = vqmovun_s16(vreinterpretq_s16_u16(q2u16));
603     vst1_u64((uint64_t *)d, vreinterpret_u64_u8(d12u8));
604     d += dest_stride;
605
606     d12s64 = vld1_s64((int64_t *)dest);
607     dest += dest_stride;
608     q3s16 = vrshrq_n_s16(q3s16, 6);
609     q3u16 = vaddw_u8(vreinterpretq_u16_s16(q3s16), vreinterpret_u8_s64(d12s64));
610     d12u8 = vqmovun_s16(vreinterpretq_s16_u16(q3u16));
611     vst1_u64((uint64_t *)d, vreinterpret_u64_u8(d12u8));
612     d += dest_stride;
613
614     d12s64 = vld1_s64((int64_t *)dest);
615     dest += dest_stride;
616     q4s16 = vrshrq_n_s16(q4s16, 6);
617     q4u16 = vaddw_u8(vreinterpretq_u16_s16(q4s16), vreinterpret_u8_s64(d12s64));
618     d12u8 = vqmovun_s16(vreinterpretq_s16_u16(q4u16));
619     vst1_u64((uint64_t *)d, vreinterpret_u64_u8(d12u8));
620     d += dest_stride;
621
622     d12s64 = vld1_s64((int64_t *)dest);
623     dest += dest_stride;
624     q5s16 = vrshrq_n_s16(q5s16, 6);
625     q5u16 = vaddw_u8(vreinterpretq_u16_s16(q5s16), vreinterpret_u8_s64(d12s64));
626     d12u8 = vqmovun_s16(vreinterpretq_s16_u16(q5u16));
627     vst1_u64((uint64_t *)d, vreinterpret_u64_u8(d12u8));
628     d += dest_stride;
629
630     d12s64 = vld1_s64((int64_t *)dest);
631     dest += dest_stride;
632     q14s16 = vrshrq_n_s16(q14s16, 6);
633     q14u16 =
634         vaddw_u8(vreinterpretq_u16_s16(q14s16), vreinterpret_u8_s64(d12s64));
635     d12u8 = vqmovun_s16(vreinterpretq_s16_u16(q14u16));
636     vst1_u64((uint64_t *)d, vreinterpret_u64_u8(d12u8));
637     d += dest_stride;
638
639     d12s64 = vld1_s64((int64_t *)dest);
640     q15s16 = vrshrq_n_s16(q15s16, 6);
641     q15u16 =
642         vaddw_u8(vreinterpretq_u16_s16(q15s16), vreinterpret_u8_s64(d12s64));
643     d12u8 = vqmovun_s16(vreinterpretq_s16_u16(q15u16));
644     vst1_u64((uint64_t *)d, vreinterpret_u64_u8(d12u8));
645   } else {  // skip_adding_dest
646     q0s16 = vld1q_s16(pass1_output);
647     pass1_output += 8;
648     q1s16 = vld1q_s16(pass1_output);
649     pass1_output += 8;
650     q12s16 = vaddq_s16(q0s16, q15s16);
651     q13s16 = vaddq_s16(q1s16, q14s16);
652     d24u64 = vreinterpret_u64_s16(vget_low_s16(q12s16));
653     d25u64 = vreinterpret_u64_s16(vget_high_s16(q12s16));
654     d26u64 = vreinterpret_u64_s16(vget_low_s16(q13s16));
655     d27u64 = vreinterpret_u64_s16(vget_high_s16(q13s16));
656     vst1_u64((uint64_t *)out, d24u64);
657     out += 4;
658     vst1_u64((uint64_t *)out, d25u64);
659     out += 12;
660     vst1_u64((uint64_t *)out, d26u64);
661     out += 4;
662     vst1_u64((uint64_t *)out, d27u64);
663     out += 12;
664     q14s16 = vsubq_s16(q1s16, q14s16);
665     q15s16 = vsubq_s16(q0s16, q15s16);
666
667     q10s16 = vld1q_s16(pass1_output);
668     pass1_output += 8;
669     q11s16 = vld1q_s16(pass1_output);
670     pass1_output += 8;
671     q12s16 = vaddq_s16(q10s16, q5s16);
672     q13s16 = vaddq_s16(q11s16, q4s16);
673     d24u64 = vreinterpret_u64_s16(vget_low_s16(q12s16));
674     d25u64 = vreinterpret_u64_s16(vget_high_s16(q12s16));
675     d26u64 = vreinterpret_u64_s16(vget_low_s16(q13s16));
676     d27u64 = vreinterpret_u64_s16(vget_high_s16(q13s16));
677     vst1_u64((uint64_t *)out, d24u64);
678     out += 4;
679     vst1_u64((uint64_t *)out, d25u64);
680     out += 12;
681     vst1_u64((uint64_t *)out, d26u64);
682     out += 4;
683     vst1_u64((uint64_t *)out, d27u64);
684     out += 12;
685     q4s16 = vsubq_s16(q11s16, q4s16);
686     q5s16 = vsubq_s16(q10s16, q5s16);
687
688     q0s16 = vld1q_s16(pass1_output);
689     pass1_output += 8;
690     q1s16 = vld1q_s16(pass1_output);
691     pass1_output += 8;
692     q12s16 = vaddq_s16(q0s16, q3s16);
693     q13s16 = vaddq_s16(q1s16, q2s16);
694     d24u64 = vreinterpret_u64_s16(vget_low_s16(q12s16));
695     d25u64 = vreinterpret_u64_s16(vget_high_s16(q12s16));
696     d26u64 = vreinterpret_u64_s16(vget_low_s16(q13s16));
697     d27u64 = vreinterpret_u64_s16(vget_high_s16(q13s16));
698     vst1_u64((uint64_t *)out, d24u64);
699     out += 4;
700     vst1_u64((uint64_t *)out, d25u64);
701     out += 12;
702     vst1_u64((uint64_t *)out, d26u64);
703     out += 4;
704     vst1_u64((uint64_t *)out, d27u64);
705     out += 12;
706     q2s16 = vsubq_s16(q1s16, q2s16);
707     q3s16 = vsubq_s16(q0s16, q3s16);
708
709     q10s16 = vld1q_s16(pass1_output);
710     pass1_output += 8;
711     q11s16 = vld1q_s16(pass1_output);
712     pass1_output += 8;
713     q12s16 = vaddq_s16(q10s16, q9s16);
714     q13s16 = vaddq_s16(q11s16, q8s16);
715     d24u64 = vreinterpret_u64_s16(vget_low_s16(q12s16));
716     d25u64 = vreinterpret_u64_s16(vget_high_s16(q12s16));
717     d26u64 = vreinterpret_u64_s16(vget_low_s16(q13s16));
718     d27u64 = vreinterpret_u64_s16(vget_high_s16(q13s16));
719     vst1_u64((uint64_t *)out, d24u64);
720     out += 4;
721     vst1_u64((uint64_t *)out, d25u64);
722     out += 12;
723     vst1_u64((uint64_t *)out, d26u64);
724     out += 4;
725     vst1_u64((uint64_t *)out, d27u64);
726     out += 12;
727     q8s16 = vsubq_s16(q11s16, q8s16);
728     q9s16 = vsubq_s16(q10s16, q9s16);
729
730     vst1_u64((uint64_t *)out, vreinterpret_u64_s16(vget_low_s16(q8s16)));
731     out += 4;
732     vst1_u64((uint64_t *)out, vreinterpret_u64_s16(vget_high_s16(q8s16)));
733     out += 12;
734     vst1_u64((uint64_t *)out, vreinterpret_u64_s16(vget_low_s16(q9s16)));
735     out += 4;
736     vst1_u64((uint64_t *)out, vreinterpret_u64_s16(vget_high_s16(q9s16)));
737     out += 12;
738     vst1_u64((uint64_t *)out, vreinterpret_u64_s16(vget_low_s16(q2s16)));
739     out += 4;
740     vst1_u64((uint64_t *)out, vreinterpret_u64_s16(vget_high_s16(q2s16)));
741     out += 12;
742     vst1_u64((uint64_t *)out, vreinterpret_u64_s16(vget_low_s16(q3s16)));
743     out += 4;
744     vst1_u64((uint64_t *)out, vreinterpret_u64_s16(vget_high_s16(q3s16)));
745     out += 12;
746     vst1_u64((uint64_t *)out, vreinterpret_u64_s16(vget_low_s16(q4s16)));
747     out += 4;
748     vst1_u64((uint64_t *)out, vreinterpret_u64_s16(vget_high_s16(q4s16)));
749     out += 12;
750     vst1_u64((uint64_t *)out, vreinterpret_u64_s16(vget_low_s16(q5s16)));
751     out += 4;
752     vst1_u64((uint64_t *)out, vreinterpret_u64_s16(vget_high_s16(q5s16)));
753     out += 12;
754     vst1_u64((uint64_t *)out, vreinterpret_u64_s16(vget_low_s16(q14s16)));
755     out += 4;
756     vst1_u64((uint64_t *)out, vreinterpret_u64_s16(vget_high_s16(q14s16)));
757     out += 12;
758     vst1_u64((uint64_t *)out, vreinterpret_u64_s16(vget_low_s16(q15s16)));
759     out += 4;
760     vst1_u64((uint64_t *)out, vreinterpret_u64_s16(vget_high_s16(q15s16)));
761   }
762 }
763
764 void vpx_idct16x16_10_add_neon_pass1(const int16_t *in, int16_t *out) {
765   int16x4_t d4s16;
766   int16x4_t d8s16, d9s16, d10s16, d11s16, d12s16, d13s16, d14s16, d15s16;
767   int16x8_t q0s16, q1s16, q2s16, q4s16, q5s16, q6s16, q7s16;
768   int16x8_t q8s16, q9s16, q10s16, q11s16, q12s16, q13s16, q14s16, q15s16;
769   int32x4_t q6s32, q9s32;
770   int32x4_t q10s32, q11s32, q12s32, q15s32;
771   int16x8x2_t q0x2s16;
772
773   q0x2s16 = vld2q_s16(in);
774   q8s16 = q0x2s16.val[0];
775   in += 16;
776   q0x2s16 = vld2q_s16(in);
777   q9s16 = q0x2s16.val[0];
778   in += 16;
779   q0x2s16 = vld2q_s16(in);
780   q10s16 = q0x2s16.val[0];
781   in += 16;
782   q0x2s16 = vld2q_s16(in);
783   q11s16 = q0x2s16.val[0];
784   in += 16;
785   q0x2s16 = vld2q_s16(in);
786   q12s16 = q0x2s16.val[0];
787   in += 16;
788   q0x2s16 = vld2q_s16(in);
789   q13s16 = q0x2s16.val[0];
790   in += 16;
791   q0x2s16 = vld2q_s16(in);
792   q14s16 = q0x2s16.val[0];
793   in += 16;
794   q0x2s16 = vld2q_s16(in);
795   q15s16 = q0x2s16.val[0];
796
797   transpose_s16_8x8(&q8s16, &q9s16, &q10s16, &q11s16, &q12s16, &q13s16, &q14s16,
798                     &q15s16);
799
800   // stage 3
801   q0s16 = vdupq_n_s16((int16_t)cospi_28_64 * 2);
802   q1s16 = vdupq_n_s16((int16_t)cospi_4_64 * 2);
803
804   q4s16 = vqrdmulhq_s16(q9s16, q0s16);
805   q7s16 = vqrdmulhq_s16(q9s16, q1s16);
806
807   // stage 4
808   q1s16 = vdupq_n_s16((int16_t)cospi_16_64 * 2);
809   d4s16 = vdup_n_s16((int16_t)cospi_16_64);
810
811   q8s16 = vqrdmulhq_s16(q8s16, q1s16);
812
813   d8s16 = vget_low_s16(q4s16);
814   d9s16 = vget_high_s16(q4s16);
815   d14s16 = vget_low_s16(q7s16);
816   d15s16 = vget_high_s16(q7s16);
817   q9s32 = vmull_s16(d14s16, d4s16);
818   q10s32 = vmull_s16(d15s16, d4s16);
819   q12s32 = vmull_s16(d9s16, d4s16);
820   q11s32 = vmull_s16(d8s16, d4s16);
821
822   q15s32 = vsubq_s32(q10s32, q12s32);
823   q6s32 = vsubq_s32(q9s32, q11s32);
824   q9s32 = vaddq_s32(q9s32, q11s32);
825   q10s32 = vaddq_s32(q10s32, q12s32);
826
827   d11s16 = vqrshrn_n_s32(q15s32, 14);
828   d10s16 = vqrshrn_n_s32(q6s32, 14);
829   d12s16 = vqrshrn_n_s32(q9s32, 14);
830   d13s16 = vqrshrn_n_s32(q10s32, 14);
831   q5s16 = vcombine_s16(d10s16, d11s16);
832   q6s16 = vcombine_s16(d12s16, d13s16);
833
834   // stage 6
835   q2s16 = vaddq_s16(q8s16, q7s16);
836   q9s16 = vaddq_s16(q8s16, q6s16);
837   q10s16 = vaddq_s16(q8s16, q5s16);
838   q11s16 = vaddq_s16(q8s16, q4s16);
839   q12s16 = vsubq_s16(q8s16, q4s16);
840   q13s16 = vsubq_s16(q8s16, q5s16);
841   q14s16 = vsubq_s16(q8s16, q6s16);
842   q15s16 = vsubq_s16(q8s16, q7s16);
843
844   // store the data
845   vst1q_s16(out, q2s16);
846   out += 8;
847   vst1q_s16(out, q9s16);
848   out += 8;
849   vst1q_s16(out, q10s16);
850   out += 8;
851   vst1q_s16(out, q11s16);
852   out += 8;
853   vst1q_s16(out, q12s16);
854   out += 8;
855   vst1q_s16(out, q13s16);
856   out += 8;
857   vst1q_s16(out, q14s16);
858   out += 8;
859   vst1q_s16(out, q15s16);
860 }
861
862 void vpx_idct16x16_10_add_neon_pass2(const int16_t *src, int16_t *out,
863                                      int16_t *pass1_output) {
864   int16x4_t d0s16, d1s16, d2s16, d3s16, d4s16, d5s16, d6s16, d7s16;
865   int16x4_t d8s16, d9s16, d10s16, d11s16, d12s16, d13s16, d14s16, d15s16;
866   int16x4_t d20s16, d21s16, d22s16, d23s16;
867   int16x4_t d24s16, d25s16, d26s16, d27s16, d30s16, d31s16;
868   uint64x1_t d4u64, d5u64, d6u64, d7u64, d8u64, d9u64, d10u64, d11u64;
869   uint64x1_t d16u64, d17u64, d18u64, d19u64;
870   uint64x1_t d24u64, d25u64, d26u64, d27u64, d28u64, d29u64, d30u64, d31u64;
871   int16x8_t q0s16, q1s16, q2s16, q3s16, q4s16, q5s16, q6s16, q7s16;
872   int16x8_t q8s16, q9s16, q10s16, q11s16, q12s16, q13s16, q14s16, q15s16;
873   int32x4_t q0s32, q1s32, q2s32, q3s32, q4s32, q5s32, q6s32, q8s32, q9s32;
874   int32x4_t q10s32, q11s32, q12s32, q13s32;
875   int16x8x2_t q0x2s16;
876
877   q0x2s16 = vld2q_s16(src);
878   q8s16 = q0x2s16.val[0];
879   src += 16;
880   q0x2s16 = vld2q_s16(src);
881   q9s16 = q0x2s16.val[0];
882   src += 16;
883   q0x2s16 = vld2q_s16(src);
884   q10s16 = q0x2s16.val[0];
885   src += 16;
886   q0x2s16 = vld2q_s16(src);
887   q11s16 = q0x2s16.val[0];
888   src += 16;
889   q0x2s16 = vld2q_s16(src);
890   q12s16 = q0x2s16.val[0];
891   src += 16;
892   q0x2s16 = vld2q_s16(src);
893   q13s16 = q0x2s16.val[0];
894   src += 16;
895   q0x2s16 = vld2q_s16(src);
896   q14s16 = q0x2s16.val[0];
897   src += 16;
898   q0x2s16 = vld2q_s16(src);
899   q15s16 = q0x2s16.val[0];
900
901   transpose_s16_8x8(&q8s16, &q9s16, &q10s16, &q11s16, &q12s16, &q13s16, &q14s16,
902                     &q15s16);
903
904   // stage 3
905   q6s16 = vdupq_n_s16((int16_t)cospi_30_64 * 2);
906   q0s16 = vqrdmulhq_s16(q8s16, q6s16);
907   q6s16 = vdupq_n_s16((int16_t)cospi_2_64 * 2);
908   q7s16 = vqrdmulhq_s16(q8s16, q6s16);
909
910   q15s16 = vdupq_n_s16((int16_t)-cospi_26_64 * 2);
911   q14s16 = vdupq_n_s16((int16_t)cospi_6_64 * 2);
912   q3s16 = vqrdmulhq_s16(q9s16, q15s16);
913   q4s16 = vqrdmulhq_s16(q9s16, q14s16);
914
915   // stage 4
916   d0s16 = vget_low_s16(q0s16);
917   d1s16 = vget_high_s16(q0s16);
918   d6s16 = vget_low_s16(q3s16);
919   d7s16 = vget_high_s16(q3s16);
920   d8s16 = vget_low_s16(q4s16);
921   d9s16 = vget_high_s16(q4s16);
922   d14s16 = vget_low_s16(q7s16);
923   d15s16 = vget_high_s16(q7s16);
924
925   d30s16 = vdup_n_s16((int16_t)cospi_8_64);
926   d31s16 = vdup_n_s16((int16_t)cospi_24_64);
927
928   q12s32 = vmull_s16(d14s16, d31s16);
929   q5s32 = vmull_s16(d15s16, d31s16);
930   q2s32 = vmull_s16(d0s16, d31s16);
931   q11s32 = vmull_s16(d1s16, d31s16);
932
933   q12s32 = vmlsl_s16(q12s32, d0s16, d30s16);
934   q5s32 = vmlsl_s16(q5s32, d1s16, d30s16);
935   q2s32 = vmlal_s16(q2s32, d14s16, d30s16);
936   q11s32 = vmlal_s16(q11s32, d15s16, d30s16);
937
938   d2s16 = vqrshrn_n_s32(q12s32, 14);
939   d3s16 = vqrshrn_n_s32(q5s32, 14);
940   d12s16 = vqrshrn_n_s32(q2s32, 14);
941   d13s16 = vqrshrn_n_s32(q11s32, 14);
942   q1s16 = vcombine_s16(d2s16, d3s16);
943   q6s16 = vcombine_s16(d12s16, d13s16);
944
945   d30s16 = vdup_n_s16(-cospi_8_64);
946   q10s32 = vmull_s16(d8s16, d30s16);
947   q13s32 = vmull_s16(d9s16, d30s16);
948   q8s32 = vmull_s16(d6s16, d30s16);
949   q9s32 = vmull_s16(d7s16, d30s16);
950
951   q10s32 = vmlsl_s16(q10s32, d6s16, d31s16);
952   q13s32 = vmlsl_s16(q13s32, d7s16, d31s16);
953   q8s32 = vmlal_s16(q8s32, d8s16, d31s16);
954   q9s32 = vmlal_s16(q9s32, d9s16, d31s16);
955
956   d4s16 = vqrshrn_n_s32(q10s32, 14);
957   d5s16 = vqrshrn_n_s32(q13s32, 14);
958   d10s16 = vqrshrn_n_s32(q8s32, 14);
959   d11s16 = vqrshrn_n_s32(q9s32, 14);
960   q2s16 = vcombine_s16(d4s16, d5s16);
961   q5s16 = vcombine_s16(d10s16, d11s16);
962
963   // stage 5
964   q8s16 = vaddq_s16(q0s16, q3s16);
965   q9s16 = vaddq_s16(q1s16, q2s16);
966   q10s16 = vsubq_s16(q1s16, q2s16);
967   q11s16 = vsubq_s16(q0s16, q3s16);
968   q12s16 = vsubq_s16(q7s16, q4s16);
969   q13s16 = vsubq_s16(q6s16, q5s16);
970   q14s16 = vaddq_s16(q6s16, q5s16);
971   q15s16 = vaddq_s16(q7s16, q4s16);
972
973   // stage 6
974   d20s16 = vget_low_s16(q10s16);
975   d21s16 = vget_high_s16(q10s16);
976   d22s16 = vget_low_s16(q11s16);
977   d23s16 = vget_high_s16(q11s16);
978   d24s16 = vget_low_s16(q12s16);
979   d25s16 = vget_high_s16(q12s16);
980   d26s16 = vget_low_s16(q13s16);
981   d27s16 = vget_high_s16(q13s16);
982
983   d14s16 = vdup_n_s16((int16_t)cospi_16_64);
984   q3s32 = vmull_s16(d26s16, d14s16);
985   q4s32 = vmull_s16(d27s16, d14s16);
986   q0s32 = vmull_s16(d20s16, d14s16);
987   q1s32 = vmull_s16(d21s16, d14s16);
988
989   q5s32 = vsubq_s32(q3s32, q0s32);
990   q6s32 = vsubq_s32(q4s32, q1s32);
991   q0s32 = vaddq_s32(q3s32, q0s32);
992   q4s32 = vaddq_s32(q4s32, q1s32);
993
994   d4s16 = vqrshrn_n_s32(q5s32, 14);
995   d5s16 = vqrshrn_n_s32(q6s32, 14);
996   d10s16 = vqrshrn_n_s32(q0s32, 14);
997   d11s16 = vqrshrn_n_s32(q4s32, 14);
998   q2s16 = vcombine_s16(d4s16, d5s16);
999   q5s16 = vcombine_s16(d10s16, d11s16);
1000
1001   q0s32 = vmull_s16(d22s16, d14s16);
1002   q1s32 = vmull_s16(d23s16, d14s16);
1003   q13s32 = vmull_s16(d24s16, d14s16);
1004   q6s32 = vmull_s16(d25s16, d14s16);
1005
1006   q10s32 = vsubq_s32(q13s32, q0s32);
1007   q4s32 = vsubq_s32(q6s32, q1s32);
1008   q13s32 = vaddq_s32(q13s32, q0s32);
1009   q6s32 = vaddq_s32(q6s32, q1s32);
1010
1011   d6s16 = vqrshrn_n_s32(q10s32, 14);
1012   d7s16 = vqrshrn_n_s32(q4s32, 14);
1013   d8s16 = vqrshrn_n_s32(q13s32, 14);
1014   d9s16 = vqrshrn_n_s32(q6s32, 14);
1015   q3s16 = vcombine_s16(d6s16, d7s16);
1016   q4s16 = vcombine_s16(d8s16, d9s16);
1017
1018   // stage 7
1019   q0s16 = vld1q_s16(pass1_output);
1020   pass1_output += 8;
1021   q1s16 = vld1q_s16(pass1_output);
1022   pass1_output += 8;
1023   q12s16 = vaddq_s16(q0s16, q15s16);
1024   q13s16 = vaddq_s16(q1s16, q14s16);
1025   d24u64 = vreinterpret_u64_s16(vget_low_s16(q12s16));
1026   d25u64 = vreinterpret_u64_s16(vget_high_s16(q12s16));
1027   d26u64 = vreinterpret_u64_s16(vget_low_s16(q13s16));
1028   d27u64 = vreinterpret_u64_s16(vget_high_s16(q13s16));
1029   vst1_u64((uint64_t *)out, d24u64);
1030   out += 4;
1031   vst1_u64((uint64_t *)out, d25u64);
1032   out += 12;
1033   vst1_u64((uint64_t *)out, d26u64);
1034   out += 4;
1035   vst1_u64((uint64_t *)out, d27u64);
1036   out += 12;
1037   q14s16 = vsubq_s16(q1s16, q14s16);
1038   q15s16 = vsubq_s16(q0s16, q15s16);
1039
1040   q10s16 = vld1q_s16(pass1_output);
1041   pass1_output += 8;
1042   q11s16 = vld1q_s16(pass1_output);
1043   pass1_output += 8;
1044   q12s16 = vaddq_s16(q10s16, q5s16);
1045   q13s16 = vaddq_s16(q11s16, q4s16);
1046   d24u64 = vreinterpret_u64_s16(vget_low_s16(q12s16));
1047   d25u64 = vreinterpret_u64_s16(vget_high_s16(q12s16));
1048   d26u64 = vreinterpret_u64_s16(vget_low_s16(q13s16));
1049   d27u64 = vreinterpret_u64_s16(vget_high_s16(q13s16));
1050   vst1_u64((uint64_t *)out, d24u64);
1051   out += 4;
1052   vst1_u64((uint64_t *)out, d25u64);
1053   out += 12;
1054   vst1_u64((uint64_t *)out, d26u64);
1055   out += 4;
1056   vst1_u64((uint64_t *)out, d27u64);
1057   out += 12;
1058   q4s16 = vsubq_s16(q11s16, q4s16);
1059   q5s16 = vsubq_s16(q10s16, q5s16);
1060
1061   q0s16 = vld1q_s16(pass1_output);
1062   pass1_output += 8;
1063   q1s16 = vld1q_s16(pass1_output);
1064   pass1_output += 8;
1065   q12s16 = vaddq_s16(q0s16, q3s16);
1066   q13s16 = vaddq_s16(q1s16, q2s16);
1067   d24u64 = vreinterpret_u64_s16(vget_low_s16(q12s16));
1068   d25u64 = vreinterpret_u64_s16(vget_high_s16(q12s16));
1069   d26u64 = vreinterpret_u64_s16(vget_low_s16(q13s16));
1070   d27u64 = vreinterpret_u64_s16(vget_high_s16(q13s16));
1071   vst1_u64((uint64_t *)out, d24u64);
1072   out += 4;
1073   vst1_u64((uint64_t *)out, d25u64);
1074   out += 12;
1075   vst1_u64((uint64_t *)out, d26u64);
1076   out += 4;
1077   vst1_u64((uint64_t *)out, d27u64);
1078   out += 12;
1079   q2s16 = vsubq_s16(q1s16, q2s16);
1080   q3s16 = vsubq_s16(q0s16, q3s16);
1081
1082   q10s16 = vld1q_s16(pass1_output);
1083   pass1_output += 8;
1084   q11s16 = vld1q_s16(pass1_output);
1085   q12s16 = vaddq_s16(q10s16, q9s16);
1086   q13s16 = vaddq_s16(q11s16, q8s16);
1087   d24u64 = vreinterpret_u64_s16(vget_low_s16(q12s16));
1088   d25u64 = vreinterpret_u64_s16(vget_high_s16(q12s16));
1089   d26u64 = vreinterpret_u64_s16(vget_low_s16(q13s16));
1090   d27u64 = vreinterpret_u64_s16(vget_high_s16(q13s16));
1091   vst1_u64((uint64_t *)out, d24u64);
1092   out += 4;
1093   vst1_u64((uint64_t *)out, d25u64);
1094   out += 12;
1095   vst1_u64((uint64_t *)out, d26u64);
1096   out += 4;
1097   vst1_u64((uint64_t *)out, d27u64);
1098   out += 12;
1099   q8s16 = vsubq_s16(q11s16, q8s16);
1100   q9s16 = vsubq_s16(q10s16, q9s16);
1101
1102   d4u64 = vreinterpret_u64_s16(vget_low_s16(q2s16));
1103   d5u64 = vreinterpret_u64_s16(vget_high_s16(q2s16));
1104   d6u64 = vreinterpret_u64_s16(vget_low_s16(q3s16));
1105   d7u64 = vreinterpret_u64_s16(vget_high_s16(q3s16));
1106   d8u64 = vreinterpret_u64_s16(vget_low_s16(q4s16));
1107   d9u64 = vreinterpret_u64_s16(vget_high_s16(q4s16));
1108   d10u64 = vreinterpret_u64_s16(vget_low_s16(q5s16));
1109   d11u64 = vreinterpret_u64_s16(vget_high_s16(q5s16));
1110   d16u64 = vreinterpret_u64_s16(vget_low_s16(q8s16));
1111   d17u64 = vreinterpret_u64_s16(vget_high_s16(q8s16));
1112   d18u64 = vreinterpret_u64_s16(vget_low_s16(q9s16));
1113   d19u64 = vreinterpret_u64_s16(vget_high_s16(q9s16));
1114   d28u64 = vreinterpret_u64_s16(vget_low_s16(q14s16));
1115   d29u64 = vreinterpret_u64_s16(vget_high_s16(q14s16));
1116   d30u64 = vreinterpret_u64_s16(vget_low_s16(q15s16));
1117   d31u64 = vreinterpret_u64_s16(vget_high_s16(q15s16));
1118
1119   vst1_u64((uint64_t *)out, d16u64);
1120   out += 4;
1121   vst1_u64((uint64_t *)out, d17u64);
1122   out += 12;
1123   vst1_u64((uint64_t *)out, d18u64);
1124   out += 4;
1125   vst1_u64((uint64_t *)out, d19u64);
1126   out += 12;
1127   vst1_u64((uint64_t *)out, d4u64);
1128   out += 4;
1129   vst1_u64((uint64_t *)out, d5u64);
1130   out += 12;
1131   vst1_u64((uint64_t *)out, d6u64);
1132   out += 4;
1133   vst1_u64((uint64_t *)out, d7u64);
1134   out += 12;
1135   vst1_u64((uint64_t *)out, d8u64);
1136   out += 4;
1137   vst1_u64((uint64_t *)out, d9u64);
1138   out += 12;
1139   vst1_u64((uint64_t *)out, d10u64);
1140   out += 4;
1141   vst1_u64((uint64_t *)out, d11u64);
1142   out += 12;
1143   vst1_u64((uint64_t *)out, d28u64);
1144   out += 4;
1145   vst1_u64((uint64_t *)out, d29u64);
1146   out += 12;
1147   vst1_u64((uint64_t *)out, d30u64);
1148   out += 4;
1149   vst1_u64((uint64_t *)out, d31u64);
1150 }