mul32.asm

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

ASM
116
字号
;***********************************************************
; Version 2.20.01                                           
;***********************************************************
;*****************************************************************************
;  Function:	 mul32
;  Description:  32-bit vector fractional mult
;
;  Copyright Texas instruments Inc, 1998
;-----------------------------------------------------------------------------
; Revision History:				]
; 0.00	J. Axelrod, 6/15/98. Original version.
; 1.00	R. Piedra, 8/31/98. Reduced number of cycles.
; 2.00  Li Yuan, 3/09/02. Fixed overflow check.
;                         Fixed ar_zero using error
;						  Fixed saturation error
;*****************************************************************************
        .mmregs

; Far-mode adjustment

	.if __far_mode
offset	.set 1			; far mode uses one extra location for ret addr  ll
	.else
offset	.set 0
	.endif

;   local varibel
    .asg    *sp(0), store_zero
    
	.asg	(2 +1), ret_addr
					; x in A
	.asg	(3 +1 + offset), arg_y
	.asg	(4 +1 + offset), arg_z
	.asg	(5 +1 + offset), arg_n
					; register usage
					; ar0: addr. idx
	.asg	ar2, ar_x
	.asg	ar3, ar_y
	.asg	ar4, ar_z
	.asg	ar5, ar_zero
;*****************************************************************************
	.def	_mul32
	.text

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

; Preserve registers
;-------------------
	ssbx	sxm			; sign extension on		(1)
	ssbx	frct			; set fract mode on		(1)
	ld	#0,ASM			; clear ASM (st||ld)		(1)
	stm	#0,bk			; bk = 0			(2)
	
	frame #-1  
;	ssbx	ovm			; to allow -1* -1		(1)
	rsbx	ovm			;               		(1)

; Get arguments
;--------------

	stlm	a, ar_x 		; pointer to x			(1)
	mvdk	*sp(arg_y),*(ar_y)	; pointer to y			(2)
	mvdk	*sp(arg_z),*(ar_z)	; pointer to z			(2)

	ld	*sp(arg_n),a		; a = n 			(1)
	sub	#1,a			;				(2)
	stlm	a, brc			; brc = n - 1			(1)

;	stm	#0,ar_zero		;				(2)
	st	#0,store_zero   ; store_zero = 0	(2)
	mvmm sp, ar_zero    ; ar_zero points to store_zero 
	
	stm	#0,t			;				(2)

_start:
	; long data are stored in XH[0],XL[0], XH[1],XL[1], XH[2],XL[2], ... 
	rptbd	eloop-1 		;				(2)
	stm	#2,ar0			; Use this for increment by 2	(2)

	mpy	*ar_x+,a		; a = 0 			(1)
	macsu	*ar_x-,*ar_y+,a 	; a  = XL*YH			(1)
	macsu	*ar_y-,*ar_x,a		; a += XH*YL			(1)
	ld	a,-16,a 		; a >>= 16			(1)
	mac	*ar_x+0%,*ar_y+0%,a	; a += XH*YH			(1)
    sat a                   ;                     (1)
	st	a,*ar_z+ || ld *ar_zero,t;				(1)
	stl	a,*ar_z+		;				(1)
eloop

; Return
;--------
_end:

	ld	#0,a			;				(1)
	xc	1, AOV			; return overflow flag		(1)
	ld	#1,a			;				(1)

        frame #1
        POPM    ST1
        POPM    ST0

	.if	__far_mode
	fretd				;				(4)
	.else
	retd				;				(3)
	.endif
	nop
	nop

;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 + -
显示快捷键?