2 saving and restoring the emac programming model – Motorola ColdFire MCF5281 User Manual

Page 89

Advertising
background image

Enhanced Multiply-Accumulate Unit (EMAC)

Freescale Semiconductor

3-11

If R0.L is 0x8000, R0 is half-way between two 16-bit numbers. In this case, rounding is based on
the lsb of R0.U, so the result is always even (lsb = 0).

— If the lsb of R0.U equals 1 and R0.L equals 0x8000, the number is rounded up.

— If the lsb of R0.U equals 0 and R0.L equals 0x8000, the number is rounded down.

This method minimizes rounding bias and creates as statistically correct an answer as possible.

The rounding algorithm is summarized in the following pseudocode:

if R0.L < 0x8000

then Result = R0.U

else if R0.L > 0x8000

then Result = R0.U + 1

else if lsb of R0.U = 0

/* R0.L = 0x8000 */

then Result = R0.U

else Result = R0.U + 1

The round-to-nearest-even technique is also known as convergent rounding.

3.3.1.2

Saving and Restoring the EMAC Programming Model

The presence of rounding logic in the EMAC output datapath requires special care during the EMAC’s
save/restore process. In particular, any result rounding modes must be disabled during the save/restore
process so the exact bit-wise contents of the EMAC registers are accessed. Consider the memory structure
containing the EMAC programming model:

struct macState

{

int acc0;

int acc1;

int acc2;

int acc3;

int accext01;

int accext02;

int mask;

int macsr;

} macState;

The following assembly language routine shows the proper sequence for a correct EMAC state save. This
code assumes all Dn and An registers are available for use, and the memory location of the state save is
defined by A7.

EMAC_state_save:

move.l macsr,d7

; save the macsr

clr.l d0

; zero the register to ...

move.l d0,macsr

; disable rounding in the macsr

move.l acc0,d0

; save the accumulators

move.l acc1,d1

move.l acc2,d2

move.l acc3,d3

move.l accext01,d4

; save the accumulator extensions

move.l accext23,d5

move.l mask,d6

; save the address mask

movem.l #0x00ff,(a7)

; move the state to memory

This code performs the EMAC state restore:

EMAC_state_restore:

MCF5282 and MCF5216 ColdFire Microcontroller User’s Manual, Rev. 3

Advertising
This manual is related to the following products: