diff options
author | David Hildenbrand <david@redhat.com> | 2019-02-06 11:53:39 +0100 |
---|---|---|
committer | Alex Bennée <alex.bennee@linaro.org> | 2019-02-26 14:05:19 +0000 |
commit | e45de9922e43c1ce4f4739b62142314a13029d5c (patch) | |
tree | b80e040a5e1f111f20398b3ac929b118d221b595 /fpu | |
parent | 47393181604d507f4fe2a15a65b1eede0f974d6a (diff) | |
download | qemu-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.c | 29 |
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 |