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
_______________________________________________
Tinycc-devel mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/tinycc-devel