Begin exposing the intermediate representation of softfloat.
Start with just the representation structures.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
include/fpu/softfloat-parts.h | 88 +++++++++++++++++++++++++++++++++++
fpu/softfloat.c | 69 +--------------------------
2 files changed, 90 insertions(+), 67 deletions(-)
create mode 100644 include/fpu/softfloat-parts.h
diff --git a/include/fpu/softfloat-parts.h b/include/fpu/softfloat-parts.h
new file mode 100644
index 0000000000..13c1f3d2d6
--- /dev/null
+++ b/include/fpu/softfloat-parts.h
@@ -0,0 +1,88 @@
+/*
+ * Floating point intermediate representation
+ *
+ * The code in this source file is derived from release 2a of the SoftFloat
+ * IEC/IEEE Floating-point Arithmetic Package. Those parts of the code (and
+ * some later contributions) are provided under that license, as detailed below.
+ * It has subsequently been modified by contributors to the QEMU Project,
+ * so some portions are provided under:
+ * the SoftFloat-2a license
+ * the BSD license
+ * GPL-v2-or-later
+ *
+ * Any future contributions to this file after December 1st 2014 will be
+ * taken to be licensed under the Softfloat-2a license unless specifically
+ * indicated otherwise.
+ */
+
+#ifndef SOFTFLOAT_PARTS_H
+#define SOFTFLOAT_PARTS_H
+
+/*
+ * Classify a floating point number. Everything above float_class_qnan
+ * is a NaN so cls >= float_class_qnan is any NaN.
+ *
+ * Note that we canonicalize denormals, so most code should treat
+ * class_normal and class_denormal identically.
+ */
+
+typedef enum __attribute__ ((__packed__)) {
+ float_class_unclassified,
+ float_class_zero,
+ float_class_normal,
+ float_class_denormal, /* input was a non-squashed denormal */
+ float_class_inf,
+ float_class_qnan, /* all NaNs from here */
+ float_class_snan,
+} FloatClass;
+
+#define float_cmask(bit) (1u << (bit))
+
+enum {
+ float_cmask_zero = float_cmask(float_class_zero),
+ float_cmask_normal = float_cmask(float_class_normal),
+ float_cmask_denormal = float_cmask(float_class_denormal),
+ float_cmask_inf = float_cmask(float_class_inf),
+ float_cmask_qnan = float_cmask(float_class_qnan),
+ float_cmask_snan = float_cmask(float_class_snan),
+
+ float_cmask_infzero = float_cmask_zero | float_cmask_inf,
+ float_cmask_anynan = float_cmask_qnan | float_cmask_snan,
+ float_cmask_anynorm = float_cmask_normal | float_cmask_denormal,
+};
+
+/*
+ * Structure holding all of the decomposed parts of a float.
+ * The exponent is unbiased and the fraction is normalized.
+ *
+ * The fraction words are stored in big-endian word ordering,
+ * so that truncation from a larger format to a smaller format
+ * can be done simply by ignoring subsequent elements.
+ */
+
+typedef struct {
+ FloatClass cls;
+ bool sign;
+ int32_t exp;
+ union {
+ /* Routines that know the structure may reference the singular name. */
+ uint64_t frac;
+ /*
+ * Routines expanded with multiple structures reference "hi" and "lo"
+ * depending on the operation. In FloatParts64, "hi" and "lo" are
+ * both the same word and aliased here.
+ */
+ uint64_t frac_hi;
+ uint64_t frac_lo;
+ };
+} FloatParts64;
+
+typedef struct {
+ FloatClass cls;
+ bool sign;
+ int32_t exp;
+ uint64_t frac_hi;
+ uint64_t frac_lo;
+} FloatParts128;
+
+#endif
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
index 8c4263bfe6..cd75df3160 100644
--- a/fpu/softfloat.c
+++ b/fpu/softfloat.c
@@ -83,6 +83,7 @@ this code that are retained.
#include <math.h>
#include "qemu/bitops.h"
#include "fpu/softfloat.h"
+#include "fpu/softfloat-parts.h"
/* We only need stdlib for abort() */
@@ -396,39 +397,6 @@ float64_gen2(float64 xa, float64 xb, float_status *s,
return soft(ua.s, ub.s, s);
}
-/*
- * Classify a floating point number. Everything above float_class_qnan
- * is a NaN so cls >= float_class_qnan is any NaN.
- *
- * Note that we canonicalize denormals, so most code should treat
- * class_normal and class_denormal identically.
- */
-
-typedef enum __attribute__ ((__packed__)) {
- float_class_unclassified,
- float_class_zero,
- float_class_normal,
- float_class_denormal, /* input was a non-squashed denormal */
- float_class_inf,
- float_class_qnan, /* all NaNs from here */
- float_class_snan,
-} FloatClass;
-
-#define float_cmask(bit) (1u << (bit))
-
-enum {
- float_cmask_zero = float_cmask(float_class_zero),
- float_cmask_normal = float_cmask(float_class_normal),
- float_cmask_denormal = float_cmask(float_class_denormal),
- float_cmask_inf = float_cmask(float_class_inf),
- float_cmask_qnan = float_cmask(float_class_qnan),
- float_cmask_snan = float_cmask(float_class_snan),
-
- float_cmask_infzero = float_cmask_zero | float_cmask_inf,
- float_cmask_anynan = float_cmask_qnan | float_cmask_snan,
- float_cmask_anynorm = float_cmask_normal | float_cmask_denormal,
-};
-
/* Flags for parts_minmax. */
enum {
/* Set for minimum; clear for maximum. */
@@ -474,40 +442,7 @@ static inline bool is_anynorm(FloatClass c)
return float_cmask(c) & float_cmask_anynorm;
}
-/*
- * Structure holding all of the decomposed parts of a float.
- * The exponent is unbiased and the fraction is normalized.
- *
- * The fraction words are stored in big-endian word ordering,
- * so that truncation from a larger format to a smaller format
- * can be done simply by ignoring subsequent elements.
- */
-
-typedef struct {
- FloatClass cls;
- bool sign;
- int32_t exp;
- union {
- /* Routines that know the structure may reference the singular name. */
- uint64_t frac;
- /*
- * Routines expanded with multiple structures reference "hi" and "lo"
- * depending on the operation. In FloatParts64, "hi" and "lo" are
- * both the same word and aliased here.
- */
- uint64_t frac_hi;
- uint64_t frac_lo;
- };
-} FloatParts64;
-
-typedef struct {
- FloatClass cls;
- bool sign;
- int32_t exp;
- uint64_t frac_hi;
- uint64_t frac_lo;
-} FloatParts128;
-
+/* FloatParts256 is entirely internal, for parts128_mul* */
typedef struct {
FloatClass cls;
bool sign;
--
2.43.0