| 1 |  |  | /* ===-- subvdi3.c - Implement __subvdi3 -----------------------------------=== | 
    
    | 2 |  |  |  * | 
    
    | 3 |  |  |  *                The LLVM Compiler Infrastructure | 
    
    | 4 |  |  |  * | 
    
    | 5 |  |  |  * This file is dual licensed under the MIT and the University of Illinois Open | 
    
    | 6 |  |  |  * Source Licenses. See LICENSE.TXT for details. | 
    
    | 7 |  |  |  * | 
    
    | 8 |  |  |  * ===----------------------------------------------------------------------=== | 
    
    | 9 |  |  |  * | 
    
    | 10 |  |  |  * This file implements __subvdi3 for the compiler_rt library. | 
    
    | 11 |  |  |  * | 
    
    | 12 |  |  |  * ===----------------------------------------------------------------------=== | 
    
    | 13 |  |  |  */ | 
    
    | 14 |  |  |  | 
    
    | 15 |  |  | #include "int_lib.h" | 
    
    | 16 |  |  |  | 
    
    | 17 |  |  | /* Returns: a - b */ | 
    
    | 18 |  |  |  | 
    
    | 19 |  |  | /* Effects: aborts if a - b overflows */ | 
    
    | 20 |  |  |  | 
    
    | 21 |  |  | COMPILER_RT_ABI di_int | 
    
    | 22 |  |  | __subvdi3(di_int a, di_int b) | 
    
    | 23 |  |  | { | 
    
    | 24 |  |  |     di_int s = (du_int) a - (du_int) b; | 
    
    | 25 |  |  |     if (b >= 0) | 
    
    | 26 |  |  |     { | 
    
    | 27 |  |  |         if (s > a) | 
    
    | 28 |  |  |             compilerrt_abort(); | 
    
    | 29 |  |  |     } | 
    
    | 30 |  |  |     else | 
    
    | 31 |  |  |     { | 
    
    | 32 |  |  |         if (s <= a) | 
    
    | 33 |  |  |             compilerrt_abort(); | 
    
    | 34 |  |  |     } | 
    
    | 35 |  |  |     return s; | 
    
    | 36 |  |  | } |