@/******************************************************************************
@ *
@ * Copyright (C) 2018 The Android Open Source Project
@ *
@ * Licensed under the Apache License, Version 2.0 (the "License");
@ * you may not use this file except in compliance with the License.
@ * You may obtain a copy of the License at:
@ *
@ * http://www.apache.org/licenses/LICENSE-2.0
@ *
@ * Unless required by applicable law or agreed to in writing, software
@ * distributed under the License is distributed on an "AS IS" BASIS,
@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ * See the License for the specific language governing permissions and
@ * limitations under the License.
@ *
@ *****************************************************************************
@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
@*/
@/**
@ *******************************************************************************
@ * @file
@ *  ihevc_resi_trans_32x32.s
@ *
@ * @brief
@ *  Contains function definitions for forward transform 32x32
@ *
@ * @author
@ * Mohit
@ *
@ * @par List of Functions:
@ *  - ihevc_resi_trans_32x32()
@ *
@ * @remarks
@ *  None
@ *
@ *******************************************************************************
@*/
@*/
.text
.p2align 2

.extern g_ai2_ihevc_trans_32
.extern g_ai4_ihevc_trans_32

g_ai2_ihevc_trans_32_addr_1:
.long g_ai2_ihevc_trans_32 - ulbl1 - 8

g_ai2_ihevc_trans_32_addr_2:
.long g_ai2_ihevc_trans_32 - ulbl2 - 8

g_ai4_ihevc_trans_32_addr:
.long g_ai4_ihevc_trans_32 - ulbl3 - 8

@*/
@*/
@/**
@*/ *******************************************************************************
@*/
@*/@brief
@*/  This function performs residue calculation and forward  transform on
@*/ input pixels
@*/
@*/@par Description:
@*/ Performs residue calculation by subtracting source and  prediction and
@*/ followed by forward transform
@*/
@*/ @param[in] pu1_src
@*/  Input 32x32 pixels
@*/
@*/ @param[in] pu1_pred
@*/  Prediction data
@*/
@*/ @param[in] pi2_tmp
@*/  Temporary buffer of size 16x16
@*/
@*/ @param[out] pi2_dst
@*/  Output 32x32 coefficients
@*/
@*/ @param[in] src_strd
@*/  Input stride
@*/
@*/ @param[in] pred_strd
@*/  Prediction Stride
@*/
@*/ @param[in] dst_strd_chr_flag
@*/  Output Stride and Chroma Flag packed in the MS and LS 16-bit
@*/
@*/ @returns  Void
@*/
@*/ @remarks
@*/  None
@*/
@*/*******************************************************************************
@*/
  .global ihevc_resi_trans_32x32_a9q
ihevc_resi_trans_32x32_a9q:

.equ TMP_STRIDE_32      ,  128              @16*4, Stride of tmp register
.equ SHIFT_32           ,  15               @shift = 15; // log2(iWidth) - 1 + g_uiBitIncrement

.equ COFF_STD_2B_32     ,  64               @Stride for g_ai2_ihevc_trans_32 in bytes
.equ COFF_STD_W_32      ,  64               @Stride for g_ai4_ihevc_trans_32 in bytes

