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

📄 craw.asm

📁 CCS3.3自带的TI 5400系列DSP的dsplib文件。文档说明可以在TI公司网站上下载。
💻 ASM
字号:
;***********************************************************
; Version 2.20.01                                           
;***********************************************************
;****************************************************************
;  Function:	corr_raw
;  Description: raw full length correlation of two vectors
;
;  Copyright Texas instruments Inc, 1998
;----------------------------------------------------------------
;  Revision History:
;  1.00 K.Baldwin, Original Beta Release 8/31/98
;****************************************************************

; Far-mode adjustment

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

	.mmregs
	.global _corr_raw
_corr_raw
;


FRAME_SZ	.set   2
REG_SAVE_SZ	.set   4
PARAM_OFFSET    .set   REG_SAVE_SZ + FRAME_SZ + OFFSET

        .asg    0, region1_and_3_loop_cnt
        .asg    1, one
        .asg    0 + FRAME_SZ, SAVE_AR6
        .asg    1 + FRAME_SZ, SAVE_AR6
        .asg    0 + REG_SAVE_SZ + FRAME_SZ, RETURN_ADDR
        .asg    0 + PARAM_OFFSET, bp
        .asg    1 + PARAM_OFFSET, r
        .asg    2 + PARAM_OFFSET, na
        .asg    3 + PARAM_OFFSET, nb

        .asg    AR0, mac_cnt
        .asg    AR1, a_save
        .asg    AR1, a3_save
	.asg	AR2, r_ptr
	.asg	AR3, a_ptr
	.asg	AR4, b_ptr
	.asg	AR5, b_save
        .asg    AR6, a2_save



;
; Save contents of AR1 & AR6                                  
; Reserve space on frame for local variables                  
;----------------------------------------------------------------

        PSHM    AR1                                     ; 1 cycle
        PSHM    AR6                                     ; 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
        

        MVDK    *sp(r), r_ptr                           ; 2 cycles      
        ST      #1, one                                 ; 2 cycles

        
;
; Set pointer to A to point to last element                   
;----------------------------------------------------------------
    
        STLM    A, a2_save                              ; 1 cycle
        ADD     *sp(na), A                              ; 1 cycle
        STLM    A, a_save                               ; 1 cycle
 
 
;
; Set pointers for vector , b,                                    
;----------------------------------------------------------------

        LD      *sp(bp), A                               ; 1 cycle
        STLM    A, b_save                                ; 1 cycle

;
; Initialize MAC cnt for regions 1 & 3, these will be          
; calculated in one loop, since the number of elements is the  
; same in each region.                                         
;----------------------------------------------------------------

        LD      *sp(na), B                               ; 1 cycle
        SUB     #4, B                                    ; 2 cycles
        STL     B, region1_and_3_loop_cnt                ; 1 cycle
        
        MAR     *a_save-                                 ; 1 cycle
 
;        
; Initial lag is in region 1, load initial MAC count and      
; number of elements to calculate in region 1                 
;----------------------------------------------------------------

REGION1:
        MVMM     b_save, b_ptr                          ; 1 cycle
        MVMM     a_save, a_ptr                          ; 1 cycle

        LD       region1_and_3_loop_cnt, A              ; 1 cycle
        STLM     A, BRC                                 ; 1 cycle
        STM      #0, mac_cnt                            ; 2 cycles 

       ;
       ; Calculate first two elements outside of the loop     
       ;

        LD       #0, A                                  ; 1 cycle
        MACR     *a_ptr, *b_ptr+, A                     ; 1 cycle
       
        STH      A, *r_ptr+                             ; 1 cycle

        MPY      *a_ptr-, *b_ptr-, A                    ; 1 cycle
        MACR      *a_ptr , *b_ptr , A                   ; 1 cycle
       
        MAR      *+b_save(2)                            ; 2 cycles
        MVMM     a_save, a_ptr                          ; 1 cycle
        MVMM     b_save, b_ptr                          ; 1 cycle
             
REGION1_LOOP:
        RPTBD   END_REGION1_LOOP-1                      ; 2 cycles
        STH      A, *r_ptr+                             ; 1 cycle
        MPY     *a_ptr-, *b_ptr-, A                     ; 1 cycle        
