#ifndef SIM_FPU_H
#define SIM_FPU_H
typedef enum
{
sim_fpu_class_zero,
sim_fpu_class_snan,
sim_fpu_class_qnan,
sim_fpu_class_number,
sim_fpu_class_denorm,
sim_fpu_class_infinity,
} sim_fpu_class;
typedef struct _sim_fpu {
sim_fpu_class class;
int sign;
unsigned64 fraction;
int normal_exp;
} sim_fpu;
typedef enum
{
sim_fpu_round_default = 0,
sim_fpu_round_near = 1,
sim_fpu_round_zero = 2,
sim_fpu_round_up = 3,
sim_fpu_round_down = 4,
} sim_fpu_round;
typedef enum
{
sim_fpu_denorm_default = 0,
sim_fpu_denorm_underflow_inexact = 1,
sim_fpu_denorm_zero = 2,
} sim_fpu_denorm;
typedef enum
{
sim_fpu_status_invalid_snan = 1,
sim_fpu_status_invalid_qnan = 2,
sim_fpu_status_invalid_isi = 4,
sim_fpu_status_invalid_idi = 8,
sim_fpu_status_invalid_zdz = 16,
sim_fpu_status_invalid_imz = 32,
sim_fpu_status_invalid_cvi = 64,
sim_fpu_status_invalid_div0 = 128,
sim_fpu_status_invalid_cmp = 256,
sim_fpu_status_invalid_sqrt = 512,
sim_fpu_status_rounded = 1024,
sim_fpu_status_inexact = 2048,
sim_fpu_status_overflow = 4096,
sim_fpu_status_underflow = 8192,
sim_fpu_status_denorm = 16384,
} sim_fpu_status;
INLINE_SIM_FPU (void) sim_fpu_32to (sim_fpu *f, unsigned32 s);
INLINE_SIM_FPU (void) sim_fpu_232to (sim_fpu *f, unsigned32 h, unsigned32 l);
INLINE_SIM_FPU (void) sim_fpu_64to (sim_fpu *f, unsigned64 d);
INLINE_SIM_FPU (void) sim_fpu_to32 (unsigned32 *s, const sim_fpu *f);
INLINE_SIM_FPU (void) sim_fpu_to232 (unsigned32 *h, unsigned32 *l, const sim_fpu *f);
INLINE_SIM_FPU (void) sim_fpu_to64 (unsigned64 *d, const sim_fpu *f);
INLINE_SIM_FPU (void) sim_fpu_fractionto (sim_fpu *f, int sign, int normal_exp, unsigned64 fraction, int precision);
INLINE_SIM_FPU (unsigned64) sim_fpu_tofraction (const sim_fpu *s, int precision);
INLINE_SIM_FPU (int) sim_fpu_round_32 (sim_fpu *f,
sim_fpu_round round,
sim_fpu_denorm denorm);
INLINE_SIM_FPU (int) sim_fpu_round_64 (sim_fpu *f,
sim_fpu_round round,
sim_fpu_denorm denorm);
typedef int (sim_fpu_op1) (sim_fpu *f,
const sim_fpu *l);
typedef int (sim_fpu_op2) (sim_fpu *f,
const sim_fpu *l,
const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_add (sim_fpu *f,
const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_sub (sim_fpu *f,
const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_mul (sim_fpu *f,
const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_div (sim_fpu *f,
const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_max (sim_fpu *f,
const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_min (sim_fpu *f,
const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_neg (sim_fpu *f,
const sim_fpu *a);
INLINE_SIM_FPU (int) sim_fpu_abs (sim_fpu *f,
const sim_fpu *a);
INLINE_SIM_FPU (int) sim_fpu_inv (sim_fpu *f,
const sim_fpu *a);
INLINE_SIM_FPU (int) sim_fpu_sqrt (sim_fpu *f,
const sim_fpu *sqr);
INLINE_SIM_FPU (int) sim_fpu_i32to (sim_fpu *f, signed32 i,
sim_fpu_round round);
INLINE_SIM_FPU (int) sim_fpu_u32to (sim_fpu *f, unsigned32 u,
sim_fpu_round round);
INLINE_SIM_FPU (int) sim_fpu_i64to (sim_fpu *f, signed64 i,
sim_fpu_round round);
INLINE_SIM_FPU (int) sim_fpu_u64to (sim_fpu *f, unsigned64 u,
sim_fpu_round round);
#if 0
INLINE_SIM_FPU (int) sim_fpu_i232to (sim_fpu *f, signed32 h, signed32 l,
sim_fpu_round round);
#endif
#if 0
INLINE_SIM_FPU (int) sim_fpu_u232to (sim_fpu *f, unsigned32 h, unsigned32 l,
sim_fpu_round round);
#endif
INLINE_SIM_FPU (int) sim_fpu_to32i (signed32 *i, const sim_fpu *f,
sim_fpu_round round);
INLINE_SIM_FPU (int) sim_fpu_to32u (unsigned32 *u, const sim_fpu *f,
sim_fpu_round round);
INLINE_SIM_FPU (int) sim_fpu_to64i (signed64 *i, const sim_fpu *f,
sim_fpu_round round);
INLINE_SIM_FPU (int) sim_fpu_to64u (unsigned64 *u, const sim_fpu *f,
sim_fpu_round round);
#if 0
INLINE_SIM_FPU (int) sim_fpu_to232i (signed64 *h, signed64 *l, const sim_fpu *f,
sim_fpu_round round);
#endif
#if 0
INLINE_SIM_FPU (int) sim_fpu_to232u (unsigned64 *h, unsigned64 *l, const sim_fpu *f,
sim_fpu_round round);
#endif
INLINE_SIM_FPU (double) sim_fpu_2d (const sim_fpu *d);
INLINE_SIM_FPU (void) sim_fpu_d2 (sim_fpu *f, double d);
INLINE_SIM_FPU (int) sim_fpu_is_nan (const sim_fpu *s);
INLINE_SIM_FPU (int) sim_fpu_is_snan (const sim_fpu *s);
INLINE_SIM_FPU (int) sim_fpu_is_qnan (const sim_fpu *s);
INLINE_SIM_FPU (int) sim_fpu_is_zero (const sim_fpu *s);
INLINE_SIM_FPU (int) sim_fpu_is_infinity (const sim_fpu *s);
INLINE_SIM_FPU (int) sim_fpu_is_number (const sim_fpu *s);
INLINE_SIM_FPU (int) sim_fpu_is_denorm (const sim_fpu *s);
INLINE_SIM_FPU (int) sim_fpu_sign (const sim_fpu *s);
INLINE_SIM_FPU (int) sim_fpu_exp (const sim_fpu *s);
INLINE_SIM_FPU (int) sim_fpu_lt (int *is, const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_le (int *is, const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_eq (int *is, const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_ne (int *is, const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_ge (int *is, const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_gt (int *is, const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_is_lt (const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_is_le (const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_is_eq (const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_is_ne (const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_is_ge (const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_is_gt (const sim_fpu *l, const sim_fpu *r);
#ifndef SIM_FPU_IS_SNAN
enum {
SIM_FPU_IS_SNAN = 1,
SIM_FPU_IS_QNAN = 2,
SIM_FPU_IS_NINF = 3,
SIM_FPU_IS_PINF = 4,
SIM_FPU_IS_NNUMBER = 5,
SIM_FPU_IS_PNUMBER = 6,
SIM_FPU_IS_NDENORM = 7,
SIM_FPU_IS_PDENORM = 8,
SIM_FPU_IS_NZERO = 9,
SIM_FPU_IS_PZERO = 10,
};
#endif
INLINE_SIM_FPU (int) sim_fpu_is (const sim_fpu *l);
INLINE_SIM_FPU (int) sim_fpu_cmp (const sim_fpu *l, const sim_fpu *r);
extern const sim_fpu sim_fpu_zero;
extern const sim_fpu sim_fpu_one;
extern const sim_fpu sim_fpu_two;
extern const sim_fpu sim_fpu_qnan;
extern const sim_fpu sim_fpu_max32;
extern const sim_fpu sim_fpu_max64;
#if WITH_TARGET_FLOATING_POINT_BITSIZE == 32
#define sim_fpu_tofp sim_fpu_to32
#define sim_fpu_fpto sim_fpu_32to
#define sim_fpu_round_fp sim_fpu_round_32
#define sim_fpu_maxfp sim_fpu_max32
#endif
#if WITH_TARGET_FLOATING_POINT_BITSIZE == 64
#define sim_fpu_tofp sim_fpu_to64
#define sim_fpu_fpto sim_fpu_64to
#define sim_fpu_round_fp sim_fpu_round_64
#define sim_fpu_maxfp sim_fpu_max64
#endif
typedef void sim_fpu_print_func (void *, char *, ...);
INLINE_SIM_FPU (void) sim_fpu_print_fpu (const sim_fpu *f,
sim_fpu_print_func *print,
void *arg);
INLINE_SIM_FPU (void) sim_fpu_printn_fpu (const sim_fpu *f,
sim_fpu_print_func *print,
int digits,
void *arg);
INLINE_SIM_FPU (void) sim_fpu_print_status (int status,
sim_fpu_print_func *print,
void *arg);
#if H_REVEALS_MODULE_P (SIM_FPU_INLINE)
#include "sim-fpu.c"
#endif
#endif