This repository was archived by the owner on Sep 2, 2025. It is now read-only.
File tree Expand file tree Collapse file tree 8 files changed +122
-178
lines changed Expand file tree Collapse file tree 8 files changed +122
-178
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 )((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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change 12
12
//
13
13
//===----------------------------------------------------------------------===//
14
14
15
- #include "int_lib.h"
15
+ #define fixint_t di_int
16
+ #define fixuint_t du_int
17
+ #include "int_mulo_impl.inc"
16
18
17
19
// Returns: a * b
18
20
19
21
// Effects: sets *overflow to 1 if a * b overflows
20
22
21
23
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 );
51
25
}
Original file line number Diff line number Diff line change 12
12
//
13
13
//===----------------------------------------------------------------------===//
14
14
15
- #include "int_lib.h"
15
+ #define fixint_t si_int
16
+ #define fixuint_t su_int
17
+ #include "int_mulo_impl.inc"
16
18
17
19
// Returns: a * b
18
20
19
21
// Effects: sets *overflow to 1 if a * b overflows
20
22
21
23
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 );
51
25
}
Original file line number Diff line number Diff line change 20
20
21
21
// Effects: sets *overflow to 1 if a * b overflows
22
22
23
+ #define fixint_t ti_int
24
+ #define fixuint_t tu_int
25
+ #include "int_mulo_impl.inc"
26
+
23
27
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 );
53
29
}
54
30
55
31
#endif // CRT_HAS_128BIT
Original file line number Diff line number Diff line change 12
12
//
13
13
//===----------------------------------------------------------------------===//
14
14
15
- #include "int_lib.h"
15
+ #define fixint_t di_int
16
+ #define fixuint_t du_int
17
+ #include "int_mulv_impl.inc"
16
18
17
19
// Returns: a * b
18
20
19
21
// Effects: aborts if a * b overflows
20
22
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 ); }
Original file line number Diff line number Diff line change 12
12
//
13
13
//===----------------------------------------------------------------------===//
14
14
15
- #include "int_lib.h"
15
+ #define fixint_t si_int
16
+ #define fixuint_t su_int
17
+ #include "int_mulv_impl.inc"
16
18
17
19
// Returns: a * b
18
20
19
21
// Effects: aborts if a * b overflows
20
22
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 ); }
Original file line number Diff line number Diff line change 20
20
21
21
// Effects: aborts if a * b overflows
22
22
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 ); }
52
28
53
29
#endif // CRT_HAS_128BIT
You can’t perform that action at this time.
0 commit comments