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