123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384(**************************************************************************)(* *)(* OCaml *)(* *)(* Jacob Van Buren, Jane Street, New York *)(* *)(* Copyright 2024 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. *)(* *)(**************************************************************************)[@@@ocaml.flambda_o3]open!Stdlibtypet=int8letsize=8externalof_int:int->int8@@portable="%int8_of_int"externalto_int:int8->int@@portable="%int_of_int8"external(<):int8->int8->bool@@portable="%int8_lessthan"letzero=of_int0letone=of_int1letminus_one=of_int(-1)externalneg:int8->int8@@portable="%int8_neg"externaladd:int8->int8->int8@@portable="%int8_add"externalsub:int8->int8->int8@@portable="%int8_sub"externalmul:int8->int8->int8@@portable="%int8_mul"externaldiv:int8->int8->int8@@portable="%int8_div"externalrem:int8->int8->int8@@portable="%int8_mod"externalsucc:int8->int8@@portable="%int8_succ"externalpred:int8->int8@@portable="%int8_pred"externallogand:int8->int8->int8@@portable="%int8_and"externallogor:int8->int8->int8@@portable="%int8_or"externallogxor:int8->int8->int8@@portable="%int8_xor"let[@inline]lognotx=logxorxminus_oneexternalshift_left:int8->int->int8@@portable="%int8_lsl"externalshift_right:int8->int->int8@@portable="%int8_asr"externalshift_right_logical:int8->int->int8@@portable="%int8_lsr"let[@inline]absx=ifx<zerothennegxelsexexternalequal:int8->int8->bool@@portable="%int8_equal"externalcompare:int8->int8->int@@portable="%int8_compare"let[@inline]minxy=ifx<ythenxelseylet[@inline]maxxy=ifx<ythenyelsexexternalof_float:float->int8@@portable="%int8_of_float"externalto_float:int8->float@@portable="%float_of_int8"let[@inline]to_stringt=Int.to_string(to_intt)externalof_string:string->int8@@portable="caml_int8_of_string"letmax_int=shift_right_logicalminus_one1letmin_int=succmax_intlet[@inline]unsigned_to_intt=to_inttland((1lslsize)-1)externalunsigned_compare:int8->int8->int@@portable="%int8_unsigned_compare"externalunsigned_lt:int8->int8->bool@@portable="%int8_unsigned_lessthan"(* Unsigned division from signed division of the same bitness. See Warren Jr.,
Henry S. (2013). Hacker's Delight (2 ed.), Sec 9-3. *)let[@inline]unsigned_divnd=ifd<zerothenifunsigned_ltndthenzeroelseoneelseletq=shift_left(div(shift_right_logicaln1)d)1inletr=subn(mulqd)inifunsigned_ltrdthenqelsesuccqlet[@inline]unsigned_remnd=subn(mul(unsigned_divnd)d)letseeded_hashseedx=Stdlib.Hashtbl.seeded_hashseed(to_intx)lethashx=Stdlib.Hashtbl.hash(to_intx)