@LOAD the function
    STMFD       SP!,{r4-r12,LR}     @stack store values of the arguments
    vpush       {d8 - d15}
    SUB         SP,SP,#32

    LDR         R4,[SP,#136]            @get src_strd
    LDR         R5,[SP,#140]            @get pred_strd
    LDR         R6,[SP,#144]            @get dst_strd_chr_flag

    MOV R8,#0                       @Set loop counter
    LDR R9,g_ai2_ihevc_trans_32_addr_1    @get 16 bit transform matrix
ulbl1:
    ADD R9, R9, PC

    @Read [0 0] [8 0] [16 0] [24 0],[0 1] [8 1] [16 1] [24 1] values of g_ai2_ihevc_trans_32
    @and write to stack
    MOV R12,#COFF_STD_2B_32
    LSL R12,#3

    VLD1.S32 D30[0],[R9],R12
    VLD1.S32 D30[1],[R9],R12        @ D30 - [0 0] [0 1] [8 0] [8 1]
    VLD1.S32 D31[0],[R9],R12
    VLD1.S32 D31[1],[R9],R12        @ D31 - [16 0] [16 1] [24 0] [24 1]

    VTRN.S32 D30,D31                @ D30 - [0 0] [0 1] [16 0] [16 1]
    VTRN.S16 D30,D31                @ D31 - [8 0] [8 1] [24 0] [24 1]
    VST1.S16 {D30,D31},[SP]

    LDR R9,g_ai2_ihevc_trans_32_addr_2    @get 16 bit transform matrix
ulbl2:
    ADD R9, R9, PC

    MOV R7,#TMP_STRIDE_32
@   AND R14,R6,#0x1

    VMOV.S32 Q14,#0

@R0     pu1_src
@R1     pu1_pred
@R2     pi4_tmp
@R3     pi2_dst
@R4     src_strd - 16
@R5     pred_strd - 16
@R6     dst_strd_chr_flag
@R7     tmp_dst Nx4 block stride
@R8     loop cntr
@R9     g_ai2_ihevc_trans_32
@R10    tmp_dst Nx4 block offset
@R11    tmp register
@R12    ------
@R14    ------.
@q14    shift 32 bit
@q15    add 32 bit

    SUB R4, R4, #16
    SUB R5, R5, #16
CORE_LOOP_32X32_HORIZ:

    VLD1.U8 {D0,D1},[R0]!           @LOAD 1-16 src row 1

    VLD1.U8 {D4,D5},[R1]!           @LOAD 1-16 pred row 1

    VLD1.U8 {D2,D3},[R0],R4         @LOAD 17-32 src row 1
    @ Residue calculation
    VSUBL.U8 Q8,D0,D4           @ Get residue 1-8 row 1 -- dual issued with prev. instr. 2nd cycle

    VLD1.U8 {D6,D7},[R1],R5         @LOAD 17-32 pred row 1
    VSUBL.U8 Q9,D1,D5           @ Get residue 9-16 row 1 -- dual issue

    VLD1.U8 {D8,D9},[R0]!           @ LOAD 1-16 src row 2
    VSUBL.U8 Q10,D2,D6          @ Get residue 17-24 row 1 -- dual issue

    VLD1.U8 {D12,D13},[R1]!         @ LOAD 1-16 pred row 2
    VSUBL.U8 Q11,D3,D7          @ Get residue 25-32 row 1 -- dual issue

    VLD1.U8 {D10,D11},[R0],R4           @ LOAD 17-32 src row 2
    @ Residue - Row 2
    VSUBL.U8 Q12,D8,D12         @ Get residue 1-8 row 2 -- dual issue

    VLD1.U8 {D14,D15},[R1],R5           @ LOAD 17-32 pred row 2
    VSUBL.U8 Q13,D9,D13         @ Get residue 9-16 row 2 -- dual issue
    @ Get blk sads
    VABDL.U8 Q15,D0,D4
    VABAL.U8 Q15,D1,D5
    VABAL.U8 Q15,D2,D6
    VABAL.U8 Q15,D3,D7
    VABAL.U8 Q15,D8,D12
    VABAL.U8 Q15,D9,D13
    VABAL.U8 Q15,D10,D14
    VABAL.U8 Q15,D11,D15
    VADDW.S16 Q14,Q14,D30
    VADDW.S16 Q14,Q14,D31
    @ SAD Ends

    VREV64.S16 Q10,Q10          @ Rev 17-24 row 1 -- dual issue
    VSUBL.U8 Q2,D10,D14         @ Get residue 17-24 row 2
    VREV64.S16 Q11,Q11          @ Rev 25-32 row 1 -- dual issue
    VSUBL.U8 Q3,D11,D15         @ Get residue 25-32 row 2

    VSWP D20,D21                @ Q10: 24 23 22 21 20 19 18 17 row 1
    VSWP D22,D23                @ Q11: 32 31 30 29 28 27 26 25 row 1

    VREV64.S16 Q2,Q2            @ Rev 17-24 row 2
    VADD.S16 Q5, Q9,Q10         @ e[k] = resi_tmp_1 + resi_tmp_2  k ->9-16 row 1 -- dual issue
    VREV64.S16 Q3,Q3            @ Rev 25-32 row 2
    VADD.S16 Q4, Q8,Q11         @ e[k] = resi_tmp_1 + resi_tmp_2  k -> 1-8 row 1 -- dual issue
    VSWP D4,D5                  @ Q2: 24 23 22 21 20 19 18 17 row 2
    VSUB.S16 Q6, Q8,Q11         @ o[k] = resi_tmp_1 - resi_tmp_2  k -> 1-8 row 1 -- dual issue
    VSWP D6,D7                  @ Q3: 32 31 30 29 28 27 26 25 row 2
    VSUB.S16 Q7, Q9,Q10         @ o[k] = resi_tmp_1 - resi_tmp_2  k ->9-16 row 1 -- dual issue

    VREV64.16 Q5, Q5            @ Rev 9-16 of e[k], row 1
    VADD.S16 Q9, Q13,Q2         @ e[k] = resi_tmp_1 + resi_tmp_2  k ->9-16 row 2 -- dual issue
    VADD.S16 Q8, Q12,Q3         @ e[k] = resi_tmp_1 + resi_tmp_2  k -> 1-8 row 2
    VSWP D10, D11               @ Q5: e[16] e[15] e[14] e[13] e[12] e[11] e[10] e[9]
    VSUB.S16 Q10, Q12,Q3        @ o[k] = resi_tmp_1 - resi_tmp_2  k -> 1-8 row 2 -- dual issue
    VREV64.16 Q9, Q9            @ Rev 9-16 of e[k], row 2
    VSUB.S16 Q11, Q13,Q2        @ o[k] = resi_tmp_1 - resi_tmp_2  k ->9-16 row 2 -- dual issue

    VADD.S16 Q0, Q4, Q5         @ ee[k] = e[k] + e[16-k] k->1-8 row 1
    VSWP D18, D19               @ Q9: e[16] e[15] e[14] e[13] e[12] e[11] e[10] e[9]
    VSUB.S16 Q1, Q4, Q5         @ eo[k] = e[k] - e[16-k] k->1-8 row 1 -- dual issue

    VREV64.S16  D8,D1           @ rev ee[k] k-> 4-7 row 1
    VADD.S16 Q2, Q8, Q9         @ ee[k] = e[k] + e[16-k] k->1-8 row 2 -- dual issue
    VSUB.S16 Q3, Q8, Q9         @ eo[k] = e[k] - e[16-k] k->1-8 row 2
    VMOV.S16    D1,D4
    VREV64.S16  D9,D5           @ rev ee[k] k-> 4-7 row 2

    @ arrangement OF DATA
    @ Q0    A1 A2 A3 A4 B1 B2 B3 B4
    @ Q4    A8 A7 A6 A5 B8 B7 B6 B5
    @---------------Process EEO starts--------------------
    MOV R12,#COFF_STD_2B_32     @Get stride of coeffs

    ADD R11,R9,R12,LSL #2       @Load address of g_ai2_ihevc_trans_32[4]
    LSL R12,R12,#3

    VADD.S16 Q13, Q0, Q4        @ eee[k] = ee[k] + ee[7 - k] row 1 & 2
    VLD1.S16 D24,[R11],R12      @ LOAD g_ai2_ihevc_trans_32[4][0-4]
    VSUB.S16 Q0, Q0 ,Q4         @ eeo[k] = ee[k] - ee[7 - k] row 1 & 2  -- dual issue

    @ D26 R1eee[0] R1eee[1] R1eee[2] R1eee[3]
    @ D27 R2eee[0] R2eee[1] R2eee[2] R2eee[3]
    VTRN.S32 D26,D27
    @ D26 R1eee[0] R1eee[1] R2eee[0] R2eee[1]
    @ D27 R1eee[2] R1eee[3] R2eee[2] R2eee[3]
    VREV32.16 D4,D27
    @ D26 R1eee[0] R1eee[1] R2eee[0] R2eee[1]
    @ D4 R1eee[3] R1eee[2] R2eee[3] R2eee[2]
    VMOV.S16 D27,D26
    VNEG.S16 D5,D4

    @ Q13 R1eee[0] R1eee[1] R2eee[0] R2eee[1]  R1eee[0]  R1eee[1]  R2eee[0]  R2eee[1]
    @ Q2  R1eee[3] R1eee[2] R2eee[3] R2eee[2] -R1eee[3] -R1eee[2] -R2eee[3] -R2eee[2]
    @ 1- cycle stall?
    VADD.S16 Q2,Q13,Q2
    @ Q2 R1eeee[0] R1eeee[1] R2eeee[0] R2eeee[1] R1eeeo[0] R1eeeo[1] R2eeeo[0] R2eeeo[1]

    @ Q2  R1eeee[0] R1eeee[1] R2eeee[0] R2eeee[1]
    @    R1eeeo[0] R1eeeo[1] R2eeeo[0] R2eeeo[1]
    VMULL.S16 Q15,D24,D0            @g_ai2_ihevc_trans_32[4][0-4] * eeo[0-4]    R1 -- dual issue
    VTRN.S16 D4,D5
    @ Q2  R1eeee[0] R1eeeo[0] R2eeee[0] R2eeeo[0]
    @    R1eeee[1] R1eeeo[1] R2eeee[1] R2eeeo[1]
    @ 1-cycle stall?
    VDUP.S32 D8,D4[0]               @ R1eeee[0] R1eeeo[0] R1eeee[0] R1eeeo[0]
    VDUP.S32 D9,D4[1]               @ R2eeee[0] R2eeeo[0] R2eeee[0] R2eeeo[0]
    VDUP.S32 D10,D5[0]              @ R1eeee[1] R1eeeo[1] R1eeee[1] R1eeeo[1]
    VDUP.S32 D11,D5[1]              @ R2eeee[1] R2eeeo[1] R2eeee[1] R2eeeo[1]

    @D4 : [0 0] [8 0] [16 0] [24 0]
    @D5 : [0 1] [8 1] [16 1] [24 1]
    VLD1.S16 {D4,D5},[SP]               @   [0 0] [8 0] [16 0] [24 0] [0 1] [8 1] [16 1] [24 1]
    VMULL.S16 Q8,D8,D4              @   g_ai2_ihevc_trans_32 * R1eeee[0] R1eeeo[0] R1eeee[0] R1eeeo[0] -- dual issue 2nd cycle
    VMLAL.S16 Q8,D10,D5             @ + g_ai2_ihevc_trans_32 * R1eeee[1] R1eeeo[1] R1eeee[1] R1eeeo[1]
    VLD1.S16 D27,[R11],R12          @LOAD g_ai2_ihevc_trans_32[12][0-4] -- 1st cycle dual issue with prev. MLAL
    VMULL.S16 Q9,D9,D4              @   g_ai2_ihevc_trans_32 * R2eeee[0] R2eeeo[0] R2eeee[0] R2eeeo[0] -- dual issue 2nd cycle
    VMLAL.S16 Q9,D11,D5             @ + g_ai2_ihevc_trans_32 * R2eeee[1] R2eeeo[1] R2eeee[1] R2eeeo[1]

    VMULL.S16 Q4,D24,D1             @g_ai2_ihevc_trans_32[4][0-4] * eeo[0-4]    R2

    VMULL.S16 Q5,D27,D0             @g_ai2_ihevc_trans_32[12][0-4] * eeo[0-4]   R1
    VZIP.S32 Q8,Q9                  @ 3-cycle instruction -- 1st cycle dual issued
    @These values must go to 0 8 16 24 rows hence we need stride *8
    LSL R10,R7,#3
    VMULL.S16 Q12,D27,D1            @g_ai2_ihevc_trans_32[12][0-4] * eeo[0-4]   R2
    VST1.32 D16,[R2],R10            @ -- dual issued

    VST1.32 D17,[R2],R10

    VLD1.S16 D26,[R11],R12          @LOAD g_ai2_ihevc_trans_32[20][0-4]

    VMULL.S16 Q8,D26,D1             @g_ai2_ihevc_trans_32[20][0-4] * eeo[0-4] R2
    VST1.32 D18,[R2],R10            @ -- dual issued

    VST1.32 D19,[R2],R10

    SUB R2,R2,R10,LSL #2
    @----------------------------Process EEEO ends----------------------------------------

    VLD1.S16 D27,[R11],R12          @LOAD g_ai2_ihevc_trans_32[28][0-4]
    VMULL.S16 Q9,D26,D0             @g_ai2_ihevc_trans_32[20][0-4] * eeo[0-4] R1

    VMULL.S16 Q2,D27,D1             @g_ai2_ihevc_trans_32[28][0-4] * eeo[0-4] R2
    @transpose the 4x4 matrix row1
    VTRN.32 Q15, Q5                 @R1 transpose1  -- dual issue
    VMULL.S16 Q13,D27,D0            @g_ai2_ihevc_trans_32[28][0-4] * eeo[0-4] R1

    @transpose the 4x4 matrix row2
    VTRN.32 Q4,Q12                  @R2 transpose1
    VTRN.32 Q8,Q2                   @R2 transpose1

    @-----------------------Processing EO ----------------------------
    MOV R12,#COFF_STD_2B_32         @Get coeffs stride
    ADD R11,R9,R12,LSL #1           @Load address of g_ai2_ihevc_trans_32[2]
    LSL R12,R12,#2
    VLD1.S16 {D0,D1},[R11],R12          @g_ai2_ihevc_trans_32[2][0-7]

    VSWP    D4,D25                  @R2 transpose2
    VSWP    D16,D9                  @R2 transpose2

    VADD.S32 Q4,Q4,Q12              @R2 add -- dual issue 1st cycle
    VTRN.32 Q9, Q13                 @R1 transpose1
    VADD.S32 Q8,Q8,Q2               @R2 add -- dual issue 2nd cycle

    VSWP    D18,D31                 @R1 transpose2
    VMULL.S16 Q2,D2,D0              @eo[0][0-3]*  R1 -- dual issue
    VMLAL.S16 Q2,D3,D1              @eo[0][4-7]*  R1

    VSWP    D26,D11                 @R1 transpose2
    VADD.S32 Q8,Q4,Q8               @R2 add -- dual issue

    VADD.S32 Q15,Q15,Q9             @R1 add
    VADD.S32 Q5,Q5,Q13              @R1 add
    VMULL.S16 Q4,D6,D0              @eo[0][0-3]*  R2
    VMLAL.S16 Q4,D7,D1              @eo[0][4-7]*  R2
    VADD.S32 Q15,Q15,Q5             @R1 add

    VLD1.S16 {D0,D1},[R11],R12          @g_ai2_ihevc_trans_32[6][0-7]

    VMULL.S16 Q5,D2,D0              @eo[1][0-3]*  R1
    VMLAL.S16 Q5,D3,D1              @eo[1][4-7]*  R1


    VZIP.S32 Q15,Q8                 @ 3-cycle instruction
    VMULL.S16 Q13,D6,D0             @eo[1][0-3]*  R2 -- dual issue
    VMLAL.S16 Q13,D7,D1             @eo[1][4-7]*  R2

    VLD1.S16 {D0,D1},[R11],R12          @g_ai2_ihevc_trans_32[10][0-7] -- dual issue with prev. MLAL

    @write to memory
    @this should go to 4 12 20 28
    LSL R10,R7,#3
    ADD R2,R2,R7,LSL #2             @move to fifth row
    VST1.32 D30,[R2],R10
    VMULL.S16 Q9,D2,D0              @eo[2][0-3]*  R1 -- dual issue
    VMLAL.S16 Q9,D3,D1              @eo[2][4-7]*  R1
    VST1.32 D31,[R2],R10            @ 1st cycle dual issued with MLAL

    VST1.32 D16,[R2],R10
    VMULL.S16 Q12,D6,D0             @eo[2][0-3]*  R2 -- dual issue
    VMLAL.S16 Q12,D7,D1             @eo[2][4-7]*  R2
    VST1.32 D17,[R2],R10            @ 1st cycle dual issued with MLAL

    SUB R2,R2,R10,LSL #2
    SUB R2,R2,R7,LSL #2
    @--------------------Done procrssing EEO -------------------------

    VLD1.S16 {D0,D1},[R11],R12  @g_ai2_ihevc_trans_32[14][0-7]

    VMULL.S16 Q8,D2,D0      @eo[3][0-3]*  R1
    VMLAL.S16 Q8,D3,D1      @eo[3][4-7]*  R1

    @transpose the 4x4 matrix R1
    VTRN.32 Q2, Q5          @
    VMULL.S16 Q15,D6,D0     @eo[3][0-3]*  R2 -- dual issued with 2nd cycle of TRN
    VMLAL.S16 Q15,D7,D1     @eo[3][4-7]*  R2
    VTRN.32 Q9, Q8          @ 1st cycle dual issued
    @transpose the 4x4 matrix R2
    VTRN.32 Q4,Q13

    VSWP    D18, D5         @ R1
    VSWP    D16, D11        @ R1
    VADD.S32 Q2, Q2, Q5     @ R1
    VADD.S32 Q9, Q9, Q8     @ R1
    VTRN.32 Q12,Q15         @ R2 -- dual issue
    VADD.S32 Q9, Q2, Q9     @ R1

    VSWP    D24,D9          @ R2
    VSWP    D30,D27         @ R2

    VLD1.S16 {D4,D5},[R11],R12  @g_ai2_ihevc_trans_32[18][0-7]

    VADD.S32 Q4, Q4, Q13    @ R2
    VADD.S32 Q12, Q12, Q15  @ R2
    VMULL.S16 Q0,D2,D4      @eo[4][0-3]*  R1
    VMLAL.S16 Q0,D3,D5      @eo[4][4-7]*  R1
    VADD.S32 Q12, Q4, Q12   @ R2

    VZIP.S32 Q9,Q12         @ 3-cycle
    VMULL.S16 Q4,D6,D4      @eo[0][0-3]*  R2  -- dual issue
    VMLAL.S16 Q4,D7,D5      @eo[0][4-7]*  R2

    VLD1.S16 {D4,D5},[R11],R12  @g_ai2_ihevc_trans_32[22][0-7] -- 1st cycle dual issued with prev. instr

    @write to memory
    @this should go to 2 6 10 14
    ADD R2,R2,R7, LSL #1
    LSL R7,R7,#2
    VST1.32 D18,[R2],R7
    VMULL.S16 Q5,D2,D4      @eo[5][0-3]*  R1  -- dual issue
    VMLAL.S16 Q5,D3,D5      @eo[5][4-7]*  R1
    VST1.32 D19,[R2],R7     @ 1st cycle dual issued with prev. instr

    VST1.32 D24,[R2],R7
    VMULL.S16 Q8,D6,D4      @eo[0][0-3]*  R2  -- dual issue
    VMLAL.S16 Q8,D7,D5      @eo[0][4-7]*  R2
    VST1.32 D25,[R2],R7     @ 1st cycle dual issued with prev. instr


    VLD1.S16 {D4,D5},[R11],R12  @g_ai2_ihevc_trans_32[26][0-7]
    VMULL.S16 Q9,D2,D4      @eo[6][0-3]*  R1
    VMLAL.S16 Q9,D3,D5      @eo[6][4-7]*  R1
    VMULL.S16 Q12,D6,D4     @eo[0][0-3]*  R2
    VMLAL.S16 Q12,D7,D5     @eo[0][4-7]*  R2

    VLD1.S16 {D4,D5},[R11],R12  @g_ai2_ihevc_trans_32[30][0-7]
    VMULL.S16 Q13,D2,D4     @eo[7][0-3]*  R1
    VMLAL.S16 Q13,D3,D5     @eo[7][4-7]*  R1
    VMULL.S16 Q15,D6,D4     @eo[0][0-3]*  R2
    VMLAL.S16 Q15,D7,D5     @eo[0][4-7]*  R2

    @-----------------------Processing O ----------------------------
    MOV R12,#COFF_STD_2B_32 @Get coeffs stride
    LSL R12,R12,#1
    ADD R11,R9,#COFF_STD_2B_32  @Get address of g_ai2_ihevc_trans_32[1]
    SUB R12, R12, #16

    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[1][0-7]

    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[1][8-15]
    VMULL.S16 Q1,D20,D4     @o[0][0-3]*  R2 -- dual issue
    VMLAL.S16 Q1,D21,D5     @o[0][4-7]*  R2
    VMLAL.S16 Q1,D22,D6     @o[0][8-11]*  R2
    VMLAL.S16 Q1,D23,D7     @o[0][12-15]*  R2

    @transpose the 4x4 matrix R1
    VTRN.32 Q0, Q5          @ R1
    VTRN.32 Q9,Q13          @ R1
    @transpose the 4x4 matrix R2
    VTRN.32 Q4,Q8           @ R2
    VSWP    D18, D1         @ R1
    VSWP    D26, D11        @ R1
    VTRN.32 Q12,Q15         @ R2
    VADD.S32 Q0, Q0, Q5     @ R1 -- dual issue
    VADD.S32 Q9, Q9, Q13    @ R1

    VSWP    D24,D9          @ R2
    VSWP    D30,D17         @ R2
    VADD.S32 Q9, Q0, Q9     @ R1 -- dual issue

    VMULL.S16 Q0,D12,D4     @o[0][0-3]*  R1
    VMLAL.S16 Q0,D13,D5     @o[0][4-7]*  R1
    VMLAL.S16 Q0,D14,D6     @o[0][8-11]*  R1
    VMLAL.S16 Q0,D15,D7     @o[0][12-15]*  R1

    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[3][0-7]
    VADD.S32 Q4, Q4, Q8     @ R2 -- dual issue
    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[3][8-15]
    VADD.S32 Q12, Q12, Q15  @ R2 -- dual issue

    VMULL.S16 Q5,D20,D4     @o[0][0-3]*  R2
    VMLAL.S16 Q5,D21,D5     @o[0][4-7]*  R2
    VMLAL.S16 Q5,D22,D6     @o[0][8-11]*  R2
    VMLAL.S16 Q5,D23,D7     @o[0][12-15]*  R2
    VADD.S32 Q12, Q4, Q12   @ R2

    VZIP.S32 Q9,Q12
    VMULL.S16 Q4,D12,D4     @o[0][0-3]*  R1
    VMLAL.S16 Q4,D13,D5     @o[0][4-7]*  R1
    VMLAL.S16 Q4,D14,D6     @o[0][8-11]*  R1
    VMLAL.S16 Q4,D15,D7     @o[0][12-15]*  R1

    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[5][0-7] -- 1st cycle dual issued with prev. instr

    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[5][8-15]
    VMULL.S16 Q8,D12,D4     @o[0][0-3]*  R1 -- dual issue with 2nd cycle
    VMLAL.S16 Q8,D13,D5     @o[0][4-7]*  R1
    VMLAL.S16 Q8,D14,D6     @o[0][8-11]*  R1
    VMLAL.S16 Q8,D15,D7     @o[0][12-15]*  R1
    @this should go to 18 22 26 30
    VST1.32 D18,[R2],R7     @1st cycle dual issue

    VST1.32 D19,[R2],R7

    VST1.32 D24,[R2],R7
    VMULL.S16 Q9,D20,D4     @o[0][0-3]*  R2 -- dual issue with 2nd cycle
    VMLAL.S16 Q9,D21,D5     @o[0][4-7]*  R2
    VMLAL.S16 Q9,D22,D6     @o[0][8-11]*  R2
    VMLAL.S16 Q9,D23,D7     @o[0][12-15]*  R2

    VST1.32 D25,[R2],R7     @ 1st cycle dual issue

    SUB R2,R2,R7, LSL #3
    LSR R7,R7,#2
    SUB R2,R2,R7, LSL #1
    @--------------------Done Processing EO--------------------------


    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[7][0-7]

    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[7][8-15]
    VMULL.S16 Q12,D12,D4    @o[0][0-3]*  R1 -- dual issue
    VMLAL.S16 Q12,D13,D5    @o[0][4-7]*  R1 -- dual issue
    VMLAL.S16 Q12,D14,D6    @o[0][8-11]*  R1
    VMLAL.S16 Q12,D15,D7    @o[0][12-15]*  R1
    VMULL.S16 Q13,D20,D4    @o[0][0-3]*  R2
    VMLAL.S16 Q13,D21,D5    @o[0][4-7]*  R2
    VMLAL.S16 Q13,D22,D6    @o[0][8-11]*  R2
    VMLAL.S16 Q13,D23,D7    @o[0][12-15]*  R2

    @transpose the 4x4 matrix R1
    VTRN.32 Q0, Q4          @ R1
    VTRN.32 Q8, Q12         @ R1
    @transpose the 4x4 matrix R2
    VTRN.32 Q1, Q5          @ R2
    VSWP    D16, D1         @ R1
    VSWP    D24, D9         @ R1

    VTRN.32 Q9, Q13         @ R2
    VADD.S32 Q0, Q0, Q4     @ R1 -- dual issue
    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[9][0-7]
    VADD.S32 Q8, Q8, Q12    @ R1 -- dual issue

    VSWP    D18, D3         @ R2
    VSWP    D26, D11        @ R2
    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[9][8-15]
    VADD.S32 Q8, Q0, Q8     @ R1 -- dual issue

    VADD.S32 Q1, Q1, Q5     @ R2
    VADD.S32 Q9, Q9, Q13    @ R2

    VMULL.S16 Q0,D12,D4     @o[0][0-3]*  R1
    VMLAL.S16 Q0,D13,D5     @o[0][4-7]*  R1
    VMLAL.S16 Q0,D14,D6     @o[0][8-11]*  R1
    VMLAL.S16 Q0,D15,D7     @o[0][12-15]*  R1
    VADD.S32 Q9, Q1, Q9     @ R2

    VMULL.S16 Q1,D20,D4     @o[0][0-3]*  R2
    VMLAL.S16 Q1,D21,D5     @o[0][4-7]*  R2
    VMLAL.S16 Q1,D22,D6     @o[0][8-11]*  R2
    VMLAL.S16 Q1,D23,D7     @o[0][12-15]*  R2

    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[11][0-7] -- 1st cycle dual issue
    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[11][8-15]

    VZIP.S32 Q8, Q9

    @write to memory
    @this should go to 1 3 5 7
    ADD R2,R2,R7
    LSL R7,R7,#1
    VST1.32 D16, [R2], R7

    VST1.32 D17, [R2], R7
    VMULL.S16 Q4,D12,D4     @o[0][0-3]*  R1 -- dual issued with 2nd cycle
    VMLAL.S16 Q4,D13,D5     @o[0][4-7]*  R1
    VMLAL.S16 Q4,D14,D6     @o[0][8-11]*  R1
    VMLAL.S16 Q4,D15,D7     @o[0][12-15]*  R1

    VST1.32 D18, [R2], R7   @ 1st cycle dual issued
    VMULL.S16 Q5,D20,D4     @o[0][0-3]*  R2 -- dual issue with 2nd cycle
    VMLAL.S16 Q5,D21,D5     @o[0][4-7]*  R2
    VMLAL.S16 Q5,D22,D6     @o[0][8-11]*  R2
    VMLAL.S16 Q5,D23,D7     @o[0][12-15]*  R2

    VST1.32 D19, [R2], R7   @ 1st cycle dual issued


    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[13][0-7]

    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[13][8-15]
    VMULL.S16 Q8,D12,D4     @o[0][0-3]*  R1 -- dual issue
    VMLAL.S16 Q8,D13,D5     @o[0][4-7]*  R1
    VMLAL.S16 Q8,D14,D6     @o[0][8-11]*  R1
    VMLAL.S16 Q8,D15,D7     @o[0][12-15]*  R1
    VMULL.S16 Q9,D20,D4     @o[0][0-3]*  R2
    VMLAL.S16 Q9,D21,D5     @o[0][4-7]*  R2
    VMLAL.S16 Q9,D22,D6     @o[0][8-11]*  R2
    VMLAL.S16 Q9,D23,D7     @o[0][12-15]*  R2

    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[15][0-7] - 1st cycle dual issue
    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[15][8-15]
    VMULL.S16 Q12,D12,D4    @o[0][0-3]*  R1 -- dual issue
    VMLAL.S16 Q12,D13,D5    @o[0][4-7]*  R1
    VMLAL.S16 Q12,D14,D6    @o[0][8-11]*  R1
    VMLAL.S16 Q12,D15,D7    @o[0][12-15]*  R1
    VMULL.S16 Q13,D20,D4    @o[0][0-3]*  R2
    VMLAL.S16 Q13,D21,D5    @o[0][4-7]*  R2
    VMLAL.S16 Q13,D22,D6    @o[0][8-11]*  R2
    VMLAL.S16 Q13,D23,D7    @o[0][12-15]*  R2

    @transpose the 4x4 matrix R1
    VTRN.32 Q0, Q4          @ R1 1st cycle dual issue
    VTRN.32 Q8, Q12         @ R1
    @transpose the 4x4 matrix R2
    VTRN.32 Q1, Q5          @ R2
    VSWP    D16, D1         @ R1
    VSWP    D24, D9         @ R1

    VTRN.32 Q9, Q13         @ R2
    VADD.S32 Q0, Q0, Q4     @ R1 -- dual issue
    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[17][0-7]
    VADD.S32 Q8, Q8, Q12    @ R1 -- dual issue

    VSWP    D18, D3         @ R2
    VSWP    D26, D11        @ R2
    VADD.S32 Q8, Q0, Q8     @ R1 -- dual issue with 1st cycle
    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[17][8-15]


    VADD.S32 Q1, Q1, Q5     @ R2 -- dual issue with 2nd cycle
    VADD.S32 Q9, Q9, Q13    @ R2

    VMULL.S16 Q0,D12,D4     @o[0][0-3]*  R1
    VMLAL.S16 Q0,D13,D5     @o[0][4-7]*  R1
    VMLAL.S16 Q0,D14,D6     @o[0][8-11]*  R1
    VMLAL.S16 Q0,D15,D7     @o[0][12-15]*  R1
    VADD.S32 Q9, Q1, Q9     @ R2

    VMULL.S16 Q1,D20,D4     @o[0][0-3]*  R2
    VMLAL.S16 Q1,D21,D5     @o[0][4-7]*  R2
    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[19][0-7]
    VMLAL.S16 Q1,D22,D6     @o[0][8-11]*  R2
    VMLAL.S16 Q1,D23,D7     @o[0][12-15]*  R2
    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[19][8-15]

    VZIP.S32 Q8, Q9

    @write to memory
    @this should go to 9 11 13 15
    VST1.32 D16, [R2], R7
    VMULL.S16 Q4,D12,D4     @o[0][0-3]*  R1 -- dual issued with 2nd cycle
    VMLAL.S16 Q4,D13,D5     @o[0][4-7]*  R1
    VMLAL.S16 Q4,D14,D6     @o[0][8-11]*  R1
    VMLAL.S16 Q4,D15,D7     @o[0][12-15]*  R1

    VST1.32 D17, [R2], R7   @ 1st cycle dual issued
    VMULL.S16 Q5,D20,D4     @o[0][0-3]*  R2 -- dual issue with 2nd cycle
    VMLAL.S16 Q5,D21,D5     @o[0][4-7]*  R2
    VST1.32 D18, [R2], R7   @1st cycle dual issued
    VMLAL.S16 Q5,D22,D6     @o[0][8-11]*  R2 -- dual issued with 2nd cycle
    VMLAL.S16 Q5,D23,D7     @o[0][12-15]*  R2

    VST1.32 D19, [R2], R7   @ 1st cycle dual issue


    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[21][0-7]
    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[21][8-15]
    VMULL.S16 Q8,D12,D4     @o[0][0-3]*  R1 -- dual issue
    VMLAL.S16 Q8,D13,D5     @o[0][4-7]*  R1
    VMLAL.S16 Q8,D14,D6     @o[0][8-11]*  R1
    VMLAL.S16 Q8,D15,D7     @o[0][12-15]*  R1
    VMULL.S16 Q9,D20,D4     @o[0][0-3]*  R2
    VMLAL.S16 Q9,D21,D5     @o[0][4-7]*  R2
    VMLAL.S16 Q9,D22,D6     @o[0][8-11]*  R2
    VMLAL.S16 Q9,D23,D7     @o[0][12-15]*  R2

    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[23][0-7]
    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[23][8-15]
    VMULL.S16 Q12,D12,D4    @o[0][0-3]*  R1 -- dual issue
    VMLAL.S16 Q12,D13,D5    @o[0][4-7]*  R1 -- dual issue
    VMLAL.S16 Q12,D14,D6    @o[0][8-11]*  R1
    VMLAL.S16 Q12,D15,D7    @o[0][12-15]*  R1
    VMULL.S16 Q13,D20,D4    @o[0][0-3]*  R2
    VMLAL.S16 Q13,D21,D5    @o[0][4-7]*  R2
    VMLAL.S16 Q13,D22,D6    @o[0][8-11]*  R2
    VMLAL.S16 Q13,D23,D7    @o[0][12-15]*  R2

    @transpose the 4x4 matrix R1
    VTRN.32 Q0, Q4          @ R1
    VTRN.32 Q8, Q12         @ R1
    @transpose the 4x4 matrix R2
    VTRN.32 Q1, Q5          @ R2
    VSWP    D16, D1         @ R1
    VSWP    D24, D9         @ R1

    VTRN.32 Q9, Q13         @ R2
    VADD.S32 Q0, Q0, Q4     @ R1 -- dual issue
    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[25][0-7]
    VADD.S32 Q8, Q8, Q12    @ R1 -- dual issue

    VSWP    D18, D3         @ R2
    VSWP    D26, D11        @ R2
    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[25][8-15]
    VADD.S32 Q8, Q0, Q8     @ R1 -- dual issue

    VADD.S32 Q1, Q1, Q5     @ R2
    VADD.S32 Q9, Q9, Q13    @ R2

    VMULL.S16 Q0,D12,D4     @o[0][0-3]*  R1
    VMLAL.S16 Q0,D13,D5     @o[0][4-7]*  R1
    VMLAL.S16 Q0,D14,D6     @o[0][8-11]*  R1
    VMLAL.S16 Q0,D15,D7     @o[0][12-15]*  R1
    VADD.S32 Q9, Q1, Q9     @ R2

    VMULL.S16 Q1,D20,D4     @o[0][0-3]*  R2
    VMLAL.S16 Q1,D21,D5     @o[0][4-7]*  R2
    VMLAL.S16 Q1,D22,D6     @o[0][8-11]*  R2
    VMLAL.S16 Q1,D23,D7     @o[0][12-15]*  R2

    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[27][0-7]
    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[27][8-15]

    VZIP.S32 Q8, Q9
    VMULL.S16 Q4,D12,D4     @o[0][0-3]*  R1
    VMLAL.S16 Q4,D13,D5     @o[0][4-7]*  R1
    VMLAL.S16 Q4,D14,D6     @o[0][8-11]*  R1
    VMLAL.S16 Q4,D15,D7     @o[0][12-15]*  R1
    @write to memory
    @this should go to 17 19 21 23
    VST1.32 D16, [R2], R7
    VMULL.S16 Q5,D20,D4     @o[0][0-3]*  R2 -- dual issue
    VST1.32 D17, [R2], R7
    VMLAL.S16 Q5,D21,D5     @o[0][4-7]*  R2 -- dual issue
    VST1.32 D18, [R2], R7
    VMLAL.S16 Q5,D22,D6     @o[0][8-11]*  R2 -- dual issue
    VST1.32 D19, [R2], R7
    VMLAL.S16 Q5,D23,D7     @o[0][12-15]*  R2 -- dual issue

    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[29][0-7]
    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[29][8-15]
    VMULL.S16 Q8,D12,D4     @o[0][0-3]*  R1 -- dual issue
    VMLAL.S16 Q8,D13,D5     @o[0][4-7]*  R1  -- dual issue
    VMLAL.S16 Q8,D14,D6     @o[0][8-11]*  R1
    VMLAL.S16 Q8,D15,D7     @o[0][12-15]*  R1
    VMULL.S16 Q9,D20,D4     @o[0][0-3]*  R2
    VMLAL.S16 Q9,D21,D5     @o[0][4-7]*  R2
    VMLAL.S16 Q9,D22,D6     @o[0][8-11]*  R2
    VMLAL.S16 Q9,D23,D7     @o[0][12-15]*  R2

    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[31][0-7]
    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[31][8-15]
    VMULL.S16 Q12,D12,D4    @o[0][0-3]*  R1 -- dual issued
    VMLAL.S16 Q12,D13,D5    @o[0][4-7]*  R1 -- dual issued
    VMLAL.S16 Q12,D14,D6    @o[0][8-11]*  R1
    VMLAL.S16 Q12,D15,D7    @o[0][12-15]*  R1
    VMULL.S16 Q13,D20,D4    @o[0][0-3]*  R2
    VMLAL.S16 Q13,D21,D5    @o[0][4-7]*  R2
    VMLAL.S16 Q13,D22,D6    @o[0][8-11]*  R2
    VMLAL.S16 Q13,D23,D7    @o[0][12-15]*  R2

    @transpose the 4x4 matrix R1
    VTRN.32 Q0, Q4          @ R1
    VTRN.32 Q8, Q12         @ R1
    @transpose the 4x4 matrix R2
    VTRN.32 Q1, Q5          @ R2
    VSWP    D16, D1         @ R1
    VSWP    D24, D9         @ R1

    VTRN.32 Q9, Q13         @ R2
    VADD.S32 Q0, Q0, Q4     @ R1 -- dual issue
    VADD.S32 Q8, Q8, Q12    @ R1
    @ 1-cycle stall?
    VADD.S32 Q0, Q0, Q8     @ R1
    VSWP    D18, D3         @ R2
    VSWP    D26, D11        @ R2
    VADD.S32 Q1, Q1, Q5     @ R2
    VADD.S32 Q9, Q9, Q13    @ R2
    @ 1-cycle stall?
    VADD.S32 Q1, Q1, Q9     @ R2
    @ 2-cycle stall?
    VZIP.S32 Q0, Q1         @ 3-cycle instruction

    @ 1-cycle stall?
    @write to memory
    @this should go to 25 27 29 31
    VST1.32 D0, [R2], R7
    VST1.32 D1, [R2], R7
    VST1.32 D2, [R2], R7
    VST1.32 D3, [R2], R7
    @------------------Processing O ends-------------------------------

    SUB R2,R2,R7,LSL #4
    LSR R7,R7,#1
    SUB R2,R2,R7

    ADD R2,R2,#8                @MOVE TO NEXT to next COLUMN - pi4_tmp

    ADD R8,R8,#2                @increment loop cntr
    CMP R8,#32                  @check loop cntr
    BNE CORE_LOOP_32X32_HORIZ   @jump acc


@*****************Vertical transform************************************

@Initialization for vert transform
@pi4_tmp will be the new src
@tmp stride will be new src stride
@dst will be new pi4_tmp
@dst stride will be new tmp stride
@trans table will be of 32 bit

    LDR R9,g_ai4_ihevc_trans_32_addr    @get 32 bit transform matrix
ulbl3:
    ADD R9, R9, PC

    SUB R0,R2,#128                  @set tmp as src [-32 to move back to orgin]
    MOV R2,R3                       @set dst as tmp
    MOV R4,#TMP_STRIDE_32           @set tmp stride as src stride
    SUB R4,#112                     @Adjust stride for 7 previous loads
    LSR R7,R6,#15                   @Set dst stride as tmp stride


    @Block SAD
    VADD.S32 D28,D28,D29
    VPADD.S32 D28,D28,D29
    VMOV.S32 R3,D28[0]

    @Read [0 0] [8 0] [16 0] [24 0],[0 1] [8 1] [16 1] [24 1]
    @values of g_ai4_ihevc_trans_32 and write to stack
    MOV R12,#COFF_STD_W_32
    LSL R12,R12,#3
    VLD1.S32 D28,[R9],R12           @ D28: [0 0] [0 1]
    VLD1.S32 D29,[R9],R12           @ D29: [8 0] [8 1]
    VLD1.S32 D30,[R9],R12           @ D30: [16 0] [16 1]
    VLD1.S32 D31,[R9],R12           @ D31: [24 0] [24 1]
    SUB R9,R9,R12,LSL #2

    VREV64.32 Q15,Q15               @ Q15: [16 1] [16 0] [24 1] [24 0]
    VTRN.S32 Q14,Q15                @ Q14: [0 0] [16 1] [8 0] [24 1]
                                    @ Q15: [0 1] [16 0] [8 1] [24 0]
    VST1.S32 {Q14-Q15},[SP]

@   VMOV.U32 Q14,#RADD              ;get the round factor to q14
@   VMOV.U32 Q15,#SHIFT             ;Get the shift to neon

    MOV R8,#0                   @INIT LOOP

CORE_LOOP_32X32_VERT:

    VLD1.S32 {D0,D1},[R0]!          @LOAD 1-4 src R1
    VLD1.S32 {D2,D3},[R0]!          @LOAD 5-8 src R1
    VLD1.S32 {D4,D5},[R0]!          @LOAD 9-12 src R1
    VLD1.S32 {D6,D7},[R0]!          @LOAD 13-16 src R1
    VLD1.S32 {D8,D9},[R0]!          @LOAD 17-20 src R1
    VREV64.S32 Q4,Q4            @Rev 17-20 R1
    VLD1.S32 {D10,D11},[R0]!            @LOAD 21-24 src R1
    VREV64.S32 Q5,Q5            @Rev 21-24 R1
    VLD1.S32 {D12,D13},[R0]!            @LOAD 25-28 src R1
    VREV64.S32 Q6,Q6            @Rev 25-28 R1
    VLD1.S32 {D14,D15},[R0],R4          @LOAD 29-32 src R1
    VREV64.S32 Q7,Q7            @Rev 29-32 R1

    VSWP D8,D9                  @ Q4: 20 19 18 17
    VADD.S32 Q11, Q3, Q4        @e[k] = resi_tmp_1 + resi_tmp_2  k -> 13-16  R1-- dual issue
    VSWP D10,D11                @ Q5: 24 23 22 21
    VADD.S32 Q10, Q2, Q5        @e[k] = resi_tmp_1 + resi_tmp_2  k -> 9-12  R1-- dual issue
    VSWP D12,D13                @ Q6: 28 27 26 25
    VADD.S32 Q9, Q1, Q6         @e[k] = resi_tmp_1 + resi_tmp_2  k -> 5-8  R1 -- dual issue
    VSWP D14,D15                @ Q7: 32 31 30 29

    VADD.S32 Q8, Q0, Q7         @e[k] = resi_tmp_1 + resi_tmp_2  k -> 1-4  R1 -- dual issue
    VREV64.S32 Q11, Q11         @rev e[k] k-> 13-16 R1 -- dual issue
    VSUB.S32 Q12, Q0, Q7        @o[k] = resi_tmp_1 - resi_tmp_2  k -> 1-4  R1
    VREV64.S32 Q10, Q10         @rev e[k] k-> 9-12 R1 -- dual issue
    VSUB.S32 Q13, Q1, Q6        @o[k] = resi_tmp_1 - resi_tmp_2  k -> 5-8  R1
    VSWP D22, D23               @Q11: e[16] e[15] e[14] e[13] -- dual issue
    VSUB.S32 Q14, Q2, Q5        @o[k] = resi_tmp_1 - resi_tmp_2  k -> 9-12  R1
    VSWP D20, D21               @Q10: e[12] e[11] e[10] e[9] -- dual issue
    VSUB.S32 Q15, Q3, Q4        @o[k] = resi_tmp_1 - resi_tmp_2  k -> 13-16  R1

    VADD.S32 Q1, Q9, Q10        @ee[k] = e[k] + e[15- k] row R1, k-> 4-7
    VADD.S32 Q0, Q8, Q11        @ee[k] = e[k] + e[15- k] row R1, k-> 0-3

    VSUB.S32 Q2, Q8, Q11        @eo[k] = e[k] - e[15 - k] row R1, k-> 0-3
    VSUB.S32 Q3, Q9, Q10        @eo[k] = e[k] - e[15 - k] row R1, k-> 4-7
    VREV64.S32 Q1, Q1           @Q1: ee[5] ee[4] ee[7] ee[6] -- dual issue

    VSWP D2, D3                 @Q1: ee[7] ee[6] ee[5]  ee[4]

    VADD.S32 Q4, Q0, Q1         @eee[k] = ee[k] + ee[7-k] row R1, k-> 0-3
    VSUB.S32 Q5, Q0, Q1         @eeo[k] = ee[k] - ee[7-k] row R1, k-> 0-3

    @D8: eee[0] eee[1]
    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]
    VREV64.S32 D9, D9           @D9: eee[3] eee[2]

    @-----------------------Processing EEO ----------------------------
                                @Q5 :R1eeo[0] R1eeo[1] R1eeo[2] R1eeo[3]
    MOV R12,#COFF_STD_W_32
    ADD R11,R9,R12,LSL #2       @Get to the 4th row of src
    LSL R12,R12,#3

    VADD.S32 D12, D8, D9        @eeee[0] eeee[1] -- dual issue in 1st cycle
    VLD1.S32  {D14,D15},[R11],R12       @LOAD g_ai4_ihevc_trans_32[4][0-4] -> 4G0 4G1 4G2 4G3
    VSUB.S32 D13, D8, D9        @eeeo[0] eeeo[1] -- dual issue in 2nd cycle

    VMUL.S32  Q0,Q5,Q7          @4G0 4G1 4G2 4G3 * R1eeo[0] R1eeo[1] R1eeo[2] R1eeo[3]

    VLD1.S32  {D14,D15},[R11],R12       @LOAD g_ai4_ihevc_trans_32[12][0-4] -- 1st cycle dual issue
    VREV64.S32 Q8,Q6            @Q6 : eeee[0] eeee[1] eeeo[0] eeeo[1] R1   ->   ;Q8 : eeee[1] eeee[0] eeeo[1] eeeo[0] R1

    VMUL.S32 Q4,Q6,Q10          @g_ai4_ihevc_trans_32 * eeee[0] eeee[1] eeeo[0] eeeo[1] R1 -- dual issue
    VMLA.S32 Q4,Q8,Q11          @g_ai4_ihevc_trans_32 * eeee[1] eeee[0] eeeo[1] eeeo[0] R1

    VMUL.S32  Q9,Q5,Q7          @g_ai4_ihevc_trans_32[6][0-4] * eeo[0-4]

    VLD1.S32  {D14,D15},[R11],R12       @LOAD g_ai4_ihevc_trans_32[20][0-4] - 1st cycle dual issue
    VRSHRN.S32 D8,Q4,#SHIFT_32  @ROUND NARROW R1 -- dual issued in 2nd cycle
                                @ D8: 0 16 8 24
    @WRITE INTO MEM the values or wait to be shuffled
    @These values must go to 0 8 16 24 colums
    LSL R10,R7,#3
    VST1.S16 D8[0],[R2],R10
    VMUL.S32  Q10,Q5,Q7         @g_ai4_ihevc_trans_32[10][0-4] * eeo[0-4] -- dual issued

    VLD1.S32  {D14,D15},[R11],R12       @LOAD g_ai4_ihevc_trans_32[28][0-4]

    VST1.S16 D8[2],[R2],R10
    VMUL.S32  Q11,Q5,Q7         @g_ai4_ihevc_trans_32[14][0-4] * eeo[0-4] -- dual issue
    @transpose the 4x4 matrix R1
    VTRN.32 Q0, Q9
    @-----------------------Processing EO ----------------------------
    MOV R12,#COFF_STD_W_32
    ADD R11,R9,R12,LSL #1       @Get 1ST row
    LSL R12,R12,#2

    VLD1.S32 {Q6,Q7},[R11],R12  @g_ai4_ihevc_trans_16[2][0-7]

    VMUL.S32 Q8,Q6,Q2           @g_ai4_ihevc_trans_16[2][0-3]*eo[0][0-3] R1
    VTRN.32 Q10, Q11            @ dual issue
    VMLA.S32 Q8,Q7,Q3           @g_ai4_ihevc_trans_16[2][4-7]*eo[0][4-7] R1


    VSWP    D20, D1
    VSWP    D22, D19

    VST1.S16 D8[1],[R2],R10
    VADD.S32 Q0, Q0, Q9         @ dual issue
    VST1.S16 D8[3],[R2],R10
    VADD.S32 Q10, Q10, Q11      @ dual issue
    SUB R2,R2,R10, LSL #2
    @-----------------------Processing EEEO complete-------------------

    VLD1.S32 {Q4,Q5},[R11],R12  @g_ai4_ihevc_trans_16[6][0-7]
    VADD.S32 Q0, Q0, Q10        @ dual issue

    VMUL.S32 Q7,Q4,Q2           @eo[0][0-3]
    VMLA.S32 Q7,Q5,Q3           @eo[0][4-7]
    VRSHRN.S32 D0,Q0,#SHIFT_32  @ Shift by SHIFT and Round the result

    VLD1.S32 {Q9,Q10},[R11],R12 @g_ai4_ihevc_trans_16[10][0-7]
    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


    VMUL.S32 Q8,Q9,Q2           @eo[0][0-3]
    VMLA.S32 Q8,Q10,Q3          @eo[0][4-7]

    @this should go to 4  12  20  28
    LSL R10,R7,#3
    ADD R2,R2,R7,LSL #2         @move to fifth row
    VST1.S16 D0[0], [R2], R10
    VADD.S32 D13,D14,D15        @ -- dual issue--
    VST1.S16 D0[1], [R2], R10
    VADD.S32 D10,D16,D17        @ -- dual issue --

    VLD1.S32 {Q7,Q8},[R11],R12  @g_ai4_ihevc_trans_16[14][0-7]

    VST1.S16 D0[2], [R2], R10
    VMUL.S32 Q9,Q7,Q2           @eo[0][0-3] -- dual issue
    VST1.S16 D0[3], [R2], R10
    VMLA.S32 Q9,Q8,Q3           @eo[0][4-7] -- dual issue
    SUB R2,R2,R10,LSL #2        @go back to orgin
    SUB R2,R2,R7,LSL #2
    @----------------------Processing EEO  complete-------------------

    VLD1.S32 {Q0,Q1},[R11],R12  @g_ai4_ihevc_trans_16[18][0-7]

    VMUL.S32 Q4,Q0,Q2           @g_ai4_ihevc_trans_16[18][0-3]*eo[0][0-3] R1
    VMLA.S32 Q4,Q1,Q3           @g_ai4_ihevc_trans_16[18][4-7]*eo[0][4-7] R1

    VLD1.S32 {Q0,Q1},[R11],R12  @g_ai4_ihevc_trans_16[22][0-7]
    VADD.S32 D11,D18,D19        @ dual issue

    @Q5 Q6
    VMUL.S32 Q7,Q0,Q2           @eo[0][0-3]
    VMLA.S32 Q7,Q1,Q3           @eo[0][4-7]

    VPADD.S32 D16,D12,D13
    VPADD.S32 D17,D10,D11

    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
    VADD.S32 D13,D14,D15

    VRSHRN.S32 D14,Q8,#SHIFT_32
    VLD1.S32 {Q0,Q1},[R11],R12  @g_ai4_ihevc_trans_16[26][0-7]
    VLD1.S32 {Q10,Q11},[R11],R12    @g_ai4_ihevc_trans_16[30][0-7]
    @write to memory this should go to 2 6 10 14
    ADD R2,R2,R7,LSL #1
    LSL R7,R7,#2
    VST1.S16 D14[0],[R2],R7
    VMUL.S32 Q8,Q0,Q2           @eo[0][0-3] -- dual issue
    VST1.S16 D14[1],[R2],R7
    VMLA.S32 Q8,Q1,Q3           @eo[0][4-7] -- dual issue
    VST1.S16 D14[2],[R2],R7
    VMUL.S32 Q9,Q10,Q2          @eo[0][0-3] -- dual issue
    VST1.S16 D14[3],[R2],R7
    VMLA.S32 Q9,Q11,Q3          @eo[0][4-7] -- dual issue

    VADD.S32 D10,D16,D17
    @---------------Processing O Row 1-----------------------------------------------
    MOV R12,#COFF_STD_W_32
    ADD R11,R9,R12              @Get 1ST row
    LSL R12,R12,#1
    SUB R12, R12, #32
    VLD1.S32 {Q0,Q1},[R11]!

    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[1][0-15]
    VADD.S32 D11,D18,D19        @ dual issue in 2nd cycle

    VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[1][0-3]*o[0][0-3] R1
    VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[1][4-7]*o[0][4-7] R1
    VLD1.S32 {Q0,Q1},[R11]!
    VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[1][8-11]*o[0][8-11] R1
    VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[1][12-15]*o[0][12-15] R1

    @Q5 Q6
    VPADD.S32 D16,D12,D13
    VPADD.S32 D17,D10,D11


    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[3][0-15]
    VRSHRN.S32 D16,Q8,#SHIFT_32 @ dual issue

    VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[3][0-3]*o[0][0-3] R1
    VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[3][4-7]*o[0][4-7] R1
    VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[3][8-11]*o[0][8-11] R1
    VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[3][12-15]*o[0][12-15] R1

    @write to memory this should go to 2 6 10 14
    VST1.S16 D16[0],[R2],R7
    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]
    VLD1.S32 {Q0,Q1},[R11]!
    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[5][0-15]
    VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[5][0-3]*o[0][0-3] R1 -- dual issue
    VST1.S16 D16[1],[R2],R7
    VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[5][4-7]*o[0][4-7] R1 -- dual issue
    VST1.S16 D16[2],[R2],R7
    VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[5][8-11]*o[0][8-11] R1 -- dual issue
    VST1.S16 D16[3],[R2],R7
    VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[5][12-15]*o[0][12-15] R1
    SUB R2,R2,R7, LSL #3
    LSR R7,R7,#2
    SUB R2,R2,R7, LSL #1

    @--------------------Done Processing EO--------------------------

    VLD1.S32 {Q0,Q1},[R11]!
    VADD.S32 D11,D14,D15        @ dual issued
    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[7][0-15]
    VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[7][0-3]*o[0][0-3] R1
    VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[7][4-7]*o[0][4-7] R1
    VLD1.S32 {Q0,Q1},[R11]!
    VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[7][8-11]*o[0][8-11] R1
    VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[7][12-15]*o[0][12-15] R1


    VADD.S32 D12,D8,D9          @ dual issued
    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[9][0-15]
    @Q5 Q6
    VPADD.S32 D16,D10,D11
    VADD.S32 D13,D14,D15

    VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[9][0-3]*o[0][0-3] R1
    VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[9][4-7]*o[0][4-7] R1
    VLD1.S32 {Q0,Q1},[R11]!
    VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[9][8-11]*o[0][8-11] R1
    VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[9][12-15]*o[0][12-15] R1
    VPADD.S32 D17,D12,D13


    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[11][0-15]
    VRSHRN.S32 D16,Q8,#SHIFT_32 @ duall issue

    VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[11][0-3]*o[0][0-3] R1
    VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[11][4-7]*o[0][4-7] R1
    VLD1.S32 {Q0,Q1},[R11]!
    VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[11][8-11]*o[0][8-11] R1
    VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[11][12-15]*o[0][12-15] R1
    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]
    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[13][0-15]
    @write to memory this should go to 1 3 5 7
    ADD R2,R2,R7
    LSL R7,R7,#1
    VST1.S16 D16[0],[R2],R7
    VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[13][0-3]*o[0][0-3] R1
    VST1.S16 D16[1],[R2],R7
    VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[13][4-7]*o[0][4-7] R1
    VST1.S16 D16[2],[R2],R7
    VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[13][8-11]*o[0][8-11] R1
    VST1.S16 D16[3],[R2],R7
    VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[13][12-15]*o[0][12-15] R1

    VLD1.S32 {Q0,Q1},[R11]!
    VADD.S32 D11,D14,D15        @ dual issue
    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[15][0-15]
    VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[15][0-3]*o[0][0-3] R1 -- dual issue--
    VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[15][4-7]*o[0][4-7] R1
    VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[15][8-11]*o[0][8-11] R1
    VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[15][12-15]*o[0][12-15] R1

    VLD1.S32 {Q0,Q1},[R11]!
    VADD.S32 D12,D8,D9          @ dual issued

    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[17][0-15]
    @Q5 Q6
    VPADD.S32 D16,D10,D11
    VADD.S32 D13,D14,D15

    VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[17][0-3]*o[0][0-3] R1
    VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[17][4-7]*o[0][4-7] R1
    VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[17][8-11]*o[0][8-11] R1
    VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[17][12-15]*o[0][12-15] R1
    VPADD.S32 D17,D12,D13

    VLD1.S32 {Q0,Q1},[R11]!
    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[19][0-15]
    VRSHRN.S32 D16,Q8,#SHIFT_32 @ dual issue

    VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[19][0-3]*o[0][0-3] R1
    VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[19][4-7]*o[0][4-7] R1
    VLD1.S32 {Q0,Q1},[R11]!
    VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[19][8-11]*o[0][8-11] R1
    VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[19][12-15]*o[0][12-15] R1
    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]
    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[21][0-15]
    @write to memory this should go to 9 11 13 15
    VST1.S16 D16[0],[R2],R7
    VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[21][0-3]*o[0][0-3] R1
    VST1.S16 D16[1],[R2],R7
    VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[21][4-7]*o[0][4-7] R1
    VST1.S16 D16[2],[R2],R7
    VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[21][8-11]*o[0][8-11] R1
    VST1.S16 D16[3],[R2],R7
    VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[21][12-15]*o[0][12-15] R1


    VLD1.S32 {Q0,Q1},[R11]!
    VADD.S32 D11,D14,D15        @ dual issue
    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[23][0-15]
    VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[23][0-3]*o[0][0-3] R1
    VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[23][4-7]*o[0][4-7] R1
    VLD1.S32 {Q0,Q1},[R11]!
    VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[23][8-11]*o[0][8-11] R1
    VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[23][12-15]*o[0][12-15] R1
    VADD.S32 D12,D8,D9          @ dual issued
    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[25][0-15]

    @Q5 Q6
    VPADD.S32 D16,D10,D11
    VADD.S32 D13,D14,D15

    VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[25][0-3]*o[0][0-3] R1
    VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[25][4-7]*o[0][4-7] R1
    VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[25][8-11]*o[0][8-11] R1
    VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[25][12-15]*o[0][12-15] R1
    VPADD.S32 D17,D12,D13

    VLD1.S32 {Q0,Q1},[R11]!
    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[27][0-15]
    VRSHRN.S32 D16,Q8,#SHIFT_32

    VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[27][0-3]*o[0][0-3] R1
    VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[27][4-7]*o[0][4-7] R1
    VLD1.S32 {Q0,Q1},[R11]!
    VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[27][8-11]*o[0][8-11] R1
    VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[27][12-15]*o[0][12-15] R1
    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]
    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[29][0-15]
    @write to memory this should go to 17 19 21 23
    VST1.S16 D16[0],[R2],R7
    VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[29][0-3]*o[0][0-3] R1
    VST1.S16 D16[1],[R2],R7
    VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[29][4-7]*o[0][4-7] R1
    VST1.S16 D16[2],[R2],R7
    VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[29][8-11]*o[0][8-11] R1
    VST1.S16 D16[3],[R2],R7
    VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[29][12-15]*o[0][12-15] R1

    VADD.S32 D11,D14,D15        @ dual issue
    VLD1.S32 {Q0,Q1},[R11]!

    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[31][0-15]
    VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[31][0-3]*o[0][0-3] R1
    VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[31][4-7]*o[0][4-7] R1
    VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[31][8-11]*o[0][8-11] R1
    VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[31][12-15]*o[0][12-15] R1


    VADD.S32 D12,D8,D9
    @Q5 Q6
    VPADD.S32 D16,D10,D11

    VADD.S32 D13,D14,D15


    VPADD.S32 D17,D12,D13

    VRSHRN.S32 D16,Q8,#SHIFT_32

    @write to memory this should go to 25 27 29 31
    VST1.S16 D16[0],[R2],R7
    VST1.S16 D16[1],[R2],R7
    VST1.S16 D16[2],[R2],R7
    VST1.S16 D16[3],[R2],R7

    SUB R2,R2,R7,LSL #4
    LSR R7,R7,#1
    SUB R2,R2,R7

    ADD R2,R2,#2                @MOVE TO NEXT to next COLUMN

    ADD R8,R8,#1                @increment loop cntr by 2 since we process loop as 2 cols
    CMP R8,#32                  @check loop cntr
    BNE CORE_LOOP_32X32_VERT    @jump acc

    MOV R0,R3

    ADD SP,SP,#32
    vpop {d8 - d15}
    LDMFD       sp!,{r4-r12,PC}     @stack store values of the arguments


    .section    .note.GNU-stack,"",%progbits