📄 qua_gain_asm.asm
字号:
;* AR6 assigned to C$10
.sym C$10,15, 4, 4, 16
;* AR6 assigned to C$9
.sym C$9,15, 4, 4, 16
;* AR6 assigned to C$8
.sym C$8,15, 20, 4, 16
;* B assigned to C$7
.sym C$7,6, 4, 4, 16
;* AR1 assigned to C$6
.sym C$6,10, 212, 4, 16,, 2
.sym C$5,41, 4, 1, 16
;* A assigned to C$4
.sym C$4,0, 212, 4, 16,, 2
.sym C$3,41, 4, 1, 16
;* AR2 assigned to C$2
.sym C$2,11, 20, 4, 16
;* AR1 assigned to C$1
.sym C$1,10, 20, 4, 16
.sym _coeff,8, 51, 1, 80,, 5
.sym _coeff_lsf,13, 51, 1, 80,, 5
.sym _exp_min,18, 51, 1, 80,, 5
.sym _best_gain,23, 51, 1, 32,, 2
;** 75 ----------------------- Gain_predict(&past_qua_en, code, L_subfr, &gcode0, &exp_gcode0);
;** 93 ----------------------- L_tmp1 = _lsmpy(*g_coeff, g_coeff[2]);
;** 94 ----------------------- exp1 = _sadd(_sadd(*exp_coeff, exp_coeff[2]), (-1));
;** 95 ----------------------- C$13 = g_coeff[4];
;** 95 ----------------------- L_tmp2 = _lsmpy(C$13, C$13);
;** 96 ----------------------- C$12 = exp_coeff[4];
;** 96 ----------------------- exp2 = _sadd(_sadd(C$12, C$12), 1);
;** 98 ----------------------- if ( _ssub(exp1, exp2) > 0 ) goto g2;
PSHM AR1
PSHM AR6
PSHM AR7
FRAME #-42
NOP
;----------------------------------------------------------------------
; 53 | Word16 i, j, index1, index2;
; 54 | Word16 cand1, cand2;
; 55 | Word16 exp, gcode0, exp_gcode0, gcode0_org, e_min ;
; 56 | Word16 nume, denom, inv_denom;
; 57 | Word16 exp1,exp2,exp_nume,exp_denom,exp_inv_denom,sft,tmp;
; 58 | Word16 g_pitch, g2_pitch, g_code, g2_code, g_pit_cod;
; 59 | Word16 coeff[5], coeff_lsf[5];
; 60 | Word16 exp_min[5];
; 61 | Word32 L_gbk12;
; 62 | Word32 L_tmp, L_dist_min, L_temp, L_tmp1, L_tmp2, L_acc, L_accb;
; 63 | Word16 best_gain[2];
; 67 | static Word16 past_qua_en[4] = { -14336, -14336, -14336, -14336 };
;----------------------------------------------------------------------
LD *SP(51),B
STL B,*SP(25)
LD *SP(50),B
STL B,*SP(26)
MVDK *SP(47),*(AR7)
LD *SP(49),B
STL B,*SP(27)
LD *SP(48),B
MVDK *SP(46),*(AR1)
.line 34
;----------------------------------------------------------------------
; 75 | Gain_predict( past_qua_en, code, L_subfr, &gcode0, &exp_gcode0 );
;----------------------------------------------------------------------
RSBX OVM
RSBX FRCT
STL A,*SP(0)
LDM SP,A
ADD #6,A
STL B,*SP(1)
STL A,*SP(2)
LDM SP,A
ADD #7,A
STL A,*SP(3)
CALLD #_Gain_predict ; |75|
LD #_past_qua_en$1,A
; call occurs [#_Gain_predict] ; |75|
.line 52
;----------------------------------------------------------------------
; 93 | L_tmp1 = L_mult( g_coeff[0], g_coeff[2] );
;----------------------------------------------------------------------
LD *AR1(2),T
SSBX FRCT
SSBX OVM
NOP
MPY *AR1,A ; |93|
DST A,*SP(28) ; |93|
.line 53
;----------------------------------------------------------------------
; 94 | exp1 = add( add( exp_coeff[0], exp_coeff[2] ), 1-2 );
;----------------------------------------------------------------------
RSBX OVM
SSBX SXM
NOP
LD *AR7,16,A ; |94|
SSBX OVM
ADD *AR7(2),16,A,A ; |94|
ADD #-1,16,A,A ; |94|
SFTA A,-16,A ; |94|
STL A,*SP(30)
.line 54
;----------------------------------------------------------------------
; 95 | L_tmp2 = L_mult( g_coeff[4], g_coeff[4] );
;----------------------------------------------------------------------
LD *AR1(4),A
STLM A,T
MPY *(AL),A ; |95|
DST A,*SP(32) ; |95|
.line 55
;----------------------------------------------------------------------
; 96 | exp2 = add( add( exp_coeff[4], exp_coeff[4] ), 1 );
;----------------------------------------------------------------------
LD *AR7(4),B
RSBX OVM
LD *(BL),16,A ; |96|
SSBX OVM
ADD *(BL),16,A,A ; |96|
ADD #1,16,A,A ; |96|
SFTA A,-16,A ; |96|
STLM A,AR6
.line 57
;----------------------------------------------------------------------
; 98 | if( sub(exp1, exp2)>0 ){
; 99 | L_tmp = L_sub( L_shr( L_tmp1, sub(exp1,exp2) ), L_tmp2 );
; 100 | exp = exp2;
; 102 | else{
;----------------------------------------------------------------------
LD *SP(30),A
RSBX OVM
LD *(AL),16,A ; |98|
SSBX OVM
SUB *(AR6),16,A,A ; |98|
SFTA A,-16,A ; |98|
LD *(AL),A ; |98|
BC L9,AGT ; |98|
; branch occurs ; |98|
;** 103 ----------------------- L_tmp = L_sub(L_tmp1, L_shr(L_tmp2, _ssub(exp2, exp1)));
;** 104 ----------------------- exp = exp1;
;** 104 ----------------------- goto g3;
.line 62
;----------------------------------------------------------------------
; 103 | L_tmp = L_sub( L_tmp1, L_shr( L_tmp2, sub(exp2,exp1) ) );
;----------------------------------------------------------------------
RSBX OVM
LD *(AR6),16,A ; |103|
LD *SP(30),B
SSBX OVM
RSBX FRCT
SUB *(BL),16,A,A ; |103|
RSBX OVM
STH A,*SP(0) ; |103|
DLD *SP(32),A ; |103|
CALL #_L_shr ; |103|
; call occurs [#_L_shr] ; |103|
RSBX OVM
RSBX FRCT
DST A,*SP(0) ; |103|
DLD *SP(28),A ; |103|
CALL #_L_sub ; |103|
; call occurs [#_L_sub] ; |103|
.line 63
;----------------------------------------------------------------------
; 104 | exp = exp1;
; 106 | sft = norm_l( L_tmp );
;----------------------------------------------------------------------
B L10 ; |104|
; branch occurs ; |104|
L9:
;** -----------------------g2:
;** 99 ----------------------- L_tmp = L_sub(L_shr(L_tmp1, _ssub(exp1, exp2)), L_tmp2);
;** 100 ----------------------- exp = exp2;
.line 58
RSBX OVM
LD *SP(30),A
LD *(AL),16,A ; |99|
RSBX FRCT
SSBX OVM
SUB *(AR6),16,A,A ; |99|
RSBX OVM
STH A,*SP(0) ; |99|
DLD *SP(28),A ; |99|
CALL #_L_shr ; |99|
; call occurs [#_L_shr] ; |99|
RSBX OVM
RSBX FRCT
DLD *SP(32),B ; |99|
DST B,*SP(0) ; |99|
CALL #_L_sub ; |99|
; call occurs [#_L_sub] ; |99|
.line 59
MVKD *(AR6),*SP(30)
L10:
;** -----------------------g3:
;** 107 ----------------------- C$11 = _lnorm(L_tmp);
;** 107 ----------------------- denom = (unsigned long)L_shl(L_tmp, C$11)>>16;
;** 110 ----------------------- inv_denom = divs(16384, denom);
;** 111 ----------------------- inv_denom = _sneg(inv_denom);
;** 112 ----------------------- exp_inv_denom = _ssub(29, _ssub(_sadd(exp, C$11), 16));
;** 117 ----------------------- L_tmp1 = _lsmpy(g_coeff[2], g_coeff[1]);
;** 118 ----------------------- exp1 = _sadd(exp_coeff[2], exp_coeff[1]);
;** 119 ----------------------- L_tmp2 = _lsmpy(g_coeff[3], g_coeff[4]);
;** 120 ----------------------- exp2 = _sadd(_sadd(exp_coeff[3], exp_coeff[4]), 1);
;** 122 ----------------------- if ( _ssub(exp1, exp2) > 0 ) goto g5;
.line 66
;----------------------------------------------------------------------
; 107 | denom = extract_h( L_shl(L_tmp, sft) );
; 108 | exp_denom = sub( add( exp, sft ), 16 );
;----------------------------------------------------------------------
RSBX OVM
LD A,B ; |107|
SSBX SXM
SFTA B,8 ; |107|
SFTA B,-8 ; |107|
EXP B ; |107|
RSBX FRCT
MVMD T,AR6
MVKD *(AR6),*SP(0)
CALL #_L_shl ; |107|
; call occurs [#_L_shl] ; |107|
SFTL A,#-16,A ; |107|
.line 69
;----------------------------------------------------------------------
; 110 | inv_denom = div_s(16384,denom);
;----------------------------------------------------------------------
RSBX FRCT
RSBX OVM
STL A,*SP(0)
CALLD #_divs ; |110|
LD #16384,A
; call occurs [#_divs] ; |110|
.line 70
;----------------------------------------------------------------------
; 111 | inv_denom = negate( inv_denom );
;----------------------------------------------------------------------
SSBX SXM
RSBX OVM
LD *(AL),16,A ; |111|
SSBX OVM
NOP
NEG A,A ; |111|
SFTA A,-16,A ; |111|
STL A,*SP(34)
.line 71
;----------------------------------------------------------------------
; 112 | exp_inv_denom = sub( 14+15, exp_denom );
;----------------------------------------------------------------------
RSBX OVM
LD *SP(30),A
LD *(AL),16,A ; |112|
SSBX OVM
ADD *(AR6),16,A,A ; |112|
SUB #16,16,A,A ; |112|
RSBX OVM
SFTA A,-16,A ; |112|
LD #29,16,B ; |112|
SSBX OVM
SUB *(AL),16,B,A ; |112|
SFTA A,-16,A ; |112|
STL A,*SP(35)
.line 76
;----------------------------------------------------------------------
; 117 | L_tmp1 = L_mult( g_coeff[2], g_coeff[1] );
;----------------------------------------------------------------------
LD *AR1(1),T
SSBX FRCT
MPY *AR1(2),A ; |117|
.line 77
;----------------------------------------------------------------------
; 118 | exp1 = add( exp_coeff[2], exp_coeff[1] );
;----------------------------------------------------------------------
RSBX OVM
LD *AR7(2),16,B ; |118|
SSBX OVM
ADD *AR7(1),16,B,B ; |118|
SFTA B,-16,B ; |118|
STL B,*SP(30)
.line 78
;----------------------------------------------------------------------
; 119 | L_tmp2 = L_mult( g_coeff[3], g_coeff[4] );
;----------------------------------------------------------------------
LD *AR1(4),T
MPY *AR1(3),B ; |119|
DST B,*SP(28) ; |119|
.line 79
;----------------------------------------------------------------------
; 120 | exp2 = add( add( exp_coeff[3], exp_coeff[4] ), 1 );
;----------------------------------------------------------------------
RSBX OVM
LD *AR7(3),16,B ; |120|
SSBX OVM
ADD *AR7(4),16,B,B ; |120|
ADD #1,16,B,B ; |120|
SFTA B,-16,B ; |120|
STLM B,AR6
.line 81
;----------------------------------------------------------------------
; 122 | if( sub(exp1, exp2)>0 ){
; 123 | L_tmp = L_sub( L_shr( L_tmp1, add(sub(exp1,exp2),1 )), L_shr( L_tmp2
; | ,1 ) );
; 124 | exp = sub(exp2,1);
; 126 | else{
;----------------------------------------------------------------------
LD *SP(30),B
RSBX OVM
LD *(BL),16,B ; |122|
SSBX OVM
SUB *(AR6),16,B,B ; |122|
SFTA B,-16,B ; |122|
LD *(BL),B ; |122|
BC L11,BGT ; |122|
; branch occurs ; |122|
;** 127 ----------------------- L_tmp = L_sub(L_shr(L_tmp1, 1), L_shr(L_tmp2, _sadd(_ssub(exp2, exp1), 1)));
;** 128 ----------------------- exp = _ssub(exp1, 1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -