Home | History | Annotate | Download | only in arm
      1 @/*****************************************************************************
      2 @*
      3 @* Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
      4 @*
      5 @* Licensed under the Apache License, Version 2.0 (the "License");
      6 @* you may not use this file except in compliance with the License.
      7 @* You may obtain a copy of the License at:
      8 @*
      9 @* http://www.apache.org/licenses/LICENSE-2.0
     10 @*
     11 @* Unless required by applicable law or agreed to in writing, software
     12 @* distributed under the License is distributed on an "AS IS" BASIS,
     13 @* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 @* See the License for the specific language governing permissions and
     15 @* limitations under the License.
     16 @*
     17 @*****************************************************************************/
     18 @/**
     19 @ *******************************************************************************
     20 @ * @file
     21 @ *  ihevc_itrans_recon_8x8_neon.s
     22 @ *
     23 @ * @brief
     24 @ *  contains function definitions for single stage  inverse transform
     25 @ *
     26 @ * @author
     27 @ *  anand s
     28 @ *
     29 @ * @par list of functions:
     30 @ *  - ihevc_itrans_recon_8x8()
     31 @ *
     32 @ * @remarks
     33 @ *  none
     34 @ *
     35 @ *******************************************************************************
     36 @*/
     37 
     38 @/**
     39 @ *******************************************************************************
     40 @ *
     41 @ * @brief
     42 @ *  this function performs inverse transform  and reconstruction for 8x8
     43 @ * input block
     44 @ *
     45 @ * @par description:
     46 @ *  performs inverse transform and adds the prediction  data and clips output
     47 @ * to 8 bit
     48 @ *
     49 @ * @param[in] pi2_src
     50 @ *  input 8x8 coefficients
     51 @ *
     52 @ * @param[in] pi2_tmp
     53 @ *  temporary 8x8 buffer for storing inverse
     54 @ *
     55 @ *  transform
     56 @ *  1st stage output
     57 @ *
     58 @ * @param[in] pu1_pred
     59 @ *  prediction 8x8 block
     60 @ *
     61 @ * @param[out] pu1_dst
     62 @ *  output 8x8 block
     63 @ *
     64 @ * @param[in] src_strd
     65 @ *  input stride
     66 @ *
     67 @ * @param[in] pred_strd
     68 @ *  prediction stride
     69 @ *
     70 @ * @param[in] dst_strd
     71 @ *  output stride
     72 @ *
     73 @ * @param[in] shift
     74 @ *  output shift
     75 @ *
     76 @ * @param[in] zero_cols
     77 @ *  zero columns in pi2_src
     78 @ *
     79 @ * @returns  void
     80 @ *
     81 @ * @remarks
     82 @ *  none
     83 @ *
     84 @ *******************************************************************************
     85 @ */
     86 
     87 @void ihevc_itrans_recon_8x8(word16 *pi2_src,
     88 @                            word16 *pi2_tmp,
     89 @                            uword8 *pu1_pred,
     90 @                            uword8 *pu1_dst,
     91 @                            word32 src_strd,
     92 @                            word32 pred_strd,
     93 @                            word32 dst_strd,
     94 @                            word32 zero_cols
     95 @                            word32 zero_rows               )
     96 
     97 @**************variables vs registers*************************
     98 @   r0 => *pi2_src
     99 @   r1 => *pi2_tmp
    100 @   r2 => *pu1_pred
    101 @   r3 => *pu1_dst
    102 @   src_strd
    103 @   pred_strd
    104 @   dst_strd
    105 @   zero_cols
    106 
    107 
    108 
    109 .text
    110 .align 4
    111 
    112 
    113 
    114 
    115 .set width_x_size_x5 ,   40
    116 .set width_x_size_x2 ,   32
    117 .set shift_stage1_idct ,   7
    118 .set shift_stage2_idct ,   12
    119 
    120 .globl ihevc_itrans_recon_8x8_a9q
    121 
    122 .extern g_ai2_ihevc_trans_8_transpose
    123 
    124 g_ai2_ihevc_trans_8_transpose_addr:
    125 .long g_ai2_ihevc_trans_8_transpose - ulbl1 - 8
    126 
    127 .type ihevc_itrans_recon_8x8_a9q, %function
    128 
    129 ihevc_itrans_recon_8x8_a9q:
    130 @//register usage.extern        - loading and until idct of columns
    131 @// cosine constants    -   d0
    132 @// sine constants      -   d1
    133 @// row 0 first half    -   d2      -   y0
    134 @// row 1 first half    -   d6      -   y1
    135 @// row 2 first half    -   d3      -   y2
    136 @// row 3 first half    -   d7      -   y3
    137 @// row 4 first half    -   d10     -   y4
    138 @// row 5 first half    -   d14     -   y5
    139 @// row 6 first half    -   d11     -   y6
    140 @// row 7 first half    -   d15     -   y7
    141 
    142 @// row 0 second half   -   d4      -   y0
    143 @// row 1 second half   -   d8      -   y1
    144 @// row 2 second half   -   d5      -   y2
    145 @// row 3 second half   -   d9      -   y3
    146 @// row 4 second half   -   d12     -   y4
    147 @// row 5 second half   -   d16     -   y5
    148 @// row 6 second half   -   d13     -   y6
    149 @// row 7 second half   -   d17     -   y7
    150 
    151     @// copy the input pointer to another register
    152     @// step 1 : load all constants
    153     stmfd       sp!,{r4-r12,lr}
    154     add         sp,sp,#40
    155     ldr         r8,[sp,#4]                  @ prediction stride
    156     ldr         r7,[sp,#8]                  @ destination stride
    157     ldr         r6,[sp]                     @ src stride
    158     ldr         r12,[sp,#12]
    159     ldr         r11,[sp,#16]
    160     mov         r6,r6,lsl #1                @ x sizeof(word16)
    161     add         r9,r0,r6, lsl #1            @ 2 rows
    162 
    163     add         r10,r6,r6, lsl #1           @ 3 rows
    164 
    165     sub         r10,r10, #8                 @ - 4 cols * sizeof(word16)
    166     sub         r5,r6, #8                   @ src_strd - 4 cols * sizeof(word16)
    167 
    168 @   ldr         r14,=g_imp4d_cxa8_idct_q15
    169     ldr         r14,g_ai2_ihevc_trans_8_transpose_addr
    170 ulbl1:
    171     add         r14,r14,pc
    172     vld1.16     {d0,d1},[r14]               @//d0,d1 are used for storing the constant data
    173 
    174     @//step 2 load all the input data
    175     @//step 3 operate first 4 colums at a time
    176 
    177     and         r11,r11,#0xff
    178     and         r12,r12,#0xff
    179 
    180     cmp         r11,#0xf0
    181     bge         skip_last4_rows
    182 
    183 
    184     vld1.16     d2,[r0]!
    185     vld1.16     d3,[r9]!
    186     vld1.16     d4,[r0],r5
    187     vmull.s16   q10,d2,d0[0]                @// y0 * cos4(part of c0 and c1)
    188     vld1.16     d5,[r9],r5
    189     vmull.s16   q9,d3,d1[2]                 @// y2 * sin2 (q3 is freed by this time)(part of d1)
    190     vld1.16     d6,[r0]!
    191     vld1.16     d7,[r9]!
    192     vmull.s16   q12,d6,d0[1]                @// y1 * cos1(part of b0)
    193     vld1.16     d8,[r0],r10
    194     vmull.s16   q13,d6,d0[3]                @// y1 * cos3(part of b1)
    195     vld1.16     d9,[r9],r10
    196     vmull.s16   q14,d6,d1[1]                @// y1 * sin3(part of b2)
    197     vld1.16     d10,[r0]!
    198     vmull.s16   q15,d6,d1[3]                @// y1 * sin1(part of b3)
    199     vld1.16     d11,[r9]!
    200     vmlal.s16   q12,d7,d0[3]                @// y1 * cos1 + y3 * cos3(part of b0)
    201     vld1.16     d12,[r0],r5
    202     vmlsl.s16   q13,d7,d1[3]                @// y1 * cos3 - y3 * sin1(part of b1)
    203     vld1.16     d13,[r9],r5
    204     vmlsl.s16   q14,d7,d0[1]                @// y1 * sin3 - y3 * cos1(part of b2)
    205     vld1.16     d14,[r0]!
    206     vmlsl.s16   q15,d7,d1[1]                @// y1 * sin1 - y3 * sin3(part of b3)
    207     vld1.16     d15,[r9]!
    208     vmull.s16   q11,d10,d0[0]               @// y4 * cos4(part of c0 and c1)
    209     vld1.16     d16,[r0],r10
    210     vmull.s16   q3,d3,d0[2]                 @// y2 * cos2(part of d0)
    211     vld1.16     d17,[r9],r10
    212 
    213     @/* this following was activated when alignment is not there */
    214 @// vld1.16     d2,[r0]!
    215 @// vld1.16     d3,[r2]!
    216 @// vld1.16     d4,[r0]!
    217 @// vld1.16     d5,[r2]!
    218 @// vld1.16     d6,[r0]!
    219 @// vld1.16     d7,[r2]!
    220 @// vld1.16     d8,[r0],r3
    221 @// vld1.16     d9,[r2],r3
    222 @// vld1.16     d10,[r0]!
    223 @// vld1.16     d11,[r2]!
    224 @// vld1.16     d12,[r0]!
    225 @// vld1.16     d13,[r2]!
    226 @// vld1.16     d14,[r0]!
    227 @// vld1.16     d15,[r2]!
    228 @// vld1.16     d16,[r0],r3
    229 @// vld1.16     d17,[r2],r3
    230 
    231 
    232 
    233 
    234     vmlal.s16   q12,d14,d1[1]               @// y1 * cos1 + y3 * cos3 + y5 * sin3(part of b0)
    235     vmlsl.s16   q13,d14,d0[1]               @// y1 * cos3 - y3 * sin1 - y5 * cos1(part of b1)
    236     vmlal.s16   q14,d14,d1[3]               @// y1 * sin3 - y3 * cos1 + y5 * sin1(part of b2)
    237     vmlal.s16   q15,d14,d0[3]               @// y1 * sin1 - y3 * sin3 + y5 * cos3(part of b3)
    238 
    239     vmlsl.s16   q9,d11,d0[2]                @// d1 = y2 * sin2 - y6 * cos2(part of a0 and a1)
    240     vmlal.s16   q3,d11,d1[2]                @// d0 = y2 * cos2 + y6 * sin2(part of a0 and a1)
    241 
    242     vadd.s32    q5,q10,q11                  @// c0 = y0 * cos4 + y4 * cos4(part of a0 and a1)
    243     vsub.s32    q10,q10,q11                 @// c1 = y0 * cos4 - y4 * cos4(part of a0 and a1)
    244 
    245     vmlal.s16   q12,d15,d1[3]               @// b0 = y1 * cos1 + y3 * cos3 + y5 * sin3 + y7 * sin1(part of r0,r7)
    246     vmlsl.s16   q13,d15,d1[1]               @// b1 = y1 * cos3 - y3 * sin1 - y5 * cos1 - y7 * sin3(part of r1,r6)
    247     vmlal.s16   q14,d15,d0[3]               @// b2 = y1 * sin3 - y3 * cos1 + y5 * sin1 + y7 * cos3(part of r2,r5)
    248     vmlsl.s16   q15,d15,d0[1]               @// b3 = y1 * sin1 - y3 * sin3 + y5 * cos3 - y7 * cos1(part of r3,r4)
    249 
    250     vadd.s32    q7,q5,q3                    @// a0 = c0 + d0(part of r0,r7)
    251     vsub.s32    q5,q5,q3                    @// a3 = c0 - d0(part of r3,r4)
    252     vsub.s32    q11,q10,q9                  @// a2 = c1 - d1(part of r2,r5)
    253     vadd.s32    q9,q10,q9                   @// a1 = c1 + d1(part of r1,r6)
    254 
    255     vadd.s32    q10,q7,q12                  @// a0 + b0(part of r0)
    256     vsub.s32    q3,q7,q12                   @// a0 - b0(part of r7)
    257 
    258     vadd.s32    q12,q11,q14                 @// a2 + b2(part of r2)
    259     vsub.s32    q11,q11,q14                 @// a2 - b2(part of r5)
    260 
    261     vadd.s32    q14,q9,q13                  @// a1 + b1(part of r1)
    262     vsub.s32    q9,q9,q13                   @// a1 - b1(part of r6)
    263 
    264     vadd.s32    q13,q5,q15                  @// a3 + b3(part of r3)
    265     vsub.s32    q15,q5,q15                  @// a3 - b3(part of r4)
    266 
    267     vqrshrn.s32 d2,q10,#shift_stage1_idct   @// r0 = (a0 + b0 + rnd) >> 7(shift_stage1_idct)
    268     vqrshrn.s32 d15,q3,#shift_stage1_idct   @// r7 = (a0 - b0 + rnd) >> 7(shift_stage1_idct)
    269     vqrshrn.s32 d3,q12,#shift_stage1_idct   @// r2 = (a2 + b2 + rnd) >> 7(shift_stage1_idct)
    270     vqrshrn.s32 d14,q11,#shift_stage1_idct  @// r5 = (a2 - b2 + rnd) >> 7(shift_stage1_idct)
    271     vqrshrn.s32 d6,q14,#shift_stage1_idct   @// r1 = (a1 + b1 + rnd) >> 7(shift_stage1_idct)
    272     vqrshrn.s32 d11,q9,#shift_stage1_idct   @// r6 = (a1 - b1 + rnd) >> 7(shift_stage1_idct)
    273     vqrshrn.s32 d7,q13,#shift_stage1_idct   @// r3 = (a3 + b3 + rnd) >> 7(shift_stage1_idct)
    274     vqrshrn.s32 d10,q15,#shift_stage1_idct  @// r4 = (a3 - b3 + rnd) >> 7(shift_stage1_idct)
    275 
    276 
    277     b           last4_cols
    278 
    279 
    280 
    281 skip_last4_rows:
    282 
    283 
    284 
    285     vld1.16     d2,[r0]!
    286     vld1.16     d3,[r9]!
    287     vld1.16     d4,[r0],r5
    288     vld1.16     d5,[r9],r5
    289     vld1.16     d6,[r0]!
    290     vld1.16     d7,[r9]!
    291     vld1.16     d8,[r0],r10
    292     vld1.16     d9,[r9],r10
    293 
    294 
    295 
    296     vmov.s16    q6,#0
    297     vmov.s16    q8,#0
    298 
    299 
    300 
    301 
    302     vmull.s16   q12,d6,d0[1]                @// y1 * cos1(part of b0)
    303     vmull.s16   q13,d6,d0[3]                @// y1 * cos3(part of b1)
    304     vmull.s16   q14,d6,d1[1]                @// y1 * sin3(part of b2)
    305     vmull.s16   q15,d6,d1[3]                @// y1 * sin1(part of b3)
    306 
    307     vmlal.s16   q12,d7,d0[3]                @// y1 * cos1 + y3 * cos3(part of b0)
    308     vmlsl.s16   q13,d7,d1[3]                @// y1 * cos3 - y3 * sin1(part of b1)
    309     vmlsl.s16   q14,d7,d0[1]                @// y1 * sin3 - y3 * cos1(part of b2)
    310     vmlsl.s16   q15,d7,d1[1]                @// y1 * sin1 - y3 * sin3(part of b3)
    311 
    312     vmull.s16   q9,d3,d1[2]                 @// y2 * sin2 (q3 is freed by this time)(part of d1)
    313     vmull.s16   q3,d3,d0[2]                 @// y2 * cos2(part of d0)
    314 
    315     vmull.s16   q10,d2,d0[0]                @// y0 * cos4(part of c0 and c1)
    316 
    317 
    318     vadd.s32    q7,q10,q3                   @// a0 = c0 + d0(part of r0,r7)
    319     vsub.s32    q5,q10,q3                   @// a3 = c0 - d0(part of r3,r4)
    320     vsub.s32    q11,q10,q9                  @// a2 = c1 - d1(part of r2,r5)
    321     vadd.s32    q9,q10,q9                   @// a1 = c1 + d1(part of r1,r6)
    322 
    323     vadd.s32    q10,q7,q12                  @// a0 + b0(part of r0)
    324     vsub.s32    q3,q7,q12                   @// a0 - b0(part of r7)
    325 
    326     vadd.s32    q12,q11,q14                 @// a2 + b2(part of r2)
    327     vsub.s32    q11,q11,q14                 @// a2 - b2(part of r5)
    328 
    329     vadd.s32    q14,q9,q13                  @// a1 + b1(part of r1)
    330     vsub.s32    q9,q9,q13                   @// a1 - b1(part of r6)
    331 
    332     vadd.s32    q13,q5,q15                  @// a3 + b3(part of r3)
    333     vsub.s32    q15,q5,q15                  @// a3 - b3(part of r4)
    334 
    335     vqrshrn.s32 d2,q10,#shift_stage1_idct   @// r0 = (a0 + b0 + rnd) >> 7(shift_stage1_idct)
    336     vqrshrn.s32 d15,q3,#shift_stage1_idct   @// r7 = (a0 - b0 + rnd) >> 7(shift_stage1_idct)
    337     vqrshrn.s32 d3,q12,#shift_stage1_idct   @// r2 = (a2 + b2 + rnd) >> 7(shift_stage1_idct)
    338     vqrshrn.s32 d14,q11,#shift_stage1_idct  @// r5 = (a2 - b2 + rnd) >> 7(shift_stage1_idct)
    339     vqrshrn.s32 d6,q14,#shift_stage1_idct   @// r1 = (a1 + b1 + rnd) >> 7(shift_stage1_idct)
    340     vqrshrn.s32 d11,q9,#shift_stage1_idct   @// r6 = (a1 - b1 + rnd) >> 7(shift_stage1_idct)
    341     vqrshrn.s32 d7,q13,#shift_stage1_idct   @// r3 = (a3 + b3 + rnd) >> 7(shift_stage1_idct)
    342     vqrshrn.s32 d10,q15,#shift_stage1_idct  @// r4 = (a3 - b3 + rnd) >> 7(shift_stage1_idct)
    343 
    344 
    345 last4_cols:
    346 
    347 
    348     cmp         r12,#0xf0
    349     bge         skip_last4cols
    350 
    351     vmull.s16   q12,d8,d0[1]                @// y1 * cos1(part of b0)
    352     vmull.s16   q13,d8,d0[3]                @// y1 * cos3(part of b1)
    353     vmull.s16   q14,d8,d1[1]                @// y1 * sin3(part of b2)
    354     vmull.s16   q15,d8,d1[3]                @// y1 * sin1(part of b3)
    355 
    356     vmlal.s16   q12,d9,d0[3]                @// y1 * cos1 + y3 * cos3(part of b0)
    357     vmlsl.s16   q13,d9,d1[3]                @// y1 * cos3 - y3 * sin1(part of b1)
    358     vmlsl.s16   q14,d9,d0[1]                @// y1 * sin3 - y3 * cos1(part of b2)
    359     vmlsl.s16   q15,d9,d1[1]                @// y1 * sin1 - y3 * sin3(part of b3)
    360 
    361     vmull.s16   q9,d5,d1[2]                 @// y2 * sin2 (q4 is freed by this time)(part of d1)
    362     vmull.s16   q4,d5,d0[2]                 @// y2 * cos2(part of d0)
    363 
    364     vmull.s16   q10,d4,d0[0]                @// y0 * cos4(part of c0 and c1)
    365     vmull.s16   q11,d12,d0[0]               @// y4 * cos4(part of c0 and c1)
    366 
    367     vmlal.s16   q12,d16,d1[1]               @// y1 * cos1 + y3 * cos3 + y5 * sin3(part of b0)
    368     vmlsl.s16   q13,d16,d0[1]               @// y1 * cos3 - y3 * sin1 - y5 * cos1(part of b1)
    369     vmlal.s16   q14,d16,d1[3]               @// y1 * sin3 - y3 * cos1 + y5 * sin1(part of b2)
    370     vmlal.s16   q15,d16,d0[3]               @// y1 * sin1 - y3 * sin3 + y5 * cos3(part of b3)
    371 
    372     vmlsl.s16   q9,d13,d0[2]                @// d1 = y2 * sin2 - y6 * cos2(part of a0 and a1)
    373     vmlal.s16   q4,d13,d1[2]                @// d0 = y2 * cos2 + y6 * sin2(part of a0 and a1)
    374 
    375     vadd.s32    q6,q10,q11                  @// c0 = y0 * cos4 + y4 * cos4(part of a0 and a1)
    376     vsub.s32    q10,q10,q11                 @// c1 = y0 * cos4 - y4 * cos4(part of a0 and a1)
    377 
    378     vmlal.s16   q12,d17,d1[3]               @// b0 = y1 * cos1 + y3 * cos3 + y5 * sin3 + y7 * sin1(part of e0,e7)
    379     vmlsl.s16   q13,d17,d1[1]               @// b1 = y1 * cos3 - y3 * sin1 - y5 * cos1 - y7 * sin3(part of e1,e6)
    380     vmlal.s16   q14,d17,d0[3]               @// b2 = y1 * sin3 - y3 * cos1 + y5 * sin1 + y7 * cos3(part of e2,e5)
    381     vmlsl.s16   q15,d17,d0[1]               @// b3 = y1 * sin1 - y3 * sin3 + y5 * cos3 - y7 * cos1(part of e3,e4)
    382 
    383     vadd.s32    q8,q6,q4                    @// a0 = c0 + d0(part of e0,e7)
    384     vsub.s32    q6,q6,q4                    @// a3 = c0 - d0(part of e3,e4)
    385     vsub.s32    q11,q10,q9                  @// a2 = c1 - d1(part of e2,e5)
    386     vadd.s32    q9,q10,q9                   @// a1 = c1 + d1(part of e1,e6)
    387 
    388     vadd.s32    q10,q8,q12                  @// a0 + b0(part of e0)
    389     vsub.s32    q4,q8,q12                   @// a0 - b0(part of e7)
    390 
    391     vadd.s32    q12,q11,q14                 @// a2 + b2(part of e2)
    392     vsub.s32    q11,q11,q14                 @// a2 - b2(part of e5)
    393 
    394     vadd.s32    q14,q9,q13                  @// a1 + b1(part of e1)
    395     vsub.s32    q9,q9,q13                   @// a1 - b1(part of e6)
    396 
    397     vadd.s32    q13,q6,q15                  @// a3 + b3(part of e3)
    398     vsub.s32    q15,q6,q15                  @// a3 - b3(part of r4)
    399 
    400     vqrshrn.s32 d4,q10,#shift_stage1_idct   @// r0 = (a0 + b0 + rnd) >> 7(shift_stage1_idct)
    401     vqrshrn.s32 d17,q4,#shift_stage1_idct   @// r7 = (a0 - b0 + rnd) >> 7(shift_stage1_idct)
    402     vqrshrn.s32 d5,q12,#shift_stage1_idct   @// r2 = (a2 + b2 + rnd) >> 7(shift_stage1_idct)
    403     vqrshrn.s32 d16,q11,#shift_stage1_idct  @// r5 = (a2 - b2 + rnd) >> 7(shift_stage1_idct)
    404     vqrshrn.s32 d8,q14,#shift_stage1_idct   @// r1 = (a1 + b1 + rnd) >> 7(shift_stage1_idct)
    405     vqrshrn.s32 d13,q9,#shift_stage1_idct   @// r6 = (a1 - b1 + rnd) >> 7(shift_stage1_idct)
    406     vqrshrn.s32 d9,q13,#shift_stage1_idct   @// r3 = (a3 + b3 + rnd) >> 7(shift_stage1_idct)
    407     vqrshrn.s32 d12,q15,#shift_stage1_idct  @// r4 = (a3 - b3 + rnd) >> 7(shift_stage1_idct)
    408     b           end_skip_last4cols
    409 
    410 
    411 
    412 skip_last4cols:
    413 
    414 
    415 
    416 
    417 
    418 
    419     vtrn.16     q1,q3                       @//[r3,r1],[r2,r0] first qudrant transposing
    420 
    421     vtrn.16     q5,q7                       @//[r7,r5],[r6,r4] third qudrant transposing
    422 
    423 
    424     vtrn.32     d6,d7                       @//r0,r1,r2,r3 first qudrant transposing continued.....
    425     vtrn.32     d2,d3                       @//r0,r1,r2,r3 first qudrant transposing continued.....
    426 
    427     vtrn.32     d10,d11                     @//r4,r5,r6,r7 third qudrant transposing continued.....
    428     vtrn.32     d14,d15                     @//r4,r5,r6,r7 third qudrant transposing continued.....
    429 
    430 
    431     vmull.s16   q12,d6,d0[1]                @// y1 * cos1(part of b0)
    432     vmull.s16   q13,d6,d0[3]                @// y1 * cos3(part of b1)
    433     vmull.s16   q14,d6,d1[1]                @// y1 * sin3(part of b2)
    434     vmull.s16   q15,d6,d1[3]                @// y1 * sin1(part of b3)
    435 
    436     vmlal.s16   q12,d7,d0[3]                @// y1 * cos1 + y3 * cos3(part of b0)
    437     vmlsl.s16   q13,d7,d1[3]                @// y1 * cos3 - y3 * sin1(part of b1)
    438     vmlsl.s16   q14,d7,d0[1]                @// y1 * sin3 - y3 * cos1(part of b2)
    439     vmlsl.s16   q15,d7,d1[1]                @// y1 * sin1 - y3 * sin3(part of b3)
    440 
    441     vmull.s16   q10,d2,d0[0]                @// y0 * cos4(part of c0 and c1)
    442 @   vmull.s16   q11,d4,d0[0]                    @// y4 * cos4(part of c0 and c1)
    443 
    444     vmull.s16   q9,d3,d1[2]                 @// y2 * sin2 (q3 is freed by this time)(part of d1)
    445     vmull.s16   q3,d3,d0[2]                 @// y2 * cos2(part of d0)
    446 
    447 
    448 
    449 
    450     vsub.s32    q11,q10,q3                  @// a3 = c0 - d0(part of r3,r4)
    451     vadd.s32    q2,q10,q3                   @// a0 = c0 + d0(part of r0,r7)
    452 
    453 
    454     vadd.s32    q1,q2,q12
    455 
    456     vsub.s32    q3,q2,q12
    457 
    458     vadd.s32    q4,q11,q15
    459 
    460     vsub.s32    q12,q11,q15
    461 
    462     vqrshrn.s32 d5,q4,#shift_stage2_idct
    463     vqrshrn.s32 d2,q1,#shift_stage2_idct
    464     vqrshrn.s32 d9,q3,#shift_stage2_idct
    465     vqrshrn.s32 d6,q12,#shift_stage2_idct
    466 
    467     vsub.s32    q11,q10,q9                  @// a2 = c1 - d1(part of r2,r5)
    468     vadd.s32    q9,q10,q9                   @// a1 = c1 + d1(part of r1,r6)
    469 
    470 
    471     vadd.s32    q15,q11,q14
    472 
    473     vsub.s32    q12,q11,q14
    474 
    475     vadd.s32    q14,q9,q13
    476 
    477     vsub.s32    q11,q9,q13
    478     vqrshrn.s32 d4,q15,#shift_stage2_idct
    479     vqrshrn.s32 d7,q12,#shift_stage2_idct
    480     vqrshrn.s32 d3,q14,#shift_stage2_idct
    481     vqrshrn.s32 d8,q11,#shift_stage2_idct
    482 
    483 
    484 
    485 
    486 
    487 
    488 
    489 
    490 
    491 
    492     vmull.s16   q12,d14,d0[1]               @// y1 * cos1(part of b0)
    493 
    494     vmull.s16   q13,d14,d0[3]               @// y1 * cos3(part of b1)
    495     vmull.s16   q14,d14,d1[1]               @// y1 * sin3(part of b2)
    496     vmull.s16   q15,d14,d1[3]               @// y1 * sin1(part of b3)
    497 
    498     vmlal.s16   q12,d15,d0[3]               @// y1 * cos1 + y3 * cos3(part of b0)
    499     vtrn.16     d2,d3
    500     vmlsl.s16   q13,d15,d1[3]               @// y1 * cos3 - y3 * sin1(part of b1)
    501     vtrn.16     d4,d5
    502     vmlsl.s16   q14,d15,d0[1]               @// y1 * sin3 - y3 * cos1(part of b2)
    503     vtrn.16     d6,d7
    504     vmlsl.s16   q15,d15,d1[1]               @// y1 * sin1 - y3 * sin3(part of b3)
    505     vtrn.16     d8,d9
    506     vmull.s16   q10,d10,d0[0]               @// y0 * cos4(part of c0 and c1)
    507     vtrn.32     d2,d4
    508 
    509     vtrn.32     d3,d5
    510     vmull.s16   q9,d11,d1[2]                @// y2 * sin2 (q7 is freed by this time)(part of d1)
    511     vtrn.32     d6,d8
    512     vmull.s16   q7,d11,d0[2]                @// y2 * cos2(part of d0)
    513     vtrn.32     d7,d9
    514 
    515 
    516     add         r4,r2,r8, lsl #1            @ r4 = r2 + pred_strd * 2    => r4 points to 3rd row of pred data
    517 
    518 
    519     add         r5,r8,r8, lsl #1            @
    520 
    521 
    522     add         r0,r3,r7, lsl #1            @ r0 points to 3rd row of dest data
    523 
    524 
    525     add         r10,r7,r7, lsl #1           @
    526 
    527 
    528     vswp        d3,d6
    529 
    530 
    531     vswp        d5,d8
    532 
    533 
    534     vsub.s32    q11,q10,q7                  @// a3 = c0 - d0(part of r3,r4)
    535     vadd.s32    q6,q10,q7                   @// a0 = c0 + d0(part of r0,r7)
    536 
    537 
    538     vadd.s32    q0,q6,q12
    539 
    540 
    541     vsub.s32    q12,q6,q12
    542 
    543 
    544     vadd.s32    q6,q11,q15
    545 
    546 
    547     vsub.s32    q7,q11,q15
    548 
    549     vqrshrn.s32 d10,q0,#shift_stage2_idct
    550     vqrshrn.s32 d17,q12,#shift_stage2_idct
    551     vqrshrn.s32 d13,q6,#shift_stage2_idct
    552     vqrshrn.s32 d14,q7,#shift_stage2_idct
    553 
    554     vsub.s32    q11,q10,q9                  @// a2 = c1 - d1(part of r2,r5)
    555     vadd.s32    q9,q10,q9                   @// a1 = c1 + d1(part of r1,r6)
    556 
    557 
    558     vadd.s32    q0,q11,q14
    559 
    560 
    561     vsub.s32    q12,q11,q14
    562 
    563 
    564     vadd.s32    q14,q9,q13
    565 
    566 
    567     vsub.s32    q13,q9,q13
    568     vld1.8      d18,[r2],r8
    569 
    570     vqrshrn.s32 d12,q0,#shift_stage2_idct
    571     vld1.8      d20,[r2],r5
    572 
    573 
    574     vqrshrn.s32 d15,q12,#shift_stage2_idct
    575     vld1.8      d19,[r2],r8
    576 
    577 
    578 
    579 
    580     vqrshrn.s32 d11,q14,#shift_stage2_idct
    581     vld1.8      d22,[r4],r8
    582 
    583 
    584 
    585 
    586     vqrshrn.s32 d16,q13,#shift_stage2_idct
    587     vld1.8      d21,[r2],r5
    588 
    589 
    590     b           pred_buff_addition
    591 end_skip_last4cols:
    592 
    593 
    594 
    595 @/* now the idct of columns is done, transpose so that row idct done efficiently(step5) */
    596     vtrn.16     q1,q3                       @//[r3,r1],[r2,r0] first qudrant transposing
    597     vtrn.16     q2,q4                       @//[r3,r1],[r2,r0] second qudrant transposing
    598     vtrn.16     q5,q7                       @//[r7,r5],[r6,r4] third qudrant transposing
    599     vtrn.16     q6,q8                       @//[r7,r5],[r6,r4] fourth qudrant transposing
    600 
    601     vtrn.32     d6,d7                       @//r0,r1,r2,r3 first qudrant transposing continued.....
    602     vtrn.32     d2,d3                       @//r0,r1,r2,r3 first qudrant transposing continued.....
    603     vtrn.32     d4,d5                       @//r0,r1,r2,r3 second qudrant transposing continued.....
    604     vtrn.32     d8,d9                       @//r0,r1,r2,r3 second qudrant transposing continued.....
    605     vtrn.32     d10,d11                     @//r4,r5,r6,r7 third qudrant transposing continued.....
    606     vtrn.32     d14,d15                     @//r4,r5,r6,r7 third qudrant transposing continued.....
    607     vtrn.32     d12,d13                     @//r4,r5,r6,r7 fourth qudrant transposing continued.....
    608     vtrn.32     d16,d17                     @//r4,r5,r6,r7 fourth qudrant transposing continued.....
    609 
    610     @//step6 operate on first four rows and find their idct
    611     @//register usage.extern        - storing and idct of rows
    612 @// cosine constants    -   d0
    613 @// sine constants      -   d1
    614 @// element 0 first four    -   d2      -   y0
    615 @// element 1 first four    -   d6      -   y1
    616 @// element 2 first four    -   d3      -   y2
    617 @// element 3 first four    -   d7      -   y3
    618 @// element 4 first four    -   d4      -   y4
    619 @// element 5 first four    -   d8      -   y5
    620 @// element 6 first four    -   d5      -   y6
    621 @// element 7 first four    -   d9      -   y7
    622 @// element 0 second four   -   d10     -   y0
    623 @// element 1 second four   -   d14     -   y1
    624 @// element 2 second four   -   d11     -   y2
    625 @// element 3 second four   -   d15     -   y3
    626 @// element 4 second four   -   d12     -   y4
    627 @// element 5 second four   -   d16     -   y5
    628 @// element 6 second four   -   d13     -   y6
    629 @// element 7 second four   -   d17     -   y7
    630 
    631     @// map between first kernel code seq and current
    632 @//     d2  ->  d2
    633 @//     d6  ->  d6
    634 @//     d3  ->  d3
    635 @//     d7  ->  d7
    636 @//     d10 ->  d4
    637 @//     d14 ->  d8
    638 @//     d11 ->  d5
    639 @//     d15 ->  d9
    640 @//     q3  ->  q3
    641 @//     q5  ->  q2
    642 @//     q7  ->  q4
    643 
    644     vmull.s16   q12,d6,d0[1]                @// y1 * cos1(part of b0)
    645     vmull.s16   q13,d6,d0[3]                @// y1 * cos3(part of b1)
    646     vmull.s16   q14,d6,d1[1]                @// y1 * sin3(part of b2)
    647     vmull.s16   q15,d6,d1[3]                @// y1 * sin1(part of b3)
    648 
    649     vmlal.s16   q12,d7,d0[3]                @// y1 * cos1 + y3 * cos3(part of b0)
    650     vmlsl.s16   q13,d7,d1[3]                @// y1 * cos3 - y3 * sin1(part of b1)
    651     vmlsl.s16   q14,d7,d0[1]                @// y1 * sin3 - y3 * cos1(part of b2)
    652     vmlsl.s16   q15,d7,d1[1]                @// y1 * sin1 - y3 * sin3(part of b3)
    653 
    654     vmull.s16   q10,d2,d0[0]                @// y0 * cos4(part of c0 and c1)
    655     vmull.s16   q11,d4,d0[0]                @// y4 * cos4(part of c0 and c1)
    656 
    657     vmull.s16   q9,d3,d1[2]                 @// y2 * sin2 (q3 is freed by this time)(part of d1)
    658     vmull.s16   q3,d3,d0[2]                 @// y2 * cos2(part of d0)
    659 
    660 
    661     vmlal.s16   q12,d8,d1[1]                @// y1 * cos1 + y3 * cos3 + y5 * sin3(part of b0)
    662     vmlsl.s16   q13,d8,d0[1]                @// y1 * cos3 - y3 * sin1 - y5 * cos1(part of b1)
    663     vmlal.s16   q14,d8,d1[3]                @// y1 * sin3 - y3 * cos1 + y5 * sin1(part of b2)
    664     vmlal.s16   q15,d8,d0[3]                @// y1 * sin1 - y3 * sin3 + y5 * cos3(part of b3)
    665 
    666     vmlsl.s16   q9,d5,d0[2]                 @// d1 = y2 * sin2 - y6 * cos2(part of a0 and a1)
    667     vmlal.s16   q3,d5,d1[2]                 @// d0 = y2 * cos2 + y6 * sin2(part of a0 and a1)
    668 
    669     vadd.s32    q1,q10,q11                  @// c0 = y0 * cos4 + y4 * cos4(part of a0 and a1)
    670     vsub.s32    q10,q10,q11                 @// c1 = y0 * cos4 - y4 * cos4(part of a0 and a1)
    671 
    672     vmlal.s16   q12,d9,d1[3]                @// b0 = y1 * cos1 + y3 * cos3 + y5 * sin3 + y7 * sin1(part of r0,r7)
    673     vmlsl.s16   q13,d9,d1[1]                @// b1 = y1 * cos3 - y3 * sin1 - y5 * cos1 - y7 * sin3(part of r1,r6)
    674     vmlal.s16   q14,d9,d0[3]                @// b2 = y1 * sin3 - y3 * cos1 + y5 * sin1 + y7 * cos3(part of r2,r5)
    675     vmlsl.s16   q15,d9,d0[1]                @// b3 = y1 * sin1 - y3 * sin3 + y5 * cos3 - y7 * cos1(part of r3,r4)
    676 
    677     vsub.s32    q11,q1,q3                   @// a3 = c0 - d0(part of r3,r4)
    678     vadd.s32    q2,q1,q3                    @// a0 = c0 + d0(part of r0,r7)
    679 
    680 
    681     vadd.s32    q1,q2,q12
    682 
    683     vsub.s32    q3,q2,q12
    684 
    685     vadd.s32    q4,q11,q15
    686 
    687     vsub.s32    q12,q11,q15
    688 
    689     vqrshrn.s32 d5,q4,#shift_stage2_idct
    690     vqrshrn.s32 d2,q1,#shift_stage2_idct
    691     vqrshrn.s32 d9,q3,#shift_stage2_idct
    692     vqrshrn.s32 d6,q12,#shift_stage2_idct
    693 
    694     vsub.s32    q11,q10,q9                  @// a2 = c1 - d1(part of r2,r5)
    695     vadd.s32    q9,q10,q9                   @// a1 = c1 + d1(part of r1,r6)
    696 
    697 
    698     vadd.s32    q15,q11,q14
    699 
    700     vsub.s32    q12,q11,q14
    701 
    702     vadd.s32    q14,q9,q13
    703 
    704     vsub.s32    q11,q9,q13
    705     vqrshrn.s32 d4,q15,#shift_stage2_idct
    706     vqrshrn.s32 d7,q12,#shift_stage2_idct
    707     vqrshrn.s32 d3,q14,#shift_stage2_idct
    708     vqrshrn.s32 d8,q11,#shift_stage2_idct
    709 
    710 
    711 
    712 
    713 
    714 
    715 
    716 
    717 
    718 
    719     vmull.s16   q12,d14,d0[1]               @// y1 * cos1(part of b0)
    720 
    721     vmull.s16   q13,d14,d0[3]               @// y1 * cos3(part of b1)
    722     vmull.s16   q14,d14,d1[1]               @// y1 * sin3(part of b2)
    723     vmull.s16   q15,d14,d1[3]               @// y1 * sin1(part of b3)
    724 
    725     vmlal.s16   q12,d15,d0[3]               @// y1 * cos1 + y3 * cos3(part of b0)
    726     vtrn.16     d2,d3
    727     vmlsl.s16   q13,d15,d1[3]               @// y1 * cos3 - y3 * sin1(part of b1)
    728     vtrn.16     d4,d5
    729     vmlsl.s16   q14,d15,d0[1]               @// y1 * sin3 - y3 * cos1(part of b2)
    730     vtrn.16     d6,d7
    731     vmlsl.s16   q15,d15,d1[1]               @// y1 * sin1 - y3 * sin3(part of b3)
    732     vtrn.16     d8,d9
    733     vmull.s16   q10,d10,d0[0]               @// y0 * cos4(part of c0 and c1)
    734     vtrn.32     d2,d4
    735     vmull.s16   q11,d12,d0[0]               @// y4 * cos4(part of c0 and c1)
    736     vtrn.32     d3,d5
    737     vmull.s16   q9,d11,d1[2]                @// y2 * sin2 (q7 is freed by this time)(part of d1)
    738     vtrn.32     d6,d8
    739     vmull.s16   q7,d11,d0[2]                @// y2 * cos2(part of d0)
    740     vtrn.32     d7,d9
    741     vmlal.s16   q12,d16,d1[1]               @// y1 * cos1 + y3 * cos3 + y5 * sin3(part of b0)
    742 
    743     add         r4,r2,r8, lsl #1            @ r4 = r2 + pred_strd * 2    => r4 points to 3rd row of pred data
    744     vmlsl.s16   q13,d16,d0[1]               @// y1 * cos3 - y3 * sin1 - y5 * cos1(part of b1)
    745 
    746     add         r5,r8,r8, lsl #1            @
    747     vmlal.s16   q14,d16,d1[3]               @// y1 * sin3 - y3 * cos1 + y5 * sin1(part of b2)
    748 
    749     add         r0,r3,r7, lsl #1            @ r0 points to 3rd row of dest data
    750     vmlal.s16   q15,d16,d0[3]               @// y1 * sin1 - y3 * sin3 + y5 * cos3(part of b3)
    751 
    752     add         r10,r7,r7, lsl #1           @
    753     vmlsl.s16   q9,d13,d0[2]                @// d1 = y2 * sin2 - y6 * cos2(part of a0 and a1)
    754 
    755 
    756     vmlal.s16   q7,d13,d1[2]                @// d0 = y2 * cos2 + y6 * sin2(part of a0 and a1)
    757 
    758     vadd.s32    q6,q10,q11                  @// c0 = y0 * cos4 + y4 * cos4(part of a0 and a1)
    759     vsub.s32    q10,q10,q11                 @// c1 = y0 * cos4 - y4 * cos4(part of a0 and a1)
    760 
    761     vmlal.s16   q12,d17,d1[3]               @// b0 = y1 * cos1 + y3 * cos3 + y5 * sin3 + y7 * sin1(part of r0,r7)
    762     vswp        d3,d6
    763     vmlsl.s16   q13,d17,d1[1]               @// b1 = y1 * cos3 - y3 * sin1 - y5 * cos1 - y7 * sin3(part of r1,r6)
    764 
    765     vswp        d5,d8
    766     vmlal.s16   q14,d17,d0[3]               @// b2 = y1 * sin3 - y3 * cos1 + y5 * sin1 + y7 * cos3(part of r2,r5)
    767     vmlsl.s16   q15,d17,d0[1]               @// b3 = y1 * sin1 - y3 * sin3 + y5 * cos3 - y7 * cos1(part of r3,r4)
    768 
    769     vsub.s32    q11,q6,q7                   @// a3 = c0 - d0(part of r3,r4)
    770     vadd.s32    q6,q6,q7                    @// a0 = c0 + d0(part of r0,r7)
    771 
    772 
    773     vadd.s32    q0,q6,q12
    774 
    775 
    776     vsub.s32    q12,q6,q12
    777 
    778 
    779     vadd.s32    q6,q11,q15
    780 
    781 
    782     vsub.s32    q7,q11,q15
    783 
    784     vqrshrn.s32 d10,q0,#shift_stage2_idct
    785     vqrshrn.s32 d17,q12,#shift_stage2_idct
    786     vqrshrn.s32 d13,q6,#shift_stage2_idct
    787     vqrshrn.s32 d14,q7,#shift_stage2_idct
    788 
    789     vsub.s32    q11,q10,q9                  @// a2 = c1 - d1(part of r2,r5)
    790     vadd.s32    q9,q10,q9                   @// a1 = c1 + d1(part of r1,r6)
    791 
    792 
    793     vadd.s32    q0,q11,q14
    794 
    795 
    796     vsub.s32    q12,q11,q14
    797 
    798 
    799     vadd.s32    q14,q9,q13
    800 
    801 
    802     vsub.s32    q13,q9,q13
    803     vld1.8      d18,[r2],r8
    804 
    805     vqrshrn.s32 d12,q0,#shift_stage2_idct
    806     vld1.8      d20,[r2],r5
    807 
    808 
    809     vqrshrn.s32 d15,q12,#shift_stage2_idct
    810     vld1.8      d19,[r2],r8
    811 
    812 
    813 
    814 
    815     vqrshrn.s32 d11,q14,#shift_stage2_idct
    816     vld1.8      d22,[r4],r8
    817 
    818 
    819 
    820 
    821     vqrshrn.s32 d16,q13,#shift_stage2_idct
    822     vld1.8      d21,[r2],r5
    823 
    824 
    825 
    826 
    827 pred_buff_addition:
    828 
    829 
    830     vtrn.16     d10,d11
    831     vld1.8      d24,[r4],r5
    832 
    833     vtrn.16     d12,d13
    834     vld1.8      d23,[r4],r8
    835 
    836     vaddw.u8    q1,q1,d18
    837     vld1.8      d25,[r4],r5
    838 
    839     vtrn.16     d14,d15
    840     vaddw.u8    q2,q2,d22
    841 
    842     vtrn.16     d16,d17
    843     vaddw.u8    q3,q3,d20
    844 
    845     vtrn.32     d10,d12
    846     vaddw.u8    q4,q4,d24
    847 
    848     vtrn.32     d11,d13
    849     vtrn.32     d14,d16
    850     vtrn.32     d15,d17
    851 
    852     vswp        d11,d14
    853     vswp        d13,d16
    854 
    855 @ row values stored in the q register.
    856 
    857 @q1 :r0
    858 @q3: r1
    859 @q2: r2
    860 @q4: r3
    861 @q5: r4
    862 @q7: r5
    863 @q6: r6
    864 @q8: r7
    865 
    866 
    867 
    868 @/// adding the prediction buffer
    869 
    870 
    871 
    872 
    873 
    874 
    875 
    876 
    877 
    878     @ load prediction data
    879 
    880 
    881 
    882 
    883 
    884     @adding recon with prediction
    885 
    886 
    887 
    888 
    889 
    890     vaddw.u8    q5,q5,d19
    891     vqmovun.s16 d2,q1
    892     vaddw.u8    q7,q7,d21
    893     vqmovun.s16 d4,q2
    894     vaddw.u8    q6,q6,d23
    895     vqmovun.s16 d6,q3
    896     vaddw.u8    q8,q8,d25
    897     vqmovun.s16 d8,q4
    898 
    899 
    900 
    901 
    902 
    903 
    904 
    905     vst1.8      {d2},[r3],r7
    906     vqmovun.s16 d10,q5
    907     vst1.8      {d6},[r3],r10
    908     vqmovun.s16 d14,q7
    909     vst1.8      {d4},[r0],r7
    910     vqmovun.s16 d12,q6
    911     vst1.8      {d8},[r0],r10
    912     vqmovun.s16 d16,q8
    913 
    914 
    915 
    916 
    917 
    918 
    919 
    920     vst1.8      {d10},[r3],r7
    921     vst1.8      {d14},[r3],r10
    922     vst1.8      {d12},[r0],r7
    923     vst1.8      {d16},[r0],r10
    924 
    925 
    926 
    927 
    928     sub         sp,sp,#40
    929     ldmfd       sp!,{r4-r12,pc}
    930 
    931 
    932 
    933 
    934 
    935