From 9a04293a677cadf2b5961a9f752d4a121d221dd5 Mon Sep 17 00:00:00 2001 From: zilmar Date: Wed, 5 Apr 2023 10:16:21 +0930 Subject: [PATCH] Update arm/arm64 to use asmjit --- .../N64System/Interpreter/InterpreterOps.h | 4 ++++ Source/Project64-core/N64System/N64System.cpp | 2 +- .../N64System/Recompiler/Aarch64/Aarch64ops.cpp | 14 ++++++++++++++ .../N64System/Recompiler/Aarch64/Aarch64ops.h | 10 +++++++++- .../N64System/Recompiler/Arm/ArmOps.cpp | 14 ++++++++++++++ .../N64System/Recompiler/Arm/ArmOps.h | 10 +++++++++- .../Project64-core/N64System/Recompiler/asmjit.h | 3 +++ .../N64System/Recompiler/x86/x86RecompilerOps.cpp | 2 +- 8 files changed, 55 insertions(+), 4 deletions(-) diff --git a/Source/Project64-core/N64System/Interpreter/InterpreterOps.h b/Source/Project64-core/N64System/Interpreter/InterpreterOps.h index 7f3498c84..93cc4e5c2 100644 --- a/Source/Project64-core/N64System/Interpreter/InterpreterOps.h +++ b/Source/Project64-core/N64System/Interpreter/InterpreterOps.h @@ -4,11 +4,15 @@ #include #include +class CX86RecompilerOps; + class R4300iOp : public CLogging, protected CDebugSettings, protected CSystemRegisters { + friend CX86RecompilerOps; + public: typedef void (*Func)(); diff --git a/Source/Project64-core/N64System/N64System.cpp b/Source/Project64-core/N64System/N64System.cpp index 29c726726..f82719d78 100644 --- a/Source/Project64-core/N64System/N64System.cpp +++ b/Source/Project64-core/N64System/N64System.cpp @@ -1692,7 +1692,7 @@ void CN64System::DumpSyncErrors(CN64System * SecondCPU) if (m_Recomp->MemoryStackPos() != TargetStackPos) { - Error.LogF("MemoryStack = %p should be: %p\r\n", m_Recomp->MemoryStackPos(), (uint32_t)(m_MMU_VM.Rdram() + (m_Reg.m_GPR[29].W[0] & 0x1FFFFFFF))); + Error.LogF("MemoryStack = %p should be: %p\r\n", m_Recomp->MemoryStackPos(), (m_MMU_VM.Rdram() + (m_Reg.m_GPR[29].W[0] & 0x1FFFFFFF))); } } diff --git a/Source/Project64-core/N64System/Recompiler/Aarch64/Aarch64ops.cpp b/Source/Project64-core/N64System/Recompiler/Aarch64/Aarch64ops.cpp index 3bc57a793..b3943722b 100644 --- a/Source/Project64-core/N64System/Recompiler/Aarch64/Aarch64ops.cpp +++ b/Source/Project64-core/N64System/Recompiler/Aarch64/Aarch64ops.cpp @@ -2,10 +2,24 @@ #if defined(__aarch64__) #include +#include CAarch64Ops::CAarch64Ops(CCodeBlock & CodeBlock) : + asmjit::a64::Assembler(&CodeBlock.CodeHolder()), m_CodeBlock(CodeBlock) { } +asmjit::Error CAarch64Ops::_log(const char * data, size_t size) noexcept +{ + stdstr AsmjitLog(std::string(data, size)); + AsmjitLog.Trim("\n"); + for (SymbolMap::const_iterator itr = m_Symbols.begin(); itr != m_Symbols.end(); itr++) + { + AsmjitLog.Replace(itr->first, itr->second); + } + m_CodeBlock.Log(" %s", AsmjitLog.c_str()); + return asmjit::kErrorOk; +} + #endif \ No newline at end of file diff --git a/Source/Project64-core/N64System/Recompiler/Aarch64/Aarch64ops.h b/Source/Project64-core/N64System/Recompiler/Aarch64/Aarch64ops.h index 18557bb4e..34e56f9bc 100644 --- a/Source/Project64-core/N64System/Recompiler/Aarch64/Aarch64ops.h +++ b/Source/Project64-core/N64System/Recompiler/Aarch64/Aarch64ops.h @@ -1,9 +1,12 @@ #pragma once #if defined(__aarch64__) +#include class CCodeBlock; -class CAarch64Ops +class CAarch64Ops : + public asmjit::a64::Assembler, + public asmjit::Logger { public: CAarch64Ops(CCodeBlock & CodeBlock); @@ -13,6 +16,11 @@ private: CAarch64Ops(const CAarch64Ops &); CAarch64Ops & operator=(const CAarch64Ops &); + asmjit::Error _log(const char * data, size_t size) noexcept; + + typedef std::map SymbolMap; + + SymbolMap m_Symbols; CCodeBlock & m_CodeBlock; }; diff --git a/Source/Project64-core/N64System/Recompiler/Arm/ArmOps.cpp b/Source/Project64-core/N64System/Recompiler/Arm/ArmOps.cpp index 60c45a6fd..9d81b8c18 100644 --- a/Source/Project64-core/N64System/Recompiler/Arm/ArmOps.cpp +++ b/Source/Project64-core/N64System/Recompiler/Arm/ArmOps.cpp @@ -1,10 +1,24 @@ #include "stdafx.h" #if defined(__arm__) || defined(_M_ARM) #include +#include CArmOps::CArmOps(CCodeBlock & CodeBlock) : + asmjit::a64::Assembler(&CodeBlock.CodeHolder()), m_CodeBlock(CodeBlock) { } +asmjit::Error CArmOps::_log(const char * data, size_t size) noexcept +{ + stdstr AsmjitLog(std::string(data, size)); + AsmjitLog.Trim("\n"); + for (SymbolMap::const_iterator itr = m_Symbols.begin(); itr != m_Symbols.end(); itr++) + { + AsmjitLog.Replace(itr->first, itr->second); + } + m_CodeBlock.Log(" %s", AsmjitLog.c_str()); + return asmjit::kErrorOk; +} + #endif \ No newline at end of file diff --git a/Source/Project64-core/N64System/Recompiler/Arm/ArmOps.h b/Source/Project64-core/N64System/Recompiler/Arm/ArmOps.h index 8ec3dc1c4..4b89cf452 100644 --- a/Source/Project64-core/N64System/Recompiler/Arm/ArmOps.h +++ b/Source/Project64-core/N64System/Recompiler/Arm/ArmOps.h @@ -1,9 +1,12 @@ #pragma once #if defined(__arm__) || defined(_M_ARM) +#include class CCodeBlock; -class CArmOps +class CArmOps : + public asmjit::a64::Assembler, + public asmjit::Logger { public: CArmOps(CCodeBlock & CodeBlock); @@ -13,6 +16,11 @@ private: CArmOps(const CArmOps &); CArmOps & operator=(const CArmOps &); + asmjit::Error _log(const char * data, size_t size) noexcept; + + typedef std::map SymbolMap; + + SymbolMap m_Symbols; CCodeBlock & m_CodeBlock; }; diff --git a/Source/Project64-core/N64System/Recompiler/asmjit.h b/Source/Project64-core/N64System/Recompiler/asmjit.h index 8c5c43530..489436083 100644 --- a/Source/Project64-core/N64System/Recompiler/asmjit.h +++ b/Source/Project64-core/N64System/Recompiler/asmjit.h @@ -10,3 +10,6 @@ #else #include #endif +#include +#include +#include diff --git a/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.cpp b/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.cpp index fa67e2556..72c7be138 100644 --- a/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.cpp +++ b/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.cpp @@ -200,7 +200,7 @@ void CX86RecompilerOps::PreCompileOpcode(void) /*if (m_CompilePC == 0x803275F4 && m_PipelineStage == PIPELINE_STAGE_NORMAL) { m_Assembler.X86BreakPoint(__FILE__, __LINE__); - } + }*/ /*if (m_CompilePC >= 0x80000000 && m_CompilePC <= 0x80400000 && m_PipelineStage == PIPELINE_STAGE_NORMAL) {