mirror of
https://sourceware.org/git/glibc.git
synced 2025-12-09 14:21:14 +03:00
gcc PR 89877: miscompilation due to missing cc clobber in longlong.h macros
simple test such as below was failing.
| void main(int argc, char *argv[])
| {
| size_t total_time = 115424; // expected 115.424
| double secs = (double)total_time/(double)1000;
| printf("%s %d %lf\n", "secs", total_time, secs); // prints 113.504
| printf("%d\n", (size_t)secs);
| }
The printf eventually called into glibc stdlib/divrem.c:__mpn_divrem()
which uses the __arc__ specific inline asm macros from longlong.h which
were causing miscompilation.
include/
2019-03-28 Vineet Gupta <vgupta@synopsys.com>
PR 89877
* longlong.h [__arc__] (add_ssaaaa): Add cc clobber
(sub_ddmmss): Likewise.
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
This commit is contained in:
@@ -199,7 +199,8 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
|
||||
: "%r" ((USItype) (ah)), \
|
||||
"rICal" ((USItype) (bh)), \
|
||||
"%r" ((USItype) (al)), \
|
||||
"rICal" ((USItype) (bl)))
|
||||
"rICal" ((USItype) (bl)) \
|
||||
: "cc")
|
||||
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
|
||||
__asm__ ("sub.f %1, %4, %5\n\tsbc %0, %2, %3" \
|
||||
: "=r" ((USItype) (sh)), \
|
||||
@@ -207,7 +208,8 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
|
||||
: "r" ((USItype) (ah)), \
|
||||
"rICal" ((USItype) (bh)), \
|
||||
"r" ((USItype) (al)), \
|
||||
"rICal" ((USItype) (bl)))
|
||||
"rICal" ((USItype) (bl)) \
|
||||
: "cc")
|
||||
|
||||
#define __umulsidi3(u,v) ((UDItype)(USItype)u*(USItype)v)
|
||||
#ifdef __ARC_NORM__
|
||||
|
||||
Reference in New Issue
Block a user