;LOOP START
        
        RPT     *(mac_cnt)                              ; 1 cycle
        MAC     *a_ptr-, *b_ptr-, A                     ; sum(mac_cnt-1 + mac_cnt-2, ..)
        MACR     *a_ptr-, *b_ptr-, A                     ; 1 cycle
    

        MAR     *b_save+                                ; 1 cycle
        MVMM    a_save, a_ptr                           ; 1 cycle
        MVMM    b_save, b_ptr                           ; 1 cycle
    

        MAR     *mac_cnt+                               ; 1 cycle
        STH     A, *r_ptr+                              ; 1 cycle
        MPY     *a_ptr-, *b_ptr-, A                     ; 1 cycle     
END_REGION1_LOOP

        MVDK    *sp(bp), b_save                         ; 2 cycles
        MVMM    a2_save, a_save                         ; 1 cycle

;
; Begin Loop for Region 2:                                      
;         b[0] , b[1], b[2], .... b[nb-na]                      
;----------------------------------------------------------------

REGION2:
        LD     *sp(na), B                               ; 1 cycle
        LD     *sp(nb), A                               ; 1 cycle                                            
        SUB     B, A                                    ; 1 cycle
  
        STLM    A, BRC                                  ; 1 cycle
        STLM    B, mac_cnt                              ; 1 cycle
    
        MVMM    a_save, a_ptr                           ; 1 cycle
        MVMM    b_save, b_ptr                           ; 1 cycle
   
REGION2_LOOP:
        RPTBD   END_REGION2_LOOP-1                      ; 2 cycles
        MAR     *+mac_cnt(-3)                           ; 2 cycles

;LOOP START

        MAR     *b_save+                                ; 1 cycle
        MPY     *a_ptr+, *b_ptr+, A                     ; 1 cycle
        RPT     *(mac_cnt)                              ; 1 cycle
        MAC     *a_ptr+, *b_ptr+, A                     ; mac_cnt
        MACR     *a_ptr+, *b_ptr+, A                    ; 1 cycle
 
  

        MVMM    a_save, a_ptr                           ; 1 cycle
        MVMM    b_save, b_ptr                           ; 1 cycle

  

        STH     A, *r_ptr+                              ; 1 cycle
    
END_REGION2_LOOP  

  
;
; Begin REGION3 loop:                                           
;         x[nb-na+1], x[nb-na+2], .. x[nb-1]                    
;----------------------------------------------------------------

REGION3:
        LD      region1_and_3_loop_cnt, A               ; 1 cycle
        STLM    A, BRC                                  ; 1 cycle
        MVMM    a_save, a_ptr                           ; 1 cycle 
        MVMM    b_save, b_ptr                           ; 1 cycle

REGION3_LOOP:
        RPTBD   END_REGION3_LOOP-1                      ; 2 cycles
        MAR     *mac_cnt-                               ; 1 cycle        
        NOP                                             ; 1 cycle
   
;LOOP START

        MPY     *a_ptr+, *b_ptr+, A                     ; 1 cycle
        RPT     *(mac_cnt)                              ; 1 cycle
        MAC     *a_ptr+, *b_ptr+, A                     ; sum(mac_cnt-1 + mac_cnt-2,..)
        MACR     *a_ptr+, *b_ptr+, A                    ; 1 cycle


        MAR     *b_save+                                ; 1 cycle
        MVMM    a_save, a_ptr                           ; 1 cycle
        MVMM    b_save, b_ptr                           ; 1 cycle

 
        STH     A, *r_ptr+                              ; 1 cycle   
        MAR     *mac_cnt-                               ; 1 cycle
   
END_REGION3_LOOP
       
;
; Calculate last two correlation elements outside of loop       
;----------------------------------------------------------------

        MPY     *a_ptr+, *b_ptr+, A                     ; 1 cycle
        MACR     *a_ptr-, *b_ptr, A                     ; 1 cycle

        STH      A, *r_ptr+                             ; 1 cycle
        LD       #0, A                                  ; 2 cycles
        MACR     *a_ptr, *b_ptr, A                      ; 1 cycle
        STH      A, *r_ptr+                             ; 1 cycle

;
; Return to calling function, restoring C environment first 
; If necessary                                              
;----------------------------------------------------------------

RETURN:

        LD      #0, A                               ; 1 cycle
        XC      1, AOV                              ; 1 cycle
        LD      #1, A                               ; 1 cycle

        FRAME   #FRAME_SZ                           ; 1 cycle
        POPM    ST1                                 ; 1 cycle
        POPM    ST0                                 ; 1 cycle
        POPM    AR6                                 ; 1 cycle
        POPM    AR1                                 ; 1 cycle

        .if __far_mode
            FRETD                                   ; 4 cycles
        .else 
	    RETD                                    ; 3 cycles
        .endif
        NOP                                         ; 1 cycle
        NOP                                         ; 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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -