MEINVF32指令,是C2000系列中使用的CLA模块的指令,它独立于C28 CPU。
CLA计算浮点数时,它的运算指令是单周期的,并且在乘、加等指令上设有并行指令。相当于一个时钟周期执行两条指令。
MEINVF32指令完成32位的浮点数的倒数运算。然而,手册中提出它是一种近似运算,精度只能保证8位。并提示可以由牛顿-拉弗森算法(Newton-Raphson algorithm)来求得更精确的值。
Ye = Estimate(1/X);
Ye = Ye*(2.0 - Ye*X);
Ye = Ye*(2.0 - Ye*X);
在它的举例中提供了这样一段程序:
; Calculate Num/Den using a Newton-Raphson algorithum for 1/Den
; Ye = Estimate(1/X)
; Ye = Ye*(2.0 - Ye*X)
; Ye = Ye*(2.0 - Ye*X)
;
_Cla1Task1:
MMOV32 MR1, @_Den ; MR1 = Den
MEINVF32 MR2, MR1 ; MR2 = Ye = Estimate(1/Den)
MMPYF32 MR3, MR2, MR1 ; MR3 = Ye*Den
MSUBF32 MR3, #2.0, MR3 ; MR3 = 2.0 - Ye*Den
MMPYF32 MR2, MR2, MR3 ; MR2 = Ye = Ye*(2.0 - Ye*Den)
MMPYF32 MR3, MR2, MR1 ; MR3 = Ye*Den
MSUBF32 MR3, #2.0, MR3 ; MR3 = 2.0 - Ye*Den
MMPYF32 MR2, MR2, MR3 ; MR2 = Ye = Ye*(2.0 - Ye*Den)
现在做一个实验,拿一个数: 1.2 , 求它的倒数( 1/1.2 = 0.833333333333)在MEINVF32 指令下所得的值,并且使用牛顿法逼近。
MMOVF32 MR0, #1.2 ; X
MEINVF32 MR2, MR0 ; Ye = Estimate(1/X); = 0.8359375
MMPYF32 MR0, MR2, MR0 ; Ye*X;
MSUBF32 MR3, #2.0, MR0 ; (2.0 - Ye*X);
MMPYF32 MR1, MR3, MR2 ; Ye = Ye*(2.0 - Ye*X);= 0.8333252
MMPYF32 MR2, MR1, MR0 ; Ye*X;
MSUBF32 MR3, #2.0, MR2 ; (2.0 - Ye*X);
MMPYF32 MR0, MR3, MR1 ; Ye = Ye*(2.0 - Ye*X); = 0x3F555553
经运行后观察寄存器的值,在执行MEINVF32 MR2, MR0后,1.2的倒数约为0.8359375
经第一次牛顿法逼近,得 0.8333252
经第二次牛顿法逼近,得(浮点表示) 0x3F555553,(十进制约0.8333331)