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

Reply via email to