Building for an SH target without FPU
Sébastien Michelland
sebastien.mld@numericable.fr
Sat Mar 9 10:50:00 GMT 2019
> I believe in this case the default should be "-m4-nofpu". But not
> sure, better check that. E.g. compile & link a test program (that uses
> FPU-something) for the default target and for "-m4-nofpu". Then just
> compare the final ELF files.
Well I tried that first and it turned out not. Here's a MWE:
#include <stdarg.h>
void f(int x, ...)
{
va_list args;
va_start(args, x);
va_end(args);
}
Now build it with two sets of options:
% sh4eb-elf-gcc -O3 -c mwe.c -o mwe-default.o
% sh4eb-elf-gcc -O3 -c mwe.c -o mwe-m4-nofpu.o -m4-nofpu
The first one is honestly a bit of a mess given the level of
optimization and the lack of any useful code. Note the fmov instructions:
00000000 <_f>:
0: 7f bc add #-68,r15
2: 61 f3 mov r15,r1
4: e2 f8 mov #-8,r2
6: 71 04 add #4,r1
8: 21 29 and r2,r1
a: 62 13 mov r1,r2
c: 72 18 add #24,r2
e: 11 58 mov.l r5,@(32,r1)
10: 72 04 add #4,r2
12: 11 69 mov.l r6,@(36,r1)
14: 63 13 mov r1,r3
16: 11 7a mov.l r7,@(40,r1)
18: 73 20 add #32,r3
1a: f2 ba fmov fr11,@r2 ; here
1c: f2 ab fmov fr10,@-r2 ; here
1e: 62 13 mov r1,r2
20: 72 10 add #16,r2
22: 72 04 add #4,r2
24: f2 9a fmov fr9,@r2 ; here
26: f2 8b fmov fr8,@-r2 ; here
28: 62 13 mov r1,r2
2a: 72 08 add #8,r2
2c: 72 04 add #4,r2
2e: f2 7a fmov fr7,@r2 ; here
30: 71 04 add #4,r1
32: f2 6b fmov fr6,@-r2 ; here
34: f1 5a fmov fr5,@r1 ; here
36: 62 f3 mov r15,r2
38: f1 4b fmov fr4,@-r1 ; here
3a: 72 30 add #48,r2
3c: 12 12 mov.l r1,@(8,r2)
3e: 71 2c add #44,r1
40: 12 11 mov.l r1,@(4,r2)
42: e1 44 mov #68,r1
44: 12 33 mov.l r3,@(12,r2)
46: 31 fc add r15,r1
48: 22 32 mov.l r3,@r2
4a: 12 14 mov.l r1,@(16,r2)
4c: 00 0b rts
4e: 7f 44 add #68,r15
But the second one is clean and FPU-free.
00000000 <_f>:
0: 2f 76 mov.l r7,@-r15
2: e1 04 mov #4,r1
4: 2f 66 mov.l r6,@-r15
6: 2f 56 mov.l r5,@-r15
8: 7f fc add #-4,r15
a: 31 fc add r15,r1
c: 2f 12 mov.l r1,@r15
e: 7f 04 add #4,r15
10: 00 0b rts
12: 7f 0c add #12,r15
The exact same code is produced regardless of optimization level.
So I guess I'll stick to -m4-nofpu. Maybe --with-multilib-list is only
used to add more architectures besides the default of the target?
> For binutils, it will support all targets in the binutils (objdump etc.),
> but not in ld or gas (I don't know about gdb). (You may also need
> --enable-64-bit-bfd). This is quick to build and not too huge.
>
> For GCC it only means to support all targets the backend you are building
> supports; so all SuperH variants in your case.
Does that mean I could build a compiler that covers both -m3 and
-m4-nofpu ? This would be useful because I currently use both.
Sébastien
More information about the Gcc-help
mailing list