📄 decoder_amr.asm
字号:
*****************************************************************************
** Description: Decoder_amr() in dec_amr.c **
** **
** Inputs **
** **
** Decoder_amrState *st **
** parm **
** synth **
** A_t **
** **
** Outputs: **
** **
** Decoder_amrState *st **
** synth **
** A_t **
** **
** Return value : **
** **
** Attribute : Cycles: Pm: **
** Modified Registers: **
** **
** Programmer : YANG zhiwei **
*****************************************************************************
.global _Decoder_amr
.ref _copy
.ref _D_plsf_3
.ref _Int_lpc_1to3
.ref _dec_lag3
.ref _Pred_lt_3or6
.ref _decode_2i40_9bits
.ref _Dec_gain
.ref _Int_lsf
.ref _agc2
.ref _Syn_filt
.ref _ph_disp
.ref _lsp_avg
.ref _Cb_gain_average
.ref past_lsf_q
.ref prev_lsf
.ref parm
.ref lsp_new
.ref dec_lsp_old
.ref A_t
.ref old_T0
.ref dec_exc
.ref dec_sharp
.ref code
.ref excp
.ref ltpGainHistory
.ref lsf_i
.ref exc_enhanced
.ref dec_mem_syn
.ref _synth
.ref dec_old_exc
.ref lockFull
.ref gainMem
.ref lsp_meanSave
.ref M
.ref L_FRAME
.ref L_SUBFR
.ref PIT_MIN
.ref PIT_MAX
.ref SHARPMAX
.ref L_INTERPOL
.ref MP1
_Decoder_amr:
addb sp,#24
movl xar2,#past_lsf_q ;xar2 point to st->lsfState->past_lsf_q
movl xar3,#prev_lsf
mov ar1,#M
lcr _copy ;Copy (st->lsfState->past_lsf_q, prev_lsf, M)
movl xar2,#parm
movl xar3,#lsp_new
lcr _D_plsf_3 ;D_plsf_3(st->lsfState, parm, lsp_new)
movl xar2,#parm+3
movl *-sp[22],xar2 ;parm += 3
movl xar2,#A_t ;xar2 point to A_t
movl xar4,#dec_lsp_old ;xar4 point to st->lsp_old
movl xar5,#lsp_new
lcr _Int_lpc_1to3
mov ar0,#M - 1 ;M loops
movl xar2,#dec_lsp_old ;xar2 point to st->lsp_old
movl xar3,#lsp_new
_loop_315:
mov al,*xar3++
mov *xar2++,al ;st->lsp_old[i] = lsp_new[i]
banz _loop_315,ar0--
movl xar2,#A_t
movl *-sp[20],xar2 ;Az = A_t
mov *-sp[18],#0 ;evenSubfr = 0
mov *-sp[17],#-1 ;subfrNr = -1
mov *-sp[2],#0 ;i_subfr = 0
_loop_338:
add *-sp[17],#1 ;subfrNr = add(subfrNr, 1)
mov al,#1
subr *-sp[18],al ;evenSubfr = sub(1, evenSubfr)
mov al,*-sp[2]
mov *-sp[11],al ;pit_flag = i_subfr
mov *-sp[15],#5 ;delta_frc_low = 5
mov *-sp[16],#9 ;delta_frc_range = 9
movl xar2,#old_T0
mov al,*xar2 ;al = st->old_T0
sub al,*-sp[15]
mov *-sp[13],al ;t0_min = sub(st->old_T0, delta_frc_low)
cmp *-sp[13],#PIT_MIN
bf _line_380,geq ;if ( t0_min >= PIT_MIN ) jump to _line_380
mov *-sp[13],#PIT_MIN
_line_380:
mov al,*-sp[13] ;al = t0_min
add al,*-sp[16] ;al = add(t0_min, delta_frc_range)
mov *-sp[14],al ;t0_max = add(t0_min, delta_frc_range)
cmp *-sp[14],#PIT_MAX
bf _line_388,leq ;if ( t0_max <= PIT_MAX ) jump to _line_388
mov *-sp[14],#PIT_MAX ;t0_max = PIT_MAX
mov al,*-sp[14] ;al = t0_max
sub al,*-sp[16] ;al = sub(t0_max, delta_frc_range)
mov *-sp[13],al ;t0_min = sub(t0_max, delta_frc_range)
_line_388:
movl xar3,*-sp[22]
movz ar2,*xar3
add *-sp[22],#1 ;ar2 = index= *parm++
movz ar3,*-sp[13] ;ar3 = t0_min
movz ar4,*-sp[14] ;ar4 = t0_max
movz ar5,*-sp[11] ;ar5 = pit_flag
movl xar7,#old_T0
mov ar6,*xar7 ;ar6 = st->old_T0
lcr _dec_lag3
mov *-sp[3],ar0 ;T0
mov *-sp[4],ar1 ;T0_frac
mov ar7,ar0 ;ar7 = T0
mov ar6,ar1 ;ar6 = frac
movl xar4,#dec_exc+1
movl xar0,*xar4 ;xar0 point to st->exc
lcr _Pred_lt_3or6
movl xar2,*-sp[22]
movz ar3,*xar2
add *-sp[22],#1 ;ar3 = index= *parm++
movl xar4,*-sp[22]
movz ar2,*xar4
add *-sp[22],#1 ;ar2 = i = parm++
movz ar1,*-sp[17] ;ar1 = subfrNr
movl xar4,#code ;xar4 point to code[]
lcr _decode_2i40_9bits
movl xar2,#dec_sharp
mov al,*xar2 ;al = st->sharp
lsl al,1
mov *-sp[10],al ;pit_sharp = shl (st->sharp, 1)
movz ar0,*-sp[3] ;i = T0
movl xar2,#code ;xar2 point to code[]
_loop_424:
cmp ar0,#L_SUBFR
bf line_439,geq ;if ( i >= L_SUBFR ) jump to _line_439
mov al,*-sp[3] ;al = T0
mov ar1,ar0 ;ar1 = i
sub ar1,al ;ar1 = i - T0
mov t,*+xar2[ar1] ;t = code[i - T0]
mpy acc,t,*-sp[10]
lsl acc,1 ;ah = temp = mult (code[i - T0], pit_sharp)
add *+xar2[ar0],ah ;code[i] = add (code[i], temp)
inc ar0 ;i++
bf _loop_424,unc
line_439:
movl xar2,*-sp[22]
mov al,*xar2
add *-sp[22],#1 ;al = index = *parm++
movl xar7,#code ;xar7 point to code[]
lcr _Dec_gain
mov *-sp[7],ar5 ;gain_pit
mov *-sp[8],ar6 ;gain_code
movl xar2,#dec_sharp ;xar2 point to st->sharp
cmp ar5,#SHARPMAX
bf _line_475,leq ;if (pit_sharp <= SHARPMAX) jump to _line_475
mov *-sp[10],#SHARPMAX ;pit_sharp = #SHARPMAX
mov *xar2,#SHARPMAX ;st->sharp = #SHARPMAX
bf _line_483,unc
_line_475:
mov *-sp[10],ar5 ;pit_sharp = gain_pit
mov *xar2,ar5 ;st->sharp = #SHARPMAX
_line_483:
mov al,*-sp[10]
lsl al,1
mov *-sp[10],al ;pit_sharp = shl (pit_sharp, 1)
cmp al,#16384
bf _line_501,leq ;if(pit_sharp <= 16384) jump to _line_501
mov ar0,#L_SUBFR - 1 ;L_SUBFR loops
movl xar3,#dec_exc+1
movl xar2,*xar3 ;xar2 point to st->exc[]
movl xar3,#excp ;xar3 point to excp[]
_loop_487:
mov t,*-sp[10] ;t = pit_sharp
mpy acc,t,*xar2++
lsl acc,1 ;ah = temp = mult (st->exc[i], pit_sharp)
mov t,*-sp[7] ;t = gain_pit
mpy acc,t,ah
lsl acc,1 ;accL_temp = L_mult (temp, gain_pit)
add acc,#0x0800<<4 ;acc = round (L_temp)
mov *xar3++,ah ;excp[i] = round (L_temp)
banz _loop_487,ar0--
_line_501:
mov ar0,#8 - 1 ;8 loops
movl xar2,#ltpGainHistory ;xar2 point to ltpGainHistory[0]
movl xar3,#ltpGainHistory + 1 ;xar3 point to ltpGainHistory[1]
_loop_502:
mov al,*xar3++ ;al = st->ltpGainHistory[i+1]
mov *xar2++,al ;st->ltpGainHistory[i] = al
banz _loop_502,ar0--
mov al,*-sp[7]
mov *xar2,al ;st->ltpGainHistory[8] = gain_pit
movl xar2,#prev_lsf
movl xar3,#past_lsf_q
movz ar5,*-sp[2] ;ar5 = i_subfr
movl xar4,#lsf_i
lcr _Int_lsf
movz ar2,*-sp[8] ;ar2 = gain_code
movl xar3,#lsf_i
movl xar4,#lsp_meanSave
lcr _Cb_gain_average
mov *-sp[9],ar2 ;gain_code_mix = Cb_gain_average()
mov al,*-sp[7]
mov *-sp[12],al ;pitch_fac = gain_pit
mov ar0,#L_SUBFR - 1 ;L_SUBFR loops
movl xar2,#exc_enhanced
movl xar4,#dec_exc + 1
movl xar3,*xar4 ;xar3 point to st->exc[]
movl xar4,#code
_loop_535:
mov al,*xar3 ;al = st->exc[i]
mov *xar2++,al ;exc_enhanced[i] = al
zapa
mov t,*-sp[12] ;t = pitch_fac
mpy p,t,*xar3
mov t,*-sp[8] ;t = gain_code
mpya p,t,*xar4++ ;acc = p<<pm,p = code[i] * gain_code
addl acc,p<<pm ;acc = L_mult (st->exc[i], pitch_fac) + L_mult (code[i], gain_code)
lsl acc,1 ;L_temp = L_shl (L_temp, tmp_shift)
add acc,#0x0800<<4 ;round (L_temp)
mov *xar3++,ah ;st->exc[i]= round (L_temp)
banz _loop_535,ar0--
movl xar2,#lockFull
mov *xar2,#0
movl xar2,#gainMem
movl xar3,#exc_enhanced
movz ar5,*-sp[9] ;ar5 = gain_code_mix
mov al,*-sp[7] ;al = gain_pit
movl xar4,#code
movz ar0,*-sp[12] ;ar0 = pitch_fac
lcr _ph_disp
cmp *-sp[10],#16384
bf _line_609,leq ;if ( pit_sharp <= 16384 )jump to _line_609
mov ar0,#L_SUBFR - 1 ;L_SUBFR loop
movl xar2,#exc_enhanced
movl xar3,#excp
_loop_598:
mov al,*xar2++
add *xar3++,al ;excp[i] = add (excp[i], exc_enhanced[i])
banz _loop_598,ar0--
movl xar4,#exc_enhanced
movl xar6,#excp
lcr _agc2
movl xar7,*-sp[20] ;xar7 ponit to Az
movl xar1,#excp
movl xar2,#_synth
mov acc,*-sp[2]
addl xar2,acc ;xar2 point to synth[i_subfr]
mov ar0,#L_SUBFR
movl xar3,#dec_mem_syn ;xar3 point to st->mem_syn
mov ar4,#0
lcr _Syn_filt
bf _line_630,unc
_line_609:
movl xar7,*-sp[20] ;xar7 ponit to Az
movl xar1,#exc_enhanced
movl xar2,#_synth
mov acc,*-sp[2]
addl xar2,acc ;xar2 point to synth[i_subfr]
mov ar0,#L_SUBFR
movl xar3,#dec_mem_syn ;xar3 point to st->mem_syn
mov ar4,#0
lcr _Syn_filt
_line_630:
movl xar2,#_synth + L_SUBFR - M
mov acc,*-sp[2]
addl xar2,acc ;xar2 point to synth[i_subfr+L_SUBFR-M]
movl xar3,#dec_mem_syn ;xar3 point to st->mem_syn
mov ar1,#M
lcr _copy
movl xar2,#dec_old_exc
mov acc,#L_SUBFR
addl xar2,acc ;xar2 point to st->old_exc[L_SUBFR]
movl xar3,#dec_old_exc
mov ar1,#PIT_MAX + L_INTERPOL
lcr _copy
mov acc,#MP1
addl *-sp[20],acc ;Az += MP1
mov al,*-sp[3]
movl xar2,#old_T0
mov *xar2,al ;st->old_T0 = T0
add *-sp[2],#L_SUBFR ;i_subfr += L_SUBFR
cmp *-sp[2],#L_FRAME
bf _loop_338,lt ;if ( i_subfr < L_FRAME ) jump to _loop_338
movl xar1,#past_lsf_q
lcr _lsp_avg
subb sp,#24
lretr
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -