From f3bb2e5f92b5110c87f6fdaad656fea1b4703143 Mon Sep 17 00:00:00 2001 From: SachinVin Date: Sat, 3 Aug 2019 10:30:19 +0530 Subject: [PATCH] backend/a64: Port exception handler --- src/backend/A64/exception_handler_generic.cpp | 21 +++++ src/backend/A64/oparg.h | 76 +++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 src/backend/A64/exception_handler_generic.cpp create mode 100644 src/backend/A64/oparg.h diff --git a/src/backend/A64/exception_handler_generic.cpp b/src/backend/A64/exception_handler_generic.cpp new file mode 100644 index 00000000..2e066fa4 --- /dev/null +++ b/src/backend/A64/exception_handler_generic.cpp @@ -0,0 +1,21 @@ +/* This file is part of the dynarmic project. + * Copyright (c) 2016 MerryMage + * This software may be used and distributed according to the terms of the GNU + * General Public License version 2 or any later version. + */ + +#include "backend/A64/block_of_code.h" + +namespace Dynarmic::BackendA64 { + +struct BlockOfCode::ExceptionHandler::Impl final { +}; + +BlockOfCode::ExceptionHandler::ExceptionHandler() = default; +BlockOfCode::ExceptionHandler::~ExceptionHandler() = default; + +void BlockOfCode::ExceptionHandler::Register(BlockOfCode&) { + // Do nothing +} + +} // namespace Dynarmic::BackendA64 diff --git a/src/backend/A64/oparg.h b/src/backend/A64/oparg.h new file mode 100644 index 00000000..4e9760c9 --- /dev/null +++ b/src/backend/A64/oparg.h @@ -0,0 +1,76 @@ +/* This file is part of the dynarmic project. + * Copyright (c) 2016 MerryMage + * This software may be used and distributed according to the terms of the GNU + * General Public License version 2 or any later version. + */ + +#pragma once + +#include "common/assert.h" + +namespace Dynarmic::BackendA64 { + +struct OpArg { + OpArg() : type(Type::Operand), inner_operand() {} + /* implicit */ OpArg(const Xbyak::Address& address) : type(Type::Address), inner_address(address) {} + /* implicit */ OpArg(const Xbyak::Reg& reg) : type(Type::Reg), inner_reg(reg) {} + + Xbyak::Operand& operator*() { + switch (type) { + case Type::Address: + return inner_address; + case Type::Operand: + return inner_operand; + case Type::Reg: + return inner_reg; + } + ASSERT_MSG(false, "Unreachable"); + } + + void setBit(int bits) { + switch (type) { + case Type::Address: + inner_address.setBit(bits); + return; + case Type::Operand: + inner_operand.setBit(bits); + return; + case Type::Reg: + switch (bits) { + case 8: + inner_reg = inner_reg.cvt8(); + return; + case 16: + inner_reg = inner_reg.cvt16(); + return; + case 32: + inner_reg = inner_reg.cvt32(); + return; + case 64: + inner_reg = inner_reg.cvt64(); + return; + default: + ASSERT_MSG(false, "Invalid bits"); + return; + } + } + ASSERT_MSG(false, "Unreachable"); + } + +private: + enum class Type { + Operand, + Address, + Reg, + }; + + Type type; + + union { + Xbyak::Operand inner_operand; + Xbyak::Address inner_address; + Xbyak::Reg inner_reg; + }; +}; + +} // namespace Dynarmic::BackendX64