aubias.asm

来自「CCS3.3自带的TI 5400系列DSP的dsplib文件。文档说明可以在TI」· 汇编 代码 · 共 230 行

ASM
230
字号
;***********************************************************
; Version 2.20.01                                           
;***********************************************************
;****************************************************************
;  Function:	acorr_unbias
;  Description: calculates positive unbiased auto-correlation
;
;
;  Copyright Texas instruments Inc, 1998
;----------------------------------------------------------------
;  Revision History:
;  1.00 - K. Baldwin. Original Beta Release 6/98
;****************************************************************

	.mmregs
	.global _acorr_unbias
_acorr_unbias

; Far-mode adjustment

        .if __far_mode
OFFSET  .set 2
        .else
OFFSET  .set 1
        .endif


;
; Set size of reserve space on stack for local variables and 
; saved registers
;--------------------------------------------------------------

FRAME_SZ    .set  1
REG_SAVE_SZ .set  5

PARAM_OFFSET    .set  FRAME_SZ + REG_SAVE_SZ + OFFSET
        .asg    0, temp
        .asg    0 + FRAME_SZ, SAVE_AR1
        .asg    1 + FRAME_SZ, SAVE_AR6
        .asg    2 + FRAME_SZ, SAVE_AR7
        .asg    0 + FRAME_SZ + REG_SAVE_SZ, RETURN_ADDR
        .asg    0 + PARAM_OFFSET, r
        .asg    1 + PARAM_OFFSET, na
        .asg    2 + PARAM_OFFSET, nr
	.asg	AR2, r_ptr
	.asg	AR3, a_ptr
	.asg	AR4, a2_ptr
        .asg    AR1, count
	.asg	AR5, a_save
        .asg    AR6, loop_count
        .asg    AR7, exec
        .asg    AR0, a2_save
  
;
;  Save contents of AR1, AR6, & AR7
;  Set local FRAME if required         
;  Set FRCT & SXM
;----------------------------------------------------------------

        PSHM    AR7                                 ; 1 cycle
        PSHM    AR6                                 ; 1 cycle
        PSHM    AR1                                 ; 1 cycle

        PSHM    ST0                                 ; 1 cycle
        PSHM    ST1                                 ; 1 cycle
        RSBX    OVA                                 ; 1 cycle
        RSBX    OVB                                 ; 1 cycle 

        FRAME   #-FRAME_SZ                          ; 1 cycle


        SSBX    SXM                                 ; 1 cycle
        SSBX    FRCT                                ; 1 cycle
        STM     #0, exec                            ; 2 cycles
          
;
; Copy arguments to their local locations as necessary       
;----------------------------------------------------------------

        LD      *sp(nr), B                          ; 1 cycle
        STLM    B, loop_count                       ; 1 cycle
        STLM    A, a_save                           ; 1 cycle
        STLM    A, a2_save                          ; 1 cycle

        SUB     #1, B                               ; 2 cycles
        BCD     L1, BEQ                             ; 5 cycles
        LD      *sp(na), A                          ; 1 cycle
        MAR     *loop_count-                        ; 1 cycle

        MVMM    a_save, a_ptr                       ; 1 cycle
        MVMM    a2_save, a2_ptr                     ; 1 cycle

;
; If the number of correlation elements to calculate is      
; exactly equal to na, then we want to calculate the last    
; 2 elements outside of the loop. Since loop assumes minimum 
; of 3 MAC operations                                        
;----------------------------------------------------------------
 
        SUB     *sp(nr), A                          ; 1 cycle
        STL     A, *sp(temp)                        ; 1 cycle
        CMPM    *sp(temp), #1                       ; 2 cycles
        BC      L0, NTC                             ; 5 cycles
        BD      L1                                  ; 2 cycles
        MAR     *exec-                              ; 1 cycle
        MAR     *loop_count-                        ; 1 cycle
