This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/17388] New: For dynamic linking of libgcc, r0 register should not be used by SH optimizer.
- From: "saito at densan dot co dot jp" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 10 Sep 2004 03:03:43 -0000
- Subject: [Bug c/17388] New: For dynamic linking of libgcc, r0 register should not be used by SH optimizer.
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
For assembled source of testcase, .L12 defines |__sdivsi3_i4|.
The code of |__sdivsi3_i4| does not use r0 register, however if using namic
linking of libgc, r0 and r1 register will be used by dynamic linking.
nnn.c of testcase:
/*
sh-elf-gcc -m4 -S -O2 nnn.c
from groff-1.18.1-11/src/roff/troff/number.cc
*/
typedef int units;
units scale(units n, units x, units y)
{
double res;
if (n >= 0) {
if (n <= 0x7fffffff/x)
return (n*x)/y;
}
else {
if (-(unsigned)n <= -(unsigned)(-0x7fffffff -1)/x)
return (n*x)/y;
}
return (int)res;
}
assembled source of testcase:
.file "nnn.c"
.text
.text
.align 1
.align 5
.global scale
.type scale, @function
scale:
mov.l r8,@-r15
cmp/pz r4
mov.l r14,@-r15
mov r4,r7
sts.l pr,@-r15
mov r5,r8
bf/s .L2
mov r15,r14
mov.l .L12,r0
mov.l .L9,r4
jsr @r0 <-- call |__sdivsi3_i4| of libgcc
nop
sts fpul,r1
cmp/ge r7,r1
bf .L4
mul.l r8,r7
mov r6,r5
jsr @r0 <-- call again, but r0 destroied by dynamic linking
sts macl,r4
sts fpul,r0
mov r14,r15
lds.l @r15+,pr
mov.l @r15+,r14
rts
mov.l @r15+,r8
.align 5
.L2:
mov.l .L10,r2
neg r4,r3
mov.l .L11,r4
jsr @r2
nop
sts fpul,r2
cmp/hi r2,r3
bf .L7
.L4:
ftrc dr6,fpul
sts fpul,r0
mov r14,r15
lds.l @r15+,pr
mov.l @r15+,r14
rts
mov.l @r15+,r8
.align 5
.L7:
mul.l r8,r7
mov.l .L12,r1
mov r6,r5
jsr @r1
sts macl,r4
sts fpul,r0
mov r14,r15
lds.l @r15+,pr
mov.l @r15+,r14
rts
mov.l @r15+,r8
.L13:
.align 2
.L12:
.long __sdivsi3_i4
.L9:
.long 2147483647
.L10:
.long __udivsi3_i4
.L11:
.long -2147483648
.size scale, .-scale
.ident "GCC: (GNU) 3.4.2"
the disassembled code for dynamic linking:
__udivsi3_i4:
004005b8 d004 MOV.L @(H'10,PC),R0 ; 0x4005cc;*0x410ae4
004005ba 6002 MOV.L @R0,R0
004005bc d102 MOV.L @(H'8,PC),R1 ; 0x4005c8;*0x400564
004005be 402b JMP @R0
004005c0 6013 MOV R1,R0
--
Summary: For dynamic linking of libgcc, r0 register should not be
used by SH optimizer.
Product: gcc
Version: 3.4.2
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: saito at densan dot co dot jp
CC: gcc-bugs at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17388