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

📄 cubias.asm

📁 CCS3.3自带的TI 5400系列DSP的dsplib文件。文档说明可以在TI公司网站上下载。
💻 ASM
字号:
;***********************************************************
; Version 2.20.01                                           
;***********************************************************
;****************************************************************
;  Filename:	cubias.asm
;  Description: calculates unbiased full length correlation
;----------------------------------------------------------------
;  Revision History:
;  1.00, K. Baldwin. Original Beta Release 8/31/98
;****************************************************************



	.mmregs
	.global _corr_unbias
_corr_unbias

; Far-mode adjustment

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

                .if __far_mode
FRAME_SZ        .set   6
                .else
FRAME_SZ	.set   7
                .endif

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


        .asg    0, inverse
        .asg    1, b1_save
        .asg    2, b3_save
        .asg    3, a1_save
        .asg    4, a3_save
        .asg    5, n_macs
        .asg    6, a2_save
        .asg    0 + FRAME_SZ, SAVE_AR6
        .asg    1 + FRAME_SZ, SAVE_AR1
        .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	AR2, r_ptr
        .asg    AR2, r1_ptr
	.asg	AR3, a_ptr
	.asg	AR4, b_ptr
        .asg    AR1, r3_ptr
        .asg    AR6, a_save
	.asg	AR5, b_save
        .asg    AR0, mac_cnt


; 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
        

 

        

; Region 1 & 3 will be calculated in same loop. For both      
; region 1 & 3, the pointers to vector A will initially point 
; to the last element in A.                                   
; In region 1, the pointer to vector , B will point to last   
; b[na-2].   In region 3, the pointer will initially point to 
; b[nb-1].                                                    
; The output vector pointer will initially point to r[0] for  
; region 1, and to r[nb-1], for region 3                       
;----------------------------------------------------------------
    
        STL     A, *sp(a2_save)                          ; 1 cycle
        ADD     na, A                                    ; 1 cycle
        SUB     #1, A                                    ; 2 cycles
        STL     A, *sp(a1_save)                          ; 1 cycle
        SUB     #1, A                                    ; 2 cycles
        STL     A, *sp(a3_save)                          ; 1 cycle

        LD      *sp(bp), B                               ; 1 cycle
        ADD     na, B, A                                 ; 1 cycle
        SUB     #2, A                                    ; 2 cycles
        STL     A, *sp(b1_save)                          ; 1 cycle

        ADD     nb, B                                    ; 1 cycle
        SUB     #1, B                                    ; 2 cycles
        STL     B, *sp(b3_save)                          ; 1 cycle

        LD      *sp(r),  A                               ; 1 cycle
        ADD     na, A, B                                 ; 1 cycle
        SUB     #2, B                                    ; 2 cycles
        STLM    B, r1_ptr                                ; 1 cycle
        ADD     nb, A                                    ; 1 cycle      
        STLM    A, r3_ptr                                ; 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      na, B                                  ; 1 cycle
        SUB     #1, B, A                               ; 2 cycles
        SUB     #4, B                                  ; 2 cycles
        STLM    B, BRC                                 ; 1 cycle
        STLM    B, mac_cnt                             ; 1 cycle
 
;     
; Initial lag is in region 1, load initial MAC count and      
; number of elements to calculate in region 1                 
;----------------------------------------------------------------

REGION1_AND_3:
        MVDK     *sp(b1_save), b_ptr                   ; 2 cycles
        MVDK     *sp(a1_save), a_ptr                   ; 2 cycles

REGION1_LOOP:
        RPTBD   END_REGION1_LOOP-1                      ; 2 cycles 
        STL     A, *sp(n_macs)                          ; 1 cycle
        RSBX    SXM                                     ; 1 cycle       
;LOOP START
      
;
; Calculate inverse of number of MACs                           
;----------------------------------------------------------------
 
        LD      #32767, A                               ; 2 cycles
        RPT     #15                                     ; 1 cycle
        SUBC    *sp(n_macs), A                          ; 16 cycles
        SSBX    SXM                                     ; 1 cycle
        STL     A, *sp(inverse)                         ; 1 cycle

