1 //===-- divmodti4.c - Implement __divmodti4 -------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file implements __divmodti4 for the compiler_rt library.
11 //===----------------------------------------------------------------------===//
17 // Returns: a / b, *rem = a % b
19 COMPILER_RT_ABI ti_int
__divmodti4(ti_int a
, ti_int b
, ti_int
*rem
) {
20 const int bits_in_tword_m1
= (int)(sizeof(ti_int
) * CHAR_BIT
) - 1;
21 ti_int s_a
= a
>> bits_in_tword_m1
; // s_a = a < 0 ? -1 : 0
22 ti_int s_b
= b
>> bits_in_tword_m1
; // s_b = b < 0 ? -1 : 0
23 a
= (tu_int
)(a
^ s_a
) - s_a
; // negate if s_a == -1
24 b
= (tu_int
)(b
^ s_b
) - s_b
; // negate if s_b == -1
25 s_b
^= s_a
; // sign of quotient
27 ti_int q
= (__udivmodti4(a
, b
, &r
) ^ s_b
) - s_b
; // negate if s_b == -1
28 *rem
= (r
^ s_a
) - s_a
; // negate if s_a == -1
32 #endif // CRT_HAS_128BIT