Home | History | Annotate | Download | only in arm
      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 
     87 gai2_impeg2_idct_q15_addr1:
     88     .long gai2_impeg2_idct_q15 - q15lbl1 - 8
     89 gai2_impeg2_idct_q15_addr2:
     90     .long gai2_impeg2_idct_q15 - q15lbl2 - 8
     91 gai2_impeg2_idct_q11_addr1:
     92     .long gai2_impeg2_idct_q11 - q11lbl1 - 8
     93 gai2_impeg2_idct_q11_addr2:
     94     .long gai2_impeg2_idct_q11 - q11lbl2 - 8
     95 gai2_impeg2_idct_first_col_q15_addr1:
     96     .long gai2_impeg2_idct_first_col_q15 - fcq15_lbl1 - 8
     97 gai2_impeg2_idct_first_col_q15_addr2:
     98     .long gai2_impeg2_idct_first_col_q15 - fcq15_lbl2 - 8
     99 gai2_impeg2_idct_first_col_q15_addr3:
    100     .long gai2_impeg2_idct_first_col_q15 - fcq15_lbl3 - 8
    101 gai2_impeg2_mismatch_stg2_additive_addr:
    102     .long gai2_impeg2_mismatch_stg2_additive - additive_lbl - 8
    103 gai2_impeg2_idct_first_col_q11_addr1:
    104     .long gai2_impeg2_idct_first_col_q11 - fcq11_lbl1 - 8
    105 gai2_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
    109 impeg2_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
    122 q15lbl1:
    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
    137 q11lbl1:
    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
    197 impeg2_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
    204 q15lbl2:
    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
    214 q11lbl2:
    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
    222 additive_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
    384 impeg2_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
    425 fcq15_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 
    536 skip_last4_rows:
    537 
    538 
    539     ldr             r14, gai2_impeg2_idct_first_col_q15_addr2
    540 fcq15_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 
    604 last4_cols:
    605 
    606 
    607     cmp             r12, #0xf0
    608     bge             skip_last4cols
    609 
    610     ldr             r14, gai2_impeg2_idct_first_col_q15_addr3
    611 fcq15_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 
    676 skip_last4cols:
    677 
    678 
    679 
    680     ldr             r14, gai2_impeg2_idct_first_col_q11_addr1
    681 fcq11_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
    859 end_skip_last4cols:
    860 
    861     ldr             r14, gai2_impeg2_idct_first_col_q11_addr2
    862 fcq11_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 
   1099 pred_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