/* the following deal with IEEE single-precision numbers */
#define EXCESS 126
#define SIGNBIT ((unsigned long)0x80000000)
-#define HIDDEN (unsigned long)(1 << 23)
-#define SIGN(fp) ((fp >> (8*sizeof(fp)-1)) & 1)
-#define EXP(fp) (((fp) >> 23) & (unsigned int) 0x00FF)
+#define __INFINITY ((unsigned long)0x7F800000)
+#define HIDDEN (unsigned long)(1ul << 23)
+#define SIGN(fp) (((unsigned long)(fp) >> (8*sizeof(fp)-1)) & 1)
+#define EXP(fp) (((unsigned long)(fp) >> 23) & (unsigned int) 0x00FF)
#define MANT(fp) (((fp) & (unsigned long)0x007FFFFF) | HIDDEN)
#define NORM 0xff000000
-#define PACK(s,e,m) ((s) | ((e) << 23) | (m))
+#define PACK(s,e,m) ((s) | ((unsigned long)(e) << 23) | (m))
float __uchar2fs (unsigned char);
float __schar2fs (signed char);
char __fslt (float, float);
char __fseq (float, float);
-char __fsqt (float, float);
+char __fsgt (float, float);
-#endif
+#if defined(SDCC_FLOAT_LIB) && defined(SDCC_mcs51) && !defined(SDCC_USE_XSTACK) && !defined(_SDCC_NO_ASM_LIB_FUNCS)
+#define FLOAT_ASM_MCS51
+// This adds extra code for proper round-off, in
+// an attempt to match the results from gcc.
+#define FLOAT_FULL_ACCURACY
+// This adds about 66 bytes to the code size and
+// significantly speeds up shift operations more
+// than 8 bits (common when subtracting numbers
+// of significantly different magnitude and scaling
+// to fixed point)
+#define FLOAT_SHIFT_SPEEDUP
+
+#define sign_a psw.1
+#define sign_b psw.5
+#define exp_a dpl
+#define exp_b dph
+#endif // using mcs51 assembly
+
+
+#endif // __SDC51_FLOAT_H