⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pitch_a_c_asm.asm

📁 g.729汇编手工优化
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	.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 + -