123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155# 2 "float_u.ml"(**************************************************************************)(* *)(* OCaml *)(* *)(* Chris Casinghino, Jane Street, New York *)(* *)(* Copyright 2023 Jane Street Group LLC *)(* *)(* All rights reserved. This file is distributed under the terms of *)(* the GNU Lesser General Public License version 2.1, with the *)(* special exception on linking described in the file LICENSE. *)(* *)(**************************************************************************)open!Stdlib[@@@ocaml.flambda_o3]typet=float#externalto_float:t->(float[@local_opt])@@portable="%box_float"[@@warning"-187"]externalof_float:(float[@local_opt])->t@@portable="%unbox_float"[@@warning"-187"](* CR layouts: Investigate whether it's worth making these things externals.
Are there situations where the middle-end won't inline them and remove the
boxing/unboxing? *)let[@inlinealways]negx=of_float(Float.neg(to_floatx))let[@inlinealways]addxy=of_float(Float.add(to_floatx)(to_floaty))let[@inlinealways]subxy=of_float(Float.sub(to_floatx)(to_floaty))let[@inlinealways]mulxy=of_float(Float.mul(to_floatx)(to_floaty))let[@inlinealways]divxy=of_float(Float.div(to_floatx)(to_floaty))let[@inlinealways]fmaxyz=of_float(Float.fma(to_floatx)(to_floaty)(to_floatz))let[@inlinealways]remxy=of_float(Float.rem(to_floatx)(to_floaty))let[@inlinealways]succx=of_float(Float.succ(to_floatx))let[@inlinealways]predx=of_float(Float.pred(to_floatx))let[@inlinealways]absx=of_float(Float.abs(to_floatx))let[@inlinealways]is_finitex=Float.is_finite(to_floatx)let[@inlinealways]is_infinitex=Float.is_infinite(to_floatx)let[@inlinealways]is_nanx=Float.is_nan(to_floatx)let[@inlinealways]is_integerx=Float.is_integer(to_floatx)let[@inlinealways]of_intx=of_float(Float.of_intx)let[@inlinealways]to_intx=Float.to_int(to_floatx)let[@inlinealways]of_stringx=of_float(Float.of_stringx)let[@inlinealways]to_stringx=Float.to_string(to_floatx)typefpclass=Stdlib.fpclass=FP_normal|FP_subnormal|FP_zero|FP_infinite|FP_nanlet[@inlinealways]classify_floatx=Float.classify_float(to_floatx)let[@inlinealways]powxy=of_float(Float.pow(to_floatx)(to_floaty))let[@inlinealways]sqrtx=of_float(Float.sqrt(to_floatx))let[@inlinealways]cbrtx=of_float(Float.cbrt(to_floatx))let[@inlinealways]expx=of_float(Float.exp(to_floatx))let[@inlinealways]exp2x=of_float(Float.exp2(to_floatx))let[@inlinealways]logx=of_float(Float.log(to_floatx))let[@inlinealways]log10x=of_float(Float.log10(to_floatx))let[@inlinealways]log2x=of_float(Float.log2(to_floatx))let[@inlinealways]expm1x=of_float(Float.expm1(to_floatx))let[@inlinealways]log1px=of_float(Float.log1p(to_floatx))let[@inlinealways]cosx=of_float(Float.cos(to_floatx))let[@inlinealways]sinx=of_float(Float.sin(to_floatx))let[@inlinealways]tanx=of_float(Float.tan(to_floatx))let[@inlinealways]acosx=of_float(Float.acos(to_floatx))let[@inlinealways]asinx=of_float(Float.asin(to_floatx))let[@inlinealways]atanx=of_float(Float.atan(to_floatx))let[@inlinealways]atan2xy=of_float(Float.atan2(to_floatx)(to_floaty))let[@inlinealways]hypotxy=of_float(Float.hypot(to_floatx)(to_floaty))let[@inlinealways]coshx=of_float(Float.cosh(to_floatx))let[@inlinealways]sinhx=of_float(Float.sinh(to_floatx))let[@inlinealways]tanhx=of_float(Float.tanh(to_floatx))let[@inlinealways]acoshx=of_float(Float.acosh(to_floatx))let[@inlinealways]asinhx=of_float(Float.asinh(to_floatx))let[@inlinealways]atanhx=of_float(Float.atanh(to_floatx))let[@inlinealways]erfx=of_float(Float.erf(to_floatx))let[@inlinealways]erfcx=of_float(Float.erfc(to_floatx))let[@inlinealways]truncx=of_float(Float.trunc(to_floatx))let[@inlinealways]roundx=of_float(Float.round(to_floatx))let[@inlinealways]ceilx=of_float(Float.ceil(to_floatx))let[@inlinealways]floorx=of_float(Float.floor(to_floatx))let[@inlinealways]next_afterxy=of_float(Float.next_after(to_floatx)(to_floaty))let[@inlinealways]copy_signxy=of_float(Float.copy_sign(to_floatx)(to_floaty))let[@inlinealways]sign_bitx=Float.sign_bit(to_floatx)let[@inlinealways]ldexpxi=of_float(Float.ldexp(to_floatx)i)let[@inlinealways]comparexy=Float.compare(to_floatx)(to_floaty)let[@inlinealways]equalxy=Float.equal(to_floatx)(to_floaty)let[@inlinealways]minxy=of_float(Float.min(to_floatx)(to_floaty))let[@inlinealways]maxxy=of_float(Float.max(to_floatx)(to_floaty))let[@inlinealways]min_numxy=of_float(Float.min_num(to_floatx)(to_floaty))let[@inlinealways]max_numxy=of_float(Float.max_num(to_floatx)(to_floaty))