1 // RUN: %clang_builtins %s %librt -o %t && %run %t
2 // REQUIRES: librt_has_divmodti4
4 //===-- divmodti4_test.c - Test __divmodti4 -------------------------------===//
6 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
7 // See https://llvm.org/LICENSE.txt for license information.
8 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
10 //===----------------------------------------------------------------------===//
12 // This file tests __divmodti4 for the compiler_rt library.
14 //===----------------------------------------------------------------------===//
21 // Effects: if rem != 0, *rem = a % b
24 COMPILER_RT_ABI ti_int
__divmodti4(ti_int a
, ti_int b
, ti_int
* rem
);
26 int test__divmodti4(ti_int a
, ti_int b
, ti_int expected_q
, ti_int expected_r
) {
28 ti_int q
= __divmodti4(a
, b
, &r
);
29 if (q
!= expected_q
|| r
!= expected_r
)
36 expected_qt
.all
= expected_q
;
38 expected_rt
.all
= expected_r
;
43 printf("error in __divmodti4: 0x%.16llX%.16llX / 0x%.16llX%.16llX = "
44 "0x%.16llX%.16llX, R = 0x%.16llX%.16llX, expected 0x%.16llX%.16llX, "
46 at
.s
.high
, at
.s
.low
, bt
.s
.high
, bt
.s
.low
, qt
.s
.high
, qt
.s
.low
,
47 rt
.s
.high
, rt
.s
.low
, expected_qt
.s
.high
, expected_qt
.s
.low
,
48 expected_rt
.s
.high
, expected_rt
.s
.low
);
50 return !(q
== expected_q
&& r
== expected_r
);
53 char assumption_1
[sizeof(ti_int
) == 2*sizeof(di_int
)] = {0};
57 { (ti_int
) 0, (ti_int
) 1, (ti_int
) 0, (ti_int
) 0 },
58 { (ti_int
) 0, (ti_int
)-1, (ti_int
) 0, (ti_int
) 0 },
59 { (ti_int
) 2, (ti_int
) 1, (ti_int
) 2, (ti_int
) 0 },
60 { (ti_int
) 2, (ti_int
)-1, (ti_int
)-2, (ti_int
) 0 },
61 { (ti_int
)-2, (ti_int
) 1, (ti_int
)-2, (ti_int
) 0 },
62 { (ti_int
)-2, (ti_int
)-1, (ti_int
) 2, (ti_int
) 0 },
63 { (ti_int
) 5, (ti_int
) 3, (ti_int
) 1, (ti_int
) 2 },
64 { (ti_int
) 5, (ti_int
)-3, (ti_int
)-1, (ti_int
) 2 },
65 { (ti_int
)-5, (ti_int
) 3, (ti_int
)-1, (ti_int
)-2 },
66 { (ti_int
)-5, (ti_int
)-3, (ti_int
) 1, (ti_int
)-2 },
67 { (ti_int
)0x8000000000000000ULL
<< 64 | 0, (ti_int
) 1, (ti_int
)0x8000000000000000ULL
<< 64 | 0, (ti_int
)0x0LL
},
68 { (ti_int
)0x8000000000000000ULL
<< 64 | 0, (ti_int
)-1, (ti_int
)0x8000000000000000ULL
<< 64 | 0, (ti_int
)0x0LL
},
69 { (ti_int
)0x8000000000000000ULL
<< 64 | 0, (ti_int
)-2, (ti_int
)0x4000000000000000ULL
<< 64 | 0, (ti_int
)0x0LL
},
70 { (ti_int
)0x8000000000000000ULL
<< 64 | 0, (ti_int
) 2, (ti_int
)0xC000000000000000ULL
<< 64 | 0, (ti_int
)0x0LL
},
71 { (ti_int
)0x8000000000000000ULL
<< 64 | 0, (ti_int
)-3, (ti_int
)0x2AAAAAAAAAAAAAAAULL
<< 64 | 0xAAAAAAAAAAAAAAAAULL
, (ti_int
)-2 },
72 { (ti_int
)0x8000000000000000ULL
<< 64 | 0, (ti_int
) 3, (ti_int
)0xD555555555555555ULL
<< 64 | 0x5555555555555556ULL
, (ti_int
)-2 },
80 const unsigned N
= sizeof(tests
) / sizeof(tests
[0]);
82 for (i
= 0; i
< N
; ++i
)
83 if (test__divmodti4(tests
[i
][0], tests
[i
][1], tests
[i
][2], tests
[i
][3]))