mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
32 lines
1.5 KiB
32 lines
1.5 KiB
Notes |
|
===== |
|
|
|
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).
|
|
|