Skip to content

Commit fce035e

Browse files
committed
[NFC][compiler-rt] Factor out __mulo[sdt]i4 implementations to .inc file
The existing implementations are almost identical except for width of the integer type. Factor them out to int_mulo_impl.inc for better maintainability. This patch is almost identical to D86277. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D86289
1 parent 182d14d commit fce035e

File tree

4 files changed

+59
-89
lines changed

4 files changed

+59
-89
lines changed
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)1 << (N - 1);
22+
const fixint_t MAX = ~MIN;
23+
*overflow = 0;
24+
fixint_t result = 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+
}

compiler-rt/lib/builtins/mulodi4.c

Lines changed: 3 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -10,40 +10,13 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13-
#include "int_lib.h"
13+
#define fixint_t di_int
14+
#include "int_mulo_impl.inc"
1415

1516
// Returns: a * b
1617

1718
// Effects: sets *overflow to 1 if a * b overflows
1819

1920
COMPILER_RT_ABI di_int __mulodi4(di_int a, di_int b, int *overflow) {
20-
const int N = (int)(sizeof(di_int) * CHAR_BIT);
21-
const di_int MIN = (di_int)1 << (N - 1);
22-
const di_int MAX = ~MIN;
23-
*overflow = 0;
24-
di_int result = 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-
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 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;
21+
return __muloXi4(a, b, overflow);
4922
}

compiler-rt/lib/builtins/mulosi4.c

Lines changed: 3 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -10,40 +10,13 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13-
#include "int_lib.h"
13+
#define fixint_t si_int
14+
#include "int_mulo_impl.inc"
1415

1516
// Returns: a * b
1617

1718
// Effects: sets *overflow to 1 if a * b overflows
1819

1920
COMPILER_RT_ABI si_int __mulosi4(si_int a, si_int b, int *overflow) {
20-
const int N = (int)(sizeof(si_int) * CHAR_BIT);
21-
const si_int MIN = (si_int)1 << (N - 1);
22-
const si_int MAX = ~MIN;
23-
*overflow = 0;
24-
si_int result = 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-
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 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;
21+
return __muloXi4(a, b, overflow);
4922
}

compiler-rt/lib/builtins/muloti4.c

Lines changed: 4 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -18,36 +18,11 @@
1818

1919
// Effects: sets *overflow to 1 if a * b overflows
2020

21+
#define fixint_t ti_int
22+
#include "int_mulo_impl.inc"
23+
2124
COMPILER_RT_ABI ti_int __muloti4(ti_int a, ti_int b, int *overflow) {
22-
const int N = (int)(sizeof(ti_int) * CHAR_BIT);
23-
const ti_int MIN = (ti_int)1 << (N - 1);
24-
const ti_int MAX = ~MIN;
25-
*overflow = 0;
26-
ti_int result = 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-
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 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;
25+
return __muloXi4(a, b, overflow);
5126
}
5227

5328
#endif // CRT_HAS_128BIT

0 commit comments

Comments
 (0)