📄 pitch_a_c_asm.asm
字号:
.mmregs
FP .set AR7
.sect ".text"
.global _Pitch_ol_fast
;----------------------------------------------------------------------
; 29 | Word16 Pitch_ol_fast( /* output: open loop pitch lag
; | */
; 30 | Word16 signal[], /* input : signal used to compute the open loop pit
; | ch */
; 32 | Word16 pit_max, /* input : maximum pitch lag
; | */
; 33 | Word16 L_frame /* input : length of frame to compute pitch
; | */
; 34 | )
;----------------------------------------------------------------------
_Pitch_ol_fast:
PSHM AR1
;RSBX OVM
PSHM AR6
PSHM FP
ADDM #-246,*(SP)
NOP
NOP
MVMM SP,FP
STLM A,AR1 ; ar1 = signal[]
LD *FP(251),A
STL A,*FP(235) ; fp(235) = L_frame
LD *FP(250),B ; b = pit_max
;----------------------------------------------------------------------
; 48 | scal_sig = &scaled_signal[pit_max];
;----------------------------------------------------------------------
LDM SP,A
ADD #12,A
ADD B,A
STL A,*FP(236) ; sp(236) = scaled_signal
;----------------------------------------------------------------------
; 64 | if(Verifi_Overflow(0,signal,signal,-pit_max,L_frame,2,&sum) == 1)
; 66 | for(i=-pit_max; i<L_frame; i++)
; 68 | scal_sig[i] = shr(signal[i], 3);
; 71 | else {
;----------------------------------------------------------------------
;RSBX FRCT
MVKD *(AR1),*SP(0)
NEG B,A
MVKD *(AR1),*SP(1)
STL A,*FP(237) ; sp(237) = -pit_max
STL A,*SP(2)
LD *FP(235),A
STL A,*SP(3)
LDM SP,A
ADD #10,A
ST #2,*SP(4)
STL A,*SP(5) ; sp(10) = sum
CALLD #_Verifi_Overflow
NOP
LD #0,A
;RSBX OVM
SSBX SXM
LD *(AL),A
SUB #1,A,A
BC L5,AEQ ; if( Overflow ) goto L5
;----------------------------------------------------------------------
; 72 | L_temp = L_sub(sum, (Word32)1048576L);
; 73 | if ( L_temp < (Word32)0 ) /* if (sum < 2^20) */
; 75 | for(i=-pit_max; i<L_frame; i++)
; 77 | scal_sig[i] = shl(signal[i], 3);
; 80 | else
;----------------------------------------------------------------------
SSBX OVM ; **** SXM = 1
;LD #16,16,A
LD #16,16,B
;RSBX FRCT
;DST A,*SP(0)
DLD *SP(10),A
;CALL #_L_sub
SUB B, A ; a = L_sub(sum, (Word32)1048576L)
;RSBX OVM
;SSBX SXM
;SFTA A,8
;SFTA A,-8
BC L3,ALT ; if ( a<0 ) goto L3
;----------------------------------------------------------------------
; 82 | for(i=-pit_max; i<L_frame; i++)
;----------------------------------------------------------------------
LD *FP(235),B ; b = L_frame
LD *FP(237),A ; a = -pit_max
SUB *(BL),A ; a = L_frame - (-pit_max)
BC L7,AGEQ ; if( a >= 0 ) goto L7
LD *FP(237),A ; a = -pit_max
ADD *(AR1),A ; a = signal[i]
MVDK *FP(236),*(AR2) ; fp(236) = ar2 = scaled_signal[]
STLM A,AR3 ; ar3 = signal[i]
LD *FP(237),A
ADD *(AR2),A
STLM A,AR2 ; ar2 = scaled_signal[i]
LD B,A
LD *FP(237),B
SUB B,A
SUB #1,A
STLM A,BRC
NOP
RPTB L2-1
L1:
MVDD *AR3+,*AR2+ ; scal_sig[i] = signal[i]
L2:
B L7
L3:
LD *FP(235),B ; b = L_frame
LD *FP(237),A ; a = -pit_max
SUB *(BL),A
BC L7,AGEQ ; if( a >= 0 ) goto L7
LD *FP(237),A
ADD *(AR1),A
MVDK *FP(236),*(AR2)
STLM A,AR1
LD *FP(237),A
ADD *(AR2),A
STLM A,AR6
LD B,A
LD *FP(237),B
SUB B,A
STL A,*FP(238)
; MVDK *FP(238),*(AR2) ; ****
STLM A,AR2 ; ****
L4:
;ST #3,*SP(0)
;RSBX FRCT
;RSBX OVM
LD *AR1+,A
;CALL #_clshft
SFTA A,3
NOP
STL A,*AR6+
;MVDK *FP(238),*(AR2)
MAR *+AR2(#-1)
;MVKD *(AR2),*FP(238)
BANZ L4,*AR2
MVKD *(AR2),*FP(238) ; ****
B L7
L5:
LD *FP(235),B ; b = L_frame
LD *FP(237),A ; a = -pit_max
SUB *(BL),A
BC L7,AGEQ
LD *FP(237),A ; fp(237) = i
ADD *(AR1),A ; ar1 = signal[]
MVDK *FP(236),*(AR2) ; ar2 = scaled_signal
STLM A,AR1 ; ar1 = signal[i]
LD *FP(237),A
ADD *(AR2),A
STL A,*FP(238) ; fp(238) = scaled_signal[i]
LD B,A
LD *FP(237),B
SUB B,A
;STLM A,AR6
SUB #1,A
STLM A,BRC
MVDK *FP(238),*(AR2) ; ****
NOP
RPTB LOOP1-1
L6:
;ST #3,*SP(0)
;RSBX FRCT
;RSBX OVM
LD *AR1+,A
;CALL #_shr
SFTA A,-3 ; ****
;MVDK *FP(238),*(AR2)
STL A,*AR2+
;MVKD *(AR2),*FP(238)
;BANZ L6,*+AR6(-1)
LOOP1:
MVKD *(AR2),*FP(238) ; ****
L7:
;05.24 15:19
;RSBX OVM
LD *FP(236),A
SUB #20,A,A
STLM A,AR6 ; ar6 = scal_sig[-i]
;----------------------------------------------------------------------
; 102 | max = MIN_32;
;----------------------------------------------------------------------
;SSBX SXM
;NOP
LD #-32768,16,A
DST A,*FP(240) ; sp(240) = max = MIN_32
;----------------------------------------------------------------------
; 103 | T1 = 20; /* Only to remove warning from some compilers */
;----------------------------------------------------------------------
LD #20,A
STL A,*FP(242) ; sp(242) = T1
;----------------------------------------------------------------------
; 104 | for (i = 20; i < 40; i++) {
;----------------------------------------------------------------------
STM #20,AR1
L8:
MVDK *FP(236),*(AR2) ; ar2 = p = scal_sig
MVMM AR6,AR3 ; ar3 = ar6 = scal_sig[-i]
LD #0,A
DST A,*SP(10) ; sp(10) = sum
;----------------------------------------------------------------------
; 108 | for (j=0; j<L_frame; j+=2, p+=2, p1+=2)
;----------------------------------------------------------------------
LD *FP(235),A
BC L10,ALEQ ; if( a <=0 ) goto L10
;LD *FP(235),A ; a = L_frame
ADD #1,A,A
;LD *(AL),A
SFTA A,#-1,A
SUB #1,A
STLM A,BRC ; brc = (L_frame+1)/2-1
;SSBX OVM
ORM #2,*(PMST)
DLD *SP(10),A
NOP
RPTB LOOP2-1
L9:
;----------------------------------------------------------------------
; 109 | sum = L_mac(sum, *p, *p1);
;----------------------------------------------------------------------
;DLD *SP(10),A
;ORM #2,*(PMST)
;SSBX FRCT
;SSBX OVM
;ORM #2,*(PMST)
;NOP
MAC *AR3, *AR2, A, A
MAR *+AR3(#2)
MAR *+AR2(#2)
;DST A,*SP(10)
LOOP2:
DST A,*SP(10) ; sp(10) = sum
L10:
;----------------------------------------------------------------------
; 110 | L_temp = L_sub(sum, max);
;----------------------------------------------------------------------
;RSBX OVM
;DLD *FP(240),A
;RSBX FRCT
;DST A,*SP(0)
DLD *SP(10),A
;CALL #_L_sub
DSUB *FP(240),A
;RSBX OVM
;SSBX SXM
;SFTA A,8
;SFTA A,-8
BC L11,ALEQ
;----------------------------------------------------------------------
; 111 | if (L_temp > 0) { max = sum; T1 = i; }
;----------------------------------------------------------------------
DLD *SP(10),A
MVKD *(AR1),*FP(242) ; T1 = i
DST A,*FP(240)
L11:
MAR *AR1+
LD *(AR1),A
SUB #40,A,A
BCD L8,ALT ; end of (for(i=20;i<40;i++))
NOP
MAR *AR6-
LD #1,A
DST A,*SP(10) ; sp(10) = sum = 1
LD *FP(242),B
LD *FP(236),A
SUB B,A
STLM A,AR1 ; ar1 = p = &scal_sig[-T1];
;----------------------------------------------------------------------
; 118 | for(i=0; i<L_frame; i+=2, p+=2)
;----------------------------------------------------------------------
LD *FP(235),A
BC L13,ALEQ
;LD *FP(235),A
ADD #1,A,A
LD *(AL),A
SFTA A,#-1,A
SUB #1,A
STLM A,BRC
SSBX FRCT ; ****
;SSBX OVM ; ****
ORM #2,*(PMST) ; ****
DLD *SP(10),A ; ****
NOP
RPTB L13-1
L12:
;----------------------------------------------------------------------
; 119 | sum = L_mac(sum, *p, *p);
;----------------------------------------------------------------------
LD *AR1,B
;DLD *SP(10),A
STLM B,T
;ORM #2,*(PMST)
;SSBX FRCT
;SSBX OVM
;ORM #2,*(PMST)
MAR *+AR1(#2)
MAC *(BL), A
;DST A,*SP(10)
LOOP3:
DST A,*SP(10)
L13:
;----------------------------------------------------------------------
; 124 | sum = Inv_sqrt(sum); /* 1/sqrt(energy), result in Q30 */
;----------------------------------------------------------------------
RSBX OVM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -