Skip to content
This repository was archived by the owner on Sep 2, 2025. It is now read-only.

Commit ffb7a86

Browse files
committed
Revert "Inline int_div_impl.inc"
This reverts commit b6a24d6.
1 parent 96ca69d commit ffb7a86

File tree

10 files changed

+148
-173
lines changed

10 files changed

+148
-173
lines changed

divdi3.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,9 @@
1616

1717
// Returns: a / b
1818

19-
COMPILER_RT_ABI di_int __divdi3(di_int a, di_int b) {
20-
const int N = (int)(sizeof(di_int) * CHAR_BIT) - 1;
21-
di_int s_a = a >> N; // s_a = a < 0 ? -1 : 0
22-
di_int s_b = b >> N; // s_b = b < 0 ? -1 : 0
23-
du_int a_u = (du_int)(a ^ s_a) + (-s_a); // negate if s_a == -1
24-
du_int b_u = (du_int)(b ^ s_b) + (-s_b); // negate if s_b == -1
25-
s_a ^= s_b; // sign of quotient
26-
return (__udivmoddi4(a_u, b_u, (du_int *)0) ^ s_a) + (-s_a); // negate if s_a == -1
27-
}
19+
#define fixint_t di_int
20+
#define fixuint_t du_int
21+
#define COMPUTE_UDIV(a, b) __udivmoddi4((a), (b), (du_int *)0)
22+
#include "int_div_impl.inc"
23+
24+
COMPILER_RT_ABI di_int __divdi3(di_int a, di_int b) { return __divXi3(a, b); }

divsi3.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,16 @@
1616

1717
// Returns: a / b
1818

19+
#define fixint_t si_int
20+
#define fixuint_t su_int
1921
// On CPUs without unsigned hardware division support,
2022
// this calls __udivsi3 (notice the cast to su_int).
2123
// On CPUs with unsigned hardware division support,
2224
// this uses the unsigned division instruction.
25+
#define COMPUTE_UDIV(a, b) ((su_int)(a) / (su_int)(b))
26+
#include "int_div_impl.inc"
2327

24-
COMPILER_RT_ABI si_int __divsi3(si_int a, si_int b) {
25-
const int N = (int)(sizeof(si_int) * CHAR_BIT) - 1;
26-
si_int s_a = a >> N; // s_a = a < 0 ? -1 : 0
27-
si_int s_b = b >> N; // s_b = b < 0 ? -1 : 0
28-
su_int a_u = (su_int)(a ^ s_a) + (-s_a); // negate if s_a == -1
29-
su_int b_u = (su_int)(b ^ s_b) + (-s_b); // negate if s_b == -1
30-
s_a ^= s_b; // sign of quotient
31-
return (((su_int)a_u / (su_int)b_u) ^ s_a) + (-s_a); // negate if s_a == -1
32-
}
28+
COMPILER_RT_ABI si_int __divsi3(si_int a, si_int b) { return __divXi3(a, b); }
3329

3430
#if defined(__ARM_EABI__)
3531
COMPILER_RT_ALIAS(__divsi3, __aeabi_idiv)

divti3.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,11 @@
1818

1919
// Returns: a / b
2020

21-
COMPILER_RT_ABI ti_int __divti3(ti_int a, ti_int b) {
22-
const int N = (int)(sizeof(ti_int) * CHAR_BIT) - 1;
23-
ti_int s_a = a >> N; // s_a = a < 0 ? -1 : 0
24-
ti_int s_b = b >> N; // s_b = b < 0 ? -1 : 0
25-
tu_int a_u = (tu_int)(a ^ s_a) + (-s_a); // negate if s_a == -1
26-
tu_int b_u = (tu_int)(b ^ s_b) + (-s_b); // negate if s_b == -1
27-
s_a ^= s_b; // sign of quotient
28-
return (__udivmodti4(a_u, b_u, (tu_int *)0) ^ s_a) + (-s_a); // negate if s_a == -1
29-
}
21+
#define fixint_t ti_int
22+
#define fixuint_t tu_int
23+
#define COMPUTE_UDIV(a, b) __udivmodti4((a), (b), (tu_int *)0)
24+
#include "int_div_impl.inc"
25+
26+
COMPILER_RT_ABI ti_int __divti3(ti_int a, ti_int b) { return __divXi3(a, b); }
3027

3128
#endif // CRT_HAS_128BIT

