1 1.1 christos /* CGEN fpu support 2 1.1 christos Copyright (C) 1999 Cygnus Solutions. 3 1.1 christos Copyright (C) 2010 Doug Evans. */ 4 1.1 christos 5 1.1 christos #ifndef CGEN_FPU_H 6 1.1 christos #define CGEN_FPU_H 7 1.1 christos 8 1.1 christos /* Floating point support is a little more complicated. 9 1.1 christos We want to support using either host fp insns or an accurate fp library. 10 1.1 christos We also want to support easily added variants (e.g. modified ieee). 11 1.1 christos This is done by vectoring all calls through a table. */ 12 1.1 christos 13 1.1 christos typedef USI SF; 14 1.1 christos typedef UDI DF; 15 1.1 christos typedef struct { SI parts[3]; } XF; 16 1.1 christos typedef struct { SI parts[4]; } TF; 17 1.1 christos 18 1.1 christos #ifndef TARGET_EXT_FP_WORDS 19 1.1 christos #define TARGET_EXT_FP_WORDS 4 20 1.1 christos #endif 21 1.1 christos 22 1.1 christos /* Supported floating point conversion kinds (rounding modes). 23 1.1 christos FIXME: The IEEE rounding modes need to be implemented. */ 24 1.1 christos 25 1.1 christos typedef enum { 26 1.1 christos FPCONV_DEFAULT = 0, 27 1.1 christos FPCONV_TIES_TO_EVEN = 1, 28 1.1 christos FPCONV_TIES_TO_AWAY = 2, 29 1.1 christos FPCONV_TOWARD_ZERO = 3, 30 1.1 christos FPCONV_TOWARD_POSITIVE = 4, 31 1.1 christos FPCONV_TOWARD_NEGATIVE = 5 32 1.1 christos } CGEN_FPCONV_KIND; 33 1.1 christos 34 1.1 christos /* forward decl */ 35 1.1 christos typedef struct cgen_fp_ops CGEN_FP_OPS; 36 1.1 christos 37 1.1 christos /* Instance of an fpu. */ 38 1.1 christos 39 1.1 christos typedef struct { 40 1.1 christos /* Usually a pointer back to the SIM_CPU struct. */ 41 1.1 christos void* owner; 42 1.1 christos /* Pointer to ops struct, rather than copy of it, to avoid bloating 43 1.1 christos SIM_CPU struct. */ 44 1.1 christos CGEN_FP_OPS* ops; 45 1.1 christos } CGEN_FPU; 46 1.1 christos 47 1.1 christos /* result of cmp */ 48 1.1 christos 49 1.1 christos typedef enum { 50 1.1 christos /* ??? May wish to distinguish qnan/snan here. */ 51 1.1 christos FP_CMP_EQ, FP_CMP_LT, FP_CMP_GT, FP_CMP_NAN 52 1.1 christos } CGEN_FP_CMP; 53 1.1 christos 54 1.1 christos /* error handler */ 55 1.1 christos 56 1.1 christos typedef void (CGEN_FPU_ERROR_FN) (CGEN_FPU*, int); 57 1.1 christos 58 1.1 christos /* fpu operation table */ 59 1.1 christos 60 1.1 christos struct cgen_fp_ops { 61 1.1 christos 62 1.1 christos /* error (e.g. signalling nan) handler, supplied by owner */ 63 1.1 christos 64 1.1 christos CGEN_FPU_ERROR_FN *error; 65 1.1 christos 66 1.1 christos /* basic SF ops */ 67 1.1 christos 68 1.1 christos SF (*addsf) (CGEN_FPU*, SF, SF); 69 1.1 christos SF (*subsf) (CGEN_FPU*, SF, SF); 70 1.1 christos SF (*mulsf) (CGEN_FPU*, SF, SF); 71 1.1 christos SF (*divsf) (CGEN_FPU*, SF, SF); 72 1.6 christos SF (*remsf) (CGEN_FPU*, SF, SF); 73 1.1 christos SF (*negsf) (CGEN_FPU*, SF); 74 1.1 christos SF (*abssf) (CGEN_FPU*, SF); 75 1.1 christos SF (*sqrtsf) (CGEN_FPU*, SF); 76 1.1 christos SF (*invsf) (CGEN_FPU*, SF); 77 1.1 christos SF (*cossf) (CGEN_FPU*, SF); 78 1.1 christos SF (*sinsf) (CGEN_FPU*, SF); 79 1.1 christos SF (*minsf) (CGEN_FPU*, SF, SF); 80 1.1 christos SF (*maxsf) (CGEN_FPU*, SF, SF); 81 1.1 christos 82 1.1 christos /* ??? to be revisited */ 83 1.1 christos CGEN_FP_CMP (*cmpsf) (CGEN_FPU*, SF, SF); 84 1.1 christos int (*eqsf) (CGEN_FPU*, SF, SF); 85 1.1 christos int (*nesf) (CGEN_FPU*, SF, SF); 86 1.1 christos int (*ltsf) (CGEN_FPU*, SF, SF); 87 1.1 christos int (*lesf) (CGEN_FPU*, SF, SF); 88 1.1 christos int (*gtsf) (CGEN_FPU*, SF, SF); 89 1.1 christos int (*gesf) (CGEN_FPU*, SF, SF); 90 1.7 christos int (*unorderedsf) (CGEN_FPU*, SF, SF); 91 1.1 christos 92 1.1 christos /* basic DF ops */ 93 1.1 christos 94 1.1 christos DF (*adddf) (CGEN_FPU*, DF, DF); 95 1.1 christos DF (*subdf) (CGEN_FPU*, DF, DF); 96 1.1 christos DF (*muldf) (CGEN_FPU*, DF, DF); 97 1.1 christos DF (*divdf) (CGEN_FPU*, DF, DF); 98 1.6 christos DF (*remdf) (CGEN_FPU*, DF, DF); 99 1.1 christos DF (*negdf) (CGEN_FPU*, DF); 100 1.1 christos DF (*absdf) (CGEN_FPU*, DF); 101 1.1 christos DF (*sqrtdf) (CGEN_FPU*, DF); 102 1.1 christos DF (*invdf) (CGEN_FPU*, DF); 103 1.1 christos DF (*cosdf) (CGEN_FPU*, DF); 104 1.1 christos DF (*sindf) (CGEN_FPU*, DF); 105 1.1 christos DF (*mindf) (CGEN_FPU*, DF, DF); 106 1.1 christos DF (*maxdf) (CGEN_FPU*, DF, DF); 107 1.1 christos 108 1.1 christos /* ??? to be revisited */ 109 1.1 christos CGEN_FP_CMP (*cmpdf) (CGEN_FPU*, DF, DF); 110 1.1 christos int (*eqdf) (CGEN_FPU*, DF, DF); 111 1.1 christos int (*nedf) (CGEN_FPU*, DF, DF); 112 1.1 christos int (*ltdf) (CGEN_FPU*, DF, DF); 113 1.1 christos int (*ledf) (CGEN_FPU*, DF, DF); 114 1.1 christos int (*gtdf) (CGEN_FPU*, DF, DF); 115 1.1 christos int (*gedf) (CGEN_FPU*, DF, DF); 116 1.7 christos int (*unordereddf) (CGEN_FPU*, DF, DF); 117 1.1 christos 118 1.1 christos /* SF/DF conversion ops */ 119 1.1 christos 120 1.1 christos DF (*fextsfdf) (CGEN_FPU*, int, SF); 121 1.1 christos SF (*ftruncdfsf) (CGEN_FPU*, int, DF); 122 1.1 christos 123 1.1 christos SF (*floatsisf) (CGEN_FPU*, int, SI); 124 1.1 christos SF (*floatdisf) (CGEN_FPU*, int, DI); 125 1.1 christos SF (*ufloatsisf) (CGEN_FPU*, int, USI); 126 1.1 christos SF (*ufloatdisf) (CGEN_FPU*, int, UDI); 127 1.1 christos 128 1.1 christos SI (*fixsfsi) (CGEN_FPU*, int, SF); 129 1.1 christos DI (*fixsfdi) (CGEN_FPU*, int, SF); 130 1.1 christos USI (*ufixsfsi) (CGEN_FPU*, int, SF); 131 1.1 christos UDI (*ufixsfdi) (CGEN_FPU*, int, SF); 132 1.1 christos 133 1.1 christos DF (*floatsidf) (CGEN_FPU*, int, SI); 134 1.1 christos DF (*floatdidf) (CGEN_FPU*, int, DI); 135 1.1 christos DF (*ufloatsidf) (CGEN_FPU*, int, USI); 136 1.1 christos DF (*ufloatdidf) (CGEN_FPU*, int, UDI); 137 1.1 christos 138 1.1 christos SI (*fixdfsi) (CGEN_FPU*, int, DF); 139 1.1 christos DI (*fixdfdi) (CGEN_FPU*, int, DF); 140 1.1 christos USI (*ufixdfsi) (CGEN_FPU*, int, DF); 141 1.1 christos UDI (*ufixdfdi) (CGEN_FPU*, int, DF); 142 1.1 christos 143 1.1 christos /* XF mode support (kept separate 'cus not always present) */ 144 1.1 christos 145 1.1 christos XF (*addxf) (CGEN_FPU*, XF, XF); 146 1.1 christos XF (*subxf) (CGEN_FPU*, XF, XF); 147 1.1 christos XF (*mulxf) (CGEN_FPU*, XF, XF); 148 1.1 christos XF (*divxf) (CGEN_FPU*, XF, XF); 149 1.6 christos XF (*remxf) (CGEN_FPU*, XF, XF); 150 1.1 christos XF (*negxf) (CGEN_FPU*, XF); 151 1.1 christos XF (*absxf) (CGEN_FPU*, XF); 152 1.1 christos XF (*sqrtxf) (CGEN_FPU*, XF); 153 1.1 christos XF (*invxf) (CGEN_FPU*, XF); 154 1.1 christos XF (*cosxf) (CGEN_FPU*, XF); 155 1.1 christos XF (*sinxf) (CGEN_FPU*, XF); 156 1.1 christos XF (*minxf) (CGEN_FPU*, XF, XF); 157 1.1 christos XF (*maxxf) (CGEN_FPU*, XF, XF); 158 1.1 christos 159 1.1 christos CGEN_FP_CMP (*cmpxf) (CGEN_FPU*, XF, XF); 160 1.1 christos int (*eqxf) (CGEN_FPU*, XF, XF); 161 1.1 christos int (*nexf) (CGEN_FPU*, XF, XF); 162 1.1 christos int (*ltxf) (CGEN_FPU*, XF, XF); 163 1.1 christos int (*lexf) (CGEN_FPU*, XF, XF); 164 1.1 christos int (*gtxf) (CGEN_FPU*, XF, XF); 165 1.1 christos int (*gexf) (CGEN_FPU*, XF, XF); 166 1.1 christos 167 1.1 christos XF (*extsfxf) (CGEN_FPU*, int, SF); 168 1.1 christos XF (*extdfxf) (CGEN_FPU*, int, DF); 169 1.1 christos SF (*truncxfsf) (CGEN_FPU*, int, XF); 170 1.1 christos DF (*truncxfdf) (CGEN_FPU*, int, XF); 171 1.1 christos 172 1.1 christos XF (*floatsixf) (CGEN_FPU*, int, SI); 173 1.1 christos XF (*floatdixf) (CGEN_FPU*, int, DI); 174 1.1 christos XF (*ufloatsixf) (CGEN_FPU*, int, USI); 175 1.1 christos XF (*ufloatdixf) (CGEN_FPU*, int, UDI); 176 1.1 christos 177 1.1 christos SI (*fixxfsi) (CGEN_FPU*, int, XF); 178 1.1 christos DI (*fixxfdi) (CGEN_FPU*, int, XF); 179 1.1 christos USI (*ufixxfsi) (CGEN_FPU*, int, XF); 180 1.1 christos UDI (*ufixxfdi) (CGEN_FPU*, int, XF); 181 1.1 christos 182 1.1 christos /* TF mode support (kept separate 'cus not always present) */ 183 1.1 christos 184 1.1 christos TF (*addtf) (CGEN_FPU*, TF, TF); 185 1.1 christos TF (*subtf) (CGEN_FPU*, TF, TF); 186 1.1 christos TF (*multf) (CGEN_FPU*, TF, TF); 187 1.1 christos TF (*divtf) (CGEN_FPU*, TF, TF); 188 1.6 christos TF (*remtf) (CGEN_FPU*, TF, TF); 189 1.1 christos TF (*negtf) (CGEN_FPU*, TF); 190 1.1 christos TF (*abstf) (CGEN_FPU*, TF); 191 1.1 christos TF (*sqrttf) (CGEN_FPU*, TF); 192 1.1 christos TF (*invtf) (CGEN_FPU*, TF); 193 1.1 christos TF (*costf) (CGEN_FPU*, TF); 194 1.1 christos TF (*sintf) (CGEN_FPU*, TF); 195 1.1 christos TF (*mintf) (CGEN_FPU*, TF, TF); 196 1.1 christos TF (*maxtf) (CGEN_FPU*, TF, TF); 197 1.1 christos 198 1.1 christos CGEN_FP_CMP (*cmptf) (CGEN_FPU*, TF, TF); 199 1.1 christos int (*eqtf) (CGEN_FPU*, TF, TF); 200 1.1 christos int (*netf) (CGEN_FPU*, TF, TF); 201 1.1 christos int (*lttf) (CGEN_FPU*, TF, TF); 202 1.1 christos int (*letf) (CGEN_FPU*, TF, TF); 203 1.1 christos int (*gttf) (CGEN_FPU*, TF, TF); 204 1.1 christos int (*getf) (CGEN_FPU*, TF, TF); 205 1.1 christos 206 1.1 christos TF (*extsftf) (CGEN_FPU*, int, SF); 207 1.1 christos TF (*extdftf) (CGEN_FPU*, int, DF); 208 1.1 christos SF (*trunctfsf) (CGEN_FPU*, int, TF); 209 1.1 christos DF (*trunctfdf) (CGEN_FPU*, int, TF); 210 1.1 christos 211 1.1 christos TF (*floatsitf) (CGEN_FPU*, int, SI); 212 1.1 christos TF (*floatditf) (CGEN_FPU*, int, DI); 213 1.1 christos TF (*ufloatsitf) (CGEN_FPU*, int, USI); 214 1.1 christos TF (*ufloatditf) (CGEN_FPU*, int, UDI); 215 1.1 christos 216 1.1 christos SI (*fixtfsi) (CGEN_FPU*, int, TF); 217 1.1 christos DI (*fixtfdi) (CGEN_FPU*, int, TF); 218 1.1 christos USI (*ufixtfsi) (CGEN_FPU*, int, TF); 219 1.1 christos UDI (*ufixtfdi) (CGEN_FPU*, int, TF); 220 1.1 christos 221 1.1 christos }; 222 1.1 christos 223 1.1 christos extern void cgen_init_accurate_fpu (SIM_CPU*, CGEN_FPU*, CGEN_FPU_ERROR_FN*); 224 1.1 christos 225 1.1 christos BI cgen_sf_snan_p (CGEN_FPU*, SF); 226 1.1 christos BI cgen_df_snan_p (CGEN_FPU*, DF); 227 1.1 christos 228 1.1 christos /* no-op fp error handler */ 229 1.1 christos extern CGEN_FPU_ERROR_FN cgen_fpu_ignore_errors; 230 1.1 christos 231 1.1 christos #endif /* CGEN_FPU_H */ 232