123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113(**************************************************************************)(* *)(* 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=int8#letsize=8externalof_int8:int8->int8#@@portable="%int8#_of_int8"externalto_int8:int8#->int8@@portable="%int8_of_int8#"externalof_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=logxorx(minus_one())externalshift_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<zero()thennegxelsexexternalequal: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)let[@inline]of_strings=of_int8(Int8.of_strings)letmax_int()=shift_right_logical(minus_one())1letmin_int()=succ(max_int())let[@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<zero()thenifunsigned_ltndthenzero()elseone()elseletq=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)