int_div_impl.inc

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
//===-- int_div_impl.inc - Integer division ---------------------*- C++ -*-===//
2+
//
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
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// Helpers used by __udivsi3, __umodsi3, __udivdi3, and __umodsi3.
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#define clz(a) (sizeof(a) == sizeof(unsigned long long) ? __builtin_clzll(a) : clzsi(a))
14+
15+
// Adapted from Figure 3-40 of The PowerPC Compiler Writer's Guide
16+
static __inline fixuint_t __udivXi3(fixuint_t n, fixuint_t d) {
17+
const unsigned N = sizeof(fixuint_t) * CHAR_BIT;
18+
// d == 0 cases are unspecified.
19+
unsigned sr = (d ? clz(d) : N) - (n ? clz(n) : N);
20+
// 0 <= sr <= N - 1 or sr is very large.
21+
if (sr > N - 1) // n < d
22+
return 0;
23+
if (sr == N - 1) // d == 1
24+
return n;
25+
++sr;
26+
// 1 <= sr <= N - 1. Shifts do not trigger UB.
27+
fixuint_t r = n >> sr;
28+
n <<= N - sr;
29+
fixuint_t carry = 0;
30+
for (; sr > 0; --sr) {
31+
r = (r << 1) | (n >> (N - 1));
32+
n = (n << 1) | carry;
33+
// Branch-less version of:
34+
// carry = 0;
35+
// if (r >= d) r -= d, carry = 1;
36+
const fixint_t s = (fixint_t)(d - r - 1) >> (N - 1);
37+
carry = s & 1;
38+
r -= d & s;
39+
}
40+
n = (n << 1) | carry;
41+
return n;
42+
}
43+
44+
// Mostly identical to __udivXi3 but the return values are different.
45+
static __inline fixuint_t __umodXi3(fixuint_t n, fixuint_t d) {
46+
const unsigned N = sizeof(fixuint_t) * CHAR_BIT;
47+
// d == 0 cases are unspecified.
48+
unsigned sr = (d ? clz(d) : N) - (n ? clz(n) : N);
49+
// 0 <= sr <= N - 1 or sr is very large.
50+
if (sr > N - 1) // n < d
51+
return n;
52+
if (sr == N - 1) // d == 1
53+
return 0;
54+
++sr;
55+
// 1 <= sr <= N - 1. Shifts do not trigger UB.
56+
fixuint_t r = n >> sr;
57+
n <<= N - sr;
58+
fixuint_t carry = 0;
59+
for (; sr > 0; --sr) {
60+
r = (r << 1) | (n >> (N - 1));
61+
n = (n << 1) | carry;
62+
// Branch-less version of:
63+
// carry = 0;
64+
// if (r >= d) r -= d, carry = 1;
65+
const fixint_t s = (fixint_t)(d - r - 1) >> (N - 1);
66+
carry = s & 1;
67+
r -= d & s;
68+
}
69+
return r;
70+
}
71+
72+
#ifdef COMPUTE_UDIV
73+
static __inline fixint_t __divXi3(fixint_t a, fixint_t b) {
74+
const int N = (int)(sizeof(fixint_t) * CHAR_BIT) - 1;
75+
fixint_t s_a = a >> N; // s_a = a < 0 ? -1 : 0
76+
fixint_t s_b = b >> N; // s_b = b < 0 ? -1 : 0
77+
fixuint_t a_u = (fixuint_t)(a ^ s_a) + (-s_a); // negate if s_a == -1
78+
fixuint_t b_u = (fixuint_t)(b ^ s_b) + (-s_b); // negate if s_b == -1
79+
s_a ^= s_b; // sign of quotient
80+
return (COMPUTE_UDIV(a_u, b_u) ^ s_a) + (-s_a); // negate if s_a == -1
81+
}
82+
#endif // COMPUTE_UDIV
83+
84+
#ifdef ASSIGN_UMOD
85+
static __inline fixint_t __modXi3(fixint_t a, fixint_t b) {
86+
const int N = (int)(sizeof(fixint_t) * CHAR_BIT) - 1;
87+
fixint_t s = b >> N; // s = b < 0 ? -1 : 0
88+
fixuint_t b_u = (fixuint_t)(b ^ s) + (-s); // negate if s == -1
89+
s = a >> N; // s = a < 0 ? -1 : 0
90+
fixuint_t a_u = (fixuint_t)(a ^ s) + (-s); // negate if s == -1
91+
fixuint_t res;
92+
ASSIGN_UMOD(res, a_u, b_u);
93+
return (res ^ s) + (-s); // negate if s == -1
94+
}
95+
#endif // ASSIGN_UMOD

moddi3.c

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,9 @@
1616

1717
// Returns: a % b
1818

