Skip to content

Commit dbe2f17

Browse files
authored
Float_u stdlib module (#1572)
1 parent 41fc1e9 commit dbe2f17

17 files changed

+872
-116
lines changed

ocaml/Makefile.common-jst

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ dune_config_targets = \
102102
duneconf/main.ws \
103103
$(ocamldir)/duneconf/dirs-to-ignore.inc \
104104
$(ocamldir)/duneconf/jst-extra.inc \
105-
dune-project
105+
dune-project \
106+
$(ocamldir)/stdlib/ocaml_compiler_internal_params
106107

107108
_build/_bootinstall: Makefile.config $(dune_config_targets)
108109
echo -n '$(NATDYNLINKOPTS)' > $(ocamldir)/otherlibs/dynlink/natdynlinkops
@@ -172,6 +173,12 @@ _install: compiler
172173
install: _install
173174
mkdir -p '$(prefix)'
174175
rsync --chmod=u+rw,go+r -rl _install/ '$(prefix)'
176+
rm '$(prefix)/lib/ocaml/ocaml_compiler_internal_params'
177+
# rm `ocaml_compiler_internal_params`, which is used to compile the
178+
# stdlib `Float_u` module with `-extension layouts_alpha`, because we
179+
# don't want user programs that happened to be named
180+
# `ocaml/stdlib/float_u.ml` to get the flag automatically.
181+
175182

176183
# Same as above, but relies on a successfull earlier _install
177184
install_for_opam:

ocaml/driver/compenv.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,7 @@ type file_option = {
534534
}
535535

536536
let scan_line ic =
537-
Scanf.bscanf ic "%[0-9a-zA-Z_.*] : %[a-zA-Z_-] = %s "
537+
Scanf.bscanf ic "%[0-9a-zA-Z/_.*] : %[a-zA-Z_-] = %s "
538538
(fun pattern name value ->
539539
let pattern =
540540
match pattern with

ocaml/ocamldoc/odoc.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
module M = Odoc_messages
2020

21+
let () = Language_extension.enable_maximal ()
22+
2123
(* we check if we must load a module given on the command line *)
2224
let arg_list = Array.to_list Sys.argv
2325
let (plugins, paths) =

ocaml/stdlib/.depend

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,16 @@ stdlib__Float.cmx : float.ml \
325325
stdlib__Float.cmi : float.mli \
326326
stdlib.cmi \
327327
stdlib__Seq.cmi
328+
stdlib__Float_u.cmo : float_u.ml \
329+
stdlib.cmi \
330+
stdlib__Float.cmi \
331+
stdlib__Float_u.cmi
332+
stdlib__Float_u.cmx : float_u.ml \
333+
stdlib.cmx \
334+
stdlib__Float.cmx \
335+
stdlib__Float_u.cmi
336+
stdlib__Float_u.cmi : float_u.mli \
337+
stdlib.cmi
328338
stdlib__Format.cmo : format.ml \
329339
stdlib__String.cmi \
330340
stdlib.cmi \

ocaml/stdlib/Makefile

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,29 @@ stdlib.cmx: stdlib.ml
220220
-pp "$(AWK) -f ./expand_module_aliases.awk" -c $<
221221

222222

223+
# special cases to add the extension flag when compiling float_u
224+
# CR layouts: eventually these can be just [-extension layouts]
225+
stdlib__Float_u.cmi:
226+
$(CAMLC) $(COMPFLAGS) -extension layouts_alpha \
227+
-o $@ -c $(filter %.mli, $^)
228+
229+
stdlib__Float_u.cmo:
230+
$(CAMLC) $(COMPFLAGS) -extension layouts_alpha \
231+
-o $@ -c $(filter %.ml, $^)
232+
233+
stdlib__Float_u.cmx:
234+
$(CAMLOPT) $(COMPFLAGS) $(OPTCOMPFLAGS) -extension layouts_alpha \
235+
-o $@ -c $(filter %.ml, $^)
236+
237+
float_u.cmi: %.mli
238+
$(CAMLC) $(COMPFLAGS) -extension layouts_alpha -c $<
239+
240+
float_u.cmo: %.ml
241+
$(CAMLC) $(COMPFLAGS) -extension layouts_alpha -c $<
242+
243+
float_u.cmx: %.ml
244+
$(CAMLOPT) $(COMPFLAGS) $(OPTCOMPFLAGS) -extension layouts_alpha -c $<
245+
223246
%.cmi: %.mli
224247
$(CAMLC) $(COMPFLAGS) -c $<
225248

ocaml/stdlib/StdlibModules

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ STDLIB_MODULE_BASENAMES = \
3838
stdlib pervasives either \
3939
sys obj camlinternalLazy lazy \
4040
seq option result bool char uchar \
41-
list int bytes string unit marshal array iarray float int32 int64 nativeint \
41+
list int bytes string unit marshal array iarray float float_u int32 int64 nativeint \
4242
lexing parsing set map stack queue stream buffer \
4343
camlinternalFormat printf arg atomic \
4444
printexc fun gc digest random hashtbl weak \

ocaml/stdlib/dune

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
(install
4444
(files
4545
Makefile.config
46+
ocaml_compiler_internal_params
4647

4748
camlheader
4849
camlheaderd
@@ -104,6 +105,8 @@
104105
filename.mli
105106
float.ml
106107
float.mli
108+
float_u.ml
109+
float_u.mli
107110
format.ml
108111
format.mli
109112
fun.ml
@@ -240,6 +243,9 @@
240243
.stdlib.objs/byte/stdlib__Float.cmi
241244
.stdlib.objs/byte/stdlib__Float.cmt
242245
.stdlib.objs/byte/stdlib__Float.cmti
246+
.stdlib.objs/byte/stdlib__Float_u.cmi
247+
.stdlib.objs/byte/stdlib__Float_u.cmt
248+
.stdlib.objs/byte/stdlib__Float_u.cmti
243249
.stdlib.objs/byte/stdlib__Format.cmi
244250
.stdlib.objs/byte/stdlib__Format.cmt
245251
.stdlib.objs/byte/stdlib__Format.cmti
@@ -413,6 +419,7 @@
413419
.stdlib.objs/native/stdlib__StdLabels.cmx
414420
.stdlib.objs/native/stdlib__Weak.cmx
415421
.stdlib.objs/native/stdlib__Float.cmx
422+
.stdlib.objs/native/stdlib__Float_u.cmx
416423
.stdlib.objs/native/stdlib__Pervasives.cmx
417424
.stdlib.objs/native/stdlib__Fun.cmx
418425
.stdlib.objs/native/stdlib__Bigarray.cmx

ocaml/stdlib/float_u.ml

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
# 1 "float_u.ml"
2+
(**************************************************************************)
3+
(* *)
4+
(* OCaml *)
5+
(* *)
6+
(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
7+
(* Nicolas Ojeda Bar, LexiFi *)
8+
(* *)
9+
(* Copyright 2018 Institut National de Recherche en Informatique et *)
10+
(* en Automatique. *)
11+
(* *)
12+
(* All rights reserved. This file is distributed under the terms of *)
13+
(* the GNU Lesser General Public License version 2.1, with the *)
14+
(* special exception on linking described in the file LICENSE. *)
15+
(* *)
16+
(**************************************************************************)
17+
18+
open! Stdlib
19+
20+
[@@@ocaml.flambda_o3]
21+
22+
23+
external to_float : float# -> (float[@local_opt]) = "%box_float"
24+
25+
external of_float : (float[@local_opt]) -> float# = "%unbox_float"
26+
27+
(* CR layouts: Investigate whether it's worth making these things externals.
28+
Are there situations where the middle-end won't inline them and remove the
29+
boxing/unboxing? *)
30+
31+
let[@inline always] neg x = of_float (Float.neg (to_float x))
32+
33+
let[@inline always] add x y = of_float (Float.add (to_float x) (to_float y))
34+
35+
let[@inline always] sub x y = of_float (Float.sub (to_float x) (to_float y))
36+
37+
let[@inline always] mul x y = of_float (Float.mul (to_float x) (to_float y))
38+
39+
let[@inline always] div x y = of_float (Float.div (to_float x) (to_float y))
40+
41+
let[@inline always] fma x y z = of_float (Float.fma (to_float x) (to_float y) (to_float z))
42+
43+
let[@inline always] rem x y = of_float (Float.rem (to_float x) (to_float y))
44+
45+
let[@inline always] succ x = of_float (Float.succ (to_float x))
46+
47+
let[@inline always] pred x = of_float (Float.pred (to_float x))
48+
49+
let[@inline always] abs x = of_float (Float.abs (to_float x))
50+
51+
let[@inline always] is_finite x = Float.is_finite (to_float x)
52+
53+
let[@inline always] is_infinite x = Float.is_infinite (to_float x)
54+
55+
let[@inline always] is_nan x = Float.is_nan (to_float x)
56+
57+
let[@inline always] is_integer x = Float.is_integer (to_float x)
58+
59+
let[@inline always] of_int x = of_float (Float.of_int x)
60+
61+
let[@inline always] to_int x = Float.to_int (to_float x)
62+
63+
let[@inline always] of_string x = of_float (Float.of_string x)
64+
65+
let[@inline always] to_string x = Float.to_string (to_float x)
66+
67+
type fpclass = Stdlib.fpclass =
68+
FP_normal
69+
| FP_subnormal
70+
| FP_zero
71+
| FP_infinite
72+
| FP_nan
73+
74+
let[@inline always] classify_float x = Float.classify_float (to_float x)
75+
76+
let[@inline always] pow x y = of_float (Float.pow (to_float x) (to_float y))
77+
78+
let[@inline always] sqrt x = of_float (Float.sqrt (to_float x))
79+
80+
let[@inline always] cbrt x = of_float (Float.cbrt (to_float x))
81+
82+
let[@inline always] exp x = of_float (Float.exp (to_float x))
83+
84+
let[@inline always] exp2 x = of_float (Float.exp2 (to_float x))
85+
86+
let[@inline always] log x = of_float (Float.log (to_float x))
87+
88+
let[@inline always] log10 x = of_float (Float.log10 (to_float x))
89+
90+
let[@inline always] log2 x = of_float (Float.log2 (to_float x))
91+
92+
let[@inline always] expm1 x = of_float (Float.expm1 (to_float x))
93+
94+
let[@inline always] log1p x = of_float (Float.log1p (to_float x))
95+
96+
let[@inline always] cos x = of_float (Float.cos (to_float x))
97+
98+
let[@inline always] sin x = of_float (Float.sin (to_float x))
99+
100+
let[@inline always] tan x = of_float (Float.tan (to_float x))
101+
102+
let[@inline always] acos x = of_float (Float.acos (to_float x))
103+
104+
let[@inline always] asin x = of_float (Float.asin (to_float x))
105+
106+
let[@inline always] atan x = of_float (Float.atan (to_float x))
107+
108+
let[@inline always] atan2 x y = of_float (Float.atan2 (to_float x) (to_float y))
109+
110+
let[@inline always] hypot x y = of_float (Float.hypot (to_float x) (to_float y))
111+
112+
let[@inline always] cosh x = of_float (Float.cosh (to_float x))
113+
114+
let[@inline always] sinh x = of_float (Float.sinh (to_float x))
115+
116+
let[@inline always] tanh x = of_float (Float.tanh (to_float x))
117+
118+
let[@inline always] acosh x = of_float (Float.acosh (to_float x))
119+
120+
let[@inline always] asinh x = of_float (Float.asinh (to_float x))
121+
122+
let[@inline always] atanh x = of_float (Float.atanh (to_float x))
123+
124+
let[@inline always] erf x = of_float (Float.erf (to_float x))
125+
126+
let[@inline always] erfc x = of_float (Float.erfc (to_float x))
127+
128+
let[@inline always] trunc x = of_float (Float.trunc (to_float x))
129+
130+
let[@inline always] round x = of_float (Float.round (to_float x))
131+
132+
let[@inline always] ceil x = of_float (Float.ceil (to_float x))
133+
134+
let[@inline always] floor x = of_float (Float.floor (to_float x))
135+
136+
let[@inline always] next_after x y = of_float (Float.next_after (to_float x) (to_float y))
137+
138+
let[@inline always] copy_sign x y = of_float (Float.copy_sign (to_float x) (to_float y))
139+
140+
let[@inline always] sign_bit x = Float.sign_bit (to_float x)
141+
142+
let[@inline always] ldexp x i = of_float (Float.ldexp (to_float x) i)
143+
144+
type t = float#
145+
146+
let[@inline always] compare x y = Float.compare (to_float x) (to_float y)
147+
148+
let[@inline always] equal x y = Float.equal (to_float x) (to_float y)
149+
150+
let[@inline always] min x y = of_float (Float.min (to_float x) (to_float y))
151+
152+
let[@inline always] max x y = of_float (Float.max (to_float x) (to_float y))
153+
154+
let[@inline always] min_num x y = of_float (Float.min_num (to_float x) (to_float y))
155+
156+
let[@inline always] max_num x y = of_float (Float.max_num (to_float x) (to_float y))

0 commit comments

Comments
 (0)