File tree Expand file tree Collapse file tree 4 files changed +59
-89
lines changed Expand file tree Collapse file tree 4 files changed +59
-89
lines changed Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change 10
10
//
11
11
//===----------------------------------------------------------------------===//
12
12
13
- #include "int_lib.h"
13
+ #define fixint_t di_int
14
+ #include "int_mulo_impl.inc"
14
15
15
16
// Returns: a * b
16
17
17
18
// Effects: sets *overflow to 1 if a * b overflows
18
19
19
20
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 );
49
22
}
Original file line number Diff line number Diff line change 10
10
//
11
11
//===----------------------------------------------------------------------===//
12
12
13
- #include "int_lib.h"
13
+ #define fixint_t si_int
14
+ #include "int_mulo_impl.inc"
14
15
15
16
// Returns: a * b
16
17
17
18
// Effects: sets *overflow to 1 if a * b overflows
18
19
19
20
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 );
49
22
}
Original file line number Diff line number Diff line change 18
18
19
19
// Effects: sets *overflow to 1 if a * b overflows
20
20
21
+ #define fixint_t ti_int
22
+ #include "int_mulo_impl.inc"
23
+
21
24
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 );
51
26
}
52
27
53
28
#endif // CRT_HAS_128BIT
You can’t perform that action at this time.
0 commit comments