diff --git a/racket/src/racket/src/lightning/arm/asm-common.h b/racket/src/racket/src/lightning/arm/asm-common.h index bd82dda764..8429446ed9 100644 --- a/racket/src/racket/src/lightning/arm/asm-common.h +++ b/racket/src/racket/src/lightning/arm/asm-common.h @@ -45,8 +45,6 @@ #define __jit_constructor /* empty */ #define __jit_inline XFORM_NONGCING MZ_INLINE static -typedef unsigned int _ui; - typedef signed char _sc; typedef unsigned char _uc, jit_insn; typedef unsigned short _us; diff --git a/racket/src/racket/src/lightning/arm/fp-swf.h b/racket/src/racket/src/lightning/arm/fp-swf.h index e981f6c677..aea365056f 100644 --- a/racket/src/racket/src/lightning/arm/fp-swf.h +++ b/racket/src/racket/src/lightning/arm/fp-swf.h @@ -377,10 +377,19 @@ swf_id(jit_state_t _jitp, double (*i0)(double), jit_gpr_t r0, jit_fpr_t r1) swf_pop(l); } +XFORM_NONGCING static float SCH_ROUNDF(float f) +{ + /* JIT does not generate single-precision arithmetic */ + return f; +} + +/* SCH_ROUND: */ +#include "../../schround.inc" + #define swf_rintr_f_i(_jitp, r0, r1) swf_if(_jitp, rintf, r0, r1) #define swf_rintr_d_i(_jitp, r0, r1) swf_id(_jitp, rint, r0, r1) -#define swf_roundr_f_i(_jitp, r0, r1) swf_if(_jitp, roundf, r0, r1) -#define swf_roundr_d_i(_jitp, r0, r1) swf_id(_jitp, round, r0, r1) +#define swf_roundr_f_i(_jitp, r0, r1) swf_if(_jitp, SCH_ROUNDF, r0, r1) +#define swf_roundr_d_i(_jitp, r0, r1) swf_id(_jitp, SCH_ROUND, r0, r1) #define swf_truncr_f_i(_jitp, r0, r1) swf_if(_jitp, (void *)0, r0, r1) #define swf_truncr_d_i(_jitp, r0, r1) swf_id(_jitp, (void *)0, r0, r1) #define swf_ceilr_f_i(_jitp, r0, r1) swf_if(_jitp, ceilf, r0, r1) diff --git a/racket/src/racket/src/number.c b/racket/src/racket/src/number.c index ead243db27..dad03ed32c 100644 --- a/racket/src/racket/src/number.c +++ b/racket/src/racket/src/number.c @@ -2428,37 +2428,7 @@ sch_truncate (int argc, Scheme_Object *argv[]) ESCAPED_BEFORE_HERE; } -XFORM_NONGCING static double SCH_ROUND(double d) -{ - double i, frac; - int invert; - -#ifdef FMOD_CAN_RETURN_POS_ZERO - if ((d == 0.0) && minus_zero_p(d)) - return d; -#endif - - if (d < 0) { - d = -d; - invert = 1; - } else - invert = 0; - - frac = modf(d, &i); - if (frac < 0.5) - d = i; - else if (frac > 0.5) - d = i + 1; - else if (fmod(i, 2.0) != 0.0) - d = i + 1; - else - d = i; - - if (invert) - d = -d; - - return d; -} +#include "schround.inc" static Scheme_Object * sch_round (int argc, Scheme_Object *argv[]) diff --git a/racket/src/racket/src/schround.inc b/racket/src/racket/src/schround.inc new file mode 100644 index 0000000000..38e32bc95a --- /dev/null +++ b/racket/src/racket/src/schround.inc @@ -0,0 +1,31 @@ +XFORM_NONGCING static double SCH_ROUND(double d) +{ + double i, frac; + int invert; + +#ifdef FMOD_CAN_RETURN_POS_ZERO + if ((d == 0.0) && minus_zero_p(d)) + return d; +#endif + + if (d < 0) { + d = -d; + invert = 1; + } else + invert = 0; + + frac = modf(d, &i); + if (frac < 0.5) + d = i; + else if (frac > 0.5) + d = i + 1; + else if (fmod(i, 2.0) != 0.0) + d = i + 1; + else + d = i; + + if (invert) + d = -d; + + return d; +}