1 /*===-- mulosi4.c - Implement __mulosi4 -----------------------------------===
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 __mulosi4 for the compiler_rt library.
12 * ===----------------------------------------------------------------------===
19 /* Effects: sets *overflow to 1 if a * b overflows */
22 __mulosi4(si_int a
, si_int b
, int* overflow
)
24 const int N
= (int)(sizeof(si_int
) * CHAR_BIT
);
25 const si_int MIN
= (si_int
)1 << (N
-1);
26 const si_int MAX
= ~MIN
;
28 si_int result
= a
* b
;
41 si_int sa
= a
>> (N
- 1);
42 si_int abs_a
= (a
^ sa
) - sa
;
43 si_int sb
= b
>> (N
- 1);
44 si_int abs_b
= (b
^ sb
) - sb
;
45 if (abs_a
< 2 || abs_b
< 2)
49 if (abs_a
> MAX
/ abs_b
)
54 if (abs_a
> MIN
/ -abs_b
)