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