package jasmin

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file armv8a_arch_full.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
(* ARMv8A architecture full integration *)
open Arch_decl

module type Armv8a_input = sig
  val call_conv : (Armv8a_decl.register, Arch_utils.empty, Arch_utils.empty, Arm_common.rflag, Arm_common.condt) calling_convention
end

(* Create arch_toIdent for ARMv8A *)
let atoI armv8a_decl =
  let open Prog in
  let mk_var k t s =
    V.mk s (Reg(k,Direct)) (Conv.ty_of_cty (Type.atype_of_ltype t)) L._dummy [] in
  match Arch_extra.MkAToIdent.mk armv8a_decl mk_var with
  | Utils0.Error e ->
      let e = Conv.error_of_cerror (Printer.pp_err ~debug:true) e in
      raise (Utils.HiError e)
  | Utils0.Ok atoI -> atoI

module Armv8a (Lowering_params : Armv8a_input) = struct
  module AD = Armv8a_decl

  type reg = AD.register
  type regx = Arch_utils.empty
  type xreg = Arch_utils.empty
  type nonrec rflag = Arm_common.rflag
  type cond = Arm_common.condt
  type asm_op = Armv8a_instr_decl.armv8a_asm_op
  type extra_op = Armv8a_extra.armv8a_extra_op

  let atoI = atoI AD.armv8a_decl

  let asm_e = Armv8a_extra.armv8a_extra atoI

  let aparams = Armv8a_params.armv8a_params atoI

  let known_implicits = ["NF", "_nf_"; "ZF", "_zf_"; "CF", "_cf_"; "VF", "_vf_"]

  let alloc_stack_need_extra _ = false

  let is_ct_asm_op (o : asm_op) =
    match o with
    | Armv8a_instr_decl.ARMv8A_op ((Armv8a_instr_decl.SDIV | Armv8a_instr_decl.UDIV), _) -> false
    | _ -> true

  let is_ct_asm_extra (_o : extra_op) = true

  let not_saved_stack = []

  let pp_asm = Pp_arm_v8a.print_prog

  let callstyle = Arch_full.ByReg { call = Some Armv8a_decl.R30; return = true }

  (* SP must stay 16-byte aligned: SP alignment checking, Arm ARM
     DDI0487M.a, D1.4.10.2 (see also the AAPCS64 stack constraints). *)
  let sp_min_align = Wsize.U128

  (* One X-register store; SIMD (NEON) stores would raise this to u128. *)
  let max_store_size = Wsize.U64

  let internal_call_conv = Armv8a_decl.armv8a_internal_call_conv

  include Lowering_params
end