1 @/***************************************************************************** 2 @* 3 @* Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore 4 @* 5 @* Licensed under the Apache License, Version 2.0 (the "License"); 6 @* you may not use this file except in compliance with the License. 7 @* You may obtain a copy of the License at: 8 @* 9 @* http://www.apache.org/licenses/LICENSE-2.0 10 @* 11 @* Unless required by applicable law or agreed to in writing, software 12 @* distributed under the License is distributed on an "AS IS" BASIS, 13 @* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 @* See the License for the specific language governing permissions and 15 @* limitations under the License. 16 @* 17 @*****************************************************************************/ 18 @/** 19 @ ******************************************************************************* 20 @ * @file 21 @ * ihevc_itrans_recon_8x8_neon.s 22 @ * 23 @ * @brief 24 @ * contains function definitions for single stage inverse transform 25 @ * 26 @ * @author 27 @ * anand s 28 @ * 29 @ * @par list of functions: 30 @ * - ihevc_itrans_recon_8x8() 31 @ * 32 @ * @remarks 33 @ * none 34 @ * 35 @ ******************************************************************************* 36 @*/ 37 38 @/** 39 @ ******************************************************************************* 40 @ * 41 @ * @brief 42 @ * this function performs inverse transform and reconstruction for 8x8 43 @ * input block 44 @ * 45 @ * @par description: 46 @ * performs inverse transform and adds the prediction data and clips output 47 @ * to 8 bit 48 @ * 49 @ * @param[in] pi2_src 50 @ * input 8x8 coefficients 51 @ * 52 @ * @param[in] pi2_tmp 53 @ * temporary 8x8 buffer for storing inverse 54 @ * 55 @ * transform 56 @ * 1st stage output 57 @ * 58 @ * @param[in] pu1_pred 59 @ * prediction 8x8 block 60 @ * 61 @ * @param[out] pu1_dst 62 @ * output 8x8 block 63 @ * 64 @ * @param[in] src_strd 65 @ * input stride 66 @ * 67 @ * @param[in] pred_strd 68 @ * prediction stride 69 @ * 70 @ * @param[in] dst_strd 71 @ * output stride 72 @ * 73 @ * @param[in] shift 74 @ * output shift 75 @ * 76 @ * @param[in] zero_cols 77 @ * zero columns in pi2_src 78 @ * 79 @ * @returns void 80 @ * 81 @ * @remarks 82 @ * none 83 @ * 84 @ ******************************************************************************* 85 @ */ 86 87 @void ihevc_itrans_recon_8x8(word16 *pi2_src, 88 @ word16 *pi2_tmp, 89 @ uword8 *pu1_pred, 90 @ uword8 *pu1_dst, 91 @ word32 src_strd, 92 @ word32 pred_strd, 93 @ word32 dst_strd, 94 @ word32 zero_cols 95 @ word32 zero_rows ) 96 97 @**************variables vs registers************************* 98 @ r0 => *pi2_src 99 @ r1 => *pi2_tmp 100 @ r2 => *pu1_pred 101 @ r3 => *pu1_dst 102 @ src_strd 103 @ pred_strd 104 @ dst_strd 105 @ zero_cols 106 107 .equ src_stride_offset, 104 108 .equ pred_stride_offset, 108 109 .equ out_stride_offset, 112 110 .equ zero_cols_offset, 116 111 .equ zero_rows_offset, 120 112 113 114 .text 115 .align 4 116 117 118 119 120 .set width_x_size_x5 , 40 121 .set width_x_size_x2 , 32 122 .set shift_stage1_idct , 7 123 .set shift_stage2_idct , 12 124 125 .globl ihevc_itrans_recon_8x8_a9q 126 127 .extern g_ai2_ihevc_trans_8_transpose 128 129 g_ai2_ihevc_trans_8_transpose_addr: 130 .long g_ai2_ihevc_trans_8_transpose - ulbl1 - 8 131 132 .type ihevc_itrans_recon_8x8_a9q, %function 133 134 ihevc_itrans_recon_8x8_a9q: 135 @//register usage.extern - loading and until idct of columns 136 @// cosine constants - d0 137 @// sine constants - d1 138 @// row 0 first half - d2 - y0 139 @// row 1 first half - d6 - y1 140 @// row 2 first half - d3 - y2 141 @// row 3 first half - d7 - y3 142 @// row 4 first half - d10 - y4 143 @// row 5 first half - d14 - y5 144 @// row 6 first half - d11 - y6 145 @// row 7 first half - d15 - y7 146 147 @// row 0 second half - d4 - y0 148 @// row 1 second half - d8 - y1 149 @// row 2 second half - d5 - y2 150 @// row 3 second half - d9 - y3 151 @// row 4 second half - d12 - y4 152 @// row 5 second half - d16 - y5 153 @// row 6 second half - d13 - y6 154 @// row 7 second half - d17 - y7 155 156 @// copy the input pointer to another register 157 @// step 1 : load all constants 158 stmfd sp!,{r4-r12,lr} 159 vpush {d8 - d15} 160 161 ldr r8, [sp, #pred_stride_offset] @ prediction stride 162 ldr r7, [sp, #out_stride_offset] @ destination stride 163 ldr r6, [sp, #src_stride_offset] @ src stride 164 ldr r12, [sp, #zero_cols_offset] 165 ldr r11, [sp, #zero_rows_offset] 166 mov r6,r6,lsl #1 @ x sizeof(word16) 167 add r9,r0,r6, lsl #1 @ 2 rows 168 169 add r10,r6,r6, lsl #1 @ 3 rows 170 171 sub r10,r10, #8 @ - 4 cols * sizeof(word16) 172 sub r5,r6, #8 @ src_strd - 4 cols * sizeof(word16) 173 174 @ ldr r14,=g_imp4d_cxa8_idct_q15 175 ldr r14,g_ai2_ihevc_trans_8_transpose_addr 176 ulbl1: 177 add r14,r14,pc 178 vld1.16 {d0,d1},[r14] @//d0,d1 are used for storing the constant data 179 180 @//step 2 load all the input data 181 @//step 3 operate first 4 colums at a time 182 183 and r11,r11,#0xff 184 and r12,r12,#0xff 185 186 cmp r11,#0xf0 187 bge skip_last4_rows 188 189 190 vld1.16 d2,[r0]! 191 vld1.16 d3,[r9]! 192 vld1.16 d4,[r0],r5 193 vmull.s16 q10,d2,d0[0] @// y0 * cos4(part of c0 and c1) 194 vld1.16 d5,[r9],r5 195 vmull.s16 q9,d3,d1[2] @// y2 * sin2 (q3 is freed by this time)(part of d1) 196 vld1.16 d6,[r0]! 197 vld1.16 d7,[r9]! 198 vmull.s16 q12,d6,d0[1] @// y1 * cos1(part of b0) 199 vld1.16 d8,[r0],r10 200 vmull.s16 q13,d6,d0[3] @// y1 * cos3(part of b1) 201 vld1.16 d9,[r9],r10 202 vmull.s16 q14,d6,d1[1] @// y1 * sin3(part of b2) 203 vld1.16 d10,[r0]! 204 vmull.s16 q15,d6,d1[3] @// y1 * sin1(part of b3) 205 vld1.16 d11,[r9]! 206 vmlal.s16 q12,d7,d0[3] @// y1 * cos1 + y3 * cos3(part of b0) 207 vld1.16 d12,[r0],r5 208 vmlsl.s16 q13,d7,d1[3] @// y1 * cos3 - y3 * sin1(part of b1) 209 vld1.16 d13,[r9],r5 210 vmlsl.s16 q14,d7,d0[1] @// y1 * sin3 - y3 * cos1(part of b2) 211 vld1.16 d14,[r0]! 212 vmlsl.s16 q15,d7,d1[1] @// y1 * sin1 - y3 * sin3(part of b3) 213 vld1.16 d15,[r9]! 214 vmull.s16 q11,d10,d0[0] @// y4 * cos4(part of c0 and c1) 215 vld1.16 d16,[r0],r10 216 vmull.s16 q3,d3,d0[2] @// y2 * cos2(part of d0) 217 vld1.16 d17,[r9],r10 218 219 @/* this following was activated when alignment is not there */ 220 @// vld1.16 d2,[r0]! 221 @// vld1.16 d3,[r2]! 222 @// vld1.16 d4,[r0]! 223 @// vld1.16 d5,[r2]! 224 @// vld1.16 d6,[r0]! 225 @// vld1.16 d7,[r2]! 226 @// vld1.16 d8,[r0],r3 227 @// vld1.16 d9,[r2],r3 228 @// vld1.16 d10,[r0]! 229 @// vld1.16 d11,[r2]! 230 @// vld1.16 d12,[r0]! 231 @// vld1.16 d13,[r2]! 232 @// vld1.16 d14,[r0]! 233 @// vld1.16 d15,[r2]! 234 @// vld1.16 d16,[r0],r3 235 @// vld1.16 d17,[r2],r3 236 237 238 239 240 vmlal.s16 q12,d14,d1[1] @// y1 * cos1 + y3 * cos3 + y5 * sin3(part of b0) 241 vmlsl.s16 q13,d14,d0[1] @// y1 * cos3 - y3 * sin1 - y5 * cos1(part of b1) 242 vmlal.s16 q14,d14,d1[3] @// y1 * sin3 - y3 * cos1 + y5 * sin1(part of b2) 243 vmlal.s16 q15,d14,d0[3] @// y1 * sin1 - y3 * sin3 + y5 * cos3(part of b3) 244 245 vmlsl.s16 q9,d11,d0[2] @// d1 = y2 * sin2 - y6 * cos2(part of a0 and a1) 246 vmlal.s16 q3,d11,d1[2] @// d0 = y2 * cos2 + y6 * sin2(part of a0 and a1) 247 248 vadd.s32 q5,q10,q11 @// c0 = y0 * cos4 + y4 * cos4(part of a0 and a1) 249 vsub.s32 q10,q10,q11 @// c1 = y0 * cos4 - y4 * cos4(part of a0 and a1) 250 251 vmlal.s16 q12,d15,d1[3] @// b0 = y1 * cos1 + y3 * cos3 + y5 * sin3 + y7 * sin1(part of r0,r7) 252 vmlsl.s16 q13,d15,d1[1] @// b1 = y1 * cos3 - y3 * sin1 - y5 * cos1 - y7 * sin3(part of r1,r6) 253 vmlal.s16 q14,d15,d0[3] @// b2 = y1 * sin3 - y3 * cos1 + y5 * sin1 + y7 * cos3(part of r2,r5) 254 vmlsl.s16 q15,d15,d0[1] @// b3 = y1 * sin1 - y3 * sin3 + y5 * cos3 - y7 * cos1(part of r3,r4) 255 256 vadd.s32 q7,q5,q3 @// a0 = c0 + d0(part of r0,r7) 257 vsub.s32 q5,q5,q3 @// a3 = c0 - d0(part of r3,r4) 258 vsub.s32 q11,q10,q9 @// a2 = c1 - d1(part of r2,r5) 259 vadd.s32 q9,q10,q9 @// a1 = c1 + d1(part of r1,r6) 260 261 vadd.s32 q10,q7,q12 @// a0 + b0(part of r0) 262 vsub.s32 q3,q7,q12 @// a0 - b0(part of r7) 263 264 vadd.s32 q12,q11,q14 @// a2 + b2(part of r2) 265 vsub.s32 q11,q11,q14 @// a2 - b2(part of r5) 266 267 vadd.s32 q14,q9,q13 @// a1 + b1(part of r1) 268 vsub.s32 q9,q9,q13 @// a1 - b1(part of r6) 269 270 vadd.s32 q13,q5,q15 @// a3 + b3(part of r3) 271 vsub.s32 q15,q5,q15 @// a3 - b3(part of r4) 272 273 vqrshrn.s32 d2,q10,#shift_stage1_idct @// r0 = (a0 + b0 + rnd) >> 7(shift_stage1_idct) 274 vqrshrn.s32 d15,q3,#shift_stage1_idct @// r7 = (a0 - b0 + rnd) >> 7(shift_stage1_idct) 275 vqrshrn.s32 d3,q12,#shift_stage1_idct @// r2 = (a2 + b2 + rnd) >> 7(shift_stage1_idct) 276 vqrshrn.s32 d14,q11,#shift_stage1_idct @// r5 = (a2 - b2 + rnd) >> 7(shift_stage1_idct) 277 vqrshrn.s32 d6,q14,#shift_stage1_idct @// r1 = (a1 + b1 + rnd) >> 7(shift_stage1_idct) 278 vqrshrn.s32 d11,q9,#shift_stage1_idct @// r6 = (a1 - b1 + rnd) >> 7(shift_stage1_idct) 279 vqrshrn.s32 d7,q13,#shift_stage1_idct @// r3 = (a3 + b3 + rnd) >> 7(shift_stage1_idct) 280 vqrshrn.s32 d10,q15,#shift_stage1_idct @// r4 = (a3 - b3 + rnd) >> 7(shift_stage1_idct) 281 282 283 b last4_cols 284 285 286 287 skip_last4_rows: 288 289 290 291 vld1.16 d2,[r0]! 292 vld1.16 d3,[r9]! 293 vld1.16 d4,[r0],r5 294 vld1.16 d5,[r9],r5 295 vld1.16 d6,[r0]! 296 vld1.16 d7,[r9]! 297 vld1.16 d8,[r0],r10 298 vld1.16 d9,[r9],r10 299 300 301 302 vmov.s16 q6,#0 303 vmov.s16 q8,#0 304 305 306 307 308 vmull.s16 q12,d6,d0[1] @// y1 * cos1(part of b0) 309 vmull.s16 q13,d6,d0[3] @// y1 * cos3(part of b1) 310 vmull.s16 q14,d6,d1[1] @// y1 * sin3(part of b2) 311 vmull.s16 q15,d6,d1[3] @// y1 * sin1(part of b3) 312 313 vmlal.s16 q12,d7,d0[3] @// y1 * cos1 + y3 * cos3(part of b0) 314 vmlsl.s16 q13,d7,d1[3] @// y1 * cos3 - y3 * sin1(part of b1) 315 vmlsl.s16 q14,d7,d0[1] @// y1 * sin3 - y3 * cos1(part of b2) 316 vmlsl.s16 q15,d7,d1[1] @// y1 * sin1 - y3 * sin3(part of b3) 317 318 vmull.s16 q9,d3,d1[2] @// y2 * sin2 (q3 is freed by this time)(part of d1) 319 vmull.s16 q3,d3,d0[2] @// y2 * cos2(part of d0) 320 321 vmull.s16 q10,d2,d0[0] @// y0 * cos4(part of c0 and c1) 322 323 324 vadd.s32 q7,q10,q3 @// a0 = c0 + d0(part of r0,r7) 325 vsub.s32 q5,q10,q3 @// a3 = c0 - d0(part of r3,r4) 326 vsub.s32 q11,q10,q9 @// a2 = c1 - d1(part of r2,r5) 327 vadd.s32 q9,q10,q9 @// a1 = c1 + d1(part of r1,r6) 328 329 vadd.s32 q10,q7,q12 @// a0 + b0(part of r0) 330 vsub.s32 q3,q7,q12 @// a0 - b0(part of r7) 331 332 vadd.s32 q12,q11,q14 @// a2 + b2(part of r2) 333 vsub.s32 q11,q11,q14 @// a2 - b2(part of r5) 334 335 vadd.s32 q14,q9,q13 @// a1 + b1(part of r1) 336 vsub.s32 q9,q9,q13 @// a1 - b1(part of r6) 337 338 vadd.s32 q13,q5,q15 @// a3 + b3(part of r3) 339 vsub.s32 q15,q5,q15 @// a3 - b3(part of r4) 340 341 vqrshrn.s32 d2,q10,#shift_stage1_idct @// r0 = (a0 + b0 + rnd) >> 7(shift_stage1_idct) 342 vqrshrn.s32 d15,q3,#shift_stage1_idct @// r7 = (a0 - b0 + rnd) >> 7(shift_stage1_idct) 343 vqrshrn.s32 d3,q12,#shift_stage1_idct @// r2 = (a2 + b2 + rnd) >> 7(shift_stage1_idct) 344 vqrshrn.s32 d14,q11,#shift_stage1_idct @// r5 = (a2 - b2 + rnd) >> 7(shift_stage1_idct) 345 vqrshrn.s32 d6,q14,#shift_stage1_idct @// r1 = (a1 + b1 + rnd) >> 7(shift_stage1_idct) 346 vqrshrn.s32 d11,q9,#shift_stage1_idct @// r6 = (a1 - b1 + rnd) >> 7(shift_stage1_idct) 347 vqrshrn.s32 d7,q13,#shift_stage1_idct @// r3 = (a3 + b3 + rnd) >> 7(shift_stage1_idct) 348 vqrshrn.s32 d10,q15,#shift_stage1_idct @// r4 = (a3 - b3 + rnd) >> 7(shift_stage1_idct) 349 350 351 last4_cols: 352 353 354 cmp r12,#0xf0 355 bge skip_last4cols 356 357 vmull.s16 q12,d8,d0[1] @// y1 * cos1(part of b0) 358 vmull.s16 q13,d8,d0[3] @// y1 * cos3(part of b1) 359 vmull.s16 q14,d8,d1[1] @// y1 * sin3(part of b2) 360 vmull.s16 q15,d8,d1[3] @// y1 * sin1(part of b3) 361 362 vmlal.s16 q12,d9,d0[3] @// y1 * cos1 + y3 * cos3(part of b0) 363 vmlsl.s16 q13,d9,d1[3] @// y1 * cos3 - y3 * sin1(part of b1) 364 vmlsl.s16 q14,d9,d0[1] @// y1 * sin3 - y3 * cos1(part of b2) 365 vmlsl.s16 q15,d9,d1[1] @// y1 * sin1 - y3 * sin3(part of b3) 366 367 vmull.s16 q9,d5,d1[2] @// y2 * sin2 (q4 is freed by this time)(part of d1) 368 vmull.s16 q4,d5,d0[2] @// y2 * cos2(part of d0) 369 370 vmull.s16 q10,d4,d0[0] @// y0 * cos4(part of c0 and c1) 371 vmull.s16 q11,d12,d0[0] @// y4 * cos4(part of c0 and c1) 372 373 vmlal.s16 q12,d16,d1[1] @// y1 * cos1 + y3 * cos3 + y5 * sin3(part of b0) 374 vmlsl.s16 q13,d16,d0[1] @// y1 * cos3 - y3 * sin1 - y5 * cos1(part of b1) 375 vmlal.s16 q14,d16,d1[3] @// y1 * sin3 - y3 * cos1 + y5 * sin1(part of b2) 376 vmlal.s16 q15,d16,d0[3] @// y1 * sin1 - y3 * sin3 + y5 * cos3(part of b3) 377 378 vmlsl.s16 q9,d13,d0[2] @// d1 = y2 * sin2 - y6 * cos2(part of a0 and a1) 379 vmlal.s16 q4,d13,d1[2] @// d0 = y2 * cos2 + y6 * sin2(part of a0 and a1) 380 381 vadd.s32 q6,q10,q11 @// c0 = y0 * cos4 + y4 * cos4(part of a0 and a1) 382 vsub.s32 q10,q10,q11 @// c1 = y0 * cos4 - y4 * cos4(part of a0 and a1) 383 384 vmlal.s16 q12,d17,d1[3] @// b0 = y1 * cos1 + y3 * cos3 + y5 * sin3 + y7 * sin1(part of e0,e7) 385 vmlsl.s16 q13,d17,d1[1] @// b1 = y1 * cos3 - y3 * sin1 - y5 * cos1 - y7 * sin3(part of e1,e6) 386 vmlal.s16 q14,d17,d0[3] @// b2 = y1 * sin3 - y3 * cos1 + y5 * sin1 + y7 * cos3(part of e2,e5) 387 vmlsl.s16 q15,d17,d0[1] @// b3 = y1 * sin1 - y3 * sin3 + y5 * cos3 - y7 * cos1(part of e3,e4) 388 389 vadd.s32 q8,q6,q4 @// a0 = c0 + d0(part of e0,e7) 390 vsub.s32 q6,q6,q4 @// a3 = c0 - d0(part of e3,e4) 391 vsub.s32 q11,q10,q9 @// a2 = c1 - d1(part of e2,e5) 392 vadd.s32 q9,q10,q9 @// a1 = c1 + d1(part of e1,e6) 393 394 vadd.s32 q10,q8,q12 @// a0 + b0(part of e0) 395 vsub.s32 q4,q8,q12 @// a0 - b0(part of e7) 396 397 vadd.s32 q12,q11,q14 @// a2 + b2(part of e2) 398 vsub.s32 q11,q11,q14 @// a2 - b2(part of e5) 399 400 vadd.s32 q14,q9,q13 @// a1 + b1(part of e1) 401 vsub.s32 q9,q9,q13 @// a1 - b1(part of e6) 402 403 vadd.s32 q13,q6,q15 @// a3 + b3(part of e3) 404 vsub.s32 q15,q6,q15 @// a3 - b3(part of r4) 405 406 vqrshrn.s32 d4,q10,#shift_stage1_idct @// r0 = (a0 + b0 + rnd) >> 7(shift_stage1_idct) 407 vqrshrn.s32 d17,q4,#shift_stage1_idct @// r7 = (a0 - b0 + rnd) >> 7(shift_stage1_idct) 408 vqrshrn.s32 d5,q12,#shift_stage1_idct @// r2 = (a2 + b2 + rnd) >> 7(shift_stage1_idct) 409 vqrshrn.s32 d16,q11,#shift_stage1_idct @// r5 = (a2 - b2 + rnd) >> 7(shift_stage1_idct) 410 vqrshrn.s32 d8,q14,#shift_stage1_idct @// r1 = (a1 + b1 + rnd) >> 7(shift_stage1_idct) 411 vqrshrn.s32 d13,q9,#shift_stage1_idct @// r6 = (a1 - b1 + rnd) >> 7(shift_stage1_idct) 412 vqrshrn.s32 d9,q13,#shift_stage1_idct @// r3 = (a3 + b3 + rnd) >> 7(shift_stage1_idct) 413 vqrshrn.s32 d12,q15,#shift_stage1_idct @// r4 = (a3 - b3 + rnd) >> 7(shift_stage1_idct) 414 b end_skip_last4cols 415 416 417 418 skip_last4cols: 419 420 421 422 423 424 425 vtrn.16 q1,q3 @//[r3,r1],[r2,r0] first qudrant transposing 426 427 vtrn.16 q5,q7 @//[r7,r5],[r6,r4] third qudrant transposing 428 429 430 vtrn.32 d6,d7 @//r0,r1,r2,r3 first qudrant transposing continued..... 431 vtrn.32 d2,d3 @//r0,r1,r2,r3 first qudrant transposing continued..... 432 433 vtrn.32 d10,d11 @//r4,r5,r6,r7 third qudrant transposing continued..... 434 vtrn.32 d14,d15 @//r4,r5,r6,r7 third qudrant transposing continued..... 435 436 437 vmull.s16 q12,d6,d0[1] @// y1 * cos1(part of b0) 438 vmull.s16 q13,d6,d0[3] @// y1 * cos3(part of b1) 439 vmull.s16 q14,d6,d1[1] @// y1 * sin3(part of b2) 440 vmull.s16 q15,d6,d1[3] @// y1 * sin1(part of b3) 441 442 vmlal.s16 q12,d7,d0[3] @// y1 * cos1 + y3 * cos3(part of b0) 443 vmlsl.s16 q13,d7,d1[3] @// y1 * cos3 - y3 * sin1(part of b1) 444 vmlsl.s16 q14,d7,d0[1] @// y1 * sin3 - y3 * cos1(part of b2) 445 vmlsl.s16 q15,d7,d1[1] @// y1 * sin1 - y3 * sin3(part of b3) 446 447 vmull.s16 q10,d2,d0[0] @// y0 * cos4(part of c0 and c1) 448 @ vmull.s16 q11,d4,d0[0] @// y4 * cos4(part of c0 and c1) 449 450 vmull.s16 q9,d3,d1[2] @// y2 * sin2 (q3 is freed by this time)(part of d1) 451 vmull.s16 q3,d3,d0[2] @// y2 * cos2(part of d0) 452 453 454 455 456 vsub.s32 q11,q10,q3 @// a3 = c0 - d0(part of r3,r4) 457 vadd.s32 q2,q10,q3 @// a0 = c0 + d0(part of r0,r7) 458 459 460 vadd.s32 q1,q2,q12 461 462 vsub.s32 q3,q2,q12 463 464 vadd.s32 q4,q11,q15 465 466 vsub.s32 q12,q11,q15 467 468 vqrshrn.s32 d5,q4,#shift_stage2_idct 469 vqrshrn.s32 d2,q1,#shift_stage2_idct 470 vqrshrn.s32 d9,q3,#shift_stage2_idct 471 vqrshrn.s32 d6,q12,#shift_stage2_idct 472 473 vsub.s32 q11,q10,q9 @// a2 = c1 - d1(part of r2,r5) 474 vadd.s32 q9,q10,q9 @// a1 = c1 + d1(part of r1,r6) 475 476 477 vadd.s32 q15,q11,q14 478 479 vsub.s32 q12,q11,q14 480 481 vadd.s32 q14,q9,q13 482 483 vsub.s32 q11,q9,q13 484 vqrshrn.s32 d4,q15,#shift_stage2_idct 485 vqrshrn.s32 d7,q12,#shift_stage2_idct 486 vqrshrn.s32 d3,q14,#shift_stage2_idct 487 vqrshrn.s32 d8,q11,#shift_stage2_idct 488 489 490 491 492 493 494 495 496 497 498 vmull.s16 q12,d14,d0[1] @// y1 * cos1(part of b0) 499 500 vmull.s16 q13,d14,d0[3] @// y1 * cos3(part of b1) 501 vmull.s16 q14,d14,d1[1] @// y1 * sin3(part of b2) 502 vmull.s16 q15,d14,d1[3] @// y1 * sin1(part of b3) 503 504 vmlal.s16 q12,d15,d0[3] @// y1 * cos1 + y3 * cos3(part of b0) 505 vtrn.16 d2,d3 506 vmlsl.s16 q13,d15,d1[3] @// y1 * cos3 - y3 * sin1(part of b1) 507 vtrn.16 d4,d5 508 vmlsl.s16 q14,d15,d0[1] @// y1 * sin3 - y3 * cos1(part of b2) 509 vtrn.16 d6,d7 510 vmlsl.s16 q15,d15,d1[1] @// y1 * sin1 - y3 * sin3(part of b3) 511 vtrn.16 d8,d9 512 vmull.s16 q10,d10,d0[0] @// y0 * cos4(part of c0 and c1) 513 vtrn.32 d2,d4 514 515 vtrn.32 d3,d5 516 vmull.s16 q9,d11,d1[2] @// y2 * sin2 (q7 is freed by this time)(part of d1) 517 vtrn.32 d6,d8 518 vmull.s16 q7,d11,d0[2] @// y2 * cos2(part of d0) 519 vtrn.32 d7,d9 520 521 522 add r4,r2,r8, lsl #1 @ r4 = r2 + pred_strd * 2 => r4 points to 3rd row of pred data 523 524 525 add r5,r8,r8, lsl #1 @ 526 527 528 add r0,r3,r7, lsl #1 @ r0 points to 3rd row of dest data 529 530 531 add r10,r7,r7, lsl #1 @ 532 533 534 vswp d3,d6 535 536 537 vswp d5,d8 538 539 540 vsub.s32 q11,q10,q7 @// a3 = c0 - d0(part of r3,r4) 541 vadd.s32 q6,q10,q7 @// a0 = c0 + d0(part of r0,r7) 542 543 544 vadd.s32 q0,q6,q12 545 546 547 vsub.s32 q12,q6,q12 548 549 550 vadd.s32 q6,q11,q15 551 552 553 vsub.s32 q7,q11,q15 554 555 vqrshrn.s32 d10,q0,#shift_stage2_idct 556 vqrshrn.s32 d17,q12,#shift_stage2_idct 557 vqrshrn.s32 d13,q6,#shift_stage2_idct 558 vqrshrn.s32 d14,q7,#shift_stage2_idct 559 560 vsub.s32 q11,q10,q9 @// a2 = c1 - d1(part of r2,r5) 561 vadd.s32 q9,q10,q9 @// a1 = c1 + d1(part of r1,r6) 562 563 564 vadd.s32 q0,q11,q14 565 566 567 vsub.s32 q12,q11,q14 568 569 570 vadd.s32 q14,q9,q13 571 572 573 vsub.s32 q13,q9,q13 574 vld1.8 d18,[r2],r8 575 576 vqrshrn.s32 d12,q0,#shift_stage2_idct 577 vld1.8 d20,[r2],r5 578 579 580 vqrshrn.s32 d15,q12,#shift_stage2_idct 581 vld1.8 d19,[r2],r8 582 583 584 585 586 vqrshrn.s32 d11,q14,#shift_stage2_idct 587 vld1.8 d22,[r4],r8 588 589 590 591 592 vqrshrn.s32 d16,q13,#shift_stage2_idct 593 vld1.8 d21,[r2],r5 594 595 596 b pred_buff_addition 597 end_skip_last4cols: 598 599 600 601 @/* now the idct of columns is done, transpose so that row idct done efficiently(step5) */ 602 vtrn.16 q1,q3 @//[r3,r1],[r2,r0] first qudrant transposing 603 vtrn.16 q2,q4 @//[r3,r1],[r2,r0] second qudrant transposing 604 vtrn.16 q5,q7 @//[r7,r5],[r6,r4] third qudrant transposing 605 vtrn.16 q6,q8 @//[r7,r5],[r6,r4] fourth qudrant transposing 606 607 vtrn.32 d6,d7 @//r0,r1,r2,r3 first qudrant transposing continued..... 608 vtrn.32 d2,d3 @//r0,r1,r2,r3 first qudrant transposing continued..... 609 vtrn.32 d4,d5 @//r0,r1,r2,r3 second qudrant transposing continued..... 610 vtrn.32 d8,d9 @//r0,r1,r2,r3 second qudrant transposing continued..... 611 vtrn.32 d10,d11 @//r4,r5,r6,r7 third qudrant transposing continued..... 612 vtrn.32 d14,d15 @//r4,r5,r6,r7 third qudrant transposing continued..... 613 vtrn.32 d12,d13 @//r4,r5,r6,r7 fourth qudrant transposing continued..... 614 vtrn.32 d16,d17 @//r4,r5,r6,r7 fourth qudrant transposing continued..... 615 616 @//step6 operate on first four rows and find their idct 617 @//register usage.extern - storing and idct of rows 618 @// cosine constants - d0 619 @// sine constants - d1 620 @// element 0 first four - d2 - y0 621 @// element 1 first four - d6 - y1 622 @// element 2 first four - d3 - y2 623 @// element 3 first four - d7 - y3 624 @// element 4 first four - d4 - y4 625 @// element 5 first four - d8 - y5 626 @// element 6 first four - d5 - y6 627 @// element 7 first four - d9 - y7 628 @// element 0 second four - d10 - y0 629 @// element 1 second four - d14 - y1 630 @// element 2 second four - d11 - y2 631 @// element 3 second four - d15 - y3 632 @// element 4 second four - d12 - y4 633 @// element 5 second four - d16 - y5 634 @// element 6 second four - d13 - y6 635 @// element 7 second four - d17 - y7 636 637 @// map between first kernel code seq and current 638 @// d2 -> d2 639 @// d6 -> d6 640 @// d3 -> d3 641 @// d7 -> d7 642 @// d10 -> d4 643 @// d14 -> d8 644 @// d11 -> d5 645 @// d15 -> d9 646 @// q3 -> q3 647 @// q5 -> q2 648 @// q7 -> q4 649 650 vmull.s16 q12,d6,d0[1] @// y1 * cos1(part of b0) 651 vmull.s16 q13,d6,d0[3] @// y1 * cos3(part of b1) 652 vmull.s16 q14,d6,d1[1] @// y1 * sin3(part of b2) 653 vmull.s16 q15,d6,d1[3] @// y1 * sin1(part of b3) 654 655 vmlal.s16 q12,d7,d0[3] @// y1 * cos1 + y3 * cos3(part of b0) 656 vmlsl.s16 q13,d7,d1[3] @// y1 * cos3 - y3 * sin1(part of b1) 657 vmlsl.s16 q14,d7,d0[1] @// y1 * sin3 - y3 * cos1(part of b2) 658 vmlsl.s16 q15,d7,d1[1] @// y1 * sin1 - y3 * sin3(part of b3) 659 660 vmull.s16 q10,d2,d0[0] @// y0 * cos4(part of c0 and c1) 661 vmull.s16 q11,d4,d0[0] @// y4 * cos4(part of c0 and c1) 662 663 vmull.s16 q9,d3,d1[2] @// y2 * sin2 (q3 is freed by this time)(part of d1) 664 vmull.s16 q3,d3,d0[2] @// y2 * cos2(part of d0) 665 666 667 vmlal.s16 q12,d8,d1[1] @// y1 * cos1 + y3 * cos3 + y5 * sin3(part of b0) 668 vmlsl.s16 q13,d8,d0[1] @// y1 * cos3 - y3 * sin1 - y5 * cos1(part of b1) 669 vmlal.s16 q14,d8,d1[3] @// y1 * sin3 - y3 * cos1 + y5 * sin1(part of b2) 670 vmlal.s16 q15,d8,d0[3] @// y1 * sin1 - y3 * sin3 + y5 * cos3(part of b3) 671 672 vmlsl.s16 q9,d5,d0[2] @// d1 = y2 * sin2 - y6 * cos2(part of a0 and a1) 673 vmlal.s16 q3,d5,d1[2] @// d0 = y2 * cos2 + y6 * sin2(part of a0 and a1) 674 675 vadd.s32 q1,q10,q11 @// c0 = y0 * cos4 + y4 * cos4(part of a0 and a1) 676 vsub.s32 q10,q10,q11 @// c1 = y0 * cos4 - y4 * cos4(part of a0 and a1) 677 678 vmlal.s16 q12,d9,d1[3] @// b0 = y1 * cos1 + y3 * cos3 + y5 * sin3 + y7 * sin1(part of r0,r7) 679 vmlsl.s16 q13,d9,d1[1] @// b1 = y1 * cos3 - y3 * sin1 - y5 * cos1 - y7 * sin3(part of r1,r6) 680 vmlal.s16 q14,d9,d0[3] @// b2 = y1 * sin3 - y3 * cos1 + y5 * sin1 + y7 * cos3(part of r2,r5) 681 vmlsl.s16 q15,d9,d0[1] @// b3 = y1 * sin1 - y3 * sin3 + y5 * cos3 - y7 * cos1(part of r3,r4) 682 683 vsub.s32 q11,q1,q3 @// a3 = c0 - d0(part of r3,r4) 684 vadd.s32 q2,q1,q3 @// a0 = c0 + d0(part of r0,r7) 685 686 687 vadd.s32 q1,q2,q12 688 689 vsub.s32 q3,q2,q12 690 691 vadd.s32 q4,q11,q15 692 693 vsub.s32 q12,q11,q15 694 695 vqrshrn.s32 d5,q4,#shift_stage2_idct 696 vqrshrn.s32 d2,q1,#shift_stage2_idct 697 vqrshrn.s32 d9,q3,#shift_stage2_idct 698 vqrshrn.s32 d6,q12,#shift_stage2_idct 699 700 vsub.s32 q11,q10,q9 @// a2 = c1 - d1(part of r2,r5) 701 vadd.s32 q9,q10,q9 @// a1 = c1 + d1(part of r1,r6) 702 703 704 vadd.s32 q15,q11,q14 705 706 vsub.s32 q12,q11,q14 707 708 vadd.s32 q14,q9,q13 709 710 vsub.s32 q11,q9,q13 711 vqrshrn.s32 d4,q15,#shift_stage2_idct 712 vqrshrn.s32 d7,q12,#shift_stage2_idct 713 vqrshrn.s32 d3,q14,#shift_stage2_idct 714 vqrshrn.s32 d8,q11,#shift_stage2_idct 715 716 717 718 719 720 721 722 723 724 725 vmull.s16 q12,d14,d0[1] @// y1 * cos1(part of b0) 726 727 vmull.s16 q13,d14,d0[3] @// y1 * cos3(part of b1) 728 vmull.s16 q14,d14,d1[1] @// y1 * sin3(part of b2) 729 vmull.s16 q15,d14,d1[3] @// y1 * sin1(part of b3) 730 731 vmlal.s16 q12,d15,d0[3] @// y1 * cos1 + y3 * cos3(part of b0) 732 vtrn.16 d2,d3 733 vmlsl.s16 q13,d15,d1[3] @// y1 * cos3 - y3 * sin1(part of b1) 734 vtrn.16 d4,d5 735 vmlsl.s16 q14,d15,d0[1] @// y1 * sin3 - y3 * cos1(part of b2) 736 vtrn.16 d6,d7 737 vmlsl.s16 q15,d15,d1[1] @// y1 * sin1 - y3 * sin3(part of b3) 738 vtrn.16 d8,d9 739 vmull.s16 q10,d10,d0[0] @// y0 * cos4(part of c0 and c1) 740 vtrn.32 d2,d4 741 vmull.s16 q11,d12,d0[0] @// y4 * cos4(part of c0 and c1) 742 vtrn.32 d3,d5 743 vmull.s16 q9,d11,d1[2] @// y2 * sin2 (q7 is freed by this time)(part of d1) 744 vtrn.32 d6,d8 745 vmull.s16 q7,d11,d0[2] @// y2 * cos2(part of d0) 746 vtrn.32 d7,d9 747 vmlal.s16 q12,d16,d1[1] @// y1 * cos1 + y3 * cos3 + y5 * sin3(part of b0) 748 749 add r4,r2,r8, lsl #1 @ r4 = r2 + pred_strd * 2 => r4 points to 3rd row of pred data 750 vmlsl.s16 q13,d16,d0[1] @// y1 * cos3 - y3 * sin1 - y5 * cos1(part of b1) 751 752 add r5,r8,r8, lsl #1 @ 753 vmlal.s16 q14,d16,d1[3] @// y1 * sin3 - y3 * cos1 + y5 * sin1(part of b2) 754 755 add r0,r3,r7, lsl #1 @ r0 points to 3rd row of dest data 756 vmlal.s16 q15,d16,d0[3] @// y1 * sin1 - y3 * sin3 + y5 * cos3(part of b3) 757 758 add r10,r7,r7, lsl #1 @ 759 vmlsl.s16 q9,d13,d0[2] @// d1 = y2 * sin2 - y6 * cos2(part of a0 and a1) 760 761 762 vmlal.s16 q7,d13,d1[2] @// d0 = y2 * cos2 + y6 * sin2(part of a0 and a1) 763 764 vadd.s32 q6,q10,q11 @// c0 = y0 * cos4 + y4 * cos4(part of a0 and a1) 765 vsub.s32 q10,q10,q11 @// c1 = y0 * cos4 - y4 * cos4(part of a0 and a1) 766 767 vmlal.s16 q12,d17,d1[3] @// b0 = y1 * cos1 + y3 * cos3 + y5 * sin3 + y7 * sin1(part of r0,r7) 768 vswp d3,d6 769 vmlsl.s16 q13,d17,d1[1] @// b1 = y1 * cos3 - y3 * sin1 - y5 * cos1 - y7 * sin3(part of r1,r6) 770 771 vswp d5,d8 772 vmlal.s16 q14,d17,d0[3] @// b2 = y1 * sin3 - y3 * cos1 + y5 * sin1 + y7 * cos3(part of r2,r5) 773 vmlsl.s16 q15,d17,d0[1] @// b3 = y1 * sin1 - y3 * sin3 + y5 * cos3 - y7 * cos1(part of r3,r4) 774 775 vsub.s32 q11,q6,q7 @// a3 = c0 - d0(part of r3,r4) 776 vadd.s32 q6,q6,q7 @// a0 = c0 + d0(part of r0,r7) 777 778 779 vadd.s32 q0,q6,q12 780 781 782 vsub.s32 q12,q6,q12 783 784 785 vadd.s32 q6,q11,q15 786 787 788 vsub.s32 q7,q11,q15 789 790 vqrshrn.s32 d10,q0,#shift_stage2_idct 791 vqrshrn.s32 d17,q12,#shift_stage2_idct 792 vqrshrn.s32 d13,q6,#shift_stage2_idct 793 vqrshrn.s32 d14,q7,#shift_stage2_idct 794 795 vsub.s32 q11,q10,q9 @// a2 = c1 - d1(part of r2,r5) 796 vadd.s32 q9,q10,q9 @// a1 = c1 + d1(part of r1,r6) 797 798 799 vadd.s32 q0,q11,q14 800 801 802 vsub.s32 q12,q11,q14 803 804 805 vadd.s32 q14,q9,q13 806 807 808 vsub.s32 q13,q9,q13 809 vld1.8 d18,[r2],r8 810 811 vqrshrn.s32 d12,q0,#shift_stage2_idct 812 vld1.8 d20,[r2],r5 813 814 815 vqrshrn.s32 d15,q12,#shift_stage2_idct 816 vld1.8 d19,[r2],r8 817 818 819 820 821 vqrshrn.s32 d11,q14,#shift_stage2_idct 822 vld1.8 d22,[r4],r8 823 824 825 826 827 vqrshrn.s32 d16,q13,#shift_stage2_idct 828 vld1.8 d21,[r2],r5 829 830 831 832 833 pred_buff_addition: 834 835 836 vtrn.16 d10,d11 837 vld1.8 d24,[r4],r5 838 839 vtrn.16 d12,d13 840 vld1.8 d23,[r4],r8 841 842 vaddw.u8 q1,q1,d18 843 vld1.8 d25,[r4],r5 844 845 vtrn.16 d14,d15 846 vaddw.u8 q2,q2,d22 847 848 vtrn.16 d16,d17 849 vaddw.u8 q3,q3,d20 850 851 vtrn.32 d10,d12 852 vaddw.u8 q4,q4,d24 853 854 vtrn.32 d11,d13 855 vtrn.32 d14,d16 856 vtrn.32 d15,d17 857 858 vswp d11,d14 859 vswp d13,d16 860 861 @ row values stored in the q register. 862 863 @q1 :r0 864 @q3: r1 865 @q2: r2 866 @q4: r3 867 @q5: r4 868 @q7: r5 869 @q6: r6 870 @q8: r7 871 872 873 874 @/// adding the prediction buffer 875 876 877 878 879 880 881 882 883 884 @ load prediction data 885 886 887 888 889 890 @adding recon with prediction 891 892 893 894 895 896 vaddw.u8 q5,q5,d19 897 vqmovun.s16 d2,q1 898 vaddw.u8 q7,q7,d21 899 vqmovun.s16 d4,q2 900 vaddw.u8 q6,q6,d23 901 vqmovun.s16 d6,q3 902 vaddw.u8 q8,q8,d25 903 vqmovun.s16 d8,q4 904 905 906 907 908 909 910 911 vst1.8 {d2},[r3],r7 912 vqmovun.s16 d10,q5 913 vst1.8 {d6},[r3],r10 914 vqmovun.s16 d14,q7 915 vst1.8 {d4},[r0],r7 916 vqmovun.s16 d12,q6 917 vst1.8 {d8},[r0],r10 918 vqmovun.s16 d16,q8 919 920 921 922 923 924 925 926 vst1.8 {d10},[r3],r7 927 vst1.8 {d14},[r3],r10 928 vst1.8 {d12},[r0],r7 929 vst1.8 {d16},[r0],r10 930 931 932 933 934 vpop {d8 - d15} 935 ldmfd sp!,{r4-r12,pc} 936 937 938 939 940 941