.frac_shift = (-F - 1) & 63, \
.round_mask = (1ull << ((-F - 1) & 63)) - 1
+static const FloatFmt float4_e2m1_params = {
+ FLOAT_PARAMS(2, 1),
+ .exp_max_kind = float_expmax_normal,
+};
+
static const FloatFmt float8_e4m3_params = {
FLOAT_PARAMS(4, 3),
.exp_max_kind = float_expmax_e4m3
};
}
+static void QEMU_FLATTEN float4_e2m1_unpack_raw(FloatParts64 *p, float4_e2m1 f)
+{
+ unpack_raw64(p, &float4_e2m1_params, f);
+}
+
static void QEMU_FLATTEN float8_e4m3_unpack_raw(FloatParts64 *p, float8_e4m3 f)
{
unpack_raw64(p, &float8_e4m3_params, f);
* Pack/unpack routines with a specific FloatFmt.
*/
+static void float4_e2m1_unpack_canonical(FloatParts64 *p, float4_e2m1 f,
+ float_status *s)
+{
+ float4_e2m1_unpack_raw(p, f);
+ parts_canonicalize(p, s, &float4_e2m1_params);
+}
+
static void float8_e4m3_unpack_canonical(FloatParts64 *p, float8_e4m3 f,
float_status *s)
{
}
}
+float8_e4m3 float4_e2m1_to_float8_e4m3(float4_e2m1 a, float_status *s)
+{
+ FloatParts64 p;
+
+ float4_e2m1_unpack_canonical(&p, a, s);
+ parts_float_to_float(&p, s);
+ return float8_e4m3_round_pack_canonical(&p, s, false);
+}
+
bfloat16 float8_e4m3_to_bfloat16(float8_e4m3 a, float_status *s)
{
FloatParts64 p;
float128 uint128_to_float128(Int128, float_status *status);
/*----------------------------------------------------------------------------
-| OCP FP8 conversion routines.
+| OCP FP{4,8} conversion routines.
*----------------------------------------------------------------------------*/
+float8_e4m3 float4_e2m1_to_float8_e4m3(float4_e2m1, float_status *status);
+
bfloat16 float8_e4m3_to_bfloat16(float8_e4m3, float_status *status);
float8_e4m3 bfloat16_to_float8_e4m3(bfloat16, bool sat, float_status *status);
float8_e4m3 float32_to_float8_e4m3(float32, bool sat, float_status *status);