123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102(**************************************************************************)(* This file is part of BINSEC. *)(* *)(* Copyright (C) 2016-2026 *)(* CEA (Commissariat à l'énergie atomique et aux énergies *)(* alternatives) *)(* *)(* you can redistribute it and/or modify it under the terms of the GNU *)(* Lesser General Public License as published by the Free Software *)(* Foundation, version 2.1. *)(* *)(* It is distributed in the hope that it will be useful, *)(* but WITHOUT ANY WARRANTY; without even the implied warranty of *)(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *)(* GNU Lesser General Public License for more details. *)(* *)(* See the GNU Lesser General Public License version 2.1 *)(* for more details (enclosed in the file licenses/LGPLv2.1). *)(* *)(**************************************************************************)moduleInteger=ZmoduletypeArity=sig(* Symbols and their arities. 'r represents the result type. *)type'rar0type('a,'r)ar1type('a,'b,'r)ar2type('a,'b,'c,'r)ar3type('a,'r)variadicend(* Note: in the following, we distinguish between backward and forward
because there is no need to implement backward transfer functions
for symbols with arity 0. *)(****************************************************************)(* Boolean transfer functions. *)moduletypeBoolean_Backward=sigtypebooleanmoduleArity:Arityvalnot:(boolean,boolean)Arity.ar1val(&&):(boolean,boolean,boolean)Arity.ar2val(||):(boolean,boolean,boolean)Arity.ar2endmoduletypeBoolean_Forward=sigincludeBoolean_Backwardvaltrue_:booleanArity.ar0valfalse_:booleanArity.ar0end(****************************************************************)(* Binary transfer functions. *)(* Note: the size argument, when provided, refers to the size of the
result. *)moduletypeBinary_Backward=sigtypebinarytypebooleanmoduleArity:Arityvalbiadd:size:int->(binary,binary,binary)Arity.ar2valbisub:size:int->(binary,binary,binary)Arity.ar2valbimul:size:int->(binary,binary,binary)Arity.ar2valbeq:size:int->(binary,binary,boolean)Arity.ar2valbisle:size:int->(binary,binary,boolean)Arity.ar2valbislt:size:int->(binary,binary,boolean)Arity.ar2valbiule:size:int->(binary,binary,boolean)Arity.ar2valbiult:size:int->(binary,binary,boolean)Arity.ar2(* First argument become most significant. *)valbconcat:size1:int->size2:int->(binary,binary,binary)Arity.ar2valbextract:lo:int->hi:int->oldsize:int->(binary,binary)Arity.ar1valband:size:int->(binary,binary,binary)Arity.ar2valbor:size:int->(binary,binary,binary)Arity.ar2valbxor:size:int->(binary,binary,binary)Arity.ar2valbuext:size:int->oldsize:int->(binary,binary)Arity.ar1valbsext:size:int->oldsize:int->(binary,binary)Arity.ar1(* Correspond to truncated division, used in C99 and processors. *)valbisdiv:size:int->(binary,binary,binary)Arity.ar2valbisrem:size:int->(binary,binary,binary)Arity.ar2valbiudiv:size:int->(binary,binary,binary)Arity.ar2valbiurem:size:int->(binary,binary,binary)Arity.ar2valbshl:size:int->(binary,binary,binary)Arity.ar2valbashr:size:int->(binary,binary,binary)Arity.ar2valblshr:size:int->(binary,binary,binary)Arity.ar2valbv_left_rotate:size:int->(binary,binary,binary)Arity.ar2valbv_right_rotate:size:int->(binary,binary,binary)Arity.ar2endmoduletypeBinary_Forward=sigincludeBinary_Backwardvalbiconst:size:int->Integer.t->binaryArity.ar0end