# 2 "asmcomp/arm64/arch.mli" (**************************************************************************) (* *) (* OCaml *) (* *) (* Xavier Leroy, projet Gallium, INRIA Rocquencourt *) (* Benedikt Meurer, University of Siegen *) (* *) (* Copyright 2013 Institut National de Recherche en Informatique et *) (* en Automatique. *) (* Copyright 2012 Benedikt Meurer. *) (* *) (* 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. *) (* *) (**************************************************************************) (* Specific operations for the ARM processor, 64-bit mode *) val macosx : bool val top_bits_ignore : bool (* Machine-specific command-line options *) val command_line_options : (string * Arg.spec * string) list (* Addressing modes *) type addressing_mode = | Iindexed of int (* reg + displ *) | Ibased of string * int (* global var + displ *) (* We do not support the reg + shifted reg addressing mode, because what we really need is reg + shifted reg + displ, and this is decomposed in two instructions (reg + shifted reg -> tmp, then addressing tmp + displ). *) (* Specific operations *) type cmm_label = int (* Do not introduce a dependency to Cmm *) type specific_operation = | Ipoll_far of { return_label: cmm_label option } | Ialloc_far of { bytes : int; dbginfo : Debuginfo.alloc_dbginfo } | Icheckbound_far | Icheckbound_imm_far of { bound : int; } | Ishiftarith of arith_operation * int | Ishiftcheckbound of { shift : int; } | Ishiftcheckbound_far of { shift : int; } | Imuladd (* multiply and add *) | Imulsub (* multiply and subtract *) | Inegmulf (* floating-point negate and multiply *) | Imuladdf (* floating-point multiply and add *) | Inegmuladdf (* floating-point negate, multiply and add *) | Imulsubf (* floating-point multiply and subtract *) | Inegmulsubf (* floating-point negate, multiply and subtract *) | Isqrtf (* floating-point square root *) | Ibswap of int (* endianness conversion *) | Imove32 (* 32-bit integer move *) | Isignext of int (* sign extension *) and arith_operation = Ishiftadd | Ishiftsub (* Sizes, endianness *) val big_endian : bool val size_addr : int val size_int : int val size_float : int val allow_unaligned_access : bool (* Behavior of division *) val division_crashes_on_overflow : bool (* Operations on addressing modes *) val identity_addressing : addressing_mode val offset_addressing : addressing_mode -> int -> addressing_mode (* Printing operations and addressing modes *) val print_addressing : (Format.formatter -> 'a -> unit) -> addressing_mode -> Format.formatter -> 'a array -> unit val print_specific_operation : (Format.formatter -> 'a -> unit) -> specific_operation -> Format.formatter -> 'a array -> unit val is_logical_immediate : nativeint -> bool (* Specific operations that are pure *) val operation_is_pure : specific_operation -> bool (* Specific operations that can raise *) val operation_can_raise : specific_operation -> bool