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 1212//
1313//===----------------------------------------------------------------------===//
1414
15- #include "int_lib.h"
15+ #define fixint_t di_int
16+ #define fixuint_t du_int
17+ #include "int_mulo_impl.inc"
1618
1719// Returns: a * b
1820
1921// Effects: sets *overflow to 1 if a * b overflows
2022
2123COMPILER_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 );
5125}
Original file line number Diff line number Diff line change 1212//
1313//===----------------------------------------------------------------------===//
1414
15- #include "int_lib.h"
15+ #define fixint_t si_int
16+ #define fixuint_t su_int
17+ #include "int_mulo_impl.inc"
1618
1719// Returns: a * b
1820
1921// Effects: sets *overflow to 1 if a * b overflows
2022
2123COMPILER_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 );
5125}
Original file line number Diff line number Diff line change 2020
2121// Effects: sets *overflow to 1 if a * b overflows
2222
23+ #define fixint_t ti_int
24+ #define fixuint_t tu_int
25+ #include "int_mulo_impl.inc"
26+
2327COMPILER_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 );
5329}
5430
5531#endif // CRT_HAS_128BIT
Original file line number Diff line number Diff line change 1212//
1313//===----------------------------------------------------------------------===//
1414
15- #include "int_lib.h"
15+ #define fixint_t di_int
16+ #define fixuint_t du_int
17+ #include "int_mulv_impl.inc"
1618
1719// Returns: a * b
1820
1921// Effects: aborts if a * b overflows
2022
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 1212//
1313//===----------------------------------------------------------------------===//
1414
15- #include "int_lib.h"
15+ #define fixint_t si_int
16+ #define fixuint_t su_int
17+ #include "int_mulv_impl.inc"
1618
1719// Returns: a * b
1820
1921// Effects: aborts if a * b overflows
2022
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 2020
2121// Effects: aborts if a * b overflows
2222
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 ); }
5228
5329#endif // CRT_HAS_128BIT
You can’t perform that action at this time.
0 commit comments