123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114(**************************************************************************)(* *)(* 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=int16#letsize=16externalof_int16:int16->int16#@@portable="%int16#_of_int16"externalto_int16:int16#->int16@@portable="%int16_of_int16#"externalof_int:int->int16#@@portable="%int16#_of_int"externalto_int:int16#->int@@portable="%int_of_int16#"external(<):int16#->int16#->bool@@portable="%int16#_lessthan"letzero()=of_int0letone()=of_int1letminus_one()=of_int(-1)externalneg:int16#->int16#@@portable="%int16#_neg"externaladd:int16#->int16#->int16#@@portable="%int16#_add"externalsub:int16#->int16#->int16#@@portable="%int16#_sub"externalmul:int16#->int16#->int16#@@portable="%int16#_mul"externaldiv:int16#->int16#->int16#@@portable="%int16#_div"externalrem:int16#->int16#->int16#@@portable="%int16#_mod"externalsucc:int16#->int16#@@portable="%int16#_succ"externalpred:int16#->int16#@@portable="%int16#_pred"externallogand:int16#->int16#->int16#@@portable="%int16#_and"externallogor:int16#->int16#->int16#@@portable="%int16#_or"externallogxor:int16#->int16#->int16#@@portable="%int16#_xor"let[@inline]lognotx=logxorx(minus_one())externalshift_left:int16#->int->int16#@@portable="%int16#_lsl"externalshift_right:int16#->int->int16#@@portable="%int16#_asr"externalshift_right_logical:int16#->int->int16#@@portable="%int16#_lsr"let[@inline]absx=ifx<zero()thennegxelsexexternalequal:int16#->int16#->bool@@portable="%int16#_equal"externalcompare:int16#->int16#->int@@portable="%int16#_compare"let[@inline]minxy=ifx<ythenxelseylet[@inline]maxxy=ifx<ythenyelsexexternalof_float:float->int16#@@portable="%int16#_of_float"externalto_float:int16#->float@@portable="%float_of_int16#"let[@inline]to_stringt=Int.to_string(to_intt)let[@inline]of_strings=of_int16(Int16.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:int16#->int16#->int@@portable="%int16#_unsigned_compare"externalunsigned_lt:int16#->int16#->bool@@portable="%int16#_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)