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

Commit 96ca69d

Browse files
committed
Revert "Inline int_mulo_impl.inc and int_mulv_impl.inc"
This reverts commit 8b8d2f1.
1 parent 9032e9f commit 96ca69d

File tree

8 files changed

+122
-178
lines changed

8 files changed

+122
-178
lines changed

int_mulo_impl.inc

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
//===-- int_mulo_impl.inc - Implement __mulo[sdt]i4 ---------------*- 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+
// Helper used by __mulosi4, __mulodi4 and __muloti4.
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#include "int_lib.h"
14+
15+
// Returns: a * b
16+
17+
// Effects: sets *overflow to 1 if a * b overflows
18+
19+
static __inline fixint_t __muloXi4(fixint_t a, fixint_t b, int *overflow) {
20+
const int N = (int)(sizeof(fixint_t) * CHAR_BIT);
21+
const fixint_t MIN = (fixint_t)((fixuint_t)1 << (N - 1));
22+
const fixint_t MAX = ~MIN;
23+
*overflow = 0;
24+
fixint_t result = (fixuint_t)a * b;
25+
if (a == MIN) {
26+
if (b != 0 && b != 1)
27+
*overflow = 1;
28+
return result;
29+
}
30+
if (b == MIN) {
31+
if (a != 0 && a != 1)
32+
*overflow = 1;
33+
return result;
34+
}
35+
fixint_t sa = a >> (N - 1);
36+
fixint_t abs_a = (a ^ sa) - sa;
37+
fixint_t sb = b >> (N - 1);
38+
fixint_t abs_b = (b ^ sb) - sb;
39+
if (abs_a < 2 || abs_b < 2)
40+
return result;
41+
if (sa == sb) {
42+
if (abs_a > MAX / abs_b)
43+
*overflow = 1;
44+
} else {
45+
if (abs_a > MIN / -abs_b)
46+
*overflow = 1;
47+
}
48+
return result;
49+
}

int_mulv_impl.inc

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
//===-- int_mulv_impl.inc - Implement __mulv[sdt]i3 ---------------*- 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+
// Helper used by __mulvsi3, __mulvdi3 and __mulvti3.
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#include "int_lib.h"
14+
15+
// Returns: a * b
16+
17+
// Effects: aborts if a * b overflows
18+
19+
static __inline fixint_t __mulvXi3(fixint_t a, fixint_t b) {
20+
const int N = (int)(sizeof(fixint_t) * CHAR_BIT);
21+
const fixint_t MIN = (fixint_t)((fixuint_t)1 << (N - 1));
22+
const fixint_t MAX = ~MIN;
23+
if (a == MIN) {
24+
if (b == 0 || b == 1)
25+
return a * b;
26+
compilerrt_abort();
27+
}
28+
if (b == MIN) {
29+
if (a == 0 || a == 1)
30+
return a * b;
31+
compilerrt_abort();
32+
}
33+
fixint_t sa = a >> (N - 1);
34+
fixint_t abs_a = (a ^ sa) - sa;
35+
fixint_t sb = b >> (N - 1);
36+
fixint_t abs_b = (b ^ sb) - sb;
37+
if (abs_a < 2 || abs_b < 2)
38+
return a * b;
39+
if (sa == sb) {
40+
if (abs_a > MAX / abs_b)
41+
compilerrt_abort();
42+
} else {
43+
if (abs_a > MIN / -abs_b)
44+
compilerrt_abort();
45+
}
46+
return a * b;
47+
}

mulodi4.c

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,40 +12,14 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
#include "int_lib.h"
15+
#define fixint_t di_int
16+
#define fixuint_t du_int
17+
#include "int_mulo_impl.inc"
1618

1719
// Returns: a * b
1820

1921
// Effects: sets *overflow to 1 if a * b overflows
2022