19-
COMPILER_RT_ABI di_int __moddi3(di_int a, di_int b) {
20-
const int N = (int)(sizeof(di_int) * CHAR_BIT) - 1;
21-
di_int s = b >> N; // s = b < 0 ? -1 : 0
22-
du_int b_u = (du_int)(b ^ s) + (-s); // negate if s == -1
23-
s = a >> N; // s = a < 0 ? -1 : 0
24-
du_int a_u = (du_int)(a ^ s) + (-s); // negate if s == -1
25-
du_int res;
26-
__udivmoddi4(a_u, b_u, &res);
27-
return (res ^ s) + (-s); // negate if s == -1
28-
}
19+
#define fixint_t di_int
20+
#define fixuint_t du_int
21+
#define ASSIGN_UMOD(res, a, b) __udivmoddi4((a), (b), &(res))
22+
#include "int_div_impl.inc"
23+
24+
COMPILER_RT_ABI di_int __moddi3(di_int a, di_int b) { return __modXi3(a, b); }

modti3.c

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,11 @@
1818

1919
// Returns: a % b
2020

21-
COMPILER_RT_ABI ti_int __modti3(ti_int a, ti_int b) {
22-
const int N = (int)(sizeof(ti_int) * CHAR_BIT) - 1;
23-
ti_int s = b >> N; // s = b < 0 ? -1 : 0
24-
tu_int b_u = (tu_int)(b ^ s) + (-s); // negate if s == -1
25-
s = a >> N; // s = a < 0 ? -1 : 0
26-
tu_int a_u = (tu_int)(a ^ s) + (-s); // negate if s == -1
27-
tu_int res;
28-
__udivmodti4(a_u, b_u, &res);
29-
return (res ^ s) + (-s); // negate if s == -1
30-
}
21+
#define fixint_t ti_int
22+
#define fixuint_t tu_int
23+
#define ASSIGN_UMOD(res, a, b) __udivmodti4((a), (b), &(res))
24+
#include "int_div_impl.inc"
25+
26+
COMPILER_RT_ABI ti_int __modti3(ti_int a, ti_int b) { return __modXi3(a, b); }
3127

3228
#endif // CRT_HAS_128BIT

udivdi3.c

Lines changed: 6 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -14,40 +14,14 @@
1414

1515
#include "int_lib.h"
1616

17-
// Returns: a / b
17+
typedef du_int fixuint_t;
18+
typedef di_int fixint_t;
19+
#include "int_div_impl.inc"
1820

19-
#ifdef clz
20-
#undef clz
21-
#endif
22-
#define clz(a) (sizeof(a) == sizeof(unsigned long long) ? __builtin_clzll(a) : clzsi(a))
21+
// Returns: a / b
2322

