📄 decode.s
字号:
shl r3,r2,5 // r3=j*32
add r3,r1 // r3=j*32+i
shl r3,2
addi r3,local_bit_alloc_byte // r3<=(addr. of bit_alloc[j][i])
mov AGRAdr4,r3
addi r2,1 // r2=j++
mov a4(0),r4
II_dec_ba_010:
addi r1,1 // r1=i++
II_dec_ba_020:
movb r8,LBfr_ps_sblimit
rsub r10,r10,r8 // r10=sblimit(r8)-jsbound(r10)
bz II_dec_ba_030
loop r10,II_dec_ba_030 // for(i=jsbound;i<sblimit;i++)
add r4,r0,r1 // r4<=(address of table aloc_idx)
movb r3,l4
addi r4,r3,local_B2Abits
movb r3,l4 // r3=alloc[i][0].bits
gb r4,r3
shl r3,r1,2
addi r3,local_bit_alloc_byte // r3<=(addr. of bit_alloc[j][i])
mov AGRAdr4,r3
addi r1,1 // r1=i++
mov a4(2*32),r4
mov r3,a4(2*32) // dumi
mov a4(0),r4
II_dec_ba_030:
rsubi r10,r8,SBLIMIT // r10=SBLIMIT-sblimit(r8)
bz II_dec_ba_050
tsti r9,0
beq II_dec_ba_050
movi r4,0
loop r10,II_dec_ba_050 // for(i=sblimit;i<SBLIMIT;i++)
movi r2,0
loop r9,II_dec_ba_040 // for(j=0;j<stereo;j++)
shl r3,r2,5 // r3=j*32
add r3,r1 // r3=j*32+i
shl r3,2
addi r3,local_bit_alloc_byte // r3<=(addr. of bit_alloc[j][i])
mov AGRAdr4,r3
addi r2,1 // r2=j++
mov a4(0),r4
II_dec_ba_040:
addi r1,1 // r1=i++
II_dec_ba_050:
SET_TrapReg
nop
nop
II_decode_bitalloc_done:
j r26
SUB_II_decode_scale:
#if RHDEBUG
movi r3,local_ITscfsi_byte // r3<=(addr. of scfsi[0][0])
Mov AGRAdr4,r3
movi r4,0
CLR_TrapReg
loop SBLIMIT,II_dec_sc_dbg // for(i=0;i<SBLIMIT;i++)
loop 2,II_dec_sc_dbg // for(j=0;j<2;j++)
mov a4(4),r4 // clear scfsi[j][i]
II_dec_sc_dbg:
SET_TrapReg
#endif
movb r8,LBfr_ps_sblimit
movb r9,LBfr_ps_stereo
tsti r8,0
beq II_dec_sc_020
tsti r9,0
beq II_dec_sc_020
/* decode scfsi[j][i] */
CLR_TrapReg_1
nop
movi r1,0
loop r8,II_dec_sc_020 // for(i=0;i<sblimit;i++)
movi r2,0
loop r9,II_dec_sc_010 // for(j=0;j<stereo;j++)
shl r3,r2,5 // r3=j*32
add r3,r1 // r3=j*32+i
shl r3,2
addi r10,r3,local_bit_alloc_byte // r10<=(addr. of bit_alloc[j][i])
movb r4,l10 // r4=bit_alloc[j][i]
tsti r4,0
beq II_dec_sc_002
gbi r4,2
addi r3,local_ITscfsi_byte // r3<=(addr. of scfsi[j][i])
mov AGRAdr4,r3
nop
mov a4(0),r4 // load scfsi[j][i]
II_dec_sc_002:
addi r2,1 // r2=j++
II_dec_sc_010:
addi r1,1 // r1=i++
II_dec_sc_020:
SET_TrapReg
rsubi r10,r8,SBLIMIT // r10=SBLIMIT-sblimit(r8)
tsti r10,0
beq II_dec_sc_040
tsti r9,0
beq II_dec_sc_040
CLR_TrapReg_1
nop
movi r4,0
loop r10,II_dec_sc_040 // for(i=sblimit;i<SBLIMIT;i++)
movi r2,0
loop r9,II_dec_sc_030 // for(j=0;j<stereo;j++)
shl r3,r2,5 // r3=j*32
add r3,r1 // r3=j*32+i
shl r3,2
addi r3,local_ITscfsi_byte // r3<=(addr. of scfsi[j][i])
mov AGRAdr4,r3
nop
mov a4(0),r4
addi r2,1 // r2=j++
II_dec_sc_030:
addi r1,1 // r1=i++
II_dec_sc_040:
SET_TrapReg
/* decode scale_index[j][k][i] */
tsti r8,0
beq II_dec_sc_060
tsti r9,0
beq II_dec_sc_060
CLR_TrapReg_1
nop
movi r1,0
loop r8,II_dec_sc_060 // for(i=0;i<sblimit;i++)
movi r2,0
loop r9,II_dec_sc_050 // for(j=0;j<stereo;j++)
shl r3,r2,5 // r3=j*32
add r3,r1 // r3=j*32+i
shl r3,2
addi r10,r3,local_bit_alloc_byte // r10<=(addr. of bit_alloc[j][i])
movb r4,l10 // r4=bit_alloc[j][i]
multi r10,r2,3*32 // r10=j*3*32
nop
nop
nop
add r10,r1 // r10=j*3*32+i
shl r10,2 // r10=(j*3*32+i)*4
addi r10,local_scale_index_byte
mov AGRAdr4,r10
tsti r4,0
beq II_dec_sc_054 // branch if bit_alloc[j][i]==0
addi r3,local_ITscfsi_byte // r3<=(addr. of scfsi[j][i])
movb r4,l3
tsti r4,0
bne II_dec_sc_051
gbi r4,6 // --- case 0 ---
nop
mov a4(2*32),r4 // load scale_index[j][0][i]
gbi r4,6
mov r10,a4(2*32) // dumi
mov a4(2*32),r4 // load scale_index[j][1][i]
gbi r4,6
mov r10,a4(2*32) // dumi
mov a4(0),r4 // load scale_index[j][2][i]
j II_dec_sc_058
II_dec_sc_051:
tsti r4,1
bne II_dec_sc_052
gbi r4,6 // --- case 1 ---
nop
mov a4(2*32),r4 // load scale_index[j][0][i]
mov r10,a4(2*32) // dumi
mov a4(2*32),r4 // load scale_index[j][1][i]
gbi r4,6
mov r10,a4(2*32) // dumi
mov a4(0),r4 // load scale_index[j][2][i]
j II_dec_sc_058
II_dec_sc_052:
tsti r4,3
bne II_dec_sc_053
gbi r4,6 // --- case 3 ---
nop
mov a4(2*32),r4 // load scale_index[j][0][i]
gbi r4,6
mov r10,a4(2*32) // dumi
mov a4(2*32),r4 // load scale_index[j][1][i]
mov r10,a4(2*32) // dumi
mov a4(0),r4 // load scale_index[j][2][i]
j II_dec_sc_058
II_dec_sc_053:
tsti r4,2
bne II_dec_sc_058
gbi r4,6 // --- case 2 ---
nop
mov a4(2*32),r4 // load scale_index[j][0][i]
mov r10,a4(2*32) // dumi
mov a4(2*32),r4 // load scale_index[j][1][i]
mov r10,a4(2*32) // dumi
mov a4(0),r4 // load scale_index[j][2][i]
j II_dec_sc_058
II_dec_sc_054: // else
movi r4,SCALE_RANGE-1
mov a4(2*32),r4 // load scale_index[j][0][i]
mov r10,a4(2*32) // dumi
mov a4(2*32),r4 // load scale_index[j][1][i]
mov r10,a4(2*32) // dumi
mov a4(0),r4 // load scale_index[j][2][i]
II_dec_sc_058:
addi r2,1 // r2=j++
II_dec_sc_050:
addi r1,1 // r1=i++
II_dec_sc_060:
SET_TrapReg
rsubi r10,r8,SBLIMIT // r10=SBLIMIT-sblimit(r8)
bz II_dec_sc_080
tsti r9,0
beq II_dec_sc_080
movi r4,SCALE_RANGE-1
CLR_TrapReg_1
shl r3,r1,2
addi r3,local_scale_index_byte-(3*32+1)*4
loop r10,II_dec_sc_080 // for(i=sblimit;i<SBLIMIT;i++)
addi r3,4
mov r2,r3
loop r9,II_dec_sc_070 // for(j=0;j<stereo;j++)
addi r2,3*32*4 // r3=(j*3*32+i)*4
mov AGRAdr4,r2
nop
mov a4(2*32),r4 // load scale_index[j][0][i]
mov r1,a4(2*32) // dumi
mov a4(2*32),r4 // load scale_index[j][1][i]
mov r1,a4(2*32) // dumi
mov a4(0),r4 // load scale_index[j][2][i]
II_dec_sc_070:
II_dec_sc_080:
SET_TrapReg
II_decode_scale_done:
j r26
SUB_II_buffer_sample:
movi AGRSiz4,0xffff
movi AGRSiz5,0xffff
movb r8,LBfr_ps_sblimit
movb r9,LBfr_ps_stereo
movi r1,0
II_buf_sp_100_loop_start: // for(i=0; i < sblimit(in r8); i++)
mov r7,r9 // r7=stereo
tstb r1,LBfr_ps_jsbound // (i>jsbound)?
blt 2f // branch if i<jsbound ( r7=stereo )
movi r7,1 // r7=1 ( i>=jsbound )
2:
movi r0,local_ITaloc_idx_byte
movi r2,0
CLR_TrapReg_1
tsti r7,0
beq II_buf_sp_090
loop r7,II_buf_sp_090 // for(j=0;j<((i<jsbound)?stereo:1);j++)
shl r3,r2,5 // r3=j*32
add r3,r1 // r3=j*32+i
shl r3,2 // r3=(j*32+i)*4
addi r10,r3,local_bit_alloc_byte // r10<=(addr. of bit_alloc[j][i])
multi r5,r2,3*32 // r5=j*3*32
movb r4,l10 // r4=bit_alloc[j][i]
add r5,r1 // r5=j*3*32+i
shl r5,2 // r5=(j*3*32+i)*4
addi r5,local_sample_byte // r5=addr. of sample[j][0][i]
mov AGRAdr4,r5
tsti r4,0
beq II_buf_sp_080 // branch if bit_alloc[j][i]==0
add r3,r0,r1 // r3<=(address of table aloc_idx)
movb r5,l3 // r5=aloc_idx[i]
add r5,r4 // r5=aloc_idx[i]+bit_alloc[j][i]
addi r3,r5,local_B2Agroup
movb r6,l3 // r6=alloc[i][bit_alloc[j][i]].group
tsti r6,3
bne II_buf_sp_020 // branch if alloc[i][bit_alloc[j][i]].group!=3
addi r3,r5,local_B2Abits // r3=k=bit_alloc[j][i].bits
movb r6,l3 // r6=alloc[i][bit_alloc[j][i]].bits
loop 3,II_buf_sp_018 // for(m=0;m<3;m++)
gb r3,r6 // getbits(bs,alloc[i][bit_alloc[j][i]].bits)
mov a4(2*32),r3 // load sample[j][m][i]
mov r3,a4(2*32) // dumi
II_buf_sp_018:
j II_buf_sp_088
II_buf_sp_020: // else (bit_alloc[j][i].group!=3)
shl r3,r5,1 // offset for half data
addi r3,local_I2Asteps
movh r4,l3 // r4=nlevels=bit_alloc[j][i].steps
addi r3,r5,local_B2Abits
movb r6,l3 // r6=k=bit_alloc[j][i].bits
#ifdef EFFECT
shl r5,r2,6 //2*32
shl r3,r2,5 //1*32
add r5,r3 //3*32
#else //EFFECT
multi r5,r2,3*32 // r5=j*3*32
nop
nop
nop
#endif //EFFECT
gb r3,r6 // r3=c=getbits(bs,k)
add r5,r1 // r5=j*3*32+i
shl r5,2 // r5=(j*3*32+i)*4
addi r5,local_sample_byte // r5=addr. of sample[j][0][i]
mov AGRAdr4,r5
shl r4,15 // shift divisor (nlevels) left by 15
loop 3,II_buf_sp_028 // for(k=0;k<3;k++)
loop 16,5f // division loop
sub r5,r3,r4 // ACC-[dma*(2^15)]
bgte 1f // branch if result positive
shl r5,r3,1 // shift dividend left by 1
j 2f
1:
shl r5,1 // shift dividend left by 1
addi r5,1 // set LSB to 1
2:
mov r3,r5 // save dividend
5:
andi r3,r5,0xffff // mask lower half (quotient) into r3
shr r10,r5,16 // shift upper half (remainder) into r10
mov a4(2*32),r10 // load sample[j][k][i]
mov r10,a4(2*32) // dumi
II_buf_sp_028:
j II_buf_sp_088
II_buf_sp_080: // else (bit_alloc[j][i]=0)
movi r10,0
loop 3,II_buf_sp_088 // for(k=0;k<3;k++)
mov a4(2*32),r10 // clear sample[j][k][i]
mov r4,a4(2*32) // dumi
II_buf_sp_088:
movb r4,LBfr_ps_stereo
tsti r4,2
bne 2f // b if stereo != 2
tstb r1,LBfr_ps_jsbound
blt 2f // b if i < jsbound
shl r5,r1,2 // r5=i*4
addi r5,local_sample_byte // r5=addr. of sample[0][0][i]
mov AGRAdr4,r5
addi r5,3*32*4 // r5=addr. of sample[1][0][i]
mov AGRAdr5,r5
loop 3,2f // for(k=0;k<3;k++)
mov r5,a4(2*32) // clear sample[0][k][i]
mov r4,a4(2*32) // dumi
mov a5(2*32),r5 // sample[1][k][i] = sample[0][k][i]
mov r4,a5(2*32) // dumi
2:
addi r2,1 // r2=j++
II_buf_sp_090:
SET_TrapReg
addi r1,1 // r1=i++
tst r1,r8
blt II_buf_sp_100_loop_start // loop if i<sblimit (r8)
II_buf_sp_100:
rsubi r10,r8,SBLIMIT // r10=SBLIMIT-sblimit(r8)
tsti r10,0
beq II_buffer_sample_done
tsti r9,0
beq II_buffer_sample_done
shl r5,r1,2
addi r5,local_sample_byte // r5=addr. of sample[0][0][sblimit]
CLR_TrapReg
#ifdef EFFECT
movi r3,0
#endif //EFFECT
loop r10,6f // for(i=sblimit;i<SBLIMIT;i++)
movi r2,0
loop r9,4f // for(j=0;j<stereo;j++)
#ifdef EFFECT
shl r5,r2,6 //2*32
shl r4,r2,5 //1*32
add r5,r4
#else //EFFECT
multi r5,r2,3*32 // r5=j*3*32
nop
nop
nop
movi r3,0
#endif //EFFECT
add r5,r1 // r5=j*3*32+i
shl r5,2 // r5=(j*3*32+i)*4
addi r5,local_sample_byte // r5=addr. of sample[j][0][i]
mov AGRAdr4,r5
loop 3,2f // for(k=0;k<3;k++)
mov a4(2*32),r3 // clear sample[j][k][i]
mov r5,a4(2*32) // dumi
2:
addi r2,1 // r2=j++
4:
addi r1,1 // r1=i++
6:
SET_TrapReg
II_buffer_sample_done:
j r26
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -