From eec360a6f29ed636f7b64a19f83e802935387edf Mon Sep 17 00:00:00 2001
From: Matthew Flatt <mflatt@racket-lang.org>
Date: Sat, 24 Aug 2013 06:10:41 -0600
Subject: [PATCH] ARM JIT: fix soft-float `round'

Use our own implementation of round(), since the round()
function might be missing.
---
 racket/src/racket/src/lightning/arm/asm-common.h |    2 --
 racket/src/racket/src/lightning/arm/fp-swf.h     |   13 +++++++--
 racket/src/racket/src/number.c                   |   32 +---------------------
 racket/src/racket/src/schround.inc               |   31 +++++++++++++++++++++
 4 files changed, 43 insertions(+), 35 deletions(-)
 create mode 100644 racket/src/racket/src/schround.inc

diff --git a/racket/src/racket/src/lightning/arm/asm-common.h b/racket/src/racket/src/lightning/arm/asm-common.h
index bd82dda..8429446 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 e981f6c..aea3650 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 ead243d..dad03ed 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 0000000..38e32bc
--- /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;
+}
-- 
1.7.10.2 (Apple Git-33)

