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