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