This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c/17388] New: For dynamic linking of libgcc, r0 register should not be used by SH optimizer.


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]