I hope that you are still interested in a reply. :-)
- Most importantly: the 68881 and 68881 are pin-compatible and have identical programming models. Meaning that in user mode it does not matter which one is used, the software won't be able to tell the difference.
- An internal difference is that the 68882 has an additional conversion unit which takes care of converting data into the internal extended format. This allows for fmove instructions to be executed concurrently with transcendental or arithmetic instructions. There are strict guidelines about how to optimise code so that the execution time benefits from the conversion unit of the 68882. For best performance one should unroll loops, avoid FPU register conflicts and execute slow fmove instructions right after slow arithmetic instructions (or transcendental) in order to hide the execution time of the fmove. Cutting to the chase that means that if the software is done right, the 68882 will be much faster than the 68881 at the same clock speed since it does not spend clock cycles waiting for new data while concurrently calculating stuff.
- The frame state sizes which are stored by fsave differ: null frames are of identical size, idle frames are 28 and 60 bytes, busy frames are 184 and 216 bytes. The 68882 uses the 32 additional bytes to store the state of the aforementioned conversion unit in the frame. This is a reliable way to distinguish between the 68881 and the 68882 in software. Execute the following subroutine in supervisor mode:
; This Subroutine returns true in d0 when an MC68882 is installed,
; false otherwise.
testMc68882:
move.l d1, -(sp)
moveq.l #0, d0
moveq.l #0, d1
fsave -(sp)
move.b 1(sp), d1
cmp.b #$18, d1
beq.s is68881
moveq.l #1, d0
.is68881:
frestore (sp)+
move.l (sp)+, d1
rts
Source: MC68881/68882 Floating-Point Coprocessor User's Manual, 2nd ed., 1989, Prentice Hall
Cheers,
T.