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