IQmath Approach
Multiply Operation
Y = ((i64) M * (i64) X) >> Q + B;
_IQmpy(M,X) == ((i64) M * (i64) X) >> Q
Redefine the multiply operation as follows:
Y = _IQmpy(M,X) + B;
This simplifies the equation as follows:
MOVL XT,@M
IMPYL P,XT,@X ; P = low 32-bits of M*X
QMPYL ACC,XT,@X ; ACC = high 32-bits of M*X
LSL64 ACC:P,#(32-Q) ; ACC = ACC:P << 32-Q
; (same as P = ACC:P >> Q)
ADDL ACC,@B ; Add B
MOVL @Y,ACC ; Result = Y = _IQmpy(M*X) + B
; 7 Cycles
C28x compiler supports “_IQmpy” intrinsic; assembly code generated:
IQmath Approach
It looks like floating-point!
float Y, M, X, B;
Y = M * X + B;
Floating-Point
long Y, M, X, B;
Y = ((i64) M * (i64) X + (i64) B << Q)) >> Q;
Traditional
Fix-Point Q
_iq Y, M, X, B;
Y = _IQmpy(M, X) + B;
“IQmath”
In C
iq Y, M, X, B;
Y = M * X + B;
“IQmath”
In C++
“IQmath” code is easy to read!