mirror of https://github.com/acidanthera/audk.git
75 lines
2.7 KiB
C
75 lines
2.7 KiB
C
/**
|
|
University of Illinois/NCSA
|
|
Open Source License
|
|
|
|
Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT
|
|
|
|
All rights reserved.
|
|
|
|
Developed by:
|
|
|
|
LLVM Team
|
|
|
|
University of Illinois at Urbana-Champaign
|
|
|
|
http://llvm.org
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
this software and associated documentation files (the "Software"), to deal with
|
|
the Software without restriction, including without limitation the rights to
|
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
of the Software, and to permit persons to whom the Software is furnished to do
|
|
so, subject to the following conditions:
|
|
|
|
* Redistributions of source code must retain the above copyright notice,
|
|
this list of conditions and the following disclaimers.
|
|
|
|
* Redistributions in binary form must reproduce the above copyright notice,
|
|
this list of conditions and the following disclaimers in the
|
|
documentation and/or other materials provided with the distribution.
|
|
|
|
* Neither the names of the LLVM Team, University of Illinois at
|
|
Urbana-Champaign, nor the names of its contributors may be used to
|
|
endorse or promote products derived from this Software without specific
|
|
prior written permission.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
|
|
SOFTWARE.
|
|
**/
|
|
|
|
#include "int_lib.h"
|
|
|
|
/* Returns: convert a to a unsigned int, rounding toward zero.
|
|
* Negative values all become zero.
|
|
*/
|
|
|
|
/* Assumption: double is a IEEE 64 bit floating point type
|
|
* su_int is a 32 bit integral type
|
|
* value in double is representable in su_int or is negative
|
|
* (no range checking performed)
|
|
*/
|
|
|
|
/* seee eeee eeee mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm */
|
|
|
|
ARM_EABI_FNALIAS(d2uiz, fixunsdfsi)
|
|
|
|
COMPILER_RT_ABI su_int
|
|
__fixunsdfsi(double a)
|
|
{
|
|
double_bits fb;
|
|
fb.f = a;
|
|
int e = ((fb.u.s.high & 0x7FF00000) >> 20) - 1023;
|
|
if (e < 0 || (fb.u.s.high & 0x80000000))
|
|
return 0;
|
|
return (
|
|
0x80000000u |
|
|
((fb.u.s.high & 0x000FFFFF) << 11) |
|
|
(fb.u.s.low >> 21)
|
|
) >> (31 - e);
|
|
}
|