(*Generated by Sail from armV8.sail.*) open import Pervasives_extra open import Sail_impl_base open import State open import Sail_values open import ArmV8_embed_types open import ArmV8_extras_embed_sequential let lsl' (n, m) = n * (pow (2:ii) m) let not_implemented message = exit message let not_implemented_extern message = exit message let info message = () let UNKNOWN = (0:ii) let M32_User = Vector [B1;B0;B0;B0;B0] 4 false let M32_FIQ = Vector [B1;B0;B0;B0;B1] 4 false let M32_IRQ = Vector [B1;B0;B0;B1;B0] 4 false let M32_Svc = Vector [B1;B0;B0;B1;B1] 4 false let M32_Monitor = Vector [B1;B0;B1;B1;B0] 4 false let M32_Abort = Vector [B1;B0;B1;B1;B1] 4 false let M32_Hyp = Vector [B1;B1;B0;B1;B0] 4 false let M32_Undef = Vector [B1;B1;B0;B1;B1] 4 false let M32_System = Vector [B1;B1;B1;B1;B1] 4 false let EL3 = Vector [B1;B1] 1 false let EL2 = Vector [B1;B0] 1 false let EL1 = Vector [B0;B1] 1 false let EL0 = Vector [B0;B0] 1 false let DebugHalt_Breakpoint = Vector [B0;B0;B0;B1;B1;B1] 5 false let DebugHalt_EDBGRQ = Vector [B0;B1;B0;B0;B1;B1] 5 false let DebugHalt_Step_Normal = Vector [B0;B1;B1;B0;B1;B1] 5 false let DebugHalt_Step_Exclusive = Vector [B0;B1;B1;B1;B1;B1] 5 false let DebugHalt_OSUnlockCatch = Vector [B1;B0;B0;B0;B1;B1] 5 false let DebugHalt_ResetCatch = Vector [B1;B0;B0;B1;B1;B1] 5 false let DebugHalt_Watchpoint = Vector [B1;B0;B1;B0;B1;B1] 5 false let DebugHalt_HaltInstruction = Vector [B1;B0;B1;B1;B1;B1] 5 false let DebugHalt_SoftwareAccess = Vector [B1;B1;B0;B0;B1;B1] 5 false let DebugHalt_ExceptionCatch = Vector [B1;B1;B0;B1;B1;B1] 5 false let DebugHalt_Step_NoSyndrome = Vector [B1;B1;B1;B0;B1;B1] 5 false let HighestSetBit x = let N = length (reset_vector_start (set_vector_start_to_length x)) in let result = (0:ii) in let break = B0 in let (break, result) = (foreach_dec (N - (1:ii),(0:ii),(1:ii)) (break,result) (fun i (break,result) -> let (result, break) = if bitU_to_bool ((~break) &. (eq (match (access (set_vector_start_to_length x) i) with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)))) then let result = i in let break = B1 in (result,break) else (result,break) in (break,result))) in if bitU_to_bool break then Just result else Nothing let IsZero x = eq_vec_range (set_vector_start_to_length x, (0:ii)) let NOT x = set_vector_start_to_length (bitwise_not (reset_vector_start (set_vector_start_to_length x))) let NOT' x = ~x let SInt x = signed (reset_vector_start (set_vector_start_to_length x)) let UInt x = unsigned (reset_vector_start (set_vector_start_to_length x)) let Zeros N' = set_vector_start_to_length (to_vec_dec (N',(0:ii))) let BitReverse data = let N = length (reset_vector_start (set_vector_start_to_length data)) in let result = set_vector_start_to_length (to_vec_dec (length data,(0:ii))) in (foreach_inc ((0:ii),N - (1:ii),(1:ii)) result (fun i result -> update_pos result ((N - i) - (1:ii)) (access (set_vector_start_to_length data) i))) let ELUsingAArch32 el = B0 let Hint_Yield () = () let SendEvent () = () let Unreachable () = assert' B0 (Just "Unreachable reached") let UsingAArch32 () = B0 let _Rs = Vector ["R30";"R29";"R28";"R27";"R26";"R25";"R24";"R23";"R22";"R21";"R20";"R19";"R18";"R17";"R16";"R15";"R14";"R13";"R12";"R11";"R10"; "R9";"R8";"R7";"R6";"R5";"R4";"R3";"R2";"R1";"R0"] 30 false let IMPLEMENTATION_DEFINED = <| IMPLEMENTATION_DEFINED_type_HaveCRCExt = B1; IMPLEMENTATION_DEFINED_type_HaveAArch32EL = B0; IMPLEMENTATION_DEFINED_type_HaveAnyAArch32 = B0; IMPLEMENTATION_DEFINED_type_HaveEL2 = B0; IMPLEMENTATION_DEFINED_type_HaveEL3 = B0; IMPLEMENTATION_DEFINED_type_HighestELUsingAArch32 = B0; IMPLEMENTATION_DEFINED_type_IsSecureBelowEL3 = B0 |> let AArch64_ResetControlRegisters cold_reset = () let DCPSInstruction target_el = not_implemented "DCPSInstruction" let DRPSInstruction () = not_implemented "DRPSInstruction" let Halt reason = not_implemented "Halt" let Align' (x, y) = y * (quot x y) let CountLeadingZeroBits x = match (HighestSetBit (reset_vector_start (set_vector_start_to_length x))) with | Nothing -> length (reset_vector_start (set_vector_start_to_length x)) | Just (n) -> ((length (reset_vector_start (set_vector_start_to_length x))) - (1:ii)) - n end let IsZeroBit x = if bitU_to_bool (IsZero (reset_vector_start (set_vector_start_to_length x))) then B1 else B0 let LSL_C (x, shift) = let extended_x = set_vector_start_to_length ((set_vector_start_to_length x) ^^ (set_vector_start_to_length (set_vector_start_to_length (Zeros shift)))) in let result = set_vector_start_to_length (set_vector_start_to_length (mask (length x,reset_vector_start (set_vector_start_to_length extended_x)))) in let carry_out = access (set_vector_start_to_length extended_x) (length (reset_vector_start (set_vector_start_to_length x))) in (set_vector_start_to_length result,carry_out) let Min (a, b) = if bitU_to_bool (lteq (a, b)) then a else b let uMin (a, b) = if bitU_to_bool (lteq (a, b)) then a else b let Replicate (N', x) = let (N, M) = (length (reset_vector_start (set_vector_start_to_length (to_vec_dec (N',(0:ii))))),length (reset_vector_start (set_vector_start_to_length (to_vec_dec (length x, (0:ii)))))) in let _ = assert' (eq_range (modulo N M, (0:ii))) (Nothing) in let result = set_vector_start_to_length (to_vec_dec (N',(0:ii))) in let zeros = set_vector_start_to_length (Zeros ((length result) - (length x))) in (foreach_inc (M,N,M) result (fun i result -> set_vector_start_to_length (bitwise_or (set_vector_start_to_length (bitwise_leftshift (set_vector_start_to_length result, M)), set_vector_start_to_length ((set_vector_start_to_length zeros) ^^ (set_vector_start_to_length x)))))) let ZeroExtend (N', x) = set_vector_start_to_length ((set_vector_start_to_length (set_vector_start_to_length (Zeros (N' + ((length x) * ((0-1):ii)))))) ^^ (set_vector_start_to_length x)) let Poly32Mod2 (data, poly) = let result = set_vector_start_to_length data in let N = length (reset_vector_start (set_vector_start_to_length data)) in let _ = assert' (gt (N, (32:ii))) (Nothing) in let data' = set_vector_start_to_length data in let zeros = set_vector_start_to_length (Zeros ((length data) - (32:ii))) in let data' = (foreach_dec (N - (1:ii),(32:ii),(1:ii)) data' (fun i data' -> if bitU_to_bool (eq (match (access (set_vector_start_to_length data') i) with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then update data' (i - (1:ii)) (0:ii) (set_vector_start_to_length (bitwise_xor (set_vector_start_to_length (slice (set_vector_start_to_length data') (i - (1:ii)) (0:ii)), set_vector_start_to_length ((set_vector_start_to_length poly) ^^ (set_vector_start_to_length (slice (set_vector_start_to_length zeros) (i - (33:ii)) (0:ii))))))) else data')) in slice (set_vector_start_to_length data') (31:ii) (0:ii) let ClearExclusiveLocal processorid = info "The model does not implement the exclusive monitors explicitly." let ProcessorID () = (0:ii) let rec BigEndianReverse value = let width = length (reset_vector_start (set_vector_start_to_length value)) in let half = quot width (2:ii) in if bitU_to_bool (eq_range (width, (8:ii))) then set_vector_start_to_length value else set_vector_start_to_length ((set_vector_start_to_length (BigEndianReverse (reset_vector_start (set_vector_start_to_length (slice (set_vector_start_to_length value) (half - (1:ii)) (0:ii)))))) ^^ (set_vector_start_to_length (BigEndianReverse (reset_vector_start (set_vector_start_to_length (slice (set_vector_start_to_length value) (width - (1:ii)) half)))))) let ClearEventRegister () = not_implemented_extern "ClearEventRegister" let EventRegisterSet () = not_implemented_extern "EventRegisterSet" let EventRegistered () = not_implemented_extern "EventRegistered" let InterruptPending () = not_implemented_extern "InterruptPending" let WaitForEvent () = not_implemented_extern "WaitForEvent" let WaitForInterrupt () = not_implemented_extern "WaitForInterrupt" let AArch64_SPAlignmentFault () = not_implemented "AArch64_SPAlignmentFault" let AArch64_SoftwareBreakpoint immediate = not_implemented "AArch64_SoftwareBreakpoint" let AArch64_CallHypervisor immediate = not_implemented "AArch64_CallHypervisor" let AArch64_CallSecureMonitor immediate = not_implemented "AArch64_CallSecureMonitor" let AArch64_CallSupervisor immediate = not_implemented "AArch64_CallSupervisor" let AArch64_SystemRegisterTrap (target_el, op0, op2, op1, crn, rt, crm, dir) = not_implemented "AArch64_SystemRegisterTrap" let AArch64_UndefinedFault () = not_implemented "AArch64_UndefinedFault" let rPC () = read_reg _PC let AArch64_ExceptionReturn (new_pc, spsr) = not_implemented "AArch64_ExceptionReturn" let UInt_reg x = unsigned x let signalDBGEN () = not_implemented_extern "signalDBGEN" let signelNIDEN () = not_implemented_extern "signalNIDEN" let signalSPIDEN () = not_implemented_extern "signalSPIDEN" let signalDPNIDEN () = not_implemented_extern "signalSPNIDEN" let Halted () = read_reg_field EDSCR "STATUS" >>= fun w__0 -> read_reg_field EDSCR "STATUS" >>= fun w__1 -> return (~((eq_vec (set_vector_start_to_length w__0, set_vector_start_to_length (Vector [B0;B0;B0;B0;B0;B1] 5 false))) |. (eq_vec (set_vector_start_to_length w__1, set_vector_start_to_length (Vector [B0;B0;B0;B0;B1;B0] 5 false))))) let HaveCRCExt () = IMPLEMENTATION_DEFINED.IMPLEMENTATION_DEFINED_type_HaveCRCExt let ExclusiveMonitorsStatus () = let _ = info "The model does not implement the exclusive monitors explicitly." in not_implemented "ExclusiveMonitorsStatus should not be called" >> return B0 let Hint_Branch hint = info "This hint can be used for hardware optimization that has no effect on the model." let ResetExternalDebugRegisters b = not_implemented_extern "ResetExternalDebugRegisters" let HaveAnyAArch32 () = IMPLEMENTATION_DEFINED.IMPLEMENTATION_DEFINED_type_HaveAnyAArch32 let AArch64_WFxTrap (target_el, is_wfe) = not_implemented "AArch64_WFxTrap" let AArch64_CheckUnallocatedSystemAccess (op0, op1, crn, crm, op2, read) = match (op0,op1,crn,crm,op2,read) with | (Vector [B0;B0] _ _, Vector [B0;B0;B0] _ _, Vector [B0;B1;B0;B0] _ _, _, Vector [B1;B0;B1] _ _, _) -> read_reg_field CurrentEL "EL" >>= fun w__0 -> return (lt_vec (set_vector_start_to_length w__0, set_vector_start_to_length EL1)) | (Vector [B0;B0] _ _, Vector [B0;B1;B1] _ _, Vector [B0;B1;B0;B0] _ _, _, Vector [B1;B1;B0] _ _, _) -> return B0 | (Vector [B0;B0] _ _, Vector [B0;B1;B1] _ _, Vector [B0;B1;B0;B0] _ _, _, Vector [B1;B1;B1] _ _, _) -> return B0 | (Vector [B1;B1] _ _, Vector [B0;B1;B1] _ _, Vector [B0;B1;B0;B0] _ _, Vector [B0;B0;B1;B0] _ _, Vector [B0;B0;B0] _ _, _) -> return B0 | (Vector [B1;B1] _ _, Vector [B0;B1;B1] _ _, Vector [B0;B1;B0;B0] _ _, Vector [B0;B0;B1;B0] _ _, Vector [B0;B0;B1] _ _, _) -> return B0 end let SysOp_R (op0, op1, crn, crm, op2) = not_implemented "SysOp_R" >> return (to_vec_dec ((64:ii),(0:ii))) let SysOp_W (op0, op1, crn, crm, op2, _val) = not_implemented "SysOp_W" let TxNestingLevelfp = RFull "TxNestingLevel" let TXIDR_EL0_DEPTHfp = RField ("TXIDR_EL0","DEPTH") let PSTATE_Nfp = RField ("NZCV","N") let PSTATE_Zfp = RField ("NZCV","Z") let PSTATE_Cfp = RField ("NZCV","C") let PSTATE_Vfp = RField ("NZCV","V") let PSTATE_Dfp = RField ("DAIF","D") let PSTATE_Afp = RField ("DAIF","A") let PSTATE_Ifp = RField ("DAIF","I") let PSTATE_Ffp = RField ("DAIF","F") let PSTATE_ELfp = RFull "CurrentEL" let PSTATE_SPfp = RField ("SPSel","SP") let _PCfp = RFull "_PC" let Hint_Prefetch (addr, hint, target, stream) = () let AArch64_IsExclusiveVA (address, processorid, size) = let _ = info "The model does not implement the exclusive monitors explicitly." in B1 let AArch64_MarkExclusiveVA (address, processorid, size) = info "The model does not implement the exclusive monitors explicitly." let wPSTATE_NZCV ((), Vector [n;z;c;v] _ _) = write_reg_bitfield NZCV "N" n >> write_reg_bitfield NZCV "Z" z >> write_reg_bitfield NZCV "C" c >> write_reg_bitfield NZCV "V" v let wPSTATE_DAIF ((), Vector [d;a;i;f] _ _) = write_reg_bitfield DAIF "D" d >> write_reg_bitfield DAIF "A" a >> write_reg_bitfield DAIF "I" i >> write_reg_bitfield DAIF "F" f let Int (x, unsigned) = if bitU_to_bool unsigned then UInt (reset_vector_start (set_vector_start_to_length x)) else SInt (reset_vector_start (set_vector_start_to_length x)) let ClearExclusiveByAddress (paddress, processorid, size) = info "The model does not implement the exclusive monitors explicitly." let IsExclusiveGlobal (paddress, processorid, size) = let _ = info "The model does not implement the exclusive monitors explicitly." in B1 let IsExclusiveLocal (paddress, processorid, size) = let _ = info "The model does not implement the exclusive monitors explicitly." in B1 let MarkExclusiveGlobal (paddress, processorid, size) = info "The model does not implement the exclusive monitors explicitly." let MarkExclusiveLocal (paddress, processorid, size) = info "The model does not implement the exclusive monitors explicitly." let PAMax () = let pa_size = (0:ii) in read_reg_field ID_AA64MMFR0_EL1 "PARange" >>= fun w__0 -> let pa_size = match w__0 with | Vector [B0;B0;B0;B0] _ _ -> (32:ii) | Vector [B0;B0;B0;B1] _ _ -> (36:ii) | Vector [B0;B0;B1;B0] _ _ -> (40:ii) | Vector [B0;B0;B1;B1] _ _ -> (42:ii) | Vector [B0;B1;B0;B0] _ _ -> (44:ii) | Vector [B0;B1;B0;B1] _ _ -> (48:ii) | _ -> pa_size end in return pa_size let AddWithCarry (x, y, carry_in) = let unsigned_sum = ((UInt (reset_vector_start (set_vector_start_to_length x))) + (UInt (reset_vector_start (set_vector_start_to_length y)))) + (UInt (reset_vector_start (set_vector_start_to_length (Vector [carry_in] 0 false)))) in let signed_sum = ((SInt (reset_vector_start (set_vector_start_to_length x))) + (SInt (reset_vector_start (set_vector_start_to_length y)))) + (UInt (reset_vector_start (set_vector_start_to_length (Vector [carry_in] 0 false)))) in let result = set_vector_start_to_length (to_vec_dec (length x,unsigned_sum)) in let n = access (set_vector_start_to_length result) ((length (reset_vector_start (set_vector_start_to_length result))) - (1:ii)) in let z = if bitU_to_bool (IsZero (reset_vector_start (set_vector_start_to_length result))) then B1 else B0 in let c = if bitU_to_bool (eq_range (UInt (reset_vector_start (set_vector_start_to_length result)), unsigned_sum)) then B0 else B1 in let v = if bitU_to_bool (eq_range (SInt (reset_vector_start (set_vector_start_to_length result)), signed_sum)) then B0 else B1 in (set_vector_start_to_length result,set_vector_start 3 ((set_vector_start_to_length (Vector [n] 0 false)) ^^ (set_vector_start_to_length ((set_vector_start_to_length (Vector [z] 0 false)) ^^ (set_vector_start_to_length ((set_vector_start_to_length (Vector [c] 0 false)) ^^ (set_vector_start_to_length (Vector [v] 0 false)))))))) let ConditionHolds _cond = let result = B0 in match (slice _cond (3:ii) (1:ii)) with | Vector [B0;B0;B0] _ _ -> read_reg_bitfield NZCV "Z" >>= fun w__0 -> let result = eq (match w__0 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in return result | Vector [B0;B0;B1] _ _ -> read_reg_bitfield NZCV "C" >>= fun w__1 -> let result = eq (match w__1 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in return result | Vector [B0;B1;B0] _ _ -> read_reg_bitfield NZCV "N" >>= fun w__2 -> let result = eq (match w__2 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in return result | Vector [B0;B1;B1] _ _ -> read_reg_bitfield NZCV "V" >>= fun w__3 -> let result = eq (match w__3 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in return result | Vector [B1;B0;B0] _ _ -> read_reg_bitfield NZCV "C" >>= fun w__4 -> read_reg_bitfield NZCV "Z" >>= fun w__5 -> let result = (eq (match w__4 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) &. (eq (match w__5 with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) in return result | Vector [B1;B0;B1] _ _ -> read_reg_bitfield NZCV "N" >>= fun w__6 -> read_reg_bitfield NZCV "V" >>= fun w__7 -> let result = eq_bit (w__6, w__7) in return result | Vector [B1;B1;B0] _ _ -> read_reg_bitfield NZCV "N" >>= fun w__8 -> read_reg_bitfield NZCV "V" >>= fun w__9 -> read_reg_bitfield NZCV "Z" >>= fun w__10 -> let result = (eq_bit (w__8, w__9)) &. (eq (match w__10 with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) in return result | Vector [B1;B1;B1] _ _ -> return B1 end >>= fun result -> let result = if bitU_to_bool ((eq (match (access _cond (0:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) &. (neq_vec (set_vector_start_to_length _cond, set_vector_start_to_length (Vector [B1;B1;B1;B1] 3 false)))) then ~result else result in return result let DecodeShift op = match toNatural (unsigned (reset_vector_start op)) with | (0:nn) -> ShiftType_LSL | (1:nn) -> ShiftType_LSR | (2:nn) -> ShiftType_ASR | (3:nn) -> ShiftType_ROR end let HaveEL el = if bitU_to_bool ((eq_vec (set_vector_start_to_length el, set_vector_start_to_length EL1)) |. (eq_vec (set_vector_start_to_length el, set_vector_start_to_length EL0))) then B1 else if bitU_to_bool (eq_vec (set_vector_start_to_length el, set_vector_start_to_length EL2)) then IMPLEMENTATION_DEFINED.IMPLEMENTATION_DEFINED_type_HaveEL2 else if bitU_to_bool (eq_vec (set_vector_start_to_length el, set_vector_start_to_length EL3)) then IMPLEMENTATION_DEFINED.IMPLEMENTATION_DEFINED_type_HaveEL3 else let _ = assert' B0 (Nothing) in B0 let System_Put (op0, op1, crn, crm, op2, _val) = match toNaturalFiveTup (op0,op1,crn,crm,op2) with | ((3:nn), (3:nn), (4:nn), (2:nn), (0:nn)) -> write_reg NZCV (slice _val (31:ii) (0:ii)) | ((3:nn), (3:nn), (4:nn), (2:nn), (1:nn)) -> write_reg DAIF (slice _val (31:ii) (0:ii)) | ((3:nn), (3:nn), (13:nn), (0:nn), (2:nn)) -> write_reg TPIDR_EL0 (slice _val (63:ii) (0:ii)) end let DataSynchronizationBarrier (domain, types) = (if bitU_to_bool (neq (domain, MBReqDomain_FullSystem)) then not_implemented "DataSynchronizationBarrier: not MBReqDomain_FullSystem" else return ()) >> match types with | MBReqTypes_Reads -> DataSynchronizationBarrier_Reads () | MBReqTypes_Writes -> DataSynchronizationBarrier_Writes () | MBReqTypes_All -> DataSynchronizationBarrier_All () end let rELR el = let r = to_vec_dec ((64:ii),(0:ii)) in if bitU_to_bool (eq_vec (set_vector_start_to_length el, set_vector_start_to_length EL1)) then read_reg ELR_EL1 else if bitU_to_bool (eq_vec (set_vector_start_to_length el, set_vector_start_to_length EL2)) then read_reg ELR_EL2 else if bitU_to_bool (eq_vec (set_vector_start_to_length el, set_vector_start_to_length EL3)) then read_reg ELR_EL3 else return r let DataMemoryBarrier (domain, types) = (if bitU_to_bool ((neq (domain, MBReqDomain_FullSystem)) &. (neq (domain, MBReqDomain_InnerShareable))) then not_implemented "DataMemoryBarrier: not MBReqDomain_FullSystem or _InnerShareable" else return ()) >> match types with | MBReqTypes_Reads -> DataMemoryBarrier_Reads () | MBReqTypes_Writes -> DataMemoryBarrier_Writes () | MBReqTypes_All -> DataMemoryBarrier_All () end let wMem_Addr (address, size, acctype, excl) = match (excl,acctype) with | (B0, AccType_NORMAL) -> wMem_Addr_NORMAL (reset_vector_start address,size) | (B0, AccType_STREAM) -> wMem_Addr_NORMAL (reset_vector_start address,size) | (B0, AccType_UNPRIV) -> wMem_Addr_NORMAL (reset_vector_start address,size) | (B0, AccType_ORDERED) -> wMem_Addr_ORDERED (reset_vector_start address,size) | (B1, AccType_ATOMIC) -> wMem_Addr_ATOMIC (reset_vector_start address,size) | (B1, AccType_ORDERED) -> wMem_Addr_ATOMIC_ORDERED (reset_vector_start address,size) | _ -> not_implemented "unrecognised memory access" end let SCTLR regime = if bitU_to_bool (eq_vec (set_vector_start_to_length regime, set_vector_start_to_length EL1)) then SCTLR_EL1 else if bitU_to_bool (eq_vec (set_vector_start_to_length regime, set_vector_start_to_length EL2)) then SCTLR_EL2 else if bitU_to_bool (eq_vec (set_vector_start_to_length regime, set_vector_start_to_length EL3)) then SCTLR_EL3 else let _ = assert' B0 (Just "SCTLR_type unreachable") in SCTLR_EL1 let DecodeRegExtend op = match op with | Vector [B0;B0;B0] _ _ -> ExtendType_UXTB | Vector [B0;B0;B1] _ _ -> ExtendType_UXTH | Vector [B0;B1;B0] _ _ -> ExtendType_UXTW | Vector [B0;B1;B1] _ _ -> ExtendType_UXTX | Vector [B1;B0;B0] _ _ -> ExtendType_SXTB | Vector [B1;B0;B1] _ _ -> ExtendType_SXTH | Vector [B1;B1;B0] _ _ -> ExtendType_SXTW | Vector [B1;B1;B1] _ _ -> ExtendType_SXTX end let rSP N' = read_reg_bitfield SPSel "SP" >>= fun w__0 -> if bitU_to_bool (eq (match w__0 with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) then read_reg SP_EL0 >>= fun w__1 -> return (set_vector_start_to_length (mask (N',w__1))) else read_reg_field CurrentEL "EL" >>= fun pstate_el -> if bitU_to_bool (eq_vec (set_vector_start_to_length pstate_el, set_vector_start_to_length EL0)) then read_reg SP_EL0 >>= fun w__2 -> return (set_vector_start_to_length (mask (N',w__2))) else if bitU_to_bool (eq_vec (set_vector_start_to_length pstate_el, set_vector_start_to_length EL1)) then read_reg SP_EL1 >>= fun w__3 -> return (set_vector_start_to_length (mask (N',w__3))) else if bitU_to_bool (eq_vec (set_vector_start_to_length pstate_el, set_vector_start_to_length EL2)) then read_reg SP_EL2 >>= fun w__4 -> return (set_vector_start_to_length (mask (N',w__4))) else if bitU_to_bool (eq_vec (set_vector_start_to_length pstate_el, set_vector_start_to_length EL3)) then read_reg SP_EL3 >>= fun w__5 -> return (set_vector_start_to_length (mask (N',w__5))) else let _ = assert' B0 (Nothing) in read_reg SP_EL3 >>= fun w__6 -> return (set_vector_start_to_length (mask (N',w__6))) let rSPSR () = let result = to_vec_dec ((32:ii),(0:ii)) in if bitU_to_bool (UsingAArch32 ()) then not_implemented "rSPSR UsingAArch32" >> return result else read_reg_field CurrentEL "EL" >>= fun pstate_el -> if bitU_to_bool (eq_vec (set_vector_start_to_length pstate_el, set_vector_start_to_length EL1)) then read_reg SPSR_EL1 else if bitU_to_bool (eq_vec (set_vector_start_to_length pstate_el, set_vector_start_to_length EL2)) then read_reg SPSR_EL2 else if bitU_to_bool (eq_vec (set_vector_start_to_length pstate_el, set_vector_start_to_length EL3)) then read_reg SPSR_EL3 else return result let _R = Vector [UndefinedRegister 0;R30;R29;R28;R27;R26;R25;R24;R23;R22;R21;R20;R19;R18;R17;R16;R15;R14;R13;R12;R11; R10;R9;R8;R7;R6;R5;R4;R3;R2;R1;R0] 31 false let _V = Vector [UndefinedRegister 0;V31;V30;V29;V28;V27;V26;V25;V24;V23;V22;V21;V20;V19;V18;V17;V16;V15;V14;V13;V12; V11;V10;V9;V8;V7;V6;V5;V4;V3;V2;V1;V0] 32 false let ReservedValue () = AArch64_UndefinedFault () let UnallocatedEncoding () = AArch64_UndefinedFault () let CountLeadingSignBits x = CountLeadingZeroBits (reset_vector_start (set_vector_start_to_length (bitwise_xor (set_vector_start_to_length (slice (set_vector_start_to_length x) ((length (reset_vector_start (set_vector_start_to_length x))) - (1:ii)) (1:ii)), set_vector_start_to_length (slice (set_vector_start_to_length x) ((length (reset_vector_start (set_vector_start_to_length x))) - (2:ii)) (0:ii)))))) let LSR_C (x, shift) = let extended_x = set_vector_start_to_length (ZeroExtend ((length x) + shift,reset_vector_start (set_vector_start_to_length x))) in let result = set_vector_start_to_length (slice (set_vector_start_to_length extended_x) ((shift + (length (reset_vector_start (set_vector_start_to_length x)))) - (1:ii)) shift) in let carry_out = access (set_vector_start_to_length extended_x) (shift - (1:ii)) in (set_vector_start_to_length result,carry_out) let Ones N' = set_vector_start_to_length (Replicate (N',reset_vector_start (set_vector_start_to_length (Vector [B1] 0 false)))) let SignExtend (N', ((Vector (h::_) _ _) as x)) = let remainder = slice_raw x (1:ii) ((length (reset_vector_start x)) - (1:ii)) in set_vector_start_to_length ((set_vector_start_to_length (set_vector_start_to_length (Replicate (N' - (length x), reset_vector_start (set_vector_start_to_length (Vector [h] 0 false)))))) ^^ (set_vector_start_to_length x)) let supported_instructions instr = match instr with | _ -> Just instr end let LSL (x, shift) = let result = set_vector_start_to_length (to_vec_dec (length x,(0:ii))) in if bitU_to_bool (eq_range (shift, (0:ii))) then set_vector_start_to_length x else let (result', _) = match (LSL_C (reset_vector_start (set_vector_start_to_length x),shift)) with | (v0v', v1v') -> (v0v',v1v') end in set_vector_start_to_length result' let ThisInstrAddr N' = let N = length (reset_vector_start (set_vector_start_to_length (to_vec_dec (N',(0:ii))))) in let _ = assert' ((eq_range (N, (64:ii))) |. ((eq_range (N, (32:ii))) &. (UsingAArch32 ()))) (Nothing) in rPC () >>= fun w__0 -> return (set_vector_start_to_length (mask (N',reset_vector_start (set_vector_start_to_length w__0)))) let AArch64_Abort (vaddress, fault) = not_implemented "AArch64_Abort" let rV (N', n) = read_reg (access _V n) >>= fun w__0 -> return (set_vector_start_to_length (mask (N',reset_vector_start (set_vector_start_to_length w__0)))) let rVpart (N', n, part) = if bitU_to_bool (eq_range (part, (0:ii))) then read_reg (access _V n) >>= fun w__0 -> return (set_vector_start_to_length (set_vector_start_to_length (mask (N',reset_vector_start (set_vector_start_to_length w__0))))) else let _ = assert' (eq_range (length (reset_vector_start (set_vector_start_to_length (to_vec_dec (N',(0:ii))))), (64:ii))) (Nothing) in read_reg_range (access _V n) (127:ii) (64:ii) >>= fun w__1 -> return (set_vector_start_to_length (set_vector_start 63 w__1)) let ExternalInvasiveDebugEnabled () = signalDBGEN () >>= fun w__0 -> return (eq (w__0, HIGH)) let Align (x, y) = set_vector_start_to_length (to_vec_dec (length x,Align' (UInt (reset_vector_start (set_vector_start_to_length x)),y))) let empty_read_buffer = <| read_buffer_type_size = (0:ii); read_buffer_type_acctype = AccType_NORMAL; read_buffer_type_exclusive = B0; read_buffer_type_address = (to_vec_dec ((64:ii),(0:ii))) |> let empty_write_buffer = <| write_buffer_type_size = (0:ii); write_buffer_type_acctype = AccType_NORMAL; write_buffer_type_exclusive = B0; write_buffer_type_address = (to_vec_dec ((64:ii),(0:ii))); write_buffer_type_value = (to_vec_dec ((128:ii),(0:ii))) |> let HighestELUsingAArch32 () = if bitU_to_bool (~(HaveAnyAArch32 ())) then B0 else IMPLEMENTATION_DEFINED.IMPLEMENTATION_DEFINED_type_HighestELUsingAArch32 let rX (N', n) = if bitU_to_bool (neq_range (n, (31:ii))) then read_reg (access _R n) >>= fun w__0 -> return (set_vector_start_to_length (mask (N',reset_vector_start (set_vector_start_to_length w__0)))) else return (set_vector_start_to_length (Zeros N')) let rELR' () = read_reg_field CurrentEL "EL" >>= fun w__0 -> let _ = assert' (neq_vec (set_vector_start_to_length w__0, set_vector_start_to_length EL0)) (Nothing) in read_reg_field CurrentEL "EL" >>= fun w__1 -> rELR (reset_vector_start (set_vector_start 1 w__1)) let rSPIFP = [RFull "SP_EL0";PSTATE_SPfp] let wSPFP = ([PSTATE_SPfp],[RFull "SP_EL0"]) let xFP n = if bitU_to_bool (neq_range (n, (31:ii))) then [RFull (access _Rs n)] else [] let BigEndianIFP = if bitU_to_bool (UsingAArch32 ()) then [RFull "PSTATE_E"] else [PSTATE_ELfp] let flush_write_buffer_exclusive write_buffer = let _ = assert' write_buffer.write_buffer_type_exclusive (Nothing) in match write_buffer.write_buffer_type_acctype with | AccType_ATOMIC -> wMem_Val_ATOMIC (write_buffer.write_buffer_type_size, reset_vector_start (set_vector_start_to_length (slice (set_vector_start_to_length write_buffer.write_buffer_type_value) ((write_buffer.write_buffer_type_size * (8:ii)) - (1:ii)) (0:ii)))) | AccType_ORDERED -> wMem_Val_ATOMIC (write_buffer.write_buffer_type_size, reset_vector_start (set_vector_start_to_length (slice (set_vector_start_to_length write_buffer.write_buffer_type_value) ((write_buffer.write_buffer_type_size * (8:ii)) - (1:ii)) (0:ii)))) | _ -> not_implemented "unrecognised memory access" >> return B0 end let AArch64_CreateFaultRecord (type', ipaddress, level, acctype, write, extflag, secondstage, s2fs1walk) = <| FaultRecord_type' = type'; FaultRecord_domain = (to_vec_dec ((4:ii),UNKNOWN)); FaultRecord_debugmoe = (to_vec_dec ((4:ii),UNKNOWN)); FaultRecord_ipaddress = ipaddress; FaultRecord_level = level; FaultRecord_acctype = acctype; FaultRecord_write = write; FaultRecord_extflag = extflag; FaultRecord_secondstage = secondstage; FaultRecord_s2fs1walk = s2fs1walk |> let flush_write_buffer write_buffer = let _ = assert' (eq_bit (write_buffer.write_buffer_type_exclusive, B0)) (Nothing) in match write_buffer.write_buffer_type_acctype with | AccType_NORMAL -> wMem_Val_NORMAL (write_buffer.write_buffer_type_size, reset_vector_start (set_vector_start_to_length (slice (set_vector_start_to_length write_buffer.write_buffer_type_value) ((write_buffer.write_buffer_type_size * (8:ii)) - (1:ii)) (0:ii)))) | AccType_STREAM -> wMem_Val_NORMAL (write_buffer.write_buffer_type_size, reset_vector_start (set_vector_start_to_length (slice (set_vector_start_to_length write_buffer.write_buffer_type_value) ((write_buffer.write_buffer_type_size * (8:ii)) - (1:ii)) (0:ii)))) | AccType_UNPRIV -> wMem_Val_NORMAL (write_buffer.write_buffer_type_size, reset_vector_start (set_vector_start_to_length (slice (set_vector_start_to_length write_buffer.write_buffer_type_value) ((write_buffer.write_buffer_type_size * (8:ii)) - (1:ii)) (0:ii)))) | AccType_ORDERED -> wMem_Val_NORMAL (write_buffer.write_buffer_type_size, reset_vector_start (set_vector_start_to_length (slice (set_vector_start_to_length write_buffer.write_buffer_type_value) ((write_buffer.write_buffer_type_size * (8:ii)) - (1:ii)) (0:ii)))) | _ -> not_implemented "unrecognised memory access" end let System_Get (op0, op1, crn, crm, op2) = match toNaturalFiveTup (op0,op1,crn,crm,op2) with | ((3:nn), (3:nn), (4:nn), (2:nn), (0:nn)) -> read_reg NZCV >>= fun w__0 -> return (ZeroExtend ((64:ii),w__0)) | ((3:nn), (3:nn), (4:nn), (2:nn), (1:nn)) -> read_reg DAIF >>= fun w__1 -> return (ZeroExtend ((64:ii),w__1)) | ((3:nn), (3:nn), (13:nn), (0:nn), (2:nn)) -> read_reg TPIDR_EL0 end let Prefetch (address, prfop) = let hint = match toNatural (0:ii) with | (0:nn) -> Prefetch_READ | (1:nn) -> Prefetch_WRITE | (2:nn) -> Prefetch_EXEC end in let target = (0:ii) in let stream = B0 in let returnv = B0 in let (returnv, hint) = match (slice prfop (4:ii) (3:ii)) with | Vector [B0;B0] _ _ -> let hint = Prefetch_READ in (returnv,hint) | Vector [B0;B1] _ _ -> let hint = Prefetch_EXEC in (returnv,hint) | Vector [B1;B0] _ _ -> let hint = Prefetch_WRITE in (returnv,hint) | Vector [B1;B1] _ _ -> let returnv = B1 in (returnv,hint) end in let (target, stream) = if bitU_to_bool (~returnv) then let target = unsigned (reset_vector_start (slice prfop (2:ii) (1:ii))) in let stream = neq (match (access prfop (0:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii)) in (target,stream) else (target,stream) in () let DoubleLockStatus () = if bitU_to_bool (ELUsingAArch32 (reset_vector_start EL1)) then read_reg_bitfield DBGOSDLR "DLK" >>= fun w__0 -> read_reg_bitfield DBGPRCR "CORENPDRQ" >>= fun w__1 -> Halted () >>= fun w__2 -> return ((eq (match w__0 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) &. ((eq (match w__1 with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) &. (~w__2))) else read_reg_bitfield OSDLR_EL1 "DLK" >>= fun w__3 -> read_reg_bitfield DBGPRCR_EL1 "CORENPDRQ" >>= fun w__4 -> Halted () >>= fun w__5 -> return ((eq (match w__3 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) &. ((eq (match w__4 with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) &. (~w__5))) let wSP ((), value) = read_reg_bitfield SPSel "SP" >>= fun w__0 -> if bitU_to_bool (eq (match w__0 with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) then write_reg SP_EL0 (ZeroExtend ((64:ii),reset_vector_start (set_vector_start_to_length value))) else read_reg_field CurrentEL "EL" >>= fun pstate_el -> if bitU_to_bool (eq_vec (set_vector_start_to_length pstate_el, set_vector_start_to_length EL0)) then write_reg SP_EL0 (ZeroExtend ((64:ii),reset_vector_start (set_vector_start_to_length value))) else if bitU_to_bool (eq_vec (set_vector_start_to_length pstate_el, set_vector_start_to_length EL1)) then write_reg SP_EL1 (ZeroExtend ((64:ii),reset_vector_start (set_vector_start_to_length value))) else if bitU_to_bool (eq_vec (set_vector_start_to_length pstate_el, set_vector_start_to_length EL2)) then write_reg SP_EL2 (ZeroExtend ((64:ii),reset_vector_start (set_vector_start_to_length value))) else if bitU_to_bool (eq_vec (set_vector_start_to_length pstate_el, set_vector_start_to_length EL3)) then write_reg SP_EL3 (ZeroExtend ((64:ii),reset_vector_start (set_vector_start_to_length value))) else return (assert' B0 (Nothing)) let decodeTMCommit () = Just (TMCommit) let decodeTMTest () = Just (TMTest) let decodeTMAbort ((Vector [R;_;_;_;_;_] _ _) as v__975) = let imm5 = slice_raw v__975 (1:ii) (5:ii) in Just (TMAbort (R,reset_vector_start imm5)) let wV (n, value) = write_reg (access _V n) (ZeroExtend ((128:ii),reset_vector_start (set_vector_start_to_length value))) let wVpart (n, part, value) = if bitU_to_bool (eq_range (part, (0:ii))) then write_reg (access _V n) (ZeroExtend ((128:ii),reset_vector_start (set_vector_start_to_length value))) else let _ = assert' (eq_range (length (reset_vector_start (set_vector_start_to_length (to_vec_dec (length value,(0:ii))))), (64:ii))) (Nothing) in write_reg_range (access _V n) (127:ii) (64:ii) (set_vector_start 127 value) let wX (n, value) = if bitU_to_bool (neq_range (n, (31:ii))) then write_reg (access _R n) (ZeroExtend ((64:ii),reset_vector_start (set_vector_start_to_length value))) else return () let decodeAdvSIMDLoadStoreMultiStruct machineCode = not_implemented "decodeAdvSIMDLoadStoreMultiStruct" >> return (Just (Unallocated)) let decodeAdvSIMDLoadStoreMultiStructPostIndexed machineCode = not_implemented "decodeAdvSIMDLoadStoreMultiStructPostIndexed" >> return (Just (Unallocated)) let decodeAdvSIMDLoadStoreSingleStruct machineCode = not_implemented "decodeAdvSIMDLoadStoreSingleStruct" >> return (Just (Unallocated)) let decodeAdvSIMDLoadStoreSingleStructPostIndexed machineCode = not_implemented "decodeAdvSIMDLoadStoreSingleStructPostIndexed" >> return (Just (Unallocated)) let decodeDataSIMDFPoint1 machineCode = not_implemented "decodeDataSIMDFPoint1" >> return (Just (Unallocated)) let decodeDataSIMDFPoint2 machineCode = not_implemented "decodeDataSIMDFPoint2" >> return (Just (Unallocated)) let AArch64_CheckForWFxTrap (target_el, is_wfe) = let _ = assert' (HaveEL (reset_vector_start target_el)) (Nothing) in let trap = B0 in (if bitU_to_bool (eq_vec (set_vector_start_to_length target_el, set_vector_start_to_length EL1)) then (if bitU_to_bool is_wfe then read_reg_bitfield SCTLR_EL1 "nTWE" >>= fun w__0 -> return (match w__0 with | B0 -> (0:ii) | B1 -> (1:ii) end) else read_reg_bitfield SCTLR_EL1 "nTWI" >>= fun w__1 -> return (match w__1 with | B0 -> (0:ii) | B1 -> (1:ii) end)) >>= fun w__2 -> let trap = eq (w__2, (0:ii)) in return trap else if bitU_to_bool (eq_vec (set_vector_start_to_length target_el, set_vector_start_to_length EL2)) then (if bitU_to_bool is_wfe then read_reg_bitfield HCR_EL2 "TWE" >>= fun w__3 -> return (match w__3 with | B0 -> (0:ii) | B1 -> (1:ii) end) else read_reg_bitfield HCR_EL2 "TWI" >>= fun w__4 -> return (match w__4 with | B0 -> (0:ii) | B1 -> (1:ii) end)) >>= fun w__5 -> let trap = eq (w__5, (1:ii)) in return trap else if bitU_to_bool (eq_vec (set_vector_start_to_length target_el, set_vector_start_to_length EL3)) then (if bitU_to_bool is_wfe then read_reg_bitfield SCR_EL3 "TWE" >>= fun w__6 -> return (match w__6 with | B0 -> (0:ii) | B1 -> (1:ii) end) else read_reg_bitfield SCR_EL3 "TWI" >>= fun w__7 -> return (match w__7 with | B0 -> (0:ii) | B1 -> (1:ii) end)) >>= fun w__8 -> let trap = eq (w__8, (1:ii)) in return trap else let _ = assert' B0 (Nothing) in return trap) >>= fun trap -> if bitU_to_bool trap then AArch64_WFxTrap (reset_vector_start target_el,is_wfe) else return () let wmem_kind (acctype, exclusive) = if bitU_to_bool exclusive then match acctype with | AccType_ATOMIC -> return (IK_mem_write Write_exclusive) | AccType_ORDERED -> return (IK_mem_write Write_exclusive_release) | _ -> not_implemented "unimplemented memory access" >> return (IK_mem_write Write_exclusive) end else match acctype with | AccType_NORMAL -> return (IK_mem_write Write_plain) | AccType_STREAM -> return (IK_mem_write Write_plain) | AccType_UNPRIV -> return (IK_mem_write Write_plain) | AccType_ORDERED -> return (IK_mem_write Write_release) | _ -> not_implemented "unimplemented memory access" >> return (IK_mem_write Write_plain) end let BranchTo (target, branch_type) = let target' = set_vector_start_to_length target in let _ = Hint_Branch branch_type in (if bitU_to_bool (eq_range (length (reset_vector_start (set_vector_start_to_length target)), (32:ii))) then let _ = assert' (UsingAArch32 ()) (Nothing) in write_reg _PC (ZeroExtend ((64:ii),reset_vector_start (set_vector_start_to_length target))) >> return target' else let _ = assert' ((eq_range (length (reset_vector_start (set_vector_start_to_length target)), (64:ii))) &. (~(UsingAArch32 ()))) (Nothing) in read_reg_field CurrentEL "EL" >>= fun pstate_el -> (if bitU_to_bool (eq_vec (set_vector_start_to_length pstate_el, set_vector_start_to_length EL0)) then read_reg_bitfield TCR_EL1 "TBI1" >>= fun w__0 -> let target' = if bitU_to_bool ((eq (match (access (set_vector_start_to_length target') (55:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) &. (eq (match w__0 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)))) then update target' (63:ii) (56:ii) (set_vector_start 63 (Vector [B1;B1;B1;B1;B1;B1;B1;B1] 7 false)) else target' in read_reg_bitfield TCR_EL1 "TBI0" >>= fun w__1 -> let target' = if bitU_to_bool ((eq (match (access (set_vector_start_to_length target') (55:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) &. (eq (match w__1 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)))) then update target' (63:ii) (56:ii) (set_vector_start 63 (Vector [B0;B0;B0;B0;B0;B0;B0;B0] 7 false)) else target' in return target' else if bitU_to_bool (eq_vec (set_vector_start_to_length pstate_el, set_vector_start_to_length EL1)) then read_reg_bitfield TCR_EL1 "TBI1" >>= fun w__2 -> let target' = if bitU_to_bool ((eq (match (access (set_vector_start_to_length target') (55:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) &. (eq (match w__2 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)))) then update target' (63:ii) (56:ii) (set_vector_start 63 (Vector [B1;B1;B1;B1;B1;B1;B1;B1] 7 false)) else target' in read_reg_bitfield TCR_EL1 "TBI0" >>= fun w__3 -> let target' = if bitU_to_bool ((eq (match (access (set_vector_start_to_length target') (55:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) &. (eq (match w__3 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)))) then update target' (63:ii) (56:ii) (set_vector_start 63 (Vector [B0;B0;B0;B0;B0;B0;B0;B0] 7 false)) else target' in return target' else if bitU_to_bool (eq_vec (set_vector_start_to_length pstate_el, set_vector_start_to_length EL2)) then read_reg_bitfield TCR_EL2 "TBI" >>= fun w__4 -> let target' = if bitU_to_bool (eq (match w__4 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then update target' (63:ii) (56:ii) (set_vector_start 63 (Vector [B0;B0;B0;B0;B0;B0;B0;B0] 7 false)) else target' in return target' else if bitU_to_bool (eq_vec (set_vector_start_to_length pstate_el, set_vector_start_to_length EL3)) then read_reg_bitfield TCR_EL3 "TBI" >>= fun w__5 -> let target' = if bitU_to_bool (eq (match w__5 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then update target' (63:ii) (56:ii) (set_vector_start 63 (Vector [B0;B0;B0;B0;B0;B0;B0;B0] 7 false)) else target' in return target' else return target') >>= fun target' -> write_reg _PC target' >> return target') >>= fun target' -> return () let rmem_kind (acctype, exclusive) = if bitU_to_bool exclusive then match acctype with | AccType_ATOMIC -> return (IK_mem_read Read_exclusive) | AccType_ORDERED -> return (IK_mem_read Read_exclusive_acquire) | _ -> not_implemented "unimplemented memory access" >> return (IK_mem_read Read_exclusive) end else return (match acctype with | AccType_NORMAL -> IK_mem_read Read_plain | AccType_ATOMIC -> IK_mem_read Read_plain | AccType_STREAM -> IK_mem_read Read_stream | AccType_UNPRIV -> IK_mem_read Read_plain | AccType_ORDERED -> IK_mem_read Read_acquire end) let decodeTMStart Rt = let t = UInt_reg (reset_vector_start Rt) in Just (TMStart t) let decodeAddSubtractWithCarry ((Vector [sf;op;S;B1;B1;B0;B1;B0;B0;B0;B0;_;_;_;_;_;B0;B0;B0;B0;B0;B0;_;_;_;_;_;_;_;_;_;_] _ _) as v__969) = let Rm = slice_raw v__969 (11:ii) (15:ii) in let Rn = slice_raw v__969 (22:ii) (26:ii) in let Rd = slice_raw v__969 (27:ii) (31:ii) in let d = UInt_reg (reset_vector_start Rd) in let n = UInt_reg (reset_vector_start Rn) in let m = UInt_reg (reset_vector_start Rm) in let datasize = if bitU_to_bool (eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (64:ii) else (32:ii) in let sub_op = eq (match op with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in let setflags = eq (match S with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in Just (AddSubCarry (d,n,m,datasize,sub_op,setflags)) let decodeConditionalCompareRegister ((Vector [sf;op;B1;B1;B1;B0;B1;B0;B0;B1;B0;_;_;_;_;_;_;_;_;_;B0;B0;_;_;_;_;_;B0;_;_;_;_] _ _) as v__961) = let Rm = slice_raw v__961 (11:ii) (15:ii) in let _cond = slice_raw v__961 (16:ii) (19:ii) in let Rn = slice_raw v__961 (22:ii) (26:ii) in let nzcv = slice_raw v__961 (28:ii) (31:ii) in let n = UInt_reg (reset_vector_start Rn) in let m = UInt_reg (reset_vector_start Rm) in let datasize = if bitU_to_bool (eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (64:ii) else (32:ii) in let sub_op = eq (match op with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in let condition = set_vector_start 3 _cond in let flags = set_vector_start 3 nzcv in Just (ConditionalCompareRegister (n,m,datasize,sub_op,reset_vector_start condition,reset_vector_start flags)) let decodeConditionalSelect ((Vector [sf;op;B0;B1;B1;B0;B1;B0;B1;B0;B0;_;_;_;_;_;_;_;_;_;B0;o2;_;_;_;_;_;_;_;_;_;_] _ _) as v__954) = let Rm = slice_raw v__954 (11:ii) (15:ii) in let _cond = slice_raw v__954 (16:ii) (19:ii) in let Rn = slice_raw v__954 (22:ii) (26:ii) in let Rd = slice_raw v__954 (27:ii) (31:ii) in let d = UInt_reg (reset_vector_start Rd) in let n = UInt_reg (reset_vector_start Rn) in let m = UInt_reg (reset_vector_start Rm) in let datasize = if bitU_to_bool (eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (64:ii) else (32:ii) in let condition = set_vector_start 3 _cond in let else_inv = eq (match op with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in let else_inc = eq (match o2 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in Just (ConditionalSelect (d,n,m,datasize,reset_vector_start condition,else_inv,else_inc)) let BranchToFP (iR, oR) = (if bitU_to_bool (UsingAArch32 ()) then iR else PSTATE_ELfp :: iR,_PCfp :: oR) let decodeImplementationDefined = function | ((Vector [B1;B1;B0;B1;B0;B1;B0;B1;B0;B0;B0;B0;B1;B0;B1;B1;B1;_;B1;B1;B0;B0;B0;B0;B0;B0;B0;B0;B0;B0;B0;isEnd] _ _) as v__920) -> Just (ImplementationDefinedTestBeginEnd isEnd) | ((Vector [B1;B1;B0;B1;B0;B1;B0;B1;B0;B0;B0;B0;B1;B0;B1;B1;B1;_;B1;B1;B0;B0;B0;B0;B0;B0;B0;B0;B0;B0;B1;B0] _ _) as v__932) -> Just (ImplementationDefinedStopFetching) | ((Vector [B1;B1;B0;B1;B0;B1;B0;B1;B0;B0;B0;B0;B1;B0;B1;B1;B1;_;B1;B1;B0;B0;B0;B0;B0;B0;B0;B0;B0;B0;B1;B1] _ _) as v__943) -> Just (ImplementationDefinedThreadStart) end let NZCVfp = [PSTATE_Vfp;PSTATE_Cfp;PSTATE_Zfp;PSTATE_Nfp] let decodeConditionalCompareImmediate ((Vector [sf;op;B1;B1;B1;B0;B1;B0;B0;B1;B0;_;_;_;_;_;_;_;_;_;B1;B0;_;_;_;_;_;B0;_;_;_;_] _ _) as v__912) = let imm5 = slice_raw v__912 (11:ii) (15:ii) in let _cond = slice_raw v__912 (16:ii) (19:ii) in let Rn = slice_raw v__912 (22:ii) (26:ii) in let nzcv = slice_raw v__912 (28:ii) (31:ii) in let n = UInt_reg (reset_vector_start Rn) in let datasize = if bitU_to_bool (eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (64:ii) else (32:ii) in let sub_op = eq (match op with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in let condition = set_vector_start 3 _cond in let flags = set_vector_start 3 nzcv in let imm = set_vector_start_to_length (ZeroExtend (datasize,reset_vector_start (set_vector_start_to_length imm5))) in Just (ConditionalCompareImmediate (n,datasize,sub_op,reset_vector_start condition,reset_vector_start flags,reset_vector_start (set_vector_start_to_length imm))) let decodeMoveWideImmediate ((Vector [sf;_;_;B1;B0;B0;B1;B0;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__909) = let opc = slice_raw v__909 (1:ii) (2:ii) in let hw = slice_raw v__909 (9:ii) (10:ii) in let imm16 = slice_raw v__909 (11:ii) (26:ii) in let Rd = slice_raw v__909 (27:ii) (31:ii) in let d = UInt_reg (reset_vector_start Rd) in let datasize = if bitU_to_bool (eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (64:ii) else (32:ii) in let imm = imm16 in let pos = (0:ii) in let opcode = match toNatural (0:ii) with | (0:nn) -> MoveWideOp_N | (1:nn) -> MoveWideOp_Z | (2:nn) -> MoveWideOp_K end in match opc with | Vector [B0;B0] _ _ -> return MoveWideOp_N | Vector [B1;B0] _ _ -> return MoveWideOp_Z | Vector [B1;B1] _ _ -> return MoveWideOp_K | _ -> UnallocatedEncoding () >> return opcode end >>= fun opcode -> (if bitU_to_bool ((eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) &. (eq (match (access hw (1:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)))) then UnallocatedEncoding () else return ()) >> let pos = UInt (reset_vector_start (set_vector_start_to_length ((set_vector_start_to_length hw) ^^ (set_vector_start_to_length (Vector [B0;B0;B0;B0] 3 false))))) in return (Just (MoveWide (d,datasize,reset_vector_start imm,pos,opcode))) let decodeLoadStoreExclusive ((Vector [_;_;B0;B0;B1;B0;B0;B0;o2;L;o1;_;_;_;_;_;o0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__903) = let size = slice_raw v__903 (0:ii) (1:ii) in let Rs = slice_raw v__903 (11:ii) (15:ii) in let Rt2 = slice_raw v__903 (17:ii) (21:ii) in let Rn = slice_raw v__903 (22:ii) (26:ii) in let Rt = slice_raw v__903 (27:ii) (31:ii) in let n = UInt_reg (reset_vector_start Rn) in let t = UInt_reg (reset_vector_start Rt) in let t2 = UInt_reg (reset_vector_start Rt2) in let s = UInt_reg (reset_vector_start Rs) in (if bitU_to_bool ((eq_vec (set_vector_start_to_length (Vector [o2;o1;o0] 2 false), set_vector_start_to_length (Vector [B1;B0;B0] 2 false))) |. (eq_vec (set_vector_start_to_length (Vector [o2;o1] 1 false), set_vector_start_to_length (Vector [B1;B1] 1 false)))) then UnallocatedEncoding () else return ()) >> (if bitU_to_bool ((eq (match o1 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) &. (eq (match (access size (1:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii)))) then UnallocatedEncoding () else return ()) >> let acctype = if bitU_to_bool (eq (match o0 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then AccType_ORDERED else AccType_ATOMIC in let excl = eq (match o2 with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii)) in let pair = eq (match o1 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in let memop = if bitU_to_bool (eq (match L with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then MemOp_LOAD else MemOp_STORE in let elsize = lsl' ((8:ii),UInt (reset_vector_start (set_vector_start_to_length size))) in let regsize = if bitU_to_bool (eq_range (elsize, (64:ii))) then (64:ii) else (32:ii) in let datasize = if bitU_to_bool pair then elsize * (2:ii) else elsize in return (Just (LoadStoreAcqExc (n,t,t2,s,acctype,excl,pair,memop,elsize,regsize,datasize))) let sharedDecodeLoadImmediate (opc, size, Rn, Rt, wback, postindex, scale, offset, acctype, prefetchAllowed) = let n = UInt_reg Rn in let t = UInt_reg Rt in let memop = match toNatural (0:ii) with | (0:nn) -> MemOp_LOAD | (1:nn) -> MemOp_STORE | (2:nn) -> MemOp_PREFETCH end in let _signed = B0 in let regsize = (64:ii) in (if bitU_to_bool (eq (match (access opc (1:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) then let memop = if bitU_to_bool (eq (match (access opc (0:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then MemOp_LOAD else MemOp_STORE in let regsize = if bitU_to_bool (eq_vec (set_vector_start_to_length size, set_vector_start_to_length (Vector [B1;B1] 1 false))) then (64:ii) else (32:ii) in let _signed = B0 in return (memop,regsize,_signed) else (if bitU_to_bool (eq_vec (set_vector_start_to_length size, set_vector_start_to_length (Vector [B1;B1] 1 false))) then (if bitU_to_bool prefetchAllowed then let memop = MemOp_PREFETCH in (if bitU_to_bool (eq (match (access opc (0:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then UnallocatedEncoding () else return ()) >> return memop else UnallocatedEncoding () >> return memop) >>= fun memop -> return (regsize,_signed,memop) else let memop = MemOp_LOAD in (if bitU_to_bool ((eq_vec (set_vector_start_to_length size, set_vector_start_to_length (Vector [B1;B0] 1 false))) &. (eq (match (access opc (0:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)))) then UnallocatedEncoding () else return ()) >> let regsize = if bitU_to_bool (eq (match (access opc (0:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (32:ii) else (64:ii) in let _signed = B1 in return (regsize,_signed,memop)) >>= fun (regsize, _signed, memop) -> return (memop,regsize,_signed)) >>= fun (memop, regsize, _signed) -> let datasize = lsl' ((8:ii),scale) in return (Just (LoadImmediate (n,t,acctype,memop,_signed,wback,postindex,reset_vector_start offset,regsize,datasize))) let sharedDecodeLoadRegister (Rn, Rt, Rm, opc, size, wback, postindex, scale, extend_type, shift) = let n = UInt_reg Rn in let t = UInt_reg Rt in let m = UInt_reg Rm in let acctype = AccType_NORMAL in let memop = match toNatural (0:ii) with | (0:nn) -> MemOp_LOAD | (1:nn) -> MemOp_STORE | (2:nn) -> MemOp_PREFETCH end in let _signed = B0 in let regsize = (64:ii) in (if bitU_to_bool (eq (match (access opc (1:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) then let memop = if bitU_to_bool (eq (match (access opc (0:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then MemOp_LOAD else MemOp_STORE in let regsize = if bitU_to_bool (eq_vec (set_vector_start_to_length size, set_vector_start_to_length (Vector [B1;B1] 1 false))) then (64:ii) else (32:ii) in let _signed = B0 in return (memop,regsize,_signed) else (if bitU_to_bool (eq_vec (set_vector_start_to_length size, set_vector_start_to_length (Vector [B1;B1] 1 false))) then let memop = MemOp_PREFETCH in (if bitU_to_bool (eq (match (access opc (0:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then UnallocatedEncoding () else return ()) >> return (regsize,_signed,memop) else let memop = MemOp_LOAD in (if bitU_to_bool ((eq_vec (set_vector_start_to_length size, set_vector_start_to_length (Vector [B1;B0] 1 false))) &. (eq (match (access opc (0:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)))) then UnallocatedEncoding () else return ()) >> let regsize = if bitU_to_bool (eq (match (access opc (0:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (32:ii) else (64:ii) in let _signed = B1 in return (regsize,_signed,memop)) >>= fun (regsize, _signed, memop) -> return (memop,regsize,_signed)) >>= fun (memop, regsize, _signed) -> let datasize = lsl' ((8:ii),scale) in return (Just (LoadRegister (n,t,m,acctype,memop,_signed,wback,postindex,extend_type,shift,regsize,datasize))) let ConditionHoldsIFP _cond = match (slice _cond (3:ii) (1:ii)) with | Vector [B0;B0;B0] _ _ -> [PSTATE_Zfp] | Vector [B0;B0;B1] _ _ -> [PSTATE_Cfp] | Vector [B0;B1;B0] _ _ -> [PSTATE_Nfp] | Vector [B0;B1;B1] _ _ -> [PSTATE_Vfp] | Vector [B1;B0;B0] _ _ -> [PSTATE_Zfp;PSTATE_Cfp] | Vector [B1;B0;B1] _ _ -> [PSTATE_Vfp;PSTATE_Nfp] | Vector [B1;B1;B0] _ _ -> [PSTATE_Zfp;PSTATE_Vfp;PSTATE_Nfp] | Vector [B1;B1;B1] _ _ -> [] end let decodeAddSubtractImmediate ((Vector [sf;op;S;B1;B0;B0;B0;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__898) = let shift = slice_raw v__898 (8:ii) (9:ii) in let imm12 = slice_raw v__898 (10:ii) (21:ii) in let Rn = slice_raw v__898 (22:ii) (26:ii) in let Rd = slice_raw v__898 (27:ii) (31:ii) in let d = UInt_reg (reset_vector_start Rd) in let n = UInt_reg (reset_vector_start Rn) in let datasize = if bitU_to_bool (eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (64:ii) else (32:ii) in let sub_op = eq (match op with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in let setflags = eq (match S with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in let imm = set_vector_start_to_length (to_vec_dec (datasize,(0:ii))) in match shift with | Vector [B0;B0] _ _ -> let imm = set_vector_start_to_length (ZeroExtend (datasize,reset_vector_start (set_vector_start_to_length imm12))) in return imm | Vector [B0;B1] _ _ -> let imm = set_vector_start_to_length (ZeroExtend (datasize, reset_vector_start (set_vector_start_to_length ((set_vector_start_to_length imm12) ^^ (set_vector_start_to_length (duplicate_bits (set_vector_start_to_length (Vector [B0] 0 false), (12:ii)))))))) in return imm | Vector [B1;_] _ _ -> ReservedValue () >> return imm end >>= fun imm -> return (Just (AddSubImmediate (d,n,datasize,sub_op,setflags,reset_vector_start (set_vector_start_to_length imm)))) let decodeData3Source = function | ((Vector [sf;B0;B0;B1;B1;B0;B1;B1;B0;B0;B0;_;_;_;_;_;o0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__878) -> let Rm = slice_raw v__878 (11:ii) (15:ii) in let Ra = slice_raw v__878 (17:ii) (21:ii) in let Rn = slice_raw v__878 (22:ii) (26:ii) in let Rd = slice_raw v__878 (27:ii) (31:ii) in let d = UInt_reg (reset_vector_start Rd) in let n = UInt_reg (reset_vector_start Rn) in let m = UInt_reg (reset_vector_start Rm) in let a = UInt_reg (reset_vector_start Ra) in let destsize = if bitU_to_bool (eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (64:ii) else (32:ii) in let datasize = destsize in let sub_op = eq (match o0 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in Just (MultiplyAddSub (d,n,m,a,destsize,datasize,sub_op)) | ((Vector [B1;B0;B0;B1;B1;B0;B1;B1;U;B0;B1;_;_;_;_;_;o0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__884) -> let Rm = slice_raw v__884 (11:ii) (15:ii) in let Ra = slice_raw v__884 (17:ii) (21:ii) in let Rn = slice_raw v__884 (22:ii) (26:ii) in let Rd = slice_raw v__884 (27:ii) (31:ii) in let d = UInt_reg (reset_vector_start Rd) in let n = UInt_reg (reset_vector_start Rn) in let m = UInt_reg (reset_vector_start Rm) in let a = UInt_reg (reset_vector_start Ra) in let destsize = (64:ii) in let datasize = (32:ii) in let sub_op = eq (match o0 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in let _unsigned = eq (match U with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in Just (MultiplyAddSubLong (d,n,m,a,destsize,datasize,sub_op,_unsigned)) | ((Vector [B1;B0;B0;B1;B1;B0;B1;B1;U;B1;B0;_;_;_;_;_;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__891) -> let Rm = slice_raw v__891 (11:ii) (15:ii) in let Ra = slice_raw v__891 (17:ii) (21:ii) in let Rn = slice_raw v__891 (22:ii) (26:ii) in let Rd = slice_raw v__891 (27:ii) (31:ii) in let d = UInt_reg (reset_vector_start Rd) in let n = UInt_reg (reset_vector_start Rn) in let m = UInt_reg (reset_vector_start Rm) in let a = UInt_reg (reset_vector_start Ra) in let destsize = (64:ii) in let datasize = destsize in let _unsigned = eq (match U with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in Just (MultiplyHigh (d,n,m,a,destsize,datasize,_unsigned)) end let decodeExtract ((Vector [sf;B0;B0;B1;B0;B0;B1;B1;B1;N;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__872) = let Rm = slice_raw v__872 (11:ii) (15:ii) in let imms = slice_raw v__872 (16:ii) (21:ii) in let Rn = slice_raw v__872 (22:ii) (26:ii) in let Rd = slice_raw v__872 (27:ii) (31:ii) in let d = UInt_reg (reset_vector_start Rd) in let n = UInt_reg (reset_vector_start Rn) in let m = UInt_reg (reset_vector_start Rm) in let datasize = if bitU_to_bool (eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (64:ii) else (32:ii) in let lsb = (0:ii) in (if bitU_to_bool (neq_bit (N, sf)) then UnallocatedEncoding () else return ()) >> (if bitU_to_bool ((eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) &. (eq (match (access imms (5:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)))) then ReservedValue () else return ()) >> let lsb = UInt (reset_vector_start (set_vector_start_to_length imms)) in return (Just (ExtractRegister (d,n,m,datasize,lsb))) let decodeAddSubtractExtendedRegister ((Vector [sf;op;S;B0;B1;B0;B1;B1;B0;B0;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__865) = let Rm = slice_raw v__865 (11:ii) (15:ii) in let option_v = slice_raw v__865 (16:ii) (18:ii) in let imm3 = slice_raw v__865 (19:ii) (21:ii) in let Rn = slice_raw v__865 (22:ii) (26:ii) in let Rd = slice_raw v__865 (27:ii) (31:ii) in let d = UInt_reg (reset_vector_start Rd) in let n = UInt_reg (reset_vector_start Rn) in let m = UInt_reg (reset_vector_start Rm) in let datasize = if bitU_to_bool (eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (64:ii) else (32:ii) in let sub_op = eq (match op with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in let setflags = eq (match S with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in let extend_type = DecodeRegExtend (reset_vector_start (set_vector_start 2 option_v)) in let shift = UInt (reset_vector_start (set_vector_start_to_length imm3)) in (if bitU_to_bool (gt (shift, (4:ii))) then ReservedValue () else return ()) >> return (Just (AddSubExtendRegister (d,n,m,datasize,sub_op,setflags,extend_type,shift))) let decodeAddSubtractShiftedRegister ((Vector [sf;op;S;B0;B1;B0;B1;B1;_;_;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__859) = let shift = slice_raw v__859 (8:ii) (9:ii) in let Rm = slice_raw v__859 (11:ii) (15:ii) in let imm6 = slice_raw v__859 (16:ii) (21:ii) in let Rn = slice_raw v__859 (22:ii) (26:ii) in let Rd = slice_raw v__859 (27:ii) (31:ii) in let d = UInt_reg (reset_vector_start Rd) in let n = UInt_reg (reset_vector_start Rn) in let m = UInt_reg (reset_vector_start Rm) in let datasize = if bitU_to_bool (eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (64:ii) else (32:ii) in let sub_op = eq (match op with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in let setflags = eq (match S with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in (if bitU_to_bool (eq_vec (set_vector_start_to_length shift, set_vector_start_to_length (Vector [B1;B1] 1 false))) then ReservedValue () else return ()) >> (if bitU_to_bool ((eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) &. (eq (match (access imm6 (5:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)))) then ReservedValue () else return ()) >> let shift_type = DecodeShift (reset_vector_start (set_vector_start 1 shift)) in let shift_amount = UInt (reset_vector_start (set_vector_start_to_length imm6)) in return (Just (AddSubShiftedRegister (d,n,m,datasize,sub_op,setflags,shift_type,shift_amount))) let decodeLogicalShiftedRegister ((Vector [sf;_;_;B0;B1;B0;B1;B0;_;_;N;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__855) = let opc = slice_raw v__855 (1:ii) (2:ii) in let shift = slice_raw v__855 (8:ii) (9:ii) in let Rm = slice_raw v__855 (11:ii) (15:ii) in let imm6 = slice_raw v__855 (16:ii) (21:ii) in let Rn = slice_raw v__855 (22:ii) (26:ii) in let Rd = slice_raw v__855 (27:ii) (31:ii) in let d = UInt_reg (reset_vector_start Rd) in let n = UInt_reg (reset_vector_start Rn) in let m = UInt_reg (reset_vector_start Rm) in let datasize = if bitU_to_bool (eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (64:ii) else (32:ii) in let setflags = B0 in let op = LogicalOp_AND in let (op, setflags) = match opc with | Vector [B0;B0] _ _ -> let op = LogicalOp_AND in let setflags = B0 in (op,setflags) | Vector [B0;B1] _ _ -> let op = LogicalOp_ORR in let setflags = B0 in (op,setflags) | Vector [B1;B0] _ _ -> let op = LogicalOp_EOR in let setflags = B0 in (op,setflags) | Vector [B1;B1] _ _ -> let op = LogicalOp_AND in let setflags = B1 in (op,setflags) end in (if bitU_to_bool ((eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) &. (eq (match (access imm6 (5:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)))) then ReservedValue () else return ()) >> let shift_type = DecodeShift (reset_vector_start (set_vector_start 1 shift)) in let shift_amount = UInt (reset_vector_start (set_vector_start_to_length imm6)) in let invert = eq (match N with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in return (Just (LogicalShiftedRegister (d,n,m,datasize,setflags,op,shift_type,shift_amount,invert))) let decodeData1Source = function | ((Vector [sf;B1;B0;B1;B1;B0;B1;B0;B1;B1;B0;B0;B0;B0;B0;B0;B0;B0;B0;B0;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__840) -> let opc = slice_raw v__840 (20:ii) (21:ii) in let Rn = slice_raw v__840 (22:ii) (26:ii) in let Rd = slice_raw v__840 (27:ii) (31:ii) in let d = UInt_reg (reset_vector_start Rd) in let n = UInt_reg (reset_vector_start Rn) in let datasize = if bitU_to_bool (eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (64:ii) else (32:ii) in let op = match toNatural (0:ii) with | (0:nn) -> RevOp_RBIT | (1:nn) -> RevOp_REV16 | (2:nn) -> RevOp_REV32 | (3:nn) -> RevOp_REV64 end in match opc with | Vector [B0;B0] _ _ -> return RevOp_RBIT | Vector [B0;B1] _ _ -> return RevOp_REV16 | Vector [B1;B0] _ _ -> return RevOp_REV32 | Vector [B1;B1] _ _ -> (if bitU_to_bool (eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) then UnallocatedEncoding () else return ()) >> return RevOp_REV64 end >>= fun op -> return (Just (Reverse (d,n,datasize,op))) | ((Vector [sf;B1;B0;B1;B1;B0;B1;B0;B1;B1;B0;B0;B0;B0;B0;B0;B0;B0;B0;B1;B0;op;_;_;_;_;_;_;_;_;_;_] _ _) as v__847) -> let Rn = slice_raw v__847 (22:ii) (26:ii) in let Rd = slice_raw v__847 (27:ii) (31:ii) in let d = UInt_reg (reset_vector_start Rd) in let n = UInt_reg (reset_vector_start Rn) in let datasize = if bitU_to_bool (eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (64:ii) else (32:ii) in let opcode = if bitU_to_bool (eq (match op with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) then CountOp_CLZ else CountOp_CLS in return (Just (CountLeading (d,n,datasize,opcode))) end let decodeUnconditionalBranchRegister = function | ((Vector [B1;B1;B0;B1;B0;B1;B1;B0;B0;_;_;B1;B1;B1;B1;B1;B0;B0;B0;B0;B0;B0;_;_;_;_;_;B0;B0;B0;B0;B0] _ _) as v__820) -> let op = slice_raw v__820 (9:ii) (10:ii) in let Rn = slice_raw v__820 (22:ii) (26:ii) in let n = UInt_reg (reset_vector_start Rn) in let branch_type = match toNatural (0:ii) with | (0:nn) -> BranchType_CALL | (1:nn) -> BranchType_ERET | (2:nn) -> BranchType_DBGEXIT | (3:nn) -> BranchType_RET | (4:nn) -> BranchType_JMP | (5:nn) -> BranchType_EXCEPTION | (6:nn) -> BranchType_UNKNOWN end in match op with | Vector [B0;B0] _ _ -> return BranchType_JMP | Vector [B0;B1] _ _ -> return BranchType_CALL | Vector [B1;B0] _ _ -> return BranchType_RET | _ -> UnallocatedEncoding () >> return branch_type end >>= fun branch_type -> return (Just (BranchRegister (n,branch_type))) | ((Vector [B1;B1;B0;B1;B0;B1;B1;B0;B1;B0;B0;B1;B1;B1;B1;B1;B0;B0;B0;B0;B0;B0;B1;B1;B1;B1;B1;B0;B0;B0;B0;B0] _ _) as v__826) -> return (Just (ExceptionReturn)) | ((Vector [B1;B1;B0;B1;B0;B1;B1;B0;B1;B0;B1;B1;B1;B1;B1;B1;B0;B0;B0;B0;B0;B0;B1;B1;B1;B1;B1;B0;B0;B0;B0;B0] _ _) as v__833) -> return (Just (DebugRestorePState)) end let decodeData2Source = function | ((Vector [sf;B0;B0;B1;B1;B0;B1;B0;B1;B1;B0;_;_;_;_;_;B0;B0;B0;B0;B1;o1;_;_;_;_;_;_;_;_;_;_] _ _) as v__800) -> let Rm = slice_raw v__800 (11:ii) (15:ii) in let Rn = slice_raw v__800 (22:ii) (26:ii) in let Rd = slice_raw v__800 (27:ii) (31:ii) in let d = UInt_reg (reset_vector_start Rd) in let n = UInt_reg (reset_vector_start Rn) in let m = UInt_reg (reset_vector_start Rm) in let datasize = if bitU_to_bool (eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (64:ii) else (32:ii) in let _unsigned = eq (match o1 with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii)) in return (Just (Division (d,n,m,datasize,_unsigned))) | ((Vector [sf;B0;B0;B1;B1;B0;B1;B0;B1;B1;B0;_;_;_;_;_;B0;B0;B1;B0;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__807) -> let Rm = slice_raw v__807 (11:ii) (15:ii) in let op2 = slice_raw v__807 (20:ii) (21:ii) in let Rn = slice_raw v__807 (22:ii) (26:ii) in let Rd = slice_raw v__807 (27:ii) (31:ii) in let d = UInt_reg (reset_vector_start Rd) in let n = UInt_reg (reset_vector_start Rn) in let m = UInt_reg (reset_vector_start Rm) in let datasize = if bitU_to_bool (eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (64:ii) else (32:ii) in let shift_type = DecodeShift (reset_vector_start (set_vector_start 1 op2)) in return (Just (Shift (d,n,m,datasize,shift_type))) | ((Vector [sf;B0;B0;B1;B1;B0;B1;B0;B1;B1;B0;_;_;_;_;_;B0;B1;B0;C;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__813) -> let Rm = slice_raw v__813 (11:ii) (15:ii) in let sz = slice_raw v__813 (20:ii) (21:ii) in let Rn = slice_raw v__813 (22:ii) (26:ii) in let Rd = slice_raw v__813 (27:ii) (31:ii) in let d = UInt_reg (reset_vector_start Rd) in let n = UInt_reg (reset_vector_start Rn) in let m = UInt_reg (reset_vector_start Rm) in (if bitU_to_bool ((eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) &. (neq_vec (set_vector_start_to_length sz, set_vector_start_to_length (Vector [B1;B1] 1 false)))) then UnallocatedEncoding () else return ()) >> (if bitU_to_bool ((eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) &. (eq_vec (set_vector_start_to_length sz, set_vector_start_to_length (Vector [B1;B1] 1 false)))) then UnallocatedEncoding () else return ()) >> let size = lsl' ((8:ii),UInt (reset_vector_start (set_vector_start_to_length sz))) in let crc32c = eq (match C with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in return (Just (CRC (d,n,m,size,crc32c))) end let decodeExceptionGeneration = function | ((Vector [B1;B1;B0;B1;B0;B1;B0;B0;B0;B0;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;B0;B0;B0;B0;B1] _ _) as v__771) -> let imm16 = slice_raw v__771 (11:ii) (26:ii) in let imm = imm16 in return (Just (GenerateExceptionEL1 (reset_vector_start imm))) | ((Vector [B1;B1;B0;B1;B0;B1;B0;B0;B0;B0;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;B0;B0;B0;B1;B0] _ _) as v__776) -> let imm16 = slice_raw v__776 (11:ii) (26:ii) in let imm = imm16 in return (Just (GenerateExceptionEL2 (reset_vector_start imm))) | ((Vector [B1;B1;B0;B1;B0;B1;B0;B0;B0;B0;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;B0;B0;B0;B1;B1] _ _) as v__781) -> let imm16 = slice_raw v__781 (11:ii) (26:ii) in let imm = imm16 in return (Just (GenerateExceptionEL3 (reset_vector_start imm))) | ((Vector [B1;B1;B0;B1;B0;B1;B0;B0;B0;B0;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;B0;B0;B0;B0;B0] _ _) as v__786) -> let imm16 = slice_raw v__786 (11:ii) (26:ii) in let comment = imm16 in return (Just (DebugBreakpoint (reset_vector_start comment))) | ((Vector [B1;B1;B0;B1;B0;B1;B0;B0;B0;B1;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;B0;B0;B0;B0;B0] _ _) as v__791) -> let imm16 = slice_raw v__791 (11:ii) (26:ii) in return (Just (ExternalDebugBreakpoint)) | ((Vector [B1;B1;B0;B1;B0;B1;B0;B0;B1;B0;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;B0;B0;B0;_;_] _ _) as v__796) -> let imm16 = slice_raw v__796 (11:ii) (26:ii) in let LL = slice_raw v__796 (30:ii) (31:ii) in let target_level = LL in (if bitU_to_bool (eq_vec (set_vector_start_to_length LL, set_vector_start_to_length (Vector [B0;B0] 1 false))) then UnallocatedEncoding () else return ()) >> return (Just (DebugSwitchToExceptionLevel (reset_vector_start target_level))) end let decodeSystem = function | ((Vector [B1;B1;B0;B1;B0;B1;B0;B1;B0;B0;B0;B0;B0;_;_;_;B0;B1;B0;B0;_;_;_;_;_;_;_;B1;B1;B1;B1;B1] _ _) as v__706) -> let op1 = slice_raw v__706 (13:ii) (15:ii) in let CRm = slice_raw v__706 (20:ii) (23:ii) in let op2 = slice_raw v__706 (24:ii) (26:ii) in let operand = set_vector_start 3 CRm in let field' = match toNatural (0:ii) with | (0:nn) -> PSTATEField_DAIFSet | (1:nn) -> PSTATEField_DAIFClr | (2:nn) -> PSTATEField_SP end in match ((set_vector_start_to_length op1) ^^ (set_vector_start_to_length op2)) with | ((Vector [B0;B0;B0;B1;B0;B1] _ _) as v__712) -> return PSTATEField_SP | ((Vector [B0;B1;B1;B1;B1;B0] _ _) as v__715) -> return PSTATEField_DAIFSet | ((Vector [B0;B1;B1;B1;B1;B1] _ _) as v__718) -> return PSTATEField_DAIFClr | _ -> UnallocatedEncoding () >> return field' end >>= fun field' -> return (Just (MoveSystemImmediate (reset_vector_start operand,field'))) | ((Vector [B1;B1;B0;B1;B0;B1;B0;B1;B0;B0;B0;B0;B0;B0;B1;B1;B0;B0;B1;B0;_;_;_;_;_;_;_;B1;B1;B1;B1;B1] _ _) as v__721) -> let CRm = slice_raw v__721 (20:ii) (23:ii) in let op2 = slice_raw v__721 (24:ii) (26:ii) in let op = match toNatural (0:ii) with | (0:nn) -> SystemHintOp_NOP | (1:nn) -> SystemHintOp_YIELD | (2:nn) -> SystemHintOp_WFE | (3:nn) -> SystemHintOp_WFI | (4:nn) -> SystemHintOp_SEV | (5:nn) -> SystemHintOp_SEVL end in let op = match ((set_vector_start_to_length CRm) ^^ (set_vector_start_to_length op2)) with | ((Vector [B0;B0;B0;B0;B0;B0;B0] _ _) as v__728) -> SystemHintOp_NOP | ((Vector [B0;B0;B0;B0;B0;B0;B1] _ _) as v__731) -> SystemHintOp_YIELD | ((Vector [B0;B0;B0;B0;B0;B1;B0] _ _) as v__734) -> SystemHintOp_WFE | ((Vector [B0;B0;B0;B0;B0;B1;B1] _ _) as v__737) -> SystemHintOp_WFI | ((Vector [B0;B0;B0;B0;B1;B0;B0] _ _) as v__740) -> SystemHintOp_SEV | ((Vector [B0;B0;B0;B0;B1;B0;B1] _ _) as v__743) -> SystemHintOp_SEVL | _ -> SystemHintOp_NOP end in return (Just (Hint op)) | ((Vector [B1;B1;B0;B1;B0;B1;B0;B1;B0;B0;B0;B0;B0;B0;B1;B1;B0;B0;B1;B1;_;_;_;_;B0;B1;B0;B1;B1;B1;B1;B1] _ _) as v__746) -> let CRm = slice_raw v__746 (20:ii) (23:ii) in let imm = unsigned (reset_vector_start CRm) in return (Just (ClearExclusiveMonitor imm)) | ((Vector [B1;B1;B0;B1;B0;B1;B0;B1;B0;B0;B0;B0;B0;B0;B1;B1;B0;B0;B1;B1;_;_;_;_;B1;_;_;B1;B1;B1;B1;B1] _ _) as v__754) -> let CRm = slice_raw v__754 (20:ii) (23:ii) in let opc = slice_raw v__754 (25:ii) (26:ii) in let op = match toNatural (0:ii) with | (0:nn) -> MemBarrierOp_DSB | (1:nn) -> MemBarrierOp_DMB | (2:nn) -> MemBarrierOp_ISB end in let domain = match toNatural (0:ii) with | (0:nn) -> MBReqDomain_Nonshareable | (1:nn) -> MBReqDomain_InnerShareable | (2:nn) -> MBReqDomain_OuterShareable | (3:nn) -> MBReqDomain_FullSystem end in let types = match toNatural (0:ii) with | (0:nn) -> MBReqTypes_Reads | (1:nn) -> MBReqTypes_Writes | (2:nn) -> MBReqTypes_All end in match opc with | Vector [B0;B0] _ _ -> return MemBarrierOp_DSB | Vector [B0;B1] _ _ -> return MemBarrierOp_DMB | Vector [B1;B0] _ _ -> return MemBarrierOp_ISB | _ -> UnallocatedEncoding () >> return op end >>= fun op -> let domain = match (slice CRm (3:ii) (2:ii)) with | Vector [B0;B0] _ _ -> MBReqDomain_OuterShareable | Vector [B0;B1] _ _ -> MBReqDomain_Nonshareable | Vector [B1;B0] _ _ -> MBReqDomain_InnerShareable | Vector [B1;B1] _ _ -> MBReqDomain_FullSystem end in let (domain, types) = match (slice CRm (1:ii) (0:ii)) with | Vector [B0;B1] _ _ -> let types = MBReqTypes_Reads in (domain,types) | Vector [B1;B0] _ _ -> let types = MBReqTypes_Writes in (domain,types) | Vector [B1;B1] _ _ -> let types = MBReqTypes_All in (domain,types) | _ -> let types = MBReqTypes_All in let domain = MBReqDomain_FullSystem in (domain,types) end in return (Just (Barrier (op,domain,types))) | ((Vector [B1;B1;B0;B1;B0;B1;B0;B1;B0;B0;L;B0;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__762) -> let op1 = slice_raw v__762 (13:ii) (15:ii) in let CRn = slice_raw v__762 (16:ii) (19:ii) in let CRm = slice_raw v__762 (20:ii) (23:ii) in let op2 = slice_raw v__762 (24:ii) (26:ii) in let Rt = slice_raw v__762 (27:ii) (31:ii) in let t = UInt_reg (reset_vector_start Rt) in let sys_op0 = (1:ii) in let sys_op1 = UInt (reset_vector_start (set_vector_start_to_length op1)) in let sys_op2 = UInt (reset_vector_start (set_vector_start_to_length op2)) in let sys_crn = UInt (reset_vector_start (set_vector_start_to_length CRn)) in let sys_crm = UInt (reset_vector_start (set_vector_start_to_length CRm)) in let has_result = eq (match L with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in return (Just (System (t,sys_op0,sys_op1,sys_op2,sys_crn,sys_crm,has_result))) | ((Vector [B1;B1;B0;B1;B0;B1;B0;B1;B0;B0;L;B1;o0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__766) -> let op1 = slice_raw v__766 (13:ii) (15:ii) in let CRn = slice_raw v__766 (16:ii) (19:ii) in let CRm = slice_raw v__766 (20:ii) (23:ii) in let op2 = slice_raw v__766 (24:ii) (26:ii) in let Rt = slice_raw v__766 (27:ii) (31:ii) in let t = UInt_reg (reset_vector_start Rt) in let sys_op0 = (2:ii) + (UInt (reset_vector_start (set_vector_start_to_length (Vector [o0] 0 false)))) in let sys_op1 = UInt (reset_vector_start (set_vector_start_to_length op1)) in let sys_op2 = UInt (reset_vector_start (set_vector_start_to_length op2)) in let sys_crn = UInt (reset_vector_start (set_vector_start_to_length CRn)) in let sys_crm = UInt (reset_vector_start (set_vector_start_to_length CRm)) in let read = eq (match L with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in return (Just (MoveSystemRegister (t,sys_op0,sys_op1,sys_op2,sys_crn,sys_crm,read))) end let ASR_C (x, shift) = let extended_x = set_vector_start_to_length (SignExtend (shift + (length x),reset_vector_start (set_vector_start_to_length x))) in let result = set_vector_start_to_length (slice (set_vector_start_to_length extended_x) ((shift + (length (reset_vector_start (set_vector_start_to_length x)))) - (1:ii)) shift) in let carry_out = access (set_vector_start_to_length extended_x) (shift - (1:ii)) in (set_vector_start_to_length result,carry_out) let ASR (x, shift) = let result = set_vector_start_to_length (to_vec_dec (length x,(0:ii))) in if bitU_to_bool (eq_range (shift, (0:ii))) then set_vector_start_to_length x else let (result', _) = match (ASR_C (reset_vector_start (set_vector_start_to_length x),shift)) with | (v0v', v1v') -> (v0v',v1v') end in set_vector_start_to_length result' let LSR (x, shift) = let result = set_vector_start_to_length (to_vec_dec (length x,(0:ii))) in if bitU_to_bool (eq_range (shift, (0:ii))) then set_vector_start_to_length x else let (result', _) = match (LSR_C (reset_vector_start (set_vector_start_to_length x),shift)) with | (v0v', v1v') -> (v0v',v1v') end in set_vector_start_to_length result' let AArch64_ResetGeneralRegisters () = (foreachM_inc ((0:ii),(30:ii),(1:ii)) () (fun i _ -> wX (i,reset_vector_start (set_vector_start_to_length (to_vec_dec ((64:ii),UNKNOWN)))))) let AArch64_ResetSIMDFPRegisters () = (foreachM_inc ((0:ii),(31:ii),(1:ii)) () (fun i _ -> wV (i,reset_vector_start (set_vector_start_to_length (to_vec_dec ((128:ii),UNKNOWN)))))) let wMem'IFP = BigEndianIFP let IsFault addrdesc = neq (addrdesc.AddressDescriptor_fault.FaultRecord_type', Fault_None) let Extend (N', x, unsigned) = if bitU_to_bool unsigned then set_vector_start_to_length (ZeroExtend (N',reset_vector_start (set_vector_start_to_length x))) else set_vector_start_to_length (SignExtend (N',reset_vector_start (set_vector_start_to_length x))) let _rMem (read_buffer, desc, size, acctype, exclusive) = if bitU_to_bool (eq_range (read_buffer.read_buffer_type_size, (0:ii))) then <| read_buffer_type_acctype = acctype; read_buffer_type_exclusive = exclusive; read_buffer_type_address = desc.AddressDescriptor_paddress.FullAddress_physicaladdress; read_buffer_type_size = size |> else let _ = assert' (eq (read_buffer.read_buffer_type_acctype, acctype)) (Nothing) in let _ = assert' (eq_bit (read_buffer.read_buffer_type_exclusive, exclusive)) (Nothing) in let _ = assert' (eq_vec (set_vector_start_to_length (set_vector_start 63 (add_VIV (reset_vector_start (set_vector_start_to_length read_buffer.read_buffer_type_address)) read_buffer.read_buffer_type_size)), set_vector_start_to_length desc.AddressDescriptor_paddress.FullAddress_physicaladdress)) (Nothing) in <|read_buffer with read_buffer_type_size = (read_buffer.read_buffer_type_size + size)|> let CheckSPAlignmentIFP = PSTATE_ELfp :: rSPIFP let SCR_GEN () = let _ = assert' (HaveEL (reset_vector_start EL3)) (Nothing) in if bitU_to_bool (HighestELUsingAArch32 ()) then SCR else SCR_EL3 let AArch64_AlignmentFault (acctype, iswrite, secondstage) = let ipaddress = to_vec_dec ((48:ii),UNKNOWN) in let level = UNKNOWN in let extflag = if bitU_to_bool (is_one UNKNOWN) then B1 else B0 in let s2fs1walk = if bitU_to_bool (is_one UNKNOWN) then B1 else B0 in AArch64_CreateFaultRecord (Fault_Alignment, reset_vector_start ipaddress, level, acctype, iswrite, extflag, secondstage, s2fs1walk) let AArch64_NoFault () = let ipaddress = to_vec_dec ((48:ii),UNKNOWN) in let level = UNKNOWN in let acctype = AccType_NORMAL in let iswrite = if bitU_to_bool (is_one UNKNOWN) then B1 else B0 in let extflag = if bitU_to_bool (is_one UNKNOWN) then B1 else B0 in let secondstage = B0 in let s2fs1walk = B0 in AArch64_CreateFaultRecord (Fault_None, reset_vector_start ipaddress, level, acctype, iswrite, extflag, secondstage, s2fs1walk) let decodeConditionalBranchImmediate ((Vector [B0;B1;B0;B1;B0;B1;B0;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;B0;_;_;_;_] _ _) as v__702) = let imm19 = slice_raw v__702 (8:ii) (26:ii) in let _cond = slice_raw v__702 (28:ii) (31:ii) in let offset = SignExtend ((64:ii), reset_vector_start (set_vector_start_to_length ((set_vector_start_to_length imm19) ^^ (set_vector_start_to_length (Vector [B0;B0] 1 false))))) in let condition = set_vector_start 3 _cond in Just (BranchConditional (reset_vector_start offset,reset_vector_start condition)) let _wMem (write_buffer, desc, size, acctype, exclusive, value) = if bitU_to_bool (eq_range (write_buffer.write_buffer_type_size, (0:ii))) then <| write_buffer_type_acctype = acctype; write_buffer_type_exclusive = exclusive; write_buffer_type_address = desc.AddressDescriptor_paddress.FullAddress_physicaladdress; write_buffer_type_value = (ZeroExtend ((128:ii),reset_vector_start (set_vector_start_to_length value))); write_buffer_type_size = size |> else let _ = assert' (eq (write_buffer.write_buffer_type_acctype, acctype)) (Nothing) in let _ = assert' (eq_bit (write_buffer.write_buffer_type_exclusive, exclusive)) (Nothing) in let _ = assert' (eq_vec (set_vector_start_to_length (set_vector_start 63 (add_VIV (reset_vector_start (set_vector_start_to_length write_buffer.write_buffer_type_address)) write_buffer.write_buffer_type_size)), set_vector_start_to_length desc.AddressDescriptor_paddress.FullAddress_physicaladdress)) (Nothing) in <|write_buffer with write_buffer_type_value = (ZeroExtend ((128:ii), reset_vector_start (set_vector_start_to_length ((set_vector_start_to_length value) ^^ (set_vector_start_to_length (slice (set_vector_start_to_length write_buffer.write_buffer_type_value) ((write_buffer.write_buffer_type_size * (8:ii)) - (1:ii)) (0:ii))))))); write_buffer_type_size = (write_buffer.write_buffer_type_size + size)|> let HaveAArch32EL el = if bitU_to_bool (~(HaveEL (reset_vector_start el))) then B0 else if bitU_to_bool (~(HaveAnyAArch32 ())) then B0 else if bitU_to_bool (HighestELUsingAArch32 ()) then B1 else if bitU_to_bool (eq_vec (set_vector_start_to_length el, set_vector_start_to_length EL0)) then B1 else IMPLEMENTATION_DEFINED.IMPLEMENTATION_DEFINED_type_HaveAArch32EL let decodeUnconditionalBranchImmediate ((Vector [op;B0;B0;B1;B0;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__699) = let imm26 = slice_raw v__699 (6:ii) (31:ii) in let branch_type = if bitU_to_bool (eq (match op with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then BranchType_CALL else BranchType_JMP in let offset = SignExtend ((64:ii), reset_vector_start (set_vector_start_to_length ((set_vector_start_to_length imm26) ^^ (set_vector_start_to_length (Vector [B0;B0] 1 false))))) in Just (BranchImmediate (branch_type,reset_vector_start offset)) let decodeCompareBranchImmediate ((Vector [sf;B0;B1;B1;B0;B1;B0;op;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__695) = let imm19 = slice_raw v__695 (8:ii) (26:ii) in let Rt = slice_raw v__695 (27:ii) (31:ii) in let t = UInt_reg (reset_vector_start Rt) in let datasize = if bitU_to_bool (eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (64:ii) else (32:ii) in let iszero = eq (match op with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii)) in let offset = SignExtend ((64:ii), reset_vector_start (set_vector_start_to_length ((set_vector_start_to_length imm19) ^^ (set_vector_start_to_length (Vector [B0;B0] 1 false))))) in Just (CompareAndBranch (t,datasize,iszero,reset_vector_start offset)) let decodePCRelAddressing ((Vector [op;_;_;B1;B0;B0;B0;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__692) = let immlo = slice_raw v__692 (1:ii) (2:ii) in let immhi = slice_raw v__692 (8:ii) (26:ii) in let Rd = slice_raw v__692 (27:ii) (31:ii) in let d = UInt_reg (reset_vector_start Rd) in let page = eq (match op with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)) in let imm = to_vec_dec ((64:ii),(0:ii)) in let imm = if bitU_to_bool page then SignExtend ((64:ii), reset_vector_start (set_vector_start_to_length ((set_vector_start_to_length immhi) ^^ (set_vector_start_to_length ((set_vector_start_to_length immlo) ^^ (set_vector_start_to_length (duplicate_bits (set_vector_start_to_length (Vector [B0] 0 false), (12:ii))))))))) else SignExtend ((64:ii), reset_vector_start (set_vector_start_to_length ((set_vector_start_to_length immhi) ^^ (set_vector_start_to_length immlo)))) in Just (Address (d,page,reset_vector_start imm)) let decodeTestBranchImmediate ((Vector [b5;B0;B1;B1;B0;B1;B1;op;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__688) = let b40 = slice_raw v__688 (8:ii) (12:ii) in let imm14 = slice_raw v__688 (13:ii) (26:ii) in let Rt = slice_raw v__688 (27:ii) (31:ii) in let t = UInt_reg (reset_vector_start Rt) in let datasize = if bitU_to_bool (eq (match b5 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (64:ii) else (32:ii) in let bit_pos = UInt (reset_vector_start (set_vector_start_to_length ((set_vector_start_to_length (Vector [b5] 0 false)) ^^ (set_vector_start_to_length b40)))) in let bit_val = op in let offset = SignExtend ((64:ii), reset_vector_start (set_vector_start_to_length ((set_vector_start_to_length imm14) ^^ (set_vector_start_to_length (Vector [B0;B0] 1 false))))) in Just (TestBitAndBranch (t,datasize,bit_pos,bit_val,reset_vector_start offset)) let decodeLoadStoreRegisterRegisterOffset ((Vector [_;_;B1;B1;B1;B0;B0;B0;_;_;B1;_;_;_;_;_;_;_;_;S;B1;B0;_;_;_;_;_;_;_;_;_;_] _ _) as v__681) = let size = slice_raw v__681 (0:ii) (1:ii) in let opc = slice_raw v__681 (8:ii) (9:ii) in let Rm = slice_raw v__681 (11:ii) (15:ii) in let option_v = slice_raw v__681 (16:ii) (18:ii) in let Rn = slice_raw v__681 (22:ii) (26:ii) in let Rt = slice_raw v__681 (27:ii) (31:ii) in let wback = B0 in let postindex = B0 in let scale = UInt (reset_vector_start (set_vector_start_to_length size)) in (if bitU_to_bool (eq (match (access (set_vector_start_to_length option_v) (1:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) then UnallocatedEncoding () else return ()) >> let extend_type = DecodeRegExtend (reset_vector_start (set_vector_start 2 option_v)) in let shift = if bitU_to_bool (eq (match S with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then scale else (0:ii) in sharedDecodeLoadRegister (reset_vector_start Rn, reset_vector_start Rt, reset_vector_start Rm, reset_vector_start (set_vector_start 1 opc), reset_vector_start (set_vector_start 1 size), wback, postindex, scale, extend_type, shift) let decodeLoadRegisterLiteral ((Vector [_;_;B0;B1;B1;B0;B0;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__677) = let opc = slice_raw v__677 (0:ii) (1:ii) in let imm19 = slice_raw v__677 (8:ii) (26:ii) in let Rt = slice_raw v__677 (27:ii) (31:ii) in let t = UInt_reg (reset_vector_start Rt) in let memop = MemOp_LOAD in let _signed = B0 in let size = (0:ii) in let offset = to_vec_dec ((64:ii),(4:ii)) in let (memop, _signed, size) = match opc with | Vector [B0;B0] _ _ -> let size = (4:ii) in (memop,_signed,size) | Vector [B0;B1] _ _ -> let size = (8:ii) in (memop,_signed,size) | Vector [B1;B0] _ _ -> let size = (4:ii) in let _signed = B1 in (memop,_signed,size) | Vector [B1;B1] _ _ -> let memop = MemOp_PREFETCH in (memop,_signed,size) end in let offset = SignExtend ((64:ii), reset_vector_start (set_vector_start_to_length ((set_vector_start_to_length imm19) ^^ (set_vector_start_to_length (Vector [B0;B0] 1 false))))) in let datasize = size * (8:ii) in Just (LoadLiteral (t,memop,_signed,size,reset_vector_start offset,datasize)) let ROR_C (x, shift) = let N = length (reset_vector_start (set_vector_start_to_length x)) in let m = modulo shift N in let result = set_vector_start_to_length (bitwise_or (set_vector_start_to_length (LSR (reset_vector_start (set_vector_start_to_length x),m)), set_vector_start_to_length (LSL (reset_vector_start (set_vector_start_to_length x),N - m)))) in let carry_out = access (set_vector_start_to_length result) (N - (1:ii)) in (set_vector_start_to_length result,carry_out) let decodeSystemImplementationDefined machineCode = match machineCode with | ((Vector [_;_;_;_;_;_;_;_;_;_;_;B0;B1;_;_;_;B1;_;B1;B1;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__647) -> return (decodeImplementationDefined (reset_vector_start machineCode)) | ((Vector [_;_;_;_;_;_;_;_;_;_;_;B1;B1;_;_;_;B1;_;B1;B1;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__657) -> return (decodeImplementationDefined (reset_vector_start machineCode)) | ((Vector [_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__667) -> decodeSystem (reset_vector_start machineCode) end let decodeLoadStoreRegisterImmediatePostIndexed ((Vector [_;_;B1;B1;B1;B0;B0;B0;_;_;B0;_;_;_;_;_;_;_;_;_;B0;B1;_;_;_;_;_;_;_;_;_;_] _ _) as v__641) = let size = slice_raw v__641 (0:ii) (1:ii) in let opc = slice_raw v__641 (8:ii) (9:ii) in let imm9 = slice_raw v__641 (11:ii) (19:ii) in let Rn = slice_raw v__641 (22:ii) (26:ii) in let Rt = slice_raw v__641 (27:ii) (31:ii) in let wback = B1 in let postindex = B1 in let scale = UInt (reset_vector_start (set_vector_start_to_length size)) in let offset = SignExtend ((64:ii),reset_vector_start (set_vector_start_to_length imm9)) in sharedDecodeLoadImmediate (reset_vector_start (set_vector_start 1 opc), reset_vector_start (set_vector_start 1 size), reset_vector_start Rn, reset_vector_start Rt, wback, postindex, scale, reset_vector_start offset, AccType_NORMAL, B0) let decodeLoadStoreRegisterImmediatePreIndexed ((Vector [_;_;B1;B1;B1;B0;B0;B0;_;_;B0;_;_;_;_;_;_;_;_;_;B1;B1;_;_;_;_;_;_;_;_;_;_] _ _) as v__635) = let size = slice_raw v__635 (0:ii) (1:ii) in let opc = slice_raw v__635 (8:ii) (9:ii) in let imm9 = slice_raw v__635 (11:ii) (19:ii) in let Rn = slice_raw v__635 (22:ii) (26:ii) in let Rt = slice_raw v__635 (27:ii) (31:ii) in let wback = B1 in let postindex = B0 in let scale = UInt (reset_vector_start (set_vector_start_to_length size)) in let offset = SignExtend ((64:ii),reset_vector_start (set_vector_start_to_length imm9)) in sharedDecodeLoadImmediate (reset_vector_start (set_vector_start 1 opc), reset_vector_start (set_vector_start 1 size), reset_vector_start Rn, reset_vector_start Rt, wback, postindex, scale, reset_vector_start offset, AccType_NORMAL, B0) let decodeLoadStoreRegisterUnprivileged ((Vector [_;_;B1;B1;B1;B0;B0;B0;_;_;B0;_;_;_;_;_;_;_;_;_;B1;B0;_;_;_;_;_;_;_;_;_;_] _ _) as v__629) = let size = slice_raw v__629 (0:ii) (1:ii) in let opc = slice_raw v__629 (8:ii) (9:ii) in let imm9 = slice_raw v__629 (11:ii) (19:ii) in let Rn = slice_raw v__629 (22:ii) (26:ii) in let Rt = slice_raw v__629 (27:ii) (31:ii) in let wback = B0 in let postindex = B0 in let scale = UInt (reset_vector_start (set_vector_start_to_length size)) in let offset = SignExtend ((64:ii),reset_vector_start (set_vector_start_to_length imm9)) in sharedDecodeLoadImmediate (reset_vector_start (set_vector_start 1 opc), reset_vector_start (set_vector_start 1 size), reset_vector_start Rn, reset_vector_start Rt, wback, postindex, scale, reset_vector_start offset, AccType_UNPRIV, B0) let decodeLoadStoreRegisterUnscaledImmediate ((Vector [_;_;B1;B1;B1;B0;B0;B0;_;_;B0;_;_;_;_;_;_;_;_;_;B0;B0;_;_;_;_;_;_;_;_;_;_] _ _) as v__623) = let size = slice_raw v__623 (0:ii) (1:ii) in let opc = slice_raw v__623 (8:ii) (9:ii) in let imm9 = slice_raw v__623 (11:ii) (19:ii) in let Rn = slice_raw v__623 (22:ii) (26:ii) in let Rt = slice_raw v__623 (27:ii) (31:ii) in let wback = B0 in let postindex = B0 in let scale = UInt (reset_vector_start (set_vector_start_to_length size)) in let offset = SignExtend ((64:ii),reset_vector_start (set_vector_start_to_length imm9)) in sharedDecodeLoadImmediate (reset_vector_start (set_vector_start 1 opc), reset_vector_start (set_vector_start 1 size), reset_vector_start Rn, reset_vector_start Rt, wback, postindex, scale, reset_vector_start offset, AccType_NORMAL, B1) let decodeLoadStoreRegisterUnsignedImmediate ((Vector [_;_;B1;B1;B1;B0;B0;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__619) = let size = slice_raw v__619 (0:ii) (1:ii) in let opc = slice_raw v__619 (8:ii) (9:ii) in let imm12 = slice_raw v__619 (10:ii) (21:ii) in let Rn = slice_raw v__619 (22:ii) (26:ii) in let Rt = slice_raw v__619 (27:ii) (31:ii) in let wback = B0 in let postindex = B0 in let scale = UInt (reset_vector_start (set_vector_start_to_length size)) in let offset = LSL (reset_vector_start (set_vector_start_to_length (ZeroExtend ((64:ii),reset_vector_start (set_vector_start_to_length imm12)))), scale) in sharedDecodeLoadImmediate (reset_vector_start (set_vector_start 1 opc), reset_vector_start (set_vector_start 1 size), reset_vector_start Rn, reset_vector_start Rt, wback, postindex, scale, reset_vector_start offset, AccType_NORMAL, B1) let decodeLoadStoreNoAllocatePairOffset ((Vector [_;_;B1;B0;B1;B0;B0;B0;B0;L;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__614) = let opc = slice_raw v__614 (0:ii) (1:ii) in let imm7 = slice_raw v__614 (10:ii) (16:ii) in let Rt2 = slice_raw v__614 (17:ii) (21:ii) in let Rn = slice_raw v__614 (22:ii) (26:ii) in let Rt = slice_raw v__614 (27:ii) (31:ii) in let wback = B0 in let postindex = B0 in let n = UInt_reg (reset_vector_start Rn) in let t = UInt_reg (reset_vector_start Rt) in let t2 = UInt_reg (reset_vector_start Rt2) in let acctype = AccType_STREAM in let memop = if bitU_to_bool (eq (match L with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then MemOp_LOAD else MemOp_STORE in (if bitU_to_bool (eq (match (access opc (0:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then UnallocatedEncoding () else return ()) >> let scale = (2:ii) + (UInt (reset_vector_start (set_vector_start_to_length (Vector [access opc (1:ii)] 0 false)))) in let datasize = lsl' ((8:ii),scale) in let offset = LSL (reset_vector_start (set_vector_start_to_length (SignExtend ((64:ii),reset_vector_start (set_vector_start_to_length imm7)))), scale) in return (Just (LoadStorePairNonTemp (wback,postindex,n,t,t2,acctype,memop,scale,datasize,reset_vector_start offset))) let sharedDecodeLoadStorePair (L, opc, imm7, Rn, Rt, Rt2, wback, postindex) = let n = UInt_reg Rn in let t = UInt_reg Rt in let t2 = UInt_reg Rt2 in let acctype = AccType_NORMAL in let memop = if bitU_to_bool (eq (L, (1:ii))) then MemOp_LOAD else MemOp_STORE in (if bitU_to_bool ((eq_vec (set_vector_start_to_length (Vector [if bitU_to_bool (is_one L) then B1 else B0;access opc (0:ii)] 1 false), set_vector_start_to_length (Vector [B0;B1] 1 false))) |. (eq_vec (set_vector_start_to_length opc, set_vector_start_to_length (Vector [B1;B1] 1 false)))) then UnallocatedEncoding () else return ()) >> let _signed = neq (match (access opc (0:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii)) in let scale = (2:ii) + (UInt (reset_vector_start (set_vector_start_to_length (Vector [access opc (1:ii)] 0 false)))) in let datasize = lsl' ((8:ii),scale) in let offset = LSL (reset_vector_start (set_vector_start_to_length (SignExtend ((64:ii),reset_vector_start imm7))), scale) in return (Just (LoadStorePair (wback,postindex,n,t,t2,acctype,memop,_signed,datasize,reset_vector_start offset))) let decodeDataRegister machineCode = match machineCode with | ((Vector [_;_;_;B0;B1;B0;B1;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__484) -> decodeLogicalShiftedRegister (reset_vector_start (set_vector_start_to_length machineCode)) | ((Vector [_;_;_;B0;B1;B0;B1;B1;_;_;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__497) -> decodeAddSubtractShiftedRegister (reset_vector_start (set_vector_start_to_length machineCode)) | ((Vector [_;_;_;B0;B1;B0;B1;B1;_;_;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__510) -> decodeAddSubtractExtendedRegister (reset_vector_start (set_vector_start_to_length machineCode)) | ((Vector [_;_;_;B1;B1;B0;B1;B0;B0;B0;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__523) -> return (decodeAddSubtractWithCarry (reset_vector_start (set_vector_start_to_length machineCode))) | ((Vector [_;_;_;B1;B1;B0;B1;B0;B0;B1;B0;_;_;_;_;_;_;_;_;_;B0;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__536) -> return (decodeConditionalCompareRegister (reset_vector_start machineCode)) | ((Vector [_;_;_;B1;B1;B0;B1;B0;B0;B1;B0;_;_;_;_;_;_;_;_;_;B1;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__549) -> return (decodeConditionalCompareImmediate (reset_vector_start machineCode)) | ((Vector [_;_;_;B1;B1;B0;B1;B0;B1;B0;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__562) -> return (decodeConditionalSelect (reset_vector_start machineCode)) | ((Vector [_;_;_;B1;B1;B0;B1;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__575) -> return (decodeData3Source (reset_vector_start machineCode)) | ((Vector [_;B0;_;B1;B1;B0;B1;B0;B1;B1;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__588) -> decodeData2Source (reset_vector_start machineCode) | ((Vector [_;B1;_;B1;B1;B0;B1;B0;B1;B1;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__601) -> decodeData1Source (reset_vector_start machineCode) end let ROR (x, shift) = let result = set_vector_start_to_length (to_vec_dec (length x,(0:ii))) in if bitU_to_bool (eq_range (shift, (0:ii))) then set_vector_start_to_length x else let (result', _) = match (ROR_C (reset_vector_start (set_vector_start_to_length x),shift)) with | (v0v', v1v') -> (v0v',v1v') end in set_vector_start_to_length result' let wMemIFP = wMem'IFP let decodeLoadStoreRegisterPairOffset ((Vector [_;_;B1;B0;B1;B0;B0;B1;B0;L;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__479) = let opc = slice_raw v__479 (0:ii) (1:ii) in let imm7 = slice_raw v__479 (10:ii) (16:ii) in let Rt2 = slice_raw v__479 (17:ii) (21:ii) in let Rn = slice_raw v__479 (22:ii) (26:ii) in let Rt = slice_raw v__479 (27:ii) (31:ii) in let wback = B0 in let postindex = B0 in sharedDecodeLoadStorePair (match L with | B0 -> (0:ii) | B1 -> (1:ii) end, reset_vector_start (set_vector_start 1 opc), reset_vector_start (set_vector_start_to_length imm7), reset_vector_start Rn, reset_vector_start Rt, reset_vector_start Rt2, wback, postindex) let decodeLoadStoreRegisterPairPostIndexed ((Vector [_;_;B1;B0;B1;B0;B0;B0;B1;L;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__474) = let opc = slice_raw v__474 (0:ii) (1:ii) in let imm7 = slice_raw v__474 (10:ii) (16:ii) in let Rt2 = slice_raw v__474 (17:ii) (21:ii) in let Rn = slice_raw v__474 (22:ii) (26:ii) in let Rt = slice_raw v__474 (27:ii) (31:ii) in let wback = B1 in let postindex = B1 in sharedDecodeLoadStorePair (match L with | B0 -> (0:ii) | B1 -> (1:ii) end, reset_vector_start (set_vector_start 1 opc), reset_vector_start (set_vector_start_to_length imm7), reset_vector_start Rn, reset_vector_start Rt, reset_vector_start Rt2, wback, postindex) let decodeLoadStoreRegisterPairPreIndexed ((Vector [_;_;B1;B0;B1;B0;B0;B1;B1;L;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__469) = let opc = slice_raw v__469 (0:ii) (1:ii) in let imm7 = slice_raw v__469 (10:ii) (16:ii) in let Rt2 = slice_raw v__469 (17:ii) (21:ii) in let Rn = slice_raw v__469 (22:ii) (26:ii) in let Rt = slice_raw v__469 (27:ii) (31:ii) in let wback = B1 in let postindex = B0 in sharedDecodeLoadStorePair (match L with | B0 -> (0:ii) | B1 -> (1:ii) end, reset_vector_start (set_vector_start 1 opc), reset_vector_start (set_vector_start_to_length imm7), reset_vector_start Rn, reset_vector_start Rt, reset_vector_start Rt2, wback, postindex) let IsSecureBelowEL3 () = if bitU_to_bool (HaveEL (reset_vector_start EL3)) then read_reg_bitfield (SCR_GEN ()) "NS" >>= fun w__0 -> return (eq (match w__0 with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) else return (if bitU_to_bool (HaveEL (reset_vector_start EL2)) then B0 else IMPLEMENTATION_DEFINED.IMPLEMENTATION_DEFINED_type_IsSecureBelowEL3) let AArch64_ResetSpecialRegisters () = write_reg SP_EL0 (to_vec_dec ((64:ii),UNKNOWN)) >> write_reg SP_EL1 (to_vec_dec ((64:ii),UNKNOWN)) >> write_reg SPSR_EL1 (to_vec_dec ((32:ii),UNKNOWN)) >> write_reg ELR_EL1 (to_vec_dec ((64:ii),UNKNOWN)) >> (if bitU_to_bool (HaveEL (reset_vector_start EL2)) then write_reg SP_EL2 (to_vec_dec ((64:ii),UNKNOWN)) >> write_reg SPSR_EL2 (to_vec_dec ((32:ii),UNKNOWN)) >> write_reg ELR_EL2 (to_vec_dec ((64:ii),UNKNOWN)) else return ()) >> (if bitU_to_bool (HaveEL (reset_vector_start EL3)) then write_reg SP_EL3 (to_vec_dec ((64:ii),UNKNOWN)) >> write_reg SPSR_EL3 (to_vec_dec ((32:ii),UNKNOWN)) >> write_reg ELR_EL3 (to_vec_dec ((64:ii),UNKNOWN)) else return ()) >> let _ = if bitU_to_bool (HaveAArch32EL (reset_vector_start EL1)) then let SPSR_fiq = to_vec_dec ((32:ii),UNKNOWN) in let SPSR_irq = to_vec_dec ((32:ii),UNKNOWN) in let SPSR_abt = to_vec_dec ((32:ii),UNKNOWN) in let SPSR_und = to_vec_dec ((32:ii),UNKNOWN) in () else () in let DLR_EL0 = to_vec_dec ((64:ii),UNKNOWN) in let DSPSR_EL0 = to_vec_dec ((32:ii),UNKNOWN) in return () let DecodeBitMasks (M', immN, imms, immr, immediate) = let M = length (reset_vector_start (set_vector_start_to_length (to_vec_dec (M',(0:ii))))) in let levels = to_vec_dec ((6:ii),(0:ii)) in let len = match (HighestSetBit (reset_vector_start (set_vector_start_to_length ((set_vector_start_to_length (Vector [immN] 0 false)) ^^ (set_vector_start_to_length (NOT (reset_vector_start (set_vector_start_to_length imms)))))))) with | Nothing -> let _ = assert' B0 (Just "DecodeBitMasks: HighestSetBit returned None") in (0:ii) | Just (c) -> c end in (if bitU_to_bool (lt (len, (1:ii))) then ReservedValue () else return ()) >> let _ = assert' (gteq (M, lsl' ((1:ii),len))) (Nothing) in let levels = ZeroExtend ((6:ii), reset_vector_start (set_vector_start_to_length (duplicate_bits (set_vector_start_to_length (Vector [B1] 0 false), len)))) in (if bitU_to_bool (immediate &. (eq_vec (set_vector_start_to_length (bitwise_and (set_vector_start_to_length imms, set_vector_start_to_length levels)), set_vector_start_to_length levels))) then ReservedValue () else return ()) >> let S = set_vector_start 5 (bitwise_and (set_vector_start_to_length imms, set_vector_start_to_length levels)) in let R = set_vector_start 5 (bitwise_and (set_vector_start_to_length immr, set_vector_start_to_length levels)) in let diff = set_vector_start 5 (minus_VVV (reset_vector_start (set_vector_start_to_length S)) (reset_vector_start (set_vector_start_to_length R))) in let esize = lsl' ((1:ii),len) in let d = set_vector_start 5 (slice diff (len - (1:ii)) (0:ii)) in let welem = set_vector_start_to_length (ZeroExtend (esize, reset_vector_start (set_vector_start_to_length (duplicate_bits (set_vector_start_to_length (Vector [B1] 0 false), add_VII (reset_vector_start (set_vector_start_to_length S)) (1:ii)))))) in let telem = set_vector_start_to_length (ZeroExtend (esize, reset_vector_start (set_vector_start_to_length (duplicate_bits (set_vector_start_to_length (Vector [B1] 0 false), add_VII (reset_vector_start (set_vector_start_to_length d)) (1:ii)))))) in let wmask = Replicate (M', reset_vector_start (set_vector_start_to_length (ROR (reset_vector_start (set_vector_start_to_length welem), unsigned (reset_vector_start R))))) in let tmask = Replicate (M',reset_vector_start (set_vector_start_to_length telem)) in return (set_vector_start_to_length wmask,set_vector_start_to_length tmask) let AArch64_TranslateAddress (vaddress, acctype, iswrite, wasaligned, size) = let _ = info "Translation is not implemented, return same address as the virtual (no fault, normal, shareable, non-secure)." in <| AddressDescriptor_fault = (AArch64_NoFault ()); AddressDescriptor_memattrs = (<| MemoryAttributes_type' = MemType_Normal; MemoryAttributes_shareable = B1 |>); AddressDescriptor_paddress = (<| FullAddress_physicaladdress = vaddress; FullAddress_NS = B1 |>) |> let ExtendReg (N', _reg, type', shift) = rX (N',_reg) >>= fun w__0 -> let _val = set_vector_start_to_length w__0 in let _unsigned = B0 in let len = (0:ii) in let (_unsigned, len) = match type' with | ExtendType_SXTB -> let _unsigned = B0 in let len = (8:ii) in (_unsigned,len) | ExtendType_SXTH -> let _unsigned = B0 in let len = (16:ii) in (_unsigned,len) | ExtendType_SXTW -> let _unsigned = B0 in let len = (32:ii) in (_unsigned,len) | ExtendType_SXTX -> let _unsigned = B0 in let len = (64:ii) in (_unsigned,len) | ExtendType_UXTB -> let _unsigned = B1 in let len = (8:ii) in (_unsigned,len) | ExtendType_UXTH -> let _unsigned = B1 in let len = (16:ii) in (_unsigned,len) | ExtendType_UXTW -> let _unsigned = B1 in let len = (32:ii) in (_unsigned,len) | ExtendType_UXTX -> let _unsigned = B1 in let len = (64:ii) in (_unsigned,len) end in let len = uMin (len,(length (reset_vector_start (set_vector_start_to_length _val))) - shift) in return (set_vector_start_to_length (Extend (length _val, reset_vector_start (set_vector_start_to_length ((set_vector_start_to_length (slice (set_vector_start_to_length _val) (len - (1:ii)) (0:ii))) ^^ (set_vector_start_to_length (set_vector_start_to_length (Zeros shift))))), _unsigned))) let ShiftReg (N', _reg, type', amount) = rX (N',_reg) >>= fun w__0 -> let result = set_vector_start_to_length w__0 in let result = match type' with | ShiftType_LSL -> set_vector_start_to_length (LSL (reset_vector_start (set_vector_start_to_length result),amount)) | ShiftType_LSR -> set_vector_start_to_length (LSR (reset_vector_start (set_vector_start_to_length result),amount)) | ShiftType_ASR -> set_vector_start_to_length (ASR (reset_vector_start (set_vector_start_to_length result),amount)) | ShiftType_ROR -> set_vector_start_to_length (ROR (reset_vector_start (set_vector_start_to_length result),amount)) end in return (set_vector_start_to_length result) let initial_analysis instr = let iR = [] in let oR = [] in let aR = [] in let Nias = [NIAFP_successor] in let Dia = DIAFP_none in let ik = IK_simple in match instr with | TMStart (t) -> let iR = TxNestingLevelfp :: TXIDR_EL0_DEPTHfp :: iR in let oR = TxNestingLevelfp :: (oR ++ (xFP t)) in let ik = IK_trans Transaction_start in return (aR,Nias,iR,oR,ik) | TMCommit -> let iR = TxNestingLevelfp :: iR in let oR = TxNestingLevelfp :: oR in let ik = IK_trans Transaction_commit in return (aR,Nias,iR,oR,ik) | TMAbort (retry,reason) -> let iR = TxNestingLevelfp :: iR in let ik = IK_trans Transaction_abort in return (aR,Nias,iR,oR,ik) | TMTest -> let iR = TxNestingLevelfp :: iR in let oR = (RFull "NZCV") :: oR in return (aR,Nias,iR,oR,ik) | CompareAndBranch (t,datasize,iszero,offset) -> let iR = iR ++ (xFP t) in let (i, o) = match (BranchToFP (iR,oR)) with | (v0v', v1v') -> (v0v',v1v') end in let iR = i in let oR = o in rPC () >>= fun w__0 -> let nia' = set_vector_start 63 (add_VVV (reset_vector_start (set_vector_start_to_length w__0)) (reset_vector_start (set_vector_start_to_length offset))) in let Nias = [NIAFP_concrete_address (reset_vector_start nia');NIAFP_successor] in let ik = IK_branch in return (aR,Nias,iR,oR,ik) | BranchConditional (offset,condition) -> let iR = iR ++ (ConditionHoldsIFP (reset_vector_start condition)) in let (i, o) = match (BranchToFP (iR,oR)) with | (v2v', v3v') -> (v2v',v3v') end in let iR = i in let oR = o in rPC () >>= fun w__1 -> let Nias = [NIAFP_concrete_address (reset_vector_start (set_vector_start 63 (add_VVV (reset_vector_start (set_vector_start_to_length w__1)) (reset_vector_start (set_vector_start_to_length offset)))));NIAFP_successor] in let ik = IK_branch in return (aR,Nias,iR,oR,ik) | GenerateExceptionEL1 (imm) -> not_implemented "GenerateExceptionEL1" >> return (aR,Nias,iR,oR,ik) | GenerateExceptionEL2 (imm) -> not_implemented "GenerateExceptionEL2" >> return (aR,Nias,iR,oR,ik) | GenerateExceptionEL3 (imm) -> not_implemented "GenerateExceptionEL3" >> return (aR,Nias,iR,oR,ik) | DebugBreakpoint (comment) -> not_implemented "DebugBreakpoint" >> return (aR,Nias,iR,oR,ik) | ExternalDebugBreakpoint -> not_implemented "ExternalDebugBreakpoint" >> return (aR,Nias,iR,oR,ik) | DebugSwitchToExceptionLevel (target_level) -> not_implemented "DebugSwitchToExceptionLevel" >> return (aR,Nias,iR,oR,ik) | MoveSystemImmediate (operand,field') -> let (iR, oR) = match field' with | PSTATEField_SP -> let oR = PSTATE_SPfp :: oR in (iR,oR) | PSTATEField_DAIFSet -> let iR = iR ++ [PSTATE_Ffp;PSTATE_Ifp;PSTATE_Afp;PSTATE_Dfp] in let oR = oR ++ [PSTATE_Ffp;PSTATE_Ifp;PSTATE_Afp;PSTATE_Dfp] in (iR,oR) | PSTATEField_DAIFClr -> let iR = iR ++ [PSTATE_Ffp;PSTATE_Ifp;PSTATE_Afp;PSTATE_Dfp] in let oR = oR ++ [PSTATE_Ffp;PSTATE_Ifp;PSTATE_Afp;PSTATE_Dfp] in (iR,oR) end in return (aR,Nias,iR,oR,ik) | Hint (op) -> match op with | SystemHintOp_YIELD -> return () | SystemHintOp_WFE -> EventRegistered () >>= fun w__2 -> if bitU_to_bool w__2 then return () else not_implemented "Hint(SystemHintOp_WFE);" | SystemHintOp_WFI -> not_implemented "Hint(SystemHintOp_WFI);" | SystemHintOp_SEV -> return () | SystemHintOp_SEVL -> not_implemented "Hint(SystemHintOp_SEVL);" | _ -> return () end >> return (aR,Nias,iR,oR,ik) | ClearExclusiveMonitor (imm) -> return (aR,Nias,iR,oR,ik) | Barrier (op,domain,types) -> let ik = match op with | MemBarrierOp_DSB -> match types with | MBReqTypes_Reads -> IK_barrier Barrier_DSB_LD | MBReqTypes_Writes -> IK_barrier Barrier_DSB_ST | MBReqTypes_All -> IK_barrier Barrier_DSB end | MemBarrierOp_DMB -> match types with | MBReqTypes_Reads -> IK_barrier Barrier_DMB_LD | MBReqTypes_Writes -> IK_barrier Barrier_DMB_ST | MBReqTypes_All -> IK_barrier Barrier_DMB end | MemBarrierOp_ISB -> IK_barrier Barrier_ISB end in return (aR,Nias,iR,oR,ik) | System (t,sys_op0,sys_op1,sys_op2,sys_crn,sys_crm,has_result) -> let oR = oR ++ (xFP t) in not_implemented "System" >> return (aR,Nias,iR,oR,ik) | MoveSystemRegister (t,sys_op0,sys_op1,sys_op2,sys_crn,sys_crm,read) -> let (oR, iR) = if bitU_to_bool read then let oR = oR ++ (xFP t) in let iR = match toNaturalFiveTup (sys_op0,sys_op1,sys_crn,sys_crm,sys_op2) with | ((3:nn), (3:nn), (4:nn), (2:nn), (0:nn)) -> (RFull "NZCV") :: iR | ((3:nn), (3:nn), (4:nn), (2:nn), (1:nn)) -> (RFull "DAIF") :: iR | ((3:nn), (3:nn), (13:nn), (0:nn), (2:nn)) -> (RFull "TPIDR_EL0") :: iR end in (oR,iR) else let iR = iR ++ (xFP t) in let oR = match toNaturalFiveTup (sys_op0,sys_op1,sys_crn,sys_crm,sys_op2) with | ((3:nn), (3:nn), (4:nn), (2:nn), (0:nn)) -> (RFull "NZCV") :: oR | ((3:nn), (3:nn), (4:nn), (2:nn), (1:nn)) -> (RFull "DAIF") :: oR | ((3:nn), (3:nn), (13:nn), (0:nn), (2:nn)) -> (RFull "TPIDR_EL0") :: oR end in (oR,iR) in return (aR,Nias,iR,oR,ik) | ImplementationDefinedTestBeginEnd (isEnd) -> return (aR,Nias,iR,oR,ik) | ImplementationDefinedStopFetching -> return (aR,Nias,iR,oR,ik) | ImplementationDefinedThreadStart -> return (aR,Nias,iR,oR,ik) | TestBitAndBranch (t,datasize,bit_pos,bit_val,offset) -> let iR = (xFP t) ++ iR in let (i, o) = match (BranchToFP (iR,oR)) with | (v4v', v5v') -> (v4v',v5v') end in let iR = i in let oR = o in rPC () >>= fun w__3 -> let Nias = [NIAFP_concrete_address (reset_vector_start (set_vector_start 63 (add_VVV (reset_vector_start (set_vector_start_to_length w__3)) (reset_vector_start (set_vector_start_to_length offset)))));NIAFP_successor] in let ik = IK_branch in return (aR,Nias,iR,oR,ik) | BranchImmediate (branch_type,offset) -> let (iR, oR) = if bitU_to_bool (eq (branch_type, BranchType_CALL)) then let iR = _PCfp :: iR in let oR = (xFP (30:ii)) ++ oR in (iR,oR) else (iR,oR) in let (i, o) = match (BranchToFP (iR,oR)) with | (v6v', v7v') -> (v6v',v7v') end in let iR = i in let oR = o in rPC () >>= fun w__4 -> let Nias = [NIAFP_concrete_address (reset_vector_start (set_vector_start 63 (add_VVV (reset_vector_start (set_vector_start_to_length w__4)) (reset_vector_start (set_vector_start_to_length offset)))))] in let ik = IK_branch in return (aR,Nias,iR,oR,ik) | BranchRegister (n,branch_type) -> let iR = iR ++ (xFP n) in let (iR, oR) = if bitU_to_bool (eq (branch_type, BranchType_CALL)) then let iR = _PCfp :: iR in let oR = (xFP (30:ii)) ++ oR in (iR,oR) else (iR,oR) in let (i, o) = match (BranchToFP (iR,oR)) with | (v8v', v9v') -> (v8v',v9v') end in let iR = i in let oR = o in let Nias = if bitU_to_bool (eq_range (n, (31:ii))) then [NIAFP_concrete_address (reset_vector_start (to_vec_dec ((64:ii),(0:ii))))] else [NIAFP_indirect_address] in let ik = IK_branch in return (aR,Nias,iR,oR,ik) | ExceptionReturn -> not_implemented "ExceptionReturn" >> return (aR,Nias,iR,oR,ik) | DebugRestorePState -> not_implemented "DebugRestorePState" >> return (aR,Nias,iR,oR,ik) | LoadLiteral (t,memop,_signed,size,offset,datasize) -> let iR = _PCfp :: iR in let oR = (xFP t) ++ oR in let aR = _PCfp :: aR in let (aR, ik) = match memop with | MemOp_LOAD -> let ik = IK_mem_read Read_plain in (aR,ik) | MemOp_PREFETCH -> let ik = IK_simple in let aR = [] in (aR,ik) end in return (aR,Nias,iR,oR,ik) | LoadStoreAcqExc (n,t,t2,s,acctype,excl,pair,memop,elsize,regsize,datasize) -> let rt_unknown = B0 in let rn_unknown = B0 in let (iR, aR) = if bitU_to_bool (eq_range (n, (31:ii))) then let iR = CheckSPAlignmentIFP ++ iR in let iR = rSPIFP ++ iR in let aR = rSPIFP ++ aR in (iR,aR) else let (iR, aR) = if bitU_to_bool rn_unknown then (iR,aR) else let iR = (xFP n) ++ iR in let aR = (xFP n) ++ aR in (iR,aR) in (iR,aR) in match memop with | MemOp_STORE -> let iR = if bitU_to_bool rt_unknown then iR else if bitU_to_bool pair then (xFP t) ++ ((xFP t2) ++ iR) else (xFP t) ++ iR in (if bitU_to_bool excl then let iR = iR ++ wMemIFP in let oR = (xFP s) ++ oR in wmem_kind (acctype,B1) >>= fun w__5 -> let ik = w__5 in return (iR,oR,ik) else let iR = iR ++ wMemIFP in wmem_kind (acctype,B0) >>= fun w__6 -> let ik = w__6 in return (iR,oR,ik)) >>= fun (iR, oR, ik) -> return (aR,iR,oR,ik) | MemOp_LOAD -> (if bitU_to_bool pair then let (iR, oR) = if bitU_to_bool rt_unknown then let oR = (xFP t) ++ oR in (iR,oR) else let (iR, oR) = if bitU_to_bool (eq_range (elsize, (32:ii))) then let iR = iR ++ BigEndianIFP in let oR = (xFP t) ++ ((xFP t2) ++ oR) in (iR,oR) else let oR = (xFP t) ++ ((xFP t2) ++ oR) in (iR,oR) in (iR,oR) in rmem_kind (acctype,B1) >>= fun w__7 -> let ik = w__7 in return (oR,iR,ik) else let oR = (xFP t) ++ oR in rmem_kind (acctype,excl) >>= fun w__8 -> let ik = w__8 in return (oR,iR,ik)) >>= fun (oR, iR, ik) -> return (aR,iR,oR,ik) | MemOp_PREFETCH -> let aR = [] in return (aR,iR,oR,ik) end >>= fun (aR, iR, oR, ik) -> return (aR,Nias,iR,oR,ik) | LoadStorePairNonTemp (wback,postindex,n,t,t2,acctype,memop,scale,datasize,offset) -> let rt_unknown = B0 in let (iR, aR) = if bitU_to_bool (eq_range (n, (31:ii))) then let iR = CheckSPAlignmentIFP ++ iR in let iR = rSPIFP ++ iR in let aR = rSPIFP ++ aR in (iR,aR) else let iR = (xFP n) ++ iR in let aR = (xFP n) ++ aR in (iR,aR) in let (iR, oR) = if bitU_to_bool wback then let (iR, oR) = if bitU_to_bool (eq_range (n, (31:ii))) then let (i, o) = match wSPFP with | (v10v', v11v') -> (v10v',v11v') end in let iR = i ++ iR in let oR = o ++ oR in (iR,oR) else let oR = (xFP n) ++ oR in (iR,oR) in (iR,oR) else (iR,oR) in match memop with | MemOp_STORE -> let iR = if bitU_to_bool (rt_unknown &. (eq_range (t, n))) then iR else (xFP t) ++ iR in let iR = if bitU_to_bool (rt_unknown &. (eq_range (t2, n))) then iR else (xFP t2) ++ iR in let iR = wMemIFP ++ iR in wmem_kind (acctype,B0) >>= fun w__9 -> let ik = w__9 in return (oR,iR,ik) | MemOp_LOAD -> let oR = (xFP t) ++ ((xFP t2) ++ oR) in rmem_kind (acctype,B0) >>= fun w__10 -> let ik = w__10 in return (oR,iR,ik) end >>= fun (oR, iR, ik) -> return (aR,Nias,iR,oR,ik) | LoadImmediate (n,t,acctype,memop,_signed,wback,postindex,offset,regsize,datasize) -> let wb_unknown = B0 in let rt_unknown = B0 in let (iR, aR) = if bitU_to_bool (eq_range (n, (31:ii))) then let iR = CheckSPAlignmentIFP ++ iR in let iR = rSPIFP ++ iR in let aR = rSPIFP ++ aR in (iR,aR) else let iR = (xFP n) ++ iR in let aR = (xFP n) ++ aR in (iR,aR) in let (iR, oR) = if bitU_to_bool wback then let (iR, oR) = if bitU_to_bool (eq_range (n, (31:ii))) then let (i, o) = match wSPFP with | (v12v', v13v') -> (v12v',v13v') end in let iR = i ++ iR in let oR = o ++ oR in (iR,oR) else let oR = (xFP n) ++ oR in (iR,oR) in (iR,oR) else (iR,oR) in match memop with | MemOp_STORE -> let iR = if bitU_to_bool rt_unknown then iR else (xFP t) ++ iR in let iR = wMemIFP ++ iR in wmem_kind (acctype,B0) >>= fun w__11 -> let ik = w__11 in return (aR,oR,iR,ik) | MemOp_LOAD -> let oR = (xFP t) ++ oR in rmem_kind (acctype,B0) >>= fun w__12 -> let ik = w__12 in return (aR,oR,iR,ik) | MemOp_PREFETCH -> let aR = [] in return (aR,oR,iR,ik) end >>= fun (aR, oR, iR, ik) -> return (aR,Nias,iR,oR,ik) | LoadRegister (n,t,m,acctype,memop,_signed,wback,postindex,extend_type,shift,regsize,datasize) -> let iR = (xFP m) ++ iR in let aR = (xFP m) ++ aR in let wb_unknown = B0 in let rt_unknown = B0 in let (iR, aR) = if bitU_to_bool (eq_range (n, (31:ii))) then let iR = CheckSPAlignmentIFP ++ iR in let iR = rSPIFP ++ iR in let aR = rSPIFP ++ aR in (iR,aR) else let iR = (xFP n) ++ iR in let aR = (xFP n) ++ aR in (iR,aR) in let (iR, oR) = if bitU_to_bool wback then let (iR, oR) = if bitU_to_bool (eq_range (n, (31:ii))) then let (i, o) = match wSPFP with | (v14v', v15v') -> (v14v',v15v') end in let iR = i ++ iR in let oR = o ++ oR in (iR,oR) else let oR = (xFP n) ++ oR in (iR,oR) in (iR,oR) else (iR,oR) in match memop with | MemOp_STORE -> let iR = if bitU_to_bool rt_unknown then iR else (xFP t) ++ iR in let iR = wMemIFP ++ iR in wmem_kind (acctype,B0) >>= fun w__13 -> let ik = w__13 in return (aR,oR,iR,ik) | MemOp_LOAD -> let oR = (xFP t) ++ oR in rmem_kind (acctype,B0) >>= fun w__14 -> let ik = w__14 in return (aR,oR,iR,ik) | MemOp_PREFETCH -> let aR = [] in return (aR,oR,iR,ik) end >>= fun (aR, oR, iR, ik) -> return (aR,Nias,iR,oR,ik) | LoadStorePair (wback,postindex,n,t,t2,acctype,memop,_signed,datasize,offset) -> let rt_unknown = B0 in let wb_unknown = B0 in let (iR, aR) = if bitU_to_bool (eq_range (n, (31:ii))) then let iR = CheckSPAlignmentIFP ++ iR in let iR = rSPIFP ++ iR in let aR = rSPIFP ++ aR in (iR,aR) else let iR = (xFP n) ++ iR in let aR = (xFP n) ++ aR in (iR,aR) in let (iR, oR) = if bitU_to_bool wback then let (iR, oR) = if bitU_to_bool (eq_range (n, (31:ii))) then let (i, o) = match wSPFP with | (v16v', v17v') -> (v16v',v17v') end in let iR = i ++ iR in let oR = o ++ oR in (iR,oR) else let oR = (xFP n) ++ oR in (iR,oR) in (iR,oR) else (iR,oR) in match memop with | MemOp_STORE -> let iR = if bitU_to_bool (rt_unknown &. (eq_range (t, n))) then iR else (xFP t) ++ iR in let iR = if bitU_to_bool (rt_unknown &. (eq_range (t2, n))) then iR else (xFP t2) ++ iR in let iR = wMemIFP ++ iR in wmem_kind (acctype,B0) >>= fun w__15 -> let ik = w__15 in return (oR,iR,ik) | MemOp_LOAD -> let oR = (xFP t) ++ oR in let oR = (xFP t2) ++ oR in rmem_kind (acctype,B0) >>= fun w__16 -> let ik = w__16 in return (oR,iR,ik) end >>= fun (oR, iR, ik) -> return (aR,Nias,iR,oR,ik) | AddSubImmediate (d,n,datasize,sub_op,setflags,imm) -> let iR = (if bitU_to_bool (eq_range (n, (31:ii))) then rSPIFP else xFP n) ++ iR in let oR = if bitU_to_bool setflags then NZCVfp ++ oR else oR in let (iR, oR) = if bitU_to_bool ((eq_range (d, (31:ii))) &. (~setflags)) then let (i, o) = match wSPFP with | (v18v', v19v') -> (v18v',v19v') end in let iR = i ++ iR in let oR = o ++ oR in (iR,oR) else let oR = (xFP d) ++ oR in (iR,oR) in return (aR,Nias,iR,oR,ik) | BitfieldMove (d,n,datasize,inzero,extend,R,S,wmask,tmask) -> let iR = if bitU_to_bool inzero then iR else (xFP d) ++ iR in let iR = (xFP n) ++ iR in let oR = (xFP d) ++ oR in return (aR,Nias,iR,oR,ik) | ExtractRegister (d,n,m,datasize,lsb) -> let iR = (xFP n) ++ ((xFP m) ++ iR) in let oR = (xFP d) ++ oR in return (aR,Nias,iR,oR,ik) | LogicalImmediate (d,n,datasize,setflags,op,imm) -> let iR = (xFP n) ++ iR in let oR = if bitU_to_bool setflags then NZCVfp ++ oR else oR in let (iR, oR) = if bitU_to_bool ((eq_range (d, (31:ii))) &. (~setflags)) then let (i, o) = match wSPFP with | (v20v', v21v') -> (v20v',v21v') end in let iR = i ++ iR in let oR = o ++ oR in (iR,oR) else let oR = (xFP d) ++ oR in (iR,oR) in return (aR,Nias,iR,oR,ik) | MoveWide (d,datasize,imm,pos,opcode) -> let iR = if bitU_to_bool (eq (opcode, MoveWideOp_K)) then (xFP d) ++ iR else iR in let oR = (xFP d) ++ oR in return (aR,Nias,iR,oR,ik) | Address (d,page,imm) -> let iR = _PCfp :: iR in let oR = (xFP d) ++ oR in return (aR,Nias,iR,oR,ik) | AddSubExtendRegister (d,n,m,datasize,sub_op,setflags,extend_type,shift) -> let iR = (if bitU_to_bool (eq_range (n, (31:ii))) then rSPIFP else xFP n) ++ iR in let iR = (xFP m) ++ iR in let oR = if bitU_to_bool setflags then NZCVfp ++ oR else oR in let (iR, oR) = if bitU_to_bool ((eq_range (d, (31:ii))) &. (~setflags)) then let (i, o) = match wSPFP with | (v22v', v23v') -> (v22v',v23v') end in let iR = i ++ iR in let oR = o ++ oR in (iR,oR) else let oR = (xFP d) ++ oR in (iR,oR) in return (aR,Nias,iR,oR,ik) | AddSubShiftedRegister (d,n,m,datasize,sub_op,setflags,shift_type,shift_amount) -> let iR = (xFP n) ++ ((xFP m) ++ iR) in let oR = if bitU_to_bool setflags then NZCVfp ++ oR else oR in let oR = (xFP d) ++ oR in return (aR,Nias,iR,oR,ik) | AddSubCarry (d,n,m,datasize,sub_op,setflags) -> let iR = (xFP n) ++ ((xFP m) ++ iR) in let iR = PSTATE_Cfp :: iR in let oR = if bitU_to_bool setflags then NZCVfp ++ oR else oR in let oR = (xFP d) ++ oR in return (aR,Nias,iR,oR,ik) | ConditionalCompareImmediate (n,datasize,sub_op,condition,flags,imm) -> let iR = (xFP n) ++ iR in let iR = (ConditionHoldsIFP (reset_vector_start condition)) ++ iR in let oR = NZCVfp ++ oR in return (aR,Nias,iR,oR,ik) | ConditionalCompareRegister (n,m,datasize,sub_op,condition,flags) -> let iR = (xFP n) ++ ((xFP m) ++ iR) in let iR = (ConditionHoldsIFP (reset_vector_start condition)) ++ iR in let oR = NZCVfp ++ oR in return (aR,Nias,iR,oR,ik) | ConditionalSelect (d,n,m,datasize,condition,else_inv,else_inc) -> let iR = (xFP n) ++ ((xFP m) ++ iR) in let iR = (ConditionHoldsIFP (reset_vector_start condition)) ++ iR in let oR = (xFP d) ++ oR in return (aR,Nias,iR,oR,ik) | Reverse (d,n,datasize,op) -> let iR = (xFP n) ++ iR in let oR = (xFP d) ++ oR in return (aR,Nias,iR,oR,ik) | CountLeading (d,n,datasize,opcode) -> let iR = (xFP n) ++ iR in let oR = (xFP d) ++ oR in return (aR,Nias,iR,oR,ik) | Division (d,n,m,datasize,_unsigned) -> let iR = (xFP n) ++ ((xFP m) ++ iR) in let oR = (xFP d) ++ oR in return (aR,Nias,iR,oR,ik) | Shift (d,n,m,datasize,shift_type) -> let iR = (xFP m) ++ iR in let iR = (xFP n) ++ iR in let oR = (xFP d) ++ oR in return (aR,Nias,iR,oR,ik) | CRC (d,n,m,size,crc32c) -> let iR = (xFP n) ++ ((xFP m) ++ iR) in let oR = (xFP d) ++ oR in return (aR,Nias,iR,oR,ik) | MultiplyAddSub (d,n,m,a,destsize,datasize,sub_op) -> let iR = (xFP n) ++ iR in let iR = (xFP m) ++ iR in let iR = (xFP a) ++ iR in let oR = (xFP d) ++ oR in return (aR,Nias,iR,oR,ik) | MultiplyAddSubLong (d,n,m,a,destsize,datasize,sub_op,_unsigned) -> let iR = (xFP n) ++ iR in let iR = (xFP m) ++ iR in let iR = (xFP a) ++ iR in let oR = (xFP d) ++ oR in return (aR,Nias,iR,oR,ik) | MultiplyHigh (d,n,m,a,destsize,datasize,_unsigned) -> let iR = (xFP n) ++ ((xFP m) ++ iR) in let oR = (xFP d) ++ oR in return (aR,Nias,iR,oR,ik) | LogicalShiftedRegister (d,n,m,datasize,setflags,op,shift_type,shift_amount,invert) -> let iR = (xFP n) ++ ((xFP m) ++ iR) in let oR = if bitU_to_bool setflags then NZCVfp ++ oR else oR in let oR = (xFP d) ++ oR in return (aR,Nias,iR,oR,ik) end >>= fun (aR, Nias, iR, oR, ik) -> return (iR,oR,aR,Nias,Dia,ik) let decodeBranchesExceptionSystem machineCode = match machineCode with | ((Vector [_;B0;B0;B1;B0;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__392) -> return (decodeUnconditionalBranchImmediate (reset_vector_start (set_vector_start_to_length machineCode))) | ((Vector [_;B0;B1;B1;B0;B1;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__403) -> return (decodeCompareBranchImmediate (reset_vector_start (set_vector_start_to_length machineCode))) | ((Vector [_;B0;B1;B1;B0;B1;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__414) -> return (decodeTestBranchImmediate (reset_vector_start (set_vector_start_to_length machineCode))) | ((Vector [B0;B1;B0;B1;B0;B1;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__425) -> return (decodeConditionalBranchImmediate (reset_vector_start (set_vector_start_to_length machineCode))) | ((Vector [B1;B1;B0;B1;B0;B1;B0;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__436) -> decodeExceptionGeneration (reset_vector_start machineCode) | ((Vector [B1;B1;B0;B1;B0;B1;B0;B1;B0;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__447) -> decodeSystemImplementationDefined (reset_vector_start machineCode) | ((Vector [B1;B1;B0;B1;B0;B1;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__458) -> decodeUnconditionalBranchRegister (reset_vector_start machineCode) end let IsSecure () = read_reg_field CurrentEL "EL" >>= fun w__0 -> if bitU_to_bool ((HaveEL (reset_vector_start EL3)) &. ((~(UsingAArch32 ())) &. (eq_vec (set_vector_start_to_length w__0, set_vector_start_to_length EL3)))) then return B1 else read_reg PSTATE_M >>= fun w__1 -> if bitU_to_bool ((HaveEL (reset_vector_start EL3)) &. ((UsingAArch32 ()) &. (eq_vec (w__1, set_vector_start_to_length M32_Monitor)))) then return B1 else IsSecureBelowEL3 () let decodeLogicalImmediate ((Vector [sf;_;_;B1;B0;B0;B1;B0;B0;N;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__388) = let opc = slice_raw v__388 (1:ii) (2:ii) in let immr = slice_raw v__388 (10:ii) (15:ii) in let imms = slice_raw v__388 (16:ii) (21:ii) in let Rn = slice_raw v__388 (22:ii) (26:ii) in let Rd = slice_raw v__388 (27:ii) (31:ii) in let d = UInt_reg (reset_vector_start Rd) in let n = UInt_reg (reset_vector_start Rn) in let datasize = if bitU_to_bool (eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (64:ii) else (32:ii) in let setflags = B0 in let op = LogicalOp_AND in let (op, setflags) = match opc with | Vector [B0;B0] _ _ -> let op = LogicalOp_AND in let setflags = B0 in (op,setflags) | Vector [B0;B1] _ _ -> let op = LogicalOp_ORR in let setflags = B0 in (op,setflags) | Vector [B1;B0] _ _ -> let op = LogicalOp_EOR in let setflags = B0 in (op,setflags) | Vector [B1;B1] _ _ -> let op = LogicalOp_AND in let setflags = B1 in (op,setflags) end in (if bitU_to_bool ((eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) &. (neq (match N with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii)))) then ReservedValue () else return ()) >> DecodeBitMasks (datasize,N,reset_vector_start imms,reset_vector_start immr,B1) >>= fun w__0 -> let (imm, _) = match w__0 with | (v0v', v1v') -> (v0v',v1v') end in return (Just (LogicalImmediate (d,n,datasize,setflags,op,reset_vector_start (set_vector_start_to_length imm)))) let decodeBitfield ((Vector [sf;_;_;B1;B0;B0;B1;B1;B0;N;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__384) = let opc = slice_raw v__384 (1:ii) (2:ii) in let immr = slice_raw v__384 (10:ii) (15:ii) in let imms = slice_raw v__384 (16:ii) (21:ii) in let Rn = slice_raw v__384 (22:ii) (26:ii) in let Rd = slice_raw v__384 (27:ii) (31:ii) in let d = UInt_reg (reset_vector_start Rd) in let n = UInt_reg (reset_vector_start Rn) in let datasize = if bitU_to_bool (eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then (64:ii) else (32:ii) in let inzero = B0 in let extend = B0 in let R = (0:ii) in let S = (0:ii) in match opc with | Vector [B0;B0] _ _ -> let inzero = B1 in let extend = B1 in return (inzero,extend) | Vector [B0;B1] _ _ -> let inzero = B0 in let extend = B0 in return (inzero,extend) | Vector [B1;B0] _ _ -> let inzero = B1 in let extend = B0 in return (inzero,extend) | Vector [B1;B1] _ _ -> UnallocatedEncoding () >> return (inzero,extend) end >>= fun (inzero, extend) -> (if bitU_to_bool ((eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) &. (neq (match N with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)))) then ReservedValue () else return ()) >> (if bitU_to_bool ((eq (match sf with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) &. ((neq (match N with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) |. ((neq (match (access immr (5:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) |. (neq (match (access imms (5:ii)) with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii)))))) then ReservedValue () else return ()) >> let R = UInt (reset_vector_start (set_vector_start_to_length immr)) in let S = UInt (reset_vector_start (set_vector_start_to_length imms)) in DecodeBitMasks (datasize,N,reset_vector_start imms,reset_vector_start immr,B0) >>= fun (wmask, tmask) -> return (Just (BitfieldMove (d,n,datasize,inzero,extend,R,S,reset_vector_start (set_vector_start_to_length wmask),reset_vector_start (set_vector_start_to_length tmask)))) let AArch64_SetExclusiveMonitors (address, size) = let acctype = AccType_ATOMIC in let iswrite = B0 in let aligned = neq_vec (set_vector_start_to_length address, set_vector_start_to_length (Align (reset_vector_start (set_vector_start_to_length address),size))) in let memaddrdesc = AArch64_TranslateAddress (reset_vector_start address,acctype,iswrite,aligned,size) in if bitU_to_bool (IsFault memaddrdesc) then () else let _ = if bitU_to_bool memaddrdesc.AddressDescriptor_memattrs.MemoryAttributes_shareable then MarkExclusiveGlobal (memaddrdesc.AddressDescriptor_paddress,ProcessorID (),size) else () in let _ = MarkExclusiveLocal (memaddrdesc.AddressDescriptor_paddress,ProcessorID (),size) in AArch64_MarkExclusiveVA (reset_vector_start address,ProcessorID (),size) let AArch64_TakeReset cold_reset = let _ = assert' (~(HighestELUsingAArch32 ())) (Nothing) in write_reg PSTATE_nRW (to_vec_dec ((1:ii),(0:ii))) >> (if bitU_to_bool (HaveEL (reset_vector_start EL3)) then write_reg_field CurrentEL "EL" (set_vector_start 3 EL3) >> write_reg_bitfield SCR_EL3 "NS" B0 else if bitU_to_bool (HaveEL (reset_vector_start EL2)) then write_reg_field CurrentEL "EL" (set_vector_start 3 EL2) else write_reg_field CurrentEL "EL" (set_vector_start 3 EL1)) >> let _ = AArch64_ResetControlRegisters cold_reset in write_reg_bitfield SPSel "SP" B0 >> wPSTATE_DAIF ((),reset_vector_start (Vector [B1;B1;B1;B1] 3 false)) >> let PSTATE_SS = (0:ii) in let PSTATE_IL = (0:ii) in AArch64_ResetGeneralRegisters () >> AArch64_ResetSIMDFPRegisters () >> AArch64_ResetSpecialRegisters () >> ResetExternalDebugRegisters cold_reset >> let rv = to_vec_dec ((64:ii),(0:ii)) in (if bitU_to_bool (HaveEL (reset_vector_start EL3)) then read_reg RVBAR_EL3 else if bitU_to_bool (HaveEL (reset_vector_start EL2)) then read_reg RVBAR_EL2 else read_reg RVBAR_EL1) >>= fun rv -> PAMax () >>= fun w__3 -> let _ = assert' ((IsZero (reset_vector_start (set_vector_start_to_length (slice (set_vector_start_to_length rv) (63:ii) w__3)))) &. (IsZero (reset_vector_start (set_vector_start_to_length (slice (set_vector_start_to_length rv) (1:ii) (0:ii)))))) (Just "reset vector not correctly aligned") in BranchTo (reset_vector_start (set_vector_start_to_length rv),BranchType_UNKNOWN) let AArch64_rMemSingle (read_buffer, address, size, acctype, wasaligned, exclusive) = let _ = assert' (eq_vec (set_vector_start_to_length address, set_vector_start_to_length (Align (reset_vector_start (set_vector_start_to_length address),size)))) (Nothing) in let value = set_vector_start_to_length (to_vec_dec (size * (8:ii),(0:ii))) in let iswrite = B0 in let memaddrdesc = AArch64_TranslateAddress (reset_vector_start address,acctype,iswrite,wasaligned,size) in (if bitU_to_bool (IsFault memaddrdesc) then AArch64_Abort (reset_vector_start address,memaddrdesc.AddressDescriptor_fault) else return ()) >> return (_rMem (read_buffer,memaddrdesc,size,acctype,exclusive)) let AArch64_wMemSingle (write_buffer, address, size, acctype, wasaligned, exclusive, value) = let _ = assert' (eq_vec (set_vector_start_to_length address, set_vector_start_to_length (Align (reset_vector_start (set_vector_start_to_length address),size)))) (Nothing) in let iswrite = B1 in let memaddrdesc = AArch64_TranslateAddress (reset_vector_start address,acctype,iswrite,wasaligned,size) in (if bitU_to_bool (IsFault memaddrdesc) then AArch64_Abort (reset_vector_start address,memaddrdesc.AddressDescriptor_fault) else return ()) >> let _ = if bitU_to_bool memaddrdesc.AddressDescriptor_memattrs.MemoryAttributes_shareable then ClearExclusiveByAddress (memaddrdesc.AddressDescriptor_paddress,ProcessorID (),size) else () in return (_wMem (write_buffer, memaddrdesc, size, acctype, exclusive, reset_vector_start (set_vector_start_to_length value))) let AArch64_ExclusiveMonitorsPass (address, size) = let acctype = AccType_ATOMIC in let iswrite = B1 in let aligned = eq_vec (set_vector_start_to_length address, set_vector_start_to_length (Align (reset_vector_start (set_vector_start_to_length address),size))) in (if bitU_to_bool (~aligned) then let secondstage = B0 in AArch64_Abort (reset_vector_start address,AArch64_AlignmentFault (acctype,iswrite,secondstage)) else return ()) >> let passed = AArch64_IsExclusiveVA (reset_vector_start address,ProcessorID (),size) in (if bitU_to_bool (~passed) then return (B0,passed) else let memaddrdesc = AArch64_TranslateAddress (reset_vector_start address,acctype,iswrite,aligned,size) in (if bitU_to_bool (IsFault memaddrdesc) then AArch64_Abort (reset_vector_start address,memaddrdesc.AddressDescriptor_fault) else return ()) >> let passed = IsExclusiveLocal (memaddrdesc.AddressDescriptor_paddress,ProcessorID (),size) in let passed = if bitU_to_bool passed then let _ = ClearExclusiveLocal (ProcessorID ()) in if bitU_to_bool memaddrdesc.AddressDescriptor_memattrs.MemoryAttributes_shareable then IsExclusiveGlobal (memaddrdesc.AddressDescriptor_paddress,ProcessorID (),size) else passed else passed in return (passed,passed)) >>= fun (w__0, passed) -> return w__0 let decodeLoadsStores machineCode = match machineCode with | ((Vector [_;_;B0;B0;B1;B0;B0;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__80) -> decodeLoadStoreExclusive (reset_vector_start (set_vector_start_to_length machineCode)) | ((Vector [_;_;B0;B1;B1;_;B0;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__99) -> return (decodeLoadRegisterLiteral (reset_vector_start (set_vector_start_to_length machineCode))) | ((Vector [_;_;B1;B0;B1;_;B0;B0;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__118) -> decodeLoadStoreNoAllocatePairOffset (reset_vector_start (set_vector_start_to_length machineCode)) | ((Vector [_;_;B1;B0;B1;_;B0;B0;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__137) -> decodeLoadStoreRegisterPairPostIndexed (reset_vector_start (set_vector_start_to_length machineCode)) | ((Vector [_;_;B1;B0;B1;_;B0;B1;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__156) -> decodeLoadStoreRegisterPairOffset (reset_vector_start (set_vector_start_to_length machineCode)) | ((Vector [_;_;B1;B0;B1;_;B0;B1;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__175) -> decodeLoadStoreRegisterPairPreIndexed (reset_vector_start (set_vector_start_to_length machineCode)) | ((Vector [_;_;B1;B1;B1;_;B0;B0;_;_;B0;_;_;_;_;_;_;_;_;_;B0;B0;_;_;_;_;_;_;_;_;_;_] _ _) as v__194) -> decodeLoadStoreRegisterUnscaledImmediate (reset_vector_start (set_vector_start_to_length machineCode)) | ((Vector [_;_;B1;B1;B1;_;B0;B0;_;_;B0;_;_;_;_;_;_;_;_;_;B0;B1;_;_;_;_;_;_;_;_;_;_] _ _) as v__213) -> decodeLoadStoreRegisterImmediatePostIndexed (reset_vector_start (set_vector_start_to_length machineCode)) | ((Vector [_;_;B1;B1;B1;_;B0;B0;_;_;B0;_;_;_;_;_;_;_;_;_;B1;B0;_;_;_;_;_;_;_;_;_;_] _ _) as v__232) -> decodeLoadStoreRegisterUnprivileged (reset_vector_start (set_vector_start_to_length machineCode)) | ((Vector [_;_;B1;B1;B1;_;B0;B0;_;_;B0;_;_;_;_;_;_;_;_;_;B1;B1;_;_;_;_;_;_;_;_;_;_] _ _) as v__251) -> decodeLoadStoreRegisterImmediatePreIndexed (reset_vector_start (set_vector_start_to_length machineCode)) | ((Vector [_;_;B1;B1;B1;_;B0;B0;_;_;B1;_;_;_;_;_;_;_;_;_;B1;B0;_;_;_;_;_;_;_;_;_;_] _ _) as v__270) -> decodeLoadStoreRegisterRegisterOffset (reset_vector_start (set_vector_start_to_length machineCode)) | ((Vector [_;_;B1;B1;B1;_;B0;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__289) -> decodeLoadStoreRegisterUnsignedImmediate (reset_vector_start (set_vector_start_to_length machineCode)) | ((Vector [B0;_;B0;B0;B1;B1;B0;B0;B0;_;B0;B0;B0;B0;B0;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__308) -> decodeAdvSIMDLoadStoreMultiStruct (reset_vector_start machineCode) | ((Vector [B0;_;B0;B0;B1;B1;B0;B0;B1;_;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__327) -> decodeAdvSIMDLoadStoreMultiStructPostIndexed (reset_vector_start machineCode) | ((Vector [B0;_;B0;B0;B1;B1;B0;B1;B0;_;_;B0;B0;B0;B0;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__346) -> decodeAdvSIMDLoadStoreSingleStruct (reset_vector_start machineCode) | ((Vector [B0;_;B0;B0;B1;B1;B0;B1;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__365) -> decodeAdvSIMDLoadStoreSingleStructPostIndexed (reset_vector_start machineCode) end let S1TranslationRegime () = read_reg_field CurrentEL "EL" >>= fun w__0 -> if bitU_to_bool (neq_vec (set_vector_start_to_length w__0, set_vector_start_to_length EL0)) then read_reg_field CurrentEL "EL" >>= fun w__1 -> return (set_vector_start 1 w__1) else IsSecure () >>= fun w__2 -> return (if bitU_to_bool (w__2 &. ((HaveEL (reset_vector_start EL3)) &. (ELUsingAArch32 (reset_vector_start EL3)))) then EL3 else EL1) let AArch64_CheckForSMCTrap imm = IsSecure () >>= fun w__0 -> read_reg_field CurrentEL "EL" >>= fun w__1 -> read_reg_field CurrentEL "EL" >>= fun w__2 -> read_reg_bitfield HCR_EL2 "TSC" >>= fun w__3 -> let route_to_el2 = (HaveEL (reset_vector_start EL2)) &. ((~w__0) &. (((eq_vec (set_vector_start_to_length w__1, set_vector_start_to_length EL0)) |. (eq_vec (set_vector_start_to_length w__2, set_vector_start_to_length EL1))) &. (eq (match w__3 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))))) in if bitU_to_bool route_to_el2 then not_implemented "AArch64_CheckForSMCTrap route_to_el2" else return () let CheckSystemAccess (op0, op1, crn, crm, op2, rt, read) = let unallocated = B0 in let need_secure = B0 in let min_EL = to_vec_dec ((2:ii),(0:ii)) in match op1 with | ((Vector [B0;B0;_] _ _) as v__77) -> let min_EL = EL1 in return (need_secure,min_EL) | Vector [B0;B1;B0] _ _ -> let min_EL = EL1 in return (need_secure,min_EL) | Vector [B0;B1;B1] _ _ -> let min_EL = EL0 in return (need_secure,min_EL) | Vector [B1;B0;B0] _ _ -> let min_EL = EL2 in return (need_secure,min_EL) | Vector [B1;B0;B1] _ _ -> UnallocatedEncoding () >> return (need_secure,min_EL) | Vector [B1;B1;B0] _ _ -> let min_EL = EL3 in return (need_secure,min_EL) | Vector [B1;B1;B1] _ _ -> let min_EL = EL1 in let need_secure = B1 in return (need_secure,min_EL) end >>= fun (need_secure, min_EL) -> read_reg_field CurrentEL "EL" >>= fun w__0 -> if bitU_to_bool (lt_vec (set_vector_start_to_length w__0, set_vector_start_to_length min_EL)) then UnallocatedEncoding () else IsSecure () >>= fun w__1 -> if bitU_to_bool (need_secure &. (~w__1)) then UnallocatedEncoding () else AArch64_CheckUnallocatedSystemAccess (reset_vector_start op0, reset_vector_start op1, reset_vector_start crn, reset_vector_start crm, reset_vector_start op2, read) >>= fun w__2 -> if bitU_to_bool w__2 then UnallocatedEncoding () else return () let ExternalSecureInvasiveDebugEnabled () = IsSecure () >>= fun w__0 -> if bitU_to_bool ((~(HaveEL (reset_vector_start EL3))) &. (~w__0)) then return B0 else ExternalInvasiveDebugEnabled () >>= fun w__1 -> signalSPIDEN () >>= fun w__2 -> return (w__1 &. (eq (w__2, HIGH))) let decodeDataImmediate machineCode = match machineCode with | ((Vector [_;_;_;B1;B0;B0;B0;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__35) -> return (decodePCRelAddressing (reset_vector_start (set_vector_start_to_length machineCode))) | ((Vector [_;_;_;B1;B0;B0;B0;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__42) -> decodeAddSubtractImmediate (reset_vector_start (set_vector_start_to_length machineCode)) | ((Vector [_;_;_;B1;B0;B0;B1;B0;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__49) -> decodeLogicalImmediate (reset_vector_start (set_vector_start_to_length machineCode)) | ((Vector [_;_;_;B1;B0;B0;B1;B0;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__56) -> decodeMoveWideImmediate (reset_vector_start (set_vector_start_to_length machineCode)) | ((Vector [_;_;_;B1;B0;B0;B1;B1;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__63) -> decodeBitfield (reset_vector_start (set_vector_start_to_length machineCode)) | ((Vector [_;_;_;B1;B0;B0;B1;B1;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__70) -> decodeExtract (reset_vector_start (set_vector_start_to_length machineCode)) end let SCTLR' () = S1TranslationRegime () >>= fun w__0 -> return (SCTLR (reset_vector_start w__0)) let HaltingAllowed () = Halted () >>= fun w__0 -> DoubleLockStatus () >>= fun w__1 -> if bitU_to_bool (w__0 |. w__1) then return B0 else IsSecure () >>= fun w__2 -> if bitU_to_bool w__2 then ExternalSecureInvasiveDebugEnabled () else ExternalInvasiveDebugEnabled () let decode machineCode = match machineCode with | ((Vector [_;_;_;B0;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__0) -> return (Just (Unallocated)) | ((Vector [_;_;_;B1;B0;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__5) -> decodeDataImmediate (reset_vector_start machineCode) | ((Vector [_;_;_;B1;B0;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__10) -> decodeBranchesExceptionSystem (reset_vector_start machineCode) | ((Vector [_;_;_;_;B1;_;B0;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__15) -> decodeLoadsStores (reset_vector_start machineCode) | ((Vector [_;_;_;_;B1;B0;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__20) -> decodeDataRegister (reset_vector_start machineCode) | ((Vector [_;_;_;B0;B1;B1;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__25) -> decodeDataSIMDFPoint1 (reset_vector_start machineCode) | ((Vector [_;_;_;B1;B1;B1;B1;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_] _ _) as v__30) -> decodeDataSIMDFPoint2 (reset_vector_start machineCode) | _ -> return (Nothing) end let BigEndian () = let bigend = B0 in if bitU_to_bool (UsingAArch32 ()) then read_reg PSTATE_E >>= fun w__0 -> let bigend = neq_vec_range (w__0, (0:ii)) in return bigend else read_reg_field CurrentEL "EL" >>= fun w__1 -> if bitU_to_bool (eq_vec (set_vector_start_to_length w__1, set_vector_start_to_length EL0)) then read_reg_bitfield SCTLR_EL1 "E0E" >>= fun w__2 -> let bigend = neq (match w__2 with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii)) in return bigend else SCTLR' () >>= fun w__3 -> read_reg_bitfield w__3 "EE" >>= fun w__4 -> let bigend = neq (match w__4 with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii)) in return bigend let flush_read_buffer (read_buffer, size) = let _ = assert' (eq_range (read_buffer.read_buffer_type_size, size)) (Nothing) in let value = set_vector_start_to_length (to_vec_dec (size * (8:ii),(0:ii))) in (if bitU_to_bool read_buffer.read_buffer_type_exclusive then match read_buffer.read_buffer_type_acctype with | AccType_ATOMIC -> rMem_ATOMIC (reset_vector_start read_buffer.read_buffer_type_address, read_buffer.read_buffer_type_size) >>= fun w__0 -> return (set_vector_start_to_length w__0) | AccType_ORDERED -> rMem_ATOMIC_ORDERED (reset_vector_start read_buffer.read_buffer_type_address, read_buffer.read_buffer_type_size) >>= fun w__1 -> return (set_vector_start_to_length w__1) | _ -> not_implemented "unimplemented memory access" >> return value end else match read_buffer.read_buffer_type_acctype with | AccType_NORMAL -> rMem_NORMAL (reset_vector_start read_buffer.read_buffer_type_address, read_buffer.read_buffer_type_size) >>= fun w__2 -> return (set_vector_start_to_length w__2) | AccType_STREAM -> rMem_STREAM (reset_vector_start read_buffer.read_buffer_type_address, read_buffer.read_buffer_type_size) >>= fun w__3 -> return (set_vector_start_to_length w__3) | AccType_UNPRIV -> rMem_NORMAL (reset_vector_start read_buffer.read_buffer_type_address, read_buffer.read_buffer_type_size) >>= fun w__4 -> return (set_vector_start_to_length w__4) | AccType_ORDERED -> rMem_ORDERED (reset_vector_start read_buffer.read_buffer_type_address, read_buffer.read_buffer_type_size) >>= fun w__5 -> return (set_vector_start_to_length w__5) | AccType_ATOMIC -> return value end) >>= fun value -> BigEndian () >>= fun w__6 -> let value = if bitU_to_bool w__6 then set_vector_start_to_length (BigEndianReverse (reset_vector_start (set_vector_start_to_length value))) else value in return (set_vector_start_to_length value) let CheckSPAlignment () = rSP (64:ii) >>= fun sp -> let stack_align_check = B0 in read_reg_field CurrentEL "EL" >>= fun w__0 -> (if bitU_to_bool (eq_vec (set_vector_start_to_length w__0, set_vector_start_to_length EL0)) then read_reg_bitfield SCTLR_EL1 "SA0" >>= fun w__1 -> let stack_align_check = neq (match w__1 with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii)) in return stack_align_check else SCTLR' () >>= fun w__2 -> read_reg_bitfield w__2 "SA" >>= fun w__3 -> let stack_align_check = neq (match w__3 with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii)) in return stack_align_check) >>= fun stack_align_check -> if bitU_to_bool (stack_align_check &. (neq_vec (set_vector_start_to_length sp, set_vector_start_to_length (Align (reset_vector_start (set_vector_start_to_length sp),(16:ii)))))) then AArch64_SPAlignmentFault () else return () let AArch64_CheckAlignment (address, size, acctype, iswrite) = let aligned = eq_vec (set_vector_start_to_length address, set_vector_start_to_length (Align (reset_vector_start (set_vector_start_to_length address),size))) in SCTLR' () >>= fun w__0 -> read_reg_bitfield w__0 "A" >>= fun A -> (if bitU_to_bool ((~aligned) &. ((eq (acctype, AccType_ATOMIC)) |. ((eq (acctype, AccType_ORDERED)) |. (eq (match A with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii)))))) then let secondstage = B0 in AArch64_Abort (reset_vector_start address,AArch64_AlignmentFault (acctype,iswrite,secondstage)) else return ()) >> return aligned let rMem' (read_buffer, address, size, acctype, exclusive) = let read_buffer' = read_buffer in let i = (0:ii) in let iswrite = B0 in AArch64_CheckAlignment (reset_vector_start address,size,acctype,iswrite) >>= fun aligned -> let atomic = (aligned &. (~((eq (acctype, AccType_VEC)) |. (eq (acctype, AccType_VECSTREAM))))) |. (eq_range (size, (1:ii))) in if bitU_to_bool (~atomic) then let _ = assert' (~exclusive) (Nothing) in let _ = assert' (gt (size, (1:ii))) (Nothing) in if bitU_to_bool (~exclusive) then AArch64_rMemSingle (read_buffer',reset_vector_start address,(1:ii),acctype,aligned,B0) >>= fun w__0 -> let read_buffer' = w__0 in (foreachM_inc ((1:ii),size - (1:ii),(1:ii)) read_buffer' (fun i read_buffer' -> AArch64_rMemSingle (read_buffer', reset_vector_start (set_vector_start 63 (add_VIV (reset_vector_start (set_vector_start_to_length address)) i)), (1:ii), acctype, aligned, B0))) else return read_buffer' else AArch64_rMemSingle (read_buffer',reset_vector_start address,size,acctype,aligned,exclusive) let wMem' (write_buffer, address, size, acctype, value, exclusive) = let write_buffer' = write_buffer in let value' = set_vector_start_to_length value in let i = (0:ii) in let iswrite = B1 in BigEndian () >>= fun w__0 -> let value' = if bitU_to_bool w__0 then set_vector_start_to_length (BigEndianReverse (reset_vector_start (set_vector_start_to_length value'))) else value' in AArch64_CheckAlignment (reset_vector_start address,size,acctype,iswrite) >>= fun aligned -> let atomic = (aligned &. (~((eq (acctype, AccType_VEC)) |. (eq (acctype, AccType_VECSTREAM))))) |. (eq_range (size, (1:ii))) in let exclusiveSuccess = B0 in if bitU_to_bool (~atomic) then let _ = assert' (~exclusive) (Nothing) in if bitU_to_bool (~exclusive) then let _ = assert' (gt (size, (1:ii))) (Nothing) in AArch64_wMemSingle (write_buffer', reset_vector_start address, (1:ii), acctype, aligned, B0, reset_vector_start (set_vector_start_to_length (slice (set_vector_start_to_length value') (7:ii) (0:ii)))) >>= fun w__1 -> let write_buffer' = w__1 in (foreachM_inc ((1:ii),size - (1:ii),(1:ii)) write_buffer' (fun i write_buffer' -> AArch64_wMemSingle (write_buffer', reset_vector_start (set_vector_start 63 (add_VIV (reset_vector_start (set_vector_start_to_length address)) i)), (1:ii), acctype, aligned, B0, reset_vector_start (set_vector_start_to_length (slice (set_vector_start_to_length value') (((8:ii) * i) + (7:ii)) ((8:ii) * i)))))) else return write_buffer' else AArch64_wMemSingle (write_buffer', reset_vector_start address, size, acctype, aligned, exclusive, reset_vector_start (set_vector_start_to_length value')) let rMem (read_buffer, address, size, acctype) = rMem' (read_buffer,reset_vector_start address,size,acctype,B0) let rMem_exclusive (read_buffer, address, size, acctype) = rMem' (read_buffer,reset_vector_start address,size,acctype,B1) let wMem (write_buffer, address, size, acctype, value) = wMem' (write_buffer, reset_vector_start address, size, acctype, reset_vector_start (set_vector_start_to_length value), B0) let wMem_exclusive (write_buffer, address, size, acctype, value) = wMem' (write_buffer, reset_vector_start address, size, acctype, reset_vector_start (set_vector_start_to_length value), B1) let execute_TMStart t = read_reg TxNestingLevel >>= fun nesting -> read_reg_field TXIDR_EL0 "DEPTH" >>= fun w__0 -> if bitU_to_bool (lt_vec_unsigned (set_vector_start_to_length nesting, set_vector_start_to_length w__0)) then write_reg TxNestingLevel (set_vector_start 7 (add_VIV (reset_vector_start (set_vector_start_to_length nesting)) (1:ii))) >> let status = to_vec_dec ((64:ii),(0:ii)) in (if bitU_to_bool (eq_vec_range (set_vector_start_to_length nesting, (0:ii))) then read_reg TMStartEffect else return status) >>= fun status -> wX (t,reset_vector_start (set_vector_start_to_length status)) else let status = to_vec_dec ((64:ii),(0:ii)) in let status = update_pos status (10:ii) B1 in write_reg TMAbortEffect status let execute_TMCommit () = read_reg TxNestingLevel >>= fun nesting -> (if bitU_to_bool (eq_vec_range (set_vector_start_to_length nesting, (1:ii))) then TMCommitEffect () else if bitU_to_bool (eq_vec_range (set_vector_start_to_length nesting, (0:ii))) then AArch64_UndefinedFault () else return ()) >> write_reg TxNestingLevel (set_vector_start 7 (minus_VIV (reset_vector_start (set_vector_start_to_length nesting)) (1:ii))) let execute_TMTest () = read_reg TxNestingLevel >>= fun w__0 -> if bitU_to_bool (gt_vec_range (w__0, (0:ii))) then wPSTATE_NZCV ((),reset_vector_start (Vector [B0;B0;B0;B0] 3 false)) else wPSTATE_NZCV ((),reset_vector_start (Vector [B0;B1;B0;B0] 3 false)) let execute_TMAbort (retry, reason) = read_reg TxNestingLevel >>= fun w__0 -> if bitU_to_bool (gt_vec_range (w__0, (0:ii))) then let status = to_vec_dec ((64:ii),(0:ii)) in let status = update status (4:ii) (0:ii) reason in let status = update_pos status (8:ii) retry in let status = update_pos status (9:ii) B1 in write_reg TMAbortEffect status else return () let execute_CompareAndBranch (t, datasize, iszero, offset) = rX (datasize,t) >>= fun w__0 -> let operand1 = set_vector_start_to_length w__0 in if bitU_to_bool (eq_bit (IsZero (reset_vector_start (set_vector_start_to_length operand1)), iszero)) then rPC () >>= fun w__1 -> BranchTo (reset_vector_start (set_vector_start_to_length (add_VVV (reset_vector_start (set_vector_start_to_length w__1)) (reset_vector_start (set_vector_start_to_length offset)))), BranchType_JMP) else return () let execute_BranchConditional (offset, condition) = ConditionHolds (reset_vector_start condition) >>= fun w__0 -> if bitU_to_bool w__0 then rPC () >>= fun w__1 -> BranchTo (reset_vector_start (set_vector_start_to_length (add_VVV (reset_vector_start (set_vector_start_to_length w__1)) (reset_vector_start (set_vector_start_to_length offset)))), BranchType_JMP) else return () let execute_GenerateExceptionEL1 imm = AArch64_CallSupervisor (reset_vector_start imm) let execute_GenerateExceptionEL2 imm = read_reg_field CurrentEL "EL" >>= fun w__0 -> read_reg_field CurrentEL "EL" >>= fun w__1 -> IsSecure () >>= fun w__2 -> (if bitU_to_bool ((~(HaveEL (reset_vector_start EL2))) |. ((eq_vec (set_vector_start_to_length w__0, set_vector_start_to_length EL0)) |. ((eq_vec (set_vector_start_to_length w__1, set_vector_start_to_length EL1)) &. w__2))) then UnallocatedEncoding () else return ()) >> (if bitU_to_bool (HaveEL (reset_vector_start EL3)) then read_reg_bitfield SCR_EL3 "HCE" else read_reg_bitfield HCR_EL2 "HCD" >>= fun w__4 -> return (NOT' w__4)) >>= fun hvc_enable -> if bitU_to_bool (eq (match hvc_enable with | B0 -> (0:ii) | B1 -> (1:ii) end, (0:ii))) then AArch64_UndefinedFault () else AArch64_CallHypervisor (reset_vector_start imm) let execute_GenerateExceptionEL3 imm = read_reg_field CurrentEL "EL" >>= fun w__0 -> (if bitU_to_bool ((~(HaveEL (reset_vector_start EL3))) |. (eq_vec (set_vector_start_to_length w__0, set_vector_start_to_length EL0))) then UnallocatedEncoding () else return ()) >> AArch64_CheckForSMCTrap (reset_vector_start imm) >> read_reg_bitfield SCR_EL3 "SMD" >>= fun w__1 -> if bitU_to_bool (eq (match w__1 with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then AArch64_UndefinedFault () else AArch64_CallSecureMonitor (reset_vector_start imm) let execute_DebugBreakpoint comment = AArch64_SoftwareBreakpoint (reset_vector_start comment) let execute_ExternalDebugBreakpoint () = Halt (reset_vector_start DebugHalt_HaltInstruction) let execute_DebugSwitchToExceptionLevel target_level = DCPSInstruction (reset_vector_start target_level) let execute_MoveSystemImmediate (operand, field') = match field' with | PSTATEField_SP -> write_reg_bitfield SPSel "SP" (access operand (0:ii)) | PSTATEField_DAIFSet -> read_reg_bitfield DAIF "D" >>= fun w__0 -> write_reg_bitfield DAIF "D" (w__0 |. (access operand (3:ii))) >> read_reg_bitfield DAIF "A" >>= fun w__1 -> write_reg_bitfield DAIF "A" (w__1 |. (access operand (2:ii))) >> read_reg_bitfield DAIF "I" >>= fun w__2 -> write_reg_bitfield DAIF "I" (w__2 |. (access operand (1:ii))) >> read_reg_bitfield DAIF "F" >>= fun w__3 -> write_reg_bitfield DAIF "F" (w__3 |. (access operand (0:ii))) | PSTATEField_DAIFClr -> read_reg_bitfield DAIF "D" >>= fun w__4 -> write_reg_bitfield DAIF "D" (w__4 &. (NOT' (access operand (3:ii)))) >> read_reg_bitfield DAIF "A" >>= fun w__5 -> write_reg_bitfield DAIF "A" (w__5 &. (NOT' (access operand (2:ii)))) >> read_reg_bitfield DAIF "I" >>= fun w__6 -> write_reg_bitfield DAIF "I" (w__6 &. (NOT' (access operand (1:ii)))) >> read_reg_bitfield DAIF "F" >>= fun w__7 -> write_reg_bitfield DAIF "F" (w__7 &. (NOT' (access operand (0:ii)))) end let execute_Hint op = match op with | SystemHintOp_YIELD -> return (Hint_Yield ()) | SystemHintOp_WFE -> EventRegistered () >>= fun w__0 -> if bitU_to_bool w__0 then ClearEventRegister () else read_reg_field CurrentEL "EL" >>= fun w__1 -> (if bitU_to_bool (eq_vec (set_vector_start_to_length w__1, set_vector_start_to_length EL0)) then AArch64_CheckForWFxTrap (reset_vector_start EL1,B1) else return ()) >> IsSecure () >>= fun w__2 -> read_reg_field CurrentEL "EL" >>= fun w__3 -> read_reg_field CurrentEL "EL" >>= fun w__4 -> (if bitU_to_bool ((HaveEL (reset_vector_start EL2)) &. ((~w__2) &. ((eq_vec (set_vector_start_to_length w__3, set_vector_start_to_length EL0)) |. (eq_vec (set_vector_start_to_length w__4, set_vector_start_to_length EL1))))) then AArch64_CheckForWFxTrap (reset_vector_start EL2,B1) else return ()) >> read_reg_field CurrentEL "EL" >>= fun w__5 -> (if bitU_to_bool ((HaveEL (reset_vector_start EL3)) &. (neq_vec (set_vector_start_to_length w__5, set_vector_start_to_length EL3))) then AArch64_CheckForWFxTrap (reset_vector_start EL3,B1) else return ()) >> WaitForEvent () | SystemHintOp_WFI -> InterruptPending () >>= fun w__6 -> if bitU_to_bool (~w__6) then read_reg_field CurrentEL "EL" >>= fun w__7 -> (if bitU_to_bool (eq_vec (set_vector_start_to_length w__7, set_vector_start_to_length EL0)) then AArch64_CheckForWFxTrap (reset_vector_start EL1,B0) else return ()) >> IsSecure () >>= fun w__8 -> read_reg_field CurrentEL "EL" >>= fun w__9 -> read_reg_field CurrentEL "EL" >>= fun w__10 -> (if bitU_to_bool ((HaveEL (reset_vector_start EL2)) &. ((~w__8) &. ((eq_vec (set_vector_start_to_length w__9, set_vector_start_to_length EL0)) |. (eq_vec (set_vector_start_to_length w__10, set_vector_start_to_length EL1))))) then AArch64_CheckForWFxTrap (reset_vector_start EL2,B0) else return ()) >> read_reg_field CurrentEL "EL" >>= fun w__11 -> (if bitU_to_bool ((HaveEL (reset_vector_start EL3)) &. (neq_vec (set_vector_start_to_length w__11, set_vector_start_to_length EL3))) then AArch64_CheckForWFxTrap (reset_vector_start EL3,B0) else return ()) >> WaitForInterrupt () else return () | SystemHintOp_SEV -> return (SendEvent ()) | SystemHintOp_SEVL -> EventRegisterSet () | _ -> return () end let execute_ClearExclusiveMonitor imm = return (ClearExclusiveLocal (ProcessorID ())) let execute_Barrier (op, domain, types) = match op with | MemBarrierOp_DSB -> DataSynchronizationBarrier (domain,types) | MemBarrierOp_DMB -> DataMemoryBarrier (domain,types) | MemBarrierOp_ISB -> InstructionSynchronizationBarrier () end let execute_System (t, sys_op0, sys_op1, sys_op2, sys_crn, sys_crm, has_result) = if bitU_to_bool has_result then SysOp_R (sys_op0,sys_op1,sys_crn,sys_crm,sys_op2) >>= fun w__0 -> wX (t,reset_vector_start (set_vector_start_to_length w__0)) else rX ((64:ii),t) >>= fun w__1 -> SysOp_W (sys_op0,sys_op1,sys_crn,sys_crm,sys_op2,reset_vector_start w__1) let execute_MoveSystemRegister (t, sys_op0, sys_op1, sys_op2, sys_crn, sys_crm, read) = if bitU_to_bool read then System_Get (sys_op0,sys_op1,sys_crn,sys_crm,sys_op2) >>= fun w__0 -> wX (t,reset_vector_start (set_vector_start_to_length w__0)) else rX ((64:ii),t) >>= fun w__1 -> System_Put (sys_op0,sys_op1,sys_crn,sys_crm,sys_op2,reset_vector_start w__1) let execute_ImplementationDefinedTestBeginEnd isEnd = return (if bitU_to_bool isEnd then info "test ends" else info "test begins") let execute_ImplementationDefinedStopFetching () = return (info "stop fetching instructions") let execute_ImplementationDefinedThreadStart () = return (info "thread start") let execute_TestBitAndBranch (t, datasize, bit_pos, bit_val, offset) = rX (datasize,t) >>= fun w__0 -> let operand = set_vector_start_to_length w__0 in if bitU_to_bool (eq_bit (access (set_vector_start_to_length operand) bit_pos, bit_val)) then rPC () >>= fun w__1 -> BranchTo (reset_vector_start (set_vector_start_to_length (add_VVV (reset_vector_start (set_vector_start_to_length w__1)) (reset_vector_start (set_vector_start_to_length offset)))), BranchType_JMP) else return () let execute_BranchImmediate (branch_type, offset) = (if bitU_to_bool (eq (branch_type, BranchType_CALL)) then rPC () >>= fun w__0 -> wX ((30:ii), reset_vector_start (set_vector_start_to_length (add_VIV (reset_vector_start (set_vector_start_to_length w__0)) (4:ii)))) else return ()) >> rPC () >>= fun w__1 -> BranchTo (reset_vector_start (set_vector_start_to_length (add_VVV (reset_vector_start (set_vector_start_to_length w__1)) (reset_vector_start (set_vector_start_to_length offset)))), branch_type) let execute_BranchRegister (n, branch_type) = rX ((64:ii),n) >>= fun target -> (if bitU_to_bool (eq (branch_type, BranchType_CALL)) then rPC () >>= fun w__0 -> wX ((30:ii), reset_vector_start (set_vector_start_to_length (add_VIV (reset_vector_start (set_vector_start_to_length w__0)) (4:ii)))) else return ()) >> BranchTo (reset_vector_start (set_vector_start_to_length target),branch_type) let execute_ExceptionReturn () = rELR' () >>= fun w__0 -> rSPSR () >>= fun w__1 -> AArch64_ExceptionReturn (reset_vector_start w__0,reset_vector_start w__1) let execute_DebugRestorePState () = DRPSInstruction () let execute_LoadLiteral (t, memop, _signed, size, offset, datasize) = rPC () >>= fun w__0 -> let address = set_vector_start 63 (add_VVV (reset_vector_start (set_vector_start_to_length w__0)) (reset_vector_start (set_vector_start_to_length offset))) in let data = set_vector_start_to_length (to_vec_dec (datasize,(0:ii))) in match memop with | MemOp_LOAD -> rMem (empty_read_buffer,reset_vector_start address,size,AccType_NORMAL) >>= fun w__1 -> flush_read_buffer (w__1,size) >>= fun w__2 -> let data = set_vector_start_to_length w__2 in (if bitU_to_bool _signed then wX (t, reset_vector_start (set_vector_start_to_length (SignExtend ((64:ii),reset_vector_start (set_vector_start_to_length data))))) else wX (t,reset_vector_start (set_vector_start_to_length data))) >> return data | MemOp_PREFETCH -> return data end >>= fun data -> return () let execute_LoadStoreAcqExc (n, t, t2, s, acctype, excl, pair, memop, elsize, regsize, datasize) = let address = to_vec_dec ((64:ii),(0:ii)) in let data = set_vector_start_to_length (to_vec_dec (datasize,(0:ii))) in let dbytes = quot datasize (8:ii) in let rt_unknown = B0 in let rn_unknown = B0 in (if bitU_to_bool ((eq (memop, MemOp_LOAD)) &. (pair &. (eq_range (t, t2)))) then UnallocatedEncoding () else return ()) >> (if bitU_to_bool ((eq (memop, MemOp_STORE)) &. excl) then (if bitU_to_bool ((eq_range (s, t)) |. (pair &. (eq_range (s, t2)))) then UnallocatedEncoding () else return ()) >> if bitU_to_bool ((eq_range (s, n)) &. (neq_range (n, (31:ii)))) then UnallocatedEncoding () else return () else return ()) >> let status = B0 in (if bitU_to_bool ((eq (memop, MemOp_STORE)) &. excl) then speculate_exclusive_success () >>= fun w__0 -> let status = if bitU_to_bool w__0 then B0 else B1 in wX (s, reset_vector_start (set_vector_start_to_length (ZeroExtend ((32:ii), reset_vector_start (set_vector_start_to_length (Vector [status] 0 false)))))) >> return status else return status) >>= fun status -> (if bitU_to_bool (eq (match status with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then return (address,data,status) else (if bitU_to_bool (eq_range (n, (31:ii))) then CheckSPAlignment () >> rSP (64:ii) else if bitU_to_bool rn_unknown then let address = to_vec_dec ((64:ii),UNKNOWN) in return address else rX ((64:ii),n)) >>= fun address -> match memop with | MemOp_STORE -> wMem_Addr (reset_vector_start address,dbytes,acctype,excl) >> (if bitU_to_bool rt_unknown then let data = set_vector_start_to_length (to_vec_dec (length data,UNKNOWN)) in return data else if bitU_to_bool pair then let _ = assert' excl (Nothing) in rX (regsize,t) >>= fun w__3 -> let el1 = set_vector_start_to_length w__3 in rX (length el1,t2) >>= fun w__4 -> let el2 = set_vector_start_to_length w__4 in BigEndian () >>= fun w__5 -> let data = if bitU_to_bool w__5 then set_vector_start_to_length ((set_vector_start_to_length el1) ^^ (set_vector_start_to_length el2)) else set_vector_start_to_length ((set_vector_start_to_length el2) ^^ (set_vector_start_to_length el1)) in return data else rX (length data,t) >>= fun w__6 -> return (set_vector_start_to_length w__6)) >>= fun data -> (if bitU_to_bool excl then let status = B1 in AArch64_ExclusiveMonitorsPass (reset_vector_start address,dbytes) >>= fun w__7 -> if bitU_to_bool w__7 then wMem_exclusive (empty_write_buffer, reset_vector_start address, dbytes, acctype, reset_vector_start (set_vector_start_to_length data)) >>= fun w__8 -> flush_write_buffer_exclusive w__8 else return status else wMem (empty_write_buffer, reset_vector_start address, dbytes, acctype, reset_vector_start (set_vector_start_to_length data)) >>= fun w__10 -> flush_write_buffer w__10 >> return status) >>= fun status -> return (data,status) | MemOp_LOAD -> let _ = if bitU_to_bool excl then AArch64_SetExclusiveMonitors (reset_vector_start address,dbytes) else () in (if bitU_to_bool pair then let _ = assert' excl (Nothing) in if bitU_to_bool rt_unknown then wX (t, reset_vector_start (set_vector_start_to_length (to_vec_dec (length data,UNKNOWN)))) >> return data else if bitU_to_bool (eq_range (elsize, (32:ii))) then rMem_exclusive (empty_read_buffer,reset_vector_start address,dbytes,acctype) >>= fun w__11 -> flush_read_buffer (w__11,dbytes) >>= fun w__12 -> let data = set_vector_start_to_length w__12 in BigEndian () >>= fun w__13 -> (if bitU_to_bool w__13 then wX (t, reset_vector_start (set_vector_start_to_length (slice (set_vector_start_to_length data) (datasize - (1:ii)) elsize))) >> wX (t2, reset_vector_start (set_vector_start_to_length (slice (set_vector_start_to_length data) (elsize - (1:ii)) (0:ii)))) else wX (t, reset_vector_start (set_vector_start_to_length (slice (set_vector_start_to_length data) (elsize - (1:ii)) (0:ii)))) >> wX (t2, reset_vector_start (set_vector_start_to_length (slice (set_vector_start_to_length data) (datasize - (1:ii)) elsize)))) >> return data else (if bitU_to_bool (neq_vec (set_vector_start_to_length address, set_vector_start_to_length (Align (reset_vector_start (set_vector_start_to_length address),dbytes)))) then let iswrite = B0 in let secondstage = B0 in AArch64_Abort (reset_vector_start address, AArch64_AlignmentFault (acctype,iswrite,secondstage)) else return ()) >> rMem_exclusive (empty_read_buffer, reset_vector_start (set_vector_start 63 (add_VIV (reset_vector_start (set_vector_start_to_length address)) (0:ii))), (8:ii), acctype) >>= fun read_buffer -> rMem_exclusive (read_buffer, reset_vector_start (set_vector_start 63 (add_VIV (reset_vector_start (set_vector_start_to_length address)) (8:ii))), (8:ii), acctype) >>= fun w__14 -> let read_buffer = w__14 in flush_read_buffer (read_buffer,(8:ii) * (2:ii)) >>= fun w__15 -> let value = set_vector_start 127 w__15 in wX (t,reset_vector_start (set_vector_start_to_length (slice value (63:ii) (0:ii)))) >> wX (t2, reset_vector_start (set_vector_start_to_length (slice value (127:ii) (64:ii)))) >> return data else rMem' (empty_read_buffer,reset_vector_start address,dbytes,acctype,excl) >>= fun w__16 -> flush_read_buffer (w__16,dbytes) >>= fun w__17 -> let data = set_vector_start_to_length w__17 in wX (t, reset_vector_start (set_vector_start_to_length (set_vector_start_to_length (ZeroExtend (regsize,reset_vector_start (set_vector_start_to_length data)))))) >> return data) >>= fun data -> return (data,status) end >>= fun (data, status) -> return (address,data,status)) >>= fun (address, data, status) -> return () let execute_LoadStorePairNonTemp (wback, postindex, n, t, t2, acctype, memop, scale, datasize, offset) = let address = to_vec_dec ((64:ii),(0:ii)) in let data1 = set_vector_start_to_length (to_vec_dec (datasize,(0:ii))) in let data2 = set_vector_start_to_length (to_vec_dec (length data1,(0:ii))) in let dbytes = quot datasize (8:ii) in let rt_unknown = B0 in (if bitU_to_bool ((eq (memop, MemOp_LOAD)) &. (eq_range (t, t2))) then UnallocatedEncoding () else return ()) >> (if bitU_to_bool (eq_range (n, (31:ii))) then CheckSPAlignment () >> rSP (64:ii) else rX ((64:ii),n)) >>= fun address -> let address = if bitU_to_bool (~postindex) then set_vector_start 63 (add_VVV (reset_vector_start (set_vector_start_to_length address)) (reset_vector_start (set_vector_start_to_length offset))) else address in (if bitU_to_bool (eq (memop, MemOp_STORE)) then wMem_Addr (reset_vector_start address,dbytes * (2:ii),acctype,B0) else return ()) >> (if bitU_to_bool wback then let address' = if bitU_to_bool (~postindex) then address else add_VVV (reset_vector_start (set_vector_start_to_length address)) (reset_vector_start (set_vector_start_to_length offset)) in if bitU_to_bool (eq_range (n, (31:ii))) then wSP ((),reset_vector_start (set_vector_start_to_length address')) else wX (n,reset_vector_start (set_vector_start_to_length address')) else return ()) >> match memop with | MemOp_STORE -> (if bitU_to_bool (rt_unknown &. (eq_range (t, n))) then let data1 = set_vector_start_to_length (to_vec_dec (length data1,UNKNOWN)) in return data1 else rX (length data1,t) >>= fun w__2 -> return (set_vector_start_to_length w__2)) >>= fun data1 -> (if bitU_to_bool (rt_unknown &. (eq_range (t2, n))) then let data2 = set_vector_start_to_length (to_vec_dec (length data1,UNKNOWN)) in return data2 else rX (length data1,t2) >>= fun w__3 -> return (set_vector_start_to_length w__3)) >>= fun data2 -> wMem (empty_write_buffer, reset_vector_start (set_vector_start 63 (add_VIV (reset_vector_start (set_vector_start_to_length address)) (0:ii))), dbytes, acctype, reset_vector_start (set_vector_start_to_length data1)) >>= fun write_buffer -> wMem (write_buffer, reset_vector_start (set_vector_start 63 (add_VIV (reset_vector_start (set_vector_start_to_length address)) dbytes)), dbytes, acctype, reset_vector_start (set_vector_start_to_length data2)) >>= fun w__4 -> let write_buffer = w__4 in flush_write_buffer write_buffer >> return (data1,data2) | MemOp_LOAD -> rMem (empty_read_buffer, reset_vector_start (set_vector_start 63 (add_VIV (reset_vector_start (set_vector_start_to_length address)) (0:ii))), dbytes, acctype) >>= fun read_buffer -> rMem (read_buffer, reset_vector_start (set_vector_start 63 (add_VIV (reset_vector_start (set_vector_start_to_length address)) dbytes)), dbytes, acctype) >>= fun w__5 -> let read_buffer = w__5 in flush_read_buffer (read_buffer,dbytes * (2:ii)) >>= fun w__6 -> let read_data = set_vector_start_to_length w__6 in let data1 = set_vector_start_to_length (slice (set_vector_start_to_length read_data) (datasize - (1:ii)) (0:ii)) in let data2 = set_vector_start_to_length (slice (set_vector_start_to_length read_data) ((datasize * (2:ii)) - (1:ii)) datasize) in let (data1, data2) = if bitU_to_bool rt_unknown then let data1 = set_vector_start_to_length (to_vec_dec (length data1,UNKNOWN)) in let data2 = set_vector_start_to_length (to_vec_dec (length data1,UNKNOWN)) in (data1,data2) else (data1,data2) in wX (t,reset_vector_start (set_vector_start_to_length data1)) >> wX (t2,reset_vector_start (set_vector_start_to_length data2)) >> return (data1,data2) end >>= fun (data1, data2) -> return () let execute_LoadImmediate (n, t, acctype, memop, _signed, wback, postindex, offset, regsize, datasize) = let address = to_vec_dec ((64:ii),(0:ii)) in let data = set_vector_start_to_length (to_vec_dec (datasize,(0:ii))) in let wb_unknown = B0 in let rt_unknown = B0 in (if bitU_to_bool ((eq (memop, MemOp_LOAD)) &. (wback &. ((eq_range (n, t)) &. (neq_range (n, (31:ii)))))) then UnallocatedEncoding () else return ()) >> (if bitU_to_bool ((eq (memop, MemOp_STORE)) &. (wback &. ((eq_range (n, t)) &. (neq_range (n, (31:ii)))))) then UnallocatedEncoding () else return ()) >> (if bitU_to_bool (eq_range (n, (31:ii))) then (if bitU_to_bool (neq (memop, MemOp_PREFETCH)) then CheckSPAlignment () else return ()) >> rSP (64:ii) else rX ((64:ii),n)) >>= fun address -> let address = if bitU_to_bool (~postindex) then set_vector_start 63 (add_VVV (reset_vector_start (set_vector_start_to_length address)) (reset_vector_start (set_vector_start_to_length offset))) else address in (if bitU_to_bool (eq (memop, MemOp_STORE)) then wMem_Addr (reset_vector_start address,quot datasize (8:ii),acctype,B0) else return ()) >> (if bitU_to_bool wback then let address' = if bitU_to_bool (~postindex) then address else add_VVV (reset_vector_start (set_vector_start_to_length address)) (reset_vector_start (set_vector_start_to_length offset)) in if bitU_to_bool (eq_range (n, (31:ii))) then wSP ((),reset_vector_start (set_vector_start_to_length address')) else wX (n,reset_vector_start (set_vector_start_to_length address')) else return ()) >> match memop with | MemOp_STORE -> (if bitU_to_bool rt_unknown then let data = set_vector_start_to_length (to_vec_dec (length data,UNKNOWN)) in return data else rX (length data,t) >>= fun w__2 -> return (set_vector_start_to_length w__2)) >>= fun data -> wMem (empty_write_buffer, reset_vector_start address, quot datasize (8:ii), acctype, reset_vector_start (set_vector_start_to_length data)) >>= fun w__3 -> flush_write_buffer w__3 >> return data | MemOp_LOAD -> rMem (empty_read_buffer,reset_vector_start address,quot datasize (8:ii),acctype) >>= fun w__4 -> flush_read_buffer (w__4,quot datasize (8:ii)) >>= fun w__5 -> let data = set_vector_start_to_length w__5 in (if bitU_to_bool _signed then wX (t, reset_vector_start (set_vector_start_to_length (set_vector_start_to_length (SignExtend (regsize,reset_vector_start (set_vector_start_to_length data)))))) else wX (t, reset_vector_start (set_vector_start_to_length (set_vector_start_to_length (ZeroExtend (regsize,reset_vector_start (set_vector_start_to_length data))))))) >> return data | MemOp_PREFETCH -> return data end >>= fun data -> return () let execute_LoadRegister (n, t, m, acctype, memop, _signed, wback, postindex, extend_type, shift, regsize, datasize) = ExtendReg ((64:ii),m,extend_type,shift) >>= fun offset -> let address = to_vec_dec ((64:ii),(0:ii)) in let data = set_vector_start_to_length (to_vec_dec (datasize,(0:ii))) in let wb_unknown = B0 in let rt_unknown = B0 in (if bitU_to_bool ((eq (memop, MemOp_LOAD)) &. (wback &. ((eq_range (n, t)) &. (neq_range (n, (31:ii)))))) then UnallocatedEncoding () else return ()) >> (if bitU_to_bool ((eq (memop, MemOp_STORE)) &. (wback &. ((eq_range (n, t)) &. (neq_range (n, (31:ii)))))) then UnallocatedEncoding () else return ()) >> (if bitU_to_bool (eq_range (n, (31:ii))) then (if bitU_to_bool (neq (memop, MemOp_PREFETCH)) then CheckSPAlignment () else return ()) >> rSP (64:ii) else rX ((64:ii),n)) >>= fun address -> let address = if bitU_to_bool (~postindex) then set_vector_start 63 (add_VVV (reset_vector_start (set_vector_start_to_length address)) (reset_vector_start (set_vector_start_to_length offset))) else address in (if bitU_to_bool (eq (memop, MemOp_STORE)) then wMem_Addr (reset_vector_start address,quot datasize (8:ii),acctype,B0) else return ()) >> (if bitU_to_bool wback then let address' = if bitU_to_bool (~postindex) then address else add_VVV (reset_vector_start (set_vector_start_to_length address)) (reset_vector_start (set_vector_start_to_length offset)) in if bitU_to_bool (eq_range (n, (31:ii))) then wSP ((),reset_vector_start (set_vector_start_to_length address')) else wX (n,reset_vector_start (set_vector_start_to_length address')) else return ()) >> match memop with | MemOp_STORE -> (if bitU_to_bool rt_unknown then let data = set_vector_start_to_length (to_vec_dec (length data,UNKNOWN)) in return data else rX (length data,t) >>= fun w__2 -> return (set_vector_start_to_length w__2)) >>= fun data -> wMem (empty_write_buffer, reset_vector_start address, quot datasize (8:ii), acctype, reset_vector_start (set_vector_start_to_length data)) >>= fun w__3 -> flush_write_buffer w__3 >> return data | MemOp_LOAD -> rMem (empty_read_buffer,reset_vector_start address,quot datasize (8:ii),acctype) >>= fun w__4 -> flush_read_buffer (w__4,quot datasize (8:ii)) >>= fun w__5 -> let data = set_vector_start_to_length w__5 in (if bitU_to_bool _signed then wX (t, reset_vector_start (set_vector_start_to_length (set_vector_start_to_length (SignExtend (regsize,reset_vector_start (set_vector_start_to_length data)))))) else wX (t, reset_vector_start (set_vector_start_to_length (set_vector_start_to_length (ZeroExtend (regsize,reset_vector_start (set_vector_start_to_length data))))))) >> return data | MemOp_PREFETCH -> return data end >>= fun data -> return () let execute_LoadStorePair (wback, postindex, n, t, t2, acctype, memop, _signed, datasize, offset) = let address = to_vec_dec ((64:ii),(0:ii)) in let data1 = set_vector_start_to_length (to_vec_dec (datasize,(0:ii))) in let data2 = set_vector_start_to_length (to_vec_dec (length data1,(0:ii))) in let dbytes = quot datasize (8:ii) in let rt_unknown = B0 in let wb_unknown = B0 in (if bitU_to_bool ((eq (memop, MemOp_LOAD)) &. (wback &. (((eq_range (t, n)) |. (eq_range (t2, n))) &. (neq_range (n, (31:ii)))))) then UnallocatedEncoding () else return ()) >> (if bitU_to_bool ((eq (memop, MemOp_STORE)) &. (wback &. (((eq_range (t, n)) |. (eq_range (t2, n))) &. (neq_range (n, (31:ii)))))) then UnallocatedEncoding () else return ()) >> (if bitU_to_bool ((eq (memop, MemOp_LOAD)) &. (eq_range (t, t2))) then UnallocatedEncoding () else return ()) >> (if bitU_to_bool (eq_range (n, (31:ii))) then CheckSPAlignment () >> rSP (64:ii) else rX ((64:ii),n)) >>= fun address -> let address = if bitU_to_bool (~postindex) then set_vector_start 63 (add_VVV (reset_vector_start (set_vector_start_to_length address)) (reset_vector_start (set_vector_start_to_length offset))) else address in (if bitU_to_bool (eq (memop, MemOp_STORE)) then wMem_Addr (reset_vector_start address,dbytes * (2:ii),acctype,B0) else return ()) >> (if bitU_to_bool wback then let address' = if bitU_to_bool (~postindex) then address else add_VVV (reset_vector_start (set_vector_start_to_length address)) (reset_vector_start (set_vector_start_to_length offset)) in if bitU_to_bool (eq_range (n, (31:ii))) then wSP ((),reset_vector_start (set_vector_start_to_length address')) else wX (n,reset_vector_start (set_vector_start_to_length address')) else return ()) >> match memop with | MemOp_STORE -> (if bitU_to_bool (rt_unknown &. (eq_range (t, n))) then let data1 = set_vector_start_to_length (to_vec_dec (length data1,UNKNOWN)) in return data1 else rX (length data1,t) >>= fun w__2 -> return (set_vector_start_to_length w__2)) >>= fun data1 -> (if bitU_to_bool (rt_unknown &. (eq_range (t2, n))) then let data2 = set_vector_start_to_length (to_vec_dec (length data1,UNKNOWN)) in return data2 else rX (length data1,t2) >>= fun w__3 -> return (set_vector_start_to_length w__3)) >>= fun data2 -> wMem (empty_write_buffer, reset_vector_start (set_vector_start 63 (add_VIV (reset_vector_start (set_vector_start_to_length address)) (0:ii))), dbytes, acctype, reset_vector_start (set_vector_start_to_length data1)) >>= fun write_buffer -> wMem (write_buffer, reset_vector_start (set_vector_start 63 (add_VIV (reset_vector_start (set_vector_start_to_length address)) dbytes)), dbytes, acctype, reset_vector_start (set_vector_start_to_length data2)) >>= fun w__4 -> let write_buffer = w__4 in flush_write_buffer write_buffer >> return (data1,data2) | MemOp_LOAD -> rMem (empty_read_buffer, reset_vector_start (set_vector_start 63 (add_VIV (reset_vector_start (set_vector_start_to_length address)) (0:ii))), dbytes, acctype) >>= fun read_buffer -> rMem (read_buffer, reset_vector_start (set_vector_start 63 (add_VIV (reset_vector_start (set_vector_start_to_length address)) dbytes)), dbytes, acctype) >>= fun w__5 -> let read_buffer = w__5 in flush_read_buffer (read_buffer,dbytes * (2:ii)) >>= fun w__6 -> let read_data = set_vector_start_to_length w__6 in let data1 = set_vector_start_to_length (slice (set_vector_start_to_length read_data) (datasize - (1:ii)) (0:ii)) in let data2 = set_vector_start_to_length (slice (set_vector_start_to_length read_data) ((datasize * (2:ii)) - (1:ii)) datasize) in let (data1, data2) = if bitU_to_bool rt_unknown then let data1 = set_vector_start_to_length (to_vec_dec (length data1,UNKNOWN)) in let data2 = set_vector_start_to_length (to_vec_dec (length data1,UNKNOWN)) in (data1,data2) else (data1,data2) in (if bitU_to_bool _signed then wX (t, reset_vector_start (set_vector_start_to_length (SignExtend ((64:ii),reset_vector_start (set_vector_start_to_length data1))))) >> wX (t2, reset_vector_start (set_vector_start_to_length (SignExtend ((64:ii),reset_vector_start (set_vector_start_to_length data2))))) else wX (t,reset_vector_start (set_vector_start_to_length data1)) >> wX (t2,reset_vector_start (set_vector_start_to_length data2))) >> return (data1,data2) end >>= fun (data1, data2) -> return () let execute_AddSubImmediate (d, n, datasize, sub_op, setflags, imm) = (if bitU_to_bool (eq_range (n, (31:ii))) then rSP datasize >>= fun w__0 -> return (set_vector_start_to_length w__0) else rX (datasize,n) >>= fun w__1 -> return (set_vector_start_to_length w__1)) >>= fun operand1 -> let operand2 = set_vector_start_to_length imm in let carry_in = B0 in let (operand2, carry_in) = if bitU_to_bool sub_op then let operand2 = set_vector_start_to_length (NOT (reset_vector_start (set_vector_start_to_length operand2))) in let carry_in = B1 in (operand2,carry_in) else let carry_in = B0 in (operand2,carry_in) in let (result, nzcv) = match (AddWithCarry (reset_vector_start (set_vector_start_to_length operand1), reset_vector_start (set_vector_start_to_length operand2), carry_in)) with | (v0v', v1v') -> (v0v',v1v') end in (if bitU_to_bool setflags then wPSTATE_NZCV ((),reset_vector_start nzcv) else return ()) >> if bitU_to_bool ((eq_range (d, (31:ii))) &. (~setflags)) then wSP ((),reset_vector_start (set_vector_start_to_length result)) else wX (d,reset_vector_start (set_vector_start_to_length result)) let execute_BitfieldMove (d, n, datasize, inzero, extend, R, S, wmask, tmask) = (if bitU_to_bool inzero then return (set_vector_start_to_length (Zeros datasize)) else rX (datasize,d) >>= fun w__0 -> return (set_vector_start_to_length w__0)) >>= fun dst -> rX (datasize,n) >>= fun w__1 -> let src = set_vector_start_to_length w__1 in let bot = set_vector_start_to_length (bitwise_or (set_vector_start_to_length (bitwise_and (set_vector_start_to_length dst, set_vector_start_to_length (NOT (reset_vector_start (set_vector_start_to_length wmask))))), set_vector_start_to_length (bitwise_and (set_vector_start_to_length (ROR (reset_vector_start (set_vector_start_to_length src),R)), set_vector_start_to_length wmask)))) in let top = if bitU_to_bool extend then set_vector_start_to_length (Replicate (length bot, reset_vector_start (set_vector_start_to_length (Vector [access (set_vector_start_to_length src) S] 0 false)))) else set_vector_start_to_length dst in wX (d, reset_vector_start (set_vector_start_to_length (bitwise_or (set_vector_start_to_length (bitwise_and (set_vector_start_to_length top, set_vector_start_to_length (NOT (reset_vector_start (set_vector_start_to_length tmask))))), set_vector_start_to_length (bitwise_and (set_vector_start_to_length bot, set_vector_start_to_length tmask)))))) let execute_ExtractRegister (d, n, m, datasize, lsb) = let result = set_vector_start_to_length (to_vec_dec (datasize,(0:ii))) in rX (datasize,n) >>= fun w__0 -> let operand1 = set_vector_start_to_length w__0 in rX (datasize,m) >>= fun w__1 -> let operand2 = set_vector_start_to_length w__1 in let concat = set_vector_start_to_length ((set_vector_start_to_length operand1) ^^ (set_vector_start_to_length operand2)) in let result = set_vector_start_to_length (slice (set_vector_start_to_length concat) ((lsb + datasize) - (1:ii)) lsb) in wX (d,reset_vector_start (set_vector_start_to_length result)) let execute_LogicalImmediate (d, n, datasize, setflags, op, imm) = let result = set_vector_start_to_length (to_vec_dec (datasize,(0:ii))) in rX (datasize,n) >>= fun w__0 -> let operand1 = set_vector_start_to_length w__0 in let operand2 = set_vector_start_to_length imm in let result = match op with | LogicalOp_AND -> set_vector_start_to_length (bitwise_and (set_vector_start_to_length operand1, set_vector_start_to_length operand2)) | LogicalOp_ORR -> set_vector_start_to_length (bitwise_or (set_vector_start_to_length operand1, set_vector_start_to_length operand2)) | LogicalOp_EOR -> set_vector_start_to_length (bitwise_xor (set_vector_start_to_length operand1, set_vector_start_to_length operand2)) end in (if bitU_to_bool setflags then wPSTATE_NZCV ((), reset_vector_start (set_vector_start 3 ((set_vector_start_to_length (Vector [access (set_vector_start_to_length result) ((length (reset_vector_start (set_vector_start_to_length result))) - (1:ii))] 0 false)) ^^ (set_vector_start_to_length ((set_vector_start_to_length (Vector [IsZeroBit (reset_vector_start (set_vector_start_to_length result))] 0 false)) ^^ (set_vector_start_to_length (Vector [B0;B0] 1 false))))))) else return ()) >> if bitU_to_bool ((eq_range (d, (31:ii))) &. (~setflags)) then wSP ((),reset_vector_start (set_vector_start_to_length result)) else wX (d,reset_vector_start (set_vector_start_to_length result)) let execute_MoveWide (d, datasize, imm, pos, opcode) = let result = set_vector_start_to_length (to_vec_dec (datasize,(0:ii))) in (if bitU_to_bool (eq (opcode, MoveWideOp_K)) then rX (datasize,d) >>= fun w__0 -> return (set_vector_start_to_length w__0) else let result = set_vector_start_to_length (Zeros datasize) in return result) >>= fun result -> let result = update result (pos + (15:ii)) pos (set_vector_start_to_length imm) in let result = if bitU_to_bool (eq (opcode, MoveWideOp_N)) then set_vector_start_to_length (NOT (reset_vector_start (set_vector_start_to_length result))) else result in wX (d,reset_vector_start (set_vector_start_to_length result)) let execute_Address (d, page, imm) = rPC () >>= fun base -> let base = if bitU_to_bool page then update base (11:ii) (0:ii) (Zeros (12:ii)) else base in wX (d, reset_vector_start (set_vector_start_to_length (add_VVV (reset_vector_start (set_vector_start_to_length base)) (reset_vector_start (set_vector_start_to_length imm))))) let execute_AddSubExtendRegister (d, n, m, datasize, sub_op, setflags, extend_type, shift) = (if bitU_to_bool (eq_range (n, (31:ii))) then rSP datasize >>= fun w__0 -> return (set_vector_start_to_length w__0) else rX (datasize,n) >>= fun w__1 -> return (set_vector_start_to_length w__1)) >>= fun operand1 -> ExtendReg (datasize,m,extend_type,shift) >>= fun w__2 -> let operand2 = set_vector_start_to_length w__2 in let carry_in = B0 in let (operand2, carry_in) = if bitU_to_bool sub_op then let operand2 = set_vector_start_to_length (NOT (reset_vector_start (set_vector_start_to_length operand2))) in let carry_in = B1 in (operand2,carry_in) else let carry_in = B0 in (operand2,carry_in) in let (result, nzcv) = match (AddWithCarry (reset_vector_start (set_vector_start_to_length operand1), reset_vector_start (set_vector_start_to_length operand2), carry_in)) with | (v2v', v3v') -> (v2v',v3v') end in (if bitU_to_bool setflags then wPSTATE_NZCV ((),reset_vector_start nzcv) else return ()) >> if bitU_to_bool ((eq_range (d, (31:ii))) &. (~setflags)) then wSP ((),reset_vector_start (set_vector_start_to_length result)) else wX (d,reset_vector_start (set_vector_start_to_length result)) let execute_AddSubShiftedRegister (d, n, m, datasize, sub_op, setflags, shift_type, shift_amount) = rX (datasize,n) >>= fun w__0 -> let operand1 = set_vector_start_to_length w__0 in ShiftReg (datasize,m,shift_type,shift_amount) >>= fun w__1 -> let operand2 = set_vector_start_to_length w__1 in let carry_in = B0 in let (operand2, carry_in) = if bitU_to_bool sub_op then let operand2 = set_vector_start_to_length (NOT (reset_vector_start (set_vector_start_to_length operand2))) in let carry_in = B1 in (operand2,carry_in) else let carry_in = B0 in (operand2,carry_in) in let (result, nzcv) = match (AddWithCarry (reset_vector_start (set_vector_start_to_length operand1), reset_vector_start (set_vector_start_to_length operand2), carry_in)) with | (v4v', v5v') -> (v4v',v5v') end in (if bitU_to_bool setflags then wPSTATE_NZCV ((),reset_vector_start nzcv) else return ()) >> wX (d,reset_vector_start (set_vector_start_to_length result)) let execute_AddSubCarry (d, n, m, datasize, sub_op, setflags) = rX (datasize,n) >>= fun w__0 -> let operand1 = set_vector_start_to_length w__0 in rX (datasize,m) >>= fun w__1 -> let operand2 = set_vector_start_to_length w__1 in let operand2 = if bitU_to_bool sub_op then set_vector_start_to_length (NOT (reset_vector_start (set_vector_start_to_length operand2))) else operand2 in read_reg_bitfield NZCV "C" >>= fun w__2 -> let (result, nzcv) = match (AddWithCarry (reset_vector_start (set_vector_start_to_length operand1), reset_vector_start (set_vector_start_to_length operand2), w__2)) with | (v6v', v7v') -> (v6v',v7v') end in (if bitU_to_bool setflags then wPSTATE_NZCV ((),reset_vector_start nzcv) else return ()) >> wX (d,reset_vector_start (set_vector_start_to_length result)) let execute_ConditionalCompareImmediate (n, datasize, sub_op, condition, flags, imm) = rX (datasize,n) >>= fun w__0 -> let operand1 = set_vector_start_to_length w__0 in let operand2 = set_vector_start_to_length imm in let carry_in = B0 in let flags' = flags in ConditionHolds (reset_vector_start condition) >>= fun w__1 -> let (operand2, carry_in, flags') = if bitU_to_bool w__1 then let (operand2, carry_in) = if bitU_to_bool sub_op then let operand2 = set_vector_start_to_length (NOT (reset_vector_start (set_vector_start_to_length operand2))) in let carry_in = B1 in (operand2,carry_in) else (operand2,carry_in) in let (_, nzcv) = match (AddWithCarry (reset_vector_start (set_vector_start_to_length operand1), reset_vector_start (set_vector_start_to_length operand2), carry_in)) with | (v8v', v9v') -> (v8v',v9v') end in let flags' = nzcv in (operand2,carry_in,flags') else (operand2,carry_in,flags') in wPSTATE_NZCV ((),reset_vector_start flags') let execute_ConditionalCompareRegister (n, m, datasize, sub_op, condition, flags) = rX (datasize,n) >>= fun w__0 -> let operand1 = set_vector_start_to_length w__0 in rX (datasize,m) >>= fun w__1 -> let operand2 = set_vector_start_to_length w__1 in let carry_in = B0 in let flags' = flags in ConditionHolds (reset_vector_start condition) >>= fun w__2 -> let (operand2, carry_in, flags') = if bitU_to_bool w__2 then let (operand2, carry_in) = if bitU_to_bool sub_op then let operand2 = set_vector_start_to_length (NOT (reset_vector_start (set_vector_start_to_length operand2))) in let carry_in = B1 in (operand2,carry_in) else (operand2,carry_in) in let (_, nzcv) = match (AddWithCarry (reset_vector_start (set_vector_start_to_length operand1), reset_vector_start (set_vector_start_to_length operand2), carry_in)) with | (v10v', v11v') -> (v10v',v11v') end in let flags' = nzcv in (operand2,carry_in,flags') else (operand2,carry_in,flags') in wPSTATE_NZCV ((),reset_vector_start flags') let execute_ConditionalSelect (d, n, m, datasize, condition, else_inv, else_inc) = let result = set_vector_start_to_length (to_vec_dec (datasize,(0:ii))) in rX (datasize,n) >>= fun w__0 -> let operand1 = set_vector_start_to_length w__0 in rX (datasize,m) >>= fun w__1 -> let operand2 = set_vector_start_to_length w__1 in ConditionHolds (reset_vector_start condition) >>= fun w__2 -> let result = if bitU_to_bool w__2 then set_vector_start_to_length operand1 else let result = set_vector_start_to_length operand2 in let result = if bitU_to_bool else_inv then set_vector_start_to_length (NOT (reset_vector_start (set_vector_start_to_length result))) else result in if bitU_to_bool else_inc then set_vector_start_to_length (add_VIV (reset_vector_start (set_vector_start_to_length result)) (1:ii)) else result in wX (d,reset_vector_start (set_vector_start_to_length result)) let execute_Reverse (d, n, datasize, op) = let result = set_vector_start_to_length (to_vec_dec (datasize,(0:ii))) in let V = to_vec_dec ((6:ii),(0:ii)) in let V = match op with | RevOp_REV16 -> Vector [B0;B0;B1;B0;B0;B0] 5 false | RevOp_REV32 -> Vector [B0;B1;B1;B0;B0;B0] 5 false | RevOp_REV64 -> Vector [B1;B1;B1;B0;B0;B0] 5 false | RevOp_RBIT -> if bitU_to_bool (eq_range (datasize, (64:ii))) then Vector [B1;B1;B1;B1;B1;B1] 5 false else Vector [B0;B1;B1;B1;B1;B1] 5 false end in rX (datasize,n) >>= fun w__0 -> let result = set_vector_start_to_length w__0 in let result = (foreach_inc ((0:ii),(5:ii),(1:ii)) result (fun vbit result -> if bitU_to_bool (eq (match (access V vbit) with | B0 -> (0:ii) | B1 -> (1:ii) end, (1:ii))) then let tmp = set_vector_start_to_length result in let vsize = lsl' ((1:ii),vbit) in (foreach_inc ((0:ii),datasize - (1:ii),(2:ii) * vsize) result (fun base result -> let result = update result ((base + vsize) - (1:ii)) base (set_vector_start_to_length (slice (set_vector_start_to_length tmp) ((base + ((2:ii) * vsize)) - (1:ii)) (base + vsize))) in update result ((base + ((2:ii) * vsize)) - (1:ii)) (base + vsize) (set_vector_start_to_length (slice (set_vector_start_to_length tmp) ((base + vsize) - (1:ii)) base)))) else result)) in wX (d,reset_vector_start (set_vector_start_to_length result)) let execute_CountLeading (d, n, datasize, opcode) = let result = (0:ii) in rX (datasize,n) >>= fun w__0 -> let operand1 = set_vector_start_to_length w__0 in let result = if bitU_to_bool (eq (opcode, CountOp_CLZ)) then CountLeadingZeroBits (reset_vector_start (set_vector_start_to_length operand1)) else CountLeadingSignBits (reset_vector_start (set_vector_start_to_length operand1)) in wX (d,reset_vector_start (set_vector_start_to_length (to_vec_dec (datasize,result)))) let execute_Division (d, n, m, datasize, _unsigned) = rX (datasize,n) >>= fun w__0 -> let operand1 = set_vector_start_to_length w__0 in rX (datasize,m) >>= fun w__1 -> let operand2 = set_vector_start_to_length w__1 in let result = (0:ii) in let result = if bitU_to_bool (IsZero (reset_vector_start (set_vector_start_to_length operand2))) then (0:ii) else quot (Int (reset_vector_start (set_vector_start_to_length operand1),_unsigned)) (Int (reset_vector_start (set_vector_start_to_length operand2),_unsigned)) in wX (d,reset_vector_start (set_vector_start_to_length (to_vec_dec (datasize,result)))) let execute_Shift (d, n, m, datasize, shift_type) = let result = set_vector_start_to_length (to_vec_dec (datasize,(0:ii))) in rX (datasize,m) >>= fun w__0 -> let operand2 = set_vector_start_to_length w__0 in ShiftReg (datasize, n, shift_type, modulo (UInt (reset_vector_start (set_vector_start_to_length operand2))) datasize) >>= fun w__1 -> let result = set_vector_start_to_length w__1 in wX (d,reset_vector_start (set_vector_start_to_length result)) let execute_CRC (d, n, m, size, crc32c) = (if bitU_to_bool (~(HaveCRCExt ())) then UnallocatedEncoding () else return ()) >> rX ((32:ii),n) >>= fun acc -> rX (size,m) >>= fun w__0 -> let _val = set_vector_start_to_length w__0 in let poly = if bitU_to_bool crc32c then Vector [B0;B0;B0;B1;B1;B1;B1;B0;B1;B1;B0;B1;B1;B1;B0;B0;B0;B1;B1;B0;B1; B1;B1;B1;B0;B1;B0;B0;B0;B0;B0;B1] 31 false else Vector [B0;B0;B0;B0;B0;B1;B0;B0;B1;B1;B0;B0;B0;B0;B0;B1;B0;B0;B0;B1;B1; B1;B0;B1;B1;B0;B1;B1;B0;B1;B1;B1] 31 false in let tempacc = set_vector_start_to_length ((set_vector_start_to_length (BitReverse (reset_vector_start (set_vector_start_to_length acc)))) ^^ (set_vector_start_to_length (set_vector_start_to_length (Zeros (length _val))))) in let tempval = set_vector_start_to_length ((set_vector_start_to_length (BitReverse (reset_vector_start (set_vector_start_to_length _val)))) ^^ (Zeros (32:ii))) in wX (d, reset_vector_start (set_vector_start_to_length (BitReverse (reset_vector_start (set_vector_start_to_length (Poly32Mod2 (reset_vector_start (set_vector_start_to_length (bitwise_xor (set_vector_start_to_length tempacc, set_vector_start_to_length tempval))), reset_vector_start poly))))))) let execute_MultiplyAddSub (d, n, m, a, destsize, datasize, sub_op) = rX (datasize,n) >>= fun w__0 -> let operand1 = set_vector_start_to_length w__0 in rX (datasize,m) >>= fun w__1 -> let operand2 = set_vector_start_to_length w__1 in rX (destsize,a) >>= fun w__2 -> let operand3 = set_vector_start_to_length w__2 in let result = (0:ii) in let result = if bitU_to_bool sub_op then (UInt (reset_vector_start (set_vector_start_to_length operand3))) - ((UInt (reset_vector_start (set_vector_start_to_length operand1))) * (UInt (reset_vector_start (set_vector_start_to_length operand2)))) else (UInt (reset_vector_start (set_vector_start_to_length operand3))) + ((UInt (reset_vector_start (set_vector_start_to_length operand1))) * (UInt (reset_vector_start (set_vector_start_to_length operand2)))) in wX (d,reset_vector_start (set_vector_start_to_length (to_vec_dec (destsize,result)))) let execute_MultiplyAddSubLong (d, n, m, a, destsize, datasize, sub_op, _unsigned) = rX (datasize,n) >>= fun w__0 -> let operand1 = set_vector_start_to_length w__0 in rX (datasize,m) >>= fun w__1 -> let operand2 = set_vector_start_to_length w__1 in rX (destsize,a) >>= fun w__2 -> let operand3 = set_vector_start_to_length w__2 in let result = (0:ii) in let result = if bitU_to_bool sub_op then (Int (reset_vector_start (set_vector_start_to_length operand3),_unsigned)) - ((Int (reset_vector_start (set_vector_start_to_length operand1),_unsigned)) * (Int (reset_vector_start (set_vector_start_to_length operand2),_unsigned))) else (Int (reset_vector_start (set_vector_start_to_length operand3),_unsigned)) + ((Int (reset_vector_start (set_vector_start_to_length operand1),_unsigned)) * (Int (reset_vector_start (set_vector_start_to_length operand2),_unsigned))) in wX (d,reset_vector_start (set_vector_start_to_length (to_vec_dec ((64:ii),result)))) let execute_MultiplyHigh (d, n, m, a, destsize, datasize, _unsigned) = rX (destsize,n) >>= fun w__0 -> let operand1 = set_vector_start_to_length w__0 in rX (destsize,m) >>= fun w__1 -> let operand2 = set_vector_start_to_length w__1 in let result = (0:ii) in let result = (Int (reset_vector_start (set_vector_start_to_length operand1),_unsigned)) * (Int (reset_vector_start (set_vector_start_to_length operand2),_unsigned)) in wX (d, reset_vector_start (set_vector_start_to_length (slice (to_vec_dec ((128:ii),result)) (127:ii) (64:ii)))) let execute_LogicalShiftedRegister (d, n, m, datasize, setflags, op, shift_type, shift_amount, invert) = rX (datasize,n) >>= fun w__0 -> let operand1 = set_vector_start_to_length w__0 in ShiftReg (datasize,m,shift_type,shift_amount) >>= fun w__1 -> let operand2 = set_vector_start_to_length w__1 in let operand2 = if bitU_to_bool invert then set_vector_start_to_length (NOT (reset_vector_start (set_vector_start_to_length operand2))) else operand2 in let result = set_vector_start_to_length (to_vec_dec (datasize,(0:ii))) in let result = match op with | LogicalOp_AND -> set_vector_start_to_length (bitwise_and (set_vector_start_to_length operand1, set_vector_start_to_length operand2)) | LogicalOp_ORR -> set_vector_start_to_length (bitwise_or (set_vector_start_to_length operand1, set_vector_start_to_length operand2)) | LogicalOp_EOR -> set_vector_start_to_length (bitwise_xor (set_vector_start_to_length operand1, set_vector_start_to_length operand2)) end in (if bitU_to_bool setflags then wPSTATE_NZCV ((), reset_vector_start (set_vector_start 3 ((set_vector_start_to_length (Vector [access (set_vector_start_to_length result) (datasize - (1:ii))] 0 false)) ^^ (set_vector_start_to_length ((set_vector_start_to_length (Vector [IsZeroBit (reset_vector_start (set_vector_start_to_length result))] 0 false)) ^^ (set_vector_start_to_length (Vector [B0;B0] 1 false))))))) else return ()) >> wX (d,reset_vector_start (set_vector_start_to_length result)) let execute = function | TMStart (t) -> execute_TMStart (t) | TMCommit -> execute_TMCommit () | TMTest -> execute_TMTest () | TMAbort (retry,reason) -> execute_TMAbort (retry,reason) | CompareAndBranch (t,datasize,iszero,offset) -> execute_CompareAndBranch (t,datasize,iszero,offset) | BranchConditional (offset,condition) -> execute_BranchConditional (offset,condition) | GenerateExceptionEL1 (imm) -> execute_GenerateExceptionEL1 (imm) | GenerateExceptionEL2 (imm) -> execute_GenerateExceptionEL2 (imm) | GenerateExceptionEL3 (imm) -> execute_GenerateExceptionEL3 (imm) | DebugBreakpoint (comment) -> execute_DebugBreakpoint (comment) | ExternalDebugBreakpoint -> execute_ExternalDebugBreakpoint () | DebugSwitchToExceptionLevel (target_level) -> execute_DebugSwitchToExceptionLevel (target_level) | MoveSystemImmediate (operand,field') -> execute_MoveSystemImmediate (operand,field') | Hint (op) -> execute_Hint (op) | ClearExclusiveMonitor (imm) -> execute_ClearExclusiveMonitor (imm) | Barrier (op,domain,types) -> execute_Barrier (op,domain,types) | System (t,sys_op0,sys_op1,sys_op2,sys_crn,sys_crm,has_result) -> execute_System (t,sys_op0,sys_op1,sys_op2,sys_crn,sys_crm,has_result) | MoveSystemRegister (t,sys_op0,sys_op1,sys_op2,sys_crn,sys_crm,read) -> execute_MoveSystemRegister (t,sys_op0,sys_op1,sys_op2,sys_crn,sys_crm,read) | ImplementationDefinedTestBeginEnd (isEnd) -> execute_ImplementationDefinedTestBeginEnd (isEnd) | ImplementationDefinedStopFetching -> execute_ImplementationDefinedStopFetching () | ImplementationDefinedThreadStart -> execute_ImplementationDefinedThreadStart () | TestBitAndBranch (t,datasize,bit_pos,bit_val,offset) -> execute_TestBitAndBranch (t,datasize,bit_pos,bit_val,offset) | BranchImmediate (branch_type,offset) -> execute_BranchImmediate (branch_type,offset) | BranchRegister (n,branch_type) -> execute_BranchRegister (n,branch_type) | ExceptionReturn -> execute_ExceptionReturn () | DebugRestorePState -> execute_DebugRestorePState () | LoadLiteral (t,memop,_signed,size,offset,datasize) -> execute_LoadLiteral (t,memop,_signed,size,offset,datasize) | LoadStoreAcqExc (n,t,t2,s,acctype,excl,pair,memop,elsize,regsize,datasize) -> execute_LoadStoreAcqExc (n,t,t2,s,acctype,excl,pair,memop,elsize,regsize,datasize) | LoadStorePairNonTemp (wback,postindex,n,t,t2,acctype,memop,scale,datasize,offset) -> execute_LoadStorePairNonTemp (wback,postindex,n,t,t2,acctype,memop,scale,datasize,offset) | LoadImmediate (n,t,acctype,memop,_signed,wback,postindex,offset,regsize,datasize) -> execute_LoadImmediate (n,t,acctype,memop,_signed,wback,postindex,offset,regsize,datasize) | LoadRegister (n,t,m,acctype,memop,_signed,wback,postindex,extend_type,shift,regsize,datasize) -> execute_LoadRegister (n,t,m,acctype,memop,_signed,wback,postindex,extend_type,shift,regsize,datasize) | LoadStorePair (wback,postindex,n,t,t2,acctype,memop,_signed,datasize,offset) -> execute_LoadStorePair (wback,postindex,n,t,t2,acctype,memop,_signed,datasize,offset) | AddSubImmediate (d,n,datasize,sub_op,setflags,imm) -> execute_AddSubImmediate (d,n,datasize,sub_op,setflags,imm) | BitfieldMove (d,n,datasize,inzero,extend,R,S,wmask,tmask) -> execute_BitfieldMove (d,n,datasize,inzero,extend,R,S,wmask,tmask) | ExtractRegister (d,n,m,datasize,lsb) -> execute_ExtractRegister (d,n,m,datasize,lsb) | LogicalImmediate (d,n,datasize,setflags,op,imm) -> execute_LogicalImmediate (d,n,datasize,setflags,op,imm) | MoveWide (d,datasize,imm,pos,opcode) -> execute_MoveWide (d,datasize,imm,pos,opcode) | Address (d,page,imm) -> execute_Address (d,page,imm) | AddSubExtendRegister (d,n,m,datasize,sub_op,setflags,extend_type,shift) -> execute_AddSubExtendRegister (d,n,m,datasize,sub_op,setflags,extend_type,shift) | AddSubShiftedRegister (d,n,m,datasize,sub_op,setflags,shift_type,shift_amount) -> execute_AddSubShiftedRegister (d,n,m,datasize,sub_op,setflags,shift_type,shift_amount) | AddSubCarry (d,n,m,datasize,sub_op,setflags) -> execute_AddSubCarry (d,n,m,datasize,sub_op,setflags) | ConditionalCompareImmediate (n,datasize,sub_op,condition,flags,imm) -> execute_ConditionalCompareImmediate (n,datasize,sub_op,condition,flags,imm) | ConditionalCompareRegister (n,m,datasize,sub_op,condition,flags) -> execute_ConditionalCompareRegister (n,m,datasize,sub_op,condition,flags) | ConditionalSelect (d,n,m,datasize,condition,else_inv,else_inc) -> execute_ConditionalSelect (d,n,m,datasize,condition,else_inv,else_inc) | Reverse (d,n,datasize,op) -> execute_Reverse (d,n,datasize,op) | CountLeading (d,n,datasize,opcode) -> execute_CountLeading (d,n,datasize,opcode) | Division (d,n,m,datasize,_unsigned) -> execute_Division (d,n,m,datasize,_unsigned) | Shift (d,n,m,datasize,shift_type) -> execute_Shift (d,n,m,datasize,shift_type) | CRC (d,n,m,size,crc32c) -> execute_CRC (d,n,m,size,crc32c) | MultiplyAddSub (d,n,m,a,destsize,datasize,sub_op) -> execute_MultiplyAddSub (d,n,m,a,destsize,datasize,sub_op) | MultiplyAddSubLong (d,n,m,a,destsize,datasize,sub_op,_unsigned) -> execute_MultiplyAddSubLong (d,n,m,a,destsize,datasize,sub_op,_unsigned) | MultiplyHigh (d,n,m,a,destsize,datasize,_unsigned) -> execute_MultiplyHigh (d,n,m,a,destsize,datasize,_unsigned) | LogicalShiftedRegister (d,n,m,datasize,setflags,op,shift_type,shift_amount,invert) -> execute_LogicalShiftedRegister (d,n,m,datasize,setflags,op,shift_type,shift_amount,invert) end