L0:
        CMPM    *sp(temp), #0                       ; 2 cycles
        BC      L1, NTC                             ; 5 cycles
        MAR     *+loop_count(-2)                    ; 2 cycles
        MAR     *exec+                              ; 1 cycle
        
       
L1:

        LD      *sp(na), B                          ; 1 cycle
        STLM    B, count                            ; 1 cycle
        

        MVDM    *(loop_count), BRC                  ; 2 cycles
        STL     B, *sp(temp)                        ; 1 cycle
        MAR     *+count(-3)                         ; 2 cycles

;
; Main correlation loop:
;----------------------------------------------------------------

        RPTBD   END_LOOP-1                          ; 2 cycles
        MVDK    *sp(r), r_ptr                       ; 2 cycles   
        

LOOP:   

;
; Preload A with first multiply                              
;----------------------------------------------------------------

        MPY     *a_ptr+, *a2_ptr+, A                ; 1 cycle
        RPT     *(count)                            ; 2 cycles
        MAC     *a_ptr+, *a2_ptr+, A                ; na-2
        MAC     *a_ptr , *a2_ptr,  A                ; 1 cycle

;
; Increment pointer to a'                                
;----------------------------------------------------------------

        MAR     *a2_save+                           ; 1 cycle 


        LD      *(AH),B                             ; 2 cycles
        ABS     B                                   ; 1 cycle
        LD      *(AH),A                             ; 2 cycles
        RSBX    SXM                                 ; 1 cycle       
 
;
; Restore pointer to a                                    
;----------------------------------------------------------------

        MVMM    a_save, a_ptr                       ; 1 cycle
        MVMM    a2_save, a2_ptr                     ; 1 cycle 

;
; Divide result by number of MACs performed, result is in 
; lower half of accumulator B                              
;----------------------------------------------------------------

        
        RPT     #15                                 ; 1 cycle
        SUBC     *sp(temp), B                       ; 16 cycles
        SSBX    SXM                                 ; 1 cycle
        XC      1, ALT                              ; 1 cycle
        NEG     B                                   ; 1 cycle                     
        STL     B, *r_ptr+                          ; 1 cycle

                                    
;
; Set sign extension mode                                
; Decrement MAC counter                                  
;----------------------------------------------------------------

        ADDM    #-1, *sp(temp)                      ; 2 cycles
        MAR     *count-                             ; 1 cycle

END_LOOP
        LD      *(exec), B                          ; 2 cycles
        BCD     RETURN, BEQ                         ; 2 cycles 

;
; The last two elements are calculated outside the loop     
;----------------------------------------------------------------

        MPY     *a_ptr+, *a2_ptr+, A                ; 1 cycle
        MACR     *a_ptr-, *a2_ptr , A               ; 1 cycle
        STH      A, -1, *r_ptr+                     ; 1 cycle
        
  
        BC       RETURN, BLT                        ; 4 cycles

        LD       #0, A                              ; 1 cycle
        MACR     *a_ptr, *a2_ptr, A                 ; 1 cycle

        STH      A, *r_ptr+                         ; 1 cycle


RETURN:

  
        FRAME    #FRAME_SZ                          ; 1 cycle
 
        LD      0, A                                ; 1 cycle
        XC      1, AOV                              ; 1 cycle
        LD      #1, A                               ; XC slot 1 cycle

        POPM    ST1                                 ; 1 cycle
        POPM    ST0                                 ; 1 cycle
        POPM    AR1                                 ; 1 cycle
        POPM    AR6                                 ; 1 cycle
        POPM    AR7                                 ; 1 cycle

        .if __far_mode
           FRETD                                    ; 4 cycles
        .else
	   RETD                                     ; 3 cycles
        .endif
        NOP                                         ; delay slot 1 cycle
	NOP                                         ; delay slot 1 cycle

;end of file. please do not remove. it is left here to ensure that no lines of code are removed by any editor

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?