2123
COMPILER_RT_ABI di_int __mulodi4(di_int a, di_int b, int *overflow) {
22-
const int N = (int)(sizeof(di_int) * CHAR_BIT);
23-
const di_int MIN = (di_int)((du_int)1 << (N - 1));
24-
const di_int MAX = ~MIN;
25-
*overflow = 0;
26-
di_int result = (du_int)a * b;
27-
if (a == MIN) {
28-
if (b != 0 && b != 1)
29-
*overflow = 1;
30-
return result;
31-
}
32-
if (b == MIN) {
33-
if (a != 0 && a != 1)
34-
*overflow = 1;
35-
return result;
36-
}
37-
di_int sa = a >> (N - 1);
38-
di_int abs_a = (a ^ sa) - sa;
39-
di_int sb = b >> (N - 1);
40-
di_int abs_b = (b ^ sb) - sb;
41-
if (abs_a < 2 || abs_b < 2)
42-
return result;
43-
if (sa == sb) {
44-
if (abs_a > MAX / abs_b)
45-
*overflow = 1;
46-
} else {
47-
if (abs_a > MIN / -abs_b)
48-
*overflow = 1;
49-
}
50-
return result;
24+
return __muloXi4(a, b, overflow);
5125
}

mulosi4.c

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,40 +12,14 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
#include "int_lib.h"
15+
#define fixint_t si_int
16+
#define fixuint_t su_int
17+
#include "int_mulo_impl.inc"
1618

1719
// Returns: a * b
1820

1921
// Effects: sets *overflow to 1 if a * b overflows
2022

2123
COMPILER_RT_ABI si_int __mulosi4(si_int a, si_int b, int *overflow) {
22-
const int N = (int)(sizeof(si_int) * CHAR_BIT);
23-
const si_int MIN = (si_int)((su_int)1 << (N - 1));
24-
const si_int MAX = ~MIN;
25-
*overflow = 0;
26-
si_int result = (su_int)a * b;
27-
if (a == MIN) {
28-
if (b != 0 && b != 1)
29-
*overflow = 1;
30-
return result;
31-
}
32-
if (b == MIN) {
33-
if (a != 0 && a != 1)
34-
*overflow = 1;
35-
return result;
36-
}
37-
si_int sa = a >> (N - 1);
38-
si_int abs_a = (a ^ sa) - sa;
39-
si_int sb = b >> (N - 1);
40-
si_int abs_b = (b ^ sb) - sb;
41-
if (abs_a < 2 || abs_b < 2)
42-
return result;
43-
if (sa == sb) {
44-
if (abs_a > MAX / abs_b)
45-
*overflow = 1;
46-
} else {
47-
if (abs_a > MIN / -abs_b)
48-
*overflow = 1;
49-
}
50-
return result;
24+
return __muloXi4(a, b, overflow);
5125
}

muloti4.c

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,36 +20,12 @@
2020

2121
// Effects: sets *overflow to 1 if a * b overflows
2222

23+
#define fixint_t ti_int
24+
#define fixuint_t tu_int
25+
#include "int_mulo_impl.inc"
26+
2327
COMPILER_RT_ABI ti_int __muloti4(ti_int a, ti_int b, int *overflow) {
24-
const int N = (int)(sizeof(ti_int) * CHAR_BIT);
25-
const ti_int MIN = (ti_int)((tu_int)1 << (N - 1));
26-
const ti_int MAX = ~MIN;
27-
*overflow = 0;
28-
ti_int result = (tu_int)a * b;
29-
if (a == MIN) {
30-
if (b != 0 && b != 1)
31-
*overflow = 1;
32-
return result;
33-
}
34-
if (b == MIN) {
35-
if (a != 0 && a != 1)
36-
*overflow = 1;
37-
return result;
38-
}
39-
ti_int sa = a >> (N - 1);
40-
ti_int abs_a = (a ^ sa) - sa;
41-
ti_int sb = b >> (N - 1);
42-
ti_int abs_b = (b ^ sb) - sb;
43-
if (abs_a < 2 || abs_b < 2)
44-
return result;
45-
if (sa == sb) {
46-
if (abs_a > MAX / abs_b)
47-
*overflow = 1;
48-
} else {
49-
if (abs_a > MIN / -abs_b)
50-
*overflow = 1;
51-
}
52-
return result;
28+
return __muloXi4(a, b, overflow);
5329
}
5430

5531
#endif // CRT_HAS_128BIT

mulvdi3.c

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,38 +12,12 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
#include "int_lib.h"
15+
#define fixint_t di_int
16+
#define fixuint_t du_int
17+
#include "int_mulv_impl.inc"
1618

1719
// Returns: a * b
1820

1921
// Effects: aborts if a * b overflows
2022

