diff options
Diffstat (limited to 'softfloat/bf16_classify.c')
-rw-r--r-- | softfloat/bf16_classify.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/softfloat/bf16_classify.c b/softfloat/bf16_classify.c new file mode 100644 index 0000000..d1c6428 --- /dev/null +++ b/softfloat/bf16_classify.c @@ -0,0 +1,36 @@ + +#include <stdbool.h> +#include <stdint.h> +#include "platform.h" +#include "internals.h" +#include "specialize.h" +#include "softfloat.h" + +uint_fast16_t bf16_classify( bfloat16_t a ) +{ + union ui16_f16 uA; + uint_fast16_t uiA; + + uA.f = a; + uiA = uA.ui; + + uint_fast16_t infOrNaN = expBF16UI( uiA ) == 0xFF; + uint_fast16_t subnormalOrZero = expBF16UI( uiA ) == 0; + bool sign = signBF16UI( uiA ); + bool fracZero = fracBF16UI( uiA ) == 0; + bool isNaN = isNaNBF16UI( uiA ); + bool isSNaN = softfloat_isSigNaNBF16UI( uiA ); + + return + ( sign && infOrNaN && fracZero ) << 0 | + ( sign && !infOrNaN && !subnormalOrZero ) << 1 | + ( sign && subnormalOrZero && !fracZero ) << 2 | + ( sign && subnormalOrZero && fracZero ) << 3 | + ( !sign && infOrNaN && fracZero ) << 7 | + ( !sign && !infOrNaN && !subnormalOrZero ) << 6 | + ( !sign && subnormalOrZero && !fracZero ) << 5 | + ( !sign && subnormalOrZero && fracZero ) << 4 | + ( isNaN && isSNaN ) << 8 | + ( isNaN && !isSNaN ) << 9; +} + |