|
From: | grischka |
Subject: | Re: [Tinycc-devel] Wrong __int64 computation |
Date: | Sat, 19 Dec 2009 19:33:26 +0100 |
User-agent: | Thunderbird 2.0.0.23 (Windows/20090812) |
Christian Jullien wrote:
In fact it was related to unsigned __int64 not signed __int64 The following patch modeled after TOK_DIV in x86_64-gen fixes, at least for my case, this issue.
Yes, almost. The signed div does sign-extend rax into rdx 4: 48 99 cqto 6: 48 f7 f9 idiv %rcx while the unsigned case just clears rdx, like this: 9: 48 31 d2 xor %rdx,%rdx c: 48 f7 f1 div %rcx You'd notice the difference only with _very_ big numbers, such as 0xBFFFFFFFFFFFFFFF / 16, though. I hope this works: http://repo.or.cz/w/tinycc.git/commitdiff/a98caba0 --- grischka
Could you please review the patch? } else { if (op == TOK_UDIV || op == TOK_UMOD) { #if 1 if ((vtop->type.t & VT_BTYPE) & VT_LLONG) { o(0x9948); /* cqto */ o(0x48 + REX_BASE(fr)); } else { o(0x99); /* cltd */ } o(0xf7); /* idiv fr, %eax */ o(0xf0 + fr); #else o(0xf7d231); /* xor %edx, %edx, div fr, %eax */ o(0xf0 + fr); #endif Christian
[Prev in Thread] | Current Thread | [Next in Thread] |