📄 gainpred_asm.asm
字号:
.mmregs
FP .set AR7
.sect ".text"
.global _Gain_predict
;----------------------------------------------------------------------
; 30 | void Gain_predict(
; 31 | Word16 past_qua_en[], /* (i) Q10 :Past quantized energies */
; 32 | Word16 code[], /* (i) Q13 :Innovative vector. */
; 33 | Word16 L_subfr, /* (i) :Subframe length. */
; 34 | Word16 *gcode0, /* (o) Qxx :Predicted codebook gain */
; 35 | Word16 *exp_gcode0 /* (o) :Q-Format(gcode0) */
; 36 | )
;----------------------------------------------------------------------
_Gain_predict:
PSHM AR1
PSHM AR6
PSHM AR7
FRAME #-4
;----------------------------------------------------------------------
; 38 | Word16 i, exp, frac;
; 39 | Word32 L_tmp;
;----------------------------------------------------------------------
SSBX SXM
MVDK *SP(8),*(AR2)
MVDK *SP(10),*(AR6)
MVDK *SP(11),*(AR7)
LD *SP(9),B
STLM A,AR1
;----------------------------------------------------------------------
; 45 | L_tmp = 0;
;----------------------------------------------------------------------
LD #0,A
;----------------------------------------------------------------------
; 46 | for(i=0; i<L_subfr; i++)
;----------------------------------------------------------------------
BC L9,BLEQ ; |46|
RSBX OVM
NOP
SUB #1,B,B
STLM B,BRC
NOP
SSBX FRCT;;WLY
SSBX OVM;;WLY
ORM #2,*(PMST);;WLY
RPTB L9-1
L8:
;----------------------------------------------------------------------
; 47 | L_tmp = L_mac(L_tmp, code[i], code[i]);
;----------------------------------------------------------------------
;;RSBX OVM
LD *AR2+,B
;;SFTA A,8 ; |47|
STLM B,T
;;SFTA A,-8 ; |47|
;;ORM #2,*(PMST)
;;SSBX FRCT
;;SSBX OVM
;;ORM #2,*(PMST)
MAC *(BL), A ; |47|
L9:
;----------------------------------------------------------------------
; 60 | Log2(L_tmp, &exp, &frac); /* Q27->Q0 ^Q0 ^Q15 */
;----------------------------------------------------------------------
RSBX OVM
LDM SP,B
ADD #2,B
RSBX FRCT
STL B,*SP(0)
LDM SP,B
ADD #3,B
STL B,*SP(1)
CALL #_Log2
;----------------------------------------------------------------------
; 61 | L_tmp = Mpy_32_16(exp, frac, -24660); /* Q0 Q15 Q13 -> ^Q14 */
;----------------------------------------------------------------------
LD *SP(3),A
;;RSBX FRCT
;;RSBX OVM
STL A,*SP(0)
ST #-24660,*SP(1)
LD *SP(2),A
CALL #_Mpy_32_16
;----------------------------------------------------------------------
; 65 | L_tmp = L_mac(L_tmp, 32588, 32); /* 32588*32[Q14]=127.298 */
;----------------------------------------------------------------------
;;RSBX OVM
NOP
SFTA A,8
SSBX SXM
STM #32588,T
LD #32,B
SFTA A,-8
ORM #2,*(PMST)
SSBX OVM
SSBX FRCT
;;ORM #2,*(PMST)
MAC *(BL), A
;----------------------------------------------------------------------
; 72 | L_tmp = L_shl(L_tmp, 10); /* From Q14 to Q24 */
; 73 | for(i=0; i<4; i++)
;----------------------------------------------------------------------
;;RSBX FRCT
;;RSBX OVM
;;ST #10,*SP(0) ; |72|
;;CALL #_L_shl ; |72|
SFTA A,10
STM #_pred,AR3
MVMM AR1,AR2
STM #3,BRC
SSBX FRCT;;WLY
RPTB L11-1
L10:
;----------------------------------------------------------------------
; 74 | L_tmp = L_mac(L_tmp, pred[i], past_qua_en[i]); /* Q13*Q10 ->Q24 */
;----------------------------------------------------------------------
;;RSBX OVM
;;SSBX SXM
;;SFTA A,8 ; |74|
;;SFTA A,-8 ; |74|
;;ORM #2,*(PMST)
;;SSBX FRCT
;;SSBX OVM
;;ORM #2,*(PMST)
;;NOP
MAC *AR2+, *AR3+, A, A ; |74|
; loop ends ; |74|
L11:
;----------------------------------------------------------------------
; 76 | *gcode0 = extract_h(L_tmp); /* From Q24 to Q8 */
;----------------------------------------------------------------------
LD A,B ; |76|
SFTL B,#-16,B ; |76|
STL B,*AR6 ; |76|
;----------------------------------------------------------------------
; 84 | L_tmp = L_mult(*gcode0, 5439); /* *0.166 in Q15, result in Q24*/
;----------------------------------------------------------------------
;;SSBX FRCT
;;SSBX OVM
SFTL A,#-16,A ; |84|
MPY *(AL),#5439,A ; |84|
;----------------------------------------------------------------------
; 85 | L_tmp = L_shr(L_tmp, 8); /* From Q24 to Q16 */
;----------------------------------------------------------------------
RSBX FRCT
;;RSBX OVM
;;ST #8,*SP(0) ; |85|
;;CALL #_L_shr ; |85|
SFTA A,-8
;----------------------------------------------------------------------
; 86 | L_Extract(L_tmp, &exp, &frac); /* Extract exponent of gcode0 */
;----------------------------------------------------------------------
RSBX OVM
LDM SP,B
ADD #2,B
STL B,*SP(0)
;;RSBX FRCT
LDM SP,B
ADD #3,B
STL B,*SP(1)
CALL #_L_Extract ; |86|
;----------------------------------------------------------------------
; 88 | *gcode0 = extract_l(Pow2(14, frac)); /* Put 14 as exponent so that */
;----------------------------------------------------------------------
;;RSBX OVM
LD *SP(3),A
;;RSBX FRCT
STL A,*SP(0)
CALLD #_Pow2 ; |88|
NOP
LD #14,A
; call occurs [#_Pow2] ; |88|
NOP
STL A,*AR6
;----------------------------------------------------------------------
; 91 | *exp_gcode0 = sub(14,exp);
;----------------------------------------------------------------------
;;RSBX OVM
SSBX SXM
LD #14,16,A
SSBX OVM
NOP
SUB *SP(2),16,A,A
STH A,*AR7
ANDM #-833,*(ST1)
ANDM #-4,*(PMST)
FRAME #4
POPM AR7
POPM AR6
POPM AR1
RET
;***************************************************************
;* UNDEFINED EXTERNAL REFERENCES *
;***************************************************************
.global _Log2
.global _Pow2
.global _L_Extract
.global _Mpy_32_16
.global _pred
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -