Skip to content

Commit 182d14d

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

File tree

4 files changed

+57
-89
lines changed

4 files changed

+57
-89
lines changed
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)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+
}

compiler-rt/lib/builtins/mulvdi3.c

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

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

1516
// Returns: a * b
1617

1718
// Effects: aborts if a * b overflows
1819

19-
COMPILER_RT_ABI di_int __mulvdi3(di_int a, di_int b) {
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-
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-
di_int sa = a >> (N - 1);
34-
di_int abs_a = (a ^ sa) - sa;
35-
di_int sb = b >> (N - 1);
36-
di_int 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-
}
20+
COMPILER_RT_ABI di_int __mulvdi3(di_int a, di_int b) { return __mulvXi3(a, b); }

compiler-rt/lib/builtins/mulvsi3.c

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

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

1516
// Returns: a * b
1617

1718
// Effects: aborts if a * b overflows
1819

19-
COMPILER_RT_ABI si_int __mulvsi3(si_int a, si_int b) {
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-
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-
si_int sa = a >> (N - 1);
34-
si_int abs_a = (a ^ sa) - sa;
35-
si_int sb = b >> (N - 1);
36-
si_int 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-
}
20+
COMPILER_RT_ABI si_int __mulvsi3(si_int a, si_int b) { return __mulvXi3(a, b); }

compiler-rt/lib/builtins/mulvti3.c

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

1919
// Effects: aborts if a * b overflows
2020

21-
COMPILER_RT_ABI ti_int __mulvti3(ti_int a, ti_int b) {
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-
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-
ti_int sa = a >> (N - 1);
36-
ti_int abs_a = (a ^ sa) - sa;
37-
ti_int sb = b >> (N - 1);
38-
ti_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-
}
21+
#define fixint_t ti_int
22+
#include "int_mulv_impl.inc"
23+
24+
COMPILER_RT_ABI ti_int __mulvti3(ti_int a, ti_int b) { return __mulvXi3(a, b); }
5025

5126
#endif // CRT_HAS_128BIT

0 commit comments

Comments
 (0)