e790a4ce52
Architecture-specific documentation is being moved into Documentation/arch/ as a way of cleaning up the top-level documentation directory and making the docs hierarchy more closely match the source hierarchy. Move Documentation/arm into arch/ (along with the Chinese equvalent translations). Cc: Maxime Coquelin <mcoquelin.stm32@gmail.com> Cc: Chen-Yu Tsai <wens@csie.org> Cc: Jernej Skrabec <jernej.skrabec@gmail.com> Cc: Samuel Holland <samuel@sholland.org> Cc: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Cc: Alim Akhtar <alim.akhtar@samsung.com> Cc: Alex Shi <alexs@kernel.org> Cc: linux-doc@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-arch@vger.kernel.org Acked-by: Alexandre TORGUE <alexandre.torgue@foss.st.com> Reviewed-by: Yanteng Si <siyanteng@loongson.cn> Signed-off-by: Jonathan Corbet <corbet@lwn.net>
33 lines
1.5 KiB
ReStructuredText
33 lines
1.5 KiB
ReStructuredText
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).
|