1 /*===-- muloti4.c - Implement __muloti4 -----------------------------------===
3 * The LLVM Compiler Infrastructure
5 * This file is dual licensed under the MIT and the University of Illinois Open
6 * Source Licenses. See LICENSE.TXT for details.
8 * ===----------------------------------------------------------------------===
10 * This file implements __muloti4 for the compiler_rt library.
12 * ===----------------------------------------------------------------------===
21 /* Effects: sets *overflow to 1 if a * b overflows */
23 COMPILER_RT_ABI ti_int
24 __muloti4(ti_int a
, ti_int b
, int* overflow
)
26 const int N
= (int)(sizeof(ti_int
) * CHAR_BIT
);
27 const ti_int MIN
= (ti_int
)1 << (N
-1);
28 const ti_int MAX
= ~MIN
;
30 ti_int result
= a
* b
;
43 ti_int sa
= a
>> (N
- 1);
44 ti_int abs_a
= (a
^ sa
) - sa
;
45 ti_int sb
= b
>> (N
- 1);
46 ti_int abs_b
= (b
^ sb
) - sb
;
47 if (abs_a
< 2 || abs_b
< 2)
51 if (abs_a
> MAX
/ abs_b
)
56 if (abs_a
> MIN
/ -abs_b
)
62 #endif /* CRT_HAS_128BIT */