5-14
ColdFire CF4e Core User’s Manual
For More Information On This Product,
Go to: www.freescale.com
EMAC Instruction Set Summary
Note the following:
Unless noted otherwise, the setting of MACSR[N,Z] is based on the result of the
final operation involving the product and the accumulator.
The overflow (V) flag is handled differently. It is set if the complete product cannot
be represented as a 40-bit value (this applies to 32x32 integer operations only) or if
the combination of the product with an accumulator cannot be represented in the
given number of bits. The EMAC design includes an additional
product/accumulation overflow bit for each accumulator that are treated as sticky
indicators and are used to calculate the V bit on each MAC or MSAC instruction.
See Section 5.4.1, “MAC Status Register (MACSR).”
For the MAC design, the assembler syntax of the MAC (multiply and add to
accumulator) and MSAC (multiply and subtract from accumulator) instructions
does not include a reference to the single accumulator. For the EMAC, it is expected
that assemblers support this syntax and that no explicit reference to an accumulator
is interpreted as a reference to ACC0. These assemblers would also support syntaxes
where the destination accumulator is explicitly defined.
The optional 1-bit shift of the product is specified using the notation {<< | >>} SF,
where <<1 indicates a left shift and >>1 indicates a right shift. The shift is performed
before the product is added to or subtracted from the accumulator. Without this
operator, the product is not shifted. If the EMAC is in fractional mode (MACSR[F/I]
is set), SF is ignored and no shift is performed. Because a product can overflow, the
following guidelines are followed:
— For unsigned word and longword operations, a zero is shifted into the product on
right shifts.
— For signed, word operations, the sign bit is shifted into the product on right shifts
unless the product is zero. For signed, longword operations, the sign bit is shifted
into the product unless an overflow occurs or the product is zero, in which case
a zero is shifted in.
— For all left shifts, a zero is inserted into the lsb position.
The following pseudocode explains basic MAC or MSAC instruction functionality. This
example is presented as a case statement covering the three basic operating modes with
signed integers, unsigned integers, and signed fractionals. Throughout this example, a
comma-separated list in curly brackets, {}, indicates a concatenation operation.
switch (MACSR[6:5]) /* MACSR[S/U, F/I] */
{
case 0: /* signed integers */
if (MACSR.OMC == 0 || MACSR.PAVx == 0)
then {
MACSR.PAVx = 0
/* select the input operands */
if (sz == word)
then {if (U/Ly == 1)
then operandY[31:0] = {sign-extended Ry[31], Ry[31:16]}
else operandY[31:0] = {sign-extended Ry[15], Ry[15:0]}
if (U/Lx == 1)
F
Freescale Semiconductor, Inc.
n
.