Home | History | Annotate | Download | only in arm
      1 @/******************************************************************************
      2 @ *
      3 @ * Copyright (C) 2018 The Android Open Source Project
      4 @ *
      5 @ * Licensed under the Apache License, Version 2.0 (the "License");
      6 @ * you may not use this file except in compliance with the License.
      7 @ * You may obtain a copy of the License at:
      8 @ *
      9 @ * http://www.apache.org/licenses/LICENSE-2.0
     10 @ *
     11 @ * Unless required by applicable law or agreed to in writing, software
     12 @ * distributed under the License is distributed on an "AS IS" BASIS,
     13 @ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 @ * See the License for the specific language governing permissions and
     15 @ * limitations under the License.
     16 @ *
     17 @ *****************************************************************************
     18 @ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
     19 @*/
     20 @/**
     21 @ *******************************************************************************
     22 @ * @file
     23 @ *  ihevc_resi_trans_32x32.s
     24 @ *
     25 @ * @brief
     26 @ *  Contains function definitions for forward transform 32x32
     27 @ *
     28 @ * @author
     29 @ * Mohit
     30 @ *
     31 @ * @par List of Functions:
     32 @ *  - ihevc_resi_trans_32x32()
     33 @ *
     34 @ * @remarks
     35 @ *  None
     36 @ *
     37 @ *******************************************************************************
     38 @*/
     39 @*/
     40 .text
     41 .p2align 2
     42 
     43 .extern g_ai2_ihevc_trans_32
     44 .extern g_ai4_ihevc_trans_32
     45 
     46 g_ai2_ihevc_trans_32_addr_1:
     47 .long g_ai2_ihevc_trans_32 - ulbl1 - 8
     48 
     49 g_ai2_ihevc_trans_32_addr_2:
     50 .long g_ai2_ihevc_trans_32 - ulbl2 - 8
     51 
     52 g_ai4_ihevc_trans_32_addr:
     53 .long g_ai4_ihevc_trans_32 - ulbl3 - 8
     54 
     55 @*/
     56 @*/
     57 @/**
     58 @*/ *******************************************************************************
     59 @*/
     60 @*/@brief
     61 @*/  This function performs residue calculation and forward  transform on
     62 @*/ input pixels
     63 @*/
     64 @*/@par Description:
     65 @*/ Performs residue calculation by subtracting source and  prediction and
     66 @*/ followed by forward transform
     67 @*/
     68 @*/ @param[in] pu1_src
     69 @*/  Input 32x32 pixels
     70 @*/
     71 @*/ @param[in] pu1_pred
     72 @*/  Prediction data
     73 @*/
     74 @*/ @param[in] pi2_tmp
     75 @*/  Temporary buffer of size 16x16
     76 @*/
     77 @*/ @param[out] pi2_dst
     78 @*/  Output 32x32 coefficients
     79 @*/
     80 @*/ @param[in] src_strd
     81 @*/  Input stride
     82 @*/
     83 @*/ @param[in] pred_strd
     84 @*/  Prediction Stride
     85 @*/
     86 @*/ @param[in] dst_strd_chr_flag
     87 @*/  Output Stride and Chroma Flag packed in the MS and LS 16-bit
     88 @*/
     89 @*/ @returns  Void
     90 @*/
     91 @*/ @remarks
     92 @*/  None
     93 @*/
     94 @*/*******************************************************************************
     95 @*/
     96   .global ihevc_resi_trans_32x32_a9q
     97 ihevc_resi_trans_32x32_a9q:
     98 
     99 .equ TMP_STRIDE_32      ,  128              @16*4, Stride of tmp register
    100 .equ SHIFT_32           ,  15               @shift = 15; // log2(iWidth) - 1 + g_uiBitIncrement
    101 
    102 .equ COFF_STD_2B_32     ,  64               @Stride for g_ai2_ihevc_trans_32 in bytes
    103 .equ COFF_STD_W_32      ,  64               @Stride for g_ai4_ihevc_trans_32 in bytes
    104 
    105 @LOAD the function
    106     STMFD       SP!,{r4-r12,LR}     @stack store values of the arguments
    107     vpush       {d8 - d15}
    108     SUB         SP,SP,#32
    109 
    110     LDR         R4,[SP,#136]            @get src_strd
    111     LDR         R5,[SP,#140]            @get pred_strd
    112     LDR         R6,[SP,#144]            @get dst_strd_chr_flag
    113 
    114     MOV R8,#0                       @Set loop counter
    115     LDR R9,g_ai2_ihevc_trans_32_addr_1    @get 16 bit transform matrix
    116 ulbl1:
    117     ADD R9, R9, PC
    118 
    119     @Read [0 0] [8 0] [16 0] [24 0],[0 1] [8 1] [16 1] [24 1] values of g_ai2_ihevc_trans_32
    120     @and write to stack
    121     MOV R12,#COFF_STD_2B_32
    122     LSL R12,#3
    123 
    124     VLD1.S32 D30[0],[R9],R12
    125     VLD1.S32 D30[1],[R9],R12        @ D30 - [0 0] [0 1] [8 0] [8 1]
    126     VLD1.S32 D31[0],[R9],R12
    127     VLD1.S32 D31[1],[R9],R12        @ D31 - [16 0] [16 1] [24 0] [24 1]
    128 
    129     VTRN.S32 D30,D31                @ D30 - [0 0] [0 1] [16 0] [16 1]
    130     VTRN.S16 D30,D31                @ D31 - [8 0] [8 1] [24 0] [24 1]
    131     VST1.S16 {D30,D31},[SP]
    132 
    133     LDR R9,g_ai2_ihevc_trans_32_addr_2    @get 16 bit transform matrix
    134 ulbl2:
    135     ADD R9, R9, PC
    136 
    137     MOV R7,#TMP_STRIDE_32
    138 @   AND R14,R6,#0x1
    139 
    140     VMOV.S32 Q14,#0
    141 
    142 @R0     pu1_src
    143 @R1     pu1_pred
    144 @R2     pi4_tmp
    145 @R3     pi2_dst
    146 @R4     src_strd - 16
    147 @R5     pred_strd - 16
    148 @R6     dst_strd_chr_flag
    149 @R7     tmp_dst Nx4 block stride
    150 @R8     loop cntr
    151 @R9     g_ai2_ihevc_trans_32
    152 @R10    tmp_dst Nx4 block offset
    153 @R11    tmp register
    154 @R12    ------
    155 @R14    ------.
    156 @q14    shift 32 bit
    157 @q15    add 32 bit
    158 
    159     SUB R4, R4, #16
    160     SUB R5, R5, #16
    161 CORE_LOOP_32X32_HORIZ:
    162 
    163     VLD1.U8 {D0,D1},[R0]!           @LOAD 1-16 src row 1
    164 
    165     VLD1.U8 {D4,D5},[R1]!           @LOAD 1-16 pred row 1
    166 
    167     VLD1.U8 {D2,D3},[R0],R4         @LOAD 17-32 src row 1
    168     @ Residue calculation
    169     VSUBL.U8 Q8,D0,D4           @ Get residue 1-8 row 1 -- dual issued with prev. instr. 2nd cycle
    170 
    171     VLD1.U8 {D6,D7},[R1],R5         @LOAD 17-32 pred row 1
    172     VSUBL.U8 Q9,D1,D5           @ Get residue 9-16 row 1 -- dual issue
    173 
    174     VLD1.U8 {D8,D9},[R0]!           @ LOAD 1-16 src row 2
    175     VSUBL.U8 Q10,D2,D6          @ Get residue 17-24 row 1 -- dual issue
    176 
    177     VLD1.U8 {D12,D13},[R1]!         @ LOAD 1-16 pred row 2
    178     VSUBL.U8 Q11,D3,D7          @ Get residue 25-32 row 1 -- dual issue
    179 
    180     VLD1.U8 {D10,D11},[R0],R4           @ LOAD 17-32 src row 2
    181     @ Residue - Row 2
    182     VSUBL.U8 Q12,D8,D12         @ Get residue 1-8 row 2 -- dual issue
    183 
    184     VLD1.U8 {D14,D15},[R1],R5           @ LOAD 17-32 pred row 2
    185     VSUBL.U8 Q13,D9,D13         @ Get residue 9-16 row 2 -- dual issue
    186     @ Get blk sads
    187     VABDL.U8 Q15,D0,D4
    188     VABAL.U8 Q15,D1,D5
    189     VABAL.U8 Q15,D2,D6
    190     VABAL.U8 Q15,D3,D7
    191     VABAL.U8 Q15,D8,D12
    192     VABAL.U8 Q15,D9,D13
    193     VABAL.U8 Q15,D10,D14
    194     VABAL.U8 Q15,D11,D15
    195     VADDW.S16 Q14,Q14,D30
    196     VADDW.S16 Q14,Q14,D31
    197     @ SAD Ends
    198 
    199     VREV64.S16 Q10,Q10          @ Rev 17-24 row 1 -- dual issue
    200     VSUBL.U8 Q2,D10,D14         @ Get residue 17-24 row 2
    201     VREV64.S16 Q11,Q11          @ Rev 25-32 row 1 -- dual issue
    202     VSUBL.U8 Q3,D11,D15         @ Get residue 25-32 row 2
    203 
    204     VSWP D20,D21                @ Q10: 24 23 22 21 20 19 18 17 row 1
    205     VSWP D22,D23                @ Q11: 32 31 30 29 28 27 26 25 row 1
    206 
    207     VREV64.S16 Q2,Q2            @ Rev 17-24 row 2
    208     VADD.S16 Q5, Q9,Q10         @ e[k] = resi_tmp_1 + resi_tmp_2  k ->9-16 row 1 -- dual issue
    209     VREV64.S16 Q3,Q3            @ Rev 25-32 row 2
    210     VADD.S16 Q4, Q8,Q11         @ e[k] = resi_tmp_1 + resi_tmp_2  k -> 1-8 row 1 -- dual issue
    211     VSWP D4,D5                  @ Q2: 24 23 22 21 20 19 18 17 row 2
    212     VSUB.S16 Q6, Q8,Q11         @ o[k] = resi_tmp_1 - resi_tmp_2  k -> 1-8 row 1 -- dual issue
    213     VSWP D6,D7                  @ Q3: 32 31 30 29 28 27 26 25 row 2
    214     VSUB.S16 Q7, Q9,Q10         @ o[k] = resi_tmp_1 - resi_tmp_2  k ->9-16 row 1 -- dual issue
    215 
    216     VREV64.16 Q5, Q5            @ Rev 9-16 of e[k], row 1
    217     VADD.S16 Q9, Q13,Q2         @ e[k] = resi_tmp_1 + resi_tmp_2  k ->9-16 row 2 -- dual issue
    218     VADD.S16 Q8, Q12,Q3         @ e[k] = resi_tmp_1 + resi_tmp_2  k -> 1-8 row 2
    219     VSWP D10, D11               @ Q5: e[16] e[15] e[14] e[13] e[12] e[11] e[10] e[9]
    220     VSUB.S16 Q10, Q12,Q3        @ o[k] = resi_tmp_1 - resi_tmp_2  k -> 1-8 row 2 -- dual issue
    221     VREV64.16 Q9, Q9            @ Rev 9-16 of e[k], row 2
    222     VSUB.S16 Q11, Q13,Q2        @ o[k] = resi_tmp_1 - resi_tmp_2  k ->9-16 row 2 -- dual issue
    223 
    224     VADD.S16 Q0, Q4, Q5         @ ee[k] = e[k] + e[16-k] k->1-8 row 1
    225     VSWP D18, D19               @ Q9: e[16] e[15] e[14] e[13] e[12] e[11] e[10] e[9]
    226     VSUB.S16 Q1, Q4, Q5         @ eo[k] = e[k] - e[16-k] k->1-8 row 1 -- dual issue
    227 
    228     VREV64.S16  D8,D1           @ rev ee[k] k-> 4-7 row 1
    229     VADD.S16 Q2, Q8, Q9         @ ee[k] = e[k] + e[16-k] k->1-8 row 2 -- dual issue
    230     VSUB.S16 Q3, Q8, Q9         @ eo[k] = e[k] - e[16-k] k->1-8 row 2
    231     VMOV.S16    D1,D4
    232     VREV64.S16  D9,D5           @ rev ee[k] k-> 4-7 row 2
    233 
    234     @ arrangement OF DATA
    235     @ Q0    A1 A2 A3 A4 B1 B2 B3 B4
    236     @ Q4    A8 A7 A6 A5 B8 B7 B6 B5
    237     @---------------Process EEO starts--------------------
    238     MOV R12,#COFF_STD_2B_32     @Get stride of coeffs
    239 
    240     ADD R11,R9,R12,LSL #2       @Load address of g_ai2_ihevc_trans_32[4]
    241     LSL R12,R12,#3
    242 
    243     VADD.S16 Q13, Q0, Q4        @ eee[k] = ee[k] + ee[7 - k] row 1 & 2
    244     VLD1.S16 D24,[R11],R12      @ LOAD g_ai2_ihevc_trans_32[4][0-4]
    245     VSUB.S16 Q0, Q0 ,Q4         @ eeo[k] = ee[k] - ee[7 - k] row 1 & 2  -- dual issue
    246 
    247     @ D26 R1eee[0] R1eee[1] R1eee[2] R1eee[3]
    248     @ D27 R2eee[0] R2eee[1] R2eee[2] R2eee[3]
    249     VTRN.S32 D26,D27
    250     @ D26 R1eee[0] R1eee[1] R2eee[0] R2eee[1]
    251     @ D27 R1eee[2] R1eee[3] R2eee[2] R2eee[3]
    252     VREV32.16 D4,D27
    253     @ D26 R1eee[0] R1eee[1] R2eee[0] R2eee[1]
    254     @ D4 R1eee[3] R1eee[2] R2eee[3] R2eee[2]
    255     VMOV.S16 D27,D26
    256     VNEG.S16 D5,D4
    257 
    258     @ Q13 R1eee[0] R1eee[1] R2eee[0] R2eee[1]  R1eee[0]  R1eee[1]  R2eee[0]  R2eee[1]
    259     @ Q2  R1eee[3] R1eee[2] R2eee[3] R2eee[2] -R1eee[3] -R1eee[2] -R2eee[3] -R2eee[2]
    260     @ 1- cycle stall?
    261     VADD.S16 Q2,Q13,Q2
    262     @ Q2 R1eeee[0] R1eeee[1] R2eeee[0] R2eeee[1] R1eeeo[0] R1eeeo[1] R2eeeo[0] R2eeeo[1]
    263 
    264     @ Q2  R1eeee[0] R1eeee[1] R2eeee[0] R2eeee[1]
    265     @    R1eeeo[0] R1eeeo[1] R2eeeo[0] R2eeeo[1]
    266     VMULL.S16 Q15,D24,D0            @g_ai2_ihevc_trans_32[4][0-4] * eeo[0-4]    R1 -- dual issue
    267     VTRN.S16 D4,D5
    268     @ Q2  R1eeee[0] R1eeeo[0] R2eeee[0] R2eeeo[0]
    269     @    R1eeee[1] R1eeeo[1] R2eeee[1] R2eeeo[1]
    270     @ 1-cycle stall?
    271     VDUP.S32 D8,D4[0]               @ R1eeee[0] R1eeeo[0] R1eeee[0] R1eeeo[0]
    272     VDUP.S32 D9,D4[1]               @ R2eeee[0] R2eeeo[0] R2eeee[0] R2eeeo[0]
    273     VDUP.S32 D10,D5[0]              @ R1eeee[1] R1eeeo[1] R1eeee[1] R1eeeo[1]
    274     VDUP.S32 D11,D5[1]              @ R2eeee[1] R2eeeo[1] R2eeee[1] R2eeeo[1]
    275 
    276     @D4 : [0 0] [8 0] [16 0] [24 0]
    277     @D5 : [0 1] [8 1] [16 1] [24 1]
    278     VLD1.S16 {D4,D5},[SP]               @   [0 0] [8 0] [16 0] [24 0] [0 1] [8 1] [16 1] [24 1]
    279     VMULL.S16 Q8,D8,D4              @   g_ai2_ihevc_trans_32 * R1eeee[0] R1eeeo[0] R1eeee[0] R1eeeo[0] -- dual issue 2nd cycle
    280     VMLAL.S16 Q8,D10,D5             @ + g_ai2_ihevc_trans_32 * R1eeee[1] R1eeeo[1] R1eeee[1] R1eeeo[1]
    281     VLD1.S16 D27,[R11],R12          @LOAD g_ai2_ihevc_trans_32[12][0-4] -- 1st cycle dual issue with prev. MLAL
    282     VMULL.S16 Q9,D9,D4              @   g_ai2_ihevc_trans_32 * R2eeee[0] R2eeeo[0] R2eeee[0] R2eeeo[0] -- dual issue 2nd cycle
    283     VMLAL.S16 Q9,D11,D5             @ + g_ai2_ihevc_trans_32 * R2eeee[1] R2eeeo[1] R2eeee[1] R2eeeo[1]
    284 
    285     VMULL.S16 Q4,D24,D1             @g_ai2_ihevc_trans_32[4][0-4] * eeo[0-4]    R2
    286 
    287     VMULL.S16 Q5,D27,D0             @g_ai2_ihevc_trans_32[12][0-4] * eeo[0-4]   R1
    288     VZIP.S32 Q8,Q9                  @ 3-cycle instruction -- 1st cycle dual issued
    289     @These values must go to 0 8 16 24 rows hence we need stride *8
    290     LSL R10,R7,#3
    291     VMULL.S16 Q12,D27,D1            @g_ai2_ihevc_trans_32[12][0-4] * eeo[0-4]   R2
    292     VST1.32 D16,[R2],R10            @ -- dual issued
    293 
    294     VST1.32 D17,[R2],R10
    295 
    296     VLD1.S16 D26,[R11],R12          @LOAD g_ai2_ihevc_trans_32[20][0-4]
    297 
    298     VMULL.S16 Q8,D26,D1             @g_ai2_ihevc_trans_32[20][0-4] * eeo[0-4] R2
    299     VST1.32 D18,[R2],R10            @ -- dual issued
    300 
    301     VST1.32 D19,[R2],R10
    302 
    303     SUB R2,R2,R10,LSL #2
    304     @----------------------------Process EEEO ends----------------------------------------
    305 
    306     VLD1.S16 D27,[R11],R12          @LOAD g_ai2_ihevc_trans_32[28][0-4]
    307     VMULL.S16 Q9,D26,D0             @g_ai2_ihevc_trans_32[20][0-4] * eeo[0-4] R1
    308 
    309     VMULL.S16 Q2,D27,D1             @g_ai2_ihevc_trans_32[28][0-4] * eeo[0-4] R2
    310     @transpose the 4x4 matrix row1
    311     VTRN.32 Q15, Q5                 @R1 transpose1  -- dual issue
    312     VMULL.S16 Q13,D27,D0            @g_ai2_ihevc_trans_32[28][0-4] * eeo[0-4] R1
    313 
    314     @transpose the 4x4 matrix row2
    315     VTRN.32 Q4,Q12                  @R2 transpose1
    316     VTRN.32 Q8,Q2                   @R2 transpose1
    317 
    318     @-----------------------Processing EO ----------------------------
    319     MOV R12,#COFF_STD_2B_32         @Get coeffs stride
    320     ADD R11,R9,R12,LSL #1           @Load address of g_ai2_ihevc_trans_32[2]
    321     LSL R12,R12,#2
    322     VLD1.S16 {D0,D1},[R11],R12          @g_ai2_ihevc_trans_32[2][0-7]
    323 
    324     VSWP    D4,D25                  @R2 transpose2
    325     VSWP    D16,D9                  @R2 transpose2
    326 
    327     VADD.S32 Q4,Q4,Q12              @R2 add -- dual issue 1st cycle
    328     VTRN.32 Q9, Q13                 @R1 transpose1
    329     VADD.S32 Q8,Q8,Q2               @R2 add -- dual issue 2nd cycle
    330 
    331     VSWP    D18,D31                 @R1 transpose2
    332     VMULL.S16 Q2,D2,D0              @eo[0][0-3]*  R1 -- dual issue
    333     VMLAL.S16 Q2,D3,D1              @eo[0][4-7]*  R1
    334 
    335     VSWP    D26,D11                 @R1 transpose2
    336     VADD.S32 Q8,Q4,Q8               @R2 add -- dual issue
    337 
    338     VADD.S32 Q15,Q15,Q9             @R1 add
    339     VADD.S32 Q5,Q5,Q13              @R1 add
    340     VMULL.S16 Q4,D6,D0              @eo[0][0-3]*  R2
    341     VMLAL.S16 Q4,D7,D1              @eo[0][4-7]*  R2
    342     VADD.S32 Q15,Q15,Q5             @R1 add
    343 
    344     VLD1.S16 {D0,D1},[R11],R12          @g_ai2_ihevc_trans_32[6][0-7]
    345 
    346     VMULL.S16 Q5,D2,D0              @eo[1][0-3]*  R1
    347     VMLAL.S16 Q5,D3,D1              @eo[1][4-7]*  R1
    348 
    349 
    350     VZIP.S32 Q15,Q8                 @ 3-cycle instruction
    351     VMULL.S16 Q13,D6,D0             @eo[1][0-3]*  R2 -- dual issue
    352     VMLAL.S16 Q13,D7,D1             @eo[1][4-7]*  R2
    353 
    354     VLD1.S16 {D0,D1},[R11],R12          @g_ai2_ihevc_trans_32[10][0-7] -- dual issue with prev. MLAL
    355 
    356     @write to memory
    357     @this should go to 4 12 20 28
    358     LSL R10,R7,#3
    359     ADD R2,R2,R7,LSL #2             @move to fifth row
    360     VST1.32 D30,[R2],R10
    361     VMULL.S16 Q9,D2,D0              @eo[2][0-3]*  R1 -- dual issue
    362     VMLAL.S16 Q9,D3,D1              @eo[2][4-7]*  R1
    363     VST1.32 D31,[R2],R10            @ 1st cycle dual issued with MLAL
    364 
    365     VST1.32 D16,[R2],R10
    366     VMULL.S16 Q12,D6,D0             @eo[2][0-3]*  R2 -- dual issue
    367     VMLAL.S16 Q12,D7,D1             @eo[2][4-7]*  R2
    368     VST1.32 D17,[R2],R10            @ 1st cycle dual issued with MLAL
    369 
    370     SUB R2,R2,R10,LSL #2
    371     SUB R2,R2,R7,LSL #2
    372     @--------------------Done procrssing EEO -------------------------
    373 
    374     VLD1.S16 {D0,D1},[R11],R12  @g_ai2_ihevc_trans_32[14][0-7]
    375 
    376     VMULL.S16 Q8,D2,D0      @eo[3][0-3]*  R1
    377     VMLAL.S16 Q8,D3,D1      @eo[3][4-7]*  R1
    378 
    379     @transpose the 4x4 matrix R1
    380     VTRN.32 Q2, Q5          @
    381     VMULL.S16 Q15,D6,D0     @eo[3][0-3]*  R2 -- dual issued with 2nd cycle of TRN
    382     VMLAL.S16 Q15,D7,D1     @eo[3][4-7]*  R2
    383     VTRN.32 Q9, Q8          @ 1st cycle dual issued
    384     @transpose the 4x4 matrix R2
    385     VTRN.32 Q4,Q13
    386 
    387     VSWP    D18, D5         @ R1
    388     VSWP    D16, D11        @ R1
    389     VADD.S32 Q2, Q2, Q5     @ R1
    390     VADD.S32 Q9, Q9, Q8     @ R1
    391     VTRN.32 Q12,Q15         @ R2 -- dual issue
    392     VADD.S32 Q9, Q2, Q9     @ R1
    393 
    394     VSWP    D24,D9          @ R2
    395     VSWP    D30,D27         @ R2
    396 
    397     VLD1.S16 {D4,D5},[R11],R12  @g_ai2_ihevc_trans_32[18][0-7]
    398 
    399     VADD.S32 Q4, Q4, Q13    @ R2
    400     VADD.S32 Q12, Q12, Q15  @ R2
    401     VMULL.S16 Q0,D2,D4      @eo[4][0-3]*  R1
    402     VMLAL.S16 Q0,D3,D5      @eo[4][4-7]*  R1
    403     VADD.S32 Q12, Q4, Q12   @ R2
    404 
    405     VZIP.S32 Q9,Q12         @ 3-cycle
    406     VMULL.S16 Q4,D6,D4      @eo[0][0-3]*  R2  -- dual issue
    407     VMLAL.S16 Q4,D7,D5      @eo[0][4-7]*  R2
    408 
    409     VLD1.S16 {D4,D5},[R11],R12  @g_ai2_ihevc_trans_32[22][0-7] -- 1st cycle dual issued with prev. instr
    410 
    411     @write to memory
    412     @this should go to 2 6 10 14
    413     ADD R2,R2,R7, LSL #1
    414     LSL R7,R7,#2
    415     VST1.32 D18,[R2],R7
    416     VMULL.S16 Q5,D2,D4      @eo[5][0-3]*  R1  -- dual issue
    417     VMLAL.S16 Q5,D3,D5      @eo[5][4-7]*  R1
    418     VST1.32 D19,[R2],R7     @ 1st cycle dual issued with prev. instr
    419 
    420     VST1.32 D24,[R2],R7
    421     VMULL.S16 Q8,D6,D4      @eo[0][0-3]*  R2  -- dual issue
    422     VMLAL.S16 Q8,D7,D5      @eo[0][4-7]*  R2
    423     VST1.32 D25,[R2],R7     @ 1st cycle dual issued with prev. instr
    424 
    425 
    426     VLD1.S16 {D4,D5},[R11],R12  @g_ai2_ihevc_trans_32[26][0-7]
    427     VMULL.S16 Q9,D2,D4      @eo[6][0-3]*  R1
    428     VMLAL.S16 Q9,D3,D5      @eo[6][4-7]*  R1
    429     VMULL.S16 Q12,D6,D4     @eo[0][0-3]*  R2
    430     VMLAL.S16 Q12,D7,D5     @eo[0][4-7]*  R2
    431 
    432     VLD1.S16 {D4,D5},[R11],R12  @g_ai2_ihevc_trans_32[30][0-7]
    433     VMULL.S16 Q13,D2,D4     @eo[7][0-3]*  R1
    434     VMLAL.S16 Q13,D3,D5     @eo[7][4-7]*  R1
    435     VMULL.S16 Q15,D6,D4     @eo[0][0-3]*  R2
    436     VMLAL.S16 Q15,D7,D5     @eo[0][4-7]*  R2
    437 
    438     @-----------------------Processing O ----------------------------
    439     MOV R12,#COFF_STD_2B_32 @Get coeffs stride
    440     LSL R12,R12,#1
    441     ADD R11,R9,#COFF_STD_2B_32  @Get address of g_ai2_ihevc_trans_32[1]
    442     SUB R12, R12, #16
    443 
    444     VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[1][0-7]
    445 
    446     VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[1][8-15]
    447     VMULL.S16 Q1,D20,D4     @o[0][0-3]*  R2 -- dual issue
    448     VMLAL.S16 Q1,D21,D5     @o[0][4-7]*  R2
    449     VMLAL.S16 Q1,D22,D6     @o[0][8-11]*  R2
    450     VMLAL.S16 Q1,D23,D7     @o[0][12-15]*  R2
    451 
    452     @transpose the 4x4 matrix R1
    453     VTRN.32 Q0, Q5          @ R1
    454     VTRN.32 Q9,Q13          @ R1
    455     @transpose the 4x4 matrix R2
    456     VTRN.32 Q4,Q8           @ R2
    457     VSWP    D18, D1         @ R1
    458     VSWP    D26, D11        @ R1
    459     VTRN.32 Q12,Q15         @ R2
    460     VADD.S32 Q0, Q0, Q5     @ R1 -- dual issue
    461     VADD.S32 Q9, Q9, Q13    @ R1
    462 
    463     VSWP    D24,D9          @ R2
    464     VSWP    D30,D17         @ R2
    465     VADD.S32 Q9, Q0, Q9     @ R1 -- dual issue
    466 
    467     VMULL.S16 Q0,D12,D4     @o[0][0-3]*  R1
    468     VMLAL.S16 Q0,D13,D5     @o[0][4-7]*  R1
    469     VMLAL.S16 Q0,D14,D6     @o[0][8-11]*  R1
    470     VMLAL.S16 Q0,D15,D7     @o[0][12-15]*  R1
    471 
    472     VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[3][0-7]
    473     VADD.S32 Q4, Q4, Q8     @ R2 -- dual issue
    474     VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[3][8-15]
    475     VADD.S32 Q12, Q12, Q15  @ R2 -- dual issue
    476 
    477     VMULL.S16 Q5,D20,D4     @o[0][0-3]*  R2
    478     VMLAL.S16 Q5,D21,D5     @o[0][4-7]*  R2
    479     VMLAL.S16 Q5,D22,D6     @o[0][8-11]*  R2
    480     VMLAL.S16 Q5,D23,D7     @o[0][12-15]*  R2
    481     VADD.S32 Q12, Q4, Q12   @ R2
    482 
    483     VZIP.S32 Q9,Q12
    484     VMULL.S16 Q4,D12,D4     @o[0][0-3]*  R1
    485     VMLAL.S16 Q4,D13,D5     @o[0][4-7]*  R1
    486     VMLAL.S16 Q4,D14,D6     @o[0][8-11]*  R1
    487     VMLAL.S16 Q4,D15,D7     @o[0][12-15]*  R1
    488 
    489     VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[5][0-7] -- 1st cycle dual issued with prev. instr
    490 
    491     VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[5][8-15]
    492     VMULL.S16 Q8,D12,D4     @o[0][0-3]*  R1 -- dual issue with 2nd cycle
    493     VMLAL.S16 Q8,D13,D5     @o[0][4-7]*  R1
    494     VMLAL.S16 Q8,D14,D6     @o[0][8-11]*  R1
    495     VMLAL.S16 Q8,D15,D7     @o[0][12-15]*  R1
    496     @this should go to 18 22 26 30
    497     VST1.32 D18,[R2],R7     @1st cycle dual issue
    498 
    499     VST1.32 D19,[R2],R7
    500 
    501     VST1.32 D24,[R2],R7
    502     VMULL.S16 Q9,D20,D4     @o[0][0-3]*  R2 -- dual issue with 2nd cycle
    503     VMLAL.S16 Q9,D21,D5     @o[0][4-7]*  R2
    504     VMLAL.S16 Q9,D22,D6     @o[0][8-11]*  R2
    505     VMLAL.S16 Q9,D23,D7     @o[0][12-15]*  R2
    506 
    507     VST1.32 D25,[R2],R7     @ 1st cycle dual issue
    508 
    509     SUB R2,R2,R7, LSL #3
    510     LSR R7,R7,#2
    511     SUB R2,R2,R7, LSL #1
    512     @--------------------Done Processing EO--------------------------
    513 
    514 
    515     VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[7][0-7]
    516 
    517     VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[7][8-15]
    518     VMULL.S16 Q12,D12,D4    @o[0][0-3]*  R1 -- dual issue
    519     VMLAL.S16 Q12,D13,D5    @o[0][4-7]*  R1 -- dual issue
    520     VMLAL.S16 Q12,D14,D6    @o[0][8-11]*  R1
    521     VMLAL.S16 Q12,D15,D7    @o[0][12-15]*  R1
    522     VMULL.S16 Q13,D20,D4    @o[0][0-3]*  R2
    523     VMLAL.S16 Q13,D21,D5    @o[0][4-7]*  R2
    524     VMLAL.S16 Q13,D22,D6    @o[0][8-11]*  R2
    525     VMLAL.S16 Q13,D23,D7    @o[0][12-15]*  R2
    526 
    527     @transpose the 4x4 matrix R1
    528     VTRN.32 Q0, Q4          @ R1
    529     VTRN.32 Q8, Q12         @ R1
    530     @transpose the 4x4 matrix R2
    531     VTRN.32 Q1, Q5          @ R2
    532     VSWP    D16, D1         @ R1
    533     VSWP    D24, D9         @ R1
    534 
    535     VTRN.32 Q9, Q13         @ R2
    536     VADD.S32 Q0, Q0, Q4     @ R1 -- dual issue
    537     VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[9][0-7]
    538     VADD.S32 Q8, Q8, Q12    @ R1 -- dual issue
    539 
    540     VSWP    D18, D3         @ R2
    541     VSWP    D26, D11        @ R2
    542     VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[9][8-15]
    543     VADD.S32 Q8, Q0, Q8     @ R1 -- dual issue
    544 
    545     VADD.S32 Q1, Q1, Q5     @ R2
    546     VADD.S32 Q9, Q9, Q13    @ R2
    547 
    548     VMULL.S16 Q0,D12,D4     @o[0][0-3]*  R1
    549     VMLAL.S16 Q0,D13,D5     @o[0][4-7]*  R1
    550     VMLAL.S16 Q0,D14,D6     @o[0][8-11]*  R1
    551     VMLAL.S16 Q0,D15,D7     @o[0][12-15]*  R1
    552     VADD.S32 Q9, Q1, Q9     @ R2
    553 
    554     VMULL.S16 Q1,D20,D4     @o[0][0-3]*  R2
    555     VMLAL.S16 Q1,D21,D5     @o[0][4-7]*  R2
    556     VMLAL.S16 Q1,D22,D6     @o[0][8-11]*  R2
    557     VMLAL.S16 Q1,D23,D7     @o[0][12-15]*  R2
    558 
    559     VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[11][0-7] -- 1st cycle dual issue
    560     VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[11][8-15]
    561 
    562     VZIP.S32 Q8, Q9
    563 
    564     @write to memory
    565     @this should go to 1 3 5 7
    566     ADD R2,R2,R7
    567     LSL R7,R7,#1
    568     VST1.32 D16, [R2], R7
    569 
    570     VST1.32 D17, [R2], R7
    571     VMULL.S16 Q4,D12,D4     @o[0][0-3]*  R1 -- dual issued with 2nd cycle
    572     VMLAL.S16 Q4,D13,D5     @o[0][4-7]*  R1
    573     VMLAL.S16 Q4,D14,D6     @o[0][8-11]*  R1
    574     VMLAL.S16 Q4,D15,D7     @o[0][12-15]*  R1
    575 
    576     VST1.32 D18, [R2], R7   @ 1st cycle dual issued
    577     VMULL.S16 Q5,D20,D4     @o[0][0-3]*  R2 -- dual issue with 2nd cycle
    578     VMLAL.S16 Q5,D21,D5     @o[0][4-7]*  R2
    579     VMLAL.S16 Q5,D22,D6     @o[0][8-11]*  R2
    580     VMLAL.S16 Q5,D23,D7     @o[0][12-15]*  R2
    581 
    582     VST1.32 D19, [R2], R7   @ 1st cycle dual issued
    583 
    584 
    585     VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[13][0-7]
    586 
    587     VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[13][8-15]
    588     VMULL.S16 Q8,D12,D4     @o[0][0-3]*  R1 -- dual issue
    589     VMLAL.S16 Q8,D13,D5     @o[0][4-7]*  R1
    590     VMLAL.S16 Q8,D14,D6     @o[0][8-11]*  R1
    591     VMLAL.S16 Q8,D15,D7     @o[0][12-15]*  R1
    592     VMULL.S16 Q9,D20,D4     @o[0][0-3]*  R2
    593     VMLAL.S16 Q9,D21,D5     @o[0][4-7]*  R2
    594     VMLAL.S16 Q9,D22,D6     @o[0][8-11]*  R2
    595     VMLAL.S16 Q9,D23,D7     @o[0][12-15]*  R2
    596 
    597     VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[15][0-7] - 1st cycle dual issue
    598     VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[15][8-15]
    599     VMULL.S16 Q12,D12,D4    @o[0][0-3]*  R1 -- dual issue
    600     VMLAL.S16 Q12,D13,D5    @o[0][4-7]*  R1
    601     VMLAL.S16 Q12,D14,D6    @o[0][8-11]*  R1
    602     VMLAL.S16 Q12,D15,D7    @o[0][12-15]*  R1
    603     VMULL.S16 Q13,D20,D4    @o[0][0-3]*  R2
    604     VMLAL.S16 Q13,D21,D5    @o[0][4-7]*  R2
    605     VMLAL.S16 Q13,D22,D6    @o[0][8-11]*  R2
    606     VMLAL.S16 Q13,D23,D7    @o[0][12-15]*  R2
    607 
    608     @transpose the 4x4 matrix R1
    609     VTRN.32 Q0, Q4          @ R1 1st cycle dual issue
    610     VTRN.32 Q8, Q12         @ R1
    611     @transpose the 4x4 matrix R2
    612     VTRN.32 Q1, Q5          @ R2
    613     VSWP    D16, D1         @ R1
    614     VSWP    D24, D9         @ R1
    615 
    616     VTRN.32 Q9, Q13         @ R2
    617     VADD.S32 Q0, Q0, Q4     @ R1 -- dual issue
    618     VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[17][0-7]
    619     VADD.S32 Q8, Q8, Q12    @ R1 -- dual issue
    620 
    621     VSWP    D18, D3         @ R2
    622     VSWP    D26, D11        @ R2
    623     VADD.S32 Q8, Q0, Q8     @ R1 -- dual issue with 1st cycle
    624     VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[17][8-15]
    625 
    626 
    627     VADD.S32 Q1, Q1, Q5     @ R2 -- dual issue with 2nd cycle
    628     VADD.S32 Q9, Q9, Q13    @ R2
    629 
    630     VMULL.S16 Q0,D12,D4     @o[0][0-3]*  R1
    631     VMLAL.S16 Q0,D13,D5     @o[0][4-7]*  R1
    632     VMLAL.S16 Q0,D14,D6     @o[0][8-11]*  R1
    633     VMLAL.S16 Q0,D15,D7     @o[0][12-15]*  R1
    634     VADD.S32 Q9, Q1, Q9     @ R2
    635 
    636     VMULL.S16 Q1,D20,D4     @o[0][0-3]*  R2
    637     VMLAL.S16 Q1,D21,D5     @o[0][4-7]*  R2
    638     VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[19][0-7]
    639     VMLAL.S16 Q1,D22,D6     @o[0][8-11]*  R2
    640     VMLAL.S16 Q1,D23,D7     @o[0][12-15]*  R2
    641     VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[19][8-15]
    642 
    643     VZIP.S32 Q8, Q9
    644 
    645     @write to memory
    646     @this should go to 9 11 13 15
    647     VST1.32 D16, [R2], R7
    648     VMULL.S16 Q4,D12,D4     @o[0][0-3]*  R1 -- dual issued with 2nd cycle
    649     VMLAL.S16 Q4,D13,D5     @o[0][4-7]*  R1
    650     VMLAL.S16 Q4,D14,D6     @o[0][8-11]*  R1
    651     VMLAL.S16 Q4,D15,D7     @o[0][12-15]*  R1
    652 
    653     VST1.32 D17, [R2], R7   @ 1st cycle dual issued
    654     VMULL.S16 Q5,D20,D4     @o[0][0-3]*  R2 -- dual issue with 2nd cycle
    655     VMLAL.S16 Q5,D21,D5     @o[0][4-7]*  R2
    656     VST1.32 D18, [R2], R7   @1st cycle dual issued
    657     VMLAL.S16 Q5,D22,D6     @o[0][8-11]*  R2 -- dual issued with 2nd cycle
    658     VMLAL.S16 Q5,D23,D7     @o[0][12-15]*  R2
    659 
    660     VST1.32 D19, [R2], R7   @ 1st cycle dual issue
    661 
    662 
    663     VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[21][0-7]
    664     VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[21][8-15]
    665     VMULL.S16 Q8,D12,D4     @o[0][0-3]*  R1 -- dual issue
    666     VMLAL.S16 Q8,D13,D5     @o[0][4-7]*  R1
    667     VMLAL.S16 Q8,D14,D6     @o[0][8-11]*  R1
    668     VMLAL.S16 Q8,D15,D7     @o[0][12-15]*  R1
    669     VMULL.S16 Q9,D20,D4     @o[0][0-3]*  R2
    670     VMLAL.S16 Q9,D21,D5     @o[0][4-7]*  R2
    671     VMLAL.S16 Q9,D22,D6     @o[0][8-11]*  R2
    672     VMLAL.S16 Q9,D23,D7     @o[0][12-15]*  R2
    673 
    674     VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[23][0-7]
    675     VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[23][8-15]
    676     VMULL.S16 Q12,D12,D4    @o[0][0-3]*  R1 -- dual issue
    677     VMLAL.S16 Q12,D13,D5    @o[0][4-7]*  R1 -- dual issue
    678     VMLAL.S16 Q12,D14,D6    @o[0][8-11]*  R1
    679     VMLAL.S16 Q12,D15,D7    @o[0][12-15]*  R1
    680     VMULL.S16 Q13,D20,D4    @o[0][0-3]*  R2
    681     VMLAL.S16 Q13,D21,D5    @o[0][4-7]*  R2
    682     VMLAL.S16 Q13,D22,D6    @o[0][8-11]*  R2
    683     VMLAL.S16 Q13,D23,D7    @o[0][12-15]*  R2
    684 
    685     @transpose the 4x4 matrix R1
    686     VTRN.32 Q0, Q4          @ R1
    687     VTRN.32 Q8, Q12         @ R1
    688     @transpose the 4x4 matrix R2
    689     VTRN.32 Q1, Q5          @ R2
    690     VSWP    D16, D1         @ R1
    691     VSWP    D24, D9         @ R1
    692 
    693     VTRN.32 Q9, Q13         @ R2
    694     VADD.S32 Q0, Q0, Q4     @ R1 -- dual issue
    695     VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[25][0-7]
    696     VADD.S32 Q8, Q8, Q12    @ R1 -- dual issue
    697 
    698     VSWP    D18, D3         @ R2
    699     VSWP    D26, D11        @ R2
    700     VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[25][8-15]
    701     VADD.S32 Q8, Q0, Q8     @ R1 -- dual issue
    702 
    703     VADD.S32 Q1, Q1, Q5     @ R2
    704     VADD.S32 Q9, Q9, Q13    @ R2
    705 
    706     VMULL.S16 Q0,D12,D4     @o[0][0-3]*  R1
    707     VMLAL.S16 Q0,D13,D5     @o[0][4-7]*  R1
    708     VMLAL.S16 Q0,D14,D6     @o[0][8-11]*  R1
    709     VMLAL.S16 Q0,D15,D7     @o[0][12-15]*  R1
    710     VADD.S32 Q9, Q1, Q9     @ R2
    711 
    712     VMULL.S16 Q1,D20,D4     @o[0][0-3]*  R2
    713     VMLAL.S16 Q1,D21,D5     @o[0][4-7]*  R2
    714     VMLAL.S16 Q1,D22,D6     @o[0][8-11]*  R2
    715     VMLAL.S16 Q1,D23,D7     @o[0][12-15]*  R2
    716 
    717     VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[27][0-7]
    718     VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[27][8-15]
    719 
    720     VZIP.S32 Q8, Q9
    721     VMULL.S16 Q4,D12,D4     @o[0][0-3]*  R1
    722     VMLAL.S16 Q4,D13,D5     @o[0][4-7]*  R1
    723     VMLAL.S16 Q4,D14,D6     @o[0][8-11]*  R1
    724     VMLAL.S16 Q4,D15,D7     @o[0][12-15]*  R1
    725     @write to memory
    726     @this should go to 17 19 21 23
    727     VST1.32 D16, [R2], R7
    728     VMULL.S16 Q5,D20,D4     @o[0][0-3]*  R2 -- dual issue
    729     VST1.32 D17, [R2], R7
    730     VMLAL.S16 Q5,D21,D5     @o[0][4-7]*  R2 -- dual issue
    731     VST1.32 D18, [R2], R7
    732     VMLAL.S16 Q5,D22,D6     @o[0][8-11]*  R2 -- dual issue
    733     VST1.32 D19, [R2], R7
    734     VMLAL.S16 Q5,D23,D7     @o[0][12-15]*  R2 -- dual issue
    735 
    736     VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[29][0-7]
    737     VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[29][8-15]
    738     VMULL.S16 Q8,D12,D4     @o[0][0-3]*  R1 -- dual issue
    739     VMLAL.S16 Q8,D13,D5     @o[0][4-7]*  R1  -- dual issue
    740     VMLAL.S16 Q8,D14,D6     @o[0][8-11]*  R1
    741     VMLAL.S16 Q8,D15,D7     @o[0][12-15]*  R1
    742     VMULL.S16 Q9,D20,D4     @o[0][0-3]*  R2
    743     VMLAL.S16 Q9,D21,D5     @o[0][4-7]*  R2
    744     VMLAL.S16 Q9,D22,D6     @o[0][8-11]*  R2
    745     VMLAL.S16 Q9,D23,D7     @o[0][12-15]*  R2
    746 
    747     VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[31][0-7]
    748     VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[31][8-15]
    749     VMULL.S16 Q12,D12,D4    @o[0][0-3]*  R1 -- dual issued
    750     VMLAL.S16 Q12,D13,D5    @o[0][4-7]*  R1 -- dual issued
    751     VMLAL.S16 Q12,D14,D6    @o[0][8-11]*  R1
    752     VMLAL.S16 Q12,D15,D7    @o[0][12-15]*  R1
    753     VMULL.S16 Q13,D20,D4    @o[0][0-3]*  R2
    754     VMLAL.S16 Q13,D21,D5    @o[0][4-7]*  R2
    755     VMLAL.S16 Q13,D22,D6    @o[0][8-11]*  R2
    756     VMLAL.S16 Q13,D23,D7    @o[0][12-15]*  R2
    757 
    758     @transpose the 4x4 matrix R1
    759     VTRN.32 Q0, Q4          @ R1
    760     VTRN.32 Q8, Q12         @ R1
    761     @transpose the 4x4 matrix R2
    762     VTRN.32 Q1, Q5          @ R2
    763     VSWP    D16, D1         @ R1
    764     VSWP    D24, D9         @ R1
    765 
    766     VTRN.32 Q9, Q13         @ R2
    767     VADD.S32 Q0, Q0, Q4     @ R1 -- dual issue
    768     VADD.S32 Q8, Q8, Q12    @ R1
    769     @ 1-cycle stall?
    770     VADD.S32 Q0, Q0, Q8     @ R1
    771     VSWP    D18, D3         @ R2
    772     VSWP    D26, D11        @ R2
    773     VADD.S32 Q1, Q1, Q5     @ R2
    774     VADD.S32 Q9, Q9, Q13    @ R2
    775     @ 1-cycle stall?
    776     VADD.S32 Q1, Q1, Q9     @ R2
    777     @ 2-cycle stall?
    778     VZIP.S32 Q0, Q1         @ 3-cycle instruction
    779 
    780     @ 1-cycle stall?
    781     @write to memory
    782     @this should go to 25 27 29 31
    783     VST1.32 D0, [R2], R7
    784     VST1.32 D1, [R2], R7
    785     VST1.32 D2, [R2], R7
    786     VST1.32 D3, [R2], R7
    787     @------------------Processing O ends-------------------------------
    788 
    789     SUB R2,R2,R7,LSL #4
    790     LSR R7,R7,#1
    791     SUB R2,R2,R7
    792 
    793     ADD R2,R2,#8                @MOVE TO NEXT to next COLUMN - pi4_tmp
    794 
    795     ADD R8,R8,#2                @increment loop cntr
    796     CMP R8,#32                  @check loop cntr
    797     BNE CORE_LOOP_32X32_HORIZ   @jump acc
    798 
    799 
    800 @*****************Vertical transform************************************
    801 
    802 @Initialization for vert transform
    803 @pi4_tmp will be the new src
    804 @tmp stride will be new src stride
    805 @dst will be new pi4_tmp
    806 @dst stride will be new tmp stride
    807 @trans table will be of 32 bit
    808 
    809     LDR R9,g_ai4_ihevc_trans_32_addr    @get 32 bit transform matrix
    810 ulbl3:
    811     ADD R9, R9, PC
    812 
    813     SUB R0,R2,#128                  @set tmp as src [-32 to move back to orgin]
    814     MOV R2,R3                       @set dst as tmp
    815     MOV R4,#TMP_STRIDE_32           @set tmp stride as src stride
    816     SUB R4,#112                     @Adjust stride for 7 previous loads
    817     LSR R7,R6,#15                   @Set dst stride as tmp stride
    818 
    819 
    820     @Block SAD
    821     VADD.S32 D28,D28,D29
    822     VPADD.S32 D28,D28,D29
    823     VMOV.S32 R3,D28[0]
    824 
    825     @Read [0 0] [8 0] [16 0] [24 0],[0 1] [8 1] [16 1] [24 1]
    826     @values of g_ai4_ihevc_trans_32 and write to stack
    827     MOV R12,#COFF_STD_W_32
    828     LSL R12,R12,#3
    829     VLD1.S32 D28,[R9],R12           @ D28: [0 0] [0 1]
    830     VLD1.S32 D29,[R9],R12           @ D29: [8 0] [8 1]
    831     VLD1.S32 D30,[R9],R12           @ D30: [16 0] [16 1]
    832     VLD1.S32 D31,[R9],R12           @ D31: [24 0] [24 1]
    833     SUB R9,R9,R12,LSL #2
    834 
    835     VREV64.32 Q15,Q15               @ Q15: [16 1] [16 0] [24 1] [24 0]
    836     VTRN.S32 Q14,Q15                @ Q14: [0 0] [16 1] [8 0] [24 1]
    837                                     @ Q15: [0 1] [16 0] [8 1] [24 0]
    838     VST1.S32 {Q14-Q15},[SP]
    839 
    840 @   VMOV.U32 Q14,#RADD              ;get the round factor to q14
    841 @   VMOV.U32 Q15,#SHIFT             ;Get the shift to neon
    842 
    843     MOV R8,#0                   @INIT LOOP
    844 
    845 CORE_LOOP_32X32_VERT:
    846 
    847     VLD1.S32 {D0,D1},[R0]!          @LOAD 1-4 src R1
    848     VLD1.S32 {D2,D3},[R0]!          @LOAD 5-8 src R1
    849     VLD1.S32 {D4,D5},[R0]!          @LOAD 9-12 src R1
    850     VLD1.S32 {D6,D7},[R0]!          @LOAD 13-16 src R1
    851     VLD1.S32 {D8,D9},[R0]!          @LOAD 17-20 src R1
    852     VREV64.S32 Q4,Q4            @Rev 17-20 R1
    853     VLD1.S32 {D10,D11},[R0]!            @LOAD 21-24 src R1
    854     VREV64.S32 Q5,Q5            @Rev 21-24 R1
    855     VLD1.S32 {D12,D13},[R0]!            @LOAD 25-28 src R1
    856     VREV64.S32 Q6,Q6            @Rev 25-28 R1
    857     VLD1.S32 {D14,D15},[R0],R4          @LOAD 29-32 src R1
    858     VREV64.S32 Q7,Q7            @Rev 29-32 R1
    859 
    860     VSWP D8,D9                  @ Q4: 20 19 18 17
    861     VADD.S32 Q11, Q3, Q4        @e[k] = resi_tmp_1 + resi_tmp_2  k -> 13-16  R1-- dual issue
    862     VSWP D10,D11                @ Q5: 24 23 22 21
    863     VADD.S32 Q10, Q2, Q5        @e[k] = resi_tmp_1 + resi_tmp_2  k -> 9-12  R1-- dual issue
    864     VSWP D12,D13                @ Q6: 28 27 26 25
    865     VADD.S32 Q9, Q1, Q6         @e[k] = resi_tmp_1 + resi_tmp_2  k -> 5-8  R1 -- dual issue
    866     VSWP D14,D15                @ Q7: 32 31 30 29
    867 
    868     VADD.S32 Q8, Q0, Q7         @e[k] = resi_tmp_1 + resi_tmp_2  k -> 1-4  R1 -- dual issue
    869     VREV64.S32 Q11, Q11         @rev e[k] k-> 13-16 R1 -- dual issue
    870     VSUB.S32 Q12, Q0, Q7        @o[k] = resi_tmp_1 - resi_tmp_2  k -> 1-4  R1
    871     VREV64.S32 Q10, Q10         @rev e[k] k-> 9-12 R1 -- dual issue
    872     VSUB.S32 Q13, Q1, Q6        @o[k] = resi_tmp_1 - resi_tmp_2  k -> 5-8  R1
    873     VSWP D22, D23               @Q11: e[16] e[15] e[14] e[13] -- dual issue
    874     VSUB.S32 Q14, Q2, Q5        @o[k] = resi_tmp_1 - resi_tmp_2  k -> 9-12  R1
    875     VSWP D20, D21               @Q10: e[12] e[11] e[10] e[9] -- dual issue
    876     VSUB.S32 Q15, Q3, Q4        @o[k] = resi_tmp_1 - resi_tmp_2  k -> 13-16  R1
    877 
    878     VADD.S32 Q1, Q9, Q10        @ee[k] = e[k] + e[15- k] row R1, k-> 4-7
    879     VADD.S32 Q0, Q8, Q11        @ee[k] = e[k] + e[15- k] row R1, k-> 0-3
    880 
    881     VSUB.S32 Q2, Q8, Q11        @eo[k] = e[k] - e[15 - k] row R1, k-> 0-3
    882     VSUB.S32 Q3, Q9, Q10        @eo[k] = e[k] - e[15 - k] row R1, k-> 4-7
    883     VREV64.S32 Q1, Q1           @Q1: ee[5] ee[4] ee[7] ee[6] -- dual issue
    884 
    885     VSWP D2, D3                 @Q1: ee[7] ee[6] ee[5]  ee[4]
    886 
    887     VADD.S32 Q4, Q0, Q1         @eee[k] = ee[k] + ee[7-k] row R1, k-> 0-3
    888     VSUB.S32 Q5, Q0, Q1         @eeo[k] = ee[k] - ee[7-k] row R1, k-> 0-3
    889 
    890     @D8: eee[0] eee[1]
    891     VLD1.S32 {Q10,Q11},[SP]     @Load g_ai4_ihevc_trans_32[xx]->  Q10 : [0 0] [16 1] [8 0] [24 1]  Q11 : [0 1] [16 0] [8 1] [24 0]
    892     VREV64.S32 D9, D9           @D9: eee[3] eee[2]
    893 
    894     @-----------------------Processing EEO ----------------------------
    895                                 @Q5 :R1eeo[0] R1eeo[1] R1eeo[2] R1eeo[3]
    896     MOV R12,#COFF_STD_W_32
    897     ADD R11,R9,R12,LSL #2       @Get to the 4th row of src
    898     LSL R12,R12,#3
    899 
    900     VADD.S32 D12, D8, D9        @eeee[0] eeee[1] -- dual issue in 1st cycle
    901     VLD1.S32  {D14,D15},[R11],R12       @LOAD g_ai4_ihevc_trans_32[4][0-4] -> 4G0 4G1 4G2 4G3
    902     VSUB.S32 D13, D8, D9        @eeeo[0] eeeo[1] -- dual issue in 2nd cycle
    903 
    904     VMUL.S32  Q0,Q5,Q7          @4G0 4G1 4G2 4G3 * R1eeo[0] R1eeo[1] R1eeo[2] R1eeo[3]
    905 
    906     VLD1.S32  {D14,D15},[R11],R12       @LOAD g_ai4_ihevc_trans_32[12][0-4] -- 1st cycle dual issue
    907     VREV64.S32 Q8,Q6            @Q6 : eeee[0] eeee[1] eeeo[0] eeeo[1] R1   ->   ;Q8 : eeee[1] eeee[0] eeeo[1] eeeo[0] R1
    908 
    909     VMUL.S32 Q4,Q6,Q10          @g_ai4_ihevc_trans_32 * eeee[0] eeee[1] eeeo[0] eeeo[1] R1 -- dual issue
    910     VMLA.S32 Q4,Q8,Q11          @g_ai4_ihevc_trans_32 * eeee[1] eeee[0] eeeo[1] eeeo[0] R1
    911 
    912     VMUL.S32  Q9,Q5,Q7          @g_ai4_ihevc_trans_32[6][0-4] * eeo[0-4]
    913 
    914     VLD1.S32  {D14,D15},[R11],R12       @LOAD g_ai4_ihevc_trans_32[20][0-4] - 1st cycle dual issue
    915     VRSHRN.S32 D8,Q4,#SHIFT_32  @ROUND NARROW R1 -- dual issued in 2nd cycle
    916                                 @ D8: 0 16 8 24
    917     @WRITE INTO MEM the values or wait to be shuffled
    918     @These values must go to 0 8 16 24 colums
    919     LSL R10,R7,#3
    920     VST1.S16 D8[0],[R2],R10
    921     VMUL.S32  Q10,Q5,Q7         @g_ai4_ihevc_trans_32[10][0-4] * eeo[0-4] -- dual issued
    922 
    923     VLD1.S32  {D14,D15},[R11],R12       @LOAD g_ai4_ihevc_trans_32[28][0-4]
    924 
    925     VST1.S16 D8[2],[R2],R10
    926     VMUL.S32  Q11,Q5,Q7         @g_ai4_ihevc_trans_32[14][0-4] * eeo[0-4] -- dual issue
    927     @transpose the 4x4 matrix R1
    928     VTRN.32 Q0, Q9
    929     @-----------------------Processing EO ----------------------------
    930     MOV R12,#COFF_STD_W_32
    931     ADD R11,R9,R12,LSL #1       @Get 1ST row
    932     LSL R12,R12,#2
    933 
    934     VLD1.S32 {Q6,Q7},[R11],R12  @g_ai4_ihevc_trans_16[2][0-7]
    935 
    936     VMUL.S32 Q8,Q6,Q2           @g_ai4_ihevc_trans_16[2][0-3]*eo[0][0-3] R1
    937     VTRN.32 Q10, Q11            @ dual issue
    938     VMLA.S32 Q8,Q7,Q3           @g_ai4_ihevc_trans_16[2][4-7]*eo[0][4-7] R1
    939 
    940 
    941     VSWP    D20, D1
    942     VSWP    D22, D19
    943 
    944     VST1.S16 D8[1],[R2],R10
    945     VADD.S32 Q0, Q0, Q9         @ dual issue
    946     VST1.S16 D8[3],[R2],R10
    947     VADD.S32 Q10, Q10, Q11      @ dual issue
    948     SUB R2,R2,R10, LSL #2
    949     @-----------------------Processing EEEO complete-------------------
    950 
    951     VLD1.S32 {Q4,Q5},[R11],R12  @g_ai4_ihevc_trans_16[6][0-7]
    952     VADD.S32 Q0, Q0, Q10        @ dual issue
    953 
    954     VMUL.S32 Q7,Q4,Q2           @eo[0][0-3]
    955     VMLA.S32 Q7,Q5,Q3           @eo[0][4-7]
    956     VRSHRN.S32 D0,Q0,#SHIFT_32  @ Shift by SHIFT and Round the result
    957 
    958     VLD1.S32 {Q9,Q10},[R11],R12 @g_ai4_ihevc_trans_16[10][0-7]
    959     VADD.S32 D12,D16,D17        @g_ai4_ihevc_trans_16[2][k]*eo[0][k]+g_ai4_ihevc_trans_16[2][7-k]*eo[0][7-k] R1 -- dual issue
    960 
    961 
    962     VMUL.S32 Q8,Q9,Q2           @eo[0][0-3]
    963     VMLA.S32 Q8,Q10,Q3          @eo[0][4-7]
    964 
    965     @this should go to 4  12  20  28
    966     LSL R10,R7,#3
    967     ADD R2,R2,R7,LSL #2         @move to fifth row
    968     VST1.S16 D0[0], [R2], R10
    969     VADD.S32 D13,D14,D15        @ -- dual issue--
    970     VST1.S16 D0[1], [R2], R10
    971     VADD.S32 D10,D16,D17        @ -- dual issue --
    972 
    973     VLD1.S32 {Q7,Q8},[R11],R12  @g_ai4_ihevc_trans_16[14][0-7]
    974 
    975     VST1.S16 D0[2], [R2], R10
    976     VMUL.S32 Q9,Q7,Q2           @eo[0][0-3] -- dual issue
    977     VST1.S16 D0[3], [R2], R10
    978     VMLA.S32 Q9,Q8,Q3           @eo[0][4-7] -- dual issue
    979     SUB R2,R2,R10,LSL #2        @go back to orgin
    980     SUB R2,R2,R7,LSL #2
    981     @----------------------Processing EEO  complete-------------------
    982 
    983     VLD1.S32 {Q0,Q1},[R11],R12  @g_ai4_ihevc_trans_16[18][0-7]
    984 
    985     VMUL.S32 Q4,Q0,Q2           @g_ai4_ihevc_trans_16[18][0-3]*eo[0][0-3] R1
    986     VMLA.S32 Q4,Q1,Q3           @g_ai4_ihevc_trans_16[18][4-7]*eo[0][4-7] R1
    987 
    988     VLD1.S32 {Q0,Q1},[R11],R12  @g_ai4_ihevc_trans_16[22][0-7]
    989     VADD.S32 D11,D18,D19        @ dual issue
    990 
    991     @Q5 Q6
    992     VMUL.S32 Q7,Q0,Q2           @eo[0][0-3]
    993     VMLA.S32 Q7,Q1,Q3           @eo[0][4-7]
    994 
    995     VPADD.S32 D16,D12,D13
    996     VPADD.S32 D17,D10,D11
    997 
    998     VADD.S32 D12,D8,D9          @g_ai4_ihevc_trans_16[18][k]*eo[0][k]+g_ai4_ihevc_trans_16[18][7-k]*eo[0][7-k] R1
    999     VADD.S32 D13,D14,D15
   1000 
   1001     VRSHRN.S32 D14,Q8,#SHIFT_32
   1002     VLD1.S32 {Q0,Q1},[R11],R12  @g_ai4_ihevc_trans_16[26][0-7]
   1003     VLD1.S32 {Q10,Q11},[R11],R12    @g_ai4_ihevc_trans_16[30][0-7]
   1004     @write to memory this should go to 2 6 10 14
   1005     ADD R2,R2,R7,LSL #1
   1006     LSL R7,R7,#2
   1007     VST1.S16 D14[0],[R2],R7
   1008     VMUL.S32 Q8,Q0,Q2           @eo[0][0-3] -- dual issue
   1009     VST1.S16 D14[1],[R2],R7
   1010     VMLA.S32 Q8,Q1,Q3           @eo[0][4-7] -- dual issue
   1011     VST1.S16 D14[2],[R2],R7
   1012     VMUL.S32 Q9,Q10,Q2          @eo[0][0-3] -- dual issue
   1013     VST1.S16 D14[3],[R2],R7
   1014     VMLA.S32 Q9,Q11,Q3          @eo[0][4-7] -- dual issue
   1015 
   1016     VADD.S32 D10,D16,D17
   1017     @---------------Processing O Row 1-----------------------------------------------
   1018     MOV R12,#COFF_STD_W_32
   1019     ADD R11,R9,R12              @Get 1ST row
   1020     LSL R12,R12,#1
   1021     SUB R12, R12, #32
   1022     VLD1.S32 {Q0,Q1},[R11]!
   1023 
   1024     VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[1][0-15]
   1025     VADD.S32 D11,D18,D19        @ dual issue in 2nd cycle
   1026 
   1027     VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[1][0-3]*o[0][0-3] R1
   1028     VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[1][4-7]*o[0][4-7] R1
   1029     VLD1.S32 {Q0,Q1},[R11]!
   1030     VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[1][8-11]*o[0][8-11] R1
   1031     VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[1][12-15]*o[0][12-15] R1
   1032 
   1033     @Q5 Q6
   1034     VPADD.S32 D16,D12,D13
   1035     VPADD.S32 D17,D10,D11
   1036 
   1037 
   1038     VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[3][0-15]
   1039     VRSHRN.S32 D16,Q8,#SHIFT_32 @ dual issue
   1040 
   1041     VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[3][0-3]*o[0][0-3] R1
   1042     VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[3][4-7]*o[0][4-7] R1
   1043     VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[3][8-11]*o[0][8-11] R1
   1044     VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[3][12-15]*o[0][12-15] R1
   1045 
   1046     @write to memory this should go to 2 6 10 14
   1047     VST1.S16 D16[0],[R2],R7
   1048     VADD.S32 D10,D8,D9          @g_ai4_ihevc_trans_32[1][0-3]*o[0][0-3]+g_ai4_ihevc_trans_32[1][4-7]*o[0][4-7]+g_ai4_ihevc_trans_32[1][8-11]*o[0][8-11]+g_ai4_ihevc_trans_32[1][12-15]*o[0][12-15]
   1049     VLD1.S32 {Q0,Q1},[R11]!
   1050     VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[5][0-15]
   1051     VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[5][0-3]*o[0][0-3] R1 -- dual issue
   1052     VST1.S16 D16[1],[R2],R7
   1053     VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[5][4-7]*o[0][4-7] R1 -- dual issue
   1054     VST1.S16 D16[2],[R2],R7
   1055     VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[5][8-11]*o[0][8-11] R1 -- dual issue
   1056     VST1.S16 D16[3],[R2],R7
   1057     VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[5][12-15]*o[0][12-15] R1
   1058     SUB R2,R2,R7, LSL #3
   1059     LSR R7,R7,#2
   1060     SUB R2,R2,R7, LSL #1
   1061 
   1062     @--------------------Done Processing EO--------------------------
   1063 
   1064     VLD1.S32 {Q0,Q1},[R11]!
   1065     VADD.S32 D11,D14,D15        @ dual issued
   1066     VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[7][0-15]
   1067     VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[7][0-3]*o[0][0-3] R1
   1068     VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[7][4-7]*o[0][4-7] R1
   1069     VLD1.S32 {Q0,Q1},[R11]!
   1070     VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[7][8-11]*o[0][8-11] R1
   1071     VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[7][12-15]*o[0][12-15] R1
   1072 
   1073 
   1074     VADD.S32 D12,D8,D9          @ dual issued
   1075     VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[9][0-15]
   1076     @Q5 Q6
   1077     VPADD.S32 D16,D10,D11
   1078     VADD.S32 D13,D14,D15
   1079 
   1080     VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[9][0-3]*o[0][0-3] R1
   1081     VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[9][4-7]*o[0][4-7] R1
   1082     VLD1.S32 {Q0,Q1},[R11]!
   1083     VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[9][8-11]*o[0][8-11] R1
   1084     VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[9][12-15]*o[0][12-15] R1
   1085     VPADD.S32 D17,D12,D13
   1086 
   1087 
   1088     VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[11][0-15]
   1089     VRSHRN.S32 D16,Q8,#SHIFT_32 @ duall issue
   1090 
   1091     VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[11][0-3]*o[0][0-3] R1
   1092     VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[11][4-7]*o[0][4-7] R1
   1093     VLD1.S32 {Q0,Q1},[R11]!
   1094     VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[11][8-11]*o[0][8-11] R1
   1095     VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[11][12-15]*o[0][12-15] R1
   1096     VADD.S32 D10,D8,D9          @g_ai4_ihevc_trans_32[9][0-3]*o[0][0-3]+g_ai4_ihevc_trans_32[9][4-7]*o[0][4-7]+g_ai4_ihevc_trans_32[9][8-11]*o[0][8-11]+g_ai4_ihevc_trans_32[9][12-15]*o[0][12-15]
   1097     VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[13][0-15]
   1098     @write to memory this should go to 1 3 5 7
   1099     ADD R2,R2,R7
   1100     LSL R7,R7,#1
   1101     VST1.S16 D16[0],[R2],R7
   1102     VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[13][0-3]*o[0][0-3] R1
   1103     VST1.S16 D16[1],[R2],R7
   1104     VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[13][4-7]*o[0][4-7] R1
   1105     VST1.S16 D16[2],[R2],R7
   1106     VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[13][8-11]*o[0][8-11] R1
   1107     VST1.S16 D16[3],[R2],R7
   1108     VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[13][12-15]*o[0][12-15] R1
   1109 
   1110     VLD1.S32 {Q0,Q1},[R11]!
   1111     VADD.S32 D11,D14,D15        @ dual issue
   1112     VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[15][0-15]
   1113     VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[15][0-3]*o[0][0-3] R1 -- dual issue--
   1114     VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[15][4-7]*o[0][4-7] R1
   1115     VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[15][8-11]*o[0][8-11] R1
   1116     VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[15][12-15]*o[0][12-15] R1
   1117 
   1118     VLD1.S32 {Q0,Q1},[R11]!
   1119     VADD.S32 D12,D8,D9          @ dual issued
   1120 
   1121     VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[17][0-15]
   1122     @Q5 Q6
   1123     VPADD.S32 D16,D10,D11
   1124     VADD.S32 D13,D14,D15
   1125 
   1126     VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[17][0-3]*o[0][0-3] R1
   1127     VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[17][4-7]*o[0][4-7] R1
   1128     VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[17][8-11]*o[0][8-11] R1
   1129     VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[17][12-15]*o[0][12-15] R1
   1130     VPADD.S32 D17,D12,D13
   1131 
   1132     VLD1.S32 {Q0,Q1},[R11]!
   1133     VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[19][0-15]
   1134     VRSHRN.S32 D16,Q8,#SHIFT_32 @ dual issue
   1135 
   1136     VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[19][0-3]*o[0][0-3] R1
   1137     VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[19][4-7]*o[0][4-7] R1
   1138     VLD1.S32 {Q0,Q1},[R11]!
   1139     VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[19][8-11]*o[0][8-11] R1
   1140     VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[19][12-15]*o[0][12-15] R1
   1141     VADD.S32 D10,D8,D9          @g_ai4_ihevc_trans_32[17][0-3]*o[0][0-3]+g_ai4_ihevc_trans_32[17][4-7]*o[0][4-7]+g_ai4_ihevc_trans_32[17][8-11]*o[0][8-11]+g_ai4_ihevc_trans_32[17][12-15]*o[0][12-15]
   1142     VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[21][0-15]
   1143     @write to memory this should go to 9 11 13 15
   1144     VST1.S16 D16[0],[R2],R7
   1145     VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[21][0-3]*o[0][0-3] R1
   1146     VST1.S16 D16[1],[R2],R7
   1147     VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[21][4-7]*o[0][4-7] R1
   1148     VST1.S16 D16[2],[R2],R7
   1149     VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[21][8-11]*o[0][8-11] R1
   1150     VST1.S16 D16[3],[R2],R7
   1151     VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[21][12-15]*o[0][12-15] R1
   1152 
   1153 
   1154     VLD1.S32 {Q0,Q1},[R11]!
   1155     VADD.S32 D11,D14,D15        @ dual issue
   1156     VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[23][0-15]
   1157     VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[23][0-3]*o[0][0-3] R1
   1158     VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[23][4-7]*o[0][4-7] R1
   1159     VLD1.S32 {Q0,Q1},[R11]!
   1160     VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[23][8-11]*o[0][8-11] R1
   1161     VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[23][12-15]*o[0][12-15] R1
   1162     VADD.S32 D12,D8,D9          @ dual issued
   1163     VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[25][0-15]
   1164 
   1165     @Q5 Q6
   1166     VPADD.S32 D16,D10,D11
   1167     VADD.S32 D13,D14,D15
   1168 
   1169     VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[25][0-3]*o[0][0-3] R1
   1170     VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[25][4-7]*o[0][4-7] R1
   1171     VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[25][8-11]*o[0][8-11] R1
   1172     VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[25][12-15]*o[0][12-15] R1
   1173     VPADD.S32 D17,D12,D13
   1174 
   1175     VLD1.S32 {Q0,Q1},[R11]!
   1176     VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[27][0-15]
   1177     VRSHRN.S32 D16,Q8,#SHIFT_32
   1178 
   1179     VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[27][0-3]*o[0][0-3] R1
   1180     VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[27][4-7]*o[0][4-7] R1
   1181     VLD1.S32 {Q0,Q1},[R11]!
   1182     VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[27][8-11]*o[0][8-11] R1
   1183     VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[27][12-15]*o[0][12-15] R1
   1184     VADD.S32 D10,D8,D9          @g_ai4_ihevc_trans_32[25][0-3]*o[0][0-3]+g_ai4_ihevc_trans_32[25][4-7]*o[0][4-7]+g_ai4_ihevc_trans_32[25][8-11]*o[0][8-11]+g_ai4_ihevc_trans_32[25][12-15]*o[0][12-15]
   1185     VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[29][0-15]
   1186     @write to memory this should go to 17 19 21 23
   1187     VST1.S16 D16[0],[R2],R7
   1188     VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[29][0-3]*o[0][0-3] R1
   1189     VST1.S16 D16[1],[R2],R7
   1190     VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[29][4-7]*o[0][4-7] R1
   1191     VST1.S16 D16[2],[R2],R7
   1192     VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[29][8-11]*o[0][8-11] R1
   1193     VST1.S16 D16[3],[R2],R7
   1194     VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[29][12-15]*o[0][12-15] R1
   1195 
   1196     VADD.S32 D11,D14,D15        @ dual issue
   1197     VLD1.S32 {Q0,Q1},[R11]!
   1198 
   1199     VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[31][0-15]
   1200     VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[31][0-3]*o[0][0-3] R1
   1201     VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[31][4-7]*o[0][4-7] R1
   1202     VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[31][8-11]*o[0][8-11] R1
   1203     VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[31][12-15]*o[0][12-15] R1
   1204 
   1205 
   1206     VADD.S32 D12,D8,D9
   1207     @Q5 Q6
   1208     VPADD.S32 D16,D10,D11
   1209 
   1210     VADD.S32 D13,D14,D15
   1211 
   1212 
   1213     VPADD.S32 D17,D12,D13
   1214 
   1215     VRSHRN.S32 D16,Q8,#SHIFT_32
   1216 
   1217     @write to memory this should go to 25 27 29 31
   1218     VST1.S16 D16[0],[R2],R7
   1219     VST1.S16 D16[1],[R2],R7
   1220     VST1.S16 D16[2],[R2],R7
   1221     VST1.S16 D16[3],[R2],R7
   1222 
   1223     SUB R2,R2,R7,LSL #4
   1224     LSR R7,R7,#1
   1225     SUB R2,R2,R7
   1226 
   1227     ADD R2,R2,#2                @MOVE TO NEXT to next COLUMN
   1228 
   1229     ADD R8,R8,#1                @increment loop cntr by 2 since we process loop as 2 cols
   1230     CMP R8,#32                  @check loop cntr
   1231     BNE CORE_LOOP_32X32_VERT    @jump acc
   1232 
   1233     MOV R0,R3
   1234 
   1235     ADD SP,SP,#32
   1236     vpop {d8 - d15}
   1237     LDMFD       sp!,{r4-r12,PC}     @stack store values of the arguments
   1238 
   1239 
   1240     .section    .note.GNU-stack,"",%progbits
   1241