There seems to be a problem with exp(double) and our emulator.  I haven't
been able to track it down yet.  This does not occur with the emulator
supplied by Russell King.

I also found one oddity in the emulator.  I don't think it is serious but
will point it out.  The ARM calling conventions require floating point
registers f4-f7 to be preserved over a function call.  The compiler quite
often uses an stfe instruction to save f4 on the stack upon entry to a
function, and an ldfe instruction to restore it before returning.

I was looking at some code, that calculated a double result, stored it in f4
then made a function call. Upon return from the function call the number in
f4 had been converted to an extended value in the emulator.

This is a side effect of the stfe instruction.  The double in f4 had to be
converted to extended, then stored.  If an lfm/sfm combination had been used,
then no conversion would occur.  This has performance considerations.  The
result from the function call and f4 were used in a multiplication.  If the
emulator sees a multiply of a double and extended, it promotes the double to
extended, then does the multiply in extended precision.

This code will cause this problem:

double x, y, z;
z = log(x)/log(y);

The result of log(x) (a double) will be calculated, returned in f0, then
moved to f4 to preserve it over the log(y) call.  The division will be done
in extended precision, due to the stfe instruction used to save f4 in log(y).