24-
// Adapted from Figure 3-40 of The PowerPC Compiler Writer's Guide
25-
COMPILER_RT_ABI du_int __udivdi3(du_int n, du_int d) {
26-
const unsigned N = sizeof(du_int) * CHAR_BIT;
27-
// d == 0 cases are unspecified.
28-
unsigned sr = (d ? clz(d) : N) - (n ? clz(n) : N);
29-
// 0 <= sr <= N - 1 or sr is very large.
30-
if (sr > N - 1) // n < d
31-
return 0;
32-
if (sr == N - 1) // d == 1
33-
return n;
34-
++sr;
35-
// 1 <= sr <= N - 1. Shifts do not trigger UB.
36-
du_int r = n >> sr;
37-
n <<= N - sr;
38-
du_int carry = 0;
39-
for (; sr > 0; --sr) {
40-
r = (r << 1) | (n >> (N - 1));
41-
n = (n << 1) | carry;
42-
// Branch-less version of:
43-
// carry = 0;
44-
// if (r >= d) r -= d, carry = 1;
45-
const di_int s = (di_int)(d - r - 1) >> (N - 1);
46-
carry = s & 1;
47-
r -= d & s;
48-
}
49-
n = (n << 1) | carry;
50-
return n;
23+
COMPILER_RT_ABI du_int __udivdi3(du_int a, du_int b) {
24+
return __udivXi3(a, b);
5125
}
5226

5327
#undef clz

udivsi3.c

Lines changed: 6 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -14,40 +14,14 @@
1414

1515
#include "int_lib.h"
1616

17-
// Returns: a / b
17+
typedef su_int fixuint_t;
18+
typedef si_int fixint_t;
19+
#include "int_div_impl.inc"
1820

19-
#ifdef clz
20-
#undef clz
21-
#endif
22-
#define clz(a) (sizeof(a) == sizeof(unsigned long long) ? __builtin_clzll(a) : clzsi(a))
21+
// Returns: a / b
2322

24-
// Adapted from Figure 3-40 of The PowerPC Compiler Writer's Guide
25-
COMPILER_RT_ABI su_int __udivsi3(su_int n, su_int d) {
26-
const unsigned N = sizeof(su_int) * CHAR_BIT;
27-
// d == 0 cases are unspecified.
28-
unsigned sr = (d ? clz(d) : N) - (n ? clz(n) : N);
29-
// 0 <= sr <= N - 1 or sr is very large.
30-
if (sr > N - 1) // n < d
31-
return 0;
32-
if (sr == N - 1) // d == 1
33-
return n;
34-
++sr;
35-
// 1 <= sr <= N - 1. Shifts do not trigger UB.
36-
su_int r = n >> sr;
37-
n <<= N - sr;
38-
su_int carry = 0;
39-
for (; sr > 0; --sr) {
40-
r = (r << 1) | (n >> (N - 1));
41-
n = (n << 1) | carry;
42-
// Branch-less version of:
43-
// carry = 0;
44-
// if (r >= d) r -= d, carry = 1;
45-
const si_int s = (si_int)(d - r - 1) >> (N - 1);
46-
carry = s & 1;
47-
r -= d & s;
48-
}
49-
n = (n << 1) | carry;
50-
return n;
23+
COMPILER_RT_ABI su_int __udivsi3(su_int a, su_int b) {
24+
return __udivXi3(a, b);
5125
}
5226

5327
#undef clz

umoddi3.c

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -14,39 +14,14 @@
1414

1515
#include "int_lib.h"
1616

17-
// Returns: a % b
17+
typedef du_int fixuint_t;
18+
typedef di_int fixint_t;
19+
#include "int_div_impl.inc"
1820

19-
#ifdef clz
20-
#undef clz
21-
#endif
22-
#define clz(a) (sizeof(a) == sizeof(unsigned long long) ? __builtin_clzll(a) : clzsi(a))
21+
// Returns: a % b
2322

24-
// Mostly identical to __udivdi3 but the return values are different.
25-
COMPILER_RT_ABI du_int __umoddi3(du_int n, du_int d) {
26-
const unsigned N = sizeof(du_int) * CHAR_BIT;
27-
// d == 0 cases are unspecified.
28-
unsigned sr = (d ? clz(d) : N) - (n ? clz(n) : N);
29-
// 0 <= sr <= N - 1 or sr is very large.
30-
if (sr > N - 1) // n < d
31-
return n;
32-
if (sr == N - 1) // d == 1
33-
return 0;
34-
++sr;
35-
// 1 <= sr <= N - 1. Shifts do not trigger UB.
36-
du_int r = n >> sr;
37-
n <<= N - sr;
38-
du_int carry = 0;
39-
for (; sr > 0; --sr) {
40-
r = (r << 1) | (n >> (N - 1));
41-
n = (n << 1) | carry;
42-
// Branch-less version of:
43-
// carry = 0;
44-
// if (r >= d) r -= d, carry = 1;
45-
const di_int s = (di_int)(d - r - 1) >> (N - 1);
46-
carry = s & 1;
47-
r -= d & s;
48-
}
49-
return r;
23+
COMPILER_RT_ABI du_int __umoddi3(du_int a, du_int b) {
24+
return __umodXi3(a, b);
5025
}
5126

5227
#undef clz

umodsi3.c

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -14,39 +14,14 @@
1414

1515
#include "int_lib.h"
1616

17-
// Returns: a % b
17+
typedef su_int fixuint_t;
18+
typedef si_int fixint_t;
19+
#include "int_div_impl.inc"
1820

19-
#ifdef clz
20-
#undef clz
21-
#endif
22-
#define clz(a) (sizeof(a) == sizeof(unsigned long long) ? __builtin_clzll(a) : clzsi(a))
21+
// Returns: a % b
2322

24-
// Mostly identical to __udivsi3 but the return values are different.
25-
COMPILER_RT_ABI su_int __umodsi3(su_int n, su_int d) {
26-
const unsigned N = sizeof(su_int) * CHAR_BIT;
27-
// d == 0 cases are unspecified.
28-
unsigned sr = (d ? clz(d) : N) - (n ? clz(n) : N);
29-
// 0 <= sr <= N - 1 or sr is very large.
30-
if (sr > N - 1) // n < d
31-
return n;
32-
if (sr == N - 1) // d == 1
33-
return 0;
34-
++sr;
35-
// 1 <= sr <= N - 1. Shifts do not trigger UB.
36-
su_int r = n >> sr;
37-
n <<= N - sr;
38-
su_int carry = 0;
39-
for (; sr > 0; --sr) {
40-
r = (r << 1) | (n >> (N - 1));
41-
n = (n << 1) | carry;
42-
// Branch-less version of:
43-
// carry = 0;
44-
// if (r >= d) r -= d, carry = 1;
45-
const si_int s = (si_int)(d - r - 1) >> (N - 1);
46-
carry = s & 1;
47-
r -= d & s;
48-
}
49-
return r;
23+
COMPILER_RT_ABI su_int __umodsi3(su_int a, su_int b) {
24+
return __umodXi3(a, b);
5025
}
5126

5227
#undef clz

0 commit comments

Comments
 (0)