123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527moduleI=Base.Nativeinttypet=nativeint#let[@inline]globalize(local_(t:t))=tmoduleBoxed=Core.Nativeintexternalof_nativeint:(nativeint[@local_opt])->t@@portable="%unbox_nativeint"externalto_nativeint:t->(nativeint[@local_opt])@@portable="%box_nativeint"(* Note about the implementation strategy:
Most functions in this file are implemented by boxing the int, calling the equivalent
function on boxed ints, and then unboxing the result. This may seem surprising: isn't
the point of unboxed types to avoid boxes? But it's fine; the compiler's middle-end
will reliably eliminate these boxing and unboxing steps, and the testsuite checks there
are no allocations here. If you add new functions, you should add similar tests.
Why is it done this way? Just because it was less work than adding many new primitives
to the compiler. But it is likely we will do that work, one day.
*)let[@inline]selectbt1t2=of_nativeint(Ocaml_intrinsics_kernel.Conditional.select_nativeintb(to_nativeintt1)(to_nativeintt2));;let[@inline]to_intx=(I.to_int[@inlinedhint])(to_nativeintx)let[@inline]of_floatx=of_nativeint((I.of_float[@inlinedhint])x)let[@inline]to_floatt=(I.to_float[@inlinedhint])(to_nativeintt)let[@inline]of_int_exnx=of_nativeint((I.of_int_exn[@inlinedhint])x)moduleShared_derived=structlet[@inline]t_of_sexpx=of_nativeint((I.t_of_sexp[@inlinedhint])x)let%template[@alloca=(heap,stack)][@inline]sexp_of_tt=(I.sexp_of_t[@alloca][@inlinedhint])(to_nativeintt)[@exclave_if_stacka];;letbin_shape_t=Bin_prot_unboxed_numbers.Nativeint_u.bin_shape_t[%%template[@@@mode.defaultm=(global,local)]let[@inlinealways]bin_size_tt=(Bin_prot_unboxed_numbers.Nativeint_u.bin_size_t[@modem][@inlined])t;;let[@inlinealways]bin_write_tbuf~post=(Bin_prot_unboxed_numbers.Nativeint_u.bin_write_t[@modem][@inlined])buf~post;;]let[@inlinealways]bin_read_tbuf~pos_ref=(Bin_prot_unboxed_numbers.Nativeint_u.bin_read_t[@inlined])buf~pos_ref;;let__bin_read_t__=Bin_prot_unboxed_numbers.Nativeint_u.__bin_read_t__letbin_writer_t=Bin_prot_unboxed_numbers.Nativeint_u.bin_writer_tletbin_reader_t=Bin_prot_unboxed_numbers.Nativeint_u.bin_reader_tletbin_t=Bin_prot_unboxed_numbers.Nativeint_u.bin_tlet[@inline]hash_fold_tstatet=(I.hash_fold_t[@inlinedhint])state(to_nativeintt);;let[@inline]hasht=(I.hash[@inlinedhint])(to_nativeintt)lettyperep_of_t=Typerep_lib.Std.Typerep.Nativeint_ulet[@inline]of_stringx=of_nativeint((I.of_string[@inlinedhint])x)let%template[@alloca=(heap,stack)][@inline]to_stringt=(I.to_string[@alloca][@inlinedhint])(to_nativeintt)[@exclave_if_stacka];;let%template[@modem=(global,local)][@inline][@zero_alloc]equalt1t2:bool=(I.equal[@modem])(to_nativeintt1)(to_nativeintt2);;let%template[@modem=(global,local)][@inline][@zero_alloc]comparet1t2:int=(I.compare[@modem])(to_nativeintt1)(to_nativeintt2);;endincludeShared_derived(* Inlined from [Base.Int_conversions], and modified to operate over unboxed things. *)letis_representable_as_int=ifI.num_bits<=(Sys.int_size|>I.of_int)thenfun_->trueelse(letmin=of_int_exnBase.Int.min_valueinletmax=of_int_exnBase.Int.max_valueinfun[@zero_alloc]x->compareminx<=0&&comparexmax<=0);;let[@zero_alloc][@inline]is_representable_as_intx=(is_representable_as_int[@zero_allocassume])x;;(* Inlined from [Base.Int_conversions], and modified to operate over unboxed things. *)let[@cold]to_int_exn_failurexto_string=Base.Printf.failwithf"conversion from nativeint to int failed: %s is out of range"(to_stringx)();;(* We don't implement this as box-then-call-Nativeint-function because this allocates. *)let[@inline]to_int_exnt=ifis_representable_as_inttthenI.to_int_trunc(to_nativeintt)elseto_int_exn_failuretto_string;;let[@inline](>=)t1t2=I.(>=)(to_nativeintt1)(to_nativeintt2)let[@inline](<=)t1t2=I.(<=)(to_nativeintt1)(to_nativeintt2)(* [min] can't be implemented in terms of [Nativeint.min] because that function uses
[caml_csel_value] which forces the integers to be boxed leading to unwanted
allocations. Instead, we have to copy the function definition and use a different
[select] function that knows how to handle unboxed types. *)let[@inline]mint1t2:t=select(t1<=t2)t1t2(* Can't be implemented using [Nativeint.max] for the same reason as [min] *)let[@inline]maxt1t2:t=select(t1>=t2)t1t2let[@inline]ascendingt1t2:int=(I.ascending[@inlinedhint])(to_nativeintt1)(to_nativeintt2);;let[@inline]descendingt1t2:int=(I.descending[@inlinedhint])(to_nativeintt1)(to_nativeintt2);;let[@inline]betweent~low~high:bool=(I.between[@inlinedhint])(to_nativeintt)~low:(to_nativeintlow)~high:(to_nativeinthigh);;let[@inline]clamp_uncheckedt~min:min_~max:max_=(min[@inlinedhint])tmax_|>(max[@inlinedhint])min_;;(* Can't be implemented using [Nativeint.clamp_exn] for the same reason as [min] *)let[@inline]clamp_exnt~min~max=assert(min<=max);(clamp_unchecked[@inlinedhint])t~min~max;;let[@inline]ppppft:unit=(I.pp[@inlinedhint])ppf(to_nativeintt)let[@inline]invariantt:unit=(I.invariant[@inlinedhint])(to_nativeintt)let[@inline]is_positivet=(I.is_positive[@inlinedhint])(to_nativeintt)let[@inline]is_non_negativet=(I.is_non_negative[@inlinedhint])(to_nativeintt)let[@inline]is_negativet=(I.is_negative[@inlinedhint])(to_nativeintt)let[@inline]is_non_positivet=(I.is_non_positive[@inlinedhint])(to_nativeintt)let[@inline]signt=(I.sign[@inlinedhint])(to_nativeintt)let[@inline]to_string_hum?delimitert=(I.to_string_hum[@inlinedhint])?delimiter(to_nativeintt);;letone=of_nativeintI.oneletminus_one=of_nativeintI.minus_onelet[@inline]round?dirt~to_multiple_of:t2=of_nativeint((I.round[@inlinedhint])?dir(to_nativeintt)~to_multiple_of:(to_nativeintt2));;(* let[@inline] round_towards_zero t ~to_multiple_of:t2 =
* of_nativeint
* ((I.round_towards_zero [@inlined hint]) (to_nativeint t) ~to_multiple_of:(to_nativeint t2))
* ;; *)let[@inline]round_downt~to_multiple_of:t2=of_nativeint((I.round_down[@inlinedhint])(to_nativeintt)~to_multiple_of:(to_nativeintt2));;let[@inline]round_upt~to_multiple_of:t2=of_nativeint((I.round_up[@inlinedhint])(to_nativeintt)~to_multiple_of:(to_nativeintt2));;let[@inline]round_nearestt~to_multiple_of:t2=of_nativeint((I.round_nearest[@inlinedhint])(to_nativeintt)~to_multiple_of:(to_nativeintt2));;let[@inline]succt=of_nativeint((I.succ[@inlinedhint])(to_nativeintt))let[@inline]predt=of_nativeint((I.pred[@inlinedhint])(to_nativeintt))let[@inline]powt1t2=of_nativeint((I.pow[@inlinedhint])(to_nativeintt1)(to_nativeintt2));;let[@inline]bit_andt1t2=of_nativeint((I.bit_and[@inlinedhint])(to_nativeintt1)(to_nativeintt2));;let[@inline]bit_ort1t2=of_nativeint((I.bit_or[@inlinedhint])(to_nativeintt1)(to_nativeintt2));;let[@inline]bit_xort1t2=of_nativeint((I.bit_xor[@inlinedhint])(to_nativeintt1)(to_nativeintt2));;let[@inline]bit_nott=of_nativeint((I.bit_not[@inlinedhint])(to_nativeintt))let[@inline]popcountt=(I.popcount[@inlinedhint])(to_nativeintt)|>of_nativeintlet[@inline]shift_lefttx=of_nativeint((I.shift_left[@inlinedhint])(to_nativeintt)x);;let[@inline]shift_righttx=of_nativeint((I.shift_right[@inlinedhint])(to_nativeintt)x);;let[@inline]of_int32_exnx=of_nativeint((I.of_int32_exn[@inlinedhint])x)let[@inline]to_int32_exnt=(I.to_int32_exn[@inlinedhint])(to_nativeintt)let[@inline]of_int64_exnx=of_nativeint((I.of_int64_exn[@inlinedhint])x)let[@inline]to_int64t=(I.to_int64[@inlinedhint])(to_nativeintt)letof_nativeint_exn=of_nativeintletto_nativeint_exn=to_nativeintlet[@inline]of_float_uncheckedf=of_nativeint((I.of_float_unchecked[@inlinedhint])f);;moduleO=structexternalbox:nativeint#->(nativeint[@local_opt])@@portable="%box_nativeint"externalunbox:(nativeint[@local_opt])->nativeint#@@portable="%unbox_nativeint"letzero=of_nativeintI.O.zerolet[@inline](+)t1t2=of_nativeint((I.O.(+)[@inlinedhint])(to_nativeintt1)(to_nativeintt2));;let[@inline](-)t1t2=of_nativeint((I.O.(-)[@inlinedhint])(to_nativeintt1)(to_nativeintt2));;let[@inline](*)t1t2=of_nativeint((I.O.(*)[@inlinedhint])(to_nativeintt1)(to_nativeintt2));;let[@inline](**)t1t2=of_nativeint((I.O.(**)[@inlinedhint])(to_nativeintt1)(to_nativeintt2));;let[@inline](>=)t1t2=(I.O.(>=)[@inlinedhint])(to_nativeintt1)(to_nativeintt2);;let[@inline](<=)t1t2=(I.O.(<=)[@inlinedhint])(to_nativeintt1)(to_nativeintt2);;let[@inline](=)t1t2=(I.O.(=)[@inlinedhint])(to_nativeintt1)(to_nativeintt2);;let[@inline](>)t1t2=(I.O.(>)[@inlinedhint])(to_nativeintt1)(to_nativeintt2);;let[@inline](<)t1t2=(I.O.(<)[@inlinedhint])(to_nativeintt1)(to_nativeintt2);;let[@inline](<>)t1t2=(I.O.(<>)[@inlinedhint])(to_nativeintt1)(to_nativeintt2);;let[@inline]negt=of_nativeint((I.O.neg[@inlinedhint])(to_nativeintt))let[@inline](~-)t=of_nativeint((I.O.(~-)[@inlinedhint])(to_nativeintt))let[@inline]remt1t2=of_nativeint((I.rem[@inlinedhint])(to_nativeintt1)(to_nativeintt2));;let[@inline](/%)t1t2=of_nativeint((I.O.(/%)[@inlinedhint])(to_nativeintt1)(to_nativeintt2));;let[@inline](%)t1t2=of_nativeint((I.O.(%)[@inlinedhint])(to_nativeintt1)(to_nativeintt2));;let[@inline](/)t1t2=of_nativeint((I.O.(/)[@inlinedhint])(to_nativeintt1)(to_nativeintt2));;let[@inline](//)t1t2=(I.O.(//)[@inlinedhint])(to_nativeintt1)(to_nativeintt2);;let[@inline](land)t1t2=of_nativeint((I.O.(land)[@inlinedhint])(to_nativeintt1)(to_nativeintt2));;let[@inline](lor)t1t2=of_nativeint((I.O.(lor)[@inlinedhint])(to_nativeintt1)(to_nativeintt2));;let[@inline](lxor)t1t2=of_nativeint((I.O.(lxor)[@inlinedhint])(to_nativeintt1)(to_nativeintt2));;let[@inline]lnott=of_nativeint((I.O.lnot[@inlinedhint])(to_nativeintt))let[@inline](lsl)tx=of_nativeint((I.O.(lsl)[@inlinedhint])(to_nativeintt)x);;let[@inline](asr)tx=of_nativeint((I.O.(asr)[@inlinedhint])(to_nativeintt)x);;let[@inline](lsr)tx=of_nativeint((I.O.(lsr)[@inlinedhint])(to_nativeintt)x);;let[@inline]abst=of_nativeint((I.O.abs[@inlinedhint])(to_nativeintt))endincludeOletnum_bits=I.num_bitsletmax_value=of_nativeintI.max_valueletmin_value=of_nativeintI.min_valuelet[@inline](lsr)tx=of_nativeint((I.((lsr))[@inlinedhint])(to_nativeintt)x)letshift_right_logical=(lsr)let[@inline]ceil_pow2t=of_nativeint((I.ceil_pow2[@inlinedhint])(to_nativeintt))let[@inline]floor_pow2t=of_nativeint((I.floor_pow2[@inlinedhint])(to_nativeintt))let[@inline]ceil_log2t=(I.ceil_log2[@inlinedhint])(to_nativeintt)|>of_nativeintlet[@inline]floor_log2t=(I.floor_log2[@inlinedhint])(to_nativeintt)|>of_nativeint;;let[@inline]is_pow2t=(I.is_pow2[@inlinedhint])(to_nativeintt)let[@inline]clzt=(I.clz[@inlinedhint])(to_nativeintt)|>of_nativeintlet[@inline]ctzt=(I.ctz[@inlinedhint])(to_nativeintt)|>of_nativeintlet[@inline]of_intx=of_nativeint(I.of_intx)let[@inline]of_int32x=of_nativeint(I.of_int32x)let[@inline]to_int32t=(I.to_int32[@inlinedhint])(to_nativeintt)let[@inline]to_int_trunct=(I.to_int_trunc[@inlinedhint])(to_nativeintt)let[@inline]to_int32_trunct=I.to_int32_trunc(to_nativeintt)let[@inline]of_int64_truncx=of_nativeint(I.of_int64_truncx)let[@inline]bswapt=of_nativeint(I.bswap(to_nativeintt))includestructopenBase_quickchecklet%templatequickcheck_generator=(Generator.Via_thunk.map[@modeportable])Generator.nativeint~f:(funf()->of_nativeint(f()));;let%templatequickcheck_observer=(Observer.Via_thunk.unmap[@modeportable])Observer.nativeint~f:(funf()->to_nativeint(f()));;letquickcheck_shrinker=Shrinker.atomicendmoduleArray_index=structexternalget:('a:anymodseparable).('aarray[@local_opt])->(t[@local_opt])->'a@@portable="%array_safe_get_indexed_by_nativeint#"[@@layout_poly]externalset:('a:anymodseparable).('aarray[@local_opt])->(t[@local_opt])->'a->unit@@portable="%array_safe_set_indexed_by_nativeint#"[@@layout_poly]externalunsafe_get:('a:anymodseparable).('aarray[@local_opt])->(t[@local_opt])->'a@@portable="%array_unsafe_get_indexed_by_nativeint#"[@@layout_poly]externalunsafe_set:('a:anymodseparable).('aarray[@local_opt])->(t[@local_opt])->'a->unit@@portable="%array_unsafe_set_indexed_by_nativeint#"[@@layout_poly]endmoduleArray=structtype('a:word)t='aarrayexternallength:('at[@local_opt])->int@@portable="%array_length"externalget:('at[@local_opt])->int->'a@@portable="%array_safe_get"externalset:('at[@local_opt])->int->'a->unit@@portable="%array_safe_set"externalunsafe_get:('at[@local_opt])->int->'a@@portable="%array_unsafe_get"externalunsafe_set:('at[@local_opt])->int->'a->unit@@portable="%array_unsafe_set"externalcreate_uninitialized:len:int->nativeint#t@@portable="caml_make_unboxed_nativeint_vect_bytecode""caml_make_unboxed_nativeint_vect"externalunsafe_blit:src:('at[@local_opt])->src_pos:int->dst:('at[@local_opt])->dst_pos:int->len:int->unit@@portable="caml_array_blit""caml_unboxed_nativeint_vect_blit"letsexp_of_tsexp_of__aar=letopenBaseinletlst_ref=ref[]infori=lengthar-1downto0dolst_ref:=sexp_of__a(getari)::!lst_refdone;Sexp.List!lst_ref;;endmoduleStable=structmoduleV1=structtypenonrect=tincludeShared_derivedletstable_witness=Ppx_stable_witness_runtime.Stable_witness.assert_stableendendmoduleHex_unsigned=structtypeword_size=|I64|I32letword_size()=matchSys.word_sizewith|64->I64|32->I32|word_size->Base.Printf.failwithf"unsupported word size %d"word_size();;moduleLocal=structtypenonrect=tletcompare=Shared_derived.comparelethash=Shared_derived.hashlethash_fold_t=Shared_derived.hash_fold_tletof_strings=matchword_size()with|I64->of_int64_trunc(Int64_u.box(Int64_u.Hex_unsigned.Local.of_strings))|I32->of_int32(Int32_u.box(Int32_u.Hex_unsigned.of_strings));;lett_of_sexpsexp=matchword_size()with|I64->of_int64_trunc(Int64_u.box(Int64_u.Hex_unsigned.Local.t_of_sexpsexp))|I32->of_int32(Int32_u.box(Int32_u.Hex_unsigned.t_of_sexpsexp));;letto_stringt=exclave_matchword_size()with|I64->Int64_u.Hex_unsigned.Local.to_string(Int64_u.unbox(to_int64t))|I32->(Int32_u.Hex_unsigned.to_string[@allocstack])(Int32_u.unbox(I.to_int32_trunc(to_nativeintt)));;letsexp_of_tt=exclave_matchword_size()with|I64->Int64_u.Hex_unsigned.Local.sexp_of_t(Int64_u.unbox(to_int64t))|I32->(Int32_u.Hex_unsigned.sexp_of_t[@allocstack])(Int32_u.unbox(I.to_int32_trunc(to_nativeintt)));;endtypenonrect=tletcompare=Local.comparelethash=Shared_derived.hashlethash_fold_t=Shared_derived.hash_fold_tletof_string=[%eta1Local.of_string]lett_of_sexp=[%eta1Local.t_of_sexp]letto_stringt=matchword_size()with|I64->Int64_u.Hex_unsigned.to_string(Int64_u.unbox(to_int64t))|I32->Int32_u.Hex_unsigned.to_string(Int32_u.unbox(I.to_int32_trunc(to_nativeintt)));;letsexp_of_tt=matchword_size()with|I64->Int64_u.Hex_unsigned.sexp_of_t(Int64_u.unbox(to_int64t))|I32->Int32_u.Hex_unsigned.sexp_of_t(Int32_u.unbox(I.to_int32_trunc(to_nativeintt)));;end