MIPS: bad floating point code generated

Dan Nicolaescu dann@godzilla.ics.uci.edu
Wed Mar 24 01:30:00 GMT 1999


Hi!

egcs-1990314 will generate some code to save some floating point
registers on the stack at the beginning of a function and restore them
at the end (testcase at the end of this message). There is no reason
to do that.

like in the following fragment:

tracer:~> cat test.s
[snip]
        .globl  test_case
        .ent    test_case
test_case:
.LFB1:
        .frame  $sp,144,$31             # vars= 64, regs= 1/6, args=
0, extra= 16
        .mask   0x10000000,-64
        .fmask  0x55500000,-8
        subu    $sp,$sp,144
.LCFI0:
        sd      $28,80($sp)
.LCFI1:
        s.d     $f30,136($sp)
.LCFI2:
        s.d     $f28,128($sp)
.LCFI3:
        s.d     $f26,120($sp)
.LCFI4:
        s.d     $f24,112($sp)
.LCFI5:
        s.d     $f22,104($sp)
.LCFI6:
        s.d     $f20,96($sp)
.LCFI7:
        .set    noat
        lui     $1,%hi(%neg(%gp_rel(test_case)))
        addiu   $1,$1,%lo(%neg(%gp_rel(test_case)))
        daddu   $gp,$1,$25
        .set    at
[snip]
        ld      $28,80($sp)
        l.d     $f30,136($sp)
        l.d     $f28,128($sp)
        l.d     $f26,120($sp)
        l.d     $f24,112($sp)
        l.d     $f22,104($sp)
        l.d     $f20,96($sp)
        #nop
        .set    noreorder
        .set    nomacro
        j       $31
        addu    $sp,$sp,144
        .set    macro
        .set    reorder

.LFE1:
        .end    test_case

The number of registers saved seems to depend on the ABI and the
instruction set specified: is different for -mips3, 
or -mips3 -mabi=n32, or -mips4, or -mips4 -mabi=n32


Here is the output from the compile command: 

tracer:~> objs/gcc/xgcc -Bobjs/gcc/ -O2 -mips3 -mabi=n32 -v -S test.c
Reading specs from objs/gcc/specs
gcc version egcs-2.93.12 19990314 (gcc2 ss-980929 experimental)
 objs/gcc/cpp -lang-c -v -isystem objs/gcc/include -undef -D__GNUC__=2
-D__GNUC_MINOR__=93 -Dunix -Dmips -Dsgi -Dhost_mips -DMIPSEB -D_MIPSEB
-DSYSTYPE_SVR4 -D_LONGLONG -D_SVR4_SOURCE -D_MODERN_C -D__DSO__
-D__unix__ -D__mips__ -D__sgi__ -D__host_mips__ -D__MIPSEB__ -D_MIPSEB
-D__SYSTYPE_SVR4__ -D_LONGLONG -D_SVR4_SOURCE -D_MODERN_C -D__DSO__
-D__unix -D__mips -D__sgi -D__host_mips -D__MIPSEB -D__SYSTYPE_SVR4
-Asystem(unix) -Asystem(svr4) -Acpu(mips) -Amachine(sgi)
-D__CHAR_UNSIGNED__ -D__OPTIMIZE__ -D__LANGUAGE_C -D_LANGUAGE_C
-DLANGUAGE_C -D__SIZE_TYPE__=unsigned int -D__PTRDIFF_TYPE__=int
-U__mips -D__mips=3 -D__mips64 -D__EXTENSIONS__ -D_SGI_SOURCE
-D_MIPS_FPSET=32 -D_MIPS_ISA=_MIPS_ISA_MIPS3 -D_ABIN32=2
-D_MIPS_SIM=_ABIN32 -D_MIPS_SZINT=32 -D_MIPS_SZLONG=32
-D_MIPS_SZPTR=32 -D_COMPILER_VERSION=601 -D__mips64 test.c
/var/tmp/ccEzcaaa.i
GNU CPP version egcs-2.93.12 19990314 (gcc2 ss-980929 experimental)
[AL 1.1, MM 40] SGI running IRIX 6.x
#include "..." search starts here:
#include <...> search starts here:
 objs/gcc/include
 /usr/local/include
 /usr/include
