?? cb_gain_average.asm
字號:
*****************************************************************************
** Description: Cb_gain_average() in c_g_aver **
** **
** Inputs **
** **
** Cb_gain_averageState *st,
** ar2--- Word16 gain_code,
** xar3---word16 lsp[],
** xar4--- Word16 lspAver[] **
** Outputs: **
** Cb_gain_averageState *st **
** return ar2 **
** **
** Attribute : Cycles: 3032 Pm: 116 **
** Modified Registers: all _buffer1 **
** **
** Programmer : xiewei **
*****************************************************************************
.ref _div_s
.ref _buffer1
.ref hangVar
.ref hangCount
.ref cbGainHistory
.ref L_CBGAINHIST
.global _Cb_gain_average
_Cb_gain_average: ; cbGainMix = gain_code
;for (i = 0; i < (L_CBGAINHIST-1=6); i++)
ADDB SP,#16
MOVL XAR6,#cbGainHistory
MOVL XAR5,#cbGainHistory
ADDB XAR6,#1
MOV AR0,#5
;st->cbGainHistory[i] = st->cbGainHistory[i+1];
_loop_27
MOV AH,*XAR6++
MOV *XAR5++,AH
BANZ _loop_27,AR0--
MOVL XAR5,#cbGainHistory
ADDB XAR5,#6
;st->cbGainHistory[L_CBGAINHIST-1] = gain_code;
MOV *XAR5,AR2
MOV *-SP[12],AR2 ; for (i = 0; i < M; i++) ;
MOVL XAR6,#_buffer1
MOV AR0,#9
_loop_37
MOV AH,*XAR4 ;tmp1 = abs_s(sub(lspAver[i], lsp[i]))
SUB AH,*XAR3++
MOV AL,#0
ABS ACC
CSB ACC ;shift1 = sub(norm_s(tmp1), 1);
MOV AL,T
SUB AL,#1
MOV *-SP[2],AL
MOV T,AL ;tmp1 = shl(tmp1, shift1)
LSL AH,T
MOV AR1,AH
MOV AH,*XAR4++ ;shift2 = norm_s(lspAver[i])
CSB ACC
MOV *-SP[4],T
LSL AH,T ;tmp2 = shl(lspAver[i], shift2)
MOV AR2,AH
LCR _div_s ;tmp[i] = div_s(tmp1, tmp2)
MOV *XAR6,AL
MOV AH,*-SP[2] ; shift = sub(add(2, shift1), shift2);
ADD AH,#2
SUB AH,*-SP[4]
SB _line_79,LT
MOV AL,*XAR6 ; tmp[i] = shr(tmp[i], shift);
MOV T,AH
ASR AL,T
B _line_84, UNC
_line_79:
NEG AH ;tmp[i] = shl(tmp[i], negate(shift));
MOV T,AH
LSL AL,T
; MOV AH,*-SP[4]
_line_84:
MOV *XAR6++,AL
BANZ _loop_37,AR0--
MOVL XAR6,#_buffer1
MOV AL,*XAR6++
;by yangzhw ; diff = tmp[0];
MOV AR0,#9 - 1 ;for (i = 1; i < M; i++)
_loop_73:
; diff = add(diff, tmp[i]);
ADD AL,*XAR6++
BANZ _loop_73,AR0--
MOV *-SP[6],AL
MOVL XAR5,#hangVar
MOV AH,*XAR5
SUB AL,#5325 ;if (sub(diff, 5325) > 0)
SB _line_103,LEQ
ADD AH,#1 ;st->hangVar = add(st->hangVar, 1);
MOV *XAR5,AH
B _line_107,UNC
_line_103:
MOV *XAR5,#0 ;st->hangVar = 0
_line_107:
MOV AH,*XAR5 ;ah = st->hangVar
SUB AH,#10 ;if (sub(st->hangVar, 10) > 0)
MOVL XAR5,#hangCount ;xar5 point to hangCount
SB _line_91,LEQ
;st->hangCount = 0;
MOV *XAR5,#0
_line_91:
MOV AR2,#8192 ;bgMix = 8192
MOV AL,*-SP[6] ; tmp_diff = sub(diff, 3277)
SUB AL,#3277 ;al = tmp_diff
SB _line_95,LEQ ;if (tmp_diff > 0)
MOV AR1,AL ; tmp1 = tmp_diff;
B _line_125,UNC
_line_95:
MOV AR1,#0 ;tmp1 = 0
_line_125:
MOV AH,#2048 ;if (sub(2048, tmp1) < 0)
SUB AH,AR1
SB _line_135 ,GEQ
MOV AR2,#8192 ; bgMix = 8192;
B _line_138 ,UNC
_line_135:
mov al,ar1
LSL AL,#2 ;bgMix = shl(tmp1, 2);
MOV AR2,AL
_line_138: ; if ( (sub(st->hangCount, 40) < 0)
MOV AH,*XAR5 ; || (sub(diff, 5325) > 0))
SUB AH,#40
SB _line_DO,LT
MOV AH,*-SP[6]
SUB AH,#5325
SB _line_DO,GT
SB _line_NDO,UNC
_line_DO:
MOV AR2,#8192 ;bgMix = 8192;
_line_NDO:
;L_sum = L_mult(6554, st->cbGainHistory[2]);
MOVL XAR5,#cbGainHistory
ADDB XAR5,#2
MOV T,*XAR5++
MPY p,T,#6554
movl acc, p
LSL ACC,#1
MOV AR0,#L_CBGAINHIST - 3 - 1 ;for (i = 3; i < L_CBGAINHIST=7; i++)
_loop_124: ;L_sum = L_mac(L_sum, 6554, st->cbGainHistory[i]);
MOV T,*XAR5++
MPY P,T,#6554
ADDL ACC,P<<PM
BANZ _loop_124,AR0--
ADD ACC,#0x0800<<4 ;cbGainMean = round(L_sum);
MOV *-SP[8],AH
MOV T,AR2 ;L_sum = L_mult(bgMix, cbGainMix);
MPY ACC,T,*-SP[12]
LSL ACC,#1
MOV T,*-SP[8] ;L_sum = L_mac(L_sum, 8192, cbGainMean);
MPY P,T,#8192
ADDL ACC,P<<PM
;L_sum = L_msu(L_sum, bgMix, cbGainMean);
MOV T,AR2
MPY P,T,*-SP[8]
SUBL ACC,P<<PM
LSL ACC,#2 ;cbGainMix = round(L_shl(L_sum, 2));
ADD ACC,#0x0800<<4
MOV AR2,AH
MOVL XAR5,#hangCount
MOV AL,*XAR5 ;st->hangCount = add(st->hangCount, 1);
ADD AL,#1
MOV *XAR5,AL
SUBB SP,#16
LRETR
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -