negvsi2.c revision 2d1fdb26e458c4ddc04155c1d421bced3ba90cd0
1323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)/* ===-- negvsi2.c - Implement __negvsi2 -----------------------------------===
2323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) *
3323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) *                     The LLVM Compiler Infrastructure
4323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) *
5323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * This file is dual licensed under the MIT and the University of Illinois Open
6323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * Source Licenses. See LICENSE.TXT for details.
7323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) *
8323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * ===----------------------------------------------------------------------===
9323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) *
10323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * This file implements __negvsi2 for the compiler_rt library.
11323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) *
12323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * ===----------------------------------------------------------------------===
13323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) */
14323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
15323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#include "int_lib.h"
16323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
17323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)/* Returns: -a */
18323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
19323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)/* Effects: aborts if -a overflows */
20323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
21323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)COMPILER_RT_ABI si_int
22323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)__negvsi2(si_int a)
23323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
24323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    const si_int MIN = (si_int)1 << ((int)(sizeof(si_int) * CHAR_BIT)-1);
25323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (a == MIN)
26323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        compilerrt_abort();
27323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    return -a;
28323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
29323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)