File tree Expand file tree Collapse file tree 4 files changed +57
-89
lines changed Expand file tree Collapse file tree 4 files changed +57
-89
lines changed 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 )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 10
10
//
11
11
//===----------------------------------------------------------------------===//
12
12
13
- #include "int_lib.h"
13
+ #define fixint_t di_int
14
+ #include "int_mulv_impl.inc"
14
15
15
16
// Returns: a * b
16
17
17
18
// Effects: aborts if a * b overflows
18
19
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 ); }
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_mulv_impl.inc"
14
15
15
16
// Returns: a * b
16
17
17
18
// Effects: aborts if a * b overflows
18
19
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 ); }
Original file line number Diff line number Diff line change 18
18
19
19
// Effects: aborts if a * b overflows
20
20
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 ); }
50
25
51
26
#endif // CRT_HAS_128BIT
You can’t perform that action at this time.
0 commit comments