XMACD P,loc16,*(pma)
6-381
OVM If overflow mode bit is set, the ACC value will saturate maximum positive
(0x7FFFFFFF) or maximum negative (0x80000000) if the operation
overflowed.
PM The value in the PM bits sets the shift mode for the output operation from the
product register. If the product shift value is positive (logical left shift
operation), then the low bits are zero filled. If the product shift value is
negative (arithmetic right shift operation), the upper bits are sign extended.
Repeat This instruction is repeatable. If the operation follows a RPT instruction,
then it will be executed N+1 times. The state of the Z, N, C and OVC flags
will reflect the final result. The V flag will be set if an intermediate overflow
occurs. When repeated, the program-memory address is incremented by
1 during each repetition.
Example
; Calculate FIR filter using 16-bit multiply:
; int16 X[N] ; Data information
; int16 C[N] ; Coefficient information, located in high 64K
; sum = X[N−1] * C[0];
; for(i=1; i < N; i++)
; {
; sum = sum + (X[N−1−i] * C[i]) >> 5;
; X[N−i] = X[N−1−i];
; }
; X[1] = X[0];
MOVL XAR2,#X+N ; XAR2 = point to end of X array
SPM −5 ; Set product shift to ”>> 5”
ZAPA ; Zero ACC, P, OVC
XMAC P,*−−XAR2,*(C) ; ACC = 0, P = X[N−1] * C[0]
RPT #N−2 ; Repeat next instruction N−1 times
||XMACD P,*−−XAR2,*(C+1) ; ACC = ACC + P >> 5,
; P = X[N−1−i] * C[i],
; i++
MOV *+XAR2[2],T ; X[1] = X[0]
ADDL ACC,P << PM ; Perform final accumulate
MOVL @sum,ACC ; Store final result into sum