these are needed for converting between unsigned int and single-precision
float

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Michael Zimmermann <[email protected]>
---
 StdLib/LibC/LibC.inf               |  2 +
 StdLib/LibC/Main/Arm/fixunssfsi.c  | 75
++++++++++++++++++++++++++++++++++++
 StdLib/LibC/Main/Arm/floatunsisf.c | 79
++++++++++++++++++++++++++++++++++++++
 3 files changed, 156 insertions(+)
 create mode 100644 StdLib/LibC/Main/Arm/fixunssfsi.c
 create mode 100644 StdLib/LibC/Main/Arm/floatunsisf.c

diff --git a/StdLib/LibC/LibC.inf b/StdLib/LibC/LibC.inf
index f136306..7b53f1f 100644
--- a/StdLib/LibC/LibC.inf
+++ b/StdLib/LibC/LibC.inf
@@ -86,7 +86,9 @@

 [Sources.ARM]
   Main/Arm/fixunsdfsi.c
+  Main/Arm/fixunssfsi.c
   Main/Arm/floatunsidf.c
+  Main/Arm/floatunsisf.c
   Main/Arm/flt_rounds.c

 [Sources.AARCH64]
diff --git a/StdLib/LibC/Main/Arm/fixunssfsi.c
b/StdLib/LibC/Main/Arm/fixunssfsi.c
new file mode 100644
index 0000000..251d720
--- /dev/null
+++ b/StdLib/LibC/Main/Arm/fixunssfsi.c
@@ -0,0 +1,75 @@
+/**
+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: float is a IEEE 32 bit floating point type
+ *             su_int is a 32 bit integral type
+ *             value in float is representable in su_int or is negative
+ *                 (no range checking performed)
+ */
+
+/* seee eeee emmm mmmm mmmm mmmm mmmm mmmm */
+
+ARM_EABI_FNALIAS(f2uiz, fixunssfsi)
+
+COMPILER_RT_ABI su_int
+__fixunssfsi(float a)
+{
+    float_bits fb;
+    fb.f = a;
+    int e = ((fb.u & 0x7F800000) >> 23) - 127;
+    if (e < 0 || (fb.u & 0x80000000))
+        return 0;
+    su_int r = (fb.u & 0x007FFFFF) | 0x00800000;
+    if (e > 23)
+        r <<= (e - 23);
+    else
+        r >>= (23 - e);
+    return r;
+}
diff --git a/StdLib/LibC/Main/Arm/floatunsisf.c
b/StdLib/LibC/Main/Arm/floatunsisf.c
new file mode 100644
index 0000000..1c9ee4e
--- /dev/null
+++ b/StdLib/LibC/Main/Arm/floatunsisf.c
@@ -0,0 +1,79 @@
+/**
+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.
+**/
+
+#define SINGLE_PRECISION
+#include "fp_lib.h"
+
+#include "int_lib.h"
+
+ARM_EABI_FNALIAS(ui2f, floatunsisf)
+
+COMPILER_RT_ABI fp_t
+__floatunsisf(unsigned int a) {
+
+    const int aWidth = sizeof a * CHAR_BIT;
+
+    // Handle zero as a special case to protect clz
+    if (a == 0) return fromRep(0);
+
+    // Exponent of (fp_t)a is the width of abs(a).
+    const int exponent = (aWidth - 1) - __builtin_clz(a);
+    rep_t result;
+
+    // Shift a into the significand field, rounding if it is a right-shift
+    if (exponent <= significandBits) {
+        const int shift = significandBits - exponent;
+        result = (rep_t)a << shift ^ implicitBit;
+    } else {
+        const int shift = exponent - significandBits;
+        result = (rep_t)a >> shift ^ implicitBit;
+        rep_t round = (rep_t)a << (typeWidth - shift);
+        if (round > signBit) result++;
+        if (round == signBit) result += result & 1;
+    }
+
+    // Insert the exponent
+    result += (rep_t)(exponent + exponentBias) << significandBits;
+    return fromRep(result);
+}
-- 
2.6.4
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to