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