From: Max Chou <max.chou@sifive.com>
ARM Alt HP raises different exceptions on overflow than is
standard for IEEE when saturating a value. Add a flag to
control this effect.
Signed-off-by: Max Chou <max.chou@sifive.com>
[rth: Split out of a larger patch]
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
fpu/softfloat.c | 6 +++++-
fpu/softfloat-parts.c.inc | 4 +++-
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
index 18098c4cdd..209eb59b48 100644
--- a/fpu/softfloat.c
+++ b/fpu/softfloat.c
@@ -542,7 +542,9 @@ typedef enum __attribute__((__packed__)) {
* The following optional modifiers are available:
* exp_max_kind: affects how exp == exp_max is interpreted
* has_explicit_bit: has an explicit integer bit; this affects whether
- * the float_status floatx80_behaviour handling applies
+ * the float_status floatx80_behaviour handling applies
+ * overflow_raises_invalid: for float_expmax_normal, raise invalid
+ * instead of overflow.
*/
typedef struct {
int exp_size;
@@ -553,6 +555,7 @@ typedef struct {
int frac_shift;
FloatFmtExpMaxKind exp_max_kind;
bool has_explicit_bit;
+ bool overflow_raises_invalid;
uint64_t round_mask;
} FloatFmt;
@@ -576,6 +579,7 @@ static const FloatFmt float16_params = {
static const FloatFmt float16_params_ahp = {
FLOAT_PARAMS(5, 10),
.exp_max_kind = float_expmax_normal,
+ .overflow_raises_invalid = true,
};
static const FloatFmt bfloat16_params = {
diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
index d3c9c7a913..eada83f7a4 100644
--- a/fpu/softfloat-parts.c.inc
+++ b/fpu/softfloat-parts.c.inc
@@ -348,7 +348,9 @@ static void partsN(uncanon_normal)(FloatPartsN *p, float_status *s,
case float_expmax_normal:
if (unlikely(exp > exp_max)) {
/* Overflow. Return the maximum normal. */
- flags = float_flag_invalid;
+ flags = (fmt->overflow_raises_invalid
+ ? float_flag_invalid
+ : float_flag_overflow | float_flag_inexact);
exp = exp_max;
frac_allones(p);
p->frac_lo &= ~round_mask;
--
2.43.0