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