#ifndef CGEN_FPU_H
#define CGEN_FPU_H
typedef USI SF;
typedef UDI DF;
typedef struct { SI parts[3]; } XF;
typedef struct { SI parts[4]; } TF;
#ifndef TARGET_EXT_FP_WORDS
#define TARGET_EXT_FP_WORDS 4
#endif
typedef struct cgen_fp_ops CGEN_FP_OPS;
typedef struct {
void* owner;
CGEN_FP_OPS* ops;
} CGEN_FPU;
typedef enum {
FP_CMP_EQ, FP_CMP_LT, FP_CMP_GT, FP_CMP_NAN
} CGEN_FP_CMP;
typedef void (CGEN_FPU_ERROR_FN) (CGEN_FPU*, int);
struct cgen_fp_ops {
CGEN_FPU_ERROR_FN *error;
SF (*addsf) (CGEN_FPU*, SF, SF);
SF (*subsf) (CGEN_FPU*, SF, SF);
SF (*mulsf) (CGEN_FPU*, SF, SF);
SF (*divsf) (CGEN_FPU*, SF, SF);
SF (*negsf) (CGEN_FPU*, SF);
SF (*abssf) (CGEN_FPU*, SF);
SF (*sqrtsf) (CGEN_FPU*, SF);
SF (*invsf) (CGEN_FPU*, SF);
SF (*cossf) (CGEN_FPU*, SF);
SF (*sinsf) (CGEN_FPU*, SF);
SF (*minsf) (CGEN_FPU*, SF, SF);
SF (*maxsf) (CGEN_FPU*, SF, SF);
CGEN_FP_CMP (*cmpsf) (CGEN_FPU*, SF, SF);
int (*eqsf) (CGEN_FPU*, SF, SF);
int (*nesf) (CGEN_FPU*, SF, SF);
int (*ltsf) (CGEN_FPU*, SF, SF);
int (*lesf) (CGEN_FPU*, SF, SF);
int (*gtsf) (CGEN_FPU*, SF, SF);
int (*gesf) (CGEN_FPU*, SF, SF);
DF (*adddf) (CGEN_FPU*, DF, DF);
DF (*subdf) (CGEN_FPU*, DF, DF);
DF (*muldf) (CGEN_FPU*, DF, DF);
DF (*divdf) (CGEN_FPU*, DF, DF);
DF (*negdf) (CGEN_FPU*, DF);
DF (*absdf) (CGEN_FPU*, DF);
DF (*sqrtdf) (CGEN_FPU*, DF);
DF (*invdf) (CGEN_FPU*, DF);
DF (*cosdf) (CGEN_FPU*, DF);
DF (*sindf) (CGEN_FPU*, DF);
DF (*mindf) (CGEN_FPU*, DF, DF);
DF (*maxdf) (CGEN_FPU*, DF, DF);
CGEN_FP_CMP (*cmpdf) (CGEN_FPU*, DF, DF);
int (*eqdf) (CGEN_FPU*, DF, DF);
int (*nedf) (CGEN_FPU*, DF, DF);
int (*ltdf) (CGEN_FPU*, DF, DF);
int (*ledf) (CGEN_FPU*, DF, DF);
int (*gtdf) (CGEN_FPU*, DF, DF);
int (*gedf) (CGEN_FPU*, DF, DF);
DF (*fextsfdf) (CGEN_FPU*, SF);
SF (*ftruncdfsf) (CGEN_FPU*, DF);
SF (*floatsisf) (CGEN_FPU*, SI);
SF (*floatdisf) (CGEN_FPU*, DI);
SF (*ufloatsisf) (CGEN_FPU*, USI);
SF (*ufloatdisf) (CGEN_FPU*, UDI);
SI (*fixsfsi) (CGEN_FPU*, SF);
DI (*fixsfdi) (CGEN_FPU*, SF);
USI (*ufixsfsi) (CGEN_FPU*, SF);
UDI (*ufixsfdi) (CGEN_FPU*, SF);
DF (*floatsidf) (CGEN_FPU*, SI);
DF (*floatdidf) (CGEN_FPU*, DI);
DF (*ufloatsidf) (CGEN_FPU*, USI);
DF (*ufloatdidf) (CGEN_FPU*, UDI);
SI (*fixdfsi) (CGEN_FPU*, DF);
DI (*fixdfdi) (CGEN_FPU*, DF);
USI (*ufixdfsi) (CGEN_FPU*, DF);
UDI (*ufixdfdi) (CGEN_FPU*, DF);
XF (*addxf) (CGEN_FPU*, XF, XF);
XF (*subxf) (CGEN_FPU*, XF, XF);
XF (*mulxf) (CGEN_FPU*, XF, XF);
XF (*divxf) (CGEN_FPU*, XF, XF);
XF (*negxf) (CGEN_FPU*, XF);
XF (*absxf) (CGEN_FPU*, XF);
XF (*sqrtxf) (CGEN_FPU*, XF);
XF (*invxf) (CGEN_FPU*, XF);
XF (*cosxf) (CGEN_FPU*, XF);
XF (*sinxf) (CGEN_FPU*, XF);
XF (*minxf) (CGEN_FPU*, XF, XF);
XF (*maxxf) (CGEN_FPU*, XF, XF);
CGEN_FP_CMP (*cmpxf) (CGEN_FPU*, XF, XF);
int (*eqxf) (CGEN_FPU*, XF, XF);
int (*nexf) (CGEN_FPU*, XF, XF);
int (*ltxf) (CGEN_FPU*, XF, XF);
int (*lexf) (CGEN_FPU*, XF, XF);
int (*gtxf) (CGEN_FPU*, XF, XF);
int (*gexf) (CGEN_FPU*, XF, XF);
XF (*extsfxf) (CGEN_FPU*, SF);
XF (*extdfxf) (CGEN_FPU*, DF);
SF (*truncxfsf) (CGEN_FPU*, XF);
DF (*truncxfdf) (CGEN_FPU*, XF);
XF (*floatsixf) (CGEN_FPU*, SI);
XF (*floatdixf) (CGEN_FPU*, DI);
XF (*ufloatsixf) (CGEN_FPU*, USI);
XF (*ufloatdixf) (CGEN_FPU*, UDI);
SI (*fixxfsi) (CGEN_FPU*, XF);
DI (*fixxfdi) (CGEN_FPU*, XF);
USI (*ufixxfsi) (CGEN_FPU*, XF);
UDI (*ufixxfdi) (CGEN_FPU*, XF);
TF (*addtf) (CGEN_FPU*, TF, TF);
TF (*subtf) (CGEN_FPU*, TF, TF);
TF (*multf) (CGEN_FPU*, TF, TF);
TF (*divtf) (CGEN_FPU*, TF, TF);
TF (*negtf) (CGEN_FPU*, TF);
TF (*abstf) (CGEN_FPU*, TF);
TF (*sqrttf) (CGEN_FPU*, TF);
TF (*invtf) (CGEN_FPU*, TF);
TF (*costf) (CGEN_FPU*, TF);
TF (*sintf) (CGEN_FPU*, TF);
TF (*mintf) (CGEN_FPU*, TF, TF);
TF (*maxtf) (CGEN_FPU*, TF, TF);
CGEN_FP_CMP (*cmptf) (CGEN_FPU*, TF, TF);
int (*eqtf) (CGEN_FPU*, TF, TF);
int (*netf) (CGEN_FPU*, TF, TF);
int (*lttf) (CGEN_FPU*, TF, TF);
int (*letf) (CGEN_FPU*, TF, TF);
int (*gttf) (CGEN_FPU*, TF, TF);
int (*getf) (CGEN_FPU*, TF, TF);
TF (*extsftf) (CGEN_FPU*, SF);
TF (*extdftf) (CGEN_FPU*, DF);
SF (*trunctfsf) (CGEN_FPU*, TF);
DF (*trunctfdf) (CGEN_FPU*, TF);
TF (*floatsitf) (CGEN_FPU*, SI);
TF (*floatditf) (CGEN_FPU*, DI);
TF (*ufloatsitf) (CGEN_FPU*, USI);
TF (*ufloatditf) (CGEN_FPU*, UDI);
SI (*fixtfsi) (CGEN_FPU*, TF);
DI (*fixtfdi) (CGEN_FPU*, TF);
USI (*ufixtfsi) (CGEN_FPU*, TF);
UDI (*ufixtfdi) (CGEN_FPU*, TF);
};
extern void cgen_init_accurate_fpu (SIM_CPU*, CGEN_FPU*, CGEN_FPU_ERROR_FN*);
BI cgen_sf_snan_p (CGEN_FPU*, SF);
BI cgen_df_snan_p (CGEN_FPU*, DF);
extern CGEN_FPU_ERROR_FN cgen_fpu_ignore_errors;
#endif