Andrew Kelley via llvm-dev
2018-Apr-25 04:33 UTC
[llvm-dev] compiler-rt incorrect for this udivmodti4 case?
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 Is this a bug? -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180425/f7788ed8/attachment.html>
Stephen Canon via llvm-dev
2018-Apr-25 14:34 UTC
[llvm-dev] compiler-rt incorrect for this udivmodti4 case?
> 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=9999991610955792383Are your results mislabeled? Integer division rounds towards zero, so the correct division result is 15231399999, which you have as the compiler-rt result. – Steve
Andrew Kelley via llvm-dev
2018-Apr-25 17:58 UTC
[llvm-dev] compiler-rt incorrect for this udivmodti4 case?
This is a rather embarrassing mistake that I made - I simply misunderstood Python's output: $ python3>>> 152313999999999991610955792383 / 1000000000000000000015231400000.0>>> 152313999999999991610955792383 // 1000000000000000000015231399999 Apologies for the noise. On Wed, Apr 25, 2018 at 10:34 AM, Stephen Canon <scanon at apple.com> wrote:> > > > 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-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180425/bb32f0f4/attachment.html>