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