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