1 //===-- divmodsi4.c - Implement __divmodsi4
2 //--------------------------------===//
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8 //===----------------------------------------------------------------------===//
10 // This file implements __divmodsi4 for the compiler_rt library.
12 //===----------------------------------------------------------------------===//
16 // Returns: a / b, *rem = a % b
18 COMPILER_RT_ABI si_int
__divmodsi4(si_int a
, si_int b
, si_int
*rem
) {
19 const int bits_in_word_m1
= (int)(sizeof(si_int
) * CHAR_BIT
) - 1;
20 si_int s_a
= a
>> bits_in_word_m1
; // s_a = a < 0 ? -1 : 0
21 si_int s_b
= b
>> bits_in_word_m1
; // s_b = b < 0 ? -1 : 0
22 a
= (a
^ s_a
) - s_a
; // negate if s_a == -1
23 b
= (b
^ s_b
) - s_b
; // negate if s_b == -1
24 s_b
^= s_a
; // sign of quotient
26 si_int q
= (__udivmodsi4(a
, b
, &r
) ^ s_b
) - s_b
; // negate if s_b == -1
27 *rem
= (r
^ s_a
) - s_a
; // negate if s_a == -1