[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 03/13] fpu: optimise float[16/32/64]_squash_denor
From: |
Alex Bennée |
Subject: |
[Qemu-devel] [PATCH v3 03/13] fpu: optimise float[16/32/64]_squash_denormal (HACK?) |
Date: |
Tue, 13 Aug 2019 13:49:36 +0100 |
Using the floatXX_pack_raw functions is slight overkill for basically
just masking out all but the top bit of the number. This makes the
final code exactly the same as pre-conversion.
TODO: is this worth it, can the compiler do better with make_float?
Signed-off-by: Alex Bennée <address@hidden>
---
fpu/softfloat.c | 22 ++++++++++++----------
1 file changed, 12 insertions(+), 10 deletions(-)
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
index 0a434555cd8..9e57b7b5933 100644
--- a/fpu/softfloat.c
+++ b/fpu/softfloat.c
@@ -3294,23 +3294,23 @@ float64 float64_silence_nan(float64 a, float_status
*status)
| input-denormal exception and return zero. Otherwise just return the value.
*----------------------------------------------------------------------------*/
-static FloatParts parts_squash_denormal(FloatParts p, float_status *status)
+static bool parts_squash_denormal(FloatParts p, float_status *status)
{
if (p.exp == 0 && p.frac != 0) {
float_raise(float_flag_input_denormal, status);
- p.frac = 0;
- p.cls = float_class_zero;
+ return true;
}
- return p;
+ return false;
}
float16 float16_squash_input_denormal(float16 a, float_status *status)
{
if (status->flush_inputs_to_zero) {
FloatParts p = float16_unpack_raw(a);
- p = parts_squash_denormal(p, status);
- return float16_pack_raw(p);
+ if (parts_squash_denormal(p, status)) {
+ a = make_float16(float16_val(a) & 0x8000);
+ }
}
return a;
}
@@ -3319,8 +3319,9 @@ float32 float32_squash_input_denormal(float32 a,
float_status *status)
{
if (status->flush_inputs_to_zero) {
FloatParts p = float32_unpack_raw(a);
- p = parts_squash_denormal(p, status);
- return float32_pack_raw(p);
+ if (parts_squash_denormal(p, status)) {
+ a = make_float32(float32_val(a) & 0x80000000);
+ }
}
return a;
}
@@ -3329,8 +3330,9 @@ float64 float64_squash_input_denormal(float64 a,
float_status *status)
{
if (status->flush_inputs_to_zero) {
FloatParts p = float64_unpack_raw(a);
- p = parts_squash_denormal(p, status);
- return float64_pack_raw(p);
+ if (parts_squash_denormal(p, status)) {
+ a = make_float64(float64_val(a) & (1ULL << 63));
+ }
}
return a;
}
--
2.20.1
- [Qemu-devel] [PATCH v3 00/13] softfloat updates (include tweaks, rm LIT64), Alex Bennée, 2019/08/13
- [Qemu-devel] [PATCH v3 01/13] fpu: replace LIT64 usage with UINT64_C for specialize constants, Alex Bennée, 2019/08/13
- [Qemu-devel] [PATCH v3 02/13] fpu: convert float[16/32/64]_squash_denormal to new modern style, Alex Bennée, 2019/08/13
- [Qemu-devel] [PATCH v3 04/13] fpu: use min/max values from stdint.h for integral overflow, Alex Bennée, 2019/08/13
- [Qemu-devel] [PATCH v3 03/13] fpu: optimise float[16/32/64]_squash_denormal (HACK?),
Alex Bennée <=
- [Qemu-devel] [PATCH v3 07/13] fpu: remove the LIT64 macro, Alex Bennée, 2019/08/13
- [Qemu-devel] [PATCH v3 05/13] fpu: replace LIT64 with UINT64_C macros, Alex Bennée, 2019/08/13
- [Qemu-devel] [PATCH v3 06/13] target/m68k: replace LIT64 with UINT64_C macros, Alex Bennée, 2019/08/13
- [Qemu-devel] [PATCH v3 09/13] fpu: make softfloat-macros "self-contained", Alex Bennée, 2019/08/13
- [Qemu-devel] [PATCH v3 10/13] fpu: rename softfloat-specialize.h -> .inc.c, Alex Bennée, 2019/08/13
- [Qemu-devel] [PATCH v3 08/13] fpu: move inline helpers into a separate header, Alex Bennée, 2019/08/13