1 #include <featureTests.h>
2 #ifdef ROSE_ENABLE_ASM_A64
4 #include <BaseSemantics2.h>
6 #include <boost/serialization/access.hpp>
7 #include <boost/serialization/base_object.hpp>
8 #include <boost/serialization/export.hpp>
9 #include <boost/serialization/split_member.hpp>
13 namespace InstructionSemantics2 {
16 using DispatcherA64Ptr = boost::shared_ptr<class DispatcherA64>;
27 RegisterDescriptor REG_PC, REG_SP, REG_LR;
28 RegisterDescriptor REG_CPSR_N, REG_CPSR_Z, REG_CPSR_C, REG_CPSR_V;
30 #ifdef ROSE_HAVE_BOOST_SERIALIZATION_LIB
32 friend class boost::serialization::access;
35 void save(S &s,
const unsigned )
const {
36 s & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Super);
40 void load(S &s,
const unsigned ) {
41 s & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Super);
42 initializeRegisterDescriptors();
43 initializeInsnDispatchTable();
47 BOOST_SERIALIZATION_SPLIT_MEMBER();
53 :
BaseSemantics::Dispatcher(64, RegisterDictionary::dictionary_a64()) {}
56 :
BaseSemantics::Dispatcher(ops, 64, regs ? regs : RegisterDictionary::dictionary_a64()) {
57 initializeRegisterDescriptors();
58 initializeInsnDispatchTable();
60 initializeState(ops->currentState());
67 static DispatcherA64Ptr instance() {
68 return DispatcherA64Ptr(
new DispatcherA64);
73 return DispatcherA64Ptr(
new DispatcherA64(ops, regs));
78 const RegisterDictionary *regs =
nullptr)
const override {
79 ASSERT_require(0 == addrWidth || 64 == addrWidth);
80 return instance(ops, regs);
85 DispatcherA64Ptr retval = boost::dynamic_pointer_cast<DispatcherA64>(d);
86 ASSERT_not_null(retval);
92 void initializeRegisterDescriptors();
97 void initializeInsnDispatchTable();
100 void initializeMemory();
119 : n(n), z(z), c(c), v(v) {}
132 std::pair<uint64_t, uint64_t> decodeBitMasks(
size_t m,
bool immN, uint64_t imms, uint64_t immr,
bool immediate);
136 uint64_t immR, uint64_t immS);
140 uint64_t immR, uint64_t immS);
144 uint64_t immR, uint64_t immS);
148 RegisterDescriptor instructionPointerRegister()
const override;
149 RegisterDescriptor stackPointerRegister()
const override;
150 RegisterDescriptor callReturnRegister()
const override;
151 void set_register_dictionary(
const RegisterDictionary*)
override;
158 #ifdef ROSE_HAVE_BOOST_SERIALIZATION_LIB
159 BOOST_CLASS_EXPORT_KEY(Rose::BinaryAnalysis::InstructionSemantics2::DispatcherA64);
boost::shared_ptr< RiscOperators > RiscOperatorsPtr
Shared-ownership pointer to a RISC operators object.
Sum< T >::Ptr sum()
Factory for value agumenter.
Base class for machine instructions.
Main namespace for the ROSE library.
boost::shared_ptr< Dispatcher > DispatcherPtr
Shared-ownership pointer to a semantics instruction dispatcher.
Base classes for instruction semantics.
Base class for most instruction semantics RISC operators.
Base class for expressions.
Dispatches instructions through the RISC layer.
Base class for binary types.