53b56ca781
Changes to other patches are all just metadata/context changes except for pvebackup_co_prepare() needing to call bdrv_co_unref() rather than bdrv_unref(), because it is a coroutine itself. This is documented in d6ee2e324e ("block-coroutine-wrapper: Introduce no_co_wrapper"). The change is necessary, because one of the stable fixes converts bdrv_unref and blk_unref into no_co_wrappers (in preparation for a second patch to fix a hang with the block resize QMP command). Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
57 lines
2.4 KiB
Diff
57 lines
2.4 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Shivaprasad G Bhat <sbhat@linux.ibm.com>
|
|
Date: Tue, 2 May 2023 20:55:30 +0530
|
|
Subject: [PATCH] softfloat: Fix the incorrect computation in float32_exp2
|
|
|
|
The float32_exp2 function is computing wrong exponent of 2.
|
|
|
|
For example, with the following set of values {0.1, 2.0, 2.0, -1.0},
|
|
the expected output would be {1.071773, 4.000000, 4.000000, 0.500000}.
|
|
Instead, the function is computing {1.119102, 3.382044, 3.382044, -0.191022}
|
|
|
|
Looking at the code, the float32_exp2() attempts to do this
|
|
|
|
2 3 4 5 n
|
|
x x x x x x x
|
|
e = 1 + --- + --- + --- + --- + --- + ... + --- + ...
|
|
1! 2! 3! 4! 5! n!
|
|
|
|
But because of the typo it ends up doing
|
|
|
|
x x x x x x x
|
|
e = 1 + --- + --- + --- + --- + --- + ... + --- + ...
|
|
1! 2! 3! 4! 5! n!
|
|
|
|
This is because instead of the xnp which holds the numerator, parts_muladd
|
|
is using the xp which is just 'x'. Commit '572c4d862ff2' refactored this
|
|
function, and mistakenly used xp instead of xnp.
|
|
|
|
Cc: qemu-stable@nongnu.org
|
|
Fixes: 572c4d862ff2 "softfloat: Convert float32_exp2 to FloatParts"
|
|
Partially-Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1623
|
|
Reported-By: Luca Barbato (https://gitlab.com/lu-zero)
|
|
Signed-off-by: Shivaprasad G Bhat <sbhat@linux.ibm.com>
|
|
Signed-off-by: Vaibhav Jain <vaibhav@linux.ibm.com>
|
|
Message-Id: <168304110865.537992.13059030916325018670.stgit@localhost.localdomain>
|
|
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
|
|
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
|
|
(cherry-picked from commit 1098cc3fcf952763fc9fd72c1c8fda30a18cc8ea)
|
|
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|
---
|
|
fpu/softfloat.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
|
|
index c7454c3eb1..108f9cb224 100644
|
|
--- a/fpu/softfloat.c
|
|
+++ b/fpu/softfloat.c
|
|
@@ -5135,7 +5135,7 @@ float32 float32_exp2(float32 a, float_status *status)
|
|
float64_unpack_canonical(&rp, float64_one, status);
|
|
for (i = 0 ; i < 15 ; i++) {
|
|
float64_unpack_canonical(&tp, float32_exp2_coefficients[i], status);
|
|
- rp = *parts_muladd(&tp, &xp, &rp, 0, status);
|
|
+ rp = *parts_muladd(&tp, &xnp, &rp, 0, status);
|
|
xnp = *parts_mul(&xnp, &xp, status);
|
|
}
|
|
|