End of search list.
The following default directories have been omitted from the search
path:
 /usr/people/dann/build/1403/lib/gcc-lib/mips-sgi-irix6.5/egcs-2.93.12/../../../../include/g++-
 /usr/people/dann/build/1403/lib/gcc-lib/mips-sgi-irix6.5/egcs-2.93.12/../../../../mips-sgi-irix6.5/include
 /usr/people/dann/build/1403/lib/gcc-lib/mips-sgi-irix6.5/egcs-2.93.12/include
End of omitted list.
 objs/gcc/cc1 /var/tmp/ccEzcaaa.i -mfp64 -mgp64 -quiet -dumpbase
test.c -mips3 -mabi=n32 -O2 -version -o test.s
GNU C version egcs-2.93.12 19990314 (gcc2 ss-980929 experimental)
(mips-sgi-irix6.5) compiled by GNU C version egcs-2.93.12 19990314
(gcc2 ss-980929 experimental).

The source file:
tracer:~> cat test.c
void
test_case(float * C,
          float * A,
          float * B)
{ 
  register float reg0;
  register float reg1;
  register float reg2;
  register float reg3;
  register float reg4;
  register float reg5;
  register float reg6;
  register float reg7;
  register float reg8;
  register float reg9;
  register float reg10;
  register float reg11;
  register float reg12;
  register float reg13;
  register float reg14;
  register float reg15;
  register float reg16;
  register float reg17;
  register float reg18;
  register float reg19;
  register float reg20;
  register float reg21;
  register float reg22;
  register float reg23;
  register float reg24;
  register float reg25;
  register float reg26;
  register float reg27;
  register float reg28;
  register float reg29;
  register float reg30;
  register float reg31;
  reg4 = A[0];
  reg5 = A[1];
  reg6 = A[2];
  reg7 = A[3];
  reg8 = A[4];
  reg9 = A[5];
  reg10 = A[6];
  reg11 = A[7];
  reg12 = A[8];
  reg13 = A[8];
  reg14 = A[10];
  reg15 = A[11];
  reg16 = A[12];
  reg17 = A[13];
  reg18 = A[14];
  reg19 = A[15];
  reg0 = C[0];
  reg1 = C[1];
  reg2 = C[2];
  reg3 = C[3];
  reg20 = B[18];
  reg21 = B[19];
  reg22 = B[16];
  reg23 = B[17];
  reg24 = B[14];
  reg25 = B[15];
  reg26 = B[22];
  reg27 = B[23];
  reg0 += reg4*reg5;
  reg1 += reg6*reg7;
  reg2 += reg8*reg9;
  reg3 += reg10*reg11;
  reg12 += reg13*reg14;
  reg15 += reg16*reg17;
  reg18 += reg19*reg20;
  reg21 += reg22*reg23;
  reg24 += reg25*reg26;
  reg1 += reg27;
  reg20 = B[6];
  reg21 = B[7];
  reg22 = B[0];
  reg23 = B[1];
  reg24 = B[22];
  reg25 = B[23];
  reg26 = B[10];
  reg27 = B[11];
  C[0]= reg0;
  C[1]= reg0;
  C[2]= reg0;
  C[3]= reg0;
  reg0 = C[4];
  reg1 = C[5];
  reg2 = C[6];
  reg3 = C[7];
  reg20 = B[26];
  reg21 = B[27];
  reg22 = B[24];
  reg23 = B[25];
  reg24 = B[12];
  reg25 = B[13];
  reg26 = B[28];
  reg27 = B[29];
  reg0 += reg12*reg20;
  reg1 += reg13*reg21;
  reg2 += reg14*reg22;
  reg3 += reg16*reg23;
  reg0 += reg15*reg24;
  reg1 += reg18*reg25;
  reg2 += reg19*reg26;
  reg3 += reg17*reg27;
  reg20 = B[4];
  reg21 = B[5];
  reg22 = B[2];
  reg23 = B[3];
  reg24 = B[20];
  reg25 = B[21];
  reg26 = B[8];
  reg27 = B[9];
  reg0 += reg4*reg20;
  reg1 += reg5*reg21;
  reg2 += reg6*reg22;
  reg3 += reg8*reg23;
  reg0 += reg7*reg24;
  reg1 += reg9*reg25;
  reg2 += reg10*reg26;
  reg3 += reg11*reg27;
  C[4]= reg0;
  C[5]= reg1;
  C[6]= reg2;
  C[7]= reg3;
  reg0 = C[0];
  reg1 = C[1];
  reg2 = C[2];
  reg3 = C[3];
  reg20 = B[18];
  reg21 = B[19];
  reg22 = B[16];
  reg23 = B[17];
  reg24 = B[14];
  reg25 = B[15];
  reg26 = B[22];
  reg27 = B[23];
  reg0 += reg12*reg20;
  reg1 += reg13*reg21;
  reg2 += reg14*reg22;
  reg3 += reg15*reg23;
  reg0 += reg19*reg24;
  reg1 += reg18*reg25;
  reg2 += reg27*reg26;
  reg20 = B[6];
  reg21 = B[7];
  reg22 = B[0];
  reg23 = B[1];
  reg24 = B[22];
  reg25 = B[23];
  reg26 = B[10];
  reg27 = B[11];
  reg0 += reg4*reg20;
  reg1 += reg5*reg21;
  reg2 += reg6*reg23;
  reg3 += reg8*reg27;
  reg0 += reg7*reg22;
  reg1 += reg9*reg24;
  reg2 += reg10*reg25;
  reg3 += reg11*reg26;
  C[0]= reg0;
  C[1]= reg1;
  C[2]= reg2;
  C[3]= reg3;
  reg0 = C[4];
  reg1 = C[5];
  reg2 = C[6];
  reg3 = C[7];
  reg20 = B[26];
  reg21 = B[27];
  reg22 = B[24];
  reg23 = B[25];
  reg24 = B[12];
  reg25 = B[13];
  reg26 = B[28];
  reg27 = B[29];
  reg0 += reg12*reg20;
  reg1 += reg13*reg21;
  reg2 += reg14*reg24;
  reg3 += reg16*reg25;
  reg0 += reg15*reg22;
  reg1 += reg17*reg23;
  reg2 += reg18*reg26;
  reg3 += reg19*reg27;
  reg20 = B[4];
  reg21 = B[5];
  reg22 = B[2];
  reg23 = B[3];
  reg24 = B[20];
  reg25 = B[21];
  reg26 = B[8];
  reg27 = B[9];
  reg0 += reg4*reg20;
  reg1 += reg5*reg21;
  reg2 += reg6*reg22;
  reg3 += reg7*reg23;
  reg0 += reg8*reg24;
  reg1 += reg9*reg25;
  reg2 += reg10*reg26;
  reg3 += reg11*reg27;
  C[4]= reg0;
  C[5]= reg1;
  C[6]= reg2;
  C[7]= reg3;
}


