| 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). |