⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imdct_l_arm.s

📁 OggPlay for Symbian 是symbian上的一个媒体播放程序的源码。它支持ogg,wav等等多媒体格式。
💻 S
📖 第 1 页 / 共 3 页
字号:

    movs    r4, r4, lsr #28
    adc     r4, r4, r5, lsl #4          @ r4 = bits[59..28] of r4..r5
    str     r4, [r1, #x1]               @ store result x1

    @----

    ldmia   sp, { r2, r3, r4, r5 }      @ r2..r3 = ct06, r4..r5 = ct04 (dont update sp)

    @ r2..r3 = ct06
    @ r4..r5 = ct04
    @ r6     = ct15
    @ r7     = ct14
    @ r8     = ct16
    @ r9     = ct17
    @ r10    = -K03
    @ r11    = -K02
    @ r12    = -K14
    @ lr     =  K15

    rsbs    r2, r2, #0
    rsc     r3, r3, #0                  @ r2..r3 = -ct06

    smlal   r2, r3, r12, r7             @ r2..r3  = -ct06 + (ct14 * -K14)
    smlal   r2, r3, r10, r8             @ r2..r3 += (ct16 * -K03)

    smlal   r4, r5, r12, r6             @ r4..r5  =  ct04 + (ct15 * -K14)
    smlal   r4, r5, r10, r9             @ r4..r5 += (ct17 * -K03)
    smlal   r4, r5,  lr, r8             @ r4..r5 += (ct16 *  K15)
    smlal   r4, r5, r11, r7             @ r4..r5 += (ct14 * -K02)

    rsb     lr, lr, #0                  @ lr  = -K15
    rsb     r11, r11, #0                @ r11 =  K02

    smlal   r2, r3,  lr, r9             @ r2..r3 += (ct17 * -K15)
    smlal   r2, r3, r11, r6             @ r2..r3 += (ct15 *  K02)

    movs    r4, r4, lsr #28
    adc     r4, r4, r5, lsl #4          @ r4 = bits[59..28] of r4..r5
    str     r4, [r1, #x25]              @ store result x25

    movs    r2, r2, lsr #28
    adc     r2, r2, r3, lsl #4          @ r2 = bits[59..28] of r2..r3
    str     r2, [r1, #x19]              @ store result x19

    @----

    ldr     r2, [sp, #16]               @ r2 = ct01_l
    ldr     r3, [sp, #20]               @ r3 = ct01_h

    ldr     r6, [r0, #X1]
    ldr     r8, [r0, #X7]
    ldr     r9, [r0, #X10]
    ldr     r7, [r0, #X16]

    rsbs    r2, r2, #0
    rsc     r3, r3, #0                  @ r2..r3 = -ct01

    mov     r4, r2
    mov     r5, r3                      @ r4..r5 = -ct01

    @ r2..r3 = -ct01
    @ r4..r5 = -ct01
    @ r6     =  X1
    @ r7     =  X16
    @ r8     =  X7
    @ r9     =  X10
    @ r10    = -K03
    @ r11    =  K02
    @ r12    = -K14
    @ lr     = -K15

    smlal   r4, r5, r12, r7             @ r4..r5 = -ct01 + (X16 * -K14)
    smlal   r2, r3,  lr, r9             @ r2..r3 = -ct01 + (X10 * -K15)

    smlal   r4, r5, r10, r8             @ r4..r5 += (X7  * -K03)
    smlal   r2, r3, r10, r7             @ r2..r3 += (X16 * -K03)

    smlal   r4, r5, r11, r9             @ r4..r5 += (X10 *  K02)
    smlal   r2, r3, r12, r8             @ r2..r3 += (X7  * -K14)

    rsb     lr, lr, #0                  @ lr  =  K15
    rsb     r11, r11, #0                @ r11 = -K02

    smlal   r4, r5,  lr, r6             @ r4..r5 += (X1  *  K15) = ct05
    smlal   r2, r3, r11, r6             @ r2..r3 += (X1  * -K02) = ct03

    stmdb   sp!, { r2, r3, r4, r5 }     @ stack ct05_h, ct05_l, ct03_h, ct03_l

    rsbs    r4, r4, #0
    rsc     r5, r5, #0                  @ r4..r5 = -ct05

    stmdb   sp!, { r4, r5 }             @ stack -ct05_h, -ct05_l

    ldr     r2, [sp, #48]               @ r2 = ct00_l
    ldr     r3, [sp, #52]               @ r3 = ct00_h

    rsb     r10, r10, #0                @ r10 = K03

    rsbs    r4, r2, #0
    rsc     r5, r3, #0                  @ r4..r5 = -ct00

    @ r2..r3 =  ct00
    @ r4..r5 = -ct00
    @ r6     =  X1
    @ r7     =  X16
    @ r8     =  X7
    @ r9     =  X10
    @ r10    =  K03
    @ r11    = -K02
    @ r12    = -K14
    @ lr     =  K15

    smlal   r4, r5, r10, r6             @ r4..r5 = -ct00 + (X1  * K03)
    smlal   r2, r3, r10, r9             @ r2..r3 =  ct00 + (X10 * K03)

    smlal   r4, r5, r12, r9             @ r4..r5 += (X10 * -K14)
    smlal   r2, r3, r12, r6             @ r2..r3 += (X1  * -K14)

    smlal   r4, r5, r11, r7             @ r4..r5 += (X16 * -K02)
    smlal   r4, r5,  lr, r8             @ r4..r5 += (X7  *  K15) = ct07

    rsb     lr, lr, #0                  @ lr  = -K15
    rsb     r11, r11, #0                @ r11 =  K02

    smlal   r2, r3, r11, r8             @ r2..r3 += (X7  *  K02)
    smlal   r2, r3,  lr, r7             @ r2..r3 += (X16 * -K15) = ct02

    rsbs    r6, r4, #0
    rsc     r7, r5, #0                  @ r6..r7 = -ct07

    stmdb   sp!, { r2 - r7 }            @ stack -ct07_h, -ct07_l, ct07_h, ct07_l, ct02_h, ct02_l


    @----

    add     r2, pc, #(imdct36_long_karray-.-8)  @ r2 = base address of Knn array (PIC safe ?)


loop:
    ldr     r12, [r0, #X0]

    ldmia   r2!, { r5 - r11 }           @ first 7 words from Karray element

    smull   r3, r4, r5, r12             @ sum =  (Kxx * X0)
    ldr     r12, [r0, #X2]
    ldr     r5,  [r0, #X3]
    smlal   r3, r4, r6, r12             @ sum += (Kxx * X2)
    ldr     r12, [r0, #X5]
    ldr     r6,  [r0, #X6]
    smlal   r3, r4, r7, r5              @ sum += (Kxx * X3)
    smlal   r3, r4, r8, r12             @ sum += (Kxx * X5)
    ldr     r12, [r0, #X8]
    ldr     r5,  [r0, #X9]
    smlal   r3, r4, r9, r6              @ sum += (Kxx * X6)
    smlal   r3, r4, r10, r12            @ sum += (Kxx * X8)
    smlal   r3, r4, r11, r5             @ sum += (Kxx * X9)

    ldmia   r2!, { r5 - r10 }           @ final 6 words from Karray element

    ldr     r11, [r0, #X11]
    ldr     r12, [r0, #X12]
    smlal   r3, r4, r5, r11             @ sum += (Kxx * X11)
    ldr     r11, [r0, #X14]
    ldr     r5,  [r0, #X15]
    smlal   r3, r4, r6, r12             @ sum += (Kxx * X12)
    smlal   r3, r4, r7, r11             @ sum += (Kxx * X14)
    ldr     r11, [r0, #X17]
    smlal   r3, r4, r8, r5              @ sum += (Kxx * X15)
    smlal   r3, r4, r9, r11             @ sum += (Kxx * X17)

    add     r5, sp, r10, lsr #16        @ create index back into stack for required ctxx

    ldmia   r5, { r6, r7 }              @ r6..r7 = ctxx

    mov     r8, r10, lsl #16            @ push ctxx index off the top end

    adds    r3, r3, r6                  @ add low words
    adc     r4, r4, r7                  @ add high words, with carry
    movs    r3, r3, lsr #28
    adc     r3, r3, r4, lsl #4          @ r3 = bits[59..28] of r3..r4

    str     r3, [r1, r8, lsr #24]       @ push completion flag off the bottom end

    movs    r8, r8, lsl #8              @ push result location index off the top end
    beq     loop                        @ loop back if completion flag not set
    b       imdct_l_windowing           @ branch to windowing stage if looping finished

imdct36_long_karray:

    .word   K17, -K13,  K10, -K06, -K05,  K01, -K00,  K04, -K07,  K11,  K12, -K16, 0x00000000
    .word   K13,  K07,  K16,  K01,  K10, -K05,  K04, -K11,  K00, -K17,  K06, -K12, 0x00200800
    .word   K11,  K17,  K05,  K12, -K01,  K06, -K07,  K00, -K13,  K04, -K16,  K10, 0x00200c00
    .word   K07,  K00, -K12,  K05, -K16, -K10,  K11, -K17,  K04,  K13,  K01,  K06, 0x00001400
    .word   K05,  K10, -K00, -K17,  K07, -K13,  K12,  K06, -K16,  K01, -K11, -K04, 0x00181800
    .word   K01,  K05, -K07, -K11,  K13,  K17, -K16, -K12,  K10,  K06, -K04, -K00, 0x00102000
    .word  -K16,  K12, -K11,  K07,  K04, -K00, -K01,  K05, -K06,  K10,  K13, -K17, 0x00284800
    .word  -K12,  K06,  K17, -K00, -K11,  K04,  K05, -K10,  K01,  K16, -K07, -K13, 0x00085000
    .word  -K10,  K16,  K04, -K13, -K00,  K07,  K06, -K01, -K12, -K05,  K17,  K11, 0x00105400
    .word  -K06, -K01,  K13,  K04,  K17, -K11, -K10, -K16, -K05,  K12,  K00,  K07, 0x00185c00
    .word  -K04, -K11, -K01,  K16,  K06,  K12,  K13, -K07, -K17, -K00, -K10, -K05, 0x00006000
    .word  -K00, -K04, -K06, -K10, -K12, -K16, -K17, -K13, -K11, -K07, -K05, -K01, 0x00206801


    @----
    @-------------------------------------------------------------------------
    @----

imdct_l_windowing:

    ldr     r11, [sp, #80]              @ fetch function parameter 3 from out of the stack
    ldmia   r1!, { r0, r2 - r9 }        @ load 9 words from x0, update pointer

    @ r0     = x0
    @ r1     = &x[9]
    @ r2     = x1
    @ r3     = x2
    @ r4     = x3
    @ r5     = x4
    @ r6     = x5
    @ r7     = x6
    @ r8     = x7
    @ r9     = x8
    @ r10    = .
    @ r11    = window mode: (0 == normal), (1 == start block), (3 == stop block)
    @ r12    = .
    @ lr     = .

    cmp     r11, #BLOCK_MODE_STOP       @ setup flags
    rsb     r10, r0, #0                 @ r10 = -x0 (DONT change flags !!)
    beq     stop_block_x0_to_x17


    @ start and normal blocks are treated the same for x[0]..x[17]

normal_block_x0_to_x17:

    ldr     r12, =WL9                   @ r12 = window_l[9]

    rsb     r0,  r9, #0                 @ r0  = -x8
    rsb     r9,  r2, #0                 @ r9  = -x1
    rsb     r2,  r8, #0                 @ r2  = -x7
    rsb     r8,  r3, #0                 @ r8  = -x2
    rsb     r3,  r7, #0                 @ r3  = -x6
    rsb     r7,  r4, #0                 @ r7  = -x3
    rsb     r4,  r6, #0                 @ r4  = -x5
    rsb     r6,  r5, #0                 @ r6  = -x4

    @ r0     = -x8
    @ r1     = &x[9]
    @ r2     = -x7
    @ r3     = -x6
    @ r4     = -x5
    @ r5     = .
    @ r6     = -x4
    @ r7     = -x3
    @ r8     = -x2
    @ r9     = -x1
    @ r10    = -x0
    @ r11    = window mode: (0 == normal), (1 == start block), (3 == stop block)
    @ r12    = window_l[9]
    @ lr     = .

    smull   r5, lr, r12, r0             @ r5..lr = (window_l[9]  * (x[9]  == -x[8]))
    ldr     r12, =WL10                  @ r12 = window_l[10]
    movs    r5, r5, lsr #28
    adc     r0, r5, lr, lsl #4          @ r0 = bits[59..28] of windowed x9

    smull   r5, lr, r12, r2             @ r5..lr = (window_l[10] * (x[10] == -x[7]))
    ldr     r12, =WL11                  @ r12 = window_l[11]
    movs    r5, r5, lsr #28
    adc     r2, r5, lr, lsl #4          @ r2 = bits[59..28] of windowed x10

    smull   r5, lr, r12, r3             @ r5..lr = (window_l[11] * (x[11] == -x[6]))
    ldr     r12, =WL12                  @ r12 = window_l[12]
    movs    r5, r5, lsr #28
    adc     r3, r5, lr, lsl #4          @ r3 = bits[59..28] of windowed x11

    smull   r5, lr, r12, r4             @ r5..lr = (window_l[12] * (x[12] == -x[5]))
    ldr     r12, =WL13                  @ r12 = window_l[13]
    movs    r5, r5, lsr #28
    adc     r4, r5, lr, lsl #4          @ r4 = bits[59..28] of windowed x12

    smull   r5, lr, r12, r6             @ r5..lr = (window_l[13] * (x[13] == -x[4]))
    ldr     r12, =WL14                  @ r12 = window_l[14]
    movs    r5, r5, lsr #28
    adc     r6, r5, lr, lsl #4          @ r6 = bits[59..28] of windowed x13

    smull   r5, lr, r12, r7             @ r5..lr = (window_l[14] * (x[14] == -x[3]))
    ldr     r12, =WL15                  @ r12 = window_l[15]
    movs    r5, r5, lsr #28
    adc     r7, r5, lr, lsl #4          @ r7 = bits[59..28] of windowed x14

    smull   r5, lr, r12, r8             @ r5..lr = (window_l[15] * (x[15] == -x[2]))
    ldr     r12, =WL16                  @ r12 = window_l[16]
    movs    r5, r5, lsr #28
    adc     r8, r5, lr, lsl #4          @ r8 = bits[59..28] of windowed x15

    smull   r5, lr, r12, r9             @ r5..lr = (window_l[16] * (x[16] == -x[1]))
    ldr     r12, =WL17                  @ r12 = window_l[17]
    movs    r5, r5, lsr #28
    adc     r9, r5, lr, lsl #4          @ r9 = bits[59..28] of windowed x16

    smull   r5, lr, r12, r10            @ r5..lr = (window_l[17] * (x[17] == -x[0]))
    ldr     r12, =WL0                   @ r12 = window_l[0]
    movs    r5, r5, lsr #28
    adc     r10, r5, lr, lsl #4         @ r10 = bits[59..28] of windowed x17


    stmia   r1,  { r0, r2 - r4, r6 - r10 } @ store windowed x[9] .. x[17]
    ldmdb   r1!, { r0, r2 - r9 }           @ load 9 words downto (and including) x0


    smull   r10, lr, r12, r0            @ r10..lr = (window_l[0] * x[0])
    ldr     r12, =WL1                   @ r12 = window_l[1]
    movs    r10, r10, lsr #28
    adc     r0, r10, lr, lsl #4         @ r0 = bits[59..28] of windowed x0

    smull   r10, lr, r12, r2            @ r10..lr = (window_l[1] * x[1])
    ldr     r12, =WL2                   @ r12 = window_l[2]
    movs    r10, r10, lsr #28
    adc     r2, r10, lr, lsl #4         @ r2 = bits[59..28] of windowed x1

    smull   r10, lr, r12, r3            @ r10..lr = (window_l[2] * x[2])
    ldr     r12, =WL3                   @ r12 = window_l[3]
    movs    r10, r10, lsr #28
    adc     r3, r10, lr, lsl #4         @ r3 = bits[59..28] of windowed x2

    smull   r10, lr, r12, r4            @ r10..lr = (window_l[3] * x[3])
    ldr     r12, =WL4                   @ r12 = window_l[4]
    movs    r10, r10, lsr #28
    adc     r4, r10, lr, lsl #4         @ r4 = bits[59..28] of windowed x3

    smull   r10, lr, r12, r5            @ r10..lr = (window_l[4] * x[4])

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -