From a2ba4016a64f84193261db9a52196adc39cb5767 Mon Sep 17 00:00:00 2001 From: Pierre Roux Date: Thu, 12 Sep 2019 19:02:18 +0200 Subject: Reimplement is_float is_float was relying on Obj.tag triggering a check that we are in the OCaml heap which is expensive. On extreme examples, this can lead to a global 2x speedup. Thanks to Maxime Dénès and Jacques-Henri Jourdan for their help in diagnosing this. --- kernel/byterun/coq_float64.h | 4 ++++ kernel/nativevalues.ml | 6 ++---- 2 files changed, 6 insertions(+), 4 deletions(-) (limited to 'kernel') diff --git a/kernel/byterun/coq_float64.h b/kernel/byterun/coq_float64.h index 6814c31642..9fc390bd33 100644 --- a/kernel/byterun/coq_float64.h +++ b/kernel/byterun/coq_float64.h @@ -29,4 +29,8 @@ DECLARE_FUNOP(fsqrt, sqrt(x)) DECLARE_FUNOP(next_up, nextafter(x, INFINITY)) DECLARE_FUNOP(next_down, nextafter(x, -INFINITY)) +value coq_is_double(value x) { + return Val_long(Is_double(x)); +} + #endif /* _COQ_FLOAT64_ */ diff --git a/kernel/nativevalues.ml b/kernel/nativevalues.ml index 1d4fb5d39c..6b9d49052d 100644 --- a/kernel/nativevalues.ml +++ b/kernel/nativevalues.ml @@ -517,10 +517,8 @@ let print x = (** Support for machine floating point values *) -let is_float (x:t) = - let o = Obj.repr x in - Int.equal (Obj.tag o) Obj.double_tag -[@@ocaml.inline always] +external is_float : t -> bool = "coq_is_double" +[@@noalloc] let to_float (x:t) = (Obj.magic x : Float64.t) [@@ocaml.inline always] -- cgit v1.2.3