This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/41015] New: [4.4 Regression] SH: miscompilation for sh4-linux
- From: "sugioka at itonet dot co dot jp" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 9 Aug 2009 16:26:07 -0000
- Subject: [Bug target/41015] New: [4.4 Regression] SH: miscompilation for sh4-linux
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
glibc-2.10.1 is not correctly compiled with gcc-4.4.1 for sh4-linux.
I attached preproccessed code.
Reproduce: sh4-linux-gcc -O2 -fPIC -S strtod_l.i
Wrong part is as follows.
.L453:
mov #64,r13
tst r9,r9 !!
add r14,r13
mov.l @(4,r13),r0
#APP
! 1306 "strtod_l.c" 1
mov r11,r5 !! udiv_qrnnd macro
swap.w r7,r4
swap.w r5,r6
jsr @r10 ! call __udiv_qrnnd_16
shll16 r6
swap.w r4,r4
jsr @r10 ! call __udiv_qrnnd_16
swap.w r1,r8
or r1,r8
! 0 "" 2
#NO_APP
bf/s .L323
mov.l r0,@(4,r13)
In this code, "tst r9,r9" is moved to wrong place as if
"t" bit is not clobbered in __udiv_qrnnd_16.
I guessed that missing "t" bit constraint in udiv_qrnnd macro
caused this problem. So I tried following patch, but there was
no effect.
Index: gcc/longlong.h
===================================================================
--- gcc/longlong.h (revision 150591)
+++ gcc/longlong.h (working copy)
@@ -982,7 +982,7 @@
" or r1,%0" \
: "=r" (q), "=&z" (r) \
: "1" (n1), "r" (n0), "rm" (d), "r" (&__udiv_qrnnd_16) \
- : "r1", "r2", "r4", "r5", "r6", "pr"); \
+ : "r1", "r2", "r4", "r5", "r6", "pr", "t"); \
} while (0)
#define UDIV_TIME 80
--
Summary: [4.4 Regression] SH: miscompilation for sh4-linux
Product: gcc
Version: 4.4.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: sugioka at itonet dot co dot jp
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41015