📄 cor_func_asm.asm
字号:
.mmregs
FP .set AR7
.sect ".text"
.global _Corr_xy2
;----------------------------------------------------------------------
; 26 | void Corr_xy2(
; 27 | Word16 xn[], /* (i) Q0 :Target vector. */
; 28 | Word16 y1[], /* (i) Q0 :Adaptive codebook. */
; 29 | Word16 y2[], /* (i) Q12 :Filtered innovative vector. */
; 30 | Word16 g_coeff[], /* (o) Q[exp]:Correlations between xn,y1,y2 */
; 31 | Word16 exp_g_coeff[] /* (o) :Q-format of g_coeff[] */
; 32 | )
;----------------------------------------------------------------------
_Corr_xy2:
PSHM AR1
PSHM AR6
PSHM AR7
FRAME #-46
;----------------------------------------------------------------------
; 34 | Word16 i,exp;
; 35 | Word16 exp_y2y2,exp_xny2,exp_y1y2;
; 36 | Word16 y2y2, xny2, y1y2;
; 37 | Word32 L_acc;
; 38 | Word16 scaled_y2[L_SUBFR];
; 43 | for(i=0; i<L_SUBFR; i++) {
;----------------------------------------------------------------------
MVMM SP,AR6
STL A,*SP(42)
STM #40,AR7
LD *SP(53),A
MAR *+AR6(#2)
STL A,*SP(43)
MVDK *SP(51),*(AR1)
LD *SP(52),A
STL A,*SP(44)
LD *SP(50),A
STL A,*SP(45)
SSBX SXM ; ****
SSBX OVM
NOP
L1:
;----------------------------------------------------------------------
; 44 | scaled_y2[i] = shr(y2[i], 3); }
;----------------------------------------------------------------------
;ST #3,*SP(0)
;RSBX FRCT
;RSBX OVM
LD *AR1+,A
;CALL #_crshft
SFTA A,-3 ; ****
BANZD L1,*+AR7(-1)
NOP
STL A,*AR6+
MVMM SP,AR1
MAR *+AR1(#2)
;----------------------------------------------------------------------
; 47 | L_acc = 1; /* Avoid case of all zeros */
; 48 | for(i=0; i<L_SUBFR; i++)
;----------------------------------------------------------------------
LD #1,A
STM #39,BRC
SSBX FRCT
;SSBX OVM
ORM #2,*(PMST)
RPTB L3-1
L2:
;----------------------------------------------------------------------
; 49 | L_acc = L_mac(L_acc, scaled_y2[i], scaled_y2[i]); /* L_acc:Q19 */
; 51 | exp = norm_l(L_acc);
;----------------------------------------------------------------------
;RSBX OVM
LD *AR1+,B
;SSBX SXM
;SFTA A,8
STLM B,T
;SFTA A,-8
;ORM #2,*(PMST)
;SSBX FRCT
;SSBX OVM
;ORM #2,*(PMST)
MAC *(BL), A
L3:
;----------------------------------------------------------------------
; 52 | y2y2 = round( L_shl(L_acc, exp) );
; 53 | exp_y2y2 = add(exp, 19-16); /* Q[19+exp-16] */
;----------------------------------------------------------------------
;RSBX OVM
LD A,B ; |52|
;SSBX SXM
;SFTA B,8 ; |52|
;SFTA B,-8 ; |52|
EXP B ; |52|
;RSBX FRCT
NOP
MVMD T,AR1
;MVKD *(AR1),*SP(0)
;CALL #_L_shl ; |52|
;----------------- L_shl inline -------------------------------------
;RSBX OVM
;LD *SP(0),B
LDM AR1,B
;SFTA A,8
;SFTA A,-8
BC SHL_L7,BEQ
SUB #1,B,B
STLM B,BRC
;SSBX OVM
RSBX OVA
RPTB SHL_L7-1
SFTA A,#1
BC SHL_L7,AOV
SHL_L7:
;----------------- L_shl End -------------------------------------
;RSBX OVM
;SSBX SXM
;SFTA A,8 ; |52|
;SSBX OVM
;SFTA A,-8 ; |52|
ADD #1,#15,A,A ; |52|
SFTA A,-16,A ; |52|
;----------------------------------------------------------------------
; 55 | g_coeff[2] = y2y2;
;----------------------------------------------------------------------
MVDK *SP(44),*(AR2)
STL A,*AR2(2)
;----------------------------------------------------------------------
; 56 | exp_g_coeff[2] = exp_y2y2;
;----------------------------------------------------------------------
MVMM SP,AR2
;RSBX OVM
LD *(AR1),16,A ; |56|
;SSBX OVM
MVDK *SP(43),*(AR1)
ADD #3,16,A,A ; |56|
STH A,*AR1(2) ; |56|
MVDK *SP(42),*(AR3)
MAR *+AR2(#2)
;----------------------------------------------------------------------
; 59 | L_acc = 1; /* Avoid case of all zeros */
; 60 | for(i=0; i<L_SUBFR; i++)
;----------------------------------------------------------------------
STM #39,BRC
LD #1,A
;SSBX FRCT
;SSBX OVM
;ORM #2,*(PMST)
RPTB L5-1
L4:
;----------------------------------------------------------------------
; 61 | L_acc = L_mac(L_acc, xn[i], scaled_y2[i]); /* L_acc:Q10 */
; 63 | exp = norm_l(L_acc);
;----------------------------------------------------------------------
;RSBX OVM
;NOP
;SFTA A,8 ; |61|
;SFTA A,-8 ; |61|
;ORM #2,*(PMST)
;SSBX FRCT
;SSBX OVM
;ORM #2,*(PMST)
;NOP
MAC *AR2+, *AR3+, A, A ; |61|
L5:
;----------------------------------------------------------------------
; 64 | xny2 = round( L_shl(L_acc, exp) );
; 65 | exp_xny2 = add(exp, 10-16); /* Q[10+exp-16] */
;----------------------------------------------------------------------
;RSBX OVM
LD A,B ; |64|
;SFTA B,8 ; |64|
;SFTA B,-8 ; |64|
EXP B ; |64|
;RSBX FRCT
NOP
MVMD T,AR1
;MVKD *(AR1),*SP(0)
;CALL #_L_shl
;----------------- L_shl inline -------------------------------------
;RSBX OVM
;LD *SP(0),B
LDM AR1,B
;SFTA A,8
;SFTA A,-8
BC SHL_L8,BEQ
SUB #1,B,B
STLM B,BRC
;SSBX OVM
RSBX OVA
RPTB SHL_L8-1
SFTA A,#1
BC SHL_L8,AOV
SHL_L8:
;----------------- L_shl End -------------------------------------
;RSBX OVM
;SSBX SXM
;SFTA A,8 ; |64|
;SSBX OVM
;SFTA A,-8 ; |64|
ADD #1,#15,A,A ; |64|
SFTA A,-16,A ; |64|
;----------------------------------------------------------------------
; 67 | g_coeff[3] = negate(xny2);
;----------------------------------------------------------------------
;RSBX OVM
LD *(AL),16,A ; |67|
;SSBX OVM
MVDK *SP(44),*(AR2)
NEG A,A ; |67|
STH A,*AR2(3) ; |67|
;----------------------------------------------------------------------
; 68 | exp_g_coeff[3] = sub(exp_xny2,1); /* -2<xn,y2> */
;----------------------------------------------------------------------
;RSBX OVM
LD *(AR1),16,A ; |68|
;SSBX OVM
MVMM SP,AR2
ADD #-6,16,A,A ; |68|
SUB #1,16,A,A ; |68|
MVDK *SP(43),*(AR1)
STH A,*AR1(3) ; |68|
MVDK *SP(45),*(AR3)
MAR *+AR2(#2)
;----------------------------------------------------------------------
; 71 | L_acc = 1; /* Avoid case of all zeros */
; 72 | for(i=0; i<L_SUBFR; i++)
;----------------------------------------------------------------------
STM #39,BRC
;SSBX FRCT
LD #1,A
RPTB L7-1
L6:
;----------------------------------------------------------------------
; 73 | L_acc = L_mac(L_acc, y1[i], scaled_y2[i]); /* L_acc:Q10 */
; 75 | exp = norm_l(L_acc);
;----------------------------------------------------------------------
;RSBX OVM
;NOP
;SFTA A,8
;SFTA A,-8
;ORM #2,*(PMST)
;SSBX FRCT
;SSBX OVM
;ORM #2,*(PMST)
;NOP
MAC *AR2+, *AR3+, A, A
L7:
;----------------------------------------------------------------------
; 76 | y1y2 = round( L_shl(L_acc, exp) );
; 77 | exp_y1y2 = add(exp, 10-16); /* Q[10+exp-16] */
;----------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -