This commit provides the basic operation support for the OCP float4 data type(e2m1).
Signed-off-by: Max Chou <[email protected]> --- include/fpu/softfloat-types.h | 7 +++++- include/fpu/softfloat.h | 45 +++++++++++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/include/fpu/softfloat-types.h b/include/fpu/softfloat-types.h index 835dd33bf1..82a54e9e6d 100644 --- a/include/fpu/softfloat-types.h +++ b/include/fpu/softfloat-types.h @@ -120,7 +120,7 @@ typedef struct { typedef uint16_t bfloat16; /* - * Software OCP(Open Compute Project) 8-bit floating point types + * Software OCP(Open Compute Project) floating point types */ typedef uint8_t float8_e4m3; typedef uint8_t float8_e5m2; @@ -131,6 +131,11 @@ typedef uint8_t float8_e5m2; #define const_float8_e4m3(x) (x) #define const_float8_e5m2(x) (x) +typedef uint8_t float4_e2m1; +#define float4_e2m1_val(x) (x & 0xf) +#define make_float4_e2m1(x) (x & 0xf) +#define const_float4_e2m1(x) (x & 0xf) + /* * Software IEC/IEEE floating-point underflow tininess-detection mode. */ diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h index 7ab585bfc8..13b882bc67 100644 --- a/include/fpu/softfloat.h +++ b/include/fpu/softfloat.h @@ -190,7 +190,7 @@ float128 uint64_to_float128(uint64_t, float_status *status); float128 uint128_to_float128(Int128, float_status *status); /*---------------------------------------------------------------------------- -| Software OCP FP8 conversion routines. +| Software OCP FP conversion routines. *----------------------------------------------------------------------------*/ bfloat16 float8_e4m3_to_bfloat16(float8_e4m3, float_status *status); @@ -201,7 +201,7 @@ float8_e4m3 float32_to_float8_e4m3(float32, bool saturate, float_status *status) float8_e5m2 float32_to_float8_e5m2(float32, bool saturate, float_status *status); /*---------------------------------------------------------------------------- -| Software OCP FP8 operations. +| Software OCP FP operations. *----------------------------------------------------------------------------*/ bool float8_e4m3_is_quiet_nan(float8_e4m3, float_status *status); @@ -270,6 +270,47 @@ static inline bool float8_e5m2_is_normal(float8_e5m2 a) return (((float8_e5m2_val(a) >> 2) + 1) & 0x1f) >= 2; } +static inline bool float4_e2m1_is_quiet_nan(float4_e2m1 a, float_status *status) +{ + return false; +} + +static inline bool float4_e2m1_is_signaling_nan(float4_e2m1 a, float_status *status) +{ + return false; +} + +static inline bool float4_e2m1_is_any_nan(float4_e2m1 a) +{ + return false; +} + +static inline bool float4_e2m1_is_neg(float4_e2m1 a) +{ + return float4_e2m1_val(a) >> 3; +} + +static inline bool float4_e2m1_is_infinity(float4_e2m1 a) +{ + return false; +} + +static inline bool float4_e2m1_is_zero(float4_e2m1 a) +{ + return (float4_e2m1_val(a) & 0x7) == 0; +} + +static inline bool float4_e2m1_is_zero_or_denormal(float4_e2m1 a) +{ + return (float4_e2m1_val(a) & 0x6) == 0; +} + +static inline bool float4_e2m1_is_normal(float4_e2m1 a) +{ + uint8_t em = float4_e2m1_val(a) & 0x7; + return em >= 0x2 && em <= 0x7; +} + /*---------------------------------------------------------------------------- | Software half-precision conversion routines. *----------------------------------------------------------------------------*/ -- 2.43.7
