Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2007-04

arm and negative float

3 messages · 2 people ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Henry Vermaak

i've been playing around with some arm boards for a while now and i managed to port some of our software fairly successfully. linking to our c libraries works well and it's amazing how much less fuss it was to cross compile the pascal sources.

i did find a couple of issues, though. i thought i'd put them up here before making bug reports. all of these are on a little endian arm with soft float, using latest svn.

1) writeln(-2/3) crashes with this:

Runtime error 205 at $00015498
$00015498 FLOAT_RAISE, line 111 of latest/rtl/inc/genmath.inc $0001002C float64_mul, line 4387 of latest/rtl/inc/softfpu.pp $000195B4 STR_REAL, line 361 of latest/rtl/inc/real2str.inc $000300A8 fpc_write_text_float, line 695 of latest/rtl/inc/text.inc $000081C4 main, line 19 of armtest.pas
$000080F4

this means that i had to check for a negative sign every time i wanted to do a float operation (luckily i don't have many) - quite annoying. writeln(2/3) works perfectly, though.

2) BoolToStr returns '0' for False and '-1' for True...

3) if func 0 then ...

where func is a function (of int) in a shared c lib. this didn't work
- no crashes, but just returned non zero all the time. when i changed this to ret := func; if ret 0 then... everything worked o.k. sorry this is vague, i don't really know how to look into this.

4) i also had a bit of a problem when i tried to link to libc from my pascal program:

/opt/slugosle/bin/arm-linux-ld: ERROR:
/usr/lib/fpc/2.3.1/units/arm-linux/rtl/prt0.o uses hardware FP, whereas armtest uses software FP
/opt/slugosle/bin/arm-linux-ld: Warning:
/usr/lib/fpc/2.3.1/units/arm-linux/rtl/prt0.o does not support interworking, whereas armtest does
/opt/slugosle/bin/arm-linux-ld: failed to merge target specific data of file /usr/lib/fpc/2.3.1/units/arm-linux/rtl/prt0.o

(list goes on like this for many of the .o files in the rtl).

so for some reason ld thinks that the rtl is compiled for hardware float (which is not the case). i also don't know how fpc handles the interworking business (i had to compile my c libs with -mthumb-interwork to make the warnings go away). ld does have a couple of compatibility options for interworking, but i didn't use any and it still seems to work o.k.

all in all, i'm impressed. especially at the ease of fpc cross compilation. maybe fpc should offer a softfloat crossarm binary that people can use to compile for the nslu2 and similar devices?

now onto the big endian board again...

thanks
henry

Reply by email

Michalis Kamburelis
to Henry Vermaak

Henry Vermaak wrote:
[...]

2) BoolToStr returns '0' for False and '-1' for True...

[...]

That was intentional change in r5744. Changelog says
* booltostr now D7 compat.
so that's it... You have to pass 2nd argument "true" for BoolToStr now to get 'False' or 'True' results (or whatever you set in TrueBoolStrs).

Michalis

Reply by email

Henry Vermaak
to Michalis Kamburelis
Show quoted text 12 lines
[...] > > 2) BoolToStr returns '0' for False and '-1' for True... > [...] That was intentional change in r5744. Changelog says * booltostr now D7 compat. so that's it... You have to pass 2nd argument "true" for BoolToStr now to get 'False' or 'True' results (or whatever you set in TrueBoolStrs). Michalis

must admit that i didn't even look into this, just concocted my own function quickly. thanks for clarifying.

henry

Reply by email