📄 g_pitch.asm
字号:
***************************************************************************
** Description: g_pitch() in g_pitch.c
**
** Inputs
**
** AR0: L_subfr
** XAR1: Word16 *xn
** XAR2: Word16 *y1
** XAR3: Word16 *g_coeff
**
** Outputs:
**
** XAR3: Word16 *g_coeff
**
** Return value:
**
** AR1: Word16 gain
**
** Attribute: Cycles: 2153 Pm: 94
**
** Modified Registers: all
**
** Programmer: Liu Yang
**
** Complete time: 2003 3 12
*****************************************************************************
.global _g_pitch
.ref _div_s
.ref _buffer3
_g_pitch:
; Compute scaled_y1[] = y1 / 4
MOVL XAR4,@XAR2 ; XAR4 = XAR2 = *y1
MOVL XAR5,#_buffer3+280 ; XAR5 = *scaled_y1
MOV AH,#0
L1: MOV AL,*XAR4++
ASR AL,#2
MOV *XAR5++,AL
INC AH
CMP AH,@AR0
SB L1,LT
; Compute yy
; Compute s = L_mac (s, y1[i], y1[i]) or s = L_mac (s, scaled_y1[i], scaled_y1[i])
MOVL XAR4,@XAR2 ; XAR4 = XAR2 = *y1
ZAPA
SB _ov1,OV
_ov1: ADDB ACC,#1 ; Avoid s = 0
NOP
NOP
NOP
RPT @AR0 ; Repeat L_subfr + 1 times
||SQRA *XAR4++ ; PM = 1, and the last P is ignored
SB B1,OV
MOVB XAR4,#0 ; XAR4 = 0: initialize for exp_yy
L2: NORM ACC,XAR4++ ; Normalize s, AR4 = exp_yy
SB L2,NTC
ADD ACC,#0x0800 << #4 ; Round 32bit s to 16bit yy
MOV AR5,AH ; AR5 = yy
SB B2,UNC
B1: MOVL XAR4,#_buffer3+280 ; XAR4 = *scaled_y1
ZAPA
ADDB ACC,#1 ; Avoid s = 0
NOP
NOP
NOP
RPT @AR0 ; Repeat L_subfr + 1 times
||SQRA *XAR4++ ; PM = 1, and the last P is ignored
MOVB XAR4,#0 ; XAR4 = 0: initialize for exp_yy
L3: NORM ACC,XAR4++ ; Normalize s, AR4 = exp_yy
SB L3,NTC
ADD ACC,#0x0800 << #4 ; Round 32bit s to 16bit yy
MOV AR5,AH ; AR5 = yy
MOV AL,#4
SUB @AR4,AL ; AR4 = exp_yy = exp_yy - 4
; Compute xy
; Compute s = L_mac(s, xn[i], y1[i]) or L_mac (s, xn[i], scaled_y1[i])
B2: MOVL XAR6,@XAR2 ; XAR6 = XAR2 = *y1
MOVL XAR7,@XAR1 ; XAR7 = XAR1 = *xn
ZAPA
SB _ov2,OV
_ov2: ADDB ACC,#1 ; Avoid s = 0
MOV @AR0,#39
loop_1: MAC P,*XAR6++,*XAR7++ ; PM = 1, and the last P is ignored
BANZ loop_1,AR0--
ADDL ACC,P >> Pm ; Perform final accumulate
SB B3,OV
MOVB XAR6,#0 ; XAR6 = 0: initialize for exp_xy
L4: NORM ACC,XAR6++ ; Normalize s, AR6 = exp_xy
SB L4,NTC
ADD ACC,#0x0800 << #4 ; Round 32bit s to 16bit xy
MOV AR1,AH ; AR1 = xy
SB B4,UNC
B3: MOVL XAR6,#_buffer3 ; XAR6 = *scaled_y1
MOVL XAR7,@XAR1 ; XAR7 = XAR1 = *xn
ZAPA
ADDB ACC,#1 ; Avoid s = 0
MOV @AR0,#39
loop_2: MAC P,*XAR6++,*XAR7++ ; PM = 1, and the last P is ignored
BANZ loop_2,AR0--
ADDL ACC,P >> Pm ; Perform final accumulate
MOVB XAR6,#0 ; XAR6 = 0: initialize for exp_xy
L5: NORM ACC,XAR6++ ; Normalize s, AR6 = exp_xy
SB L5,NTC
ADD ACC,#0x0800 << #4 ; Round 32bit s to 16bit xy
MOV AR1,AH ; AR1 = xy
MOV AL,#2
SUB @AR6,AL ; AR6 = exp_xy = exp_xy - 2
; Compute i = exp_xy - exp_yy
B4: MOV AL,@AR6
SUB AL,@AR4
MOV AR0,AL ; AR0 = i
; Load results into g_coeff[]
MOV *XAR3++,AR5 ; XAR3= *g_coeff
MOV AL,#15
SUB AL,@AR4
MOV *XAR3++,AL
MOV *XAR3++,AR1
MOV AL,#15
SUB AL,@AR6
MOV *XAR3,AL
; If (xy < 4) gain = 0
CMP AR1,#4
SB B5,GEQ
MOV AR1,#0
LRETR
; Compute gain = xy / yy
B5: MOV AL,@AR1 ; Be sure xy < yy
ASR AL,#1
MOV @AR1,AL ; AR1 = xy = shr (xy, 1)
MOV @AR2,AR5 ; AR2 = AR5 = yy
LCR _div_s ; AL = gain = xy / yy
MOV AH,@AR0 ; if (i >= 0) SB B6
SB B6,GEQ
NEG AH ; i = -i
MOV @AR0,AH ; AR0 = i
DEC @AR0 ; AR0 = i - 1
; AL = gain = lsl (gain, i)
_loop:
LSL AL,#1
SB _overflow,LT
BANZ _loop,AR0--
SB B7,UNC
_overflow:
MOV AL,#0x7FFF
SB B7,UNC
B6: MOV T,@AR0
ASR AL,T ; AL = gain = shr (gain, i)
B7: CMP AL,#19661 ; If (gain > 1.2) gain = 1.2
SB B8,LEQ
MOV AR1,#19661
LRETR
B8: MOV @AR1,AL ; AR1 = gain
LRETR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -