diff options
| author | Christopher Pulte | 2019-02-28 13:18:54 +0000 |
|---|---|---|
| committer | Christopher Pulte | 2019-02-28 13:18:54 +0000 |
| commit | a20101dc3769b5c5a6e51753c1be42f78df86e22 (patch) | |
| tree | d99cfbf3ec04e1d117c39912a4d04e22f5ccd0a0 /aarch64_small/armV8_embed_sequential.lem | |
| parent | 9fd08144367f0b3a08bd5fd3e973ede900a9c72d (diff) | |
more progress
Diffstat (limited to 'aarch64_small/armV8_embed_sequential.lem')
| -rw-r--r-- | aarch64_small/armV8_embed_sequential.lem | 5561 |
1 files changed, 0 insertions, 5561 deletions
diff --git a/aarch64_small/armV8_embed_sequential.lem b/aarch64_small/armV8_embed_sequential.lem deleted file mode 100644 index 21841fe1..00000000 --- a/aarch64_small/armV8_embed_sequential.lem +++ /dev/null @@ -1,5561 +0,0 @@ -(*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 - |
