1 /* ===-- mulvsi3.c - Implement __mulvsi3 -----------------------------------===
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 __mulvsi3 for the compiler_rt library.
12 * ===----------------------------------------------------------------------===
19 /* Effects: aborts if a * b overflows */
21 COMPILER_RT_ABI si_int
22 __mulvsi3(si_int a
, si_int b
)
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
;
39 si_int sa
= a
>> (N
- 1);
40 si_int abs_a
= (a
^ sa
) - sa
;
41 si_int sb
= b
>> (N
- 1);
42 si_int abs_b
= (b
^ sb
) - sb
;
43 if (abs_a
< 2 || abs_b
< 2)
47 if (abs_a
> MAX
/ abs_b
)
52 if (abs_a
> MIN
/ -abs_b
)