• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1@/******************************************************************************
2@ *
3@ * Copyright (C) 2015 The Android Open Source Project
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@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19@*/
20
21@/*
22@//----------------------------------------------------------------------------
23@// File Name            : impeg2_idct.s
24@//
25@// Description          : This file has the Idct Implementations for the
26@//                        MPEG2 SP decoder on neon platform.
27@//
28@// Reference Document   :
29@//
30@// Revision History     :
31@//      Date            Author                  Detail Description
32@//   ------------    ----------------    ----------------------------------
33@//   Feb 22, 2008     Naveen Kumar T                Created
34@//
35@//-------------------------------------------------------------------------
36@*/
37
38@/*
39@// ----------------------------------------------------------------------------
40@// Include Files
41@// ----------------------------------------------------------------------------
42@*/
43
44.text
45.p2align 2
46.equ idct_stg1_shift       ,            12
47.equ idct_stg2_shift       ,            16
48.equ idct_stg1_round     ,          (1 << (idct_stg1_shift - 1))
49.equ idct_stg2_round     ,          (1 << (idct_stg2_shift - 1))
50@/*
51@// ----------------------------------------------------------------------------
52@// Struct/Union Types and Define
53@// ----------------------------------------------------------------------------
54@*/
55
56@/*
57@// ----------------------------------------------------------------------------
58@// Static Global Data section variables
59@// ----------------------------------------------------------------------------
60@*/
61@//--------------------------- NONE --------------------------------------------
62
63@/*
64@// ----------------------------------------------------------------------------
65@// Static Prototype Functions
66@// ----------------------------------------------------------------------------
67@*/
68@// -------------------------- NONE --------------------------------------------
69
70@/*
71@// ----------------------------------------------------------------------------
72@// Exported functions
73@// ----------------------------------------------------------------------------
74@*/
75
76    .extern gai2_impeg2_idct_q15
77.hidden gai2_impeg2_idct_q15
78    .extern gai2_impeg2_idct_q11
79.hidden gai2_impeg2_idct_q11
80    .extern gai2_impeg2_idct_first_col_q15
81.hidden gai2_impeg2_idct_first_col_q15
82    .extern gai2_impeg2_idct_first_col_q11
83.hidden gai2_impeg2_idct_first_col_q11
84    .extern gai2_impeg2_mismatch_stg2_additive
85.hidden gai2_impeg2_mismatch_stg2_additive
86
87gai2_impeg2_idct_q15_addr1:
88    .long gai2_impeg2_idct_q15 - q15lbl1 - 8
89gai2_impeg2_idct_q15_addr2:
90    .long gai2_impeg2_idct_q15 - q15lbl2 - 8
91gai2_impeg2_idct_q11_addr1:
92    .long gai2_impeg2_idct_q11 - q11lbl1 - 8
93gai2_impeg2_idct_q11_addr2:
94    .long gai2_impeg2_idct_q11 - q11lbl2 - 8
95gai2_impeg2_idct_first_col_q15_addr1:
96    .long gai2_impeg2_idct_first_col_q15 - fcq15_lbl1 - 8
97gai2_impeg2_idct_first_col_q15_addr2:
98    .long gai2_impeg2_idct_first_col_q15 - fcq15_lbl2 - 8
99gai2_impeg2_idct_first_col_q15_addr3:
100    .long gai2_impeg2_idct_first_col_q15 - fcq15_lbl3 - 8
101gai2_impeg2_mismatch_stg2_additive_addr:
102    .long gai2_impeg2_mismatch_stg2_additive - additive_lbl - 8
103gai2_impeg2_idct_first_col_q11_addr1:
104    .long gai2_impeg2_idct_first_col_q11 - fcq11_lbl1 - 8
105gai2_impeg2_idct_first_col_q11_addr2:
106    .long gai2_impeg2_idct_first_col_q11 - fcq11_lbl2 - 8
107
108    .global impeg2_idct_recon_dc_a9q
109impeg2_idct_recon_dc_a9q:
110    stmfd           sp!, {r4, r6, r12, lr}
111    vpush           {d8-d15}
112    @//r0: pi2_src
113    @//r1: pi2_tmp - not used, used as pred_strd
114    @//r2: pu1_pred
115    @//r3: pu1_dst
116    @//r4: used as scratch
117    @//r5:
118
119    ldr             r1, [sp, #84]       @//pred_strd
120    ldr             r6, [sp, #88]       @//dst_strd
121
122    ldr             r14, gai2_impeg2_idct_q15_addr1
123q15lbl1:
124    add             r14, r14, pc
125    ldrsh           r12, [r14]
126    ldrsh           r4, [r0]
127
128    vld1.8          d0, [r2], r1
129    mul             r4, r4, r12
130
131    vld1.8          d1, [r2], r1
132    add             r4, #idct_stg1_round
133
134    vld1.8          d2, [r2], r1
135    asr             r4, r4, #idct_stg1_shift
136
137    ldr             r14, gai2_impeg2_idct_q11_addr1
138q11lbl1:
139    add             r14, r14, pc
140    ldrsh           r12, [r14]
141
142    vld1.8          d3, [r2], r1
143    mul             r4, r4, r12
144
145    vld1.8          d4, [r2], r1
146    add             r4, #idct_stg2_round
147
148    vld1.8          d5, [r2], r1
149    asr             r4, r4, #idct_stg2_shift
150
151    vld1.8          d6, [r2], r1
152    vdup.s16        q15, r4
153
154
155    vld1.8          d7, [r2], r1
156
157    vaddw.u8        q4, q15, d0
158
159    vaddw.u8        q5, q15, d1
160    vqmovun.s16     d0, q4
161
162    vaddw.u8        q6, q15, d2
163    vqmovun.s16     d1, q5
164    vst1.8          d0, [r3], r6
165
166    vaddw.u8        q7, q15, d3
167    vqmovun.s16     d2, q6
168    vst1.8          d1, [r3], r6
169
170    vaddw.u8        q8, q15, d4
171    vqmovun.s16     d3, q7
172    vst1.8          d2, [r3], r6
173
174    vaddw.u8        q9, q15, d5
175    vqmovun.s16     d4, q8
176    vst1.8          d3, [r3], r6
177
178    vaddw.u8        q10, q15, d6
179    vqmovun.s16     d5, q9
180    vst1.8          d4, [r3], r6
181
182    vaddw.u8        q11, q15, d7
183    vqmovun.s16     d6, q10
184    vst1.8          d5, [r3], r6
185
186    vqmovun.s16     d7, q11
187    vst1.8          d6, [r3], r6
188
189
190    vst1.8          d7, [r3], r6
191
192    vpop            {d8-d15}
193    ldmfd           sp!, {r4, r6, r12, pc}
194
195
196
197
198    .global impeg2_idct_recon_dc_mismatch_a9q
199impeg2_idct_recon_dc_mismatch_a9q:
200    stmfd           sp!, {r4-r12, lr}
201    vpush           {d8-d15}
202
203    ldr             r1, [sp, #108]      @//pred_strd
204    ldr             r6, [sp, #112]      @//dst_strd
205
206    ldr             r14, gai2_impeg2_idct_q15_addr2
207q15lbl2:
208    add             r14, r14, pc
209    ldrsh           r12, [r14]
210    ldrsh           r4, [r0]
211
212    mul             r4, r4, r12
213    add             r4, #idct_stg1_round
214    asr             r4, r4, #idct_stg1_shift
215
216    ldr             r14, gai2_impeg2_idct_q11_addr2
217q11lbl2:
218    add             r14, r14, pc
219    ldrsh           r12, [r14]
220    mul             r4, r4, r12
221    vdup.s32        q0, r4
222
223    mov             r14, #16            @//Increment for table read
224    ldr             r4, gai2_impeg2_mismatch_stg2_additive_addr
225additive_lbl:
226    add             r4, r4, pc
227
228    vld1.16         {q1}, [r4], r14
229
230    vld1.8          d30, [r2], r1
231    vmovl.s16       q4, d2
232    vmovl.s16       q5, d3
233    vraddhn.s32     d12, q0, q4
234    vraddhn.s32     d13, q0, q5
235    vaddw.u8        q7, q6, d30
236    vqmovun.s16     d30, q7
237    vst1.8          d30, [r3], r6
238
239    vld1.16         {q1}, [r4], r14
240    vld1.8          d30, [r2], r1
241    vmovl.s16       q4, d2
242    vmovl.s16       q5, d3
243    vraddhn.s32     d12, q0, q4
244    vraddhn.s32     d13, q0, q5
245    vaddw.u8        q7, q6, d30
246    vqmovun.s16     d30, q7
247    vst1.8          d30, [r3], r6
248
249    vld1.16         {q1}, [r4], r14
250    vld1.8          d30, [r2], r1
251    vmovl.s16       q4, d2
252    vmovl.s16       q5, d3
253    vraddhn.s32     d12, q0, q4
254    vraddhn.s32     d13, q0, q5
255    vaddw.u8        q7, q6, d30
256    vqmovun.s16     d30, q7
257    vst1.8          d30, [r3], r6
258
259    vld1.16         {q1}, [r4], r14
260    vld1.8          d30, [r2], r1
261    vmovl.s16       q4, d2
262    vmovl.s16       q5, d3
263    vraddhn.s32     d12, q0, q4
264    vraddhn.s32     d13, q0, q5
265    vaddw.u8        q7, q6, d30
266    vqmovun.s16     d30, q7
267    vst1.8          d30, [r3], r6
268
269    vld1.16         {q1}, [r4], r14
270    vld1.8          d30, [r2], r1
271    vmovl.s16       q4, d2
272    vmovl.s16       q5, d3
273    vraddhn.s32     d12, q0, q4
274    vraddhn.s32     d13, q0, q5
275    vaddw.u8        q7, q6, d30
276    vqmovun.s16     d30, q7
277    vst1.8          d30, [r3], r6
278
279    vld1.16         {q1}, [r4], r14
280    vld1.8          d30, [r2], r1
281    vmovl.s16       q4, d2
282    vmovl.s16       q5, d3
283    vraddhn.s32     d12, q0, q4
284    vraddhn.s32     d13, q0, q5
285    vaddw.u8        q7, q6, d30
286    vqmovun.s16     d30, q7
287    vst1.8          d30, [r3], r6
288
289    vld1.16         {q1}, [r4], r14
290    vld1.8          d30, [r2], r1
291    vmovl.s16       q4, d2
292    vmovl.s16       q5, d3
293    vraddhn.s32     d12, q0, q4
294    vraddhn.s32     d13, q0, q5
295    vaddw.u8        q7, q6, d30
296    vqmovun.s16     d30, q7
297    vst1.8          d30, [r3], r6
298
299    vld1.16         {q1}, [r4], r14
300    vld1.8          d30, [r2], r1
301    vmovl.s16       q4, d2
302    vmovl.s16       q5, d3
303    vraddhn.s32     d12, q0, q4
304    vraddhn.s32     d13, q0, q5
305    vaddw.u8        q7, q6, d30
306    vqmovun.s16     d30, q7
307    vst1.8          d30, [r3], r6
308
309
310    vpop            {d8-d15}
311    ldmfd           sp!, {r4-r12, pc}
312
313
314
315
316@/**
317@ *******************************************************************************
318@ *
319@ * ;brief
320@ *  This function performs Inverse transform  and reconstruction for 8x8
321@ * input block
322@ *
323@ * ;par Description:
324@ *  Performs inverse transform and adds the prediction  data and clips output
325@ * to 8 bit
326@ *
327@ * ;param[in] pi2_src
328@ *  Input 8x8 coefficients
329@ *
330@ * ;param[in] pi2_tmp
331@ *  Temporary 8x8 buffer for storing inverse
332@ *
333@ *  transform
334@ *  1st stage output
335@ *
336@ * ;param[in] pu1_pred
337@ *  Prediction 8x8 block
338@ *
339@ * ;param[out] pu1_dst
340@ *  Output 8x8 block
341@ *
342@ * ;param[in] src_strd
343@ *  Input stride
344@ *
345@ * ;param[in] pred_strd
346@ *  Prediction stride
347@ *
348@ * ;param[in] dst_strd
349@ *  Output Stride
350@ *
351@ * ;param[in] shift
352@ *  Output shift
353@ *
354@ * ;param[in] zero_cols
355@ *  Zero columns in pi2_src
356@ *
357@ * ;returns  Void
358@ *
359@ * ;remarks
360@ *  None
361@ *
362@ *******************************************************************************
363@ */
364
365@void impeg2_itrans_recon_8x8(WORD16 *pi2_src,
366@                            WORD16 *pi2_tmp,
367@                            UWORD8 *pu1_pred,
368@                            UWORD8 *pu1_dst,
369@                            WORD32 src_strd,
370@                            WORD32 pred_strd,
371@                            WORD32 dst_strd,
372@                            WORD32 zero_cols
373@                            WORD32 zero_rows               )
374
375@**************Variables Vs Registers*************************
376@   r0 => *pi2_src
377@   r1 => *pi2_tmp
378@   r2 => *pu1_pred
379@   r3 => *pu1_dst
380@   src_strd
381@   pred_strd
382@   dst_strd
383@   zero_cols
384
385
386
387    .global impeg2_idct_recon_a9q
388impeg2_idct_recon_a9q:
389@//Register Usage Reference     - loading and Until IDCT of columns
390@// Cosine Constants    -   D0
391@// Sine Constants      -   D1
392@// Row 0 First Half    -   D2      -   y0
393@// Row 1 First Half    -   D6      -   y1
394@// Row 2 First Half    -   D3      -   y2
395@// Row 3 First Half    -   D7      -   y3
396@// Row 4 First Half    -   D10     -   y4
397@// Row 5 First Half    -   D14     -   y5
398@// Row 6 First Half    -   D11     -   y6
399@// Row 7 First Half    -   D15     -   y7
400
401@// Row 0 Second Half   -   D4      -   y0
402@// Row 1 Second Half   -   D8      -   y1
403@// Row 2 Second Half   -   D5      -   y2
404@// Row 3 Second Half   -   D9      -   y3
405@// Row 4 Second Half   -   D12     -   y4
406@// Row 5 Second Half   -   D16     -   y5
407@// Row 6 Second Half   -   D13     -   y6
408@// Row 7 Second Half   -   D17     -   y7
409
410    @// Copy the input pointer to another register
411    @// Step 1 : load all constants
412    stmfd           sp!, {r4-r12, lr}
413    vpush           {d8-d15}
414
415    ldr             r8, [sp, #108]        @ prediction stride
416    ldr             r7, [sp, #112]        @ destination stride
417    ldr             r6, [sp, #104]            @ src stride
418    ldr             r12, [sp, #116]
419    ldr             r11, [sp, #120]
420
421    mov             r6, r6, lsl #1      @ x sizeof(word16)
422    add             r9, r0, r6, lsl #1  @ 2 rows
423
424    add             r10, r6, r6, lsl #1 @ 3 rows
425
426    sub             r10, r10, #8        @ - 4 cols * sizeof(WORD16)
427    sub             r5, r6, #8          @ src_strd - 4 cols * sizeof(WORD16)
428
429
430    ldr             r14, gai2_impeg2_idct_first_col_q15_addr1
431fcq15_lbl1:
432    add             r14, r14, pc
433    vld1.16         {d0, d1}, [r14]     @//D0,D1 are used for storing the constant data
434
435    @//Step 2 Load all the input data
436    @//Step 3 Operate first 4 colums at a time
437
438    and             r11, r11, #0xff
439    and             r12, r12, #0xff
440
441    cmp             r11, #0xf0
442    bge             skip_last4_rows
443
444
445    vld1.16         d2, [r0]!
446    vld1.16         d3, [r9]!
447    vld1.16         d4, [r0], r5
448    vmull.s16       q10, d2, d0[0]      @// y0 * cos4(part of c0 and c1)
449    vld1.16         d5, [r9], r5
450    vmull.s16       q9, d3, d1[2]       @// y2 * sin2 (Q3 is freed by this time)(part of d1)
451    vld1.16         d6, [r0]!
452    vld1.16         d7, [r9]!
453    vmull.s16       q12, d6, d0[1]      @// y1 * cos1(part of b0)
454    vld1.16         d8, [r0], r10
455    vmull.s16       q13, d6, d0[3]      @// y1 * cos3(part of b1)
456    vld1.16         d9, [r9], r10
457    vmull.s16       q14, d6, d1[1]      @// y1 * sin3(part of b2)
458    vld1.16         d10, [r0]!
459    vmull.s16       q15, d6, d1[3]      @// y1 * sin1(part of b3)
460    vld1.16         d11, [r9]!
461    vmlal.s16       q12, d7, d0[3]      @// y1 * cos1 + y3 * cos3(part of b0)
462    vld1.16         d12, [r0], r5
463    vmlsl.s16       q13, d7, d1[3]      @// y1 * cos3 - y3 * sin1(part of b1)
464    vld1.16         d13, [r9], r5
465    vmlsl.s16       q14, d7, d0[1]      @// y1 * sin3 - y3 * cos1(part of b2)
466    vld1.16         d14, [r0]!
467    vmlsl.s16       q15, d7, d1[1]      @// y1 * sin1 - y3 * sin3(part of b3)
468    vld1.16         d15, [r9]!
469    vmull.s16       q11, d10, d0[0]     @// y4 * cos4(part of c0 and c1)
470    vld1.16         d16, [r0], r10
471    vmull.s16       q3, d3, d0[2]       @// y2 * cos2(part of d0)
472    vld1.16         d17, [r9], r10
473
474    @/* This following was activated when alignment is not there */
475@// VLD1.16     D2,[r0]!
476@// VLD1.16     D3,[r2]!
477@// VLD1.16     D4,[r0]!
478@// VLD1.16     D5,[r2]!
479@// VLD1.16     D6,[r0]!
480@// VLD1.16     D7,[r2]!
481@// VLD1.16     D8,[r0],r3
482@// VLD1.16     D9,[r2],r3
483@// VLD1.16     D10,[r0]!
484@// VLD1.16     D11,[r2]!
485@// VLD1.16     D12,[r0]!
486@// VLD1.16     D13,[r2]!
487@// VLD1.16     D14,[r0]!
488@// VLD1.16     D15,[r2]!
489@// VLD1.16     D16,[r0],r3
490@// VLD1.16     D17,[r2],r3
491
492
493
494
495    vmlal.s16       q12, d14, d1[1]     @// y1 * cos1 + y3 * cos3 + y5 * sin3(part of b0)
496    vmlsl.s16       q13, d14, d0[1]     @// y1 * cos3 - y3 * sin1 - y5 * cos1(part of b1)
497    vmlal.s16       q14, d14, d1[3]     @// y1 * sin3 - y3 * cos1 + y5 * sin1(part of b2)
498    vmlal.s16       q15, d14, d0[3]     @// y1 * sin1 - y3 * sin3 + y5 * cos3(part of b3)
499
500    vmlsl.s16       q9, d11, d0[2]      @// d1 = y2 * sin2 - y6 * cos2(part of a0 and a1)
501    vmlal.s16       q3, d11, d1[2]      @// d0 = y2 * cos2 + y6 * sin2(part of a0 and a1)
502
503    vadd.s32        q5, q10, q11        @// c0 = y0 * cos4 + y4 * cos4(part of a0 and a1)
504    vsub.s32        q10, q10, q11       @// c1 = y0 * cos4 - y4 * cos4(part of a0 and a1)
505
506    vmlal.s16       q12, d15, d1[3]     @// b0 = y1 * cos1 + y3 * cos3 + y5 * sin3 + y7 * sin1(part of r0,r7)
507    vmlsl.s16       q13, d15, d1[1]     @// b1 = y1 * cos3 - y3 * sin1 - y5 * cos1 - y7 * sin3(part of r1,r6)
508    vmlal.s16       q14, d15, d0[3]     @// b2 = y1 * sin3 - y3 * cos1 + y5 * sin1 + y7 * cos3(part of r2,r5)
509    vmlsl.s16       q15, d15, d0[1]     @// b3 = y1 * sin1 - y3 * sin3 + y5 * cos3 - y7 * cos1(part of r3,r4)
510
511    vadd.s32        q7, q5, q3          @// a0 = c0 + d0(part of r0,r7)
512    vsub.s32        q5, q5, q3          @// a3 = c0 - d0(part of r3,r4)
513    vsub.s32        q11, q10, q9        @// a2 = c1 - d1(part of r2,r5)
514    vadd.s32        q9, q10, q9         @// a1 = c1 + d1(part of r1,r6)
515
516    vadd.s32        q10, q7, q12        @// a0 + b0(part of r0)
517    vsub.s32        q3, q7, q12         @// a0 - b0(part of r7)
518
519    vadd.s32        q12, q11, q14       @// a2 + b2(part of r2)
520    vsub.s32        q11, q11, q14       @// a2 - b2(part of r5)
521
522    vadd.s32        q14, q9, q13        @// a1 + b1(part of r1)
523    vsub.s32        q9, q9, q13         @// a1 - b1(part of r6)
524
525    vadd.s32        q13, q5, q15        @// a3 + b3(part of r3)
526    vsub.s32        q15, q5, q15        @// a3 - b3(part of r4)
527
528    vqrshrn.s32     d2, q10, #idct_stg1_shift @// r0 = (a0 + b0 + rnd) >> 7(IDCT_STG1_SHIFT)
529    vqrshrn.s32     d15, q3, #idct_stg1_shift @// r7 = (a0 - b0 + rnd) >> 7(IDCT_STG1_SHIFT)
530    vqrshrn.s32     d3, q12, #idct_stg1_shift @// r2 = (a2 + b2 + rnd) >> 7(IDCT_STG1_SHIFT)
531    vqrshrn.s32     d14, q11, #idct_stg1_shift @// r5 = (a2 - b2 + rnd) >> 7(IDCT_STG1_SHIFT)
532    vqrshrn.s32     d6, q14, #idct_stg1_shift @// r1 = (a1 + b1 + rnd) >> 7(IDCT_STG1_SHIFT)
533    vqrshrn.s32     d11, q9, #idct_stg1_shift @// r6 = (a1 - b1 + rnd) >> 7(IDCT_STG1_SHIFT)
534    vqrshrn.s32     d7, q13, #idct_stg1_shift @// r3 = (a3 + b3 + rnd) >> 7(IDCT_STG1_SHIFT)
535    vqrshrn.s32     d10, q15, #idct_stg1_shift @// r4 = (a3 - b3 + rnd) >> 7(IDCT_STG1_SHIFT)
536
537
538    b               last4_cols
539
540
541
542skip_last4_rows:
543
544
545    ldr             r14, gai2_impeg2_idct_first_col_q15_addr2
546fcq15_lbl2:
547    add             r14, r14, pc
548    vld1.16         {d0, d1}, [r14]     @//D0,D1 are used for storing the constant data
549
550    vld1.16         d2, [r0]!
551    vld1.16         d3, [r9]!
552    vld1.16         d4, [r0], r5
553    vld1.16         d5, [r9], r5
554    vld1.16         d6, [r0]!
555    vld1.16         d7, [r9]!
556    vld1.16         d8, [r0], r10
557    vld1.16         d9, [r9], r10
558
559
560
561    vmov.s16        q6, #0
562    vmov.s16        q8, #0
563
564
565
566
567    vmull.s16       q12, d6, d0[1]      @// y1 * cos1(part of b0)
568    vmull.s16       q13, d6, d0[3]      @// y1 * cos3(part of b1)
569    vmull.s16       q14, d6, d1[1]      @// y1 * sin3(part of b2)
570    vmull.s16       q15, d6, d1[3]      @// y1 * sin1(part of b3)
571
572    vmlal.s16       q12, d7, d0[3]      @// y1 * cos1 + y3 * cos3(part of b0)
573    vmlsl.s16       q13, d7, d1[3]      @// y1 * cos3 - y3 * sin1(part of b1)
574    vmlsl.s16       q14, d7, d0[1]      @// y1 * sin3 - y3 * cos1(part of b2)
575    vmlsl.s16       q15, d7, d1[1]      @// y1 * sin1 - y3 * sin3(part of b3)
576
577    vmull.s16       q9, d3, d1[2]       @// y2 * sin2 (Q3 is freed by this time)(part of d1)
578    vmull.s16       q3, d3, d0[2]       @// y2 * cos2(part of d0)
579
580    vmull.s16       q10, d2, d0[0]      @// y0 * cos4(part of c0 and c1)
581
582
583    vadd.s32        q7, q10, q3         @// a0 = c0 + d0(part of r0,r7)
584    vsub.s32        q5, q10, q3         @// a3 = c0 - d0(part of r3,r4)
585    vsub.s32        q11, q10, q9        @// a2 = c1 - d1(part of r2,r5)
586    vadd.s32        q9, q10, q9         @// a1 = c1 + d1(part of r1,r6)
587
588    vadd.s32        q10, q7, q12        @// a0 + b0(part of r0)
589    vsub.s32        q3, q7, q12         @// a0 - b0(part of r7)
590
591    vadd.s32        q12, q11, q14       @// a2 + b2(part of r2)
592    vsub.s32        q11, q11, q14       @// a2 - b2(part of r5)
593
594    vadd.s32        q14, q9, q13        @// a1 + b1(part of r1)
595    vsub.s32        q9, q9, q13         @// a1 - b1(part of r6)
596
597    vadd.s32        q13, q5, q15        @// a3 + b3(part of r3)
598    vsub.s32        q15, q5, q15        @// a3 - b3(part of r4)
599
600    vqrshrn.s32     d2, q10, #idct_stg1_shift @// r0 = (a0 + b0 + rnd) >> 7(IDCT_STG1_SHIFT)
601    vqrshrn.s32     d15, q3, #idct_stg1_shift @// r7 = (a0 - b0 + rnd) >> 7(IDCT_STG1_SHIFT)
602    vqrshrn.s32     d3, q12, #idct_stg1_shift @// r2 = (a2 + b2 + rnd) >> 7(IDCT_STG1_SHIFT)
603    vqrshrn.s32     d14, q11, #idct_stg1_shift @// r5 = (a2 - b2 + rnd) >> 7(IDCT_STG1_SHIFT)
604    vqrshrn.s32     d6, q14, #idct_stg1_shift @// r1 = (a1 + b1 + rnd) >> 7(IDCT_STG1_SHIFT)
605    vqrshrn.s32     d11, q9, #idct_stg1_shift @// r6 = (a1 - b1 + rnd) >> 7(IDCT_STG1_SHIFT)
606    vqrshrn.s32     d7, q13, #idct_stg1_shift @// r3 = (a3 + b3 + rnd) >> 7(IDCT_STG1_SHIFT)
607    vqrshrn.s32     d10, q15, #idct_stg1_shift @// r4 = (a3 - b3 + rnd) >> 7(IDCT_STG1_SHIFT)
608
609
610last4_cols:
611
612
613    cmp             r12, #0xf0
614    bge             skip_last4cols
615
616    ldr             r14, gai2_impeg2_idct_first_col_q15_addr3
617fcq15_lbl3:
618    add             r14, r14, pc
619    vld1.16         {d0, d1}, [r14]     @//D0,D1 are used for storing the constant data
620
621    vmull.s16       q12, d8, d0[1]      @// y1 * cos1(part of b0)
622    vmull.s16       q13, d8, d0[3]      @// y1 * cos3(part of b1)
623    vmull.s16       q14, d8, d1[1]      @// y1 * sin3(part of b2)
624    vmull.s16       q15, d8, d1[3]      @// y1 * sin1(part of b3)
625
626    vmlal.s16       q12, d9, d0[3]      @// y1 * cos1 + y3 * cos3(part of b0)
627    vmlsl.s16       q13, d9, d1[3]      @// y1 * cos3 - y3 * sin1(part of b1)
628    vmlsl.s16       q14, d9, d0[1]      @// y1 * sin3 - y3 * cos1(part of b2)
629    vmlsl.s16       q15, d9, d1[1]      @// y1 * sin1 - y3 * sin3(part of b3)
630
631    vmull.s16       q9, d5, d1[2]       @// y2 * sin2 (Q4 is freed by this time)(part of d1)
632    vmull.s16       q4, d5, d0[2]       @// y2 * cos2(part of d0)
633
634    vmull.s16       q10, d4, d0[0]      @// y0 * cos4(part of c0 and c1)
635    vmull.s16       q11, d12, d0[0]     @// y4 * cos4(part of c0 and c1)
636
637    vmlal.s16       q12, d16, d1[1]     @// y1 * cos1 + y3 * cos3 + y5 * sin3(part of b0)
638    vmlsl.s16       q13, d16, d0[1]     @// y1 * cos3 - y3 * sin1 - y5 * cos1(part of b1)
639    vmlal.s16       q14, d16, d1[3]     @// y1 * sin3 - y3 * cos1 + y5 * sin1(part of b2)
640    vmlal.s16       q15, d16, d0[3]     @// y1 * sin1 - y3 * sin3 + y5 * cos3(part of b3)
641
642    vmlsl.s16       q9, d13, d0[2]      @// d1 = y2 * sin2 - y6 * cos2(part of a0 and a1)
643    vmlal.s16       q4, d13, d1[2]      @// d0 = y2 * cos2 + y6 * sin2(part of a0 and a1)
644
645    vadd.s32        q6, q10, q11        @// c0 = y0 * cos4 + y4 * cos4(part of a0 and a1)
646    vsub.s32        q10, q10, q11       @// c1 = y0 * cos4 - y4 * cos4(part of a0 and a1)
647
648    vmlal.s16       q12, d17, d1[3]     @// b0 = y1 * cos1 + y3 * cos3 + y5 * sin3 + y7 * sin1(part of e0,e7)
649    vmlsl.s16       q13, d17, d1[1]     @// b1 = y1 * cos3 - y3 * sin1 - y5 * cos1 - y7 * sin3(part of e1,e6)
650    vmlal.s16       q14, d17, d0[3]     @// b2 = y1 * sin3 - y3 * cos1 + y5 * sin1 + y7 * cos3(part of e2,e5)
651    vmlsl.s16       q15, d17, d0[1]     @// b3 = y1 * sin1 - y3 * sin3 + y5 * cos3 - y7 * cos1(part of e3,e4)
652
653    vadd.s32        q8, q6, q4          @// a0 = c0 + d0(part of e0,e7)
654    vsub.s32        q6, q6, q4          @// a3 = c0 - d0(part of e3,e4)
655    vsub.s32        q11, q10, q9        @// a2 = c1 - d1(part of e2,e5)
656    vadd.s32        q9, q10, q9         @// a1 = c1 + d1(part of e1,e6)
657
658    vadd.s32        q10, q8, q12        @// a0 + b0(part of e0)
659    vsub.s32        q4, q8, q12         @// a0 - b0(part of e7)
660
661    vadd.s32        q12, q11, q14       @// a2 + b2(part of e2)
662    vsub.s32        q11, q11, q14       @// a2 - b2(part of e5)
663
664    vadd.s32        q14, q9, q13        @// a1 + b1(part of e1)
665    vsub.s32        q9, q9, q13         @// a1 - b1(part of e6)
666
667    vadd.s32        q13, q6, q15        @// a3 + b3(part of e3)
668    vsub.s32        q15, q6, q15        @// a3 - b3(part of r4)
669
670    vqrshrn.s32     d4, q10, #idct_stg1_shift @// r0 = (a0 + b0 + rnd) >> 7(IDCT_STG1_SHIFT)
671    vqrshrn.s32     d17, q4, #idct_stg1_shift @// r7 = (a0 - b0 + rnd) >> 7(IDCT_STG1_SHIFT)
672    vqrshrn.s32     d5, q12, #idct_stg1_shift @// r2 = (a2 + b2 + rnd) >> 7(IDCT_STG1_SHIFT)
673    vqrshrn.s32     d16, q11, #idct_stg1_shift @// r5 = (a2 - b2 + rnd) >> 7(IDCT_STG1_SHIFT)
674    vqrshrn.s32     d8, q14, #idct_stg1_shift @// r1 = (a1 + b1 + rnd) >> 7(IDCT_STG1_SHIFT)
675    vqrshrn.s32     d13, q9, #idct_stg1_shift @// r6 = (a1 - b1 + rnd) >> 7(IDCT_STG1_SHIFT)
676    vqrshrn.s32     d9, q13, #idct_stg1_shift @// r3 = (a3 + b3 + rnd) >> 7(IDCT_STG1_SHIFT)
677    vqrshrn.s32     d12, q15, #idct_stg1_shift @// r4 = (a3 - b3 + rnd) >> 7(IDCT_STG1_SHIFT)
678    b               end_skip_last4cols
679
680
681
682skip_last4cols:
683
684
685
686    ldr             r14, gai2_impeg2_idct_first_col_q11_addr1
687fcq11_lbl1:
688    add             r14, r14, pc
689    vld1.16         {d0, d1}, [r14]     @//D0,D1 are used for storing the constant data
690
691
692
693    vtrn.16         q1, q3              @//[r3,r1],[r2,r0] first qudrant transposing
694
695    vtrn.16         q5, q7              @//[r7,r5],[r6,r4] third qudrant transposing
696
697
698    vtrn.32         d6, d7              @//r0,r1,r2,r3 first qudrant transposing continued.....
699    vtrn.32         d2, d3              @//r0,r1,r2,r3 first qudrant transposing continued.....
700
701    vtrn.32         d10, d11            @//r4,r5,r6,r7 third qudrant transposing continued.....
702    vtrn.32         d14, d15            @//r4,r5,r6,r7 third qudrant transposing continued.....
703
704
705    vmull.s16       q12, d6, d0[1]      @// y1 * cos1(part of b0)
706    vmull.s16       q13, d6, d0[3]      @// y1 * cos3(part of b1)
707    vmull.s16       q14, d6, d1[1]      @// y1 * sin3(part of b2)
708    vmull.s16       q15, d6, d1[3]      @// y1 * sin1(part of b3)
709
710    vmlal.s16       q12, d7, d0[3]      @// y1 * cos1 + y3 * cos3(part of b0)
711    vmlsl.s16       q13, d7, d1[3]      @// y1 * cos3 - y3 * sin1(part of b1)
712    vmlsl.s16       q14, d7, d0[1]      @// y1 * sin3 - y3 * cos1(part of b2)
713    vmlsl.s16       q15, d7, d1[1]      @// y1 * sin1 - y3 * sin3(part of b3)
714
715    vmull.s16       q10, d2, d0[0]      @// y0 * cos4(part of c0 and c1)
716@   VMULL.S16   Q11,D4,D0[0]                    ;// y4 * cos4(part of c0 and c1)
717
718    vmull.s16       q9, d3, d1[2]       @// y2 * sin2 (Q3 is freed by this time)(part of d1)
719    vmull.s16       q3, d3, d0[2]       @// y2 * cos2(part of d0)
720
721
722
723
724    vsub.s32        q11, q10, q3        @// a3 = c0 - d0(part of r3,r4)
725    vadd.s32        q2, q10, q3         @// a0 = c0 + d0(part of r0,r7)
726
727
728    vadd.s32        q1, q2, q12
729
730    vsub.s32        q3, q2, q12
731
732    vadd.s32        q4, q11, q15
733
734    vsub.s32        q12, q11, q15
735
736    vqrshrn.s32     d5, q4, #idct_stg2_shift
737    vqrshrn.s32     d2, q1, #idct_stg2_shift
738    vqrshrn.s32     d9, q3, #idct_stg2_shift
739    vqrshrn.s32     d6, q12, #idct_stg2_shift
740
741    vsub.s32        q11, q10, q9        @// a2 = c1 - d1(part of r2,r5)
742    vadd.s32        q9, q10, q9         @// a1 = c1 + d1(part of r1,r6)
743
744
745    vadd.s32        q15, q11, q14
746
747    vsub.s32        q12, q11, q14
748
749    vadd.s32        q14, q9, q13
750
751    vsub.s32        q11, q9, q13
752    vqrshrn.s32     d4, q15, #idct_stg2_shift
753    vqrshrn.s32     d7, q12, #idct_stg2_shift
754    vqrshrn.s32     d3, q14, #idct_stg2_shift
755    vqrshrn.s32     d8, q11, #idct_stg2_shift
756
757
758
759
760
761
762
763
764
765
766    vmull.s16       q12, d14, d0[1]     @// y1 * cos1(part of b0)
767
768    vmull.s16       q13, d14, d0[3]     @// y1 * cos3(part of b1)
769    vmull.s16       q14, d14, d1[1]     @// y1 * sin3(part of b2)
770    vmull.s16       q15, d14, d1[3]     @// y1 * sin1(part of b3)
771
772    vmlal.s16       q12, d15, d0[3]     @// y1 * cos1 + y3 * cos3(part of b0)
773    vtrn.16         d2, d3
774    vmlsl.s16       q13, d15, d1[3]     @// y1 * cos3 - y3 * sin1(part of b1)
775    vtrn.16         d4, d5
776    vmlsl.s16       q14, d15, d0[1]     @// y1 * sin3 - y3 * cos1(part of b2)
777    vtrn.16         d6, d7
778    vmlsl.s16       q15, d15, d1[1]     @// y1 * sin1 - y3 * sin3(part of b3)
779    vtrn.16         d8, d9
780    vmull.s16       q10, d10, d0[0]     @// y0 * cos4(part of c0 and c1)
781    vtrn.32         d2, d4
782
783    vtrn.32         d3, d5
784    vmull.s16       q9, d11, d1[2]      @// y2 * sin2 (Q7 is freed by this time)(part of d1)
785    vtrn.32         d6, d8
786    vmull.s16       q7, d11, d0[2]      @// y2 * cos2(part of d0)
787    vtrn.32         d7, d9
788
789
790    add             r4, r2, r8, lsl #1  @ r4 = r2 + pred_strd * 2    => r4 points to 3rd row of pred data
791
792
793    add             r5, r8, r8, lsl #1  @
794
795
796    add             r0, r3, r7, lsl #1  @ r0 points to 3rd row of dest data
797
798
799    add             r10, r7, r7, lsl #1 @
800
801
802    vswp            d3, d6
803
804
805    vswp            d5, d8
806
807
808    vsub.s32        q11, q10, q7        @// a3 = c0 - d0(part of r3,r4)
809    vadd.s32        q6, q10, q7         @// a0 = c0 + d0(part of r0,r7)
810
811
812    vadd.s32        q0, q6, q12
813
814
815    vsub.s32        q12, q6, q12
816
817
818    vadd.s32        q6, q11, q15
819
820
821    vsub.s32        q7, q11, q15
822
823    vqrshrn.s32     d10, q0, #idct_stg2_shift
824    vqrshrn.s32     d17, q12, #idct_stg2_shift
825    vqrshrn.s32     d13, q6, #idct_stg2_shift
826    vqrshrn.s32     d14, q7, #idct_stg2_shift
827
828    vsub.s32        q11, q10, q9        @// a2 = c1 - d1(part of r2,r5)
829    vadd.s32        q9, q10, q9         @// a1 = c1 + d1(part of r1,r6)
830
831
832    vadd.s32        q0, q11, q14
833
834
835    vsub.s32        q12, q11, q14
836
837
838    vadd.s32        q14, q9, q13
839
840
841    vsub.s32        q13, q9, q13
842    vld1.8          d18, [r2], r8
843
844    vqrshrn.s32     d12, q0, #idct_stg2_shift
845    vld1.8          d20, [r2], r5
846
847
848    vqrshrn.s32     d15, q12, #idct_stg2_shift
849    vld1.8          d19, [r2], r8
850
851
852
853
854    vqrshrn.s32     d11, q14, #idct_stg2_shift
855    vld1.8          d22, [r4], r8
856
857
858
859
860    vqrshrn.s32     d16, q13, #idct_stg2_shift
861    vld1.8          d21, [r2], r5
862
863
864    b               pred_buff_addition
865end_skip_last4cols:
866
867    ldr             r14, gai2_impeg2_idct_first_col_q11_addr2
868fcq11_lbl2:
869    add             r14, r14, pc
870    vld1.16         {d0, d1}, [r14]     @//D0,D1 are used for storing the constant data
871
872
873@/* Now the Idct of columns is done, transpose so that row idct done efficiently(step5) */
874    vtrn.16         q1, q3              @//[r3,r1],[r2,r0] first qudrant transposing
875    vtrn.16         q2, q4              @//[r3,r1],[r2,r0] second qudrant transposing
876    vtrn.16         q5, q7              @//[r7,r5],[r6,r4] third qudrant transposing
877    vtrn.16         q6, q8              @//[r7,r5],[r6,r4] fourth qudrant transposing
878
879    vtrn.32         d6, d7              @//r0,r1,r2,r3 first qudrant transposing continued.....
880    vtrn.32         d2, d3              @//r0,r1,r2,r3 first qudrant transposing continued.....
881    vtrn.32         d4, d5              @//r0,r1,r2,r3 second qudrant transposing continued.....
882    vtrn.32         d8, d9              @//r0,r1,r2,r3 second qudrant transposing continued.....
883    vtrn.32         d10, d11            @//r4,r5,r6,r7 third qudrant transposing continued.....
884    vtrn.32         d14, d15            @//r4,r5,r6,r7 third qudrant transposing continued.....
885    vtrn.32         d12, d13            @//r4,r5,r6,r7 fourth qudrant transposing continued.....
886    vtrn.32         d16, d17            @//r4,r5,r6,r7 fourth qudrant transposing continued.....
887
888    @//step6 Operate on first four rows and find their idct
889    @//Register Usage Reference     - storing and IDCT of rows
890@// Cosine Constants    -   D0
891@// Sine Constants      -   D1
892@// Element 0 First four    -   D2      -   y0
893@// Element 1 First four    -   D6      -   y1
894@// Element 2 First four    -   D3      -   y2
895@// Element 3 First four    -   D7      -   y3
896@// Element 4 First four    -   D4      -   y4
897@// Element 5 First four    -   D8      -   y5
898@// Element 6 First four    -   D5      -   y6
899@// Element 7 First four    -   D9      -   y7
900@// Element 0 Second four   -   D10     -   y0
901@// Element 1 Second four   -   D14     -   y1
902@// Element 2 Second four   -   D11     -   y2
903@// Element 3 Second four   -   D15     -   y3
904@// Element 4 Second four   -   D12     -   y4
905@// Element 5 Second four   -   D16     -   y5
906@// Element 6 Second four   -   D13     -   y6
907@// Element 7 Second four   -   D17     -   y7
908
909    @// Map between first kernel code seq and current
910@//     D2  ->  D2
911@//     D6  ->  D6
912@//     D3  ->  D3
913@//     D7  ->  D7
914@//     D10 ->  D4
915@//     D14 ->  D8
916@//     D11 ->  D5
917@//     D15 ->  D9
918@//     Q3  ->  Q3
919@//     Q5  ->  Q2
920@//     Q7  ->  Q4
921
922    vmull.s16       q12, d6, d0[1]      @// y1 * cos1(part of b0)
923    vmull.s16       q13, d6, d0[3]      @// y1 * cos3(part of b1)
924    vmull.s16       q14, d6, d1[1]      @// y1 * sin3(part of b2)
925    vmull.s16       q15, d6, d1[3]      @// y1 * sin1(part of b3)
926
927    vmlal.s16       q12, d7, d0[3]      @// y1 * cos1 + y3 * cos3(part of b0)
928    vmlsl.s16       q13, d7, d1[3]      @// y1 * cos3 - y3 * sin1(part of b1)
929    vmlsl.s16       q14, d7, d0[1]      @// y1 * sin3 - y3 * cos1(part of b2)
930    vmlsl.s16       q15, d7, d1[1]      @// y1 * sin1 - y3 * sin3(part of b3)
931
932    vmull.s16       q10, d2, d0[0]      @// y0 * cos4(part of c0 and c1)
933    vmull.s16       q11, d4, d0[0]      @// y4 * cos4(part of c0 and c1)
934
935    vmull.s16       q9, d3, d1[2]       @// y2 * sin2 (Q3 is freed by this time)(part of d1)
936    vmull.s16       q3, d3, d0[2]       @// y2 * cos2(part of d0)
937
938
939    vmlal.s16       q12, d8, d1[1]      @// y1 * cos1 + y3 * cos3 + y5 * sin3(part of b0)
940    vmlsl.s16       q13, d8, d0[1]      @// y1 * cos3 - y3 * sin1 - y5 * cos1(part of b1)
941    vmlal.s16       q14, d8, d1[3]      @// y1 * sin3 - y3 * cos1 + y5 * sin1(part of b2)
942    vmlal.s16       q15, d8, d0[3]      @// y1 * sin1 - y3 * sin3 + y5 * cos3(part of b3)
943
944    vmlsl.s16       q9, d5, d0[2]       @// d1 = y2 * sin2 - y6 * cos2(part of a0 and a1)
945    vmlal.s16       q3, d5, d1[2]       @// d0 = y2 * cos2 + y6 * sin2(part of a0 and a1)
946
947    vadd.s32        q1, q10, q11        @// c0 = y0 * cos4 + y4 * cos4(part of a0 and a1)
948    vsub.s32        q10, q10, q11       @// c1 = y0 * cos4 - y4 * cos4(part of a0 and a1)
949
950    vmlal.s16       q12, d9, d1[3]      @// b0 = y1 * cos1 + y3 * cos3 + y5 * sin3 + y7 * sin1(part of r0,r7)
951    vmlsl.s16       q13, d9, d1[1]      @// b1 = y1 * cos3 - y3 * sin1 - y5 * cos1 - y7 * sin3(part of r1,r6)
952    vmlal.s16       q14, d9, d0[3]      @// b2 = y1 * sin3 - y3 * cos1 + y5 * sin1 + y7 * cos3(part of r2,r5)
953    vmlsl.s16       q15, d9, d0[1]      @// b3 = y1 * sin1 - y3 * sin3 + y5 * cos3 - y7 * cos1(part of r3,r4)
954
955    vsub.s32        q11, q1, q3         @// a3 = c0 - d0(part of r3,r4)
956    vadd.s32        q2, q1, q3          @// a0 = c0 + d0(part of r0,r7)
957
958
959    vadd.s32        q1, q2, q12
960
961    vsub.s32        q3, q2, q12
962
963    vadd.s32        q4, q11, q15
964
965    vsub.s32        q12, q11, q15
966
967    vqrshrn.s32     d5, q4, #idct_stg2_shift
968    vqrshrn.s32     d2, q1, #idct_stg2_shift
969    vqrshrn.s32     d9, q3, #idct_stg2_shift
970    vqrshrn.s32     d6, q12, #idct_stg2_shift
971
972    vsub.s32        q11, q10, q9        @// a2 = c1 - d1(part of r2,r5)
973    vadd.s32        q9, q10, q9         @// a1 = c1 + d1(part of r1,r6)
974
975
976    vadd.s32        q15, q11, q14
977
978    vsub.s32        q12, q11, q14
979
980    vadd.s32        q14, q9, q13
981
982    vsub.s32        q11, q9, q13
983    vqrshrn.s32     d4, q15, #idct_stg2_shift
984    vqrshrn.s32     d7, q12, #idct_stg2_shift
985    vqrshrn.s32     d3, q14, #idct_stg2_shift
986    vqrshrn.s32     d8, q11, #idct_stg2_shift
987
988
989
990
991
992
993
994
995
996
997    vmull.s16       q12, d14, d0[1]     @// y1 * cos1(part of b0)
998
999    vmull.s16       q13, d14, d0[3]     @// y1 * cos3(part of b1)
1000    vmull.s16       q14, d14, d1[1]     @// y1 * sin3(part of b2)
1001    vmull.s16       q15, d14, d1[3]     @// y1 * sin1(part of b3)
1002
1003    vmlal.s16       q12, d15, d0[3]     @// y1 * cos1 + y3 * cos3(part of b0)
1004    vtrn.16         d2, d3
1005    vmlsl.s16       q13, d15, d1[3]     @// y1 * cos3 - y3 * sin1(part of b1)
1006    vtrn.16         d4, d5
1007    vmlsl.s16       q14, d15, d0[1]     @// y1 * sin3 - y3 * cos1(part of b2)
1008    vtrn.16         d6, d7
1009    vmlsl.s16       q15, d15, d1[1]     @// y1 * sin1 - y3 * sin3(part of b3)
1010    vtrn.16         d8, d9
1011    vmull.s16       q10, d10, d0[0]     @// y0 * cos4(part of c0 and c1)
1012    vtrn.32         d2, d4
1013    vmull.s16       q11, d12, d0[0]     @// y4 * cos4(part of c0 and c1)
1014    vtrn.32         d3, d5
1015    vmull.s16       q9, d11, d1[2]      @// y2 * sin2 (Q7 is freed by this time)(part of d1)
1016    vtrn.32         d6, d8
1017    vmull.s16       q7, d11, d0[2]      @// y2 * cos2(part of d0)
1018    vtrn.32         d7, d9
1019    vmlal.s16       q12, d16, d1[1]     @// y1 * cos1 + y3 * cos3 + y5 * sin3(part of b0)
1020
1021    add             r4, r2, r8, lsl #1  @ r4 = r2 + pred_strd * 2    => r4 points to 3rd row of pred data
1022    vmlsl.s16       q13, d16, d0[1]     @// y1 * cos3 - y3 * sin1 - y5 * cos1(part of b1)
1023
1024    add             r5, r8, r8, lsl #1  @
1025    vmlal.s16       q14, d16, d1[3]     @// y1 * sin3 - y3 * cos1 + y5 * sin1(part of b2)
1026
1027    add             r0, r3, r7, lsl #1  @ r0 points to 3rd row of dest data
1028    vmlal.s16       q15, d16, d0[3]     @// y1 * sin1 - y3 * sin3 + y5 * cos3(part of b3)
1029
1030    add             r10, r7, r7, lsl #1 @
1031    vmlsl.s16       q9, d13, d0[2]      @// d1 = y2 * sin2 - y6 * cos2(part of a0 and a1)
1032
1033
1034    vmlal.s16       q7, d13, d1[2]      @// d0 = y2 * cos2 + y6 * sin2(part of a0 and a1)
1035
1036    vadd.s32        q6, q10, q11        @// c0 = y0 * cos4 + y4 * cos4(part of a0 and a1)
1037    vsub.s32        q10, q10, q11       @// c1 = y0 * cos4 - y4 * cos4(part of a0 and a1)
1038
1039    vmlal.s16       q12, d17, d1[3]     @// b0 = y1 * cos1 + y3 * cos3 + y5 * sin3 + y7 * sin1(part of r0,r7)
1040    vswp            d3, d6
1041    vmlsl.s16       q13, d17, d1[1]     @// b1 = y1 * cos3 - y3 * sin1 - y5 * cos1 - y7 * sin3(part of r1,r6)
1042
1043    vswp            d5, d8
1044    vmlal.s16       q14, d17, d0[3]     @// b2 = y1 * sin3 - y3 * cos1 + y5 * sin1 + y7 * cos3(part of r2,r5)
1045    vmlsl.s16       q15, d17, d0[1]     @// b3 = y1 * sin1 - y3 * sin3 + y5 * cos3 - y7 * cos1(part of r3,r4)
1046
1047    vsub.s32        q11, q6, q7         @// a3 = c0 - d0(part of r3,r4)
1048    vadd.s32        q6, q6, q7          @// a0 = c0 + d0(part of r0,r7)
1049
1050
1051    vadd.s32        q0, q6, q12
1052
1053
1054    vsub.s32        q12, q6, q12
1055
1056
1057    vadd.s32        q6, q11, q15
1058
1059
1060    vsub.s32        q7, q11, q15
1061
1062    vqrshrn.s32     d10, q0, #idct_stg2_shift
1063    vqrshrn.s32     d17, q12, #idct_stg2_shift
1064    vqrshrn.s32     d13, q6, #idct_stg2_shift
1065    vqrshrn.s32     d14, q7, #idct_stg2_shift
1066
1067    vsub.s32        q11, q10, q9        @// a2 = c1 - d1(part of r2,r5)
1068    vadd.s32        q9, q10, q9         @// a1 = c1 + d1(part of r1,r6)
1069
1070
1071    vadd.s32        q0, q11, q14
1072
1073
1074    vsub.s32        q12, q11, q14
1075
1076
1077    vadd.s32        q14, q9, q13
1078
1079
1080    vsub.s32        q13, q9, q13
1081    vld1.8          d18, [r2], r8
1082
1083    vqrshrn.s32     d12, q0, #idct_stg2_shift
1084    vld1.8          d20, [r2], r5
1085
1086
1087    vqrshrn.s32     d15, q12, #idct_stg2_shift
1088    vld1.8          d19, [r2], r8
1089
1090
1091
1092
1093    vqrshrn.s32     d11, q14, #idct_stg2_shift
1094    vld1.8          d22, [r4], r8
1095
1096
1097
1098
1099    vqrshrn.s32     d16, q13, #idct_stg2_shift
1100    vld1.8          d21, [r2], r5
1101
1102
1103
1104
1105pred_buff_addition:
1106
1107
1108    vtrn.16         d10, d11
1109    vld1.8          d24, [r4], r5
1110
1111    vtrn.16         d12, d13
1112    vld1.8          d23, [r4], r8
1113
1114    vaddw.u8        q1, q1, d18
1115    vld1.8          d25, [r4], r5
1116
1117    vtrn.16         d14, d15
1118    vaddw.u8        q2, q2, d22
1119
1120    vtrn.16         d16, d17
1121    vaddw.u8        q3, q3, d20
1122
1123    vtrn.32         d10, d12
1124    vaddw.u8        q4, q4, d24
1125
1126    vtrn.32         d11, d13
1127    vtrn.32         d14, d16
1128    vtrn.32         d15, d17
1129
1130    vswp            d11, d14
1131    vswp            d13, d16
1132
1133@ Row values stored in the q register.
1134
1135@Q1 :r0
1136@Q3: r1
1137@Q2: r2
1138@Q4: r3
1139@Q5: r4
1140@Q7: r5
1141@Q6: r6
1142@Q8: r7
1143
1144
1145
1146@/// Adding the prediction buffer
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156    @ Load prediction data
1157
1158
1159
1160
1161
1162    @Adding recon with prediction
1163
1164
1165
1166
1167
1168    vaddw.u8        q5, q5, d19
1169    vqmovun.s16     d2, q1
1170    vaddw.u8        q7, q7, d21
1171    vqmovun.s16     d4, q2
1172    vaddw.u8        q6, q6, d23
1173    vqmovun.s16     d6, q3
1174    vaddw.u8        q8, q8, d25
1175    vqmovun.s16     d8, q4
1176
1177
1178
1179
1180
1181
1182
1183    vst1.8          {d2}, [r3], r7
1184    vqmovun.s16     d10, q5
1185    vst1.8          {d6}, [r3], r10
1186    vqmovun.s16     d14, q7
1187    vst1.8          {d4}, [r0], r7
1188    vqmovun.s16     d12, q6
1189    vst1.8          {d8}, [r0], r10
1190    vqmovun.s16     d16, q8
1191
1192
1193
1194
1195
1196
1197
1198    vst1.8          {d10}, [r3], r7
1199    vst1.8          {d14}, [r3], r10
1200    vst1.8          {d12}, [r0], r7
1201    vst1.8          {d16}, [r0], r10
1202
1203
1204
1205
1206
1207    vpop            {d8-d15}
1208    ldmfd           sp!, {r4-r12, pc}
1209
1210
1211
1212