aboutsummaryrefslogtreecommitdiff
path: root/fpu
diff options
context:
space:
mode:
authorDavid Hildenbrand <david@redhat.com>2019-02-06 11:53:39 +0100
committerAlex Bennée <alex.bennee@linaro.org>2019-02-26 14:05:19 +0000
commite45de9922e43c1ce4f4739b62142314a13029d5c (patch)
treeb80e040a5e1f111f20398b3ac929b118d221b595 /fpu
parent47393181604d507f4fe2a15a65b1eede0f974d6a (diff)
downloadqemu-e45de9922e43c1ce4f4739b62142314a13029d5c.zip
qemu-e45de9922e43c1ce4f4739b62142314a13029d5c.tar.gz
qemu-e45de9922e43c1ce4f4739b62142314a13029d5c.tar.bz2
softfloat: Implement float128_to_uint32
Handling it just like float128_to_uint32_round_to_zero, that hopefully is free of bugs :) Documentation basically copied from float128_to_uint64 Signed-off-by: David Hildenbrand <david@redhat.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Diffstat (limited to 'fpu')
-rw-r--r--fpu/softfloat.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
index 9132d7a..c69cd6b 100644
--- a/fpu/softfloat.c
+++ b/fpu/softfloat.c
@@ -6793,6 +6793,35 @@ uint32_t float128_to_uint32_round_to_zero(float128 a, float_status *status)
}
/*----------------------------------------------------------------------------
+| Returns the result of converting the quadruple-precision floating-point value
+| `a' to the 32-bit unsigned integer format. The conversion is
+| performed according to the IEC/IEEE Standard for Binary Floating-Point
+| Arithmetic---which means in particular that the conversion is rounded
+| according to the current rounding mode. If `a' is a NaN, the largest
+| positive integer is returned. If the conversion overflows, the
+| largest unsigned integer is returned. If 'a' is negative, the value is
+| rounded and zero is returned; negative values that do not round to zero
+| will raise the inexact exception.
+*----------------------------------------------------------------------------*/
+
+uint32_t float128_to_uint32(float128 a, float_status *status)
+{
+ uint64_t v;
+ uint32_t res;
+ int old_exc_flags = get_float_exception_flags(status);
+
+ v = float128_to_uint64(a, status);
+ if (v > 0xffffffff) {
+ res = 0xffffffff;
+ } else {
+ return v;
+ }
+ set_float_exception_flags(old_exc_flags, status);
+ float_raise(float_flag_invalid, status);
+ return res;
+}
+
+/*----------------------------------------------------------------------------
| Returns the result of converting the quadruple-precision floating-point
| value `a' to the single-precision floating-point format. The conversion
| is performed according to the IEC/IEEE Standard for Binary Floating-Point