[llvm-dev] compiler-rt incorrect for this udivmodti4 case?
Stephen Canon via llvm-dev
llvm-dev at lists.llvm.org
Wed Apr 25 07:34:06 PDT 2018
> On Apr 25, 2018, at 12:33 AM, Andrew Kelley via llvm-dev <llvm-dev at lists.llvm.org> wrote:
>
> Here is my test case:
>
> #include <stdio.h>
>
> int main(int argc, char **argv) {
> tu_int a = (tu_int)0x1ec273014 << 64 | 0xff7377ffffffffffuLL;
> tu_int b = (tu_int)0x8ac7230489e80000uLL;
> tu_int r;
> tu_int q = __udivmodti4(a, b, &r);
>
> utwords qt;
> qt.all = q;
> utwords rt;
> rt.all = r;
> fprintf(stderr, "q=0x%.16llX%.16llX\nr=0x%.16llX%.16llX\n",
> qt.s.high, qt.s.low, rt.s.high, rt.s.low);
>
> return 0;
> }
>
> This corresponds to the inputs
> a=152313999999999991610955792383
> b=10000000000000000000
>
> The correct result of division is
> r=15231400000
> q=9999991610955792383
>
> However compiler-rt gives:
> r=15231399999
> q=9999991610955792383
Are your results mislabeled? Integer division rounds towards zero, so the correct division result is 15231399999, which you have as the compiler-rt result.
– Steve
More information about the llvm-dev
mailing list