1@/*****************************************************************************
2@*
3@* Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
4@*
5@* Licensed under the Apache License, Version 2.0 (the "License");
6@* you may not use this file except in compliance with the License.
7@* You may obtain a copy of the License at:
8@*
9@* http://www.apache.org/licenses/LICENSE-2.0
10@*
11@* Unless required by applicable law or agreed to in writing, software
12@* distributed under the License is distributed on an "AS IS" BASIS,
13@* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14@* See the License for the specific language governing permissions and
15@* limitations under the License.
16@*
17@*****************************************************************************/
18@/**
19@ *******************************************************************************
20@ * @file
21@ *  ihevc_itrans_recon_8x8_neon.s
22@ *
23@ * @brief
24@ *  contains function definitions for single stage  inverse transform
25@ *
26@ * @author
27@ * anand s
28@ *
29@ * @par list of functions:
30@ *  - ihevc_itrans_recon_32x32()
31@ *
32@ * @remarks
33@ *  the input buffer is being corrupted
34@ *
35@ *******************************************************************************
36@*/
37
38@/**
39@ *******************************************************************************
40@ *
41@ * @brief
42@ *  this function performs inverse transform  and reconstruction for 8x8
43@ * input block
44@ *
45@ * @par description:
46@ *  performs inverse transform and adds the prediction  data and clips output
47@ * to 8 bit
48@ *
49@ * @param[in] pi2_src
50@ *  input 16x16 coefficients
51@ *
52@ * @param[in] pi2_tmp
53@ *  temporary 16x16 buffer for storing inverse
54@ *
55@ *  transform
56@ *  1st stage output
57@ *
58@ * @param[in] pu1_pred
59@ *  prediction 16x16 block
60@ *
61@ * @param[out] pu1_dst
62@ *  output 8x8 block
63@ *
64@ * @param[in] src_strd
65@ *  input stride
66@ *
67@ * @param[in] pred_strd
68@ *  prediction stride
69@ *
70@ * @param[in] dst_strd
71@ *  output stride
72@ *
73@ * @param[in] shift
74@ *  output shift
75@ *
76@ * @param[in] r12
77@ *  zero columns in pi2_src
78@ *
79@ * @returns  void
80@ *
81@ * @remarks
82@ *  none
83@ *
84@ *******************************************************************************
85@ */
86
87@void ihevc_itrans_recon_32x32(word16 *pi2_src,
88@                            word16 *pi2_tmp,
89@                            uword8 *pu1_pred,
90@                            uword8 *pu1_dst,
91@                            word32 src_strd,
92@                            word32 pred_strd,
93@                            word32 dst_strd,
94@                            word32 r12
95@                            word32 r11             )
96
97@**************variables vs registers*************************
98@   r0 => *pi2_src
99@   r1 => *pi2_tmp
100@   r2 => *pu1_pred
101@   r3 => *pu1_dst
102@   src_strd
103@   pred_strd
104@   dst_strd
105@   r12
106@   r11
107
108
109@d0[0]= 64      d2[0]=83
110@d0[1]= 90      d2[1]=82
111@d0[2]= 90      d2[2]=80
112@d0[3]= 90      d2[3]=78
113@d1[0]= 89      d3[0]=75
114@d1[1]= 88      d3[1]=73
115@d1[2]= 87      d3[2]=70
116@d1[3]= 85      d3[3]=67
117
118@d4[0]= 64      d6[0]=36
119@d4[1]= 61      d6[1]=31
120@d4[2]= 57      d6[2]=25
121@d4[3]= 54      d6[3]=22
122@d5[0]= 50      d7[0]=18
123@d5[1]= 46      d7[1]=13
124@d5[2]= 43      d7[2]=9
125@d5[3]= 38      d7[3]=4
126
127.text
128.align 4
129
130
131
132
133
134.set shift_stage1_idct ,   7
135.set shift_stage2_idct ,   12
136
137@#define zero_cols   r12
138@#define zero_rows   r11
139
140.globl ihevc_itrans_recon_32x32_a9q
141
142.extern g_ai2_ihevc_trans_32_transpose
143
144g_ai2_ihevc_trans_32_transpose_addr:
145.long g_ai2_ihevc_trans_32_transpose - ulbl1 - 8
146
147r5_addr: .word 0xfffff000
148r9_addr: .word 0xffff0000
149
150.type ihevc_itrans_recon_32x32_a9q, %function
151
152ihevc_itrans_recon_32x32_a9q:
153
154    stmfd       sp!,{r0-r12,lr}
155
156
157@ldr            r8,[sp,#56]     @ prediction stride
158@ldr            r7,[sp,#64]     @ destination stride
159    ldr         r6,[sp,#56]                 @ src stride
160    ldr         r12,[sp,#68]
161    ldr         r11,[sp,#72]
162    mov         r6,r6,lsl #1                @ x sizeof(word16)
163    add         r10,r6,r6, lsl #1           @ 3 rows
164
165
166    mov         r8,r0
167
168    ldr         r14,g_ai2_ihevc_trans_32_transpose_addr
169ulbl1:
170    add         r14,r14,pc
171    vld1.16     {d0,d1,d2,d3},[r14]!
172    vld1.16     {d4,d5,d6,d7},[r14]!
173
174@registers which are free
175@  r10,r9,r11,r12
176    mov         r9,#0xffffff00
177    mov         r10,#0xfffffff0
178    ldr         r5,r5_addr
179    ldr         r7,r9_addr
180    cmp         r12,r10
181    movhs       r14,#1
182    bhs         stage1
183
184
185    cmp         r12,r9
186    movhs       r14,#2
187    bhs         stage1
188
189    cmp         r12,r5
190    movhs       r14,#3
191    bhs         stage1
192
193    cmp         r12,r7
194    movhs       r14,#4
195
196    mov         r14,#8
197    b           stage1
198@.ltorg
199
200
201dct_stage1:
202    add         r8,r8,#8
203    mov         r0,r8
204
205stage1:
206    vld1.16     d10,[r0],r6
207    vld1.16     d8,[r0],r6
208    vld1.16     d11,[r0],r6
209    vld1.16     d9,[r0],r6
210
211    vmull.s16   q12,d8,d0[1]                @// y1 * cos1(part of b0)
212    vmull.s16   q13,d8,d0[3]                @// y1 * cos3(part of b1)
213    vmull.s16   q14,d8,d1[1]                @// y1 * sin3(part of b2)
214    vmull.s16   q15,d8,d1[3]                @// y1 * sin1(part of b3)
215
216    vmlal.s16   q12,d9,d0[3]                @// y1 * cos1 + y3 * cos3(part of b0)
217    vmlal.s16   q13,d9,d2[1]                @// y1 * cos3 - y3 * sin1(part of b1)
218    vmlal.s16   q14,d9,d3[3]                @// y1 * sin3 - y3 * cos1(part of b2)
219    vmlal.s16   q15,d9,d5[1]                @// y1 * sin1 - y3 * sin3(part of b3)
220
221
222
223
224
225    vmull.s16   q10,d10,d0[0]
226    vmlal.s16   q10,d11,d0[2]
227
228
229    vmull.s16   q11,d10,d0[0]
230    vmlal.s16   q11,d11,d1[2]
231
232    vmull.s16   q8,d10,d0[0]
233    vmlal.s16   q8,d11,d2[2]
234
235    vmull.s16   q9,d10,d0[0]
236    vmlal.s16   q9,d11,d3[2]
237    cmp         r11,r10
238    bhs         shift1
239
240    vld1.16     d12,[r0],r6
241    vld1.16     d14,[r0],r6
242    vld1.16     d13,[r0],r6
243    vld1.16     d15,[r0],r6
244
245
246
247
248
249
250
251    vmlal.s16   q12,d14,d1[1]
252    vmlal.s16   q13,d14,d3[3]
253    vmlal.s16   q14,d14,d6[1]
254    vmlsl.s16   q15,d14,d7[1]
255
256
257    vmlal.s16   q12,d15,d1[3]
258    vmlal.s16   q13,d15,d5[1]
259    vmlsl.s16   q14,d15,d7[1]
260    vmlsl.s16   q15,d15,d3[3]
261
262
263    vmlal.s16   q10,d12,d1[0]
264    vmlal.s16   q10,d13,d1[2]
265    vmlal.s16   q11,d12,d3[0]
266    vmlal.s16   q11,d13,d4[2]
267    vmlal.s16   q8,d12,d5[0]
268    vmlal.s16   q8,d13,d7[2]
269    vmlal.s16   q9,d12,d7[0]
270    vmlsl.s16   q9,d13,d5[2]
271
272    cmp         r11,r9
273    bhs         shift1
274
275    vld1.16     d10,[r0],r6
276    vld1.16     d8,[r0],r6
277    vld1.16     d11,[r0],r6
278    vld1.16     d9,[r0],r6
279
280
281    vmlal.s16   q12,d8,d2[1]                @// y1 * cos1(part of b0)
282    vmlal.s16   q13,d8,d6[3]                @// y1 * cos3(part of b1)
283    vmlsl.s16   q14,d8,d4[3]                @// y1 * sin3(part of b2)
284    vmlsl.s16   q15,d8,d0[1]                @// y1 * sin1(part of b3)
285
286    vmlal.s16   q12,d9,d2[3]                @// y1 * cos1 + y3 * cos3(part of b0)
287    vmlsl.s16   q13,d9,d7[3]                @// y1 * cos3 - y3 * sin1(part of b1)
288    vmlsl.s16   q14,d9,d2[1]                @// y1 * sin3 - y3 * cos1(part of b2)
289    vmlsl.s16   q15,d9,d3[1]                @// y1 * sin1 - y3 * sin3(part of b3)
290
291
292
293
294
295    vmlal.s16   q10,d10,d2[0]
296    vmlal.s16   q10,d11,d2[2]
297
298
299    vmlal.s16   q11,d10,d6[0]
300    vmlal.s16   q11,d11,d7[2]
301
302    vmlsl.s16   q8,d10,d6[0]
303    vmlsl.s16   q8,d11,d3[2]
304
305    vmlsl.s16   q9,d10,d2[0]
306    vmlsl.s16   q9,d11,d1[2]
307
308    cmp         r11,r5
309    bhs         shift1
310
311
312    vld1.16     d12,[r0],r6
313    vld1.16     d14,[r0],r6
314    vld1.16     d13,[r0],r6
315    vld1.16     d15,[r0],r6
316
317
318
319
320
321
322
323
324
325    vmlal.s16   q12,d14,d3[1]
326    vmlsl.s16   q13,d14,d6[1]
327    vmlsl.s16   q14,d14,d0[1]
328    vmlsl.s16   q15,d14,d6[3]
329
330
331    vmlal.s16   q12,d15,d3[3]
332    vmlsl.s16   q13,d15,d4[3]
333    vmlsl.s16   q14,d15,d2[3]
334    vmlal.s16   q15,d15,d5[3]
335
336
337    vmlal.s16   q10,d12,d3[0]
338    vmlal.s16   q10,d13,d3[2]
339    vmlsl.s16   q11,d12,d7[0]
340    vmlsl.s16   q11,d13,d5[2]
341    vmlsl.s16   q8,d12,d1[0]
342    vmlsl.s16   q8,d13,d1[2]
343    vmlsl.s16   q9,d12,d5[0]
344    vmlal.s16   q9,d13,d7[2]
345
346    cmp         r11,r7
347    bhs         shift1
348
349
350    vld1.16     d10,[r0],r6
351    vld1.16     d8,[r0],r6
352    vld1.16     d11,[r0],r6
353    vld1.16     d9,[r0],r6
354
355
356
357    vmlal.s16   q12,d8,d4[1]                @// y1 * cos1(part of b0)
358    vmlsl.s16   q13,d8,d3[1]                @// y1 * cos3(part of b1)
359    vmlsl.s16   q14,d8,d5[1]                @// y1 * sin3(part of b2)
360    vmlal.s16   q15,d8,d2[1]                @// y1 * sin1(part of b3)
361
362    vmlal.s16   q12,d9,d4[3]                @// y1 * cos1 + y3 * cos3(part of b0)
363    vmlsl.s16   q13,d9,d1[3]                @// y1 * cos3 - y3 * sin1(part of b1)
364    vmlsl.s16   q14,d9,d7[3]                @// y1 * sin3 - y3 * cos1(part of b2)
365    vmlal.s16   q15,d9,d1[1]                @// y1 * sin1 - y3 * sin3(part of b3)
366
367
368
369
370
371    vmlal.s16   q10,d10,d0[0]
372    vmlal.s16   q10,d11,d4[2]
373
374
375    vmlsl.s16   q11,d10,d0[0]
376    vmlsl.s16   q11,d11,d2[2]
377
378    vmlsl.s16   q8,d10,d0[0]
379    vmlsl.s16   q8,d11,d6[2]
380
381    vmlal.s16   q9,d10,d0[0]
382    vmlal.s16   q9,d11,d0[2]
383
384
385
386    vld1.16     d12,[r0],r6
387    vld1.16     d14,[r0],r6
388    vld1.16     d13,[r0],r6
389    vld1.16     d15,[r0],r6
390
391
392
393
394    vmlal.s16   q12,d14,d5[1]
395    vmlsl.s16   q13,d14,d0[2]
396    vmlal.s16   q14,d14,d5[3]
397    vmlal.s16   q15,d14,d4[3]
398
399
400    vmlal.s16   q12,d15,d5[3]
401    vmlsl.s16   q13,d15,d1[1]
402    vmlal.s16   q14,d15,d3[1]
403    vmlsl.s16   q15,d15,d7[3]
404
405
406    vmlal.s16   q10,d12,d5[0]
407    vmlal.s16   q10,d13,d5[2]
408    vmlsl.s16   q11,d12,d1[0]
409    vmlsl.s16   q11,d13,d0[2]
410    vmlal.s16   q8,d12,d7[0]
411    vmlal.s16   q8,d13,d4[2]
412    vmlal.s16   q9,d12,d3[0]
413    vmlal.s16   q9,d13,d6[2]
414
415
416    vld1.16     d10,[r0],r6
417    vld1.16     d8,[r0],r6
418    vld1.16     d11,[r0],r6
419    vld1.16     d9,[r0],r6
420
421
422
423
424
425
426
427    vmlal.s16   q12,d8,d6[1]                @// y1 * cos1(part of b0)
428    vmlsl.s16   q13,d8,d2[3]                @// y1 * cos3(part of b1)
429    vmlal.s16   q14,d8,d0[1]                @// y1 * sin3(part of b2)
430    vmlsl.s16   q15,d8,d4[1]                @// y1 * sin1(part of b3)
431
432    vmlal.s16   q12,d9,d6[3]                @// y1 * cos1 + y3 * cos3(part of b0)
433    vmlsl.s16   q13,d9,d4[1]                @// y1 * cos3 - y3 * sin1(part of b1)
434    vmlal.s16   q14,d9,d1[3]                @// y1 * sin3 - y3 * cos1(part of b2)
435    vmlsl.s16   q15,d9,d0[1]                @// y1 * sin1 - y3 * sin3(part of b3)
436
437
438
439
440
441    vmlal.s16   q10,d10,d6[0]
442    vmlal.s16   q10,d11,d6[2]
443
444
445    vmlsl.s16   q11,d10,d2[0]
446    vmlsl.s16   q11,d11,d3[2]
447
448    vmlal.s16   q8,d10,d2[0]
449    vmlal.s16   q8,d11,d0[2]
450
451    vmlsl.s16   q9,d10,d6[0]
452    vmlsl.s16   q9,d11,d2[2]
453
454    vld1.16     d12,[r0],r6
455    vld1.16     d14,[r0],r6
456    vld1.16     d13,[r0],r6
457    vld1.16     d15,[r0],r6
458
459
460    vmlal.s16   q12,d14,d7[1]
461    vmlsl.s16   q13,d14,d5[3]
462    vmlal.s16   q14,d14,d4[1]
463    vmlsl.s16   q15,d14,d2[3]
464
465
466    vmlal.s16   q12,d15,d7[3]
467    vmlsl.s16   q13,d15,d7[1]
468    vmlal.s16   q14,d15,d6[3]
469    vmlsl.s16   q15,d15,d6[1]
470
471
472    vmlal.s16   q10,d12,d7[0]
473    vmlal.s16   q10,d13,d7[2]
474    vmlsl.s16   q11,d12,d5[0]
475    vmlsl.s16   q11,d13,d6[2]
476    vmlal.s16   q8,d12,d3[0]
477    vmlal.s16   q8,d13,d5[2]
478    vmlsl.s16   q9,d12,d1[0]
479    vmlsl.s16   q9,d13,d4[2]
480
481
482
483shift1:
484    vadd.s32    q4,q10,q12
485    vsub.s32    q5,q10,q12
486
487    vadd.s32    q6,q11,q13
488    vsub.s32    q12,q11,q13
489
490    vadd.s32    q7,q8,q14
491    vsub.s32    q13,q8,q14
492
493
494    vadd.s32    q8,q9,q15
495    vsub.s32    q14,q9,q15
496
497
498    vqrshrn.s32 d30,q4,#shift_stage1_idct   @// r0 = (a0 + b0 + rnd) >> 7(shift_stage1_idct)
499    vqrshrn.s32 d19,q5,#shift_stage1_idct   @// r7 = (a0 - b0 + rnd) >> 7(shift_stage1_idct)
500    vqrshrn.s32 d31,q7,#shift_stage1_idct   @// r2 = (a2 + b2 + rnd) >> 7(shift_stage1_idct)
501    vqrshrn.s32 d18,q13,#shift_stage1_idct  @// r5 = (a2 - b2 + rnd) >> 7(shift_stage1_idct)
502    vqrshrn.s32 d12,q6,#shift_stage1_idct   @// r1 = (a1 + b1 + rnd) >> 7(shift_stage1_idct)
503    vqrshrn.s32 d15,q12,#shift_stage1_idct  @// r6 = (a1 - b1 + rnd) >> 7(shift_stage1_idct)
504    vqrshrn.s32 d13,q8,#shift_stage1_idct   @// r3 = (a3 + b3 + rnd) >> 7(shift_stage1_idct)
505    vqrshrn.s32 d14,q14,#shift_stage1_idct  @// r4 = (a3 - b3 + rnd) >> 7(shift_stage1_idct)
506
507
508    @ registers used q15,q14,q6,q7
509
510
511    vtrn.16     q15,q6
512    vtrn.16     q7,q9
513
514    vtrn.32     d30,d31
515    vtrn.32     d12,d13
516    vtrn.32     d14,d15
517    vtrn.32     d18,d19
518
519
520@ d30 =r0 1- 4 values
521@ d31 =r2 1- 4 values
522@ d12=r1 1- 4 values
523@ d13=r3 1- 4 values
524@ d14 =r0 28-31 values
525@ d15 =r2 28- 31 values
526@ d18=r1 28- 31 values
527@ d19=r3 28- 31 values
528
529
530
531    vst1.16     {q15},[r1]!
532    vst1.16     {q6},[r1]!
533    add         r1,r1,#192
534    vst1.16     {q7},[r1]!
535    vst1.16     {q9},[r1]!
536    sub         r1,r1,#224
537
538    mov         r0,r8
539
540
541
542
543
544    vld1.16     d10,[r0],r6
545    vld1.16     d8,[r0],r6
546    vld1.16     d11,[r0],r6
547    vld1.16     d9,[r0],r6
548
549
550
551
552    vmull.s16   q12,d8,d2[1]                @// y1 * cos1(part of b0)
553    vmull.s16   q13,d8,d2[3]                @// y1 * cos3(part of b1)
554    vmull.s16   q14,d8,d3[1]                @// y1 * sin3(part of b2)
555    vmull.s16   q15,d8,d3[3]                @// y1 * sin1(part of b3)
556
557    vmlal.s16   q12,d9,d6[3]                @// y1 * cos1 + y3 * cos3(part of b0)
558    vmlsl.s16   q13,d9,d7[3]                @// y1 * cos3 - y3 * sin1(part of b1)
559    vmlsl.s16   q14,d9,d6[1]                @// y1 * sin3 - y3 * cos1(part of b2)
560    vmlsl.s16   q15,d9,d4[3]                @// y1 * sin1 - y3 * sin3(part of b3)
561
562
563
564
565
566    vmull.s16   q10,d10,d0[0]
567    vmlal.s16   q10,d11,d4[2]
568
569
570    vmull.s16   q11,d10,d0[0]
571    vmlal.s16   q11,d11,d5[2]
572
573    vmull.s16   q8,d10,d0[0]
574    vmlal.s16   q8,d11,d6[2]
575
576    vmull.s16   q9,d10,d0[0]
577    vmlal.s16   q9,d11,d7[2]
578    cmp         r11,r10
579    bhs         shift2
580
581    vld1.16     d12,[r0],r6
582    vld1.16     d14,[r0],r6
583    vld1.16     d13,[r0],r6
584    vld1.16     d15,[r0],r6
585
586
587    vmlsl.s16   q12,d14,d4[3]
588    vmlsl.s16   q13,d14,d2[1]
589    vmlsl.s16   q14,d14,d0[1]
590    vmlsl.s16   q15,d14,d2[3]
591
592
593    vmlsl.s16   q12,d15,d0[3]
594    vmlsl.s16   q13,d15,d3[1]
595    vmlsl.s16   q14,d15,d6[3]
596    vmlal.s16   q15,d15,d5[3]
597
598
599    vmlsl.s16   q10,d12,d7[0]
600    vmlsl.s16   q10,d13,d2[2]
601    vmlsl.s16   q11,d12,d5[0]
602    vmlsl.s16   q11,d13,d0[2]
603    vmlsl.s16   q8,d12,d3[0]
604    vmlsl.s16   q8,d13,d3[2]
605    vmlsl.s16   q9,d12,d1[0]
606    vmlsl.s16   q9,d13,d6[2]
607
608    cmp         r11,r9
609    bhs         shift2
610
611
612    vld1.16     d10,[r0],r6
613    vld1.16     d8,[r0],r6
614    vld1.16     d11,[r0],r6
615    vld1.16     d9,[r0],r6
616
617
618
619
620
621
622
623    vmlsl.s16   q12,d8,d4[1]                @// y1 * cos1(part of b0)
624    vmlal.s16   q13,d8,d7[1]                @// y1 * cos3(part of b1)
625    vmlal.s16   q14,d8,d2[3]                @// y1 * sin3(part of b2)
626    vmlal.s16   q15,d8,d1[3]                @// y1 * sin1(part of b3)
627
628    vmlal.s16   q12,d9,d7[1]                @// y1 * cos1 + y3 * cos3(part of b0)
629    vmlal.s16   q13,d9,d1[3]                @// y1 * cos3 - y3 * sin1(part of b1)
630    vmlal.s16   q14,d9,d3[3]                @// y1 * sin3 - y3 * cos1(part of b2)
631    vmlsl.s16   q15,d9,d6[3]                @// y1 * sin1 - y3 * sin3(part of b3)
632
633
634
635
636
637    vmlsl.s16   q10,d10,d2[0]
638    vmlsl.s16   q10,d11,d6[2]
639
640
641    vmlsl.s16   q11,d10,d6[0]
642    vmlal.s16   q11,d11,d4[2]
643
644    vmlal.s16   q8,d10,d6[0]
645    vmlal.s16   q8,d11,d0[2]
646
647    vmlal.s16   q9,d10,d2[0]
648    vmlal.s16   q9,d11,d5[2]
649
650    cmp         r11,r5
651    bhs         shift2
652
653
654    vld1.16     d12,[r0],r6
655    vld1.16     d14,[r0],r6
656    vld1.16     d13,[r0],r6
657    vld1.16     d15,[r0],r6
658
659
660
661
662
663    vmlal.s16   q12,d14,d2[3]
664    vmlal.s16   q13,d14,d3[3]
665    vmlsl.s16   q14,d14,d5[3]
666    vmlsl.s16   q15,d14,d0[3]
667
668
669    vmlal.s16   q12,d15,d1[3]
670    vmlsl.s16   q13,d15,d6[3]
671    vmlsl.s16   q14,d15,d0[3]
672    vmlal.s16   q15,d15,d7[3]
673
674
675    vmlal.s16   q10,d12,d5[0]
676    vmlal.s16   q10,d13,d0[2]
677    vmlal.s16   q11,d12,d1[0]
678    vmlal.s16   q11,d13,d6[2]
679    vmlal.s16   q8,d12,d7[0]
680    vmlsl.s16   q8,d13,d2[2]
681    vmlsl.s16   q9,d12,d3[0]
682    vmlsl.s16   q9,d13,d4[2]
683
684
685    cmp         r11,r7
686    bhs         shift2
687
688
689    vld1.16     d10,[r0],r6
690    vld1.16     d8,[r0],r6
691    vld1.16     d11,[r0],r6
692    vld1.16     d9,[r0],r6
693
694
695
696
697
698
699
700    vmlal.s16   q12,d8,d6[1]                @// y1 * cos1(part of b0)
701    vmlsl.s16   q13,d8,d1[1]                @// y1 * cos3(part of b1)
702    vmlsl.s16   q14,d8,d7[1]                @// y1 * sin3(part of b2)
703    vmlal.s16   q15,d8,d0[3]                @// y1 * sin1(part of b3)
704
705    vmlsl.s16   q12,d9,d5[1]                @// y1 * cos1 + y3 * cos3(part of b0)
706    vmlsl.s16   q13,d9,d4[1]                @// y1 * cos3 - y3 * sin1(part of b1)
707    vmlal.s16   q14,d9,d2[1]                @// y1 * sin3 - y3 * cos1(part of b2)
708    vmlal.s16   q15,d9,d7[1]                @// y1 * sin1 - y3 * sin3(part of b3)
709
710
711
712
713
714    vmlal.s16   q10,d10,d0[0]
715    vmlsl.s16   q10,d11,d7[2]
716
717
718    vmlsl.s16   q11,d10,d0[0]
719    vmlsl.s16   q11,d11,d1[2]
720
721    vmlsl.s16   q8,d10,d0[0]
722    vmlal.s16   q8,d11,d5[2]
723
724    vmlal.s16   q9,d10,d0[0]
725    vmlal.s16   q9,d11,d3[2]
726
727
728
729    vld1.16     d12,[r0],r6
730    vld1.16     d14,[r0],r6
731    vld1.16     d13,[r0],r6
732    vld1.16     d15,[r0],r6
733
734
735    vmlsl.s16   q12,d14,d0[1]
736    vmlal.s16   q13,d14,d6[1]
737    vmlal.s16   q14,d14,d4[1]
738    vmlsl.s16   q15,d14,d1[1]
739
740
741    vmlsl.s16   q12,d15,d3[3]
742    vmlal.s16   q13,d15,d0[1]
743    vmlsl.s16   q14,d15,d5[1]
744    vmlsl.s16   q15,d15,d6[1]
745
746
747    vmlsl.s16   q10,d12,d3[0]
748    vmlsl.s16   q10,d13,d1[2]
749    vmlsl.s16   q11,d12,d7[0]
750    vmlal.s16   q11,d13,d3[2]
751    vmlal.s16   q8,d12,d1[0]
752    vmlal.s16   q8,d13,d7[2]
753    vmlsl.s16   q9,d12,d5[0]
754    vmlsl.s16   q9,d13,d2[2]
755
756    vld1.16     d10,[r0],r6
757    vld1.16     d8,[r0],r6
758    vld1.16     d11,[r0],r6
759    vld1.16     d9,[r0],r6
760
761
762
763
764    vmlal.s16   q12,d8,d7[3]                @// y1 * cos1(part of b0)
765    vmlal.s16   q13,d8,d4[3]                @// y1 * cos3(part of b1)
766    vmlsl.s16   q14,d8,d1[1]                @// y1 * sin3(part of b2)
767    vmlal.s16   q15,d8,d2[1]                @// y1 * sin1(part of b3)
768
769    vmlal.s16   q12,d9,d3[1]                @// y1 * cos1 + y3 * cos3(part of b0)
770    vmlsl.s16   q13,d9,d5[3]                @// y1 * cos3 - y3 * sin1(part of b1)
771    vmlsl.s16   q14,d9,d7[3]                @// y1 * sin3 - y3 * cos1(part of b2)
772    vmlal.s16   q15,d9,d5[1]                @// y1 * sin1 - y3 * sin3(part of b3)
773
774
775
776
777
778    vmlsl.s16   q10,d10,d6[0]
779    vmlal.s16   q10,d11,d5[2]
780
781
782    vmlal.s16   q11,d10,d2[0]
783    vmlal.s16   q11,d11,d7[2]
784
785    vmlsl.s16   q8,d10,d2[0]
786    vmlsl.s16   q8,d11,d4[2]
787
788    vmlal.s16   q9,d10,d6[0]
789    vmlal.s16   q9,d11,d1[2]
790
791
792    vld1.16     d12,[r0],r6
793    vld1.16     d14,[r0],r6
794    vld1.16     d13,[r0],r6
795    vld1.16     d15,[r0],r6
796
797
798
799
800
801    vmlal.s16   q12,d14,d1[1]
802    vmlsl.s16   q13,d14,d0[3]
803    vmlal.s16   q14,d14,d1[3]
804    vmlsl.s16   q15,d14,d3[1]
805
806
807    vmlal.s16   q12,d15,d5[3]
808    vmlsl.s16   q13,d15,d5[1]
809    vmlal.s16   q14,d15,d4[3]
810    vmlsl.s16   q15,d15,d4[1]
811
812
813    vmlal.s16   q10,d12,d1[0]
814    vmlal.s16   q10,d13,d3[2]
815    vmlsl.s16   q11,d12,d3[0]
816    vmlsl.s16   q11,d13,d2[2]
817    vmlal.s16   q8,d12,d5[0]
818    vmlal.s16   q8,d13,d1[2]
819    vmlsl.s16   q9,d12,d7[0]
820    vmlsl.s16   q9,d13,d0[2]
821
822shift2:
823    vadd.s32    q4,q10,q12
824    vsub.s32    q5,q10,q12
825
826    vadd.s32    q6,q11,q13
827    vsub.s32    q12,q11,q13
828
829    vadd.s32    q7,q8,q14
830    vsub.s32    q13,q8,q14
831
832
833    vadd.s32    q8,q9,q15
834    vsub.s32    q14,q9,q15
835
836
837    vqrshrn.s32 d30,q4,#shift_stage1_idct   @// r0 = (a0 + b0 + rnd) >> 7(shift_stage1_idct)
838    vqrshrn.s32 d19,q5,#shift_stage1_idct   @// r7 = (a0 - b0 + rnd) >> 7(shift_stage1_idct)
839    vqrshrn.s32 d31,q7,#shift_stage1_idct   @// r2 = (a2 + b2 + rnd) >> 7(shift_stage1_idct)
840    vqrshrn.s32 d18,q13,#shift_stage1_idct  @// r5 = (a2 - b2 + rnd) >> 7(shift_stage1_idct)
841    vqrshrn.s32 d12,q6,#shift_stage1_idct   @// r1 = (a1 + b1 + rnd) >> 7(shift_stage1_idct)
842    vqrshrn.s32 d15,q12,#shift_stage1_idct  @// r6 = (a1 - b1 + rnd) >> 7(shift_stage1_idct)
843    vqrshrn.s32 d13,q8,#shift_stage1_idct   @// r3 = (a3 + b3 + rnd) >> 7(shift_stage1_idct)
844    vqrshrn.s32 d14,q14,#shift_stage1_idct  @// r4 = (a3 - b3 + rnd) >> 7(shift_stage1_idct)
845
846    vtrn.16     q15,q6
847    vtrn.16     q7,q9
848
849    vtrn.32     d30,d31
850    vtrn.32     d12,d13
851    vtrn.32     d14,d15
852    vtrn.32     d18,d19
853
854
855    vst1.16     {q15},[r1]!
856    vst1.16     {q6},[r1]!
857    add         r1,r1,#128
858    vst1.16     {q7},[r1]!
859    vst1.16     {q9},[r1]!
860    sub         r1,r1,#160
861    mov         r0,r8
862
863
864
865    vld1.16     d10,[r0],r6
866    vld1.16     d8,[r0],r6
867    vld1.16     d11,[r0],r6
868    vld1.16     d9,[r0],r6
869
870
871    vmull.s16   q12,d8,d4[1]                @// y1 * cos1(part of b0)
872    vmull.s16   q13,d8,d4[3]                @// y1 * cos3(part of b1)
873    vmull.s16   q14,d8,d5[1]                @// y1 * sin3(part of b2)
874    vmull.s16   q15,d8,d5[3]                @// y1 * sin1(part of b3)
875
876    vmlsl.s16   q12,d9,d3[1]                @// y1 * cos1 + y3 * cos3(part of b0)
877    vmlsl.s16   q13,d9,d1[3]                @// y1 * cos3 - y3 * sin1(part of b1)
878    vmlsl.s16   q14,d9,d0[2]                @// y1 * sin3 - y3 * cos1(part of b2)
879    vmlsl.s16   q15,d9,d1[1]                @// y1 * sin1 - y3 * sin3(part of b3)
880
881
882
883
884
885    vmull.s16   q10,d10,d0[0]
886    vmlsl.s16   q10,d11,d7[2]
887
888
889    vmull.s16   q11,d10,d0[0]
890    vmlsl.s16   q11,d11,d6[2]
891
892    vmull.s16   q8,d10,d0[0]
893    vmlsl.s16   q8,d11,d5[2]
894
895    vmull.s16   q9,d10,d0[0]
896    vmlsl.s16   q9,d11,d4[2]
897
898    cmp         r11,r10
899    bhs         shift3
900
901    vld1.16     d12,[r0],r6
902    vld1.16     d14,[r0],r6
903    vld1.16     d13,[r0],r6
904    vld1.16     d15,[r0],r6
905
906
907
908
909    vmlsl.s16   q12,d14,d5[1]
910    vmlsl.s16   q13,d14,d7[3]
911    vmlal.s16   q14,d14,d5[3]
912    vmlal.s16   q15,d14,d3[1]
913
914
915    vmlal.s16   q12,d15,d2[1]
916    vmlal.s16   q13,d15,d1[1]
917    vmlal.s16   q14,d15,d4[3]
918    vmlsl.s16   q15,d15,d7[3]
919
920
921    vmlsl.s16   q10,d12,d1[0]
922    vmlal.s16   q10,d13,d6[2]
923    vmlsl.s16   q11,d12,d3[0]
924    vmlal.s16   q11,d13,d3[2]
925    vmlsl.s16   q8,d12,d5[0]
926    vmlal.s16   q8,d13,d0[2]
927    vmlsl.s16   q9,d12,d7[0]
928    vmlal.s16   q9,d13,d2[2]
929
930    cmp         r11,r9
931    bhs         shift3
932
933    vld1.16     d10,[r0],r6
934    vld1.16     d8,[r0],r6
935    vld1.16     d11,[r0],r6
936    vld1.16     d9,[r0],r6
937
938    vmlal.s16   q12,d8,d6[1]                @// y1 * cos1(part of b0)
939    vmlsl.s16   q13,d8,d5[1]                @// y1 * cos3(part of b1)
940    vmlsl.s16   q14,d8,d0[3]                @// y1 * sin3(part of b2)
941    vmlsl.s16   q15,d8,d3[3]                @// y1 * sin1(part of b3)
942
943    vmlsl.s16   q12,d9,d1[1]                @// y1 * cos1 + y3 * cos3(part of b0)
944    vmlsl.s16   q13,d9,d4[1]                @// y1 * cos3 - y3 * sin1(part of b1)
945    vmlal.s16   q14,d9,d6[1]                @// y1 * sin3 - y3 * cos1(part of b2)
946    vmlal.s16   q15,d9,d0[1]                @// y1 * sin1 - y3 * sin3(part of b3)
947
948
949
950
951
952    vmlal.s16   q10,d10,d2[0]
953    vmlsl.s16   q10,d11,d5[2]
954
955
956    vmlal.s16   q11,d10,d6[0]
957    vmlsl.s16   q11,d11,d0[2]
958
959    vmlsl.s16   q8,d10,d6[0]
960    vmlsl.s16   q8,d11,d4[2]
961
962    vmlsl.s16   q9,d10,d2[0]
963    vmlal.s16   q9,d11,d6[2]
964
965    cmp         r11,r5
966    bhs         shift3
967
968
969    vld1.16     d12,[r0],r6
970    vld1.16     d14,[r0],r6
971    vld1.16     d13,[r0],r6
972    vld1.16     d15,[r0],r6
973
974
975
976
977
978
979    vmlsl.s16   q12,d14,d7[1]
980    vmlal.s16   q13,d14,d2[1]
981    vmlal.s16   q14,d14,d4[1]
982    vmlsl.s16   q15,d14,d5[1]
983
984
985    vmlal.s16   q12,d15,d0[3]
986    vmlal.s16   q13,d15,d7[1]
987    vmlsl.s16   q14,d15,d1[1]
988    vmlsl.s16   q15,d15,d6[1]
989
990
991    vmlsl.s16   q10,d12,d3[0]
992    vmlal.s16   q10,d13,d4[2]
993    vmlal.s16   q11,d12,d7[0]
994    vmlal.s16   q11,d13,d2[2]
995    vmlal.s16   q8,d12,d1[0]
996    vmlsl.s16   q8,d13,d6[2]
997    vmlal.s16   q9,d12,d5[0]
998    vmlsl.s16   q9,d13,d0[2]
999
1000
1001    cmp         r11,r7
1002    bhs         shift3
1003
1004
1005    vld1.16     d10,[r0],r6
1006    vld1.16     d8,[r0],r6
1007    vld1.16     d11,[r0],r6
1008    vld1.16     d9,[r0],r6
1009
1010
1011    vmlsl.s16   q12,d8,d7[3]                @// y1 * cos1(part of b0)
1012    vmlsl.s16   q13,d8,d0[1]                @// y1 * cos3(part of b1)
1013    vmlal.s16   q14,d8,d6[3]                @// y1 * sin3(part of b2)
1014    vmlal.s16   q15,d8,d1[3]                @// y1 * sin1(part of b3)
1015
1016    vmlsl.s16   q12,d9,d0[1]                @// y1 * cos1 + y3 * cos3(part of b0)
1017    vmlal.s16   q13,d9,d5[3]                @// y1 * cos3 - y3 * sin1(part of b1)
1018    vmlal.s16   q14,d9,d3[3]                @// y1 * sin3 - y3 * cos1(part of b2)
1019    vmlsl.s16   q15,d9,d2[3]                @// y1 * sin1 - y3 * sin3(part of b3)
1020
1021
1022
1023
1024
1025    vmlal.s16   q10,d10,d0[0]
1026    vmlsl.s16   q10,d11,d3[2]
1027
1028
1029    vmlsl.s16   q11,d10,d0[0]
1030    vmlsl.s16   q11,d11,d5[2]
1031
1032    vmlsl.s16   q8,d10,d0[0]
1033    vmlal.s16   q8,d11,d1[2]
1034
1035    vmlal.s16   q9,d10,d0[0]
1036    vmlal.s16   q9,d11,d7[2]
1037
1038
1039    vld1.16     d12,[r0],r6
1040    vld1.16     d14,[r0],r6
1041    vld1.16     d13,[r0],r6
1042    vld1.16     d15,[r0],r6
1043
1044
1045
1046    vmlal.s16   q12,d14,d6[3]
1047    vmlal.s16   q13,d14,d3[3]
1048    vmlsl.s16   q14,d14,d1[3]
1049    vmlal.s16   q15,d14,d7[1]
1050
1051
1052    vmlal.s16   q12,d15,d1[3]
1053    vmlsl.s16   q13,d15,d2[3]
1054    vmlal.s16   q14,d15,d7[1]
1055    vmlal.s16   q15,d15,d4[1]
1056
1057
1058    vmlsl.s16   q10,d12,d5[0]
1059    vmlal.s16   q10,d13,d2[2]
1060    vmlal.s16   q11,d12,d1[0]
1061    vmlsl.s16   q11,d13,d7[2]
1062    vmlsl.s16   q8,d12,d7[0]
1063    vmlsl.s16   q8,d13,d3[2]
1064    vmlsl.s16   q9,d12,d3[0]
1065    vmlal.s16   q9,d13,d1[2]
1066
1067
1068
1069    vld1.16     d10,[r0],r6
1070    vld1.16     d8,[r0],r6
1071    vld1.16     d11,[r0],r6
1072    vld1.16     d9,[r0],r6
1073
1074
1075
1076
1077    vmlsl.s16   q12,d8,d5[3]                @// y1 * cos1(part of b0)
1078    vmlsl.s16   q13,d8,d6[3]                @// y1 * cos3(part of b1)
1079    vmlal.s16   q14,d8,d3[1]                @// y1 * sin3(part of b2)
1080    vmlsl.s16   q15,d8,d0[1]                @// y1 * sin1(part of b3)
1081
1082    vmlsl.s16   q12,d9,d2[3]                @// y1 * cos1 + y3 * cos3(part of b0)
1083    vmlal.s16   q13,d9,d0[1]                @// y1 * cos3 - y3 * sin1(part of b1)
1084    vmlsl.s16   q14,d9,d2[1]                @// y1 * sin3 - y3 * cos1(part of b2)
1085    vmlal.s16   q15,d9,d4[3]                @// y1 * sin1 - y3 * sin3(part of b3)
1086
1087
1088
1089
1090
1091    vmlal.s16   q10,d10,d6[0]
1092    vmlsl.s16   q10,d11,d1[2]
1093
1094
1095    vmlsl.s16   q11,d10,d2[0]
1096    vmlal.s16   q11,d11,d4[2]
1097
1098    vmlal.s16   q8,d10,d2[0]
1099    vmlsl.s16   q8,d11,d7[2]
1100
1101    vmlsl.s16   q9,d10,d6[0]
1102    vmlsl.s16   q9,d11,d5[2]
1103
1104
1105    vld1.16     d12,[r0],r6
1106    vld1.16     d14,[r0],r6
1107    vld1.16     d13,[r0],r6
1108    vld1.16     d15,[r0],r6
1109
1110    vmlal.s16   q12,d14,d4[3]
1111    vmlsl.s16   q13,d14,d6[1]
1112    vmlal.s16   q14,d14,d7[3]
1113    vmlal.s16   q15,d14,d6[3]
1114
1115
1116    vmlal.s16   q12,d15,d3[3]
1117    vmlsl.s16   q13,d15,d3[1]
1118    vmlal.s16   q14,d15,d2[3]
1119    vmlsl.s16   q15,d15,d2[1]
1120
1121
1122    vmlsl.s16   q10,d12,d7[0]
1123    vmlal.s16   q10,d13,d0[2]
1124    vmlal.s16   q11,d12,d5[0]
1125    vmlsl.s16   q11,d13,d1[2]
1126    vmlsl.s16   q8,d12,d3[0]
1127    vmlal.s16   q8,d13,d2[2]
1128    vmlal.s16   q9,d12,d1[0]
1129    vmlsl.s16   q9,d13,d3[2]
1130
1131shift3:
1132    vadd.s32    q4,q10,q12
1133    vsub.s32    q5,q10,q12
1134
1135    vadd.s32    q6,q11,q13
1136    vsub.s32    q12,q11,q13
1137
1138    vadd.s32    q7,q8,q14
1139    vsub.s32    q13,q8,q14
1140
1141
1142    vadd.s32    q8,q9,q15
1143    vsub.s32    q14,q9,q15
1144
1145
1146    vqrshrn.s32 d30,q4,#shift_stage1_idct   @// r0 = (a0 + b0 + rnd) >> 7(shift_stage1_idct)
1147    vqrshrn.s32 d19,q5,#shift_stage1_idct   @// r7 = (a0 - b0 + rnd) >> 7(shift_stage1_idct)
1148    vqrshrn.s32 d31,q7,#shift_stage1_idct   @// r2 = (a2 + b2 + rnd) >> 7(shift_stage1_idct)
1149    vqrshrn.s32 d18,q13,#shift_stage1_idct  @// r5 = (a2 - b2 + rnd) >> 7(shift_stage1_idct)
1150    vqrshrn.s32 d12,q6,#shift_stage1_idct   @// r1 = (a1 + b1 + rnd) >> 7(shift_stage1_idct)
1151    vqrshrn.s32 d15,q12,#shift_stage1_idct  @// r6 = (a1 - b1 + rnd) >> 7(shift_stage1_idct)
1152    vqrshrn.s32 d13,q8,#shift_stage1_idct   @// r3 = (a3 + b3 + rnd) >> 7(shift_stage1_idct)
1153    vqrshrn.s32 d14,q14,#shift_stage1_idct  @// r4 = (a3 - b3 + rnd) >> 7(shift_stage1_idct)
1154
1155    vtrn.16     q15,q6
1156    vtrn.16     q7,q9
1157
1158    vtrn.32     d30,d31
1159    vtrn.32     d12,d13
1160    vtrn.32     d14,d15
1161    vtrn.32     d18,d19
1162
1163
1164    vst1.16     {q15},[r1]!
1165    vst1.16     {q6},[r1]!
1166    add         r1,r1,#64
1167    vst1.16     {q7},[r1]!
1168    vst1.16     {q9},[r1]!
1169    sub         r1,r1,#96
1170
1171    mov         r0,r8
1172
1173
1174
1175    vld1.16     d10,[r0],r6
1176    vld1.16     d8,[r0],r6
1177    vld1.16     d11,[r0],r6
1178    vld1.16     d9,[r0],r6
1179
1180
1181    vmull.s16   q12,d8,d6[1]                @// y1 * cos1(part of b0)
1182    vmull.s16   q13,d8,d6[3]                @// y1 * cos3(part of b1)
1183    vmull.s16   q14,d8,d7[1]                @// y1 * sin3(part of b2)
1184    vmull.s16   q15,d8,d7[3]                @// y1 * sin1(part of b3)
1185
1186    vmlsl.s16   q12,d9,d2[3]                @// y1 * cos1 + y3 * cos3(part of b0)
1187    vmlsl.s16   q13,d9,d4[1]                @// y1 * cos3 - y3 * sin1(part of b1)
1188    vmlsl.s16   q14,d9,d5[3]                @// y1 * sin3 - y3 * cos1(part of b2)
1189    vmlsl.s16   q15,d9,d7[1]                @// y1 * sin1 - y3 * sin3(part of b3)
1190
1191
1192
1193
1194
1195    vmull.s16   q10,d10,d0[0]
1196    vmlsl.s16   q10,d11,d3[2]
1197
1198
1199    vmull.s16   q11,d10,d0[0]
1200    vmlsl.s16   q11,d11,d2[2]
1201
1202    vmull.s16   q8,d10,d0[0]
1203    vmlsl.s16   q8,d11,d1[2]
1204
1205    vmull.s16   q9,d10,d0[0]
1206    vmlsl.s16   q9,d11,d0[2]
1207
1208    cmp         r11,r10
1209    bhs         shift4
1210
1211    vld1.16     d12,[r0],r6
1212    vld1.16     d14,[r0],r6
1213    vld1.16     d13,[r0],r6
1214    vld1.16     d15,[r0],r6
1215
1216
1217
1218
1219
1220
1221    vmlal.s16   q12,d14,d0[1]
1222    vmlal.s16   q13,d14,d1[3]
1223    vmlal.s16   q14,d14,d4[1]
1224    vmlal.s16   q15,d14,d6[3]
1225
1226
1227    vmlsl.s16   q12,d15,d4[1]
1228    vmlsl.s16   q13,d15,d0[3]
1229    vmlsl.s16   q14,d15,d2[3]
1230    vmlsl.s16   q15,d15,d6[1]
1231
1232
1233    vmlal.s16   q10,d12,d7[0]
1234    vmlal.s16   q10,d13,d5[2]
1235    vmlal.s16   q11,d12,d5[0]
1236    vmlsl.s16   q11,d13,d7[2]
1237    vmlal.s16   q8,d12,d3[0]
1238    vmlsl.s16   q8,d13,d4[2]
1239    vmlal.s16   q9,d12,d1[0]
1240    vmlsl.s16   q9,d13,d1[2]
1241
1242    cmp         r11,r9
1243    bhs         shift4
1244
1245    vld1.16     d10,[r0],r6
1246    vld1.16     d8,[r0],r6
1247    vld1.16     d11,[r0],r6
1248    vld1.16     d9,[r0],r6
1249
1250
1251
1252    vmlal.s16   q12,d8,d7[3]                @// y1 * cos1(part of b0)
1253    vmlal.s16   q13,d8,d3[1]                @// y1 * cos3(part of b1)
1254    vmlal.s16   q14,d8,d1[1]                @// y1 * sin3(part of b2)
1255    vmlal.s16   q15,d8,d5[3]                @// y1 * sin1(part of b3)
1256
1257    vmlal.s16   q12,d9,d4[3]                @// y1 * cos1 + y3 * cos3(part of b0)
1258    vmlsl.s16   q13,d9,d5[3]                @// y1 * cos3 - y3 * sin1(part of b1)
1259    vmlsl.s16   q14,d9,d0[1]                @// y1 * sin3 - y3 * cos1(part of b2)
1260    vmlsl.s16   q15,d9,d5[1]                @// y1 * sin1 - y3 * sin3(part of b3)
1261
1262
1263
1264
1265
1266    vmlsl.s16   q10,d10,d2[0]
1267    vmlal.s16   q10,d11,d1[2]
1268
1269
1270    vmlsl.s16   q11,d10,d6[0]
1271    vmlal.s16   q11,d11,d3[2]
1272
1273    vmlal.s16   q8,d10,d6[0]
1274    vmlsl.s16   q8,d11,d7[2]
1275
1276    vmlal.s16   q9,d10,d2[0]
1277    vmlsl.s16   q9,d11,d2[2]
1278
1279    cmp         r11,r5
1280    bhs         shift4
1281
1282
1283    vld1.16     d12,[r0],r6
1284    vld1.16     d14,[r0],r6
1285    vld1.16     d13,[r0],r6
1286    vld1.16     d15,[r0],r6
1287
1288
1289
1290
1291
1292
1293    vmlsl.s16   q12,d14,d1[1]
1294    vmlsl.s16   q13,d14,d7[3]
1295    vmlal.s16   q14,d14,d1[3]
1296    vmlal.s16   q15,d14,d4[3]
1297
1298
1299    vmlal.s16   q12,d15,d2[1]
1300    vmlal.s16   q13,d15,d5[1]
1301    vmlsl.s16   q14,d15,d3[1]
1302    vmlsl.s16   q15,d15,d4[1]
1303
1304
1305    vmlsl.s16   q10,d12,d5[0]
1306    vmlsl.s16   q10,d13,d7[2]
1307    vmlsl.s16   q11,d12,d1[0]
1308    vmlal.s16   q11,d13,d1[2]
1309    vmlsl.s16   q8,d12,d7[0]
1310    vmlal.s16   q8,d13,d5[2]
1311    vmlal.s16   q9,d12,d3[0]
1312    vmlsl.s16   q9,d13,d3[2]
1313
1314    cmp         r11,r7
1315    bhs         shift4
1316
1317
1318    vld1.16     d10,[r0],r6
1319    vld1.16     d8,[r0],r6
1320    vld1.16     d11,[r0],r6
1321    vld1.16     d9,[r0],r6
1322
1323
1324    vmlsl.s16   q12,d8,d5[3]                @// y1 * cos1(part of b0)
1325    vmlsl.s16   q13,d8,d2[3]                @// y1 * cos3(part of b1)
1326    vmlal.s16   q14,d8,d4[3]                @// y1 * sin3(part of b2)
1327    vmlal.s16   q15,d8,d3[3]                @// y1 * sin1(part of b3)
1328
1329    vmlsl.s16   q12,d9,d6[3]                @// y1 * cos1 + y3 * cos3(part of b0)
1330    vmlal.s16   q13,d9,d0[3]                @// y1 * cos3 - y3 * sin1(part of b1)
1331    vmlsl.s16   q14,d9,d6[1]                @// y1 * sin3 - y3 * cos1(part of b2)
1332    vmlsl.s16   q15,d9,d3[1]                @// y1 * sin1 - y3 * sin3(part of b3)
1333
1334
1335
1336
1337
1338    vmlal.s16   q10,d10,d0[0]
1339    vmlsl.s16   q10,d11,d0[2]
1340
1341
1342    vmlsl.s16   q11,d10,d0[0]
1343    vmlal.s16   q11,d11,d6[2]
1344
1345    vmlsl.s16   q8,d10,d0[0]
1346    vmlal.s16   q8,d11,d2[2]
1347
1348    vmlal.s16   q9,d10,d0[0]
1349    vmlsl.s16   q9,d11,d4[2]
1350
1351
1352
1353
1354    vld1.16     d12,[r0],r6
1355    vld1.16     d14,[r0],r6
1356    vld1.16     d13,[r0],r6
1357    vld1.16     d15,[r0],r6
1358
1359
1360
1361
1362
1363
1364    vmlal.s16   q12,d14,d3[1]
1365    vmlsl.s16   q13,d14,d2[1]
1366    vmlal.s16   q14,d14,d7[3]
1367    vmlal.s16   q15,d14,d2[3]
1368
1369
1370    vmlsl.s16   q12,d15,d0[3]
1371    vmlal.s16   q13,d15,d4[3]
1372    vmlal.s16   q14,d15,d6[3]
1373    vmlsl.s16   q15,d15,d2[1]
1374
1375
1376    vmlal.s16   q10,d12,d3[0]
1377    vmlsl.s16   q10,d13,d6[2]
1378    vmlal.s16   q11,d12,d7[0]
1379    vmlsl.s16   q11,d13,d4[2]
1380    vmlsl.s16   q8,d12,d1[0]
1381    vmlal.s16   q8,d13,d0[2]
1382    vmlal.s16   q9,d12,d5[0]
1383    vmlsl.s16   q9,d13,d5[2]
1384
1385
1386    vld1.16     d10,[r0],r6
1387    vld1.16     d8,[r0],r6
1388    vld1.16     d11,[r0],r6
1389    vld1.16     d9,[r0],r6
1390
1391
1392
1393
1394
1395    vmlal.s16   q12,d8,d3[3]                @// y1 * cos1(part of b0)
1396    vmlsl.s16   q13,d8,d7[1]                @// y1 * cos3(part of b1)
1397    vmlsl.s16   q14,d8,d5[1]                @// y1 * sin3(part of b2)
1398    vmlal.s16   q15,d8,d1[3]                @// y1 * sin1(part of b3)
1399
1400    vmlsl.s16   q12,d9,d7[1]                @// y1 * cos1 + y3 * cos3(part of b0)
1401    vmlsl.s16   q13,d9,d6[1]                @// y1 * cos3 - y3 * sin1(part of b1)
1402    vmlal.s16   q14,d9,d3[3]                @// y1 * sin3 - y3 * cos1(part of b2)
1403    vmlsl.s16   q15,d9,d1[1]                @// y1 * sin1 - y3 * sin3(part of b3)
1404
1405
1406
1407
1408
1409    vmlsl.s16   q10,d10,d6[0]
1410    vmlal.s16   q10,d11,d2[2]
1411
1412
1413    vmlal.s16   q11,d10,d2[0]
1414    vmlsl.s16   q11,d11,d0[2]
1415
1416    vmlsl.s16   q8,d10,d2[0]
1417    vmlal.s16   q8,d11,d3[2]
1418
1419    vmlal.s16   q9,d10,d6[0]
1420    vmlsl.s16   q9,d11,d6[2]
1421
1422
1423    vld1.16     d12,[r0],r6
1424    vld1.16     d14,[r0],r6
1425    vld1.16     d13,[r0],r6
1426    vld1.16     d15,[r0],r6
1427
1428
1429
1430
1431    vmlsl.s16   q12,d14,d5[1]
1432    vmlal.s16   q13,d14,d3[3]
1433    vmlsl.s16   q14,d14,d2[1]
1434    vmlal.s16   q15,d14,d0[3]
1435
1436
1437    vmlal.s16   q12,d15,d1[3]
1438    vmlsl.s16   q13,d15,d1[1]
1439    vmlal.s16   q14,d15,d0[3]
1440    vmlsl.s16   q15,d15,d0[1]
1441
1442
1443    vmlsl.s16   q10,d12,d1[0]
1444    vmlal.s16   q10,d13,d4[2]
1445    vmlal.s16   q11,d12,d3[0]
1446    vmlsl.s16   q11,d13,d5[2]
1447    vmlsl.s16   q8,d12,d5[0]
1448    vmlal.s16   q8,d13,d6[2]
1449    vmlal.s16   q9,d12,d7[0]
1450    vmlsl.s16   q9,d13,d7[2]
1451
1452shift4:
1453    vadd.s32    q4,q10,q12
1454    vsub.s32    q5,q10,q12
1455
1456    vadd.s32    q6,q11,q13
1457    vsub.s32    q12,q11,q13
1458
1459    vadd.s32    q7,q8,q14
1460    vsub.s32    q13,q8,q14
1461
1462
1463    vadd.s32    q8,q9,q15
1464    vsub.s32    q14,q9,q15
1465
1466
1467    vqrshrn.s32 d30,q4,#shift_stage1_idct   @// r0 = (a0 + b0 + rnd) >> 7(shift_stage1_idct)
1468    vqrshrn.s32 d19,q5,#shift_stage1_idct   @// r7 = (a0 - b0 + rnd) >> 7(shift_stage1_idct)
1469    vqrshrn.s32 d31,q7,#shift_stage1_idct   @// r2 = (a2 + b2 + rnd) >> 7(shift_stage1_idct)
1470    vqrshrn.s32 d18,q13,#shift_stage1_idct  @// r5 = (a2 - b2 + rnd) >> 7(shift_stage1_idct)
1471    vqrshrn.s32 d12,q6,#shift_stage1_idct   @// r1 = (a1 + b1 + rnd) >> 7(shift_stage1_idct)
1472    vqrshrn.s32 d15,q12,#shift_stage1_idct  @// r6 = (a1 - b1 + rnd) >> 7(shift_stage1_idct)
1473    vqrshrn.s32 d13,q8,#shift_stage1_idct   @// r3 = (a3 + b3 + rnd) >> 7(shift_stage1_idct)
1474    vqrshrn.s32 d14,q14,#shift_stage1_idct  @// r4 = (a3 - b3 + rnd) >> 7(shift_stage1_idct)
1475
1476    vtrn.16     q15,q6
1477    vtrn.16     q7,q9
1478
1479    vtrn.32     d30,d31
1480    vtrn.32     d12,d13
1481    vtrn.32     d14,d15
1482    vtrn.32     d18,d19
1483
1484
1485    vst1.16     {q15},[r1]!
1486    vst1.16     {q6},[r1]!
1487    vst1.16     {q7},[r1]!
1488    vst1.16     {q9},[r1]!
1489
1490    add         r1,r1,#96
1491
1492    subs        r14,r14,#1
1493    bne         dct_stage1
1494second_stage_dct:
1495@   mov     r0,r1
1496    ldr         r0,[sp]
1497    ldr         r1,[sp,#4]
1498    ldr         r8,[sp,#60]                 @ prediction stride
1499    ldr         r7,[sp,#64]                 @ destination stride
1500
1501@   add r4,r2,r8, lsl #1    @ r4 = r2 + pred_strd * 2    => r4 points to 3rd row of pred data
1502@   add r5,r8,r8, lsl #1    @
1503@   sub   r0,r0,#512
1504    mov         r11,#0xfffffff0
1505    mov         r5, #0xffffff00
1506    ldr         r6,r5_addr
1507    ldr         r9,r9_addr
1508@   sub     r1,r1,#2048
1509    mov         r4,r1
1510    mov         r10,#240
1511    mov         r14,#8
1512    b           stage2
1513
1514@ registers free :
1515
1516@ arm registers used
1517@ r8 : predicition stride
1518@ r7 : destination stride
1519@ r1: temp buffer
1520@ r2 : pred buffer
1521@ r3 : destination buffer
1522@ r14 : loop counter
1523@r0 : scratch buffer
1524@r10 : used as stride
1525@ r4 : used to store the initial address
1526@r12 : zero cols
1527@ r11 : 0xfffffff0
1528@ r5 : 0xffffff00
1529dct_stage2:
1530    add         r4,r4,#32
1531    mov         r1,r4
1532stage2:
1533    vld1.16     {d10,d11},[r1]!
1534    vld1.16     {d8,d9},[r1],r10
1535
1536    vmull.s16   q12,d8,d0[1]                @// y1 * cos1(part of b0)
1537    vmull.s16   q13,d8,d0[3]                @// y1 * cos3(part of b1)
1538    vmull.s16   q14,d8,d1[1]                @// y1 * sin3(part of b2)
1539    vmull.s16   q15,d8,d1[3]                @// y1 * sin1(part of b3)
1540
1541    vmlal.s16   q12,d9,d0[3]                @// y1 * cos1 + y3 * cos3(part of b0)
1542    vmlal.s16   q13,d9,d2[1]                @// y1 * cos3 - y3 * sin1(part of b1)
1543    vmlal.s16   q14,d9,d3[3]                @// y1 * sin3 - y3 * cos1(part of b2)
1544    vmlal.s16   q15,d9,d5[1]                @// y1 * sin1 - y3 * sin3(part of b3)
1545
1546
1547
1548    vmull.s16   q10,d10,d0[0]
1549    vmlal.s16   q10,d11,d0[2]
1550
1551
1552    vmull.s16   q11,d10,d0[0]
1553    vmlal.s16   q11,d11,d1[2]
1554
1555    vmull.s16   q8,d10,d0[0]
1556    vmlal.s16   q8,d11,d2[2]
1557
1558    vmull.s16   q9,d10,d0[0]
1559    vmlal.s16   q9,d11,d3[2]
1560    cmp         r12,r11
1561    bhs         stage2_shift1
1562
1563    vld1.16     {d12,d13},[r1]!
1564    vld1.16     {d14,d15},[r1],r10
1565
1566
1567
1568
1569
1570
1571    vmlal.s16   q12,d14,d1[1]
1572    vmlal.s16   q13,d14,d3[3]
1573    vmlal.s16   q14,d14,d6[1]
1574    vmlsl.s16   q15,d14,d7[1]
1575
1576
1577    vmlal.s16   q12,d15,d1[3]
1578    vmlal.s16   q13,d15,d5[1]
1579    vmlsl.s16   q14,d15,d7[1]
1580    vmlsl.s16   q15,d15,d3[3]
1581
1582
1583    vmlal.s16   q10,d12,d1[0]
1584    vmlal.s16   q10,d13,d1[2]
1585    vmlal.s16   q11,d12,d3[0]
1586    vmlal.s16   q11,d13,d4[2]
1587    vmlal.s16   q8,d12,d5[0]
1588    vmlal.s16   q8,d13,d7[2]
1589    vmlal.s16   q9,d12,d7[0]
1590    vmlsl.s16   q9,d13,d5[2]
1591    cmp         r12,r5
1592    bhs         stage2_shift1
1593
1594    vld1.16     {d10,d11},[r1]!
1595    vld1.16     {d8,d9},[r1],r10
1596
1597    vmlal.s16   q12,d8,d2[1]                @// y1 * cos1(part of b0)
1598    vmlal.s16   q13,d8,d6[3]                @// y1 * cos3(part of b1)
1599    vmlsl.s16   q14,d8,d4[3]                @// y1 * sin3(part of b2)
1600    vmlsl.s16   q15,d8,d0[1]                @// y1 * sin1(part of b3)
1601
1602    vmlal.s16   q12,d9,d2[3]                @// y1 * cos1 + y3 * cos3(part of b0)
1603    vmlsl.s16   q13,d9,d7[3]                @// y1 * cos3 - y3 * sin1(part of b1)
1604    vmlsl.s16   q14,d9,d2[1]                @// y1 * sin3 - y3 * cos1(part of b2)
1605    vmlsl.s16   q15,d9,d3[1]                @// y1 * sin1 - y3 * sin3(part of b3)
1606
1607
1608
1609
1610
1611    vmlal.s16   q10,d10,d2[0]
1612    vmlal.s16   q10,d11,d2[2]
1613
1614
1615    vmlal.s16   q11,d10,d6[0]
1616    vmlal.s16   q11,d11,d7[2]
1617
1618    vmlsl.s16   q8,d10,d6[0]
1619    vmlsl.s16   q8,d11,d3[2]
1620
1621    vmlsl.s16   q9,d10,d2[0]
1622    vmlsl.s16   q9,d11,d1[2]
1623
1624    cmp         r12,r6
1625    bhs         stage2_shift1
1626
1627
1628    vld1.16     {d12,d13},[r1]!
1629    vld1.16     {d14,d15},[r1],r10
1630
1631
1632
1633
1634
1635    vmlal.s16   q12,d14,d3[1]
1636    vmlsl.s16   q13,d14,d6[1]
1637    vmlsl.s16   q14,d14,d0[1]
1638    vmlsl.s16   q15,d14,d6[3]
1639
1640
1641    vmlal.s16   q12,d15,d3[3]
1642    vmlsl.s16   q13,d15,d4[3]
1643    vmlsl.s16   q14,d15,d2[3]
1644    vmlal.s16   q15,d15,d5[3]
1645
1646
1647    vmlal.s16   q10,d12,d3[0]
1648    vmlal.s16   q10,d13,d3[2]
1649    vmlsl.s16   q11,d12,d7[0]
1650    vmlsl.s16   q11,d13,d5[2]
1651    vmlsl.s16   q8,d12,d1[0]
1652    vmlsl.s16   q8,d13,d1[2]
1653    vmlsl.s16   q9,d12,d5[0]
1654    vmlal.s16   q9,d13,d7[2]
1655
1656    cmp         r12,r9
1657    bhs         stage2_shift1
1658
1659
1660    vld1.16     {d10,d11},[r1]!
1661    vld1.16     {d8,d9},[r1],r10
1662
1663
1664    vmlal.s16   q12,d8,d4[1]                @// y1 * cos1(part of b0)
1665    vmlsl.s16   q13,d8,d3[1]                @// y1 * cos3(part of b1)
1666    vmlsl.s16   q14,d8,d5[1]                @// y1 * sin3(part of b2)
1667    vmlal.s16   q15,d8,d2[1]                @// y1 * sin1(part of b3)
1668
1669    vmlal.s16   q12,d9,d4[3]                @// y1 * cos1 + y3 * cos3(part of b0)
1670    vmlsl.s16   q13,d9,d1[3]                @// y1 * cos3 - y3 * sin1(part of b1)
1671    vmlsl.s16   q14,d9,d7[3]                @// y1 * sin3 - y3 * cos1(part of b2)
1672    vmlal.s16   q15,d9,d1[1]                @// y1 * sin1 - y3 * sin3(part of b3)
1673
1674
1675
1676
1677
1678    vmlal.s16   q10,d10,d0[0]
1679    vmlal.s16   q10,d11,d4[2]
1680
1681
1682    vmlsl.s16   q11,d10,d0[0]
1683    vmlsl.s16   q11,d11,d2[2]
1684
1685    vmlsl.s16   q8,d10,d0[0]
1686    vmlsl.s16   q8,d11,d6[2]
1687
1688    vmlal.s16   q9,d10,d0[0]
1689    vmlal.s16   q9,d11,d0[2]
1690
1691    vld1.16     {d12,d13},[r1]!
1692    vld1.16     {d14,d15},[r1],r10
1693
1694
1695
1696
1697
1698    vmlal.s16   q12,d14,d5[1]
1699    vmlsl.s16   q13,d14,d0[2]
1700    vmlal.s16   q14,d14,d5[3]
1701    vmlal.s16   q15,d14,d4[3]
1702
1703
1704    vmlal.s16   q12,d15,d5[3]
1705    vmlsl.s16   q13,d15,d1[1]
1706    vmlal.s16   q14,d15,d3[1]
1707    vmlsl.s16   q15,d15,d7[3]
1708
1709
1710    vmlal.s16   q10,d12,d5[0]
1711    vmlal.s16   q10,d13,d5[2]
1712    vmlsl.s16   q11,d12,d1[0]
1713    vmlsl.s16   q11,d13,d0[2]
1714    vmlal.s16   q8,d12,d7[0]
1715    vmlal.s16   q8,d13,d4[2]
1716    vmlal.s16   q9,d12,d3[0]
1717    vmlal.s16   q9,d13,d6[2]
1718
1719
1720    vld1.16     {d10,d11},[r1]!
1721    vld1.16     {d8,d9},[r1],r10
1722
1723
1724
1725
1726    vmlal.s16   q12,d8,d6[1]                @// y1 * cos1(part of b0)
1727    vmlsl.s16   q13,d8,d2[3]                @// y1 * cos3(part of b1)
1728    vmlal.s16   q14,d8,d0[1]                @// y1 * sin3(part of b2)
1729    vmlsl.s16   q15,d8,d4[1]                @// y1 * sin1(part of b3)
1730
1731    vmlal.s16   q12,d9,d6[3]                @// y1 * cos1 + y3 * cos3(part of b0)
1732    vmlsl.s16   q13,d9,d4[1]                @// y1 * cos3 - y3 * sin1(part of b1)
1733    vmlal.s16   q14,d9,d1[3]                @// y1 * sin3 - y3 * cos1(part of b2)
1734    vmlsl.s16   q15,d9,d0[1]                @// y1 * sin1 - y3 * sin3(part of b3)
1735
1736
1737
1738
1739
1740    vmlal.s16   q10,d10,d6[0]
1741    vmlal.s16   q10,d11,d6[2]
1742
1743
1744    vmlsl.s16   q11,d10,d2[0]
1745    vmlsl.s16   q11,d11,d3[2]
1746
1747    vmlal.s16   q8,d10,d2[0]
1748    vmlal.s16   q8,d11,d0[2]
1749
1750    vmlsl.s16   q9,d10,d6[0]
1751    vmlsl.s16   q9,d11,d2[2]
1752
1753    vld1.16     {d12,d13},[r1]!
1754    vld1.16     {d14,d15},[r1],r10
1755
1756    vmlal.s16   q12,d14,d7[1]
1757    vmlsl.s16   q13,d14,d5[3]
1758    vmlal.s16   q14,d14,d4[1]
1759    vmlsl.s16   q15,d14,d2[3]
1760
1761
1762    vmlal.s16   q12,d15,d7[3]
1763    vmlsl.s16   q13,d15,d7[1]
1764    vmlal.s16   q14,d15,d6[3]
1765    vmlsl.s16   q15,d15,d6[1]
1766
1767
1768    vmlal.s16   q10,d12,d7[0]
1769    vmlal.s16   q10,d13,d7[2]
1770    vmlsl.s16   q11,d12,d5[0]
1771    vmlsl.s16   q11,d13,d6[2]
1772    vmlal.s16   q8,d12,d3[0]
1773    vmlal.s16   q8,d13,d5[2]
1774    vmlsl.s16   q9,d12,d1[0]
1775    vmlsl.s16   q9,d13,d4[2]
1776
1777stage2_shift1:
1778    vadd.s32    q4,q10,q12
1779    vsub.s32    q5,q10,q12
1780
1781    vadd.s32    q6,q11,q13
1782    vsub.s32    q12,q11,q13
1783
1784    vadd.s32    q7,q8,q14
1785    vsub.s32    q13,q8,q14
1786
1787
1788    vadd.s32    q8,q9,q15
1789    vsub.s32    q14,q9,q15
1790
1791
1792    vqrshrn.s32 d30,q4,#shift_stage2_idct   @// r0 = (a0 + b0 + rnd) >> 7(shift_stage2_idct)
1793    vqrshrn.s32 d19,q5,#shift_stage2_idct   @// r7 = (a0 - b0 + rnd) >> 7(shift_stage2_idct)
1794    vqrshrn.s32 d31,q7,#shift_stage2_idct   @// r2 = (a2 + b2 + rnd) >> 7(shift_stage2_idct)
1795    vqrshrn.s32 d18,q13,#shift_stage2_idct  @// r5 = (a2 - b2 + rnd) >> 7(shift_stage2_idct)
1796    vqrshrn.s32 d12,q6,#shift_stage2_idct   @// r1 = (a1 + b1 + rnd) >> 7(shift_stage2_idct)
1797    vqrshrn.s32 d15,q12,#shift_stage2_idct  @// r6 = (a1 - b1 + rnd) >> 7(shift_stage2_idct)
1798    vqrshrn.s32 d13,q8,#shift_stage2_idct   @// r3 = (a3 + b3 + rnd) >> 7(shift_stage2_idct)
1799    vqrshrn.s32 d14,q14,#shift_stage2_idct  @// r4 = (a3 - b3 + rnd) >> 7(shift_stage2_idct)
1800
1801
1802    vtrn.16     q15,q6
1803    vtrn.16     q7,q9
1804
1805    vtrn.32     d30,d31
1806    vtrn.32     d12,d13
1807    vtrn.32     d14,d15
1808    vtrn.32     d18,d19
1809
1810
1811    vst1.16     {q15},[r0]!
1812    vst1.16     {q6},[r0]!
1813    vst1.16     {q7},[r0]!
1814    vst1.16     {q9},[r0]!
1815
1816
1817    mov         r1,r4
1818
1819
1820
1821
1822
1823
1824    vld1.16     {d10,d11},[r1]!
1825    vld1.16     {d8,d9},[r1],r10
1826
1827
1828    vmull.s16   q12,d8,d2[1]                @// y1 * cos1(part of b0)
1829    vmull.s16   q13,d8,d2[3]                @// y1 * cos3(part of b1)
1830    vmull.s16   q14,d8,d3[1]                @// y1 * sin3(part of b2)
1831    vmull.s16   q15,d8,d3[3]                @// y1 * sin1(part of b3)
1832
1833    vmlal.s16   q12,d9,d6[3]                @// y1 * cos1 + y3 * cos3(part of b0)
1834    vmlsl.s16   q13,d9,d7[3]                @// y1 * cos3 - y3 * sin1(part of b1)
1835    vmlsl.s16   q14,d9,d6[1]                @// y1 * sin3 - y3 * cos1(part of b2)
1836    vmlsl.s16   q15,d9,d4[3]                @// y1 * sin1 - y3 * sin3(part of b3)
1837
1838
1839
1840
1841
1842    vmull.s16   q10,d10,d0[0]
1843    vmlal.s16   q10,d11,d4[2]
1844
1845
1846    vmull.s16   q11,d10,d0[0]
1847    vmlal.s16   q11,d11,d5[2]
1848
1849    vmull.s16   q8,d10,d0[0]
1850    vmlal.s16   q8,d11,d6[2]
1851
1852    vmull.s16   q9,d10,d0[0]
1853    vmlal.s16   q9,d11,d7[2]
1854
1855    cmp         r12,r11
1856    bhs         stage2_shift2
1857
1858    vld1.16     {d12,d13},[r1]!
1859    vld1.16     {d14,d15},[r1],r10
1860
1861
1862    vmlsl.s16   q12,d14,d4[3]
1863    vmlsl.s16   q13,d14,d2[1]
1864    vmlsl.s16   q14,d14,d0[1]
1865    vmlsl.s16   q15,d14,d2[3]
1866
1867
1868    vmlsl.s16   q12,d15,d0[3]
1869    vmlsl.s16   q13,d15,d3[1]
1870    vmlsl.s16   q14,d15,d6[3]
1871    vmlal.s16   q15,d15,d5[3]
1872
1873
1874    vmlsl.s16   q10,d12,d7[0]
1875    vmlsl.s16   q10,d13,d2[2]
1876    vmlsl.s16   q11,d12,d5[0]
1877    vmlsl.s16   q11,d13,d0[2]
1878    vmlsl.s16   q8,d12,d3[0]
1879    vmlsl.s16   q8,d13,d3[2]
1880    vmlsl.s16   q9,d12,d1[0]
1881    vmlsl.s16   q9,d13,d6[2]
1882
1883    cmp         r12,r5
1884    bhs         stage2_shift2
1885
1886    vld1.16     {d10,d11},[r1]!
1887    vld1.16     {d8,d9},[r1],r10
1888
1889
1890
1891
1892
1893    vmlsl.s16   q12,d8,d4[1]                @// y1 * cos1(part of b0)
1894    vmlal.s16   q13,d8,d7[1]                @// y1 * cos3(part of b1)
1895    vmlal.s16   q14,d8,d2[3]                @// y1 * sin3(part of b2)
1896    vmlal.s16   q15,d8,d1[3]                @// y1 * sin1(part of b3)
1897
1898    vmlal.s16   q12,d9,d7[1]                @// y1 * cos1 + y3 * cos3(part of b0)
1899    vmlal.s16   q13,d9,d1[3]                @// y1 * cos3 - y3 * sin1(part of b1)
1900    vmlal.s16   q14,d9,d3[3]                @// y1 * sin3 - y3 * cos1(part of b2)
1901    vmlsl.s16   q15,d9,d6[3]                @// y1 * sin1 - y3 * sin3(part of b3)
1902
1903
1904
1905
1906
1907    vmlsl.s16   q10,d10,d2[0]
1908    vmlsl.s16   q10,d11,d6[2]
1909
1910
1911    vmlsl.s16   q11,d10,d6[0]
1912    vmlal.s16   q11,d11,d4[2]
1913
1914    vmlal.s16   q8,d10,d6[0]
1915    vmlal.s16   q8,d11,d0[2]
1916
1917    vmlal.s16   q9,d10,d2[0]
1918    vmlal.s16   q9,d11,d5[2]
1919
1920    cmp         r12,r6
1921    bhs         stage2_shift2
1922
1923
1924    vld1.16     {d12,d13},[r1]!
1925    vld1.16     {d14,d15},[r1],r10
1926
1927
1928
1929
1930
1931
1932    vmlal.s16   q12,d14,d2[3]
1933    vmlal.s16   q13,d14,d3[3]
1934    vmlsl.s16   q14,d14,d5[3]
1935    vmlsl.s16   q15,d14,d0[3]
1936
1937
1938    vmlal.s16   q12,d15,d1[3]
1939    vmlsl.s16   q13,d15,d6[3]
1940    vmlsl.s16   q14,d15,d0[3]
1941    vmlal.s16   q15,d15,d7[3]
1942
1943
1944    vmlal.s16   q10,d12,d5[0]
1945    vmlal.s16   q10,d13,d0[2]
1946    vmlal.s16   q11,d12,d1[0]
1947    vmlal.s16   q11,d13,d6[2]
1948    vmlal.s16   q8,d12,d7[0]
1949    vmlsl.s16   q8,d13,d2[2]
1950    vmlsl.s16   q9,d12,d3[0]
1951    vmlsl.s16   q9,d13,d4[2]
1952
1953    cmp         r12,r9
1954    bhs         stage2_shift2
1955
1956
1957    vld1.16     {d10,d11},[r1]!
1958    vld1.16     {d8,d9},[r1],r10
1959
1960
1961
1962    vmlal.s16   q12,d8,d6[1]                @// y1 * cos1(part of b0)
1963    vmlsl.s16   q13,d8,d1[1]                @// y1 * cos3(part of b1)
1964    vmlsl.s16   q14,d8,d7[1]                @// y1 * sin3(part of b2)
1965    vmlal.s16   q15,d8,d0[3]                @// y1 * sin1(part of b3)
1966
1967    vmlsl.s16   q12,d9,d5[1]                @// y1 * cos1 + y3 * cos3(part of b0)
1968    vmlsl.s16   q13,d9,d4[1]                @// y1 * cos3 - y3 * sin1(part of b1)
1969    vmlal.s16   q14,d9,d2[1]                @// y1 * sin3 - y3 * cos1(part of b2)
1970    vmlal.s16   q15,d9,d7[1]                @// y1 * sin1 - y3 * sin3(part of b3)
1971
1972
1973
1974
1975
1976    vmlal.s16   q10,d10,d0[0]
1977    vmlsl.s16   q10,d11,d7[2]
1978
1979
1980    vmlsl.s16   q11,d10,d0[0]
1981    vmlsl.s16   q11,d11,d1[2]
1982
1983    vmlsl.s16   q8,d10,d0[0]
1984    vmlal.s16   q8,d11,d5[2]
1985
1986    vmlal.s16   q9,d10,d0[0]
1987    vmlal.s16   q9,d11,d3[2]
1988
1989    vld1.16     {d12,d13},[r1]!
1990    vld1.16     {d14,d15},[r1],r10
1991
1992
1993
1994
1995    vmlsl.s16   q12,d14,d0[1]
1996    vmlal.s16   q13,d14,d6[1]
1997    vmlal.s16   q14,d14,d4[1]
1998    vmlsl.s16   q15,d14,d1[1]
1999
2000
2001    vmlsl.s16   q12,d15,d3[3]
2002    vmlal.s16   q13,d15,d0[1]
2003    vmlsl.s16   q14,d15,d5[1]
2004    vmlsl.s16   q15,d15,d6[1]
2005
2006
2007    vmlsl.s16   q10,d12,d3[0]
2008    vmlsl.s16   q10,d13,d1[2]
2009    vmlsl.s16   q11,d12,d7[0]
2010    vmlal.s16   q11,d13,d3[2]
2011    vmlal.s16   q8,d12,d1[0]
2012    vmlal.s16   q8,d13,d7[2]
2013    vmlsl.s16   q9,d12,d5[0]
2014    vmlsl.s16   q9,d13,d2[2]
2015
2016
2017    vld1.16     {d10,d11},[r1]!
2018    vld1.16     {d8,d9},[r1],r10
2019
2020
2021    vmlal.s16   q12,d8,d7[3]                @// y1 * cos1(part of b0)
2022    vmlal.s16   q13,d8,d4[3]                @// y1 * cos3(part of b1)
2023    vmlsl.s16   q14,d8,d1[1]                @// y1 * sin3(part of b2)
2024    vmlal.s16   q15,d8,d2[1]                @// y1 * sin1(part of b3)
2025
2026    vmlal.s16   q12,d9,d3[1]                @// y1 * cos1 + y3 * cos3(part of b0)
2027    vmlsl.s16   q13,d9,d5[3]                @// y1 * cos3 - y3 * sin1(part of b1)
2028    vmlsl.s16   q14,d9,d7[3]                @// y1 * sin3 - y3 * cos1(part of b2)
2029    vmlal.s16   q15,d9,d5[1]                @// y1 * sin1 - y3 * sin3(part of b3)
2030
2031
2032
2033
2034
2035    vmlsl.s16   q10,d10,d6[0]
2036    vmlal.s16   q10,d11,d5[2]
2037
2038
2039    vmlal.s16   q11,d10,d2[0]
2040    vmlal.s16   q11,d11,d7[2]
2041
2042    vmlsl.s16   q8,d10,d2[0]
2043    vmlsl.s16   q8,d11,d4[2]
2044
2045    vmlal.s16   q9,d10,d6[0]
2046    vmlal.s16   q9,d11,d1[2]
2047
2048
2049    vld1.16     {d12,d13},[r1]!
2050    vld1.16     {d14,d15},[r1],r10
2051
2052
2053
2054    vmlal.s16   q12,d14,d1[1]
2055    vmlsl.s16   q13,d14,d0[3]
2056    vmlal.s16   q14,d14,d1[3]
2057    vmlsl.s16   q15,d14,d3[1]
2058
2059
2060    vmlal.s16   q12,d15,d5[3]
2061    vmlsl.s16   q13,d15,d5[1]
2062    vmlal.s16   q14,d15,d4[3]
2063    vmlsl.s16   q15,d15,d4[1]
2064
2065
2066    vmlal.s16   q10,d12,d1[0]
2067    vmlal.s16   q10,d13,d3[2]
2068    vmlsl.s16   q11,d12,d3[0]
2069    vmlsl.s16   q11,d13,d2[2]
2070    vmlal.s16   q8,d12,d5[0]
2071    vmlal.s16   q8,d13,d1[2]
2072    vmlsl.s16   q9,d12,d7[0]
2073    vmlsl.s16   q9,d13,d0[2]
2074
2075stage2_shift2:
2076    vadd.s32    q4,q10,q12
2077    vsub.s32    q5,q10,q12
2078
2079    vadd.s32    q6,q11,q13
2080    vsub.s32    q12,q11,q13
2081
2082    vadd.s32    q7,q8,q14
2083    vsub.s32    q13,q8,q14
2084
2085
2086    vadd.s32    q8,q9,q15
2087    vsub.s32    q14,q9,q15
2088
2089
2090    vqrshrn.s32 d30,q4,#shift_stage2_idct   @// r0 = (a0 + b0 + rnd) >> 7(shift_stage2_idct)
2091    vqrshrn.s32 d19,q5,#shift_stage2_idct   @// r7 = (a0 - b0 + rnd) >> 7(shift_stage2_idct)
2092    vqrshrn.s32 d31,q7,#shift_stage2_idct   @// r2 = (a2 + b2 + rnd) >> 7(shift_stage2_idct)
2093    vqrshrn.s32 d18,q13,#shift_stage2_idct  @// r5 = (a2 - b2 + rnd) >> 7(shift_stage2_idct)
2094    vqrshrn.s32 d12,q6,#shift_stage2_idct   @// r1 = (a1 + b1 + rnd) >> 7(shift_stage2_idct)
2095    vqrshrn.s32 d15,q12,#shift_stage2_idct  @// r6 = (a1 - b1 + rnd) >> 7(shift_stage2_idct)
2096    vqrshrn.s32 d13,q8,#shift_stage2_idct   @// r3 = (a3 + b3 + rnd) >> 7(shift_stage2_idct)
2097    vqrshrn.s32 d14,q14,#shift_stage2_idct  @// r4 = (a3 - b3 + rnd) >> 7(shift_stage2_idct)
2098
2099    vtrn.16     q15,q6
2100    vtrn.16     q7,q9
2101
2102    vtrn.32     d30,d31
2103    vtrn.32     d12,d13
2104    vtrn.32     d14,d15
2105    vtrn.32     d18,d19
2106
2107
2108    vst1.16     {q15},[r0]!
2109    vst1.16     {q6},[r0]!
2110    vst1.16     {q7},[r0]!
2111    vst1.16     {q9},[r0]!
2112
2113
2114
2115    mov         r1,r4
2116
2117
2118
2119
2120    vld1.16     {d10,d11},[r1]!
2121    vld1.16     {d8,d9},[r1],r10
2122
2123    vmull.s16   q12,d8,d4[1]                @// y1 * cos1(part of b0)
2124    vmull.s16   q13,d8,d4[3]                @// y1 * cos3(part of b1)
2125    vmull.s16   q14,d8,d5[1]                @// y1 * sin3(part of b2)
2126    vmull.s16   q15,d8,d5[3]                @// y1 * sin1(part of b3)
2127
2128    vmlsl.s16   q12,d9,d3[1]                @// y1 * cos1 + y3 * cos3(part of b0)
2129    vmlsl.s16   q13,d9,d1[3]                @// y1 * cos3 - y3 * sin1(part of b1)
2130    vmlsl.s16   q14,d9,d0[2]                @// y1 * sin3 - y3 * cos1(part of b2)
2131    vmlsl.s16   q15,d9,d1[1]                @// y1 * sin1 - y3 * sin3(part of b3)
2132
2133
2134
2135
2136
2137    vmull.s16   q10,d10,d0[0]
2138    vmlsl.s16   q10,d11,d7[2]
2139
2140
2141    vmull.s16   q11,d10,d0[0]
2142    vmlsl.s16   q11,d11,d6[2]
2143
2144    vmull.s16   q8,d10,d0[0]
2145    vmlsl.s16   q8,d11,d5[2]
2146
2147    vmull.s16   q9,d10,d0[0]
2148    vmlsl.s16   q9,d11,d4[2]
2149
2150    cmp         r12,r11
2151    bhs         stage2_shift3
2152
2153    vld1.16     {d12,d13},[r1]!
2154    vld1.16     {d14,d15},[r1],r10
2155
2156    vmlsl.s16   q12,d14,d5[1]
2157    vmlsl.s16   q13,d14,d7[3]
2158    vmlal.s16   q14,d14,d5[3]
2159    vmlal.s16   q15,d14,d3[1]
2160
2161
2162    vmlal.s16   q12,d15,d2[1]
2163    vmlal.s16   q13,d15,d1[1]
2164    vmlal.s16   q14,d15,d4[3]
2165    vmlsl.s16   q15,d15,d7[3]
2166
2167
2168    vmlsl.s16   q10,d12,d1[0]
2169    vmlal.s16   q10,d13,d6[2]
2170    vmlsl.s16   q11,d12,d3[0]
2171    vmlal.s16   q11,d13,d3[2]
2172    vmlsl.s16   q8,d12,d5[0]
2173    vmlal.s16   q8,d13,d0[2]
2174    vmlsl.s16   q9,d12,d7[0]
2175    vmlal.s16   q9,d13,d2[2]
2176
2177    cmp         r12,r5
2178    bhs         stage2_shift3
2179
2180    vld1.16     {d10,d11},[r1]!
2181    vld1.16     {d8,d9},[r1],r10
2182
2183
2184
2185    vmlal.s16   q12,d8,d6[1]                @// y1 * cos1(part of b0)
2186    vmlsl.s16   q13,d8,d5[1]                @// y1 * cos3(part of b1)
2187    vmlsl.s16   q14,d8,d0[3]                @// y1 * sin3(part of b2)
2188    vmlsl.s16   q15,d8,d3[3]                @// y1 * sin1(part of b3)
2189
2190    vmlsl.s16   q12,d9,d1[1]                @// y1 * cos1 + y3 * cos3(part of b0)
2191    vmlsl.s16   q13,d9,d4[1]                @// y1 * cos3 - y3 * sin1(part of b1)
2192    vmlal.s16   q14,d9,d6[1]                @// y1 * sin3 - y3 * cos1(part of b2)
2193    vmlal.s16   q15,d9,d0[1]                @// y1 * sin1 - y3 * sin3(part of b3)
2194
2195
2196
2197
2198
2199    vmlal.s16   q10,d10,d2[0]
2200    vmlsl.s16   q10,d11,d5[2]
2201
2202
2203    vmlal.s16   q11,d10,d6[0]
2204    vmlsl.s16   q11,d11,d0[2]
2205
2206    vmlsl.s16   q8,d10,d6[0]
2207    vmlsl.s16   q8,d11,d4[2]
2208
2209    vmlsl.s16   q9,d10,d2[0]
2210    vmlal.s16   q9,d11,d6[2]
2211
2212    cmp         r12,r6
2213    bhs         stage2_shift3
2214
2215    vld1.16     {d12,d13},[r1]!
2216    vld1.16     {d14,d15},[r1],r10
2217
2218
2219
2220
2221
2222    vmlsl.s16   q12,d14,d7[1]
2223    vmlal.s16   q13,d14,d2[1]
2224    vmlal.s16   q14,d14,d4[1]
2225    vmlsl.s16   q15,d14,d5[1]
2226
2227
2228    vmlal.s16   q12,d15,d0[3]
2229    vmlal.s16   q13,d15,d7[1]
2230    vmlsl.s16   q14,d15,d1[1]
2231    vmlsl.s16   q15,d15,d6[1]
2232
2233
2234    vmlsl.s16   q10,d12,d3[0]
2235    vmlal.s16   q10,d13,d4[2]
2236    vmlal.s16   q11,d12,d7[0]
2237    vmlal.s16   q11,d13,d2[2]
2238    vmlal.s16   q8,d12,d1[0]
2239    vmlsl.s16   q8,d13,d6[2]
2240    vmlal.s16   q9,d12,d5[0]
2241    vmlsl.s16   q9,d13,d0[2]
2242
2243    cmp         r12,r9
2244    bhs         stage2_shift3
2245
2246
2247    vld1.16     {d10,d11},[r1]!
2248    vld1.16     {d8,d9},[r1],r10
2249
2250
2251    vmlsl.s16   q12,d8,d7[3]                @// y1 * cos1(part of b0)
2252    vmlsl.s16   q13,d8,d0[1]                @// y1 * cos3(part of b1)
2253    vmlal.s16   q14,d8,d6[3]                @// y1 * sin3(part of b2)
2254    vmlal.s16   q15,d8,d1[3]                @// y1 * sin1(part of b3)
2255
2256    vmlsl.s16   q12,d9,d0[1]                @// y1 * cos1 + y3 * cos3(part of b0)
2257    vmlal.s16   q13,d9,d5[3]                @// y1 * cos3 - y3 * sin1(part of b1)
2258    vmlal.s16   q14,d9,d3[3]                @// y1 * sin3 - y3 * cos1(part of b2)
2259    vmlsl.s16   q15,d9,d2[3]                @// y1 * sin1 - y3 * sin3(part of b3)
2260
2261
2262
2263
2264
2265    vmlal.s16   q10,d10,d0[0]
2266    vmlsl.s16   q10,d11,d3[2]
2267
2268
2269    vmlsl.s16   q11,d10,d0[0]
2270    vmlsl.s16   q11,d11,d5[2]
2271
2272    vmlsl.s16   q8,d10,d0[0]
2273    vmlal.s16   q8,d11,d1[2]
2274
2275    vmlal.s16   q9,d10,d0[0]
2276    vmlal.s16   q9,d11,d7[2]
2277
2278    vld1.16     {d12,d13},[r1]!
2279    vld1.16     {d14,d15},[r1],r10
2280
2281
2282
2283
2284    vmlal.s16   q12,d14,d6[3]
2285    vmlal.s16   q13,d14,d3[3]
2286    vmlsl.s16   q14,d14,d1[3]
2287    vmlal.s16   q15,d14,d7[1]
2288
2289
2290    vmlal.s16   q12,d15,d1[3]
2291    vmlsl.s16   q13,d15,d2[3]
2292    vmlal.s16   q14,d15,d7[1]
2293    vmlal.s16   q15,d15,d4[1]
2294
2295
2296    vmlsl.s16   q10,d12,d5[0]
2297    vmlal.s16   q10,d13,d2[2]
2298    vmlal.s16   q11,d12,d1[0]
2299    vmlsl.s16   q11,d13,d7[2]
2300    vmlsl.s16   q8,d12,d7[0]
2301    vmlsl.s16   q8,d13,d3[2]
2302    vmlsl.s16   q9,d12,d3[0]
2303    vmlal.s16   q9,d13,d1[2]
2304
2305
2306    vld1.16     {d10,d11},[r1]!
2307    vld1.16     {d8,d9},[r1],r10
2308
2309
2310    vmlsl.s16   q12,d8,d5[3]                @// y1 * cos1(part of b0)
2311    vmlsl.s16   q13,d8,d6[3]                @// y1 * cos3(part of b1)
2312    vmlal.s16   q14,d8,d3[1]                @// y1 * sin3(part of b2)
2313    vmlsl.s16   q15,d8,d0[1]                @// y1 * sin1(part of b3)
2314
2315    vmlsl.s16   q12,d9,d2[3]                @// y1 * cos1 + y3 * cos3(part of b0)
2316    vmlal.s16   q13,d9,d0[1]                @// y1 * cos3 - y3 * sin1(part of b1)
2317    vmlsl.s16   q14,d9,d2[1]                @// y1 * sin3 - y3 * cos1(part of b2)
2318    vmlal.s16   q15,d9,d4[3]                @// y1 * sin1 - y3 * sin3(part of b3)
2319
2320
2321
2322
2323
2324    vmlal.s16   q10,d10,d6[0]
2325    vmlsl.s16   q10,d11,d1[2]
2326
2327
2328    vmlsl.s16   q11,d10,d2[0]
2329    vmlal.s16   q11,d11,d4[2]
2330
2331    vmlal.s16   q8,d10,d2[0]
2332    vmlsl.s16   q8,d11,d7[2]
2333
2334    vmlsl.s16   q9,d10,d6[0]
2335    vmlsl.s16   q9,d11,d5[2]
2336
2337    vld1.16     {d12,d13},[r1]!
2338    vld1.16     {d14,d15},[r1],r10
2339
2340
2341
2342    vmlal.s16   q12,d14,d4[3]
2343    vmlsl.s16   q13,d14,d6[1]
2344    vmlal.s16   q14,d14,d7[3]
2345    vmlal.s16   q15,d14,d6[3]
2346
2347
2348    vmlal.s16   q12,d15,d3[3]
2349    vmlsl.s16   q13,d15,d3[1]
2350    vmlal.s16   q14,d15,d2[3]
2351    vmlsl.s16   q15,d15,d2[1]
2352
2353
2354    vmlsl.s16   q10,d12,d7[0]
2355    vmlal.s16   q10,d13,d0[2]
2356    vmlal.s16   q11,d12,d5[0]
2357    vmlsl.s16   q11,d13,d1[2]
2358    vmlsl.s16   q8,d12,d3[0]
2359    vmlal.s16   q8,d13,d2[2]
2360    vmlal.s16   q9,d12,d1[0]
2361    vmlsl.s16   q9,d13,d3[2]
2362
2363stage2_shift3:
2364    vadd.s32    q4,q10,q12
2365    vsub.s32    q5,q10,q12
2366
2367    vadd.s32    q6,q11,q13
2368    vsub.s32    q12,q11,q13
2369
2370    vadd.s32    q7,q8,q14
2371    vsub.s32    q13,q8,q14
2372
2373
2374    vadd.s32    q8,q9,q15
2375    vsub.s32    q14,q9,q15
2376
2377
2378    vqrshrn.s32 d30,q4,#shift_stage2_idct   @// r0 = (a0 + b0 + rnd) >> 7(shift_stage2_idct)
2379    vqrshrn.s32 d19,q5,#shift_stage2_idct   @// r11 = (a0 - b0 + rnd) >> 7(shift_stage2_idct)
2380    vqrshrn.s32 d31,q7,#shift_stage2_idct   @// r2 = (a2 + b2 + rnd) >> 7(shift_stage2_idct)
2381    vqrshrn.s32 d18,q13,#shift_stage2_idct  @// r5 = (a2 - b2 + rnd) >> 7(shift_stage2_idct)
2382    vqrshrn.s32 d12,q6,#shift_stage2_idct   @// r1 = (a1 + b1 + rnd) >> 7(shift_stage2_idct)
2383    vqrshrn.s32 d15,q12,#shift_stage2_idct  @// r6 = (a1 - b1 + rnd) >> 7(shift_stage2_idct)
2384    vqrshrn.s32 d13,q8,#shift_stage2_idct   @// r3 = (a3 + b3 + rnd) >> 7(shift_stage2_idct)
2385    vqrshrn.s32 d14,q14,#shift_stage2_idct  @// r4 = (a3 - b3 + rnd) >> 7(shift_stage2_idct)
2386
2387    vtrn.16     q15,q6
2388    vtrn.16     q7,q9
2389
2390    vtrn.32     d30,d31
2391    vtrn.32     d12,d13
2392    vtrn.32     d14,d15
2393    vtrn.32     d18,d19
2394
2395
2396    vst1.16     {q15},[r0]!
2397    vst1.16     {q6},[r0]!
2398    vst1.16     {q7},[r0]!
2399    vst1.16     {q9},[r0]!
2400
2401
2402
2403
2404    mov         r1,r4
2405
2406
2407
2408
2409    vld1.16     {d10,d11},[r1]!
2410    vld1.16     {d8,d9},[r1],r10
2411
2412
2413    vmull.s16   q12,d8,d6[1]                @// y1 * cos1(part of b0)
2414    vmull.s16   q13,d8,d6[3]                @// y1 * cos3(part of b1)
2415    vmull.s16   q14,d8,d7[1]                @// y1 * sin3(part of b2)
2416    vmull.s16   q15,d8,d7[3]                @// y1 * sin1(part of b3)
2417
2418    vmlsl.s16   q12,d9,d2[3]                @// y1 * cos1 + y3 * cos3(part of b0)
2419    vmlsl.s16   q13,d9,d4[1]                @// y1 * cos3 - y3 * sin1(part of b1)
2420    vmlsl.s16   q14,d9,d5[3]                @// y1 * sin3 - y3 * cos1(part of b2)
2421    vmlsl.s16   q15,d9,d7[1]                @// y1 * sin1 - y3 * sin3(part of b3)
2422
2423
2424
2425
2426
2427    vmull.s16   q10,d10,d0[0]
2428    vmlsl.s16   q10,d11,d3[2]
2429
2430
2431    vmull.s16   q11,d10,d0[0]
2432    vmlsl.s16   q11,d11,d2[2]
2433
2434    vmull.s16   q8,d10,d0[0]
2435    vmlsl.s16   q8,d11,d1[2]
2436
2437    vmull.s16   q9,d10,d0[0]
2438    vmlsl.s16   q9,d11,d0[2]
2439
2440    cmp         r12,r11
2441    bhs         stage2_shift4
2442    vld1.16     {d12,d13},[r1]!
2443    vld1.16     {d14,d15},[r1],r10
2444
2445
2446
2447
2448
2449
2450    vmlal.s16   q12,d14,d0[1]
2451    vmlal.s16   q13,d14,d1[3]
2452    vmlal.s16   q14,d14,d4[1]
2453    vmlal.s16   q15,d14,d6[3]
2454
2455
2456    vmlsl.s16   q12,d15,d4[1]
2457    vmlsl.s16   q13,d15,d0[3]
2458    vmlsl.s16   q14,d15,d2[3]
2459    vmlsl.s16   q15,d15,d6[1]
2460
2461
2462    vmlal.s16   q10,d12,d7[0]
2463    vmlal.s16   q10,d13,d5[2]
2464    vmlal.s16   q11,d12,d5[0]
2465    vmlsl.s16   q11,d13,d7[2]
2466    vmlal.s16   q8,d12,d3[0]
2467    vmlsl.s16   q8,d13,d4[2]
2468    vmlal.s16   q9,d12,d1[0]
2469    vmlsl.s16   q9,d13,d1[2]
2470
2471    cmp         r12,r5
2472    bhs         stage2_shift4
2473
2474    vld1.16     {d10,d11},[r1]!
2475    vld1.16     {d8,d9},[r1],r10
2476
2477
2478
2479    vmlal.s16   q12,d8,d7[3]                @// y1 * cos1(part of b0)
2480    vmlal.s16   q13,d8,d3[1]                @// y1 * cos3(part of b1)
2481    vmlal.s16   q14,d8,d1[1]                @// y1 * sin3(part of b2)
2482    vmlal.s16   q15,d8,d5[3]                @// y1 * sin1(part of b3)
2483
2484    vmlal.s16   q12,d9,d4[3]                @// y1 * cos1 + y3 * cos3(part of b0)
2485    vmlsl.s16   q13,d9,d5[3]                @// y1 * cos3 - y3 * sin1(part of b1)
2486    vmlsl.s16   q14,d9,d0[1]                @// y1 * sin3 - y3 * cos1(part of b2)
2487    vmlsl.s16   q15,d9,d5[1]                @// y1 * sin1 - y3 * sin3(part of b3)
2488
2489
2490
2491
2492
2493    vmlsl.s16   q10,d10,d2[0]
2494    vmlal.s16   q10,d11,d1[2]
2495
2496
2497    vmlsl.s16   q11,d10,d6[0]
2498    vmlal.s16   q11,d11,d3[2]
2499
2500    vmlal.s16   q8,d10,d6[0]
2501    vmlsl.s16   q8,d11,d7[2]
2502
2503    vmlal.s16   q9,d10,d2[0]
2504    vmlsl.s16   q9,d11,d2[2]
2505
2506    cmp         r12,r6
2507    bhs         stage2_shift4
2508
2509
2510    vld1.16     {d12,d13},[r1]!
2511    vld1.16     {d14,d15},[r1],r10
2512
2513
2514
2515
2516
2517
2518    vmlsl.s16   q12,d14,d1[1]
2519    vmlsl.s16   q13,d14,d7[3]
2520    vmlal.s16   q14,d14,d1[3]
2521    vmlal.s16   q15,d14,d4[3]
2522
2523
2524    vmlal.s16   q12,d15,d2[1]
2525    vmlal.s16   q13,d15,d5[1]
2526    vmlsl.s16   q14,d15,d3[1]
2527    vmlsl.s16   q15,d15,d4[1]
2528
2529
2530    vmlsl.s16   q10,d12,d5[0]
2531    vmlsl.s16   q10,d13,d7[2]
2532    vmlsl.s16   q11,d12,d1[0]
2533    vmlal.s16   q11,d13,d1[2]
2534    vmlsl.s16   q8,d12,d7[0]
2535    vmlal.s16   q8,d13,d5[2]
2536    vmlal.s16   q9,d12,d3[0]
2537    vmlsl.s16   q9,d13,d3[2]
2538
2539    cmp         r12,r9
2540    bhs         stage2_shift4
2541
2542
2543    vld1.16     {d10,d11},[r1]!
2544    vld1.16     {d8,d9},[r1],r10
2545
2546
2547    vmlsl.s16   q12,d8,d5[3]                @// y1 * cos1(part of b0)
2548    vmlsl.s16   q13,d8,d2[3]                @// y1 * cos3(part of b1)
2549    vmlal.s16   q14,d8,d4[3]                @// y1 * sin3(part of b2)
2550    vmlal.s16   q15,d8,d3[3]                @// y1 * sin1(part of b3)
2551
2552    vmlsl.s16   q12,d9,d6[3]                @// y1 * cos1 + y3 * cos3(part of b0)
2553    vmlal.s16   q13,d9,d0[3]                @// y1 * cos3 - y3 * sin1(part of b1)
2554    vmlsl.s16   q14,d9,d6[1]                @// y1 * sin3 - y3 * cos1(part of b2)
2555    vmlsl.s16   q15,d9,d3[1]                @// y1 * sin1 - y3 * sin3(part of b3)
2556
2557
2558
2559
2560
2561    vmlal.s16   q10,d10,d0[0]
2562    vmlsl.s16   q10,d11,d0[2]
2563
2564
2565    vmlsl.s16   q11,d10,d0[0]
2566    vmlal.s16   q11,d11,d6[2]
2567
2568    vmlsl.s16   q8,d10,d0[0]
2569    vmlal.s16   q8,d11,d2[2]
2570
2571    vmlal.s16   q9,d10,d0[0]
2572    vmlsl.s16   q9,d11,d4[2]
2573
2574    vld1.16     {d12,d13},[r1]!
2575    vld1.16     {d14,d15},[r1],r10
2576
2577
2578
2579
2580    vmlal.s16   q12,d14,d3[1]
2581    vmlsl.s16   q13,d14,d2[1]
2582    vmlal.s16   q14,d14,d7[3]
2583    vmlal.s16   q15,d14,d2[3]
2584
2585
2586    vmlsl.s16   q12,d15,d0[3]
2587    vmlal.s16   q13,d15,d4[3]
2588    vmlal.s16   q14,d15,d6[3]
2589    vmlsl.s16   q15,d15,d2[1]
2590
2591
2592    vmlal.s16   q10,d12,d3[0]
2593    vmlsl.s16   q10,d13,d6[2]
2594    vmlal.s16   q11,d12,d7[0]
2595    vmlsl.s16   q11,d13,d4[2]
2596    vmlsl.s16   q8,d12,d1[0]
2597    vmlal.s16   q8,d13,d0[2]
2598    vmlal.s16   q9,d12,d5[0]
2599    vmlsl.s16   q9,d13,d5[2]
2600
2601
2602    vld1.16     {d10,d11},[r1]!
2603    vld1.16     {d8,d9},[r1],r10
2604
2605
2606
2607
2608    vmlal.s16   q12,d8,d3[3]                @// y1 * cos1(part of b0)
2609    vmlsl.s16   q13,d8,d7[1]                @// y1 * cos3(part of b1)
2610    vmlsl.s16   q14,d8,d5[1]                @// y1 * sin3(part of b2)
2611    vmlal.s16   q15,d8,d1[3]                @// y1 * sin1(part of b3)
2612
2613    vmlsl.s16   q12,d9,d7[1]                @// y1 * cos1 + y3 * cos3(part of b0)
2614    vmlsl.s16   q13,d9,d6[1]                @// y1 * cos3 - y3 * sin1(part of b1)
2615    vmlal.s16   q14,d9,d3[3]                @// y1 * sin3 - y3 * cos1(part of b2)
2616    vmlsl.s16   q15,d9,d1[1]                @// y1 * sin1 - y3 * sin3(part of b3)
2617
2618
2619
2620
2621
2622    vmlsl.s16   q10,d10,d6[0]
2623    vmlal.s16   q10,d11,d2[2]
2624
2625
2626    vmlal.s16   q11,d10,d2[0]
2627    vmlsl.s16   q11,d11,d0[2]
2628
2629    vmlsl.s16   q8,d10,d2[0]
2630    vmlal.s16   q8,d11,d3[2]
2631
2632    vmlal.s16   q9,d10,d6[0]
2633    vmlsl.s16   q9,d11,d6[2]
2634
2635
2636    vld1.16     {d12,d13},[r1]!
2637    vld1.16     {d14,d15},[r1],r10
2638
2639
2640
2641    vmlsl.s16   q12,d14,d5[1]
2642    vmlal.s16   q13,d14,d3[3]
2643    vmlsl.s16   q14,d14,d2[1]
2644    vmlal.s16   q15,d14,d0[3]
2645
2646
2647    vmlal.s16   q12,d15,d1[3]
2648    vmlsl.s16   q13,d15,d1[1]
2649    vmlal.s16   q14,d15,d0[3]
2650    vmlsl.s16   q15,d15,d0[1]
2651
2652
2653    vmlsl.s16   q10,d12,d1[0]
2654    vmlal.s16   q10,d13,d4[2]
2655    vmlal.s16   q11,d12,d3[0]
2656    vmlsl.s16   q11,d13,d5[2]
2657    vmlsl.s16   q8,d12,d5[0]
2658    vmlal.s16   q8,d13,d6[2]
2659    vmlal.s16   q9,d12,d7[0]
2660    vmlsl.s16   q9,d13,d7[2]
2661
2662stage2_shift4:
2663    vadd.s32    q4,q10,q12
2664    vsub.s32    q5,q10,q12
2665
2666    vadd.s32    q6,q11,q13
2667    vsub.s32    q12,q11,q13
2668
2669    vadd.s32    q7,q8,q14
2670    vsub.s32    q13,q8,q14
2671
2672
2673    vadd.s32    q8,q9,q15
2674    vsub.s32    q14,q9,q15
2675
2676
2677    vqrshrn.s32 d30,q4,#shift_stage2_idct   @// r0 = (a0 + b0 + rnd) >> 7(shift_stage2_idct)
2678    vqrshrn.s32 d19,q5,#shift_stage2_idct   @// r11 = (a0 - b0 + rnd) >> 7(shift_stage2_idct)
2679    vqrshrn.s32 d31,q7,#shift_stage2_idct   @// r2 = (a2 + b2 + rnd) >> 7(shift_stage2_idct)
2680    vqrshrn.s32 d18,q13,#shift_stage2_idct  @// r5 = (a2 - b2 + rnd) >> 7(shift_stage2_idct)
2681    vqrshrn.s32 d12,q6,#shift_stage2_idct   @// r1 = (a1 + b1 + rnd) >> 7(shift_stage2_idct)
2682    vqrshrn.s32 d15,q12,#shift_stage2_idct  @// r6 = (a1 - b1 + rnd) >> 7(shift_stage2_idct)
2683    vqrshrn.s32 d13,q8,#shift_stage2_idct   @// r3 = (a3 + b3 + rnd) >> 7(shift_stage2_idct)
2684    vqrshrn.s32 d14,q14,#shift_stage2_idct  @// r4 = (a3 - b3 + rnd) >> 7(shift_stage2_idct)
2685
2686
2687
2688    vtrn.16     q15,q6
2689    vtrn.16     q7,q9
2690
2691    vtrn.32     d30,d31
2692    vtrn.32     d12,d13
2693    vtrn.32     d14,d15
2694    vtrn.32     d18,d19
2695
2696
2697
2698    vst1.16     {q15},[r0]!
2699    vst1.16     {q6},[r0]!
2700    vst1.16     {q7},[r0]!
2701    vst1.16     {q9},[r0]!
2702
2703
2704
2705
2706    sub         r0,r0,#256
2707prediction_buffer:
2708
2709
2710    vld1.16     {d12,d13},[r0]!
2711    vld1.16     {d14,d15},[r0]!
2712
2713    add         r0,r0,#32
2714
2715    vld1.16     {d16,d17},[r0]!
2716    vld1.16     {d18,d19},[r0]!
2717    add         r0,r0,#32
2718
2719    vld1.16     {d20,d21},[r0]!
2720    vld1.16     {d22,d23},[r0]!
2721
2722
2723    add         r0,r0,#32
2724
2725    vld1.16     {d24,d25},[r0]!
2726    vld1.16     {d26,d27},[r0]!
2727
2728
2729
2730
2731
2732@ d12 =r0 1- 4 values
2733@ d13 =r2 1- 4 values
2734@ d14=r1 1- 4 values
2735@ d15=r3 1- 4 values
2736
2737@ d16 =r0 5- 8 values
2738@ d17 =r2 5- 8 values
2739@ d18=r1 5- 8 values
2740@ d19=r3 5- 8 values
2741
2742@ d20 =r0 9- 12 values
2743@ d21 =r2 9- 12 values
2744@ d22=r1 9- 12 values
2745@ d23=r3 9- 12 values
2746
2747@ d24 =r0 13-16 values
2748@ d25 =r2 13- 16 values
2749@ d26=r1 13- 16 values
2750@ d27=r3 13- 16 values
2751
2752    vswp        d13,d16
2753    vswp        d21,d24
2754    vswp        d15,d18
2755    vswp        d23,d26
2756
2757
2758    vld1.8      {d8,d9},[r2],r8
2759    vld1.8      {d10,d11},[r2],r8
2760    vld1.8      {d28,d29},[r2],r8
2761    vld1.8      {d30,d31},[r2],r8
2762
2763
2764    vaddw.u8    q6,q6,d8
2765    vaddw.u8    q10,q10,d9
2766    vaddw.u8    q7,q7,d10
2767    vaddw.u8    q11,q11,d11
2768    vaddw.u8    q8,q8,d28
2769    vaddw.u8    q12,q12,d29
2770    vaddw.u8    q9,q9,d30
2771    vaddw.u8    q13,q13,d31
2772    sub         r2,r2,r8,lsl #2
2773    add         r2,r2,#16
2774    vqmovun.s16 d12,q6
2775    vqmovun.s16 d13,q10
2776    vqmovun.s16 d20,q7
2777    vqmovun.s16 d21,q11
2778    vqmovun.s16 d14,q8
2779    vqmovun.s16 d15,q12
2780    vqmovun.s16 d22,q9
2781    vqmovun.s16 d23,q13
2782
2783
2784    vst1.8      {d12,d13},[r3],r7
2785    vst1.8      {d20,d21},[r3],r7
2786    vst1.8      {d14,d15},[r3],r7
2787    vst1.8      {d22,d23},[r3],r7
2788
2789
2790    sub         r3,r3,r7,lsl #2
2791    add         r3,r3,#16
2792
2793    vld1.16     {d12,d13},[r0]!
2794    vld1.16     {d14,d15},[r0]!
2795
2796    sub         r0,r0,#96
2797
2798    vld1.16     {d16,d17},[r0]!
2799    vld1.16     {d18,d19},[r0]!
2800    sub         r0,r0,#96
2801
2802    vld1.16     {d20,d21},[r0]!
2803    vld1.16     {d22,d23},[r0]!
2804
2805
2806    sub         r0,r0,#96
2807
2808    vld1.16     {d24,d25},[r0]!
2809    vld1.16     {d26,d27},[r0]!
2810
2811
2812    sub         r0,r0,#64
2813
2814
2815
2816
2817    vswp        d13,d16
2818    vswp        d21,d24
2819    vswp        d15,d18
2820    vswp        d23,d26
2821
2822
2823    vld1.8      {d8,d9},[r2],r8
2824    vld1.8      {d10,d11},[r2],r8
2825    vld1.8      {d28,d29},[r2],r8
2826    vld1.8      {d30,d31},[r2],r8
2827
2828
2829    vaddw.u8    q6,q6,d8
2830    vaddw.u8    q10,q10,d9
2831    vaddw.u8    q7,q7,d10
2832    vaddw.u8    q11,q11,d11
2833    vaddw.u8    q8,q8,d28
2834    vaddw.u8    q12,q12,d29
2835    vaddw.u8    q9,q9,d30
2836    vaddw.u8    q13,q13,d31
2837    sub         r2,r2,#16
2838
2839    vqmovun.s16 d12,q6
2840    vqmovun.s16 d13,q10
2841    vqmovun.s16 d20,q7
2842    vqmovun.s16 d21,q11
2843    vqmovun.s16 d14,q8
2844    vqmovun.s16 d15,q12
2845    vqmovun.s16 d22,q9
2846    vqmovun.s16 d23,q13
2847
2848
2849    vst1.8      {d12,d13},[r3],r7
2850    vst1.8      {d20,d21},[r3],r7
2851    vst1.8      {d14,d15},[r3],r7
2852    vst1.8      {d22,d23},[r3],r7
2853
2854    sub         r3,r3,#16
2855
2856    subs        r14,r14,#1
2857    bne         dct_stage2
2858    ldmfd       sp!,{r0-r12,pc}
2859
2860
2861
2862
2863
2864