mdctARM.s revision 0f6f2525f7b19c7de18bafe464b5ced1c714430a
1@ Tremolo library 2@ Copyright (C) 2009 Robin Watts for Pinknoise Productions Ltd 3 4 .text 5 6 @ full accuracy version 7 8 .global mdct_backwardARM 9 .global mdct_shift_right 10 .global mdct_unroll_prelap 11 .global mdct_unroll_part2 12 .global mdct_unroll_part3 13 .global mdct_unroll_postlap 14 15 .extern sincos_lookup0 16 .extern sincos_lookup1 17 18mdct_unroll_prelap: 19 @ r0 = out 20 @ r1 = post 21 @ r2 = r 22 @ r3 = step 23 STMFD r13!,{r4-r7,r14} 24 MVN r4, #0x8000 25 MOV r3, r3, LSL #1 26 SUB r1, r2, r1 @ r1 = r - post 27 SUBS r1, r1, #16 @ r1 = r - post - 16 28 BLT unroll_over 29unroll_loop: 30 LDMDB r2!,{r5,r6,r7,r12} 31 32 MOV r5, r5, ASR #9 @ r5 = (*--r)>>9 33 MOV r6, r6, ASR #9 @ r6 = (*--r)>>9 34 MOV r7, r7, ASR #9 @ r7 = (*--r)>>9 35 MOV r12,r12,ASR #9 @ r12= (*--r)>>9 36 37 MOV r14,r12,ASR #15 38 TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range 39 EORNE r12,r4, r14,ASR #31 40 STRH r12,[r0], r3 41 42 MOV r14,r7, ASR #15 43 TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range 44 EORNE r7, r4, r14,ASR #31 45 STRH r7, [r0], r3 46 47 MOV r14,r6, ASR #15 48 TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range 49 EORNE r6, r4, r14,ASR #31 50 STRH r6, [r0], r3 51 52 MOV r14,r5, ASR #15 53 TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range 54 EORNE r5, r4, r14,ASR #31 55 STRH r5, [r0], r3 56 57 SUBS r1, r1, #16 58 BGE unroll_loop 59 60unroll_over: 61 ADDS r1, r1, #16 62 BLE unroll_end 63unroll_loop2: 64 LDR r5,[r2,#-4]! 65 @ stall 66 @ stall (Xscale) 67 MOV r5, r5, ASR #9 @ r5 = (*--r)>>9 68 MOV r14,r5, ASR #15 69 TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range 70 EORNE r5, r4, r14,ASR #31 71 STRH r5, [r0], r3 72 SUBS r1, r1, #4 73 BGT unroll_loop2 74unroll_end: 75 LDMFD r13!,{r4-r7,PC} 76 77mdct_unroll_postlap: 78 @ r0 = out 79 @ r1 = post 80 @ r2 = l 81 @ r3 = step 82 STMFD r13!,{r4-r7,r14} 83 MVN r4, #0x8000 84 MOV r3, r3, LSL #1 85 SUB r1, r1, r2 @ r1 = post - l 86 MOV r1, r1, ASR #1 @ r1 = (post - l)>>1 87 SUBS r1, r1, #16 @ r1 = ((post - l)>>1) - 4 88 BLT unroll_over3 89unroll_loop3: 90 LDR r12,[r2],#8 91 LDR r7, [r2],#8 92 LDR r6, [r2],#8 93 LDR r5, [r2],#8 94 95 RSB r12,r12,#0 96 RSB r5, r5, #0 97 RSB r6, r6, #0 98 RSB r7, r7, #0 99 100 MOV r12, r12,ASR #9 @ r12= (-*l)>>9 101 MOV r5, r5, ASR #9 @ r5 = (-*l)>>9 102 MOV r6, r6, ASR #9 @ r6 = (-*l)>>9 103 MOV r7, r7, ASR #9 @ r7 = (-*l)>>9 104 105 MOV r14,r12,ASR #15 106 TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range 107 EORNE r12,r4, r14,ASR #31 108 STRH r12,[r0], r3 109 110 MOV r14,r7, ASR #15 111 TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range 112 EORNE r7, r4, r14,ASR #31 113 STRH r7, [r0], r3 114 115 MOV r14,r6, ASR #15 116 TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range 117 EORNE r6, r4, r14,ASR #31 118 STRH r6, [r0], r3 119 120 MOV r14,r5, ASR #15 121 TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range 122 EORNE r5, r4, r14,ASR #31 123 STRH r5, [r0], r3 124 125 SUBS r1, r1, #16 126 BGE unroll_loop3 127 128unroll_over3: 129 ADDS r1, r1, #16 130 BLE unroll_over4 131unroll_loop4: 132 LDR r5,[r2], #8 133 @ stall 134 @ stall (Xscale) 135 RSB r5, r5, #0 136 MOV r5, r5, ASR #9 @ r5 = (-*l)>>9 137 MOV r14,r5, ASR #15 138 TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range 139 EORNE r5, r4, r14,ASR #31 140 STRH r5, [r0], r3 141 SUBS r1, r1, #4 142 BGT unroll_loop4 143unroll_over4: 144 LDMFD r13!,{r4-r7,PC} 145 146mdct_unroll_part2: 147 @ r0 = out 148 @ r1 = post 149 @ r2 = l 150 @ r3 = r 151 @ <> = step 152 @ <> = wL 153 @ <> = wR 154 MOV r12,r13 155 STMFD r13!,{r4,r6-r11,r14} 156 LDMFD r12,{r8,r9,r10} @ r8 = step 157 @ r9 = wL 158 @ r10= wR 159 MVN r4, #0x8000 160 MOV r8, r8, LSL #1 161 SUBS r1, r3, r1 @ r1 = (r - post) 162 BLE unroll_over5 163unroll_loop5: 164 LDR r12,[r2, #-8]! @ r12= *l (but l -= 2 first) 165 LDR r11,[r9],#4 @ r11= *wL++ 166 LDR r7, [r3, #-4]! @ r7 = *--r 167 LDR r6, [r10,#-4]! @ r6 = *--wR 168 169 @ Can save a cycle here, at the cost of 1bit errors in rounding 170 SMULL r14,r11,r12,r11 @ (r14,r11) = *l * *wL++ 171 SMULL r14,r6, r7, r6 @ (r14,r6) = *--r * *--wR 172 ADD r6, r6, r11 173 MOV r6, r6, ASR #8 174 MOV r14,r6, ASR #15 175 TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range 176 EORNE r6, r4, r14,ASR #31 177 STRH r6, [r0], r8 178 179 SUBS r1, r1, #4 180 BGT unroll_loop5 181 182unroll_over5: 183 LDMFD r13!,{r4,r6-r11,PC} 184 185mdct_unroll_part3: 186 @ r0 = out 187 @ r1 = post 188 @ r2 = l 189 @ r3 = r 190 @ <> = step 191 @ <> = wL 192 @ <> = wR 193 MOV r12,r13 194 STMFD r13!,{r4,r6-r11,r14} 195 LDMFD r12,{r8,r9,r10} @ r8 = step 196 @ r9 = wL 197 @ r10= wR 198 MVN r4, #0x8000 199 MOV r8, r8, LSL #1 200 SUBS r1, r1, r3 @ r1 = (post - r) 201 BLE unroll_over6 202unroll_loop6: 203 LDR r12,[r2],#8 @ r12= *l (but l += 2 first) 204 LDR r11,[r9],#4 @ r11= *wL++ 205 LDR r7, [r3],#4 @ r7 = *r++ 206 LDR r6, [r10,#-4]! @ r6 = *--wR 207 208 @ Can save a cycle here, at the cost of 1bit errors in rounding 209 SMULL r14,r11,r12,r11 @ (r14,r11) = *l * *wL++ 210 SMULL r14,r6, r7, r6 @ (r14,r6) = *--r * *--wR 211 SUB r6, r6, r11 212 MOV r6, r6, ASR #8 213 MOV r14,r6, ASR #15 214 TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range 215 EORNE r6, r4, r14,ASR #31 216 STRH r6, [r0], r8 217 218 SUBS r1, r1, #4 219 BGT unroll_loop6 220 221unroll_over6: 222 LDMFD r13!,{r4,r6-r11,PC} 223 224mdct_shift_right: 225 @ r0 = n 226 @ r1 = in 227 @ r2 = right 228 STMFD r13!,{r4-r11,r14} 229 230 MOV r0, r0, LSR #2 @ n >>= 2 231 ADD r1, r1, #4 232 233 SUBS r0, r0, #8 234 BLT sr_less_than_8 235sr_loop: 236 LDR r3, [r1], #8 237 LDR r4, [r1], #8 238 LDR r5, [r1], #8 239 LDR r6, [r1], #8 240 LDR r7, [r1], #8 241 LDR r8, [r1], #8 242 LDR r12,[r1], #8 243 LDR r14,[r1], #8 244 SUBS r0, r0, #8 245 STMIA r2!,{r3,r4,r5,r6,r7,r8,r12,r14} 246 BGE sr_loop 247sr_less_than_8: 248 ADDS r0, r0, #8 249 BEQ sr_end 250sr_loop2: 251 LDR r3, [r1], #8 252 SUBS r0, r0, #1 253 STR r3, [r2], #4 254 BGT sr_loop2 255sr_end: 256 LDMFD r13!,{r4-r11,PC} 257 258mdct_backwardARM: 259 @ r0 = n 260 @ r1 = in 261 STMFD r13!,{r4-r11,r14} 262 263 MOV r2,#1<<4 @ r2 = 1<<shift 264 MOV r3,#13-4 @ r3 = 13-shift 265find_shift_loop: 266 TST r0,r2 @ if (n & (1<<shift)) == 0 267 MOV r2,r2,LSL #1 268 SUBEQ r3,r3,#1 @ shift-- 269 BEQ find_shift_loop 270 MOV r2,#2 271 MOV r2,r2,LSL r3 @ r2 = step = 2<<shift 272 273 @ presymmetry 274 @ r0 = n (a multiple of 4) 275 @ r1 = in 276 @ r2 = step 277 @ r3 = shift 278 279 ADD r4, r1, r0, LSL #1 @ r4 = aX = in+(n>>1) 280 ADD r14,r1, r0 @ r14= in+(n>>2) 281 SUB r4, r4, #3*4 @ r4 = aX = in+n2-3 282 LDR r5, =sincos_lookup0 @ r5 = T=sincos_lookup0 283 284presymmetry_loop1: 285 LDR r7, [r4,#8] @ r6 = s2 = aX[2] 286 LDR r11,[r5,#4] @ r11= T[1] 287 LDR r6, [r4] @ r6 = s0 = aX[0] 288 LDR r10,[r5],r2,LSL #2 @ r10= T[0] T += step 289 290 @ XPROD31(s0, s2, T[0], T[1], 0xaX[0], &ax[2]) 291 SMULL r8, r9, r7, r11 @ (r8, r9) = s2*T[1] 292 @ stall 293 @ stall ? 294 SMLAL r8, r9, r6, r10 @ (r8, r9) += s0*T[0] 295 RSB r6, r6, #0 296 @ stall ? 297 SMULL r8, r12,r7, r10 @ (r8, r12) = s2*T[0] 298 MOV r9, r9, LSL #1 299 @ stall ? 300 SMLAL r8, r12,r6, r11 @ (r8, r12) -= s0*T[1] 301 STR r9, [r4],#-16 @ aX[0] = r9 302 CMP r4,r14 303 MOV r12,r12,LSL #1 304 STR r12,[r4,#8+16] @ aX[2] = r12 305 306 BGE presymmetry_loop1 @ while (aX >= in+n4) 307 308presymmetry_loop2: 309 LDR r6,[r4] @ r6 = s0 = aX[0] 310 LDR r10,[r5,#4] @ r10= T[1] 311 LDR r7,[r4,#8] @ r6 = s2 = aX[2] 312 LDR r11,[r5],-r2,LSL #2 @ r11= T[0] T -= step 313 314 @ XPROD31(s0, s2, T[1], T[0], 0xaX[0], &ax[2]) 315 SMULL r8, r9, r6, r10 @ (r8, r9) = s0*T[1] 316 @ stall 317 @ stall ? 318 SMLAL r8, r9, r7, r11 @ (r8, r9) += s2*T[0] 319 RSB r6, r6, #0 320 @ stall ? 321 SMULL r8, r12,r7, r10 @ (r8, r12) = s2*T[1] 322 MOV r9, r9, LSL #1 323 @ stall ? 324 SMLAL r8, r12,r6, r11 @ (r8, r12) -= s0*T[0] 325 STR r9, [r4],#-16 @ aX[0] = r9 326 CMP r4,r1 327 MOV r12,r12,LSL #1 328 STR r12,[r4,#8+16] @ aX[2] = r12 329 330 BGE presymmetry_loop2 @ while (aX >= in) 331 332 @ r0 = n 333 @ r1 = in 334 @ r2 = step 335 @ r3 = shift 336 STMFD r13!,{r3} 337 LDR r5, =sincos_lookup0 @ r5 = T=sincos_lookup0 338 ADD r4, r1, r0, LSL #1 @ r4 = aX = in+(n>>1) 339 SUB r4, r4, #4*4 @ r4 = aX = in+(n>>1)-4 340 LDR r11,[r5,#4] @ r11= T[1] 341 LDR r10,[r5],r2, LSL #2 @ r10= T[0] T += step 342presymmetry_loop3: 343 LDR r8,[r1],#16 @ r8 = ro0 = bX[0] 344 LDR r9,[r1,#8-16] @ r9 = ro2 = bX[2] 345 LDR r6,[r4] @ r6 = ri0 = aX[0] 346 347 @ XNPROD31( ro2, ro0, T[1], T[0], 0xaX[0], &aX[2] ) 348 @ aX[0] = (ro2*T[1] - ro0*T[0])>>31 aX[2] = (ro0*T[1] + ro2*T[0])>>31 349 SMULL r14,r12,r8, r11 @ (r14,r12) = ro0*T[1] 350 RSB r8,r8,#0 @ r8 = -ro0 351 @ Stall ? 352 SMLAL r14,r12,r9, r10 @ (r14,r12) += ro2*T[0] 353 LDR r7,[r4,#8] @ r7 = ri2 = aX[2] 354 @ Stall ? 355 SMULL r14,r3, r9, r11 @ (r14,r3) = ro2*T[1] 356 MOV r12,r12,LSL #1 357 LDR r11,[r5,#4] @ r11= T[1] 358 SMLAL r14,r3, r8, r10 @ (r14,r3) -= ro0*T[0] 359 LDR r10,[r5],r2, LSL #2 @ r10= T[0] T += step 360 STR r12,[r4,#8] 361 MOV r3, r3, LSL #1 362 STR r3, [r4],#-16 363 364 @ XNPROD31( ri2, ri0, T[0], T[1], 0xbX[0], &bX[2] ) 365 @ bX[0] = (ri2*T[0] - ri0*T[1])>>31 bX[2] = (ri0*T[0] + ri2*T[1])>>31 366 SMULL r14,r12,r6, r10 @ (r14,r12) = ri0*T[0] 367 RSB r6,r6,#0 @ r6 = -ri0 368 @ stall ? 369 SMLAL r14,r12,r7, r11 @ (r14,r12) += ri2*T[1] 370 @ stall ? 371 @ stall ? 372 SMULL r14,r3, r7, r10 @ (r14,r3) = ri2*T[0] 373 MOV r12,r12,LSL #1 374 @ stall ? 375 SMLAL r14,r3, r6, r11 @ (r14,r3) -= ri0*T[1] 376 CMP r4,r1 377 STR r12,[r1,#8-16] 378 MOV r3, r3, LSL #1 379 STR r3, [r1,#-16] 380 381 BGE presymmetry_loop3 382 383 SUB r1,r1,r0 @ r1 = in -= n>>2 (i.e. restore in) 384 385 LDR r3,[r13] 386 STR r2,[r13,#-4]! 387 388 @ mdct_butterflies 389 @ r0 = n = (points * 2) 390 @ r1 = in = x 391 @ r2 = i 392 @ r3 = shift 393 STMFD r13!,{r0-r1} 394 RSBS r4,r3,#6 @ r4 = stages = 7-shift then --stages 395 LDR r5,=sincos_lookup0 396 BLE no_generics 397 MOV r14,#4 @ r14= 4 (i=0) 398 MOV r6, r14,LSL r3 @ r6 = (4<<i)<<shift 399mdct_butterflies_loop1: 400 MOV r0, r0, LSR #1 @ r0 = points>>i = POINTS 401 MOV r2, r14,LSR #2 @ r2 = (1<<i)-j (j=0) 402 STMFD r13!,{r4,r14} 403mdct_butterflies_loop2: 404 405 @ mdct_butterfly_generic(x+POINTS*j, POINTS, 4<<(i+shift)) 406 @ mdct_butterfly_generic(r1, r0, r6) 407 @ r0 = points 408 @ r1 = x 409 @ preserve r2 (external loop counter) 410 @ preserve r3 411 @ preserve r4 (external loop counter) 412 @ r5 = T = sincos_lookup0 413 @ r6 = step 414 @ preserve r14 415 416 STR r2,[r13,#-4]! @ stack r2 417 ADD r1,r1,r0,LSL #1 @ r1 = x2+4 = x + (POINTS>>1) 418 ADD r7,r1,r0,LSL #1 @ r7 = x1+4 = x + POINTS 419 ADD r12,r5,#1024*4 @ r12= sincos_lookup0+1024 420 421mdct_bufferfly_generic_loop1: 422 LDMDB r7!,{r2,r3,r8,r11} @ r2 = x1[0] 423 @ r3 = x1[1] 424 @ r8 = x1[2] 425 @ r11= x1[3] x1 -= 4 426 LDMDB r1!,{r4,r9,r10,r14} @ r4 = x2[0] 427 @ r9 = x2[1] 428 @ r10= x2[2] 429 @ r14= x2[3] x2 -= 4 430 431 SUB r2, r2, r3 @ r2 = s0 = x1[0] - x1[1] 432 ADD r3, r2, r3, LSL #1 @ r3 = x1[0] + x1[1] (-> x1[0]) 433 SUB r11,r11,r8 @ r11= s1 = x1[3] - x1[2] 434 ADD r8, r11,r8, LSL #1 @ r8 = x1[3] + x1[2] (-> x1[2]) 435 SUB r9, r9, r4 @ r9 = s2 = x2[1] - x2[0] 436 ADD r4, r9, r4, LSL #1 @ r4 = x2[1] + x2[0] (-> x1[1]) 437 SUB r14,r14,r10 @ r14= s3 = x2[3] - x2[2] 438 ADD r10,r14,r10,LSL #1 @ r10= x2[3] + x2[2] (-> x1[3]) 439 STMIA r7,{r3,r4,r8,r10} 440 441 @ r0 = points 442 @ r1 = x2 443 @ r2 = s0 444 @ r3 free 445 @ r4 free 446 @ r5 = T 447 @ r6 = step 448 @ r7 = x1 449 @ r8 free 450 @ r9 = s2 451 @ r10 free 452 @ r11= s1 453 @ r12= limit 454 @ r14= s3 455 456 LDR r8, [r5,#4] @ r8 = T[1] 457 LDR r10,[r5],r6,LSL #2 @ r10= T[0] T += step 458 459 @ XPROD31(s1, s0, T[0], T[1], &x2[0], &x2[2]) 460 @ x2[0] = (s1*T[0] + s0*T[1])>>31 x2[2] = (s0*T[0] - s1*T[1])>>31 461 @ stall Xscale 462 SMULL r4, r3, r2, r8 @ (r4, r3) = s0*T[1] 463 SMLAL r4, r3, r11,r10 @ (r4, r3) += s1*T[0] 464 RSB r11,r11,#0 465 SMULL r11,r4, r8, r11 @ (r11,r4) = -s1*T[1] 466 SMLAL r11,r4, r2, r10 @ (r11,r4) += s0*T[0] 467 MOV r2, r3, LSL #1 @ r2 = r3<<1 = Value for x2[0] 468 469 @ XPROD31(s2, s3, T[0], T[1], &x2[1], &x2[3]) 470 @ x2[1] = (s2*T[0] + s3*T[1])>>31 x2[3] = (s3*T[0] - s2*T[1])>>31 471 SMULL r11,r3, r9, r10 @ (r11,r3) = s2*T[0] 472 MOV r4, r4, LSL #1 @ r4 = r4<<1 = Value for x2[2] 473 SMLAL r11,r3, r14,r8 @ (r11,r3) += s3*T[1] 474 RSB r9, r9, #0 475 SMULL r10,r11,r14,r10 @ (r10,r11) = s3*T[0] 476 MOV r3, r3, LSL #1 @ r3 = r3<<1 = Value for x2[1] 477 SMLAL r10,r11,r9,r8 @ (r10,r11) -= s2*T[1] 478 CMP r5, r12 479 MOV r11,r11,LSL #1 @ r11= r11<<1 = Value for x2[3] 480 481 STMIA r1,{r2,r3,r4,r11} 482 483 BLT mdct_bufferfly_generic_loop1 484 485 SUB r12,r12,#1024*4 486mdct_bufferfly_generic_loop2: 487 LDMDB r7!,{r2,r3,r9,r10} @ r2 = x1[0] 488 @ r3 = x1[1] 489 @ r9 = x1[2] 490 @ r10= x1[3] x1 -= 4 491 LDMDB r1!,{r4,r8,r11,r14} @ r4 = x2[0] 492 @ r8 = x2[1] 493 @ r11= x2[2] 494 @ r14= x2[3] x2 -= 4 495 496 SUB r2, r2, r3 @ r2 = s0 = x1[0] - x1[1] 497 ADD r3, r2, r3, LSL #1 @ r3 = x1[0] + x1[1] (-> x1[0]) 498 SUB r9, r9,r10 @ r9 = s1 = x1[2] - x1[3] 499 ADD r10,r9,r10, LSL #1 @ r10= x1[2] + x1[3] (-> x1[2]) 500 SUB r4, r4, r8 @ r4 = s2 = x2[0] - x2[1] 501 ADD r8, r4, r8, LSL #1 @ r8 = x2[0] + x2[1] (-> x1[1]) 502 SUB r14,r14,r11 @ r14= s3 = x2[3] - x2[2] 503 ADD r11,r14,r11,LSL #1 @ r11= x2[3] + x2[2] (-> x1[3]) 504 STMIA r7,{r3,r8,r10,r11} 505 506 @ r0 = points 507 @ r1 = x2 508 @ r2 = s0 509 @ r3 free 510 @ r4 = s2 511 @ r5 = T 512 @ r6 = step 513 @ r7 = x1 514 @ r8 free 515 @ r9 = s1 516 @ r10 free 517 @ r11 free 518 @ r12= limit 519 @ r14= s3 520 521 LDR r8, [r5,#4] @ r8 = T[1] 522 LDR r10,[r5],-r6,LSL #2 @ r10= T[0] T -= step 523 524 @ XNPROD31(s0, s1, T[0], T[1], &x2[0], &x2[2]) 525 @ x2[0] = (s0*T[0] - s1*T[1])>>31 x2[2] = (s1*T[0] + s0*T[1])>>31 526 @ stall Xscale 527 SMULL r3, r11,r2, r8 @ (r3, r11) = s0*T[1] 528 SMLAL r3, r11,r9, r10 @ (r3, r11) += s1*T[0] 529 RSB r9, r9, #0 530 SMULL r3, r2, r10,r2 @ (r3, r2) = s0*T[0] 531 SMLAL r3, r2, r9, r8 @ (r3, r2) += -s1*T[1] 532 MOV r9, r11,LSL #1 @ r9 = r11<<1 = Value for x2[2] 533 534 @ XNPROD31(s3, s2, T[0], T[1], &x2[1], &x2[3]) 535 @ x2[1] = (s3*T[0] - s2*T[1])>>31 x2[3] = (s2*T[0] + s3*T[1])>>31 536 SMULL r3, r11,r4, r10 @ (r3,r11) = s2*T[0] 537 MOV r2, r2, LSL #1 @ r2 = r2<<1 = Value for x2[0] 538 SMLAL r3, r11,r14,r8 @ (r3,r11) += s3*T[1] 539 RSB r4, r4, #0 540 SMULL r10,r3,r14,r10 @ (r10,r3) = s3*T[0] 541 MOV r11,r11,LSL #1 @ r11= r11<<1 = Value for x2[3] 542 SMLAL r10,r3, r4, r8 @ (r10,r3) -= s2*T[1] 543 CMP r5, r12 544 MOV r3, r3, LSL #1 @ r3 = r3<<1 = Value for x2[1] 545 546 STMIA r1,{r2,r3,r9,r11} 547 548 BGT mdct_bufferfly_generic_loop2 549 550 LDR r2,[r13],#4 @ unstack r2 551 ADD r1, r1, r0, LSL #2 @ r1 = x+POINTS*j 552 @ stall Xscale 553 SUBS r2, r2, #1 @ r2-- (j++) 554 BGT mdct_butterflies_loop2 555 556 LDMFD r13!,{r4,r14} 557 558 LDR r1,[r13,#4] 559 560 SUBS r4, r4, #1 @ stages-- 561 MOV r14,r14,LSL #1 @ r14= 4<<i (i++) 562 MOV r6, r6, LSL #1 @ r6 = step <<= 1 (i++) 563 BGE mdct_butterflies_loop1 564 LDMFD r13,{r0-r1} 565no_generics: 566 @ mdct_butterflies part2 (loop around mdct_bufferfly_32) 567 @ r0 = points 568 @ r1 = in 569 @ r2 = step 570 @ r3 = shift 571 572mdct_bufferflies_loop3: 573 @ mdct_bufferfly_32 574 575 @ block1 576 ADD r4, r1, #16*4 @ r4 = &in[16] 577 LDMIA r4,{r5,r6,r9,r10} @ r5 = x[16] 578 @ r6 = x[17] 579 @ r9 = x[18] 580 @ r10= x[19] 581 LDMIA r1,{r7,r8,r11,r12} @ r7 = x[0] 582 @ r8 = x[1] 583 @ r11= x[2] 584 @ r12= x[3] 585 SUB r5, r5, r6 @ r5 = s0 = x[16] - x[17] 586 ADD r6, r5, r6, LSL #1 @ r6 = x[16] + x[17] -> x[16] 587 SUB r9, r9, r10 @ r9 = s1 = x[18] - x[19] 588 ADD r10,r9, r10,LSL #1 @ r10= x[18] + x[19] -> x[18] 589 SUB r8, r8, r7 @ r8 = s2 = x[ 1] - x[ 0] 590 ADD r7, r8, r7, LSL #1 @ r7 = x[ 1] + x[ 0] -> x[17] 591 SUB r12,r12,r11 @ r12= s3 = x[ 3] - x[ 2] 592 ADD r11,r12,r11, LSL #1 @ r11= x[ 3] + x[ 2] -> x[19] 593 STMIA r4!,{r6,r7,r10,r11} 594 595 LDR r6,cPI1_8 596 LDR r7,cPI3_8 597 598 @ XNPROD31( s0, s1, cPI3_8, cPI1_8, &x[ 0], &x[ 2] ) 599 @ x[0] = s0*cPI3_8 - s1*cPI1_8 x[2] = s1*cPI3_8 + s0*cPI1_8 600 @ stall Xscale 601 SMULL r14,r11,r5, r6 @ (r14,r11) = s0*cPI1_8 602 SMLAL r14,r11,r9, r7 @ (r14,r11) += s1*cPI3_8 603 RSB r9, r9, #0 604 SMULL r14,r5, r7, r5 @ (r14,r5) = s0*cPI3_8 605 SMLAL r14,r5, r9, r6 @ (r14,r5) -= s1*cPI1_8 606 MOV r11,r11,LSL #1 607 MOV r5, r5, LSL #1 608 609 @ XPROD31 ( s2, s3, cPI1_8, cPI3_8, &x[ 1], &x[ 3] ) 610 @ x[1] = s2*cPI1_8 + s3*cPI3_8 x[3] = s3*cPI1_8 - s2*cPI3_8 611 SMULL r14,r9, r8, r6 @ (r14,r9) = s2*cPI1_8 612 SMLAL r14,r9, r12,r7 @ (r14,r9) += s3*cPI3_8 613 RSB r8,r8,#0 614 SMULL r14,r12,r6, r12 @ (r14,r12) = s3*cPI1_8 615 SMLAL r14,r12,r8, r7 @ (r14,r12) -= s2*cPI3_8 616 MOV r9, r9, LSL #1 617 MOV r12,r12,LSL #1 618 STMIA r1!,{r5,r9,r11,r12} 619 620 @ block2 621 LDMIA r4,{r5,r6,r9,r10} @ r5 = x[20] 622 @ r6 = x[21] 623 @ r9 = x[22] 624 @ r10= x[23] 625 LDMIA r1,{r7,r8,r11,r12} @ r7 = x[4] 626 @ r8 = x[5] 627 @ r11= x[6] 628 @ r12= x[7] 629 SUB r5, r5, r6 @ r5 = s0 = x[20] - x[21] 630 ADD r6, r5, r6, LSL #1 @ r6 = x[20] + x[21] -> x[20] 631 SUB r9, r9, r10 @ r9 = s1 = x[22] - x[23] 632 ADD r10,r9, r10,LSL #1 @ r10= x[22] + x[23] -> x[22] 633 SUB r8, r8, r7 @ r8 = s2 = x[ 5] - x[ 4] 634 ADD r7, r8, r7, LSL #1 @ r7 = x[ 5] + x[ 4] -> x[21] 635 SUB r12,r12,r11 @ r12= s3 = x[ 7] - x[ 6] 636 ADD r11,r12,r11, LSL #1 @ r11= x[ 7] + x[ 6] -> x[23] 637 LDR r14,cPI2_8 638 STMIA r4!,{r6,r7,r10,r11} 639 640 SUB r5, r5, r9 @ r5 = s0 - s1 641 ADD r9, r5, r9, LSL #1 @ r9 = s0 + s1 642 SMULL r6, r5, r14,r5 @ (r6,r5) = (s0-s1)*cPI2_8 643 SUB r12,r12,r8 @ r12= s3 - s2 644 ADD r8, r12,r8, LSL #1 @ r8 = s3 + s2 645 646 SMULL r6, r8, r14,r8 @ (r6,r8) = (s3+s2)*cPI2_8 647 MOV r5, r5, LSL #1 648 SMULL r6, r9, r14,r9 @ (r6,r9) = (s0+s1)*cPI2_8 649 MOV r8, r8, LSL #1 650 SMULL r6, r12,r14,r12 @ (r6,r12) = (s3-s2)*cPI2_8 651 MOV r9, r9, LSL #1 652 MOV r12,r12,LSL #1 653 STMIA r1!,{r5,r8,r9,r12} 654 655 @ block3 656 LDMIA r4,{r5,r6,r9,r10} @ r5 = x[24] 657 @ r6 = x[25] 658 @ r9 = x[25] 659 @ r10= x[26] 660 LDMIA r1,{r7,r8,r11,r12} @ r7 = x[8] 661 @ r8 = x[9] 662 @ r11= x[10] 663 @ r12= x[11] 664 SUB r5, r5, r6 @ r5 = s0 = x[24] - x[25] 665 ADD r6, r5, r6, LSL #1 @ r6 = x[24] + x[25] -> x[25] 666 SUB r9, r9, r10 @ r9 = s1 = x[26] - x[27] 667 ADD r10,r9, r10,LSL #1 @ r10= x[26] + x[27] -> x[26] 668 SUB r8, r8, r7 @ r8 = s2 = x[ 9] - x[ 8] 669 ADD r7, r8, r7, LSL #1 @ r7 = x[ 9] + x[ 8] -> x[25] 670 SUB r12,r12,r11 @ r12= s3 = x[11] - x[10] 671 ADD r11,r12,r11, LSL #1 @ r11= x[11] + x[10] -> x[27] 672 STMIA r4!,{r6,r7,r10,r11} 673 674 LDR r6,cPI3_8 675 LDR r7,cPI1_8 676 677 @ XNPROD31( s0, s1, cPI1_8, cPI3_8, &x[ 8], &x[10] ) 678 @ x[8] = s0*cPI1_8 - s1*cPI3_8 x[10] = s1*cPI1_8 + s0*cPI3_8 679 @ stall Xscale 680 SMULL r14,r11,r5, r6 @ (r14,r11) = s0*cPI3_8 681 SMLAL r14,r11,r9, r7 @ (r14,r11) += s1*cPI1_8 682 RSB r9, r9, #0 683 SMULL r14,r5, r7, r5 @ (r14,r5) = s0*cPI1_8 684 SMLAL r14,r5, r9, r6 @ (r14,r5) -= s1*cPI3_8 685 MOV r11,r11,LSL #1 686 MOV r5, r5, LSL #1 687 688 @ XPROD31 ( s2, s3, cPI3_8, cPI1_8, &x[ 9], &x[11] ) 689 @ x[9] = s2*cPI3_8 + s3*cPI1_8 x[11] = s3*cPI3_8 - s2*cPI1_8 690 SMULL r14,r9, r8, r6 @ (r14,r9) = s2*cPI3_8 691 SMLAL r14,r9, r12,r7 @ (r14,r9) += s3*cPI1_8 692 RSB r8,r8,#0 693 SMULL r14,r12,r6, r12 @ (r14,r12) = s3*cPI3_8 694 SMLAL r14,r12,r8, r7 @ (r14,r12) -= s2*cPI1_8 695 MOV r9, r9, LSL #1 696 MOV r12,r12,LSL #1 697 STMIA r1!,{r5,r9,r11,r12} 698 699 @ block4 700 LDMIA r4,{r5,r6,r10,r11} @ r5 = x[28] 701 @ r6 = x[29] 702 @ r10= x[30] 703 @ r11= x[31] 704 LDMIA r1,{r8,r9,r12,r14} @ r8 = x[12] 705 @ r9 = x[13] 706 @ r12= x[14] 707 @ r14= x[15] 708 SUB r5, r5, r6 @ r5 = s0 = x[28] - x[29] 709 ADD r6, r5, r6, LSL #1 @ r6 = x[28] + x[29] -> x[28] 710 SUB r7, r14,r12 @ r7 = s3 = x[15] - x[14] 711 ADD r12,r7, r12, LSL #1 @ r12= x[15] + x[14] -> x[31] 712 SUB r10,r10,r11 @ r10= s1 = x[30] - x[31] 713 ADD r11,r10,r11,LSL #1 @ r11= x[30] + x[31] -> x[30] 714 SUB r14, r8, r9 @ r14= s2 = x[12] - x[13] 715 ADD r9, r14, r9, LSL #1 @ r9 = x[12] + x[13] -> x[29] 716 STMIA r4!,{r6,r9,r11,r12} 717 STMIA r1!,{r5,r7,r10,r14} 718 719 @ mdct_butterfly16 (1st version) 720 @ block 1 721 SUB r1,r1,#16*4 722 ADD r4,r1,#8*4 723 LDMIA r4,{r5,r6,r9,r10} @ r5 = x[ 8] 724 @ r6 = x[ 9] 725 @ r9 = x[10] 726 @ r10= x[11] 727 LDMIA r1,{r7,r8,r11,r12} @ r7 = x[0] 728 @ r8 = x[1] 729 @ r11= x[2] 730 @ r12= x[3] 731 SUB r5, r5, r6 @ r5 = s0 = x[ 8] - x[ 9] 732 ADD r6, r5, r6, LSL #1 @ r6 = x[ 8] + x[ 9] -> x[ 8] 733 SUB r9, r9, r10 @ r9 = s1 = x[10] - x[11] 734 ADD r10,r9, r10,LSL #1 @ r10= x[10] + x[11] -> x[10] 735 SUB r8, r8, r7 @ r8 = s2 = x[ 1] - x[ 0] 736 ADD r7, r8, r7, LSL #1 @ r7 = x[ 1] + x[ 0] -> x[ 9] 737 SUB r12,r12,r11 @ r12= s3 = x[ 3] - x[ 2] 738 ADD r11,r12,r11, LSL #1 @ r11= x[ 3] + x[ 2] -> x[11] 739 LDR r14,cPI2_8 740 STMIA r4!,{r6,r7,r10,r11} 741 742 SUB r5, r5, r9 @ r5 = s0 - s1 743 ADD r9, r5, r9, LSL #1 @ r9 = s0 + s1 744 SMULL r6, r5, r14,r5 @ (r6,r5) = (s0-s1)*cPI2_8 745 SUB r12,r12,r8 @ r12= s3 - s2 746 ADD r8, r12,r8, LSL #1 @ r8 = s3 + s2 747 748 SMULL r6, r8, r14,r8 @ (r6,r8) = (s3+s2)*cPI2_8 749 MOV r5, r5, LSL #1 750 SMULL r6, r9, r14,r9 @ (r6,r9) = (s0+s1)*cPI2_8 751 MOV r8, r8, LSL #1 752 SMULL r6, r12,r14,r12 @ (r6,r12) = (s3-s2)*cPI2_8 753 MOV r9, r9, LSL #1 754 MOV r12,r12,LSL #1 755 STMIA r1!,{r5,r8,r9,r12} 756 757 @ block4 758 LDMIA r4,{r5,r6,r9,r10} @ r5 = x[12] 759 @ r6 = x[13] 760 @ r9 = x[14] 761 @ r10= x[15] 762 LDMIA r1,{r7,r8,r11,r12} @ r7 = x[ 4] 763 @ r8 = x[ 5] 764 @ r11= x[ 6] 765 @ r12= x[ 7] 766 SUB r14,r7, r8 @ r14= s0 = x[ 4] - x[ 5] 767 ADD r8, r14,r8, LSL #1 @ r8 = x[ 4] + x[ 5] -> x[13] 768 SUB r7, r12,r11 @ r7 = s1 = x[ 7] - x[ 6] 769 ADD r11,r7, r11, LSL #1 @ r11= x[ 7] + x[ 6] -> x[15] 770 SUB r5, r5, r6 @ r5 = s2 = x[12] - x[13] 771 ADD r6, r5, r6, LSL #1 @ r6 = x[12] + x[13] -> x[12] 772 SUB r12,r9, r10 @ r12= s3 = x[14] - x[15] 773 ADD r10,r12,r10,LSL #1 @ r10= x[14] + x[15] -> x[14] 774 STMIA r4!,{r6,r8,r10,r11} 775 STMIA r1!,{r5,r7,r12,r14} 776 777 @ mdct_butterfly_8 778 LDMDB r1,{r6,r7,r8,r9,r10,r11,r12,r14} 779 @ r6 = x[0] 780 @ r7 = x[1] 781 @ r8 = x[2] 782 @ r9 = x[3] 783 @ r10= x[4] 784 @ r11= x[5] 785 @ r12= x[6] 786 @ r14= x[7] 787 ADD r6, r6, r7 @ r6 = s0 = x[0] + x[1] 788 SUB r7, r6, r7, LSL #1 @ r7 = s1 = x[0] - x[1] 789 ADD r8, r8, r9 @ r8 = s2 = x[2] + x[3] 790 SUB r9, r8, r9, LSL #1 @ r9 = s3 = x[2] - x[3] 791 ADD r10,r10,r11 @ r10= s4 = x[4] + x[5] 792 SUB r11,r10,r11,LSL #1 @ r11= s5 = x[4] - x[5] 793 ADD r12,r12,r14 @ r12= s6 = x[6] + x[7] 794 SUB r14,r12,r14,LSL #1 @ r14= s7 = x[6] - x[7] 795 796 ADD r2, r11,r9 @ r2 = x[0] = s5 + s3 797 SUB r4, r2, r9, LSL #1 @ r4 = x[2] = s5 - s3 798 SUB r3, r14,r7 @ r3 = x[1] = s7 - s1 799 ADD r5, r3, r7, LSL #1 @ r5 = x[3] = s7 + s1 800 SUB r10,r10,r6 @ r10= x[4] = s4 - s0 801 SUB r11,r12,r8 @ r11= x[5] = s6 - s2 802 ADD r12,r10,r6, LSL #1 @ r12= x[6] = s4 + s0 803 ADD r14,r11,r8, LSL #1 @ r14= x[7] = s6 + s2 804 STMDB r1,{r2,r3,r4,r5,r10,r11,r12,r14} 805 806 @ mdct_butterfly_8 807 LDMIA r1,{r6,r7,r8,r9,r10,r11,r12,r14} 808 @ r6 = x[0] 809 @ r7 = x[1] 810 @ r8 = x[2] 811 @ r9 = x[3] 812 @ r10= x[4] 813 @ r11= x[5] 814 @ r12= x[6] 815 @ r14= x[7] 816 ADD r6, r6, r7 @ r6 = s0 = x[0] + x[1] 817 SUB r7, r6, r7, LSL #1 @ r7 = s1 = x[0] - x[1] 818 ADD r8, r8, r9 @ r8 = s2 = x[2] + x[3] 819 SUB r9, r8, r9, LSL #1 @ r9 = s3 = x[2] - x[3] 820 ADD r10,r10,r11 @ r10= s4 = x[4] + x[5] 821 SUB r11,r10,r11,LSL #1 @ r11= s5 = x[4] - x[5] 822 ADD r12,r12,r14 @ r12= s6 = x[6] + x[7] 823 SUB r14,r12,r14,LSL #1 @ r14= s7 = x[6] - x[7] 824 825 ADD r2, r11,r9 @ r2 = x[0] = s5 + s3 826 SUB r4, r2, r9, LSL #1 @ r4 = x[2] = s5 - s3 827 SUB r3, r14,r7 @ r3 = x[1] = s7 - s1 828 ADD r5, r3, r7, LSL #1 @ r5 = x[3] = s7 + s1 829 SUB r10,r10,r6 @ r10= x[4] = s4 - s0 830 SUB r11,r12,r8 @ r11= x[5] = s6 - s2 831 ADD r12,r10,r6, LSL #1 @ r12= x[6] = s4 + s0 832 ADD r14,r11,r8, LSL #1 @ r14= x[7] = s6 + s2 833 STMIA r1,{r2,r3,r4,r5,r10,r11,r12,r14} 834 835 @ block 2 836 ADD r1,r1,#16*4-8*4 837 ADD r4,r1,#8*4 838 LDMIA r4,{r5,r6,r9,r10} @ r5 = x[ 8] 839 @ r6 = x[ 9] 840 @ r9 = x[10] 841 @ r10= x[11] 842 LDMIA r1,{r7,r8,r11,r12} @ r7 = x[0] 843 @ r8 = x[1] 844 @ r11= x[2] 845 @ r12= x[3] 846 SUB r5, r5, r6 @ r5 = s0 = x[ 8] - x[ 9] 847 ADD r6, r5, r6, LSL #1 @ r6 = x[ 8] + x[ 9] -> x[ 8] 848 SUB r9, r9, r10 @ r9 = s1 = x[10] - x[11] 849 ADD r10,r9, r10,LSL #1 @ r10= x[10] + x[11] -> x[10] 850 SUB r8, r8, r7 @ r8 = s2 = x[ 1] - x[ 0] 851 ADD r7, r8, r7, LSL #1 @ r7 = x[ 1] + x[ 0] -> x[ 9] 852 SUB r12,r12,r11 @ r12= s3 = x[ 3] - x[ 2] 853 ADD r11,r12,r11, LSL #1 @ r11= x[ 3] + x[ 2] -> x[11] 854 LDR r14,cPI2_8 855 STMIA r4!,{r6,r7,r10,r11} 856 857 SUB r5, r5, r9 @ r5 = s0 - s1 858 ADD r9, r5, r9, LSL #1 @ r9 = s0 + s1 859 SMULL r6, r5, r14,r5 @ (r6,r5) = (s0-s1)*cPI2_8 860 SUB r12,r12,r8 @ r12= s3 - s2 861 ADD r8, r12,r8, LSL #1 @ r8 = s3 + s2 862 863 SMULL r6, r8, r14,r8 @ (r6,r8) = (s3+s2)*cPI2_8 864 MOV r5, r5, LSL #1 865 SMULL r6, r9, r14,r9 @ (r6,r9) = (s0+s1)*cPI2_8 866 MOV r8, r8, LSL #1 867 SMULL r6, r12,r14,r12 @ (r6,r12) = (s3-s2)*cPI2_8 868 MOV r9, r9, LSL #1 869 MOV r12,r12,LSL #1 870 STMIA r1!,{r5,r8,r9,r12} 871 872 @ block4 873 LDMIA r4,{r5,r6,r9,r10} @ r5 = x[12] 874 @ r6 = x[13] 875 @ r9 = x[14] 876 @ r10= x[15] 877 LDMIA r1,{r7,r8,r11,r12} @ r7 = x[ 4] 878 @ r8 = x[ 5] 879 @ r11= x[ 6] 880 @ r12= x[ 7] 881 SUB r5, r5, r6 @ r5 = s2 = x[12] - x[13] 882 ADD r6, r5, r6, LSL #1 @ r6 = x[12] + x[13] -> x[12] 883 SUB r9, r9, r10 @ r9 = s3 = x[14] - x[15] 884 ADD r10,r9, r10,LSL #1 @ r10= x[14] + x[15] -> x[14] 885 SUB r14,r7, r8 @ r14= s0 = x[ 4] - x[ 5] 886 ADD r8, r14,r8, LSL #1 @ r8 = x[ 4] + x[ 5] -> x[13] 887 SUB r7, r12,r11 @ r7 = s1 = x[ 7] - x[ 6] 888 ADD r11,r7, r11, LSL #1 @ r11= x[ 7] + x[ 6] -> x[15] 889 STMIA r4!,{r6,r8,r10,r11} 890 STMIA r1!,{r5,r7,r9,r14} 891 892 @ mdct_butterfly_8 893 LDMDB r1,{r6,r7,r8,r9,r10,r11,r12,r14} 894 @ r6 = x[0] 895 @ r7 = x[1] 896 @ r8 = x[2] 897 @ r9 = x[3] 898 @ r10= x[4] 899 @ r11= x[5] 900 @ r12= x[6] 901 @ r14= x[7] 902 ADD r6, r6, r7 @ r6 = s0 = x[0] + x[1] 903 SUB r7, r6, r7, LSL #1 @ r7 = s1 = x[0] - x[1] 904 ADD r8, r8, r9 @ r8 = s2 = x[2] + x[3] 905 SUB r9, r8, r9, LSL #1 @ r9 = s3 = x[2] - x[3] 906 ADD r10,r10,r11 @ r10= s4 = x[4] + x[5] 907 SUB r11,r10,r11,LSL #1 @ r11= s5 = x[4] - x[5] 908 ADD r12,r12,r14 @ r12= s6 = x[6] + x[7] 909 SUB r14,r12,r14,LSL #1 @ r14= s7 = x[6] - x[7] 910 911 ADD r2, r11,r9 @ r2 = x[0] = s5 + s3 912 SUB r4, r2, r9, LSL #1 @ r4 = x[2] = s5 - s3 913 SUB r3, r14,r7 @ r3 = x[1] = s7 - s1 914 ADD r5, r3, r7, LSL #1 @ r5 = x[3] = s7 + s1 915 SUB r10,r10,r6 @ r10= x[4] = s4 - s0 916 SUB r11,r12,r8 @ r11= x[5] = s6 - s2 917 ADD r12,r10,r6, LSL #1 @ r12= x[6] = s4 + s0 918 ADD r14,r11,r8, LSL #1 @ r14= x[7] = s6 + s2 919 STMDB r1,{r2,r3,r4,r5,r10,r11,r12,r14} 920 921 @ mdct_butterfly_8 922 LDMIA r1,{r6,r7,r8,r9,r10,r11,r12,r14} 923 @ r6 = x[0] 924 @ r7 = x[1] 925 @ r8 = x[2] 926 @ r9 = x[3] 927 @ r10= x[4] 928 @ r11= x[5] 929 @ r12= x[6] 930 @ r14= x[7] 931 ADD r6, r6, r7 @ r6 = s0 = x[0] + x[1] 932 SUB r7, r6, r7, LSL #1 @ r7 = s1 = x[0] - x[1] 933 ADD r8, r8, r9 @ r8 = s2 = x[2] + x[3] 934 SUB r9, r8, r9, LSL #1 @ r9 = s3 = x[2] - x[3] 935 ADD r10,r10,r11 @ r10= s4 = x[4] + x[5] 936 SUB r11,r10,r11,LSL #1 @ r11= s5 = x[4] - x[5] 937 ADD r12,r12,r14 @ r12= s6 = x[6] + x[7] 938 SUB r14,r12,r14,LSL #1 @ r14= s7 = x[6] - x[7] 939 940 ADD r2, r11,r9 @ r2 = x[0] = s5 + s3 941 SUB r4, r2, r9, LSL #1 @ r4 = x[2] = s5 - s3 942 SUB r3, r14,r7 @ r3 = x[1] = s7 - s1 943 ADD r5, r3, r7, LSL #1 @ r5 = x[3] = s7 + s1 944 SUB r10,r10,r6 @ r10= x[4] = s4 - s0 945 SUB r11,r12,r8 @ r11= x[5] = s6 - s2 946 ADD r12,r10,r6, LSL #1 @ r12= x[6] = s4 + s0 947 ADD r14,r11,r8, LSL #1 @ r14= x[7] = s6 + s2 948 STMIA r1,{r2,r3,r4,r5,r10,r11,r12,r14} 949 950 ADD r1,r1,#8*4 951 SUBS r0,r0,#64 952 BGT mdct_bufferflies_loop3 953 954 LDMFD r13,{r0-r3} 955 956mdct_bitreverseARM: 957 @ r0 = points 958 @ r1 = in 959 @ r2 = step 960 @ r3 = shift 961 962 MOV r4, #0 @ r4 = bit = 0 963 ADD r5, r1, r0, LSL #1 @ r5 = w = x + (n>>1) 964 ADR r6, bitrev 965 SUB r3, r3, #2 @ r3 = shift -= 2 966 SUB r5, r5, #8 967brev_lp: 968 LDRB r7, [r6, r4, LSR #6] 969 AND r8, r4, #0x3f 970 LDRB r8, [r6, r8] 971 ADD r4, r4, #1 @ bit++ 972 @ stall XScale 973 ORR r7, r7, r8, LSL #6 @ r7 = bitrev[bit] 974 ADD r9, r1, r7, LSR r3 @ r9 = xx = x + (b>>shift) 975 CMP r5, r9 @ if (w > xx) 976 LDR r10,[r5],#-8 @ r10 = w[0] w -= 2 977 LDRGT r11,[r5,#12] @ r11 = w[1] 978 LDRGT r12,[r9] @ r12 = xx[0] 979 LDRGT r14,[r9,#4] @ r14 = xx[1] 980 STRGT r10,[r9] @ xx[0]= w[0] 981 STRGT r11,[r9,#4] @ xx[1]= w[1] 982 STRGT r12,[r5,#8] @ w[0] = xx[0] 983 STRGT r14,[r5,#12] @ w[1] = xx[1] 984 CMP r5,r1 985 BGT brev_lp 986 987 @ mdct_step7 988 @ r0 = points 989 @ r1 = in 990 @ r2 = step 991 @ r3 = shift-2 992 993 CMP r2, #4 @ r5 = T = (step>=4) ? 994 LDRGE r5, =sincos_lookup0 @ sincos_lookup0 + 995 LDRLT r5, =sincos_lookup1 @ sincos_lookup0 + 996 ADD r7, r1, r0, LSL #1 @ r7 = w1 = x + (n>>1) 997 ADDGE r5, r5, r2, LSL #1 @ (step>>1) 998 ADD r8, r5, #1024*4 @ r8 = Ttop 999step7_loop1: 1000 LDR r6, [r1] @ r6 = w0[0] 1001 LDR r9, [r1,#4] @ r9 = w0[1] 1002 LDR r10,[r7,#-8]! @ r10= w1[0] w1 -= 2 1003 LDR r11,[r7,#4] @ r11= w1[1] 1004 LDR r14,[r5,#4] @ r14= T[1] 1005 LDR r12,[r5],r2,LSL #2 @ r12= T[0] T += step 1006 1007 ADD r6, r6, r10 @ r6 = s0 = w0[0] + w1[0] 1008 SUB r10,r6, r10,LSL #1 @ r10= s1b= w0[0] - w1[0] 1009 SUB r11,r11,r9 @ r11= s1 = w1[1] - w0[1] 1010 ADD r9, r11,r9, LSL #1 @ r9 = s0b= w1[1] + w0[1] 1011 1012 @ Can save 1 cycle by using SMULL SMLAL - at the cost of being 1013 @ 1 off. 1014 SMULL r0, r3, r6, r14 @ (r0,r3) = s0*T[1] 1015 SMULL r0, r4, r11,r12 @ (r0,r4) += s1*T[0] = s2 1016 ADD r3, r3, r4 1017 SMULL r0, r14,r11,r14 @ (r0,r14) = s1*T[1] 1018 SMULL r0, r12,r6, r12 @ (r0,r12) += s0*T[0] = s3 1019 SUB r14,r14,r12 1020 1021 @ r9 = s0b<<1 1022 @ r10= s1b<<1 1023 ADD r9, r3, r9, ASR #1 @ r9 = s0b + s2 1024 SUB r3, r9, r3, LSL #1 @ r3 = s0b - s2 1025 1026 SUB r12,r14,r10,ASR #1 @ r12= s3 - s1b 1027 ADD r10,r14,r10,ASR #1 @ r10= s3 + s1b 1028 STR r9, [r1],#4 1029 STR r10,[r1],#4 @ w0 += 2 1030 STR r3, [r7] 1031 STR r12,[r7,#4] 1032 1033 CMP r5,r8 1034 BLT step7_loop1 1035 1036step7_loop2: 1037 LDR r6, [r1] @ r6 = w0[0] 1038 LDR r9, [r1,#4] @ r9 = w0[1] 1039 LDR r10,[r7,#-8]! @ r10= w1[0] w1 -= 2 1040 LDR r11,[r7,#4] @ r11= w1[1] 1041 LDR r14,[r5,-r2,LSL #2]! @ r12= T[1] T -= step 1042 LDR r12,[r5,#4] @ r14= T[0] 1043 1044 ADD r6, r6, r10 @ r6 = s0 = w0[0] + w1[0] 1045 SUB r10,r6, r10,LSL #1 @ r10= s1b= w0[0] - w1[0] 1046 SUB r11,r11,r9 @ r11= s1 = w1[1] - w0[1] 1047 ADD r9, r11,r9, LSL #1 @ r9 = s0b= w1[1] + w0[1] 1048 1049 @ Can save 1 cycle by using SMULL SMLAL - at the cost of being 1050 @ 1 off. 1051 SMULL r0, r3, r6, r14 @ (r0,r3) = s0*T[0] 1052 SMULL r0, r4, r11,r12 @ (r0,r4) += s1*T[1] = s2 1053 ADD r3, r3, r4 1054 SMULL r0, r14,r11,r14 @ (r0,r14) = s1*T[0] 1055 SMULL r0, r12,r6, r12 @ (r0,r12) += s0*T[1] = s3 1056 SUB r14,r14,r12 1057 1058 @ r9 = s0b<<1 1059 @ r10= s1b<<1 1060 ADD r9, r3, r9, ASR #1 @ r9 = s0b + s2 1061 SUB r3, r9, r3, LSL #1 @ r3 = s0b - s2 1062 1063 SUB r12,r14,r10,ASR #1 @ r12= s3 - s1b 1064 ADD r10,r14,r10,ASR #1 @ r10= s3 + s1b 1065 STR r9, [r1],#4 1066 STR r10,[r1],#4 @ w0 += 2 1067 STR r3, [r7] 1068 STR r12,[r7,#4] 1069 1070 CMP r1,r7 1071 BLT step7_loop2 1072 1073 LDMFD r13!,{r0-r3} 1074 1075 @ r0 = points 1076 @ r1 = in 1077 @ r2 = step 1078 @ r3 = shift 1079 MOV r2, r2, ASR #2 @ r2 = step >>= 2 1080 CMP r2, #0 1081 CMPNE r2, #1 1082 BEQ mdct_end 1083 1084 @ step > 1 (default case) 1085 CMP r2, #4 @ r5 = T = (step>=4) ? 1086 LDRGE r5, =sincos_lookup0 @ sincos_lookup0 + 1087 LDRLT r5, =sincos_lookup1 @ sincos_lookup1 1088 ADD r7, r1, r0, LSL #1 @ r7 = iX = x + (n>>1) 1089 ADDGE r5, r5, r2, LSL #1 @ (step>>1) 1090mdct_step8_default: 1091 LDR r6, [r1],#4 @ r6 = s0 = x[0] 1092 LDR r8, [r1],#4 @ r8 = -s1 = x[1] 1093 LDR r12,[r5,#4] @ r12= T[1] 1094 LDR r14,[r5],r2,LSL #2 @ r14= T[0] T += step 1095 RSB r8, r8, #0 @ r8 = s1 1096 1097 @ XPROD31(s0, s1, T[0], T[1], x, x+1) 1098 @ x[0] = s0 * T[0] + s1 * T[1] x[1] = s1 * T[0] - s0 * T[1] 1099 SMULL r9, r10, r8, r12 @ (r9,r10) = s1 * T[1] 1100 CMP r1, r7 1101 SMLAL r9, r10, r6, r14 @ (r9,r10) += s0 * T[0] 1102 RSB r6, r6, #0 @ r6 = -s0 1103 SMULL r9, r11, r8, r14 @ (r9,r11) = s1 * T[0] 1104 MOV r10,r10,LSL #1 1105 SMLAL r9, r11, r6, r12 @ (r9,r11) -= s0 * T[1] 1106 STR r10,[r1,#-8] 1107 MOV r11,r11,LSL #1 1108 STR r11,[r1,#-4] 1109 BLT mdct_step8_default 1110 1111mdct_end: 1112 MOV r0, r2 1113 LDMFD r13!,{r4-r11,PC} 1114 1115cPI1_8: 1116 .word 0x7641af3d 1117cPI2_8: 1118 .word 0x5a82799a 1119cPI3_8: 1120 .word 0x30fbc54d 1121bitrev: 1122 .byte 0 1123 .byte 32 1124 .byte 16 1125 .byte 48 1126 .byte 8 1127 .byte 40 1128 .byte 24 1129 .byte 56 1130 .byte 4 1131 .byte 36 1132 .byte 20 1133 .byte 52 1134 .byte 12 1135 .byte 44 1136 .byte 28 1137 .byte 60 1138 .byte 2 1139 .byte 34 1140 .byte 18 1141 .byte 50 1142 .byte 10 1143 .byte 42 1144 .byte 26 1145 .byte 58 1146 .byte 6 1147 .byte 38 1148 .byte 22 1149 .byte 54 1150 .byte 14 1151 .byte 46 1152 .byte 30 1153 .byte 62 1154 .byte 1 1155 .byte 33 1156 .byte 17 1157 .byte 49 1158 .byte 9 1159 .byte 41 1160 .byte 25 1161 .byte 57 1162 .byte 5 1163 .byte 37 1164 .byte 21 1165 .byte 53 1166 .byte 13 1167 .byte 45 1168 .byte 29 1169 .byte 61 1170 .byte 3 1171 .byte 35 1172 .byte 19 1173 .byte 51 1174 .byte 11 1175 .byte 43 1176 .byte 27 1177 .byte 59 1178 .byte 7 1179 .byte 39 1180 .byte 23 1181 .byte 55 1182 .byte 15 1183 .byte 47 1184 .byte 31 1185 .byte 63 1186 1187 @ END 1188