[PATCH] math-emu: fix wrong word index in _FP_FRAC_CLZ_4
From: Imre Kaloz
Date: Sat Sep 26 2026 - 20:57:46 EST
_FP_FRAC_CLZ_4 picks a word by testing X##_f[3], X##_f[2] and X##_f[1]
in turn and counts the leading zeros of the first non-zero one. The
X##_f[1] branch passes X##_f[2] to __FP_CLZ, a word already known to be
zero, so the result is 3 * _FP_W_TYPE_SIZE - 1 whatever X##_f[1] holds.
Normalizing a quad then shifts by up to a word too much whenever the
leading set bit falls in word 1. sparc traps every quad operation to
do_mathemu(), so hex floats parsed by strtod() and scanf() in ordinary
user code come back wrong.
With this, the affected float-parse tests pass on a SPARCstation 20.
The wrong index has been there since 2.1.97.
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Imre Kaloz <kaloz@xxxxxxxxxx>
---
Notes:
- _FP_FRAC_CLZ_4 is the generic 4-word helper in include/math-emu/op-4.h,
which is why LKML is on Cc.
- The checkpatch error "space required after that ','" is the
surrounding soft-fp idiom: every neighbouring line in op-4.h is
written __FP_CLZ(R,X##_f[N]).
- No Fixes: tag: this has been broken since 2.1.97, before the git
history. checkpatch asks for one to go with the stable@ Cc, but
there is no commit to name.
include/math-emu/op-4.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/math-emu/op-4.h b/include/math-emu/op-4.h
index ba226f8237a6..429c8f5cbf8a 100644
--- a/include/math-emu/op-4.h
+++ b/include/math-emu/op-4.h
@@ -170,7 +170,7 @@
} \
else if (X##_f[1]) \
{ \
- __FP_CLZ(R,X##_f[2]); \
+ __FP_CLZ(R,X##_f[1]); \
R += _FP_W_TYPE_SIZE*2; \
} \
else \
base-commit: 62f4c998b297cf233997a2b4cd6fc2d2df0319c9
--
2.47.3