21-
COMPILER_RT_ABI di_int __mulvdi3(di_int a, di_int b) {
22-
const int N = (int)(sizeof(di_int) * CHAR_BIT);
23-
const di_int MIN = (di_int)((du_int)1 << (N - 1));
24-
const di_int MAX = ~MIN;
25-
if (a == MIN) {
26-
if (b == 0 || b == 1)
27-
return a * b;
28-
compilerrt_abort();
29-
}
30-
if (b == MIN) {
31-
if (a == 0 || a == 1)
32-
return a * b;
33-
compilerrt_abort();
34-
}
35-
di_int sa = a >> (N - 1);
36-
di_int abs_a = (a ^ sa) - sa;
37-
di_int sb = b >> (N - 1);
38-
di_int abs_b = (b ^ sb) - sb;
39-
if (abs_a < 2 || abs_b < 2)
40-
return a * b;
41-
if (sa == sb) {
42-
if (abs_a > MAX / abs_b)
43-
compilerrt_abort();
44-
} else {
45-
if (abs_a > MIN / -abs_b)
46-
compilerrt_abort();
47-
}
48-
return a * b;
49-
}
23+
COMPILER_RT_ABI di_int __mulvdi3(di_int a, di_int b) { return __mulvXi3(a, b); }

mulvsi3.c

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,38 +12,12 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
#include "int_lib.h"
15+
#define fixint_t si_int
16+
#define fixuint_t su_int
17+
#include "int_mulv_impl.inc"
1618

1719
// Returns: a * b
1820

1921
// Effects: aborts if a * b overflows
2022

21-
COMPILER_RT_ABI si_int __mulvsi3(si_int a, si_int b) {
22-
const int N = (int)(sizeof(si_int) * CHAR_BIT);
23-
const si_int MIN = (si_int)((su_int)1 << (N - 1));
24-
const si_int MAX = ~MIN;
25-
if (a == MIN) {
26-
if (b == 0 || b == 1)
27-
return a * b;
28-
compilerrt_abort();
29-
}
30-
if (b == MIN) {
31-
if (a == 0 || a == 1)
32-
return a * b;
33-
compilerrt_abort();
34-
}
35-
si_int sa = a >> (N - 1);
36-
si_int abs_a = (a ^ sa) - sa;
37-
si_int sb = b >> (N - 1);
38-
si_int abs_b = (b ^ sb) - sb;
39-
if (abs_a < 2 || abs_b < 2)
40-
return a * b;
41-
if (sa == sb) {
42-
if (abs_a > MAX / abs_b)
43-
compilerrt_abort();
44-
} else {
45-
if (abs_a > MIN / -abs_b)
46-
compilerrt_abort();
47-
}
48-
return a * b;
49-
}
23+
COMPILER_RT_ABI si_int __mulvsi3(si_int a, si_int b) { return __mulvXi3(a, b); }

mulvti3.c

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,34 +20,10 @@
2020

2121
// Effects: aborts if a * b overflows
2222

23-
COMPILER_RT_ABI ti_int __mulvti3(ti_int a, ti_int b) {
24-
const int N = (int)(sizeof(ti_int) * CHAR_BIT);
25-
const ti_int MIN = (ti_int)((tu_int)1 << (N - 1));
26-
const ti_int MAX = ~MIN;
27-
if (a == MIN) {
28-
if (b == 0 || b == 1)
29-
return a * b;
30-
compilerrt_abort();
31-
}
32-
if (b == MIN) {
33-
if (a == 0 || a == 1)
34-
return a * b;
35-
compilerrt_abort();
36-
}
37-
ti_int sa = a >> (N - 1);
38-
ti_int abs_a = (a ^ sa) - sa;
39-
ti_int sb = b >> (N - 1);
40-
ti_int abs_b = (b ^ sb) - sb;
41-
if (abs_a < 2 || abs_b < 2)
42-
return a * b;
43-
if (sa == sb) {
44-
if (abs_a > MAX / abs_b)
45-
compilerrt_abort();
46-
} else {
47-
if (abs_a > MIN / -abs_b)
48-
compilerrt_abort();
49-
}
50-
return a * b;
51-
}
23+
#define fixint_t ti_int
24+
#define fixuint_t tu_int
25+
#include "int_mulv_impl.inc"
26+
27+
COMPILER_RT_ABI ti_int __mulvti3(ti_int a, ti_int b) { return __mulvXi3(a, b); }
5228

5329
#endif // CRT_HAS_128BIT

0 commit comments

Comments
 (0)