And the generated assembly file:
tracer:~> cat test.s
        #.file  1 "test.c"
        .set    nobopt
        .option pic2
        .section        .text
        .text
        .align  2
        .globl  test_case
        .ent    test_case
test_case:
.LFB1:
        .frame  $sp,80,$31              # vars= 0, regs= 1/6, args= 0,
extra= 16
        .mask   0x10000000,-64
        .fmask  0x55500000,-8
        subu    $sp,$sp,80
.LCFI0:
        sd      $28,16($sp)
.LCFI1:
        s.d     $f30,72($sp)
.LCFI2:
        s.d     $f28,64($sp)
.LCFI3:
        s.d     $f26,56($sp)
.LCFI4:
        s.d     $f24,48($sp)
.LCFI5:
        s.d     $f22,40($sp)
.LCFI6:
        s.d     $f20,32($sp)
.LCFI7:
        .set    noat
        lui     $1,%hi(%neg(%gp_rel(test_case)))
        addiu   $1,$1,%lo(%neg(%gp_rel(test_case)))
        daddu   $gp,$1,$25
        .set    at
        l.s     $f16,0($5)
        l.s     $f17,4($5)
        #nop
        mul.s   $f0,$f16,$f17
        l.s     $f4,32($5)
        l.s     $f6,44($5)
        l.s     $f7,56($5)
        l.s     $f13,40($5)
        l.s     $f27,0($4)
        l.s     $f25,72($6)
        mul.s   $f1,$f4,$f13
        l.s     $f19,8($5)
        l.s     $f21,12($5)
        l.s     $f15,48($5)
        l.s     $f18,52($5)
        l.s     $f20,16($5)
        l.s     $f22,20($5)
        mul.s   $f2,$f15,$f18
        l.s     $f23,24($5)
        add.s   $f27,$f27,$f0
        l.s     $f24,28($5)
        l.s     $f12,60($5)
        mov.s   $f14,$f4
        add.s   $f4,$f4,$f1
        mul.s   $f0,$f12,$f25
        s.s     $f27,0($4)
        s.s     $f27,4($4)
        s.s     $f27,8($4)
        s.s     $f27,12($4)
        l.s     $f25,104($6)
        #nop
        mul.s   $f1,$f4,$f25
        l.s     $f10,96($6)
        #nop
        mul.s   $f5,$f13,$f10
        l.s     $f11,100($6)
        #nop
        mul.s   $f10,$f15,$f11
        add.s   $f6,$f6,$f2
        l.s     $f9,48($6)
        #nop
        mul.s   $f11,$f6,$f9
        l.s     $f30,112($6)
        #nop
        mul.s   $f9,$f12,$f30
        l.s     $f29,116($6)
        add.s   $f7,$f7,$f0
        mul.s   $f0,$f18,$f29
        l.s     $f25,108($6)
        #nop
        mul.s   $f3,$f14,$f25
        l.s     $f25,52($6)
        l.s     $f27,16($4)
        mul.s   $f8,$f7,$f25
        add.s   $f27,$f27,$f1
        l.s     $f26,24($4)
        l.s     $f25,16($6)
        add.s   $f26,$f26,$f5
        mul.s   $f2,$f16,$f25
        l.s     $f31,28($4)
        l.s     $f25,20($6)
        add.s   $f31,$f31,$f10
        l.s     $f28,20($4)
        mul.s   $f5,$f17,$f25
        add.s   $f28,$f28,$f3
        l.s     $f10,8($6)
        add.s   $f27,$f27,$f11
        mul.s   $f1,$f19,$f10
        add.s   $f26,$f26,$f9
        l.s     $f11,12($6)
        add.s   $f31,$f31,$f0
        mul.s   $f3,$f20,$f11
        l.s     $f9,80($6)
        add.s   $f28,$f28,$f8
        mul.s   $f0,$f21,$f9
        add.s   $f27,$f27,$f2
        l.s     $f25,84($6)
        add.s   $f28,$f28,$f5
        mul.s   $f2,$f22,$f25
        add.s   $f26,$f26,$f1
        l.s     $f30,32($6)
        add.s   $f31,$f31,$f3
        mul.s   $f1,$f23,$f30
        add.s   $f27,$f27,$f0
        l.s     $f29,36($6)
        add.s   $f28,$f28,$f2
        mul.s   $f0,$f24,$f29
        add.s   $f26,$f26,$f1
        add.s   $f31,$f31,$f0
        s.s     $f27,16($4)
        s.s     $f28,20($4)
        s.s     $f26,24($4)
        s.s     $f31,28($4)
        l.s     $f25,72($6)
        #nop
        mul.s   $f0,$f4,$f25
        l.s     $f10,64($6)
        #nop
        mul.s   $f2,$f13,$f10
        l.s     $f11,68($6)
        #nop
        mul.s   $f3,$f6,$f11
        l.s     $f9,56($6)
        #nop
        mul.s   $f9,$f12,$f9
        l.s     $f30,88($6)
        l.s     $f29,92($6)
        #nop
        mul.s   $f5,$f29,$f30
        l.s     $f25,76($6)
        #nop
        mul.s   $f1,$f14,$f25
        l.s     $f25,60($6)
        l.s     $f27,12($4)
        mul.s   $f10,$f7,$f25
        mov.s   $f28,$f27
        mov.s   $f26,$f27
        mov.s   $f31,$f27
        l.s     $f25,24($6)
        add.s   $f27,$f27,$f0
        mul.s   $f8,$f16,$f25
        add.s   $f26,$f26,$f2
        l.s     $f11,4($6)
        add.s   $f31,$f31,$f3
        mul.s   $f3,$f19,$f11
        l.s     $f25,28($6)
        add.s   $f28,$f28,$f1
        mul.s   $f1,$f17,$f25
        add.s   $f27,$f27,$f9
        mov.s   $f25,$f29
        l.s     $f29,44($6)
        add.s   $f26,$f26,$f5
        mul.s   $f0,$f20,$f29
        add.s   $f28,$f28,$f10
        l.s     $f10,0($6)
        add.s   $f27,$f27,$f8
        mul.s   $f2,$f21,$f10
        mov.s   $f9,$f30
        l.s     $f30,40($6)
        add.s   $f31,$f31,$f0
        mul.s   $f0,$f24,$f30
        add.s   $f26,$f26,$f3
        add.s   $f28,$f28,$f1
        mul.s   $f1,$f22,$f9
        add.s   $f27,$f27,$f2
        add.s   $f31,$f31,$f0
        mul.s   $f0,$f23,$f25
        add.s   $f28,$f28,$f1
        add.s   $f26,$f26,$f0
        s.s     $f27,0($4)
        s.s     $f28,4($4)
        s.s     $f31,12($4)
        s.s     $f26,8($4)
        l.s     $f25,104($6)
        #nop
        mul.s   $f4,$f4,$f25
        l.s     $f9,48($6)
        #nop
        mul.s   $f13,$f13,$f9
        l.s     $f10,96($6)
        #nop
        mul.s   $f6,$f6,$f10
        l.s     $f11,100($6)
        #nop
        mul.s   $f18,$f18,$f11
        l.s     $f30,112($6)
        #nop
        mul.s   $f7,$f7,$f30
        l.s     $f29,116($6)
        #nop
        mul.s   $f12,$f12,$f29
        l.s     $f25,108($6)
        #nop
        mul.s   $f14,$f14,$f25
        l.s     $f10,8($6)
        #nop
        mul.s   $f19,$f19,$f10
        l.s     $f11,12($6)
        l.s     $f27,16($4)
        mul.s   $f21,$f21,$f11
        add.s   $f27,$f27,$f4
        l.s     $f26,24($4)
        l.s     $f25,52($6)
        add.s   $f26,$f26,$f13
        l.s     $f28,20($4)
        mul.s   $f15,$f15,$f25
        add.s   $f28,$f28,$f14
        l.s     $f25,16($6)
        add.s   $f27,$f27,$f6
        mul.s   $f16,$f16,$f25
        add.s   $f26,$f26,$f7
        l.s     $f31,28($4)
        l.s     $f9,80($6)
        add.s   $f31,$f31,$f15
        mul.s   $f20,$f20,$f9
        add.s   $f28,$f28,$f18
        l.s     $f25,20($6)
        add.s   $f27,$f27,$f16
        mul.s   $f17,$f17,$f25
        add.s   $f26,$f26,$f19
        l.s     $f30,32($6)
        add.s   $f31,$f31,$f12
        mul.s   $f23,$f23,$f30
        add.s   $f28,$f28,$f17
        l.s     $f25,84($6)
        add.s   $f27,$f27,$f20
        mul.s   $f22,$f22,$f25
        add.s   $f26,$f26,$f23
        l.s     $f29,36($6)
        add.s   $f31,$f31,$f21
        mul.s   $f24,$f24,$f29
        add.s   $f28,$f28,$f22
        add.s   $f31,$f31,$f24
        s.s     $f27,16($4)
        s.s     $f26,24($4)
        s.s     $f28,20($4)
        s.s     $f31,28($4)
        ld      $28,16($sp)
        l.d     $f30,72($sp)
        l.d     $f28,64($sp)
        l.d     $f26,56($sp)
        l.d     $f24,48($sp)
        l.d     $f22,40($sp)
        l.d     $f20,32($sp)
        #nop
        .set    noreorder
        .set    nomacro
        j       $31
        addu    $sp,$sp,80
        .set    macro
        .set    reorder

.LFE1:
        .end    test_case


More information about the Gcc-bugs mailing list