[fpc-devel] Two floating point issues for the price of one on Cortex-M0 / Trunk
Michael Ring
mail at michael-ring.org
Mon Feb 8 17:11:50 CET 2021
Jeppe already told me that floating point could be a little shaky on
Cortex-M, and he was right...
I am creating examples for the Raspberry Pi Pico and the ADC example
requires some floating point math.
All testing was done with trunk version of fpc from today
RTL was compiled with empty CROSSOPTS options, for details please see
end of text.
The first issue smells a lot like an optimization issue, when I compile
rtl with -O- then it is gone.
First issue is about mutiplication/division.
The same code run with single datatype creates (wrong) negative result
for this multiplication:
rawvalue := 887;
value := rawvalue*3.3/(1 shl 12);
The 2nd one is a bit more strange, here I am asking myself if I forgot
something:
str(value:6:3,valuestr);
When I compile the code with double my string version of the number is
prefixed by 10 or so spaces.
when I compile with single datatype output of str is fine, no spaces as
prefix.
When I comment out the three codelines behind the str command and
compile with double I get correct transformation without the prefixed
spaces.
When I compile RTL with -O- then double shows correctly and single is
prefixed with spaces.
Commandline to compile code:
fpc -Tembedded -Parm -Cparmv6m -godwarfsets -godwarfcpp
-Wp-WpNUCLEOG071RB floatmult.lpr
(I compile here for NUCLEOG071RB as Raspberry Pico is not yet in trunk)
Sample Code:
program floatmult;
{$MODE OBJFPC}
{$H-}
var
//value : single; // gives -0.715 in line 11+12
value : double; // gives 0.715 in line 11+12
rawvalue : longWord;
valuestr : string;
begin
rawvalue := 887;
value := rawvalue*3.3/(1 shl 12);
str(value:6:3,valuestr);
//value := value - 0.706;
//value := value / 0.001721;
//value := 27 - value;
end.
Building fpc RTL for armv6m
+ make --directory=/Users/ring/devel/fpc FPCDIR=/Users/ring/devel/fpc
FPCMAKE=/Users/ring/devel/fpc/utils/fpcm/fpcmake
PPUMOVE=/Users/ring/fpcupdeluxe-embedded/fpc/bin/x86_64-darwin/ppumove
INSTALL_PREFIX=/Users/ring/fpcupdeluxe-embedded/fpc
INSTALL_BINDIR=/Users/ring/fpcupdeluxe-embedded/fpc/bin/x86_64-darwin
CROSSBINDIR=/Users/ring/fpcupdeluxe-embedded/fpc/bin/x86_64-darwin
FPC=/Users/ring/fpcupdeluxe-embedded/fpc/bin/x86_64-darwin/ppcarm
rtl_clean rtl_all CROSSINSTALL=1 CPU_SOURCE=x86_64 OS_SOURCE=darwin
OS_TARGET=embedded CPU_TARGET=arm SUBARCH=armv6m NOGDBMI=1
BINUTILSPREFIX=arm-none-eabi- 'OPT=-vw-n-h-l-d-u-t-p-c- -ap
-Fl/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib'
CROSSOPT=
INSTALL_UNITDIR=/Users/ring/fpcupdeluxe-embedded/fpc/units/arm-embedded/armv6m/rtl
+ pv '--name=Build ' --line-mode --size 50
More information about the fpc-devel
mailing list