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