From 0708019057bd6eb979e056bd4a22ea63d1ed34e4 Mon Sep 17 00:00:00 2001 From: SachinVin Date: Sat, 3 Aug 2019 10:31:04 +0530 Subject: [PATCH] backend/a64: Port callback functions --- src/backend/A64/callback.cpp | 41 +++++++++++++++++++++++++++ src/backend/A64/callback.h | 54 ++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 src/backend/A64/callback.cpp create mode 100644 src/backend/A64/callback.h diff --git a/src/backend/A64/callback.cpp b/src/backend/A64/callback.cpp new file mode 100644 index 00000000..c7e19f64 --- /dev/null +++ b/src/backend/A64/callback.cpp @@ -0,0 +1,41 @@ +/* This file is part of the dynarmic project. + * Copyright (c) 2018 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/callback.h" +#include "backend/A64/block_of_code.h" + +namespace Dynarmic::BackendA64 { + +Callback::~Callback() = default; + +void SimpleCallback::EmitCall(BlockOfCode& code, std::function l) const { + l({code.ABI_PARAM1, code.ABI_PARAM2, code.ABI_PARAM3, code.ABI_PARAM4}); + code.QuickCallFunction(fn); +} + +void SimpleCallback::EmitCallWithReturnPointer(BlockOfCode& code, std::function l) const { + l(code.ABI_PARAM1, {code.ABI_PARAM2, code.ABI_PARAM3, code.ABI_PARAM4}); + code.QuickCallFunction(fn); +} + +void ArgCallback::EmitCall(BlockOfCode& code, std::function l) const { + l({code.ABI_PARAM2, code.ABI_PARAM3, code.ABI_PARAM4}); + code.MOVI2R(code.ABI_PARAM1, arg); + code.QuickCallFunction(fn); +} + +void ArgCallback::EmitCallWithReturnPointer(BlockOfCode& code, std::function l) const { +#if defined(WIN32) && !defined(__MINGW64__) + l(code.ABI_PARAM2, {code.ABI_PARAM3, code.ABI_PARAM4}); + code.MOVI2R(code.ABI_PARAM1, arg); +#else + l(code.ABI_PARAM1, {code.ABI_PARAM3, code.ABI_PARAM4}); + code.MOVI2R(code.ABI_PARAM2, arg); +#endif + code.QuickCallFunction(fn); +} + +} // namespace Dynarmic::BackendX64 diff --git a/src/backend/A64/callback.h b/src/backend/A64/callback.h new file mode 100644 index 00000000..c9d88db4 --- /dev/null +++ b/src/backend/A64/callback.h @@ -0,0 +1,54 @@ +/* This file is part of the dynarmic project. + * Copyright (c) 2018 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 +#include + +#include "backend/A64/emitter/a64_emitter.h" +#include "common/common_types.h" + +namespace Dynarmic::BackendA64 { + +using RegList = std::vector; + +class BlockOfCode; + +class Callback { +public: + virtual ~Callback(); + + virtual void EmitCall(BlockOfCode& code, std::function fn = [](RegList) {}) const = 0; + virtual void EmitCallWithReturnPointer(BlockOfCode& code, std::function fn) const = 0; +}; + +class SimpleCallback final : public Callback { +public: + template + SimpleCallback(Function fn) : fn(reinterpret_cast(fn)) {} + + void EmitCall(BlockOfCode& code, std::function fn = [](RegList) {}) const override; + void EmitCallWithReturnPointer(BlockOfCode& code, std::function fn) const override; + +private: + void (*fn)(); +}; + +class ArgCallback final : public Callback { +public: + template + ArgCallback(Function fn, u64 arg) : fn(reinterpret_cast(fn)), arg(arg) {} + + void EmitCall(BlockOfCode& code, std::function fn = [](RegList) {}) const override; + void EmitCallWithReturnPointer(BlockOfCode& code, std::function fn) const override; + +private: + void (*fn)(); + u64 arg; +}; + +} // namespace Dynarmic::BackendA64