| Daniel Dunbar | b3a6901 | 2009-06-26 16:47:03 +0000 | [diff] [blame^] | 1 | //===-- fixunsdfdi.c - Implement __fixunsdfdi -----------------------------===// | 
|  | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
|  | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
|  | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
|  | 9 | // | 
|  | 10 | // This file implements __fixunsdfdi for the compiler_rt library. | 
|  | 11 | // | 
|  | 12 | //===----------------------------------------------------------------------===// | 
|  | 13 |  | 
|  | 14 | #include "int_lib.h" | 
|  | 15 |  | 
|  | 16 | // Returns: convert a to a unsigned long long, rounding toward zero. | 
|  | 17 | //          Negative values all become zero. | 
|  | 18 |  | 
|  | 19 | // Assumption: double is a IEEE 64 bit floating point type | 
|  | 20 | //             du_int is a 64 bit integral type | 
|  | 21 | //             value in double is representable in du_int or is negative | 
|  | 22 | //                 (no range checking performed) | 
|  | 23 |  | 
|  | 24 | // seee eeee eeee mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | 
|  | 25 |  | 
|  | 26 | du_int | 
|  | 27 | __fixunsdfdi(double a) | 
|  | 28 | { | 
|  | 29 | double_bits fb; | 
|  | 30 | fb.f = a; | 
|  | 31 | int e = ((fb.u.high & 0x7FF00000) >> 20) - 1023; | 
|  | 32 | if (e < 0 || (fb.u.high & 0x80000000)) | 
|  | 33 | return 0; | 
|  | 34 | udwords r; | 
|  | 35 | r.high = (fb.u.high & 0x000FFFFF) | 0x00100000; | 
|  | 36 | r.low = fb.u.low; | 
|  | 37 | if (e > 52) | 
|  | 38 | r.all <<= (e - 52); | 
|  | 39 | else | 
|  | 40 | r.all >>= (52 - e); | 
|  | 41 | return r.all; | 
|  | 42 | } |