;--------- Calculate sum in region 1  

        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, ..)
        MAC     *a_ptr-, *b_ptr-, A                     ; 1 cycle

        LD      *(AH), T                                ; 2 cycles
        MPYR    *sp(inverse), A                         ; 1 cycle
     
        MVDK    *sp(a3_save), a_ptr                     ; 2 cycles
        MVDK    *sp(b3_save), b_ptr                     ; 2 cycles
        ADDM    #-1, *sp(b1_save)                       ; 2 cycles

        STH     A, *r1_ptr-                             ; 1 cycle

;--------- Calculate sum in region 3                              

        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, ..)
        MAC     *a_ptr-, *b_ptr-, A                     ; 1 cycle

        LD      *(AH), T                                ; 2 cycles
        MPYR    inverse, A                              ; 1 cycle
        ADDM    #-1, *sp(a3_save)                       ; 2 cycles
     
        MVDK    *sp(a1_save), a_ptr                     ; 2 cycles
        MVDK    *sp(b1_save), b_ptr                     ; 2 cycles
    

        ADDM    #-1, *sp(n_macs)                        ; 2 cycles 
        STH     A, *r3_ptr+                             ; 1 cycle
        RSBX    SXM                                     ; 1 cycle
        MAR     *mac_cnt-                               ; 1 cycle

END_REGION1_LOOP

;
; Calculate last two correlation elements outside of loop       
;----------------------------------------------------------------

;---------- Region 1

        MPY     *a_ptr-, *b_ptr-, A                       ; 1 cycle
        MACR    *a_ptr+ , *b_ptr, A                       ; 1 cycle
        STH     A, -1, *r1_ptr-                           ; 2 cycles

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

        STH      A, *r1_ptr-                              ; 1 cycle

;---------- Region 3

        MVDK    *sp(a3_save), a_ptr                       ; 2 cycles
        MVDK    *sp(b3_save), b_ptr                       ; 2 cycles

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

        MPY     *a_ptr-, *b_ptr-, A                        ; 1 cycle
        MACR    *a_ptr , *b_ptr+, A                        ; 1 cycle
        STH     A, -1, *r3_ptr+                            ; 2 cycles

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

        STH      A, *r3_ptr                                ; 1 cycle

;
; Calculate inverse of number of MACs  = na                      
; We load Q15 equivalent of 1 into accumulator and use SUBC      
; Thus calculating Q15 equivalent of 1/N                         
; This value wil be used to calculate the unbiased results       
; for region 2                                                   
;----------------------------------------------------------------
        RSBX    SXM                                        ; 1 cycle
        LD      #32767, A                                  ; 2 cycles
        RPT     #15                                        ; 1 cycle
        SUBC    na, A                                      ; 16 cycles

        ADD     #1, A                       ; round result ; 1 cycle
        STL     A, *sp(inverse)                            ; 1 cycle
        SSBX    SXM                                        ; 1 cycle

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

REGION2:
        LD      na, B                                   ; 1 cycle
        LD      nb, A                                   ; 1 cycle                                            
        SUB     B, A                                    ; 1 cycle
  
        STLM    A, BRC                                  ; 1 cycle
        STLM    B, mac_cnt                              ; 1 cycle
 
        SUB     #1, B                                   ; 2 cycles
        ADD     *sp(r),  B                              ; 1 cycle
        STLM    B, r_ptr                                ; 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
        MAC     *a_ptr+, *b_ptr+, A                     ; 1 cycle
        LD      *(AH), T                                ; 2 cycles
        MPYR    *sp(inverse), 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  
 
;
; Return to calling function, restoring C environment first 
; If necessary                                              
;----------------------------------------------------------------
RETURN:
;
; Return value of OVA flag in accum A                        
;----------------------------------------------------------------
  
        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                                         ; 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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -