Skip to content

File softfloat_util.h

File List > common > softfloat_util.h

Go to the documentation of this file

#pragma once

extern "C" {
#include "softfloat.h"
}

#define signF32UI(a) ((bool)((uint32_t)(a) >> 31))
#define fracF32UI(a) ((a) & 0x007FFFFF)
#define expF32UI(a) (((a) >> 23) & 0xFF)

#define signF64UI(a) ((bool)((uint64_t)(a) >> 63))
#define fracF64UI(a) ((a) & UINT64_C(0x000FFFFFFFFFFFFF))
#define expF64UI(a) (((a) >> 52) & 0x7FF)

#define F32_SIGN 0x80000000
#define F64_SIGN UINT64_C(0x8000000000000000)

#define defaultNaNF32UI 0x7FC00000
#define defaultNaNF64UI UINT64_C(0x7FF8000000000000)

#define isSigNaNF32UI(uiA) \
  ((((uiA) & 0x7FC00000) == 0x7F800000) && ((uiA) & 0x003FFFFF))
#define isSigNaNF64UI(uiA)                                                     \
  ((((uiA) & UINT64_C(0x7FF8000000000000)) == UINT64_C(0x7FF0000000000000)) && \
   ((uiA) & UINT64_C(0x0007FFFFFFFFFFFF)))

// Check if exponent is all set and fraction != 0
#define isNaNF32UI(a) (((~(a) & 0x7F800000) == 0) && ((a) & 0x007FFFFF))
#define isNaNF64UI(a)                              \
  (((~(a) & UINT64_C(0x7FF0000000000000)) == 0) && \
   ((a) & UINT64_C(0x000FFFFFFFFFFFFF)))

inline void softfloat_init(uint32_t rm) {
  softfloat_exceptionFlags = 0;
  softfloat_roundingMode = rm;
}

inline float32_t to_float32(const uint32_t x) { return float32_t{x}; }
inline float64_t to_float64(const uint64_t x) { return float64_t{x}; }
inline uint32_t from_float32(const float32_t x) { return x.v; }
inline uint64_t from_float64(const float64_t x) { return x.v; }