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