?? inv_sqrt.asm
字號:
*****************************************************************************
** Description: inv_sqrt() in inv_sqrt.c
**
** Inputs:
**
** ACC: Word32 L_x
**
** Outputs:
**
** Return value:
**
** ACC: Word32 L_y
**
** Attribute: Cycles: 456 Pm: 42
**
** Modified Registers: XAR0,XAR3,XAR4
**
** Programmer: Liu Yang
**
** Complete time: 2003 3 18
*****************************************************************************
.global _inv_sqrt
.global table
_inv_sqrt:
ADDB ACC,#0 ; If L_x > 0
SB B1,GT ; SB B1
MOV AH,#0x3FFF ; Return the Max value
MOV AL,#0xFFFF
LRETR
B1: MOVB XAR3,#0 ; Initialize XAR3 to zero
L1: NORM ACC,XAR3++ ; Normalize L_x
SB L1,NTC ; XAR3 will contain shift value exp
MOVL @XAR4,ACC ; XAR4 = ACC = L_x
MOVB ACC,#30 ; ACC = 30
SUBRL @XAR3,ACC ; XAR3 = exp = 30 - exp
MOVB ACC,#1 ; Bitwise AND 0x0001 with exp
AND AL,AR3 ; if (exp & 1) != 0
SB B2,NEQ ; SB B2
MOVL ACC,@XAR4 ; else
SFR ACC,#1 ; Right shift L_x for 1 bit
MOVL @XAR4,ACC ; XAR4 = ACC = L_x
B2: MOV AL,@AR3 ; Arithmetic right shift exp for 1 bit
ASR AL,#1
INC AL ; exp = exp + 1
MOV @AR3,AL ; AR3 = AL = exp
MOVL ACC,@XAR4
SFR ACC,#9 ; Right shift L_x for 9 bit
MOVZ AR0,AH ; AR0 = AH = i: extract bit25-bit31 of L_x
SFR ACC,#1 ; Right shift L_x for 1 bit
MOV @AR4,AL ; AR4 = AL = a: extract bit10-bit24 of L_x
AND AL,@AR4,#0x7FFF ; AL = AR4 & 0x7FFF = a
MOV T,@AL ; T = AL = a
MOVL ACC,XAR0 ; ACC = XAR0 = i
SUBB ACC,#16 ; ACC = i = i - 16
MOVL XAR0,#table ; XAR0 = &table[0]
ADDL @XAR0,ACC ; XAR0 = &talbe[i]
MOV ACC,*XAR0++ << 16 ; ACC = table[i] << 16
MOVL @XAR4,ACC ; XAR4 = L_y
SUB AH,*XAR0 ; AH = tmp = table[i] - table[i+1]
MPY P,T,@AH ; ACC = tmp * a * 2
MOVL ACC,P << PM
SUBL @XAR4,ACC ; XAR2 = L_y = L_y - tmp * a * 2
MOVL ACC,@XAR4
MOV T,@AR3 ; Store exp in T
ASRL ACC,T ; ACC = Denormalized L_y
LRETR
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -