From 576990c5a318f5007131fff44b0ce68d4898d4a8 Mon Sep 17 00:00:00 2001 From: hrydgard Date: Tue, 19 Jan 2010 19:28:27 +0000 Subject: [PATCH] JitIL is no longer a separate .exe/binary - it's now a simple option, Dolphin.exe now contains both cores. Advantages: * Less confusion for users * No need to build twice to make sure you didn't break something * Easier to switch between the cores for testing Disadvantages: * None, as far as I can tell :) Maybe some extra code complexity, but not much. Also break some include chains that caused to get included into everything, slowing down the build on Windows. There's more to do here though, there's still a lot of files that get it included that don't need it at all. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4891 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/Common/Common.vcproj | 4 + Source/Core/Common/Src/CDUtils.cpp | 24 + Source/Core/Common/Src/CDUtils.h | 24 - Source/Core/Common/Src/Common.h | 3 + Source/Core/Common/Src/ConsoleListener.cpp | 1 + Source/Core/Common/Src/ConsoleListener.h | 55 ++ Source/Core/Common/Src/LinearDiskCache.cpp | 10 +- Source/Core/Common/Src/LogManager.cpp | 16 +- Source/Core/Common/Src/LogManager.h | 48 +- Source/Core/Common/Src/MemoryUtil.h | 2 +- Source/Core/Common/Src/SysConf.h | 3 + Source/Core/Core/Core.vcproj | 868 +----------------- Source/Core/Core/Src/ARDecrypt.cpp | 4 + Source/Core/Core/Src/ARDecrypt.h | 4 - Source/Core/Core/Src/ConfigManager.cpp | 4 +- Source/Core/Core/Src/Console.cpp | 2 +- Source/Core/Core/Src/Core.cpp | 17 +- Source/Core/Core/Src/CoreParameter.cpp | 2 +- Source/Core/Core/Src/CoreParameter.h | 20 +- .../Core/Src/Debugger/PPCDebugInterface.cpp | 6 +- Source/Core/Core/Src/HW/CPU.cpp | 4 +- Source/Core/Core/Src/HW/CPU.h | 2 +- Source/Core/Core/Src/HW/GPFifo.cpp | 2 +- Source/Core/Core/Src/HW/HW.cpp | 2 +- Source/Core/Core/Src/HW/Memmap.cpp | 27 +- .../Core/Src/IPC_HLE/WII_IPC_HLE_Device.h | 1 - .../IPC_HLE/WII_IPC_HLE_Device_usb_kbd.cpp | 3 + Source/Core/Core/Src/MemTools.cpp | 13 +- .../Interpreter/Interpreter_LoadStore.cpp | 4 +- Source/Core/Core/Src/PowerPC/Jit64/Jit.cpp | 62 +- Source/Core/Core/Src/PowerPC/Jit64/Jit.h | 93 +- .../Jit_Tables.cpp => Jit64/Jit64_Tables.cpp} | 62 +- .../Jit_Tables.h => Jit64/Jit64_Tables.h} | 12 +- Source/Core/Core/Src/PowerPC/Jit64/JitAsm.cpp | 29 +- Source/Core/Core/Src/PowerPC/Jit64/JitAsm.h | 35 +- .../Core/Src/PowerPC/Jit64/JitRegCache.cpp | 11 + .../Core/Core/Src/PowerPC/Jit64/JitRegCache.h | 8 +- .../Core/Src/PowerPC/Jit64/Jit_Integer.cpp | 9 - .../Src/PowerPC/Jit64/Jit_LoadStorePaired.cpp | 2 +- Source/Core/Core/Src/PowerPC/Jit64IL/IR.cpp | 4 +- .../Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp | 74 +- .../PowerPC/Jit64IL/{Jit.cpp => JitIL.cpp} | 64 +- .../Src/PowerPC/Jit64IL/{Jit.h => JitIL.h} | 118 +-- .../Jit64IL/{JitAsm.cpp => JitILAsm.cpp} | 33 +- .../PowerPC/Jit64IL/{JitAsm.h => JitILAsm.h} | 30 +- .../{Jit_Branch.cpp => JitIL_Branch.cpp} | 16 +- ...atingPoint.cpp => JitIL_FloatingPoint.cpp} | 12 +- .../{Jit_Integer.cpp => JitIL_Integer.cpp} | 67 +- ...{Jit_LoadStore.cpp => JitIL_LoadStore.cpp} | 24 +- ...oating.cpp => JitIL_LoadStoreFloating.cpp} | 16 +- ...rePaired.cpp => JitIL_LoadStorePaired.cpp} | 8 +- .../{Jit_Paired.cpp => JitIL_Paired.cpp} | 20 +- ...egisters.cpp => JitIL_SystemRegisters.cpp} | 16 +- .../Core/Src/PowerPC/Jit64IL/JitIL_Tables.cpp | 496 ++++++++++ .../Core/Src/PowerPC/Jit64IL/JitIL_Tables.h | 31 + .../Core/Src/PowerPC/JitCommon/JitAsmCommon.h | 20 + .../Src/PowerPC/JitCommon/JitBackpatch.cpp | 39 +- .../Core/Src/PowerPC/JitCommon/JitBackpatch.h | 41 + .../Core/Core/Src/PowerPC/JitCommon/JitBase.h | 102 ++ .../Core/Src/PowerPC/JitCommon/JitCache.cpp | 16 +- .../Core/Src/PowerPC/JitCommon/JitCache.h | 14 +- .../Core/Src/PowerPC/JitCommon/Jit_Util.cpp | 17 +- Source/Core/Core/Src/PowerPC/PPCTables.cpp | 12 +- Source/Core/Core/Src/PowerPC/PowerPC.cpp | 21 +- Source/Core/Core/Src/PowerPC/PowerPC.h | 2 +- Source/Core/Core/Src/PowerPC/Profiler.cpp | 24 +- Source/Core/Core/Src/PowerPC/Profiler.h | 16 +- Source/Core/Core/Src/SConscript | 7 +- Source/Core/Core/Src/State.cpp | 20 +- Source/Core/DebuggerWX/Src/CodeWindow.cpp | 8 +- .../DebuggerWX/Src/CodeWindowFunctions.cpp | 4 +- Source/Core/DebuggerWX/Src/JitWindow.cpp | 16 +- Source/Core/DolphinWX/DolphinWX.vcproj | 176 ---- Source/Core/DolphinWX/Src/BootManager.cpp | 2 +- Source/Core/DolphinWX/Src/ConfigMain.cpp | 34 +- Source/Core/DolphinWX/Src/ConfigMain.h | 4 +- Source/Core/DolphinWX/Src/Frame.cpp | 1 + Source/Core/DolphinWX/Src/FrameAui.cpp | 1 + Source/Core/DolphinWX/Src/LogWindow.cpp | 2 + .../Core/VideoCommon/Src/TextureDecoder.cpp | 39 +- Source/Dolphin.sln | 140 --- Source/PluginSpecs/PluginSpecs.h | 13 +- 82 files changed, 1365 insertions(+), 1953 deletions(-) create mode 100644 Source/Core/Common/Src/ConsoleListener.h rename Source/Core/Core/Src/PowerPC/{JitCommon/Jit_Tables.cpp => Jit64/Jit64_Tables.cpp} (90%) rename Source/Core/Core/Src/PowerPC/{JitCommon/Jit_Tables.h => Jit64/Jit64_Tables.h} (83%) rename Source/Core/Core/Src/PowerPC/Jit64IL/{Jit.cpp => JitIL.cpp} (91%) rename Source/Core/Core/Src/PowerPC/Jit64IL/{Jit.h => JitIL.h} (77%) rename Source/Core/Core/Src/PowerPC/Jit64IL/{JitAsm.cpp => JitILAsm.cpp} (88%) rename Source/Core/Core/Src/PowerPC/Jit64IL/{JitAsm.h => JitILAsm.h} (74%) rename Source/Core/Core/Src/PowerPC/Jit64IL/{Jit_Branch.cpp => JitIL_Branch.cpp} (94%) rename Source/Core/Core/Src/PowerPC/Jit64IL/{Jit_FloatingPoint.cpp => JitIL_FloatingPoint.cpp} (93%) rename Source/Core/Core/Src/PowerPC/Jit64IL/{Jit_Integer.cpp => JitIL_Integer.cpp} (90%) rename Source/Core/Core/Src/PowerPC/Jit64IL/{Jit_LoadStore.cpp => JitIL_LoadStore.cpp} (92%) rename Source/Core/Core/Src/PowerPC/Jit64IL/{Jit_LoadStoreFloating.cpp => JitIL_LoadStoreFloating.cpp} (92%) rename Source/Core/Core/Src/PowerPC/Jit64IL/{Jit_LoadStorePaired.cpp => JitIL_LoadStorePaired.cpp} (93%) rename Source/Core/Core/Src/PowerPC/Jit64IL/{Jit_Paired.cpp => JitIL_Paired.cpp} (92%) rename Source/Core/Core/Src/PowerPC/Jit64IL/{Jit_SystemRegisters.cpp => JitIL_SystemRegisters.cpp} (93%) create mode 100644 Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Tables.cpp create mode 100644 Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Tables.h create mode 100644 Source/Core/Core/Src/PowerPC/JitCommon/JitBackpatch.h create mode 100644 Source/Core/Core/Src/PowerPC/JitCommon/JitBase.h diff --git a/Source/Core/Common/Common.vcproj b/Source/Core/Common/Common.vcproj index e4e7eece2f..c70e543245 100644 --- a/Source/Core/Common/Common.vcproj +++ b/Source/Core/Common/Common.vcproj @@ -535,6 +535,10 @@ RelativePath=".\Src\ConsoleListener.cpp" > + + diff --git a/Source/Core/Common/Src/CDUtils.cpp b/Source/Core/Common/Src/CDUtils.cpp index 26dc7640d9..7c0b797e21 100644 --- a/Source/Core/Common/Src/CDUtils.cpp +++ b/Source/Core/Common/Src/CDUtils.cpp @@ -3,6 +3,30 @@ #include "CDUtils.h" #include "Common.h" +#ifdef _WIN32 +#include +#define PATH_MAX MAX_PATH + +#elif __APPLE__ +#include +#include +#include +#include +#include +#include + +#elif __linux__ +#include +#include +#include +#include +#include +#include +#include + +#include +#endif // WIN32 + // Follow symlinks until we have the real device file (idea taken from libunieject). void cdio_follow_symlink(const char * src, char * dst) { #ifndef _WIN32 diff --git a/Source/Core/Common/Src/CDUtils.h b/Source/Core/Common/Src/CDUtils.h index 9a84d9707e..58df5881f1 100644 --- a/Source/Core/Common/Src/CDUtils.h +++ b/Source/Core/Common/Src/CDUtils.h @@ -5,30 +5,6 @@ #include #include -#ifdef _WIN32 -#include -#define PATH_MAX MAX_PATH - -#elif __APPLE__ -#include -#include -#include -#include -#include -#include - -#elif __linux__ -#include -#include -#include -#include -#include -#include -#include - -#include -#endif // WIN32 - // Returns a pointer to an array of strings with the device names char **cdio_get_devices(); diff --git a/Source/Core/Common/Src/Common.h b/Source/Core/Common/Src/Common.h index 04472da2a8..d2e514710f 100644 --- a/Source/Core/Common/Src/Common.h +++ b/Source/Core/Common/Src/Common.h @@ -18,6 +18,9 @@ #ifndef _COMMON_H_ #define _COMMON_H_ +// DO NOT EVER INCLUDE directly _or indirectly_ from this file +// since it slows down the build a lot. + #include #include #include diff --git a/Source/Core/Common/Src/ConsoleListener.cpp b/Source/Core/Common/Src/ConsoleListener.cpp index 87f69c86e9..4240061933 100644 --- a/Source/Core/Common/Src/ConsoleListener.cpp +++ b/Source/Core/Common/Src/ConsoleListener.cpp @@ -28,6 +28,7 @@ #include "Common.h" #include "LogManager.h" // Common +#include "ConsoleListener.h" // Common ConsoleListener::ConsoleListener() { diff --git a/Source/Core/Common/Src/ConsoleListener.h b/Source/Core/Common/Src/ConsoleListener.h new file mode 100644 index 0000000000..2484599638 --- /dev/null +++ b/Source/Core/Common/Src/ConsoleListener.h @@ -0,0 +1,55 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _CONSOLELISTENER_H +#define _CONSOLELISTENER_H + +#include "LogManager.h" + +#ifdef _WIN32 +#include +#endif + +class ConsoleListener : public LogListener +{ +public: + ConsoleListener(); + ~ConsoleListener(); + + void Open(bool Hidden = false, int Width = 100, int Height = 100, const char * Name = "Console"); + void UpdateHandle(); + void Close(); + bool IsOpen(); + void LetterSpace(int Width, int Height); + void BufferWidthHeight(int BufferWidth, int BufferHeight, int ScreenWidth, int ScreenHeight, bool BufferFirst); + void PixelSpace(int Left, int Top, int Width, int Height, bool); + #ifdef _WIN32 + COORD GetCoordinates(int BytesRead, int BufferWidth); + #endif + void Log(LogTypes::LOG_LEVELS, const char *Text); + void ClearScreen(bool Cursor = true); + + const char *getName() const { return "Console"; } + +private: +#ifdef _WIN32 + HWND GetHwnd(void); + HANDLE hConsole; +#endif +}; + +#endif // _CONSOLELISTENER_H diff --git a/Source/Core/Common/Src/LinearDiskCache.cpp b/Source/Core/Common/Src/LinearDiskCache.cpp index ca467ca48d..7345892b14 100644 --- a/Source/Core/Common/Src/LinearDiskCache.cpp +++ b/Source/Core/Common/Src/LinearDiskCache.cpp @@ -69,7 +69,7 @@ int LinearDiskCache::OpenAndRead(const char *filename, LinearDiskCacheReader *re fclose(file_); unlink(filename); - PanicAlert("LinearDiskCache file header broken."); + // PanicAlert("LinearDiskCache file header broken."); file_ = fopen(filename, "wb"); WriteHeader(); @@ -86,8 +86,8 @@ int LinearDiskCache::OpenAndRead(const char *filename, LinearDiskCacheReader *re break; } if (key_size <= 0 || value_size < 0 || key_size_size != 4 || value_size_size != 4) { - PanicAlert("Disk cache file %s corrupted/truncated! ks: %i vs %i kss %i vss %i", filename, - key_size, value_size, key_size_size, value_size_size); + // PanicAlert("Disk cache file %s corrupted/truncated! ks: %i vs %i kss %i vss %i", filename, + // key_size, value_size, key_size_size, value_size_size); file_corrupt = true; break; } @@ -96,8 +96,8 @@ int LinearDiskCache::OpenAndRead(const char *filename, LinearDiskCacheReader *re int actual_key_size = (int)fread(key, 1, key_size, file_); int actual_value_size = (int)fread(value, 1, value_size, file_); if (actual_key_size != key_size || actual_value_size != value_size) { - PanicAlert("Disk cache file %s corrupted/truncated! ks: %i actual ks: %i vs: %i actual vs: %i", filename, - key_size, actual_key_size, value_size, actual_value_size); + // PanicAlert("Disk cache file %s corrupted/truncated! ks: %i actual ks: %i vs: %i actual vs: %i", filename, + // key_size, actual_key_size, value_size, actual_value_size); file_corrupt = true; } else { reader->Read(key, key_size, value, value_size); diff --git a/Source/Core/Common/Src/LogManager.cpp b/Source/Core/Common/Src/LogManager.cpp index 199a0cf4f0..7e9aae01ca 100644 --- a/Source/Core/Common/Src/LogManager.cpp +++ b/Source/Core/Common/Src/LogManager.cpp @@ -16,7 +16,10 @@ // http://code.google.com/p/dolphin-emu/ #include "LogManager.h" +#include "ConsoleListener.h" #include "Timer.h" +#include "Thread.h" + void GenericLog(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, const char *file, int line, const char* fmt, ...) { @@ -28,7 +31,9 @@ void GenericLog(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, LogManager *LogManager::m_logManager = NULL; -LogManager::LogManager() : logMutex(1) { +LogManager::LogManager() { + logMutex = new Common::CriticalSection(1); + // create log files m_Log[LogTypes::MASTER_LOG] = new LogContainer("*", "Master Log"); m_Log[LogTypes::BOOT] = new LogContainer("BOOT", "Boot"); @@ -92,6 +97,7 @@ LogManager::~LogManager() { } delete m_fileLog; delete m_consoleLog; + delete logMutex; } void LogManager::Log(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, @@ -113,15 +119,15 @@ void LogManager::Log(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, file, line, level_to_char[(int)level], log->getShortName(), temp); - logMutex.Enter(); + logMutex->Enter(); log->trigger(level, msg); - logMutex.Leave(); + logMutex->Leave(); } void LogManager::removeListener(LogTypes::LOG_TYPE type, LogListener *listener) { - logMutex.Enter(); + logMutex->Enter(); m_Log[type]->removeListener(listener); - logMutex.Leave(); + logMutex->Leave(); } LogContainer::LogContainer(const char* shortName, const char* fullName, bool enable) diff --git a/Source/Core/Common/Src/LogManager.h b/Source/Core/Common/Src/LogManager.h index 780c9b826c..4b5c11415a 100644 --- a/Source/Core/Common/Src/LogManager.h +++ b/Source/Core/Common/Src/LogManager.h @@ -19,11 +19,8 @@ #define _LOGMANAGER_H_ #include "Log.h" -#include "Thread.h" #include "StringUtil.h" -#ifdef _WIN32 -#include -#endif + #include #include #include @@ -67,34 +64,6 @@ private: bool m_enable; }; -class ConsoleListener : public LogListener -{ -public: - ConsoleListener(); - ~ConsoleListener(); - - void Open(bool Hidden = false, int Width = 100, int Height = 100, const char * Name = "Console"); - void UpdateHandle(); - void Close(); - bool IsOpen(); - void LetterSpace(int Width, int Height); - void BufferWidthHeight(int BufferWidth, int BufferHeight, int ScreenWidth, int ScreenHeight, bool BufferFirst); - void PixelSpace(int Left, int Top, int Width, int Height, bool); - #ifdef _WIN32 - COORD GetCoordinates(int BytesRead, int BufferWidth); - #endif - void Log(LogTypes::LOG_LEVELS, const char *Text); - void ClearScreen(bool Cursor = true); - - const char *getName() const { return "Console"; } - -private: -#ifdef _WIN32 - HWND GetHwnd(void); - HANDLE hConsole; -#endif -}; - class LogContainer { public: LogContainer(const char* shortName, const char* fullName, bool enable = false); @@ -130,16 +99,26 @@ private: std::vector listeners; }; +class ConsoleListener; + +// Avoid include through Thread.h +namespace Common { + class CriticalSection; +} + class LogManager { private: LogContainer* m_Log[LogTypes::NUMBER_OF_LOGS]; - Common::CriticalSection logMutex; + Common::CriticalSection *logMutex; FileLogListener *m_fileLog; ConsoleListener *m_consoleLog; static LogManager *m_logManager; // Singleton. Ugh. public: + LogManager(); + ~LogManager(); + static u32 GetMaxLevel() { return MAX_LOGLEVEL; } void Log(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, @@ -192,9 +171,6 @@ public: static void SetInstance(LogManager *logManager) { m_logManager = logManager; } - - LogManager(); - ~LogManager(); }; #endif // _LOGMANAGER_H_ diff --git a/Source/Core/Common/Src/MemoryUtil.h b/Source/Core/Common/Src/MemoryUtil.h index 0488fdef1c..9db4e0a991 100644 --- a/Source/Core/Common/Src/MemoryUtil.h +++ b/Source/Core/Common/Src/MemoryUtil.h @@ -18,7 +18,7 @@ #ifndef _MEMORYUTIL_H #define _MEMORYUTIL_H -#include +#include void* AllocateExecutableMemory(size_t size, bool low = true); void* AllocateMemoryPages(size_t size); diff --git a/Source/Core/Common/Src/SysConf.h b/Source/Core/Common/Src/SysConf.h index ca1580d50a..85589d9a70 100644 --- a/Source/Core/Common/Src/SysConf.h +++ b/Source/Core/Common/Src/SysConf.h @@ -18,6 +18,9 @@ #ifndef __SYSCONF_MANAGER_h__ #define __SYSCONF_MANAGER_h__ +#include +#include + // This class is meant to edit the values in a given Wii SYSCONF file // It currently does not add/remove/rearrange sections, // instead only modifies exiting sections' data diff --git a/Source/Core/Core/Core.vcproj b/Source/Core/Core/Core.vcproj index c10575096a..2dfc782325 100644 --- a/Source/Core/Core/Core.vcproj +++ b/Source/Core/Core/Core.vcproj @@ -456,12 +456,7 @@ + @@ -524,6 +503,9 @@ + @@ -1021,30 +1003,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + - - - - @@ -1970,6 +1200,18 @@ RelativePath=".\Src\PowerPC\JitCommon\JitBackpatch.cpp" > + + + + + + @@ -2379,14 +1621,6 @@ UsePrecompiledHeader="1" /> - - - diff --git a/Source/Core/Core/Src/ARDecrypt.cpp b/Source/Core/Core/Src/ARDecrypt.cpp index c1cb0cfb60..f09ff7f7ec 100644 --- a/Source/Core/Core/Src/ARDecrypt.cpp +++ b/Source/Core/Core/Src/ARDecrypt.cpp @@ -22,6 +22,10 @@ #include "ARDecrypt.h" #include +#ifdef _WIN32 +#include +#endif + namespace ActionReplay { diff --git a/Source/Core/Core/Src/ARDecrypt.h b/Source/Core/Core/Src/ARDecrypt.h index 3f7406d8f6..c5b9f04206 100644 --- a/Source/Core/Core/Src/ARDecrypt.h +++ b/Source/Core/Core/Src/ARDecrypt.h @@ -17,10 +17,6 @@ #ifndef _ARDECRYPT_H_ #define _ARDECRYPT_H_ -#ifdef _WIN32 -#include -#endif - #include #include #include diff --git a/Source/Core/Core/Src/ConfigManager.cpp b/Source/Core/Core/Src/ConfigManager.cpp index e63c646946..b7c334ce97 100644 --- a/Source/Core/Core/Src/ConfigManager.cpp +++ b/Source/Core/Core/Src/ConfigManager.cpp @@ -104,7 +104,7 @@ void SConfig::SaveSettings() // Core ini.Set("Core", "HLE_BS2", m_LocalCoreStartupParameter.bHLE_BS2); - ini.Set("Core", "UseDynarec", m_LocalCoreStartupParameter.bUseJIT); + ini.Set("Core", "CPUCore", m_LocalCoreStartupParameter.iCPUCore); ini.Set("Core", "CPUThread", m_LocalCoreStartupParameter.bCPUThread); ini.Set("Core", "DSPThread", m_LocalCoreStartupParameter.bDSPThread); ini.Set("Core", "SkipIdle", m_LocalCoreStartupParameter.bSkipIdle); @@ -224,7 +224,7 @@ void SConfig::LoadSettings() // Core ini.Get("Core", "HLE_BS2", &m_LocalCoreStartupParameter.bHLE_BS2, true); - ini.Get("Core", "UseDynarec", &m_LocalCoreStartupParameter.bUseJIT, true); + ini.Get("Core", "CPUCore", &m_LocalCoreStartupParameter.iCPUCore, 1); ini.Get("Core", "DSPThread", &m_LocalCoreStartupParameter.bDSPThread, true); ini.Get("Core", "CPUThread", &m_LocalCoreStartupParameter.bCPUThread, true); ini.Get("Core", "SkipIdle", &m_LocalCoreStartupParameter.bSkipIdle, true); diff --git a/Source/Core/Core/Src/Console.cpp b/Source/Core/Core/Src/Console.cpp index ebb7ce87a7..695620d2d4 100644 --- a/Source/Core/Core/Src/Console.cpp +++ b/Source/Core/Core/Src/Console.cpp @@ -25,7 +25,7 @@ #include "PowerPC/PPCTables.h" #include "CoreTiming.h" #include "Core.h" -#include "PowerPC/Jit64/Jit.h" +#include "PowerPC/JitCommon/JitBase.h" #include "PowerPC/PPCSymbolDB.h" #include "PowerPCDisasm.h" #include "Console.h" diff --git a/Source/Core/Core/Src/Core.cpp b/Source/Core/Core/Src/Core.cpp index d3b0c48b98..69f889dc79 100644 --- a/Source/Core/Core/Src/Core.cpp +++ b/Source/Core/Core/Src/Core.cpp @@ -47,6 +47,7 @@ #include "HW/SystemTimers.h" #include "PowerPC/PowerPC.h" +#include "PowerPC/JitCommon/JitBase.h" #include "PluginManager.h" #include "ConfigManager.h" @@ -387,7 +388,7 @@ THREAD_RETURN EmuThread(void *pArg) g_pUpdateFPSDisplay(("Loading " + _CoreParameter.m_strFilename).c_str()); // Setup our core, but can't use dynarec if we are compare server - if (_CoreParameter.bUseJIT && (!_CoreParameter.bRunCompareServer || _CoreParameter.bRunCompareClient)) + if (_CoreParameter.iCPUCore && (!_CoreParameter.bRunCompareServer || _CoreParameter.bRunCompareClient)) PowerPC::SetMode(PowerPC::MODE_JIT); else PowerPC::SetMode(PowerPC::MODE_INTERPRETER); @@ -592,18 +593,10 @@ void VideoThrottle() // Settings are shown the same for both extended and summary info std::string SSettings = StringFromFormat("%s %s", - #if defined(JITTEST) && JITTEST - #ifdef _M_IX86 - _CoreParameter.bUseJIT ? "JIT32IL" : "Int32", - #else - _CoreParameter.bUseJIT ? "JIT64IL" : "Int64", - #endif + #ifdef _M_IX86 + _CoreParameter.iCPUCore ? jit->GetName() : "Int32", #else - #ifdef _M_IX86 - _CoreParameter.bUseJIT ? "JIT32" : "Int32", - #else - _CoreParameter.bUseJIT ? "JIT64" : "Int64", - #endif + _CoreParameter.iCPUCore ? jit->GetName() : "Int64", #endif _CoreParameter.bCPUThread ? "DC" : "SC"); diff --git a/Source/Core/Core/Src/CoreParameter.cpp b/Source/Core/Core/Src/CoreParameter.cpp index f319db2105..1d2ffbf9d8 100644 --- a/Source/Core/Core/Src/CoreParameter.cpp +++ b/Source/Core/Core/Src/CoreParameter.cpp @@ -37,7 +37,7 @@ SCoreStartupParameter::SCoreStartupParameter() void SCoreStartupParameter::LoadDefaults() { bEnableDebugging = false; - bUseJIT = false; + iCPUCore = 1; bCPUThread = false; bSkipIdle = false; bRunCompareServer = false; diff --git a/Source/Core/Core/Src/CoreParameter.h b/Source/Core/Core/Src/CoreParameter.h index d2ac1bcd20..06d4147d97 100644 --- a/Source/Core/Core/Src/CoreParameter.h +++ b/Source/Core/Core/Src/CoreParameter.h @@ -18,10 +18,6 @@ #ifndef _COREPARAMETER_H #define _COREPARAMETER_H -#ifdef _WIN32 -#include -#endif - #include "IniFile.h" #include @@ -30,18 +26,22 @@ struct SCoreStartupParameter { -#ifdef _WIN32 - HINSTANCE hInstance; -#endif + void * hInstance; // HINSTANCE but we don't want to include // Windows/GUI related void* hMainWindow; // Settings - bool bEnableDebugging; bool bAutomaticStart; bool bBootToPause; - bool bUseJIT; + bool bEnableDebugging; + bool bAutomaticStart; + bool bBootToPause; - // JIT + // 0 = Interpreter + // 1 = Jit + // 2 = JitIL + int iCPUCore; + + // JIT (shared between JIT and JITIL) bool bJITUnlimitedCache, bJITBlockLinking; bool bJITOff; bool bJITLoadStoreOff, bJITLoadStorelXzOff, bJITLoadStorelwzOff, bJITLoadStorelbzxOff; diff --git a/Source/Core/Core/Src/Debugger/PPCDebugInterface.cpp b/Source/Core/Core/Src/Debugger/PPCDebugInterface.cpp index f8bfe2695f..2dec6b9333 100644 --- a/Source/Core/Core/Src/Debugger/PPCDebugInterface.cpp +++ b/Source/Core/Core/Src/Debugger/PPCDebugInterface.cpp @@ -25,7 +25,7 @@ #include "../HW/DSP.h" #include "../HW/Memmap.h" #include "../PowerPC/PowerPC.h" -#include "../PowerPC/Jit64/Jit.h" +#include "../PowerPC/JitCommon/JitBase.h" #include "../PowerPC/PPCSymbolDB.h" void PPCDebugInterface::disasm(unsigned int address, char *dest, int max_size) @@ -114,13 +114,13 @@ bool PPCDebugInterface::isBreakpoint(unsigned int address) void PPCDebugInterface::setBreakpoint(unsigned int address) { if (PowerPC::breakpoints.Add(address)) - jit.NotifyBreakpoint(address, true); + jit->NotifyBreakpoint(address, true); } void PPCDebugInterface::clearBreakpoint(unsigned int address) { if (PowerPC::breakpoints.Remove(address)) - jit.NotifyBreakpoint(address, false); + jit->NotifyBreakpoint(address, false); } void PPCDebugInterface::clearAllBreakpoints() {} diff --git a/Source/Core/Core/Src/HW/CPU.cpp b/Source/Core/Core/Src/HW/CPU.cpp index 1e1a2bcfc7..6ac1b12f8e 100644 --- a/Source/Core/Core/Src/HW/CPU.cpp +++ b/Source/Core/Core/Src/HW/CPU.cpp @@ -30,10 +30,10 @@ namespace static Common::Event *m_SyncEvent; } -void CCPU::Init() +void CCPU::Init(int cpu_core) { m_StepEvent.Init(); - PowerPC::Init(); + PowerPC::Init(cpu_core); m_SyncEvent = 0; } diff --git a/Source/Core/Core/Src/HW/CPU.h b/Source/Core/Core/Src/HW/CPU.h index f966ef0040..0d35fa793f 100644 --- a/Source/Core/Core/Src/HW/CPU.h +++ b/Source/Core/Core/Src/HW/CPU.h @@ -27,7 +27,7 @@ class CCPU { public: // init - static void Init(); + static void Init(int cpu_core); // shutdown static void Shutdown(); diff --git a/Source/Core/Core/Src/HW/GPFifo.cpp b/Source/Core/Core/Src/HW/GPFifo.cpp index fa3e751941..2df3bee922 100644 --- a/Source/Core/Core/Src/HW/GPFifo.cpp +++ b/Source/Core/Core/Src/HW/GPFifo.cpp @@ -76,7 +76,7 @@ void STACKALIGN CheckGatherPipe() // move back the spill bytes m_gatherPipeCount -= GATHER_PIPE_SIZE; - // HyperIris: dunno why, but I use memcpy + // HyperIris: dunno why, but I use memcpy. TODO: See if a custom copy can be faster, like 4x MOVAPD memcpy(m_gatherPipe, m_gatherPipe + GATHER_PIPE_SIZE, m_gatherPipeCount); // increase the CPUWritePointer diff --git a/Source/Core/Core/Src/HW/HW.cpp b/Source/Core/Core/Src/HW/HW.cpp index 4d00996630..f049b61d31 100644 --- a/Source/Core/Core/Src/HW/HW.cpp +++ b/Source/Core/Core/Src/HW/HW.cpp @@ -58,7 +58,7 @@ namespace HW DVDInterface::Init(); GPFifo::Init(); ExpansionInterface::Init(); - CCPU::Init(); + CCPU::Init(SConfig::GetInstance().m_LocalCoreStartupParameter.iCPUCore); SystemTimers::Init(); if (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii) { diff --git a/Source/Core/Core/Src/HW/Memmap.cpp b/Source/Core/Core/Src/HW/Memmap.cpp index 14adcbeb9f..c0bdd9952e 100644 --- a/Source/Core/Core/Src/HW/Memmap.cpp +++ b/Source/Core/Core/Src/HW/Memmap.cpp @@ -29,7 +29,7 @@ may be redirected here (for example to Read_U32()). #include "Memmap.h" #include "../Core.h" #include "../PowerPC/PowerPC.h" -#include "../PowerPC/Jit64/Jit.h" +#include "../PowerPC/JitCommon/JitBase.h" #include "../HLE/HLE.h" #include "CPU.h" #include "ProcessorInterface.h" @@ -81,6 +81,7 @@ u8 *m_pRAM; u8 *m_pL1Cache; u8 *m_pEXRAM; u8 *m_pFakeVMEM; +u8 *m_pEFB; // 64-bit: Pointers to high-mem mirrors // 32-bit: Same as above @@ -330,7 +331,9 @@ static const MemoryView views[] = // Don't map any memory for the EFB. We want all access to this area to go // through the hardware access handlers. +#ifndef _M_X64 // {&m_pEFB, &m_pVirtualEFB, 0xC8000000, EFB_SIZE, 0}, +#endif {&m_pL1Cache, &m_pVirtualL1Cache, 0xE0000000, L1_CACHE_SIZE, 0}, {&m_pFakeVMEM, &m_pVirtualFakeVMEM, 0x7E000000, FAKEVMEM_SIZE, MV_FAKE_VMEM}, @@ -427,17 +430,17 @@ u32 Read_Opcode_JIT(const u32 _Address) u32 addr; if (_Address & JIT_ICACHE_VMEM_BIT) { - iCache = jit.GetBlockCache()->GetICacheVMEM(); + iCache = jit->GetBlockCache()->GetICacheVMEM(); addr = _Address & JIT_ICACHE_MASK; } else if (_Address & JIT_ICACHE_EXRAM_BIT) { - iCache = jit.GetBlockCache()->GetICacheEx(); + iCache = jit->GetBlockCache()->GetICacheEx(); addr = _Address & JIT_ICACHEEX_MASK; } else { - iCache = jit.GetBlockCache()->GetICache(); + iCache = jit->GetBlockCache()->GetICache(); addr = _Address & JIT_ICACHE_MASK; } u32 inst = *(u32*)(iCache + addr); @@ -455,7 +458,7 @@ u32 Read_Opcode_JIT(const u32 _Address) #endif if ((inst & 0xfc000000) == 0) { - inst = jit.GetBlockCache()->GetOriginalFirstOp(inst); + inst = jit->GetBlockCache()->GetOriginalFirstOp(inst); } // if a crash occured after that message @@ -481,17 +484,17 @@ u32 Read_Opcode_JIT_LC(const u32 _Address) u32 addr; if (_Address & JIT_ICACHE_VMEM_BIT) { - iCache = jit.GetBlockCache()->GetICacheVMEM(); + iCache = jit->GetBlockCache()->GetICacheVMEM(); addr = _Address & JIT_ICACHE_MASK; } else if (_Address & JIT_ICACHE_EXRAM_BIT) { - iCache = jit.GetBlockCache()->GetICacheEx(); + iCache = jit->GetBlockCache()->GetICacheEx(); addr = _Address & JIT_ICACHEEX_MASK; } else { - iCache = jit.GetBlockCache()->GetICache(); + iCache = jit->GetBlockCache()->GetICache(); addr = _Address & JIT_ICACHE_MASK; } u32 inst = *(u32*)(iCache + addr); @@ -504,7 +507,7 @@ u32 Read_Opcode_JIT_LC(const u32 _Address) #endif if ((inst & 0xfc000000) == 0) { - inst = jit.GetBlockCache()->GetOriginalFirstOp(inst); + inst = jit->GetBlockCache()->GetOriginalFirstOp(inst); } return inst; } @@ -516,14 +519,14 @@ void Write_Opcode_JIT(const u32 _Address, const u32 _Value) #ifdef JIT_UNLIMITED_ICACHE if (_Address & JIT_ICACHE_VMEM_BIT) { - *(u32*)(jit.GetBlockCache()->GetICacheVMEM() + (_Address & JIT_ICACHE_MASK)) = Common::swap32(_Value); + *(u32*)(jit->GetBlockCache()->GetICacheVMEM() + (_Address & JIT_ICACHE_MASK)) = Common::swap32(_Value); } else if (_Address & JIT_ICACHE_EXRAM_BIT) { - *(u32*)(jit.GetBlockCache()->GetICacheEx() + (_Address & JIT_ICACHEEX_MASK)) = Common::swap32(_Value); + *(u32*)(jit->GetBlockCache()->GetICacheEx() + (_Address & JIT_ICACHEEX_MASK)) = Common::swap32(_Value); } else - *(u32*)(jit.GetBlockCache()->GetICache() + (_Address & JIT_ICACHE_MASK)) = Common::swap32(_Value); + *(u32*)(jit->GetBlockCache()->GetICache() + (_Address & JIT_ICACHE_MASK)) = Common::swap32(_Value); #else Memory::WriteUnchecked_U32(_Value, _Address); #endif diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device.h index 84693de68a..6cd1f9f9f6 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device.h +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device.h @@ -20,7 +20,6 @@ #include #include #include "../HW/Memmap.h" -#include "../HW/CPU.h" class PointerWrap; diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb_kbd.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb_kbd.cpp index 43bb4ed97a..7c82ecd427 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb_kbd.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb_kbd.cpp @@ -20,6 +20,9 @@ #include "WII_IPC_HLE_Device_usb.h" #include "WII_IPC_HLE_Device_usb_kbd.h" +#ifdef _WIN32 +#include +#endif CWII_IPC_HLE_Device_usb_kbd::CWII_IPC_HLE_Device_usb_kbd(u32 _DeviceID, const std::string& _rDeviceName) : IWII_IPC_HLE_Device(_DeviceID, _rDeviceName) diff --git a/Source/Core/Core/Src/MemTools.cpp b/Source/Core/Core/Src/MemTools.cpp index c4ea736815..9018624e88 100644 --- a/Source/Core/Core/Src/MemTools.cpp +++ b/Source/Core/Core/Src/MemTools.cpp @@ -33,6 +33,9 @@ #define CREG_EIP(ctx) (*(ctx))->__ss.__eip #endif +#else +#include + #endif #include @@ -41,7 +44,7 @@ #include "MemTools.h" #include "HW/Memmap.h" #include "PowerPC/PowerPC.h" -#include "PowerPC/Jit64/Jit.h" +#include "PowerPC/JitCommon/JitBase.h" #include "x64Analyzer.h" namespace EMM @@ -65,7 +68,7 @@ LONG NTAPI Handler(PEXCEPTION_POINTERS pPtrs) PVOID codeAddr = pPtrs->ExceptionRecord->ExceptionAddress; unsigned char *codePtr = (unsigned char*)codeAddr; - if (!jit.IsInCodeSpace(codePtr)) { + if (!jit->IsInCodeSpace(codePtr)) { // Let's not prevent debugging. return (DWORD)EXCEPTION_CONTINUE_SEARCH; } @@ -95,7 +98,7 @@ LONG NTAPI Handler(PEXCEPTION_POINTERS pPtrs) //We could emulate the memory accesses here, but then they would still be around to take up //execution resources. Instead, we backpatch into a generic memory call and retry. - const u8 *new_rip = jit.BackPatch(codePtr, accessType, emAddress, ctx); + const u8 *new_rip = jit->BackPatch(codePtr, accessType, emAddress, ctx); // Rip/Eip needs to be updated. if (new_rip) @@ -190,7 +193,7 @@ void sigsegv_handler(int signal, siginfo_t *info, void *raw_context) #else u8 *fault_instruction_ptr = (u8 *)CREG_EIP(ctx); #endif - if (!jit.IsInCodeSpace(fault_instruction_ptr)) { + if (!jit->IsInCodeSpace(fault_instruction_ptr)) { // Let's not prevent debugging. return; } @@ -217,7 +220,7 @@ void sigsegv_handler(int signal, siginfo_t *info, void *raw_context) fake_ctx.Eax = CREG_EAX(ctx); fake_ctx.Eip = CREG_EIP(ctx); #endif - const u8 *new_rip = jit.BackPatch(fault_instruction_ptr, access_type, em_address, &fake_ctx); + const u8 *new_rip = jit->BackPatch(fault_instruction_ptr, access_type, em_address, &fake_ctx); if (new_rip) { #ifdef _M_X64 CREG_RAX(ctx) = fake_ctx.Rax; diff --git a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_LoadStore.cpp b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_LoadStore.cpp index 6b4d2b558a..fd98730291 100644 --- a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_LoadStore.cpp +++ b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_LoadStore.cpp @@ -23,7 +23,7 @@ #include "Interpreter.h" #include "../../Core.h" -#include "../Jit64/Jit.h" +#include "../JitCommon/JitBase.h" #include "../JitCommon/JitCache.h" #include "Interpreter_FPUtils.h" @@ -374,7 +374,7 @@ void icbi(UGeckoInstruction _inst) { u32 address = Helper_Get_EA_X(_inst); PowerPC::ppcState.iCache.Invalidate(address); - jit.GetBlockCache()->InvalidateICache(address); + jit->GetBlockCache()->InvalidateICache(address); } void lbzux(UGeckoInstruction _inst) diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit.cpp index 374e23bef8..298cba8287 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/Jit.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit.cpp @@ -17,6 +17,11 @@ #include +// for the PROFILER stuff +#ifdef _WIN32 +#include +#endif + #include "Common.h" #include "x64Emitter.h" #include "ABI.h" @@ -35,17 +40,11 @@ #include "Jit.h" #include "JitAsm.h" #include "JitRegCache.h" -#include "../JitCommon/Jit_Tables.h" - -#if defined JITTEST && JITTEST -#error Jit64 cannot have JITTEST define -#endif +#include "Jit64_Tables.h" using namespace Gen; using namespace PowerPC; -extern int blocksExecuted; - // Dolphin's PowerPC->x86 JIT dynamic recompiler // (Nearly) all code by ector (hrydgard) // Features: @@ -110,7 +109,7 @@ extern int blocksExecuted; /* * Assume SP is in main RAM (in Wii mode too?) - partly done * Assume all floating point loads and double precision loads+stores are to/from main ram - (single precision can be used in write gather pipe, specialized fast check added) + (single precision stores can be used in write gather pipe, specialized fast check added) * AMD only - use movaps instead of movapd when loading ps from memory? * HLE functions like floorf, sin, memcpy, etc - they can be much faster * ABI optimizations - drop F0-F13 on blr, for example. Watch out for context switching. @@ -161,42 +160,15 @@ ps_adds1 */ -//#define NAN_CHECK - -static void CheckForNans() -{ - static bool lastNan[32]; - for (int i = 0; i < 32; i++) { - double v = rPS0(i); - if (v != v) { - if (!lastNan[i]) { - lastNan[i] = true; - PanicAlert("PC = %08x Got NAN in R%i", PC, i); - } - } else { - lastNan[i] = false; - } - } -} - -Jit64 jit; - -int CODE_SIZE = 1024*1024*16; +static int CODE_SIZE = 1024*1024*16; namespace CPUCompare { extern u32 m_BlockStart; } -void Jit(u32 em_address) -{ - jit.Jit(em_address); -} - void Jit64::Init() { - asm_routines.compareEnabled = ::Core::g_CoreStartupParameter.bRunCompareClient; - jo.optimizeStack = true; /* This will enable block linking in JitBlockCache::FinalizeBlock(), it gives faster execution but may not be as stable as the alternative (to not link the blocks). However, I have not heard about any good examples @@ -274,7 +246,6 @@ void Jit64::WriteCallInterpreter(UGeckoInstruction inst) void Jit64::unknown_instruction(UGeckoInstruction inst) { - // CCPU::Break(); PanicAlert("unknown_instruction %08x - Fix me ;)", inst.hex); } @@ -310,7 +281,7 @@ static const bool ImHereDebug = false; static const bool ImHereLog = false; static std::map been_here; -void ImHere() +static void ImHere() { static FILE *f = 0; if (ImHereLog) { @@ -338,13 +309,6 @@ void Jit64::Cleanup() { if (jo.optimizeGatherPipe && js.fifoBytesThisBlock > 0) ABI_CallFunction((void *)&GPFifo::CheckGatherPipe); - -#ifdef NAN_CHECK -#ifdef _WIN32 - if (GetAsyncKeyState(VK_LSHIFT)) - ABI_CallFunction(thunks.ProtectFunction((void *)&CheckForNans, 0)); -#endif -#endif } void Jit64::WriteExit(u32 destination, int exit_num) @@ -490,9 +454,9 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc if (Profiler::g_ProfileBlocks) { ADD(32, M(&b->runCount), Imm8(1)); #ifdef _WIN32 - b->ticCounter.QuadPart = 0; - b->ticStart.QuadPart = 0; - b->ticStop.QuadPart = 0; + b->ticCounter = 0; + b->ticStart = 0; + b->ticStop = 0; #else //TODO #endif @@ -555,7 +519,7 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc } if (!ops[i].skip) - JitTables::CompileInstruction(ops[i].inst); + Jit64Tables::CompileInstruction(ops[i].inst); gpr.SanityCheck(); fpr.SanityCheck(); diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit.h b/Source/Core/Core/Src/PowerPC/Jit64/Jit.h index f79c3510bd..7353fe9477 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/Jit.h +++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit.h @@ -31,14 +31,8 @@ // ---------- #define JIT_OFF_OPTIONS // Compile with JIT off options -// Include -// ---------- -#if JITTEST - #include "../Jit64IL/Jit.h" -#else - -#ifndef _JIT_H -#define _JIT_H +#ifndef _JIT64_H +#define _JIT64_H #include "../PPCAnalyst.h" #include "../JitCommon/JitCache.h" @@ -46,32 +40,9 @@ #include "JitRegCache.h" #include "x64Emitter.h" #include "x64Analyzer.h" - -#ifdef _WIN32 - #include -#endif - -// Declarations and definitions -// ---------- - -void Jit(u32 em_address); - -#ifndef _WIN32 - - // A bit of a hack to get things building under linux. We manually fill in this structure as needed - // from the real context. - struct CONTEXT - { - #ifdef _M_X64 - u64 Rip; - u64 Rax; - #else - u32 Eip; - u32 Eax; - #endif - }; - -#endif +#include "../JitCommon/JitBackpatch.h" +#include "../JitCommon/JitBase.h" +#include "JitAsm.h" // Use these to control the instruction selection // #define INSTRUCTION_START Default(inst); return; @@ -83,18 +54,7 @@ void Jit(u32 em_address); Core::g_CoreStartupParameter.bJIT##type##Off) \ {Default(inst); return;} -class TrampolineCache : public Gen::XCodeBlock -{ -public: - void Init(); - void Shutdown(); - - const u8 *GetReadTrampoline(const InstructionInfo &info); - const u8 *GetWriteTrampoline(const InstructionInfo &info); -}; - - -class Jit64 : public EmuCodeBlock +class Jit64 : public JitBase { private: struct JitState @@ -121,35 +81,19 @@ private: JitBlock *curBlock; }; - struct JitOptions - { - bool optimizeStack; - bool assumeFPLoadFromMem; - bool enableBlocklink; - bool fpAccurateFcmp; - bool enableFastMem; - bool optimizeGatherPipe; - bool fastInterrupts; - bool accurateSinglePrecision; - }; - - JitBlockCache blocks; - TrampolineCache trampolines; GPRRegCache gpr; FPURegCache fpr; // The default code buffer. We keep it around to not have to alloc/dealloc a // large chunk of memory for each recompiled block. PPCAnalyst::CodeBuffer code_buffer; + Jit64AsmRoutineManager asm_routines; public: Jit64() : code_buffer(32000) {} ~Jit64() {} JitState js; - JitOptions jo; - - // Initialization, etc void Init(); void Shutdown(); @@ -165,15 +109,25 @@ public: void ClearCache(); + const u8 *GetDispatcher() { + return asm_routines.dispatcher; // asm_routines.dispatcher + } + const CommonAsmRoutines *GetAsmRoutines() { + return &asm_routines; + } + + const char *GetName() { +#ifdef _M_X64 + return "JIT64"; +#else + return "JIT32"; +#endif + } // Run! void Run(); void SingleStep(); - const u8 *BackPatch(u8 *codePtr, int accessType, u32 em_address, CONTEXT *ctx); - -#define JIT_OPCODE 0 - // Utilities for use by opcodes void WriteExit(u32 destination, int exit_num); @@ -296,7 +250,6 @@ public: void icbi(UGeckoInstruction inst); }; -extern Jit64 jit; +void ProfiledReJit(); -#endif // _JIT_H -#endif // JITTEST +#endif // _JIT64_H diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Tables.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit64_Tables.cpp similarity index 90% rename from Source/Core/Core/Src/PowerPC/JitCommon/Jit_Tables.cpp rename to Source/Core/Core/Src/PowerPC/Jit64/Jit64_Tables.cpp index f87da3b1ef..7ce5b80690 100644 --- a/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Tables.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit64_Tables.cpp @@ -15,25 +15,24 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ -#include "Jit_Tables.h" +#include "Jit.h" +#include "Jit64_Tables.h" // Should be moved in to the Jit class typedef void (Jit64::*_Instruction) (UGeckoInstruction instCode); -_Instruction dynaOpTable[64]; -_Instruction dynaOpTable4[1024]; -_Instruction dynaOpTable19[1024]; -_Instruction dynaOpTable31[1024]; -_Instruction dynaOpTable59[32]; -_Instruction dynaOpTable63[1024]; +static _Instruction dynaOpTable[64]; +static _Instruction dynaOpTable4[1024]; +static _Instruction dynaOpTable19[1024]; +static _Instruction dynaOpTable31[1024]; +static _Instruction dynaOpTable59[32]; +static _Instruction dynaOpTable63[1024]; void Jit64::DynaRunTable4(UGeckoInstruction _inst) {(this->*dynaOpTable4 [_inst.SUBOP10])(_inst);} void Jit64::DynaRunTable19(UGeckoInstruction _inst) {(this->*dynaOpTable19[_inst.SUBOP10])(_inst);} void Jit64::DynaRunTable31(UGeckoInstruction _inst) {(this->*dynaOpTable31[_inst.SUBOP10])(_inst);} void Jit64::DynaRunTable59(UGeckoInstruction _inst) {(this->*dynaOpTable59[_inst.SUBOP5 ])(_inst);} void Jit64::DynaRunTable63(UGeckoInstruction _inst) {(this->*dynaOpTable63[_inst.SUBOP10])(_inst);} - - struct GekkoOPTemplate { int opcode; @@ -78,21 +77,12 @@ static GekkoOPTemplate primarytable[] = {28, &Jit64::reg_imm}, //"andi_rc", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_SET_CR0}}, {29, &Jit64::reg_imm}, //"andis_rc", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_SET_CR0}}, -#if JITTEST - {32, &Jit64::lXz}, //"lwz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, - {33, &Jit64::lXz}, //"lwzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, - {34, &Jit64::lXz}, //"lbz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, - {35, &Jit64::Default}, //"lbzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, - {40, &Jit64::lXz}, //"lhz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, - {41, &Jit64::lXz}, //"lhzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, -#else {32, &Jit64::lXz}, //"lwz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, {33, &Jit64::Default}, //"lwzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, {34, &Jit64::lXz}, //"lbz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, {35, &Jit64::Default}, //"lbzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, {40, &Jit64::lXz}, //"lhz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, {41, &Jit64::Default}, //"lhzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, -#endif {42, &Jit64::lha}, //"lha", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, {43, &Jit64::Default}, //"lhau", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, @@ -228,23 +218,7 @@ static GekkoOPTemplate table31[] = {470, &Jit64::Default}, //"dcbi", OPTYPE_DCACHE, 0, 4}}, {758, &Jit64::Default}, //"dcba", OPTYPE_DCACHE, 0, 4}}, {1014, &Jit64::dcbz}, //"dcbz", OPTYPE_DCACHE, 0, 4}}, -#if JITTEST - //load word - {23, &Jit64::lXzx}, //"lwzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, - {55, &Jit64::lXzx}, //"lwzux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, - //load halfword - {279, &Jit64::lXzx}, //"lhzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, - {311, &Jit64::lXzx}, //"lhzux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, - - //load halfword signextend - {343, &Jit64::lhax}, //"lhax", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, - {375, &Jit64::Default}, //"lhaux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, - - //load byte - {87, &Jit64::lXzx}, //"lbzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, - {119, &Jit64::lXzx}, //"lbzux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, -#else //load word {23, &Jit64::lwzx}, //"lwzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, {55, &Jit64::lwzux}, //"lwzux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, @@ -260,7 +234,7 @@ static GekkoOPTemplate table31[] = //load byte {87, &Jit64::lbzx}, //"lbzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, {119, &Jit64::Default}, //"lbzux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, -#endif + //load byte reverse {534, &Jit64::Default}, //"lwbrx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, {790, &Jit64::Default}, //"lhbrx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, @@ -336,11 +310,7 @@ static GekkoOPTemplate table31_2[] = {10, &Jit64::Default}, //"addcx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT}}, {138, &Jit64::addex}, //"addex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, {234, &Jit64::Default}, //"addmex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, -#if JITTEST - {202, &Jit64::addzex}, //"addzex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, -#else {202, &Jit64::Default}, //"addzex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, -#endif {491, &Jit64::Default}, //"divwx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 39}}, {459, &Jit64::divwux}, //"divwux", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 39}}, {75, &Jit64::Default}, //"mulhwx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 4}}, @@ -403,11 +373,13 @@ static GekkoOPTemplate table63_2[] = {31, &Jit64::fmaddXX}, //"fnmaddx", OPTYPE_FPU, FL_RC_BIT_F}}, }; -namespace JitTables +namespace Jit64Tables { + void CompileInstruction(UGeckoInstruction _inst) { - (jit.*dynaOpTable[_inst.OPCD])(_inst); + Jit64 *jit64 = (Jit64 *)jit; + (jit64->*dynaOpTable[_inst.OPCD])(_inst); GekkoOPInfo *info = GetOpInfo(_inst); if (info) { #ifdef OPLOG @@ -416,11 +388,12 @@ void CompileInstruction(UGeckoInstruction _inst) } #endif info->compileCount++; - info->lastUse = jit.js.compilerPC; + info->lastUse = jit->js.compilerPC; } else { - PanicAlert("Tried to compile illegal (or unknown) instruction %08x, at %08x", _inst.hex, jit.js.compilerPC); + PanicAlert("Tried to compile illegal (or unknown) instruction %08x, at %08x", _inst.hex, jit->js.compilerPC); } } + void InitTables() { //clear @@ -512,4 +485,5 @@ void InitTables() } } } -} + +} // namespace diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Tables.h b/Source/Core/Core/Src/PowerPC/Jit64/Jit64_Tables.h similarity index 83% rename from Source/Core/Core/Src/PowerPC/JitCommon/Jit_Tables.h rename to Source/Core/Core/Src/PowerPC/Jit64/Jit64_Tables.h index fb75dc6ba6..ffd6e26a03 100644 --- a/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Tables.h +++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit64_Tables.h @@ -15,18 +15,14 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ -#ifndef JIT_TABLES_H -#define JIT_TABLES_H +#ifndef JIT64_TABLES_H +#define JIT64_TABLES_H + #include "../Gekko.h" #include "../PPCTables.h" -#if defined JITTEST && JITTEST -#include "../Jit64IL/Jit.h" -#else #include "../Jit64/Jit.h" -#endif - -namespace JitTables +namespace Jit64Tables { void CompileInstruction(UGeckoInstruction _inst); void InitTables(); diff --git a/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.cpp b/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.cpp index 703c43509d..5e9b2879a6 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.cpp @@ -33,12 +33,9 @@ #include "JitAsm.h" using namespace Gen; -int blocksExecuted; static int temp32; -bool compareEnabled = false; - //TODO - make an option //#if _DEBUG static bool enableDebug = false; @@ -56,21 +53,21 @@ static bool enableStatistics = false; //RBX - Base pointer of memory //R15 - Pointer to array of block pointers -AsmRoutineManager asm_routines; +Jit64AsmRoutineManager asm_routines; // PLAN: no more block numbers - crazy opcodes just contain offset within // dynarec buffer // At this offset - 4, there is an int specifying the block number. -void AsmRoutineManager::Generate() +void Jit64AsmRoutineManager::Generate() { enterCode = AlignCode16(); ABI_PushAllCalleeSavedRegsAndAdjustStack(); #ifndef _M_IX86 // Two statically allocated registers. MOV(64, R(RBX), Imm64((u64)Memory::base)); - MOV(64, R(R15), Imm64((u64)jit.GetBlockCache()->GetCodePointers())); //It's below 2GB so 32 bits are good enough + MOV(64, R(R15), Imm64((u64)jit->GetBlockCache()->GetCodePointers())); //It's below 2GB so 32 bits are good enough #endif const u8 *outerLoop = GetCodePtr(); @@ -94,17 +91,13 @@ void AsmRoutineManager::Generate() FixupBranch notfound = J_CC(CC_NZ); BSWAP(32, EAX); //IDEA - we have 26 bits, why not just use offsets from base of code? - if (enableStatistics) - { - ADD(32, M(&blocksExecuted), Imm8(1)); - } if (enableDebug) { ADD(32, M(&PowerPC::ppcState.DebugCount), Imm8(1)); } //grab from list and jump to it #ifdef _M_IX86 - MOV(32, R(EDX), ImmPtr(jit.GetBlockCache()->GetCodePointers())); + MOV(32, R(EDX), ImmPtr(jit->GetBlockCache()->GetCodePointers())); JMPptr(MComplex(EDX, EAX, 4, 0)); #else JMPptr(MComplex(R15, RAX, 8, 0)); @@ -166,9 +159,9 @@ void AsmRoutineManager::Generate() AND(32, R(EAX), Imm32(JIT_ICACHE_MASK)); #ifdef _M_IX86 - MOV(32, R(EAX), MDisp(EAX, (u32)jit.GetBlockCache()->GetICache())); + MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->GetICache())); #else - MOV(64, R(RSI), Imm64((u64)jit.GetBlockCache()->GetICache())); + MOV(64, R(RSI), Imm64((u64)jit->GetBlockCache()->GetICache())); MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0)); #endif @@ -177,9 +170,9 @@ void AsmRoutineManager::Generate() AND(32, R(EAX), Imm32(JIT_ICACHEEX_MASK)); #ifdef _M_IX86 - MOV(32, R(EAX), MDisp(EAX, (u32)jit.GetBlockCache()->GetICacheEx())); + MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->GetICacheEx())); #else - MOV(64, R(RSI), Imm64((u64)jit.GetBlockCache()->GetICacheEx())); + MOV(64, R(RSI), Imm64((u64)jit->GetBlockCache()->GetICacheEx())); MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0)); #endif @@ -188,9 +181,9 @@ void AsmRoutineManager::Generate() AND(32, R(EAX), Imm32(JIT_ICACHE_MASK)); #ifdef _M_IX86 - MOV(32, R(EAX), MDisp(EAX, (u32)jit.GetBlockCache()->GetICacheVMEM())); + MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->GetICacheVMEM())); #else - MOV(64, R(RSI), Imm64((u64)jit.GetBlockCache()->GetICacheVMEM())); + MOV(64, R(RSI), Imm64((u64)jit->GetBlockCache()->GetICacheVMEM())); MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0)); #endif @@ -216,7 +209,7 @@ void AsmRoutineManager::Generate() GenerateCommon(); } -void AsmRoutineManager::GenerateCommon() +void Jit64AsmRoutineManager::GenerateCommon() { // USES_CR computeRc = AlignCode16(); diff --git a/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.h b/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.h index ebfc871227..e8df0877f7 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.h +++ b/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.h @@ -15,8 +15,8 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ -#ifndef _JITASM_H -#define _JITASM_H +#ifndef _JIT64ASM_H +#define _JIT64ASM_H #include "x64Emitter.h" #include "../JitCommon/JitAsmCommon.h" @@ -35,7 +35,7 @@ // To add a new asm routine, just add another const here, and add the code to Generate. // Also, possibly increase the size of the code buffer. -class AsmRoutineManager : public CommonAsmRoutines +class Jit64AsmRoutineManager : public CommonAsmRoutines { private: void Generate(); @@ -51,33 +51,8 @@ public: void Shutdown() { FreeCodeSpace(); } - - - // Public generated functions. Just CALL(M((void*)func)) them. - - const u8 *enterCode; - - const u8 *dispatcher; - const u8 *dispatcherNoCheck; - const u8 *dispatcherPcInEAX; - - const u8 *fpException; - const u8 *computeRc; - const u8 *testExceptions; - const u8 *dispatchPcInEAX; - const u8 *doTiming; - - const u8 *fifoDirectWrite8; - const u8 *fifoDirectWrite16; - const u8 *fifoDirectWrite32; - const u8 *fifoDirectWriteFloat; - const u8 *fifoDirectWriteXmm64; - - const u8 *breakpointBailout; - - bool compareEnabled; }; -extern AsmRoutineManager asm_routines; +extern Jit64AsmRoutineManager asm_routines; -#endif +#endif // _JIT64ASM_H diff --git a/Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.cpp b/Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.cpp index 0650d283b9..35383dc437 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.cpp @@ -25,6 +25,17 @@ using namespace Gen; using namespace PowerPC; +RegCache::RegCache() : emit(0) { + memset(locks, 0, sizeof(locks)); + memset(xlocks, 0, sizeof(xlocks)); + memset(saved_locks, 0, sizeof(saved_locks)); + memset(saved_xlocks, 0, sizeof(saved_xlocks)); + memset(regs, 0, sizeof(regs)); + memset(xregs, 0, sizeof(xregs)); + memset(saved_regs, 0, sizeof(saved_regs)); + memset(saved_xregs, 0, sizeof(saved_xregs)); +} + void RegCache::Start(PPCAnalyst::BlockRegStats &stats) { for (int i = 0; i < NUMXREGS; i++) diff --git a/Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.h b/Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.h index 43566e189e..0e7ce20bcd 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.h +++ b/Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.h @@ -15,8 +15,8 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ -#ifndef _JITREGCACHE_H -#define _JITREGCACHE_H +#ifndef _JIT64REGCACHE_H +#define _JIT64REGCACHE_H #include "x64Emitter.h" @@ -75,6 +75,8 @@ protected: XEmitter *emit; public: + RegCache(); + virtual ~RegCache() {} virtual void Start(PPCAnalyst::BlockRegStats &stats) = 0; @@ -147,4 +149,4 @@ public: OpArg GetDefaultLocation(int reg) const; }; -#endif +#endif // _JIT64REGCACHE_H diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp index e4c1a003e6..674fbe8a3e 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp @@ -527,15 +527,6 @@ void Jit64::divwux(UGeckoInstruction inst) { } } -u32 Helper_Mask(u8 mb, u8 me) -{ - return (((mb > me) ? - ~(((u32)-1 >> mb) ^ ((me >= 31) ? 0 : (u32) -1 >> (me + 1))) - : - (((u32)-1 >> mb) ^ ((me >= 31) ? 0 : (u32) -1 >> (me + 1)))) - ); -} - void Jit64::addx(UGeckoInstruction inst) { INSTRUCTION_START diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStorePaired.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStorePaired.cpp index 650f4d1b86..f86ec46f90 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStorePaired.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStorePaired.cpp @@ -19,7 +19,7 @@ // Should give a very noticable speed boost to paired single heavy code. #include "Common.h" - + #include "Thunk.h" #include "../PowerPC.h" #include "../../Core.h" diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/IR.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/IR.cpp index a75db9420c..90e5442cc1 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/IR.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/IR.cpp @@ -134,8 +134,8 @@ Fix profiled loads/stores to work safely. On 32-bit, one solution is to #include "../../CoreTiming.h" #include "Thunk.h" #include "../../HW/Memmap.h" -#include "JitAsm.h" -#include "Jit.h" +#include "JitILAsm.h" +#include "JitIL.h" #include "../../HW/GPFifo.h" #include "../../Core.h" using namespace Gen; diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp index d76f502213..541b1fcb8c 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp @@ -42,8 +42,8 @@ The register allocation is just a simple forward greedy allocator. #include "../../CoreTiming.h" #include "Thunk.h" #include "../../HW/Memmap.h" -#include "JitAsm.h" -#include "Jit.h" +#include "JitILAsm.h" +#include "JitIL.h" #include "../../HW/GPFifo.h" #include "../../Core.h" #include "x64Emitter.h" @@ -52,7 +52,7 @@ using namespace IREmitter; using namespace Gen; struct RegInfo { - Jit64* Jit; + JitIL *Jit; IRBuilder* Build; InstLoc FirstI; std::vector IInfo; @@ -65,7 +65,7 @@ struct RegInfo { unsigned numProfiledLoads; unsigned exitNumber; - RegInfo(Jit64* j, InstLoc f, unsigned insts) : Jit(j), FirstI(f), IInfo(insts) { + RegInfo(JitIL* j, InstLoc f, unsigned insts) : Jit(j), FirstI(f), IInfo(insts) { for (unsigned i = 0; i < 16; i++) { regs[i] = 0; fregs[i] = 0; @@ -296,7 +296,7 @@ static void fregNormalRegClear(RegInfo& RI, InstLoc I) { } static void regEmitBinInst(RegInfo& RI, InstLoc I, - void (Jit64::*op)(int, const OpArg&, + void (JitIL::*op)(int, const OpArg&, const OpArg&), bool commutable = false) { X64Reg reg; @@ -327,7 +327,7 @@ static void regEmitBinInst(RegInfo& RI, InstLoc I, } static void fregEmitBinInst(RegInfo& RI, InstLoc I, - void (Jit64::*op)(X64Reg, OpArg)) { + void (JitIL::*op)(X64Reg, OpArg)) { X64Reg reg; if (RI.IInfo[I - RI.FirstI] & 4) { reg = fregEnsureInReg(RI, getOp1(I)); @@ -577,7 +577,7 @@ static void regEmitMemStore(RegInfo& RI, InstLoc I, unsigned Size) { regClearInst(RI, getOp1(I)); } -static void regEmitShiftInst(RegInfo& RI, InstLoc I, void (Jit64::*op)(int, OpArg, OpArg)) +static void regEmitShiftInst(RegInfo& RI, InstLoc I, void (JitIL::*op)(int, OpArg, OpArg)) { X64Reg reg = regBinLHSReg(RI, I); if (isImm(*getOp2(I))) { @@ -634,7 +634,7 @@ static void regWriteExit(RegInfo& RI, InstLoc dest) { } RI.Jit->Cleanup(); RI.Jit->SUB(32, M(&CoreTiming::downcount), Imm32(RI.Jit->js.downcountAmount)); - RI.Jit->JMP(asm_routines.doReJit, true); + RI.Jit->JMP(((JitIL *)jit)->asm_routines.doReJit, true); return; } if (isImm(*dest)) { @@ -646,7 +646,7 @@ static void regWriteExit(RegInfo& RI, InstLoc dest) { } } -static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool MakeProfile) { +static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool MakeProfile) { //printf("Writing block: %x\n", js.blockStart); RegInfo RI(Jit, ibuild->getFirstInst(), ibuild->getNumInsts()); RI.Build = ibuild; @@ -994,27 +994,27 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak } case And: { if (!thisUsed) break; - regEmitBinInst(RI, I, &Jit64::AND, true); + regEmitBinInst(RI, I, &JitIL::AND, true); break; } case Xor: { if (!thisUsed) break; - regEmitBinInst(RI, I, &Jit64::XOR, true); + regEmitBinInst(RI, I, &JitIL::XOR, true); break; } case Sub: { if (!thisUsed) break; - regEmitBinInst(RI, I, &Jit64::SUB); + regEmitBinInst(RI, I, &JitIL::SUB); break; } case Or: { if (!thisUsed) break; - regEmitBinInst(RI, I, &Jit64::OR, true); + regEmitBinInst(RI, I, &JitIL::OR, true); break; } case Add: { if (!thisUsed) break; - regEmitBinInst(RI, I, &Jit64::ADD, true); + regEmitBinInst(RI, I, &JitIL::ADD, true); break; } case Mul: { @@ -1037,22 +1037,22 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak } case Rol: { if (!thisUsed) break; - regEmitShiftInst(RI, I, &Jit64::ROL); + regEmitShiftInst(RI, I, &JitIL::ROL); break; } case Shl: { if (!thisUsed) break; - regEmitShiftInst(RI, I, &Jit64::SHL); + regEmitShiftInst(RI, I, &JitIL::SHL); break; } case Shrl: { if (!thisUsed) break; - regEmitShiftInst(RI, I, &Jit64::SHR); + regEmitShiftInst(RI, I, &JitIL::SHR); break; } case Sarl: { if (!thisUsed) break; - regEmitShiftInst(RI, I, &Jit64::SAR); + regEmitShiftInst(RI, I, &JitIL::SAR); break; } case ICmpEq: { @@ -1183,7 +1183,7 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak Jit->SHL(32, R(EDX), Imm8(3)); #endif Jit->MOV(32, R(ECX), regLocForInst(RI, getOp1(I))); - Jit->CALLptr(MDisp(EDX, (u32)(u64)asm_routines.pairedLoadQuantized)); + Jit->CALLptr(MDisp(EDX, (u32)(u64)(((JitIL *)jit)->asm_routines.pairedLoadQuantized))); Jit->MOVAPD(reg, R(XMM0)); RI.fregs[reg] = I; regNormalRegClear(RI, I); @@ -1242,7 +1242,7 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak #endif Jit->MOV(32, R(ECX), regLocForInst(RI, getOp2(I))); Jit->MOVAPD(XMM0, fregLocForInst(RI, getOp1(I))); - Jit->CALLptr(MDisp(EDX, (u32)(u64)asm_routines.pairedStoreQuantized)); + Jit->CALLptr(MDisp(EDX, (u32)(u64)(((JitIL *)jit)->asm_routines.pairedStoreQuantized))); if (RI.IInfo[I - RI.FirstI] & 4) fregClearInst(RI, getOp1(I)); if (RI.IInfo[I - RI.FirstI] & 8) @@ -1376,17 +1376,17 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak } case FSMul: { if (!thisUsed) break; - fregEmitBinInst(RI, I, &Jit64::MULSS); + fregEmitBinInst(RI, I, &JitIL::MULSS); break; } case FSAdd: { if (!thisUsed) break; - fregEmitBinInst(RI, I, &Jit64::ADDSS); + fregEmitBinInst(RI, I, &JitIL::ADDSS); break; } case FSSub: { if (!thisUsed) break; - fregEmitBinInst(RI, I, &Jit64::SUBSS); + fregEmitBinInst(RI, I, &JitIL::SUBSS); break; } case FSRSqrt: { @@ -1399,17 +1399,17 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak } case FDMul: { if (!thisUsed) break; - fregEmitBinInst(RI, I, &Jit64::MULSD); + fregEmitBinInst(RI, I, &JitIL::MULSD); break; } case FDAdd: { if (!thisUsed) break; - fregEmitBinInst(RI, I, &Jit64::ADDSD); + fregEmitBinInst(RI, I, &JitIL::ADDSD); break; } case FDSub: { if (!thisUsed) break; - fregEmitBinInst(RI, I, &Jit64::SUBSD); + fregEmitBinInst(RI, I, &JitIL::SUBSD); break; } case FDCmpCR: { @@ -1443,17 +1443,17 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak } case FPAdd: { if (!thisUsed) break; - fregEmitBinInst(RI, I, &Jit64::ADDPS); + fregEmitBinInst(RI, I, &JitIL::ADDPS); break; } case FPMul: { if (!thisUsed) break; - fregEmitBinInst(RI, I, &Jit64::MULPS); + fregEmitBinInst(RI, I, &JitIL::MULPS); break; } case FPSub: { if (!thisUsed) break; - fregEmitBinInst(RI, I, &Jit64::SUBPS); + fregEmitBinInst(RI, I, &JitIL::SUBPS); break; } case FPMerge00: { @@ -1518,7 +1518,7 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak Jit->ABI_CallFunction((void *)&PowerPC::OnIdleIL); Jit->MOV(32, M(&PC), Imm32(ibuild->GetImmValue( getOp2(I) ))); - Jit->JMP(asm_routines.testExceptions, true); + Jit->JMP(((JitIL *)jit)->asm_routines.testExceptions, true); Jit->SetJumpTarget(cont); if (RI.IInfo[I - RI.FirstI] & 4) @@ -1572,7 +1572,7 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak unsigned InstLoc = ibuild->GetImmValue(getOp1(I)); Jit->ABI_CallFunction((void *)&CoreTiming::Idle); Jit->MOV(32, M(&PC), Imm32(InstLoc)); - Jit->JMP(asm_routines.testExceptions, true); + Jit->JMP(((JitIL *)jit)->asm_routines.testExceptions, true); break; } case SystemCall: { @@ -1580,7 +1580,7 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak Jit->Cleanup(); Jit->OR(32, M(&PowerPC::ppcState.Exceptions), Imm32(EXCEPTION_SYSCALL)); Jit->MOV(32, M(&PC), Imm32(InstLoc + 4)); - Jit->JMP(asm_routines.testExceptions, true); + Jit->JMP(((JitIL *)jit)->asm_routines.testExceptions, true); break; } case InterpreterBranch: { @@ -1635,13 +1635,13 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak Jit->UD2(); } -void Jit64::WriteCode() { +void JitIL::WriteCode() { DoWriteCode(&ibuild, this, false, Core::GetStartupParameter().bJITProfiledReJIT); } void ProfiledReJit() { - jit.SetCodePtr(jit.js.rewriteStart); - DoWriteCode(&jit.ibuild, &jit, true, false); - jit.js.curBlock->codeSize = (int)(jit.GetCodePtr() - jit.js.rewriteStart); - jit.GetBlockCache()->FinalizeBlock(jit.js.curBlock->blockNum, jit.jo.enableBlocklink, jit.js.curBlock->normalEntry); + jit->SetCodePtr(jit->js.rewriteStart); + DoWriteCode(&((JitIL *)jit)->ibuild, (JitIL *)jit, true, false); + jit->js.curBlock->codeSize = (int)(jit->GetCodePtr() - jit->js.rewriteStart); + jit->GetBlockCache()->FinalizeBlock(jit->js.curBlock->blockNum, jit->jo.enableBlocklink, jit->js.curBlock->normalEntry); } \ No newline at end of file diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp similarity index 91% rename from Source/Core/Core/Src/PowerPC/Jit64IL/Jit.cpp rename to Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp index c8ea9ad9a3..b35df9b2d4 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp @@ -31,16 +31,14 @@ #include "../PPCAnalyst.h" #include "../../HW/Memmap.h" #include "../../HW/GPFifo.h" -#include "Jit.h" -#include "JitAsm.h" #include "../JitCommon/JitCache.h" -#include "../JitCommon/Jit_Tables.h" +#include "JitIL.h" +#include "JitILAsm.h" +#include "JitIL_Tables.h" using namespace Gen; using namespace PowerPC; -extern int blocksExecuted; - // Dolphin's PowerPC->x86 JIT dynamic recompiler // (Nearly) all code by ector (hrydgard) // Features: @@ -156,34 +154,22 @@ ps_adds1 */ -Jit64 jit; - -int CODE_SIZE = 1024*1024*16; +static int CODE_SIZE = 1024*1024*16; namespace CPUCompare { extern u32 m_BlockStart; } -void Jit(u32 em_address) +void JitIL::Init() { - jit.Jit(em_address); -} - -void Jit64::Init() -{ - asm_routines.compareEnabled = ::Core::g_CoreStartupParameter.bRunCompareClient; if (Core::g_CoreStartupParameter.bJITUnlimitedCache) CODE_SIZE = 1024*1024*8*8; jo.optimizeStack = true; jo.enableBlocklink = true; // Speed boost, but not 100% safe #ifdef _M_X64 -#ifdef JITTEST jo.enableFastMem = false; -#else - jo.enableFastMem = Core::GetStartupParameter().bUseFastMem; -#endif #else jo.enableFastMem = false; #endif @@ -200,14 +186,14 @@ void Jit64::Init() asm_routines.Init(); } -void Jit64::ClearCache() +void JitIL::ClearCache() { blocks.Clear(); trampolines.ClearCodeSpace(); ClearCodeSpace(); } -void Jit64::Shutdown() +void JitIL::Shutdown() { FreeCodeSpace(); @@ -217,7 +203,7 @@ void Jit64::Shutdown() } -void Jit64::WriteCallInterpreter(UGeckoInstruction inst) +void JitIL::WriteCallInterpreter(UGeckoInstruction inst) { if (js.isLastInstruction) { @@ -233,32 +219,32 @@ void Jit64::WriteCallInterpreter(UGeckoInstruction inst) } } -void Jit64::unknown_instruction(UGeckoInstruction inst) +void JitIL::unknown_instruction(UGeckoInstruction inst) { // CCPU::Break(); PanicAlert("unknown_instruction %08x - Fix me ;)", inst.hex); } -void Jit64::Default(UGeckoInstruction _inst) +void JitIL::Default(UGeckoInstruction _inst) { ibuild.EmitInterpreterFallback( ibuild.EmitIntConst(_inst.hex), ibuild.EmitIntConst(js.compilerPC)); } -void Jit64::HLEFunction(UGeckoInstruction _inst) +void JitIL::HLEFunction(UGeckoInstruction _inst) { ABI_CallFunctionCC((void*)&HLE::Execute, js.compilerPC, _inst.hex); MOV(32, R(EAX), M(&NPC)); WriteExitDestInEAX(0); } -void Jit64::DoNothing(UGeckoInstruction _inst) +void JitIL::DoNothing(UGeckoInstruction _inst) { // Yup, just don't do anything. } -void Jit64::NotifyBreakpoint(u32 em_address, bool set) +void JitIL::NotifyBreakpoint(u32 em_address, bool set) { int block_num = blocks.GetBlockNumberFromStartAddress(em_address); if (block_num >= 0) @@ -271,7 +257,7 @@ static const bool ImHereDebug = false; static const bool ImHereLog = false; static std::map been_here; -void ImHere() +static void ImHere() { static FILE *f = 0; if (ImHereLog) @@ -296,13 +282,13 @@ void ImHere() been_here[PC] = 1; } -void Jit64::Cleanup() +void JitIL::Cleanup() { if (jo.optimizeGatherPipe && js.fifoBytesThisBlock > 0) ABI_CallFunction((void *)&GPFifo::CheckGatherPipe); } -void Jit64::WriteExit(u32 destination, int exit_num) +void JitIL::WriteExit(u32 destination, int exit_num) { Cleanup(); SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); @@ -327,7 +313,7 @@ void Jit64::WriteExit(u32 destination, int exit_num) } } -void Jit64::WriteExitDestInEAX(int exit_num) +void JitIL::WriteExitDestInEAX(int exit_num) { MOV(32, M(&PC), R(EAX)); Cleanup(); @@ -335,7 +321,7 @@ void Jit64::WriteExitDestInEAX(int exit_num) JMP(asm_routines.dispatcher, true); } -void Jit64::WriteRfiExitDestInEAX() +void JitIL::WriteRfiExitDestInEAX() { MOV(32, M(&PC), R(EAX)); Cleanup(); @@ -343,7 +329,7 @@ void Jit64::WriteRfiExitDestInEAX() JMP(asm_routines.testExceptions, true); } -void Jit64::WriteExceptionExit(u32 exception) +void JitIL::WriteExceptionExit(u32 exception) { Cleanup(); OR(32, M(&PowerPC::ppcState.Exceptions), Imm32(exception)); @@ -351,14 +337,14 @@ void Jit64::WriteExceptionExit(u32 exception) JMP(asm_routines.testExceptions, true); } -void STACKALIGN Jit64::Run() +void STACKALIGN JitIL::Run() { CompiledCode pExecAddr = (CompiledCode)asm_routines.enterCode; pExecAddr(); //Will return when PowerPC::state changes } -void Jit64::SingleStep() +void JitIL::SingleStep() { // NOT USED, NOT TESTED, PROBABLY NOT WORKING YET // PanicAlert("Single"); @@ -370,7 +356,7 @@ void Jit64::SingleStep() pExecAddr();*/ } -void STACKALIGN Jit64::Jit(u32 em_address) +void STACKALIGN JitIL::Jit(u32 em_address) { if (GetSpaceLeft() < 0x10000 || blocks.IsFull()) { @@ -387,7 +373,7 @@ void STACKALIGN Jit64::Jit(u32 em_address) blocks.FinalizeBlock(block_num, jo.enableBlocklink, DoJit(em_address, &code_buffer, b)); } -const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buffer, JitBlock *b) +const u8* JitIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buffer, JitBlock *b) { if (em_address == 0) PanicAlert("ERROR : Trying to compile at 0. LR=%08x", LR); @@ -456,7 +442,9 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buffer, JitB } if (!ops[i].skip) - JitTables::CompileInstruction(ops[i].inst); + { + JitILTables::CompileInstruction(ops[i].inst); + } } // Perform actual code generation diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit.h b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.h similarity index 77% rename from Source/Core/Core/Src/PowerPC/Jit64IL/Jit.h rename to Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.h index de85869993..d2b9dd853b 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit.h +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.h @@ -27,36 +27,19 @@ // * A flush simply does a conditional write to the appropriate CRx. // * If flag available, branch code can become absolutely trivial. -#ifndef _JIT_H -#define _JIT_H +#ifndef _JITIL_H +#define _JITIL_H #include "../PPCAnalyst.h" +#include "../JitCommon/JitBase.h" #include "../JitCommon/JitCache.h" +#include "../JitCommon/JitBackpatch.h" #include "../JitCommon/Jit_Util.h" #include "x64Emitter.h" #include "x64Analyzer.h" #include "IR.h" - -#ifdef _WIN32 - -#include - -#else - -// A bit of a hack to get things building under linux. We manually fill in this structure as needed -// from the real context. -struct CONTEXT -{ -#ifdef _M_X64 - u64 Rip; - u64 Rax; -#else - u32 Eip; - u32 Eax; -#endif -}; - -#endif +#include "../JitCommon/JitBase.h" +#include "JitILAsm.h" // #define INSTRUCTION_START Default(inst); return; // #define INSTRUCTION_START PPCTables::CountInstruction(inst); @@ -74,70 +57,21 @@ struct CONTEXT #define DISABLE64 #endif - -class TrampolineCache : public Gen::XCodeBlock -{ -public: - void Init(); - void Shutdown(); - - const u8 *GetReadTrampoline(const InstructionInfo &info); - const u8 *GetWriteTrampoline(const InstructionInfo &info); -}; - - -class Jit64 : public EmuCodeBlock +class JitIL : public JitBase { private: - struct JitState - { - u32 compilerPC; - u32 next_compilerPC; - u32 blockStart; - bool cancel; - UGeckoInstruction next_inst; // for easy peephole opt. - int instructionNumber; - int downcountAmount; - bool isLastInstruction; - bool forceUnsafeLoad; - - int fifoBytesThisBlock; - - PPCAnalyst::BlockStats st; - PPCAnalyst::BlockRegStats gpa; - PPCAnalyst::BlockRegStats fpa; - PPCAnalyst::CodeOp *op; - u8* rewriteStart; - - JitBlock *curBlock; - }; - - struct JitOptions - { - bool optimizeStack; - bool assumeFPLoadFromMem; - bool enableBlocklink; - bool fpAccurateFcmp; - bool enableFastMem; - bool optimizeGatherPipe; - bool fastInterrupts; - bool accurateSinglePrecision; - }; - - JitBlockCache blocks; - TrampolineCache trampolines; // The default code buffer. We keep it around to not have to alloc/dealloc a // large chunk of memory for each recompiled block. PPCAnalyst::CodeBuffer code_buffer; public: - Jit64() : code_buffer(32000) {} - ~Jit64() {} + JitILAsmRoutineManager asm_routines; + + JitIL() : code_buffer(32000) {} + ~JitIL() {} - JitState js; - JitOptions jo; IREmitter::IRBuilder ibuild; // Initialization, etc @@ -150,21 +84,29 @@ public: void Jit(u32 em_address); const u8* DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buffer, JitBlock *b); - JitBlockCache *GetBlockCache() { return &blocks; } - void NotifyBreakpoint(u32 em_address, bool set); void ClearCache(); + const u8 *GetDispatcher() { + return asm_routines.dispatcher; // asm_routines.dispatcher + } + const CommonAsmRoutines *GetAsmRoutines() { + return &asm_routines; + } + + const char *GetName() { +#ifdef _M_X64 + return "JIT64IL"; +#else + return "JIT32IL"; +#endif + } // Run! void Run(); void SingleStep(); - const u8 *BackPatch(u8 *codePtr, int accessType, u32 em_address, CONTEXT *ctx); - -#define JIT_OPCODE 0 - // Utilities for use by opcodes void WriteExit(u32 destination, int exit_num); @@ -178,10 +120,10 @@ public: void WriteFloatToConstRamAddress(const Gen::X64Reg& xmm_reg, u32 address); void GenerateCarry(Gen::X64Reg temp_reg); - void tri_op(int d, int a, int b, bool reversible, void (XEmitter::*op)(Gen::X64Reg, Gen::OpArg)); + void tri_op(int d, int a, int b, bool reversible, void (Gen::XEmitter::*op)(Gen::X64Reg, Gen::OpArg)); typedef u32 (*Operation)(u32 a, u32 b); - void regimmop(int d, int a, bool binary, u32 value, Operation doop, void (XEmitter::*op)(int, const Gen::OpArg&, const Gen::OpArg&), bool Rc = false, bool carry = false); - void fp_tri_op(int d, int a, int b, bool reversible, bool dupe, void (XEmitter::*op)(Gen::X64Reg, Gen::OpArg)); + void regimmop(int d, int a, bool binary, u32 value, Operation doop, void (Gen::XEmitter::*op)(int, const Gen::OpArg&, const Gen::OpArg&), bool Rc = false, bool carry = false); + void fp_tri_op(int d, int a, int b, bool reversible, bool dupe, void (Gen::XEmitter::*op)(Gen::X64Reg, Gen::OpArg)); void WriteCode(); @@ -288,10 +230,8 @@ public: void icbi(UGeckoInstruction inst); }; -extern Jit64 jit; - void Jit(u32 em_address); void ProfiledReJit(); -#endif +#endif // _JITIL_H diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitAsm.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/JitILAsm.cpp similarity index 88% rename from Source/Core/Core/Src/PowerPC/Jit64IL/JitAsm.cpp rename to Source/Core/Core/Src/PowerPC/Jit64IL/JitILAsm.cpp index d4ee182024..7c6578910e 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitAsm.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitILAsm.cpp @@ -26,20 +26,17 @@ #include "CPUDetect.h" #include "ABI.h" -#include "Jit.h" #include "Thunk.h" #include "../../HW/GPFifo.h" #include "../../Core.h" -#include "JitAsm.h" +#include "JitIL.h" +#include "JitILAsm.h" using namespace Gen; -int blocksExecuted; static int temp32; -bool compareEnabled = false; - //TODO - make an option //#if _DEBUG static bool enableDebug = false; @@ -57,20 +54,20 @@ static bool enableStatistics = false; //RBX - Base pointer of memory //R15 - Pointer to array of block pointers -AsmRoutineManager asm_routines; +JitILAsmRoutineManager jitil_asm_routines; // PLAN: no more block numbers - crazy opcodes just contain offset within // dynarec buffer // At this offset - 4, there is an int specifying the block number. -void AsmRoutineManager::Generate() +void JitILAsmRoutineManager::Generate() { enterCode = AlignCode16(); ABI_PushAllCalleeSavedRegsAndAdjustStack(); #ifndef _M_IX86 // Two statically allocated registers. MOV(64, R(RBX), Imm64((u64)Memory::base)); - MOV(64, R(R15), Imm64((u64)jit.GetBlockCache()->GetCodePointers())); //It's below 2GB so 32 bits are good enough + MOV(64, R(R15), Imm64((u64)jit->GetBlockCache()->GetCodePointers())); //It's below 2GB so 32 bits are good enough #endif // INT3(); @@ -96,17 +93,13 @@ void AsmRoutineManager::Generate() FixupBranch notfound = J_CC(CC_NZ); BSWAP(32, EAX); //IDEA - we have 26 bits, why not just use offsets from base of code? - if (enableStatistics) - { - ADD(32, M(&blocksExecuted), Imm8(1)); - } if (enableDebug) { ADD(32, M(&PowerPC::ppcState.DebugCount), Imm8(1)); } //grab from list and jump to it #ifdef _M_IX86 - MOV(32, R(EDX), ImmPtr(jit.GetBlockCache()->GetCodePointers())); + MOV(32, R(EDX), ImmPtr(jit->GetBlockCache()->GetCodePointers())); JMPptr(MComplex(EDX, EAX, 4, 0)); #else JMPptr(MComplex(R15, RAX, 8, 0)); @@ -171,9 +164,9 @@ void AsmRoutineManager::Generate() AND(32, R(EAX), Imm32(JIT_ICACHE_MASK)); #ifdef _M_IX86 - MOV(32, R(EAX), MDisp(EAX, (u32)jit.GetBlockCache()->GetICache())); + MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->GetICache())); #else - MOV(64, R(RSI), Imm64((u64)jit.GetBlockCache()->GetICache())); + MOV(64, R(RSI), Imm64((u64)jit->GetBlockCache()->GetICache())); MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0)); #endif @@ -182,9 +175,9 @@ void AsmRoutineManager::Generate() AND(32, R(EAX), Imm32(JIT_ICACHEEX_MASK)); #ifdef _M_IX86 - MOV(32, R(EAX), MDisp(EAX, (u32)jit.GetBlockCache()->GetICacheEx())); + MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->GetICacheEx())); #else - MOV(64, R(RSI), Imm64((u64)jit.GetBlockCache()->GetICacheEx())); + MOV(64, R(RSI), Imm64((u64)jit->GetBlockCache()->GetICacheEx())); MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0)); #endif @@ -193,9 +186,9 @@ void AsmRoutineManager::Generate() AND(32, R(EAX), Imm32(JIT_ICACHE_MASK)); #ifdef _M_IX86 - MOV(32, R(EAX), MDisp(EAX, (u32)jit.GetBlockCache()->GetICacheVMEM())); + MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->GetICacheVMEM())); #else - MOV(64, R(RSI), Imm64((u64)jit.GetBlockCache()->GetICacheVMEM())); + MOV(64, R(RSI), Imm64((u64)jit->GetBlockCache()->GetICacheVMEM())); MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0)); #endif @@ -215,7 +208,7 @@ void AsmRoutineManager::Generate() GenerateCommon(); } -void AsmRoutineManager::GenerateCommon() +void JitILAsmRoutineManager::GenerateCommon() { // USES_CR computeRc = AlignCode16(); diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitAsm.h b/Source/Core/Core/Src/PowerPC/Jit64IL/JitILAsm.h similarity index 74% rename from Source/Core/Core/Src/PowerPC/Jit64IL/JitAsm.h rename to Source/Core/Core/Src/PowerPC/Jit64IL/JitILAsm.h index 051c486290..718894e04a 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitAsm.h +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitILAsm.h @@ -35,7 +35,7 @@ // To add a new asm routine, just add another const here, and add the code to Generate. // Also, possibly increase the size of the code buffer. -class AsmRoutineManager : public CommonAsmRoutines +class JitILAsmRoutineManager : public CommonAsmRoutines { private: void Generate(); @@ -52,35 +52,9 @@ public: FreeCodeSpace(); } - - // Public generated functions. Just CALL(M((void*)func)) them. - - const u8 *enterCode; - - const u8 *dispatcher; - const u8 *dispatcherNoCheck; - const u8 *dispatcherPcInEAX; - - const u8 *fpException; - const u8 *computeRc; - const u8 *testExceptions; - const u8 *dispatchPcInEAX; - const u8 *doTiming; - - const u8 *fifoDirectWrite8; - const u8 *fifoDirectWrite16; - const u8 *fifoDirectWrite32; - const u8 *fifoDirectWriteFloat; - const u8 *fifoDirectWriteXmm64; - - const u8 *breakpointBailout; - const u8 *doReJit; - - - bool compareEnabled; }; -extern AsmRoutineManager asm_routines; +extern JitILAsmRoutineManager jitil_asm_routines; #endif diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit_Branch.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Branch.cpp similarity index 94% rename from Source/Core/Core/Src/PowerPC/Jit64IL/Jit_Branch.cpp rename to Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Branch.cpp index 252d224837..7ae9309ef7 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit_Branch.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Branch.cpp @@ -23,8 +23,8 @@ #include "../PPCTables.h" #include "x64Emitter.h" -#include "Jit.h" -#include "JitAsm.h" +#include "JitIL.h" +#include "JitILAsm.h" #include "../../HW/Memmap.h" @@ -44,17 +44,17 @@ using namespace Gen; -void Jit64::sc(UGeckoInstruction inst) +void JitIL::sc(UGeckoInstruction inst) { ibuild.EmitSystemCall(ibuild.EmitIntConst(js.compilerPC)); } -void Jit64::rfi(UGeckoInstruction inst) +void JitIL::rfi(UGeckoInstruction inst) { ibuild.EmitRFIExit(); } -void Jit64::bx(UGeckoInstruction inst) +void JitIL::bx(UGeckoInstruction inst) { NORMALBRANCH_START INSTRUCTION_START; @@ -113,7 +113,7 @@ static IREmitter::InstLoc TestBranch(IREmitter::IRBuilder& ibuild, UGeckoInstruc return Test; } -void Jit64::bcx(UGeckoInstruction inst) +void JitIL::bcx(UGeckoInstruction inst) { NORMALBRANCH_START if (inst.LK) @@ -144,7 +144,7 @@ void Jit64::bcx(UGeckoInstruction inst) ibuild.EmitBranchUncond(ibuild.EmitIntConst(js.compilerPC + 4)); } -void Jit64::bcctrx(UGeckoInstruction inst) +void JitIL::bcctrx(UGeckoInstruction inst) { NORMALBRANCH_START if ((inst.BO & 4) == 0) { @@ -173,7 +173,7 @@ void Jit64::bcctrx(UGeckoInstruction inst) ibuild.EmitBranchUncond(destination); } -void Jit64::bclrx(UGeckoInstruction inst) +void JitIL::bclrx(UGeckoInstruction inst) { NORMALBRANCH_START if (inst.hex == 0x4e800020) { diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit_FloatingPoint.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_FloatingPoint.cpp similarity index 93% rename from Source/Core/Core/Src/PowerPC/Jit64IL/Jit_FloatingPoint.cpp rename to Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_FloatingPoint.cpp index 6061cfab95..1c6ecb5ffd 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit_FloatingPoint.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_FloatingPoint.cpp @@ -22,12 +22,12 @@ #include "../PPCTables.h" #include "x64Emitter.h" -#include "Jit.h" +#include "JitIL.h" //#define INSTRUCTION_START Default(inst); return; #define INSTRUCTION_START -void Jit64::fp_arith_s(UGeckoInstruction inst) +void JitIL::fp_arith_s(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(FloatingPoint) @@ -70,7 +70,7 @@ void Jit64::fp_arith_s(UGeckoInstruction inst) ibuild.EmitStoreFReg(val, inst.FD); } -void Jit64::fmaddXX(UGeckoInstruction inst) +void JitIL::fmaddXX(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(FloatingPoint) @@ -98,7 +98,7 @@ void Jit64::fmaddXX(UGeckoInstruction inst) ibuild.EmitStoreFReg(val, inst.FD); } -void Jit64::fmrx(UGeckoInstruction inst) +void JitIL::fmrx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(FloatingPoint) @@ -110,7 +110,7 @@ void Jit64::fmrx(UGeckoInstruction inst) ibuild.EmitStoreFReg(val, inst.FD); } -void Jit64::fcmpx(UGeckoInstruction inst) +void JitIL::fcmpx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(FloatingPoint) @@ -122,7 +122,7 @@ void Jit64::fcmpx(UGeckoInstruction inst) ibuild.EmitStoreCR(res, inst.CRFD); } -void Jit64::fsign(UGeckoInstruction inst) +void JitIL::fsign(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(FloatingPoint) diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit_Integer.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Integer.cpp similarity index 90% rename from Source/Core/Core/Src/PowerPC/Jit64IL/Jit_Integer.cpp rename to Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Integer.cpp index ae7ecec9ce..10b05703ec 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit_Integer.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Integer.cpp @@ -24,8 +24,8 @@ #include "../PPCTables.h" #include "x64Emitter.h" -#include "Jit.h" -#include "JitAsm.h" +#include "JitIL.h" +#include "JitILAsm.h" //#define INSTRUCTION_START Default(inst); return; #define INSTRUCTION_START @@ -37,7 +37,7 @@ static void ComputeRC(IREmitter::IRBuilder& ibuild, ibuild.EmitStoreCR(res, 0); } -void Jit64::reg_imm(UGeckoInstruction inst) +void JitIL::reg_imm(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -105,7 +105,7 @@ void Jit64::reg_imm(UGeckoInstruction inst) } } -void Jit64::cmpXX(UGeckoInstruction inst) +void JitIL::cmpXX(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -129,7 +129,7 @@ void Jit64::cmpXX(UGeckoInstruction inst) ibuild.EmitStoreCR(res, inst.CRFD); } -void Jit64::orx(UGeckoInstruction inst) +void JitIL::orx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -142,7 +142,7 @@ void Jit64::orx(UGeckoInstruction inst) // m_GPR[_inst.RA] = m_GPR[_inst.RS] ^ m_GPR[_inst.RB]; -void Jit64::xorx(UGeckoInstruction inst) +void JitIL::xorx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -153,7 +153,7 @@ void Jit64::xorx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void Jit64::andx(UGeckoInstruction inst) +void JitIL::andx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -164,7 +164,7 @@ void Jit64::andx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void Jit64::extsbx(UGeckoInstruction inst) +void JitIL::extsbx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -175,7 +175,7 @@ void Jit64::extsbx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void Jit64::extshx(UGeckoInstruction inst) +void JitIL::extshx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -186,7 +186,7 @@ void Jit64::extshx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void Jit64::subfic(UGeckoInstruction inst) +void JitIL::subfic(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -205,7 +205,7 @@ void Jit64::subfic(UGeckoInstruction inst) ibuild.EmitStoreCarry(test); } -void Jit64::subfcx(UGeckoInstruction inst) +void JitIL::subfcx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -222,7 +222,7 @@ void Jit64::subfcx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void Jit64::subfex(UGeckoInstruction inst) +void JitIL::subfex(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -243,7 +243,7 @@ void Jit64::subfex(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void Jit64::subfx(UGeckoInstruction inst) +void JitIL::subfx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -255,7 +255,7 @@ void Jit64::subfx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void Jit64::mulli(UGeckoInstruction inst) +void JitIL::mulli(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -264,7 +264,7 @@ void Jit64::mulli(UGeckoInstruction inst) ibuild.EmitStoreGReg(val, inst.RD); } -void Jit64::mullwx(UGeckoInstruction inst) +void JitIL::mullwx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -275,7 +275,7 @@ void Jit64::mullwx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void Jit64::mulhwux(UGeckoInstruction inst) +void JitIL::mulhwux(UGeckoInstruction inst) { Default(inst); return; #if 0 @@ -310,7 +310,7 @@ void Jit64::mulhwux(UGeckoInstruction inst) } // skipped some of the special handling in here - if we get crashes, let the interpreter handle this op -void Jit64::divwux(UGeckoInstruction inst) { +void JitIL::divwux(UGeckoInstruction inst) { Default(inst); return; #if 0 int a = inst.RA, b = inst.RB, d = inst.RD; @@ -334,16 +334,7 @@ void Jit64::divwux(UGeckoInstruction inst) { #endif } -u32 Helper_Mask(u8 mb, u8 me) -{ - return (((mb > me) ? - ~(((u32)-1 >> mb) ^ ((me >= 31) ? 0 : (u32) -1 >> (me + 1))) - : - (((u32)-1 >> mb) ^ ((me >= 31) ? 0 : (u32) -1 >> (me + 1)))) - ); -} - -void Jit64::addx(UGeckoInstruction inst) +void JitIL::addx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -354,7 +345,7 @@ void Jit64::addx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void Jit64::addzex(UGeckoInstruction inst) +void JitIL::addzex(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -368,7 +359,7 @@ void Jit64::addzex(UGeckoInstruction inst) ComputeRC(ibuild, val); } // This can be optimized -void Jit64::addex(UGeckoInstruction inst) +void JitIL::addex(UGeckoInstruction inst) { Default(inst); return; #if 0 @@ -399,7 +390,7 @@ void Jit64::addex(UGeckoInstruction inst) #endif } -void Jit64::rlwinmx(UGeckoInstruction inst) +void JitIL::rlwinmx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -413,7 +404,7 @@ void Jit64::rlwinmx(UGeckoInstruction inst) } -void Jit64::rlwimix(UGeckoInstruction inst) +void JitIL::rlwimix(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -429,7 +420,7 @@ void Jit64::rlwimix(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void Jit64::rlwnmx(UGeckoInstruction inst) +void JitIL::rlwnmx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -442,7 +433,7 @@ void Jit64::rlwnmx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void Jit64::negx(UGeckoInstruction inst) +void JitIL::negx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -453,7 +444,7 @@ void Jit64::negx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void Jit64::srwx(UGeckoInstruction inst) +void JitIL::srwx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -472,7 +463,7 @@ void Jit64::srwx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void Jit64::slwx(UGeckoInstruction inst) +void JitIL::slwx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -491,7 +482,7 @@ void Jit64::slwx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void Jit64::srawx(UGeckoInstruction inst) +void JitIL::srawx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -514,7 +505,7 @@ void Jit64::srawx(UGeckoInstruction inst) ibuild.EmitStoreCarry(test); } -void Jit64::srawix(UGeckoInstruction inst) +void JitIL::srawix(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) @@ -531,7 +522,7 @@ void Jit64::srawix(UGeckoInstruction inst) } // count leading zeroes -void Jit64::cntlzwx(UGeckoInstruction inst) +void JitIL::cntlzwx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Integer) diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit_LoadStore.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_LoadStore.cpp similarity index 92% rename from Source/Core/Core/Src/PowerPC/Jit64IL/Jit_LoadStore.cpp rename to Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_LoadStore.cpp index d8b721c5c1..41ee60502e 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit_LoadStore.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_LoadStore.cpp @@ -29,13 +29,13 @@ #include "x64Emitter.h" #include "ABI.h" -#include "Jit.h" -#include "JitAsm.h" +#include "JitIL.h" +#include "JitILAsm.h" //#define INSTRUCTION_START Default(inst); return; #define INSTRUCTION_START -void Jit64::lhax(UGeckoInstruction inst) +void JitIL::lhax(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(LoadStore) @@ -47,7 +47,7 @@ void Jit64::lhax(UGeckoInstruction inst) ibuild.EmitStoreGReg(val, inst.RD); } -void Jit64::lXz(UGeckoInstruction inst) +void JitIL::lXz(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(LoadStore) @@ -67,7 +67,7 @@ void Jit64::lXz(UGeckoInstruction inst) ibuild.EmitStoreGReg(val, inst.RD); } -void Jit64::lha(UGeckoInstruction inst) +void JitIL::lha(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(LoadStore) @@ -80,7 +80,7 @@ void Jit64::lha(UGeckoInstruction inst) ibuild.EmitStoreGReg(val, inst.RD); } -void Jit64::lXzx(UGeckoInstruction inst) +void JitIL::lXzx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(LoadStore) @@ -102,7 +102,7 @@ void Jit64::lXzx(UGeckoInstruction inst) } // Zero cache line. -void Jit64::dcbz(UGeckoInstruction inst) +void JitIL::dcbz(UGeckoInstruction inst) { Default(inst); return; @@ -127,7 +127,7 @@ void Jit64::dcbz(UGeckoInstruction inst) #endif } -void Jit64::stX(UGeckoInstruction inst) +void JitIL::stX(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(LoadStore) @@ -146,7 +146,7 @@ void Jit64::stX(UGeckoInstruction inst) } } -void Jit64::stXx(UGeckoInstruction inst) +void JitIL::stXx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(LoadStore) @@ -165,7 +165,7 @@ void Jit64::stXx(UGeckoInstruction inst) } // A few games use these heavily in video codecs. (GFZP01 @ 0x80020E18) -void Jit64::lmw(UGeckoInstruction inst) +void JitIL::lmw(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(LoadStore) @@ -180,7 +180,7 @@ void Jit64::lmw(UGeckoInstruction inst) } } -void Jit64::stmw(UGeckoInstruction inst) +void JitIL::stmw(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(LoadStore) @@ -195,7 +195,7 @@ void Jit64::stmw(UGeckoInstruction inst) } } -void Jit64::icbi(UGeckoInstruction inst) +void JitIL::icbi(UGeckoInstruction inst) { Default(inst); ibuild.EmitBranchUncond(ibuild.EmitIntConst(js.compilerPC + 4)); diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit_LoadStoreFloating.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_LoadStoreFloating.cpp similarity index 92% rename from Source/Core/Core/Src/PowerPC/Jit64IL/Jit_LoadStoreFloating.cpp rename to Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_LoadStoreFloating.cpp index 7b1d139db3..764fd709dc 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit_LoadStoreFloating.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_LoadStoreFloating.cpp @@ -29,8 +29,8 @@ #include "x64Emitter.h" #include "ABI.h" -#include "Jit.h" -#include "JitAsm.h" +#include "JitIL.h" +#include "JitILAsm.h" //#define INSTRUCTION_START Default(inst); return; #define INSTRUCTION_START @@ -39,7 +39,7 @@ // and pshufb could help a lot. // Also add hacks for things like lfs/stfs the same reg consecutively, that is, simple memory moves. -void Jit64::lfs(UGeckoInstruction inst) +void JitIL::lfs(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(LoadStoreFloating) @@ -52,7 +52,7 @@ void Jit64::lfs(UGeckoInstruction inst) } -void Jit64::lfd(UGeckoInstruction inst) +void JitIL::lfd(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(LoadStoreFloating) @@ -66,7 +66,7 @@ void Jit64::lfd(UGeckoInstruction inst) } -void Jit64::stfd(UGeckoInstruction inst) +void JitIL::stfd(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(LoadStoreFloating) @@ -81,7 +81,7 @@ void Jit64::stfd(UGeckoInstruction inst) } -void Jit64::stfs(UGeckoInstruction inst) +void JitIL::stfs(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(LoadStoreFloating) @@ -97,7 +97,7 @@ void Jit64::stfs(UGeckoInstruction inst) } -void Jit64::stfsx(UGeckoInstruction inst) +void JitIL::stfsx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(LoadStoreFloating) @@ -111,7 +111,7 @@ void Jit64::stfsx(UGeckoInstruction inst) } -void Jit64::lfsx(UGeckoInstruction inst) +void JitIL::lfsx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(LoadStoreFloating) diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit_LoadStorePaired.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_LoadStorePaired.cpp similarity index 93% rename from Source/Core/Core/Src/PowerPC/Jit64IL/Jit_LoadStorePaired.cpp rename to Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_LoadStorePaired.cpp index 9c486efb54..9818ee8589 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit_LoadStorePaired.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_LoadStorePaired.cpp @@ -27,13 +27,13 @@ #include "x64Emitter.h" #include "ABI.h" -#include "Jit.h" -#include "JitAsm.h" +#include "JitIL.h" +#include "JitILAsm.h" //#define INSTRUCTION_START Default(inst); return; #define INSTRUCTION_START -void Jit64::psq_st(UGeckoInstruction inst) +void JitIL::psq_st(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(LoadStorePaired) @@ -48,7 +48,7 @@ void Jit64::psq_st(UGeckoInstruction inst) ibuild.EmitStorePaired(val, addr, inst.I); } -void Jit64::psq_l(UGeckoInstruction inst) +void JitIL::psq_l(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(LoadStorePaired) diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit_Paired.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Paired.cpp similarity index 92% rename from Source/Core/Core/Src/PowerPC/Jit64IL/Jit_Paired.cpp rename to Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Paired.cpp index c0fbe1ae32..48e075f7bd 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit_Paired.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Paired.cpp @@ -23,29 +23,29 @@ #include "x64Emitter.h" #include "../../HW/GPFifo.h" -#include "Jit.h" +#include "JitIL.h" -void Jit64::ps_mr(UGeckoInstruction inst) +void JitIL::ps_mr(UGeckoInstruction inst) { Default(inst); return; } -void Jit64::ps_sel(UGeckoInstruction inst) +void JitIL::ps_sel(UGeckoInstruction inst) { Default(inst); return; } -void Jit64::ps_sign(UGeckoInstruction inst) +void JitIL::ps_sign(UGeckoInstruction inst) { Default(inst); return; } -void Jit64::ps_rsqrte(UGeckoInstruction inst) +void JitIL::ps_rsqrte(UGeckoInstruction inst) { Default(inst); return; } -void Jit64::ps_arith(UGeckoInstruction inst) +void JitIL::ps_arith(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Paired) @@ -74,7 +74,7 @@ void Jit64::ps_arith(UGeckoInstruction inst) ibuild.EmitStoreFReg(val, inst.FD); } -void Jit64::ps_sum(UGeckoInstruction inst) +void JitIL::ps_sum(UGeckoInstruction inst) { // FIXME: This operation strikes me as a bit strange... // perhaps we can optimize it depending on the users? @@ -95,7 +95,7 @@ void Jit64::ps_sum(UGeckoInstruction inst) } -void Jit64::ps_muls(UGeckoInstruction inst) +void JitIL::ps_muls(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Paired) @@ -120,7 +120,7 @@ void Jit64::ps_muls(UGeckoInstruction inst) //TODO: find easy cases and optimize them, do a breakout like ps_arith -void Jit64::ps_mergeXX(UGeckoInstruction inst) +void JitIL::ps_mergeXX(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Paired) @@ -153,7 +153,7 @@ void Jit64::ps_mergeXX(UGeckoInstruction inst) } -void Jit64::ps_maddXX(UGeckoInstruction inst) +void JitIL::ps_maddXX(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(Paired) diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit_SystemRegisters.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_SystemRegisters.cpp similarity index 93% rename from Source/Core/Core/Src/PowerPC/Jit64IL/Jit_SystemRegisters.cpp rename to Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_SystemRegisters.cpp index 053c29a3b3..eb932b16b0 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit_SystemRegisters.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_SystemRegisters.cpp @@ -26,12 +26,12 @@ #include "ABI.h" #include "Thunk.h" -#include "Jit.h" +#include "JitIL.h" //#define INSTRUCTION_START Default(inst); return; #define INSTRUCTION_START -void Jit64::mtspr(UGeckoInstruction inst) +void JitIL::mtspr(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(SystemRegisters) @@ -67,7 +67,7 @@ void Jit64::mtspr(UGeckoInstruction inst) } } -void Jit64::mfspr(UGeckoInstruction inst) +void JitIL::mfspr(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(SystemRegisters) @@ -104,7 +104,7 @@ void Jit64::mfspr(UGeckoInstruction inst) // ======================================================================================= // Don't interpret this, if we do we get thrown out // -------------- -void Jit64::mtmsr(UGeckoInstruction inst) +void JitIL::mtmsr(UGeckoInstruction inst) { ibuild.EmitStoreMSR(ibuild.EmitLoadGReg(inst.RS)); ibuild.EmitBranchUncond(ibuild.EmitIntConst(js.compilerPC + 4)); @@ -112,21 +112,21 @@ void Jit64::mtmsr(UGeckoInstruction inst) // ============== -void Jit64::mfmsr(UGeckoInstruction inst) +void JitIL::mfmsr(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(SystemRegisters) ibuild.EmitStoreGReg(ibuild.EmitLoadMSR(), inst.RD); } -void Jit64::mftb(UGeckoInstruction inst) +void JitIL::mftb(UGeckoInstruction inst) { INSTRUCTION_START; JITDISABLE(SystemRegisters) mfspr(inst); } -void Jit64::mfcr(UGeckoInstruction inst) +void JitIL::mfcr(UGeckoInstruction inst) { Default(inst); return; #if 0 @@ -147,7 +147,7 @@ void Jit64::mfcr(UGeckoInstruction inst) #endif } -void Jit64::mtcrf(UGeckoInstruction inst) +void JitIL::mtcrf(UGeckoInstruction inst) { Default(inst); return; #if 0 diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Tables.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Tables.cpp new file mode 100644 index 0000000000..6b0e43c1d0 --- /dev/null +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Tables.cpp @@ -0,0 +1,496 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "JitIL_Tables.h" + +// Should be moved in to the Jit class +typedef void (JitIL::*_Instruction) (UGeckoInstruction instCode); + +static _Instruction dynaOpTable[64]; +static _Instruction dynaOpTable4[1024]; +static _Instruction dynaOpTable19[1024]; +static _Instruction dynaOpTable31[1024]; +static _Instruction dynaOpTable59[32]; +static _Instruction dynaOpTable63[1024]; + +void JitIL::DynaRunTable4(UGeckoInstruction _inst) {(this->*dynaOpTable4 [_inst.SUBOP10])(_inst);} +void JitIL::DynaRunTable19(UGeckoInstruction _inst) {(this->*dynaOpTable19[_inst.SUBOP10])(_inst);} +void JitIL::DynaRunTable31(UGeckoInstruction _inst) {(this->*dynaOpTable31[_inst.SUBOP10])(_inst);} +void JitIL::DynaRunTable59(UGeckoInstruction _inst) {(this->*dynaOpTable59[_inst.SUBOP5 ])(_inst);} +void JitIL::DynaRunTable63(UGeckoInstruction _inst) {(this->*dynaOpTable63[_inst.SUBOP10])(_inst);} + + + +struct GekkoOPTemplate +{ + int opcode; + _Instruction Inst; + //GekkoOPInfo opinfo; // Doesn't need opinfo, Interpreter fills it out + int runCount; +}; + +static GekkoOPTemplate primarytable[] = +{ + {4, &JitIL::DynaRunTable4}, //"RunTable4", OPTYPE_SUBTABLE | (4<<24), 0}}, + {19, &JitIL::DynaRunTable19}, //"RunTable19", OPTYPE_SUBTABLE | (19<<24), 0}}, + {31, &JitIL::DynaRunTable31}, //"RunTable31", OPTYPE_SUBTABLE | (31<<24), 0}}, + {59, &JitIL::DynaRunTable59}, //"RunTable59", OPTYPE_SUBTABLE | (59<<24), 0}}, + {63, &JitIL::DynaRunTable63}, //"RunTable63", OPTYPE_SUBTABLE | (63<<24), 0}}, + + {16, &JitIL::bcx}, //"bcx", OPTYPE_SYSTEM, FL_ENDBLOCK}}, + {18, &JitIL::bx}, //"bx", OPTYPE_SYSTEM, FL_ENDBLOCK}}, + + {1, &JitIL::HLEFunction}, //"HLEFunction", OPTYPE_SYSTEM, FL_ENDBLOCK}}, + {2, &JitIL::Default}, //"DynaBlock", OPTYPE_SYSTEM, 0}}, + {3, &JitIL::Default}, //"twi", OPTYPE_SYSTEM, 0}}, + {17, &JitIL::sc}, //"sc", OPTYPE_SYSTEM, FL_ENDBLOCK, 1}}, + + {7, &JitIL::mulli}, //"mulli", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A | FL_RC_BIT, 2}}, + {8, &JitIL::subfic}, //"subfic", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A | FL_SET_CA}}, + {10, &JitIL::cmpXX}, //"cmpli", OPTYPE_INTEGER, FL_IN_A | FL_SET_CRn}}, + {11, &JitIL::cmpXX}, //"cmpi", OPTYPE_INTEGER, FL_IN_A | FL_SET_CRn}}, + {12, &JitIL::reg_imm}, //"addic", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A | FL_SET_CA}}, + {13, &JitIL::reg_imm}, //"addic_rc", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A | FL_SET_CR0}}, + {14, &JitIL::reg_imm}, //"addi", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A0}}, + {15, &JitIL::reg_imm}, //"addis", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A0}}, + + {20, &JitIL::rlwimix}, //"rlwimix", OPTYPE_INTEGER, FL_OUT_A | FL_IN_A | FL_IN_S | FL_RC_BIT}}, + {21, &JitIL::rlwinmx}, //"rlwinmx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}}, + {23, &JitIL::rlwnmx}, //"rlwnmx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_IN_B | FL_RC_BIT}}, + + {24, &JitIL::reg_imm}, //"ori", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S}}, + {25, &JitIL::reg_imm}, //"oris", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S}}, + {26, &JitIL::reg_imm}, //"xori", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S}}, + {27, &JitIL::reg_imm}, //"xoris", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S}}, + {28, &JitIL::reg_imm}, //"andi_rc", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_SET_CR0}}, + {29, &JitIL::reg_imm}, //"andis_rc", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_SET_CR0}}, + +#if JITTEST + {32, &JitIL::lXz}, //"lwz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, + {33, &JitIL::lXz}, //"lwzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, + {34, &JitIL::lXz}, //"lbz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, + {35, &JitIL::Default}, //"lbzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, + {40, &JitIL::lXz}, //"lhz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, + {41, &JitIL::lXz}, //"lhzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, +#else + {32, &JitIL::lXz}, //"lwz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, + {33, &JitIL::Default}, //"lwzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, + {34, &JitIL::lXz}, //"lbz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, + {35, &JitIL::Default}, //"lbzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, + {40, &JitIL::lXz}, //"lhz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, + {41, &JitIL::Default}, //"lhzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, +#endif + {42, &JitIL::lha}, //"lha", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, + {43, &JitIL::Default}, //"lhau", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, + + {44, &JitIL::stX}, //"sth", OPTYPE_STORE, FL_IN_A | FL_IN_S}}, + {45, &JitIL::stX}, //"sthu", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_S}}, + {36, &JitIL::stX}, //"stw", OPTYPE_STORE, FL_IN_A | FL_IN_S}}, + {37, &JitIL::stX}, //"stwu", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_S}}, + {38, &JitIL::stX}, //"stb", OPTYPE_STORE, FL_IN_A | FL_IN_S}}, + {39, &JitIL::stX}, //"stbu", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_S}}, + + {46, &JitIL::lmw}, //"lmw", OPTYPE_SYSTEM, FL_EVIL, 10}}, + {47, &JitIL::stmw}, //"stmw", OPTYPE_SYSTEM, FL_EVIL, 10}}, + + {48, &JitIL::lfs}, //"lfs", OPTYPE_LOADFP, FL_IN_A}}, + {49, &JitIL::Default}, //"lfsu", OPTYPE_LOADFP, FL_OUT_A | FL_IN_A}}, + {50, &JitIL::lfd}, //"lfd", OPTYPE_LOADFP, FL_IN_A}}, + {51, &JitIL::Default}, //"lfdu", OPTYPE_LOADFP, FL_OUT_A | FL_IN_A}}, + + {52, &JitIL::stfs}, //"stfs", OPTYPE_STOREFP, FL_IN_A}}, + {53, &JitIL::stfs}, //"stfsu", OPTYPE_STOREFP, FL_OUT_A | FL_IN_A}}, + {54, &JitIL::stfd}, //"stfd", OPTYPE_STOREFP, FL_IN_A}}, + {55, &JitIL::Default}, //"stfdu", OPTYPE_STOREFP, FL_OUT_A | FL_IN_A}}, + + {56, &JitIL::psq_l}, //"psq_l", OPTYPE_PS, FL_IN_A}}, + {57, &JitIL::psq_l}, //"psq_lu", OPTYPE_PS, FL_OUT_A | FL_IN_A}}, + {60, &JitIL::psq_st}, //"psq_st", OPTYPE_PS, FL_IN_A}}, + {61, &JitIL::psq_st}, //"psq_stu", OPTYPE_PS, FL_OUT_A | FL_IN_A}}, + + //missing: 0, 5, 6, 9, 22, 30, 62, 58 + {0, &JitIL::Default}, //"unknown_instruction", OPTYPE_UNKNOWN, 0}}, + {5, &JitIL::Default}, //"unknown_instruction", OPTYPE_UNKNOWN, 0}}, + {6, &JitIL::Default}, //"unknown_instruction", OPTYPE_UNKNOWN, 0}}, + {9, &JitIL::Default}, //"unknown_instruction", OPTYPE_UNKNOWN, 0}}, + {22, &JitIL::Default}, //"unknown_instruction", OPTYPE_UNKNOWN, 0}}, + {30, &JitIL::Default}, //"unknown_instruction", OPTYPE_UNKNOWN, 0}}, + {62, &JitIL::Default}, //"unknown_instruction", OPTYPE_UNKNOWN, 0}}, + {58, &JitIL::Default}, //"unknown_instruction", OPTYPE_UNKNOWN, 0}}, +}; + +static GekkoOPTemplate table4[] = +{ //SUBOP10 + {0, &JitIL::Default}, //"ps_cmpu0", OPTYPE_PS, FL_SET_CRn}}, + {32, &JitIL::Default}, //"ps_cmpo0", OPTYPE_PS, FL_SET_CRn}}, + {40, &JitIL::ps_sign}, //"ps_neg", OPTYPE_PS, FL_RC_BIT}}, + {136, &JitIL::ps_sign}, //"ps_nabs", OPTYPE_PS, FL_RC_BIT}}, + {264, &JitIL::ps_sign}, //"ps_abs", OPTYPE_PS, FL_RC_BIT}}, + {64, &JitIL::Default}, //"ps_cmpu1", OPTYPE_PS, FL_RC_BIT}}, + {72, &JitIL::ps_mr}, //"ps_mr", OPTYPE_PS, FL_RC_BIT}}, + {96, &JitIL::Default}, //"ps_cmpo1", OPTYPE_PS, FL_RC_BIT}}, + {528, &JitIL::ps_mergeXX}, //"ps_merge00", OPTYPE_PS, FL_RC_BIT}}, + {560, &JitIL::ps_mergeXX}, //"ps_merge01", OPTYPE_PS, FL_RC_BIT}}, + {592, &JitIL::ps_mergeXX}, //"ps_merge10", OPTYPE_PS, FL_RC_BIT}}, + {624, &JitIL::ps_mergeXX}, //"ps_merge11", OPTYPE_PS, FL_RC_BIT}}, + + {1014, &JitIL::Default}, //"dcbz_l", OPTYPE_SYSTEM, 0}}, +}; + +static GekkoOPTemplate table4_2[] = +{ + {10, &JitIL::ps_sum}, //"ps_sum0", OPTYPE_PS, 0}}, + {11, &JitIL::ps_sum}, //"ps_sum1", OPTYPE_PS, 0}}, + {12, &JitIL::ps_muls}, //"ps_muls0", OPTYPE_PS, 0}}, + {13, &JitIL::ps_muls}, //"ps_muls1", OPTYPE_PS, 0}}, + {14, &JitIL::ps_maddXX}, //"ps_madds0", OPTYPE_PS, 0}}, + {15, &JitIL::ps_maddXX}, //"ps_madds1", OPTYPE_PS, 0}}, + {18, &JitIL::ps_arith}, //"ps_div", OPTYPE_PS, 0, 16}}, + {20, &JitIL::ps_arith}, //"ps_sub", OPTYPE_PS, 0}}, + {21, &JitIL::ps_arith}, //"ps_add", OPTYPE_PS, 0}}, + {23, &JitIL::ps_sel}, //"ps_sel", OPTYPE_PS, 0}}, + {24, &JitIL::Default}, //"ps_res", OPTYPE_PS, 0}}, + {25, &JitIL::ps_arith}, //"ps_mul", OPTYPE_PS, 0}}, + {26, &JitIL::ps_rsqrte}, //"ps_rsqrte", OPTYPE_PS, 0, 1}}, + {28, &JitIL::ps_maddXX}, //"ps_msub", OPTYPE_PS, 0}}, + {29, &JitIL::ps_maddXX}, //"ps_madd", OPTYPE_PS, 0}}, + {30, &JitIL::ps_maddXX}, //"ps_nmsub", OPTYPE_PS, 0}}, + {31, &JitIL::ps_maddXX}, //"ps_nmadd", OPTYPE_PS, 0}}, +}; + + +static GekkoOPTemplate table4_3[] = +{ + {6, &JitIL::Default}, //"psq_lx", OPTYPE_PS, 0}}, + {7, &JitIL::Default}, //"psq_stx", OPTYPE_PS, 0}}, + {38, &JitIL::Default}, //"psq_lux", OPTYPE_PS, 0}}, + {39, &JitIL::Default}, //"psq_stux", OPTYPE_PS, 0}}, +}; + +static GekkoOPTemplate table19[] = +{ + {528, &JitIL::bcctrx}, //"bcctrx", OPTYPE_BRANCH, FL_ENDBLOCK}}, + {16, &JitIL::bclrx}, //"bclrx", OPTYPE_BRANCH, FL_ENDBLOCK}}, + {257, &JitIL::Default}, //"crand", OPTYPE_CR, FL_EVIL}}, + {129, &JitIL::Default}, //"crandc", OPTYPE_CR, FL_EVIL}}, + {289, &JitIL::Default}, //"creqv", OPTYPE_CR, FL_EVIL}}, + {225, &JitIL::Default}, //"crnand", OPTYPE_CR, FL_EVIL}}, + {33, &JitIL::Default}, //"crnor", OPTYPE_CR, FL_EVIL}}, + {449, &JitIL::Default}, //"cror", OPTYPE_CR, FL_EVIL}}, + {417, &JitIL::Default}, //"crorc", OPTYPE_CR, FL_EVIL}}, + {193, &JitIL::Default}, //"crxor", OPTYPE_CR, FL_EVIL}}, + + {150, &JitIL::DoNothing}, //"isync", OPTYPE_ICACHE, FL_EVIL}}, + {0, &JitIL::Default}, //"mcrf", OPTYPE_SYSTEM, FL_EVIL}}, + + {50, &JitIL::rfi}, //"rfi", OPTYPE_SYSTEM, FL_ENDBLOCK | FL_CHECKEXCEPTIONS, 1}}, + {18, &JitIL::Default}, //"rfid", OPTYPE_SYSTEM, FL_ENDBLOCK | FL_CHECKEXCEPTIONS}} +}; + + +static GekkoOPTemplate table31[] = +{ + {28, &JitIL::andx}, //"andx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {60, &JitIL::Default}, //"andcx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {444, &JitIL::orx}, //"orx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {124, &JitIL::Default}, //"norx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {316, &JitIL::xorx}, //"xorx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {412, &JitIL::Default}, //"orcx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {476, &JitIL::Default}, //"nandx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {284, &JitIL::Default}, //"eqvx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {0, &JitIL::cmpXX}, //"cmp", OPTYPE_INTEGER, FL_IN_AB | FL_SET_CRn}}, + {32, &JitIL::cmpXX}, //"cmpl", OPTYPE_INTEGER, FL_IN_AB | FL_SET_CRn}}, + {26, &JitIL::cntlzwx}, //"cntlzwx",OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}}, + {922, &JitIL::extshx}, //"extshx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}}, + {954, &JitIL::extsbx}, //"extsbx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}}, + {536, &JitIL::srwx}, //"srwx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}}, + {792, &JitIL::srawx}, //"srawx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}}, + {824, &JitIL::srawix}, //"srawix", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}}, + {24, &JitIL::slwx}, //"slwx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}}, + + {54, &JitIL::Default}, //"dcbst", OPTYPE_DCACHE, 0, 4}}, + {86, &JitIL::DoNothing}, //"dcbf", OPTYPE_DCACHE, 0, 4}}, + {246, &JitIL::Default}, //"dcbtst", OPTYPE_DCACHE, 0, 1}}, + {278, &JitIL::Default}, //"dcbt", OPTYPE_DCACHE, 0, 1}}, + {470, &JitIL::Default}, //"dcbi", OPTYPE_DCACHE, 0, 4}}, + {758, &JitIL::Default}, //"dcba", OPTYPE_DCACHE, 0, 4}}, + {1014, &JitIL::dcbz}, //"dcbz", OPTYPE_DCACHE, 0, 4}}, + //load word + {23, &JitIL::lXzx}, //"lwzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, + {55, &JitIL::lXzx}, //"lwzux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, + + //load halfword + {279, &JitIL::lXzx}, //"lhzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, + {311, &JitIL::lXzx}, //"lhzux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, + + //load halfword signextend + {343, &JitIL::lhax}, //"lhax", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, + {375, &JitIL::Default}, //"lhaux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, + + //load byte + {87, &JitIL::lXzx}, //"lbzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, + {119, &JitIL::lXzx}, //"lbzux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, + + //load byte reverse + {534, &JitIL::Default}, //"lwbrx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, + {790, &JitIL::Default}, //"lhbrx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, + + // Conditional load/store (Wii SMP) + {150, &JitIL::Default}, //"stwcxd", OPTYPE_STORE, FL_EVIL | FL_SET_CR0}}, + {20, &JitIL::Default}, //"lwarx", OPTYPE_LOAD, FL_EVIL | FL_OUT_D | FL_IN_A0B | FL_SET_CR0}}, + + //load string (interpret these) + {533, &JitIL::Default}, //"lswx", OPTYPE_LOAD, FL_EVIL | FL_IN_A | FL_OUT_D}}, + {597, &JitIL::Default}, //"lswi", OPTYPE_LOAD, FL_EVIL | FL_IN_AB | FL_OUT_D}}, + + //store word + {151, &JitIL::stXx}, //"stwx", OPTYPE_STORE, FL_IN_A0 | FL_IN_B}}, + {183, &JitIL::stXx}, //"stwux", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_B}}, + + //store halfword + {407, &JitIL::stXx}, //"sthx", OPTYPE_STORE, FL_IN_A0 | FL_IN_B}}, + {439, &JitIL::stXx}, //"sthux", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_B}}, + + //store byte + {215, &JitIL::stXx}, //"stbx", OPTYPE_STORE, FL_IN_A0 | FL_IN_B}}, + {247, &JitIL::stXx}, //"stbux", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_B}}, + + //store bytereverse + {662, &JitIL::Default}, //"stwbrx", OPTYPE_STORE, FL_IN_A0 | FL_IN_B}}, + {918, &JitIL::Default}, //"sthbrx", OPTYPE_STORE, FL_IN_A | FL_IN_B}}, + + {661, &JitIL::Default}, //"stswx", OPTYPE_STORE, FL_EVIL}}, + {725, &JitIL::Default}, //"stswi", OPTYPE_STORE, FL_EVIL}}, + + // fp load/store + {535, &JitIL::lfsx}, //"lfsx", OPTYPE_LOADFP, FL_IN_A0 | FL_IN_B}}, + {567, &JitIL::Default}, //"lfsux", OPTYPE_LOADFP, FL_IN_A | FL_IN_B}}, + {599, &JitIL::Default}, //"lfdx", OPTYPE_LOADFP, FL_IN_A0 | FL_IN_B}}, + {631, &JitIL::Default}, //"lfdux", OPTYPE_LOADFP, FL_IN_A | FL_IN_B}}, + + {663, &JitIL::stfsx}, //"stfsx", OPTYPE_STOREFP, FL_IN_A0 | FL_IN_B}}, + {695, &JitIL::Default}, //"stfsux", OPTYPE_STOREFP, FL_IN_A | FL_IN_B}}, + {727, &JitIL::Default}, //"stfdx", OPTYPE_STOREFP, FL_IN_A0 | FL_IN_B}}, + {759, &JitIL::Default}, //"stfdux", OPTYPE_STOREFP, FL_IN_A | FL_IN_B}}, + {983, &JitIL::Default}, //"stfiwx", OPTYPE_STOREFP, FL_IN_A0 | FL_IN_B}}, + + {19, &JitIL::mfcr}, //"mfcr", OPTYPE_SYSTEM, FL_OUT_D}}, + {83, &JitIL::mfmsr}, //"mfmsr", OPTYPE_SYSTEM, FL_OUT_D}}, + {144, &JitIL::mtcrf}, //"mtcrf", OPTYPE_SYSTEM, 0}}, + {146, &JitIL::mtmsr}, //"mtmsr", OPTYPE_SYSTEM, FL_ENDBLOCK}}, + {210, &JitIL::Default}, //"mtsr", OPTYPE_SYSTEM, 0}}, + {242, &JitIL::Default}, //"mtsrin", OPTYPE_SYSTEM, 0}}, + {339, &JitIL::mfspr}, //"mfspr", OPTYPE_SPR, FL_OUT_D}}, + {467, &JitIL::mtspr}, //"mtspr", OPTYPE_SPR, 0, 2}}, + {371, &JitIL::mftb}, //"mftb", OPTYPE_SYSTEM, FL_OUT_D | FL_TIMER}}, + {512, &JitIL::Default}, //"mcrxr", OPTYPE_SYSTEM, 0}}, + {595, &JitIL::Default}, //"mfsr", OPTYPE_SYSTEM, FL_OUT_D, 2}}, + {659, &JitIL::Default}, //"mfsrin", OPTYPE_SYSTEM, FL_OUT_D, 2}}, + + {4, &JitIL::Default}, //"tw", OPTYPE_SYSTEM, 0, 1}}, + {598, &JitIL::DoNothing}, //"sync", OPTYPE_SYSTEM, 0, 2}}, + {982, &JitIL::icbi}, //"icbi", OPTYPE_SYSTEM, FL_ENDBLOCK, 3}}, + + // Unused instructions on GC + {310, &JitIL::Default}, //"eciwx", OPTYPE_INTEGER, FL_RC_BIT}}, + {438, &JitIL::Default}, //"ecowx", OPTYPE_INTEGER, FL_RC_BIT}}, + {854, &JitIL::Default}, //"eieio", OPTYPE_INTEGER, FL_RC_BIT}}, + {306, &JitIL::Default}, //"tlbie", OPTYPE_SYSTEM, 0}}, + {370, &JitIL::Default}, //"tlbia", OPTYPE_SYSTEM, 0}}, + {566, &JitIL::Default}, //"tlbsync", OPTYPE_SYSTEM, 0}}, +}; + +static GekkoOPTemplate table31_2[] = +{ + {266, &JitIL::addx}, //"addx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, + {10, &JitIL::Default}, //"addcx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT}}, + {138, &JitIL::addex}, //"addex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, + {234, &JitIL::Default}, //"addmex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, + {202, &JitIL::addzex}, //"addzex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, + {491, &JitIL::Default}, //"divwx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 39}}, + {459, &JitIL::divwux}, //"divwux", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 39}}, + {75, &JitIL::Default}, //"mulhwx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 4}}, + {11, &JitIL::mulhwux}, //"mulhwux", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 4}}, + {235, &JitIL::mullwx}, //"mullwx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 4}}, + {104, &JitIL::negx}, //"negx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, + {40, &JitIL::subfx}, //"subfx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, + {8, &JitIL::subfcx}, //"subfcx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT}}, + {136, &JitIL::subfex}, //"subfex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, + {232, &JitIL::Default}, //"subfmex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, + {200, &JitIL::Default}, //"subfzex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, +}; + +static GekkoOPTemplate table59[] = +{ + {18, &JitIL::Default}, //{"fdivsx", OPTYPE_FPU, FL_RC_BIT_F, 16}}, + {20, &JitIL::fp_arith_s}, //"fsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {21, &JitIL::fp_arith_s}, //"faddsx", OPTYPE_FPU, FL_RC_BIT_F}}, +// {22, &JitIL::Default}, //"fsqrtsx", OPTYPE_FPU, FL_RC_BIT_F}}, // Not implemented on gekko + {24, &JitIL::Default}, //"fresx", OPTYPE_FPU, FL_RC_BIT_F}}, + {25, &JitIL::fp_arith_s}, //"fmulsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {28, &JitIL::fmaddXX}, //"fmsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {29, &JitIL::fmaddXX}, //"fmaddsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {30, &JitIL::fmaddXX}, //"fnmsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {31, &JitIL::fmaddXX}, //"fnmaddsx", OPTYPE_FPU, FL_RC_BIT_F}}, +}; + +static GekkoOPTemplate table63[] = +{ + {264, &JitIL::fsign}, //"fabsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {32, &JitIL::fcmpx}, //"fcmpo", OPTYPE_FPU, FL_RC_BIT_F}}, + {0, &JitIL::fcmpx}, //"fcmpu", OPTYPE_FPU, FL_RC_BIT_F}}, + {14, &JitIL::Default}, //"fctiwx", OPTYPE_FPU, FL_RC_BIT_F}}, + {15, &JitIL::Default}, //"fctiwzx", OPTYPE_FPU, FL_RC_BIT_F}}, + {72, &JitIL::fmrx}, //"fmrx", OPTYPE_FPU, FL_RC_BIT_F}}, + {136, &JitIL::fsign}, //"fnabsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {40, &JitIL::fsign}, //"fnegx", OPTYPE_FPU, FL_RC_BIT_F}}, + {12, &JitIL::Default}, //"frspx", OPTYPE_FPU, FL_RC_BIT_F}}, + + {64, &JitIL::Default}, //"mcrfs", OPTYPE_SYSTEMFP, 0}}, + {583, &JitIL::Default}, //"mffsx", OPTYPE_SYSTEMFP, 0}}, + {70, &JitIL::Default}, //"mtfsb0x", OPTYPE_SYSTEMFP, 0, 2}}, + {38, &JitIL::Default}, //"mtfsb1x", OPTYPE_SYSTEMFP, 0, 2}}, + {134, &JitIL::Default}, //"mtfsfix", OPTYPE_SYSTEMFP, 0, 2}}, + {711, &JitIL::Default}, //"mtfsfx", OPTYPE_SYSTEMFP, 0, 2}}, +}; + +static GekkoOPTemplate table63_2[] = +{ + {18, &JitIL::Default}, //"fdivx", OPTYPE_FPU, FL_RC_BIT_F, 30}}, + {20, &JitIL::Default}, //"fsubx", OPTYPE_FPU, FL_RC_BIT_F}}, + {21, &JitIL::Default}, //"faddx", OPTYPE_FPU, FL_RC_BIT_F}}, + {22, &JitIL::Default}, //"fsqrtx", OPTYPE_FPU, FL_RC_BIT_F}}, + {23, &JitIL::Default}, //"fselx", OPTYPE_FPU, FL_RC_BIT_F}}, + {25, &JitIL::fp_arith_s}, //"fmulx", OPTYPE_FPU, FL_RC_BIT_F}}, + {26, &JitIL::fp_arith_s}, //"frsqrtex", OPTYPE_FPU, FL_RC_BIT_F}}, + {28, &JitIL::fmaddXX}, //"fmsubx", OPTYPE_FPU, FL_RC_BIT_F}}, + {29, &JitIL::fmaddXX}, //"fmaddx", OPTYPE_FPU, FL_RC_BIT_F}}, + {30, &JitIL::fmaddXX}, //"fnmsubx", OPTYPE_FPU, FL_RC_BIT_F}}, + {31, &JitIL::fmaddXX}, //"fnmaddx", OPTYPE_FPU, FL_RC_BIT_F}}, +}; + +namespace JitILTables +{ +void CompileInstruction(UGeckoInstruction _inst) +{ + JitIL *jitil = (JitIL *)jit; + (jitil->*dynaOpTable[_inst.OPCD])(_inst); + GekkoOPInfo *info = GetOpInfo(_inst); + if (info) { +#ifdef OPLOG + if (!strcmp(info->opname, OP_TO_LOG)){ ///"mcrfs" + rsplocations.push_back(jit.js.compilerPC); + } +#endif + info->compileCount++; + info->lastUse = jit->js.compilerPC; + } else { + PanicAlert("Tried to compile illegal (or unknown) instruction %08x, at %08x", _inst.hex, jit->js.compilerPC); + } +} +void InitTables() +{ + //clear + for (int i = 0; i < 32; i++) + { + dynaOpTable59[i] = &JitIL::unknown_instruction; + } + + for (int i = 0; i < 1024; i++) + { + dynaOpTable4 [i] = &JitIL::unknown_instruction; + dynaOpTable19[i] = &JitIL::unknown_instruction; + dynaOpTable31[i] = &JitIL::unknown_instruction; + dynaOpTable63[i] = &JitIL::unknown_instruction; + } + + for (int i = 0; i < (int)(sizeof(primarytable) / sizeof(GekkoOPTemplate)); i++) + { + dynaOpTable[primarytable[i].opcode] = primarytable[i].Inst; + } + + for (int i = 0; i < 32; i++) + { + int fill = i << 5; + for (int j = 0; j < (int)(sizeof(table4_2) / sizeof(GekkoOPTemplate)); j++) + { + int op = fill+table4_2[j].opcode; + dynaOpTable4[op] = table4_2[j].Inst; + } + } + + for (int i = 0; i < 16; i++) + { + int fill = i << 6; + for (int j = 0; j < (int)(sizeof(table4_3) / sizeof(GekkoOPTemplate)); j++) + { + int op = fill+table4_3[j].opcode; + dynaOpTable4[op] = table4_3[j].Inst; + } + } + + for (int i = 0; i < (int)(sizeof(table4) / sizeof(GekkoOPTemplate)); i++) + { + int op = table4[i].opcode; + dynaOpTable4[op] = table4[i].Inst; + } + + for (int i = 0; i < (int)(sizeof(table31) / sizeof(GekkoOPTemplate)); i++) + { + int op = table31[i].opcode; + dynaOpTable31[op] = table31[i].Inst; + } + + for (int i = 0; i < 1; i++) + { + int fill = i << 9; + for (int j = 0; j < (int)(sizeof(table31_2) / sizeof(GekkoOPTemplate)); j++) + { + int op = fill + table31_2[j].opcode; + dynaOpTable31[op] = table31_2[j].Inst; + } + } + + for (int i = 0; i < (int)(sizeof(table19) / sizeof(GekkoOPTemplate)); i++) + { + int op = table19[i].opcode; + dynaOpTable19[op] = table19[i].Inst; + } + + for (int i = 0; i < (int)(sizeof(table59) / sizeof(GekkoOPTemplate)); i++) + { + int op = table59[i].opcode; + dynaOpTable59[op] = table59[i].Inst; + } + + for (int i = 0; i < (int)(sizeof(table63) / sizeof(GekkoOPTemplate)); i++) + { + int op = table63[i].opcode; + dynaOpTable63[op] = table63[i].Inst; + } + + for (int i = 0; i < 32; i++) + { + int fill = i << 5; + for (int j = 0; j < (int)(sizeof(table63_2) / sizeof(GekkoOPTemplate)); j++) + { + int op = fill + table63_2[j].opcode; + dynaOpTable63[op] = table63_2[j].Inst; + } + } +} +} diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Tables.h b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Tables.h new file mode 100644 index 0000000000..2921d41337 --- /dev/null +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Tables.h @@ -0,0 +1,31 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef JITIL_TABLES_H +#define JITIL_TABLES_H + +#include "../Gekko.h" +#include "../PPCTables.h" +#include "../Jit64IL/JitIL.h" + +namespace JitILTables +{ +void CompileInstruction(UGeckoInstruction _inst); +void InitTables(); +} + +#endif diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/JitAsmCommon.h b/Source/Core/Core/Src/PowerPC/JitCommon/JitAsmCommon.h index c5f48b7782..4943f43ed1 100644 --- a/Source/Core/Core/Src/PowerPC/JitCommon/JitAsmCommon.h +++ b/Source/Core/Core/Src/PowerPC/JitCommon/JitAsmCommon.h @@ -31,6 +31,26 @@ public: void GenFifoXmm64Write(); void GenFifoFloatWrite(); + const u8 *fifoDirectWrite8; + const u8 *fifoDirectWrite16; + const u8 *fifoDirectWrite32; + const u8 *fifoDirectWriteFloat; + const u8 *fifoDirectWriteXmm64; + + const u8 *enterCode; + + const u8 *dispatcher; + const u8 *dispatcherNoCheck; + const u8 *dispatcherPcInEAX; + + const u8 *fpException; + const u8 *computeRc; + const u8 *testExceptions; + const u8 *dispatchPcInEAX; + const u8 *doTiming; + + const u8 *breakpointBailout; + // In: array index: GQR to use. // In: ECX: Address to read from. // Out: XMM0: Bottom two 32-bit slots hold the read value, diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/JitBackpatch.cpp b/Source/Core/Core/Src/PowerPC/JitCommon/JitBackpatch.cpp index c4388d3b8d..181146ddbc 100644 --- a/Source/Core/Core/Src/PowerPC/JitCommon/JitBackpatch.cpp +++ b/Source/Core/Core/Src/PowerPC/JitCommon/JitBackpatch.cpp @@ -19,13 +19,9 @@ #include "Common.h" #include "disasm.h" -#ifdef JITTEST -#include "../Jit64IL/Jit.h" -#include "../Jit64IL/JitAsm.h" -#else -#include "../Jit64/Jit.h" -#include "../Jit64/JitAsm.h" -#endif +#include "../JitCommon/JitBase.h" +#include "../JitCommon/JitBackpatch.h" + #include "../../HW/Memmap.h" #include "x64Emitter.h" @@ -34,6 +30,27 @@ #include "x64Analyzer.h" #include "StringUtil.h" +#ifdef _WIN32 + #include +#endif + +#ifndef _WIN32 + + // A bit of a hack to get things building under linux. We manually fill in this structure as needed + // from the real context. + struct CONTEXT + { + #ifdef _M_X64 + u64 Rip; + u64 Rax; + #else + u32 Eip; + u32 Eax; + #endif + }; + +#endif + using namespace Gen; @@ -118,7 +135,7 @@ const u8 *TrampolineCache::GetWriteTrampoline(const InstructionInfo &info) CMP(32, R(addrReg), Imm32(0xCC008000)); FixupBranch skip_fast = J_CC(CC_NE, false); MOV(32, R(ABI_PARAM1), R((X64Reg)dataReg)); - CALL((void*)asm_routines.fifoDirectWrite32); + CALL((void*)jit->GetAsmRoutines()->fifoDirectWrite32); RET(); SetJumpTarget(skip_fast); ABI_PushAllCallerSavedRegsAndAdjustStack(); @@ -149,10 +166,12 @@ const u8 *TrampolineCache::GetWriteTrampoline(const InstructionInfo &info) // 1) It's really necessary. We don't know anything about the context. // 2) It doesn't really hurt. Only instructions that access I/O will get these, and there won't be // that many of them in a typical program/game. -const u8 *Jit64::BackPatch(u8 *codePtr, int accessType, u32 emAddress, CONTEXT *ctx) +const u8 *JitBase::BackPatch(u8 *codePtr, int accessType, u32 emAddress, void *ctx_void) { + CONTEXT *ctx = (CONTEXT *)ctx_void; + #ifdef _M_X64 - if (!jit.IsInCodeSpace(codePtr)) + if (!jit->IsInCodeSpace(codePtr)) return 0; // this will become a regular crash real soon after this InstructionInfo info; diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/JitBackpatch.h b/Source/Core/Core/Src/PowerPC/JitCommon/JitBackpatch.h new file mode 100644 index 0000000000..793d640e8c --- /dev/null +++ b/Source/Core/Core/Src/PowerPC/JitCommon/JitBackpatch.h @@ -0,0 +1,41 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _JITBACKPATCH_H +#define _JITBACKPATCH_H + +#include "Common.h" +#include "x64Emitter.h" +#include "x64Analyzer.h" + +// Declarations and definitions +// ---------- + +// void Jit(u32 em_address); + + +class TrampolineCache : public Gen::XCodeBlock +{ +public: + void Init(); + void Shutdown(); + + const u8 *GetReadTrampoline(const InstructionInfo &info); + const u8 *GetWriteTrampoline(const InstructionInfo &info); +}; + +#endif diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/JitBase.h b/Source/Core/Core/Src/PowerPC/JitCommon/JitBase.h new file mode 100644 index 0000000000..9c3c201e6c --- /dev/null +++ b/Source/Core/Core/Src/PowerPC/JitCommon/JitBase.h @@ -0,0 +1,102 @@ +// Copyright (C) 2010 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _JITBASE_H +#define _JITBASE_H + +#include "JitCache.h" +#include "Jit_Util.h" // for EmuCodeBlock +#include "JitBackpatch.h" // for EmuCodeBlock +#include "JitAsmCommon.h" + +#define JIT_OPCODE 0 + +// TODO: In the future, inherit this from CPUCoreBase and have Interpreter +// inherit from that too? +class JitBase : public EmuCodeBlock +{ +protected: + JitBlockCache blocks; + TrampolineCache trampolines; + + struct JitOptions + { + bool optimizeStack; + bool assumeFPLoadFromMem; + bool enableBlocklink; + bool fpAccurateFcmp; + bool enableFastMem; + bool optimizeGatherPipe; + bool fastInterrupts; + bool accurateSinglePrecision; + }; + struct JitState + { + u32 compilerPC; + u32 next_compilerPC; + u32 blockStart; + bool cancel; + UGeckoInstruction next_inst; // for easy peephole opt. + int blockSize; + int instructionNumber; + int downcountAmount; + + bool isLastInstruction; + bool forceUnsafeLoad; + + int fifoBytesThisBlock; + + PPCAnalyst::BlockStats st; + PPCAnalyst::BlockRegStats gpa; + PPCAnalyst::BlockRegStats fpa; + PPCAnalyst::CodeOp *op; + u8* rewriteStart; + + JitBlock *curBlock; + }; + +public: + // This should probably be removed from public: + JitOptions jo; + JitState js; + + JitBlockCache *GetBlockCache() { return &blocks; } + + virtual void Init() = 0; + virtual void Shutdown() = 0; + + virtual void Jit(u32 em_address) = 0; + virtual void ClearCache() = 0; + virtual void Run() = 0; + virtual void SingleStep() = 0; + virtual void NotifyBreakpoint(u32 em_address, bool set) = 0; + + const u8 *BackPatch(u8 *codePtr, int accessType, u32 em_address, void *ctx); + + virtual const CommonAsmRoutines *GetAsmRoutines() = 0; + virtual const char *GetName() = 0; +}; + +extern JitBase *jit; + +void Jit(u32 em_address); + +// Merged routines that should be moved somewhere better +u32 Helper_Mask(u8 mb, u8 me); + + +#endif diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.cpp b/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.cpp index e15ba7d5df..814dad72b3 100644 --- a/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.cpp +++ b/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.cpp @@ -23,6 +23,11 @@ // locating performance issues. #include "Common.h" + +#ifdef _WIN32 +#include +#endif + #include "../../Core.h" #include "MemoryUtil.h" @@ -36,15 +41,8 @@ #include "x64Emitter.h" #include "x64Analyzer.h" -#ifdef JITTEST -#include "../Jit64IL/Jit.h" -#include "../Jit64IL/JitAsm.h" -#else -#include "../Jit64/Jit.h" -#include "../Jit64/JitAsm.h" -#endif - #include "JitCache.h" +#include "JitBase.h" #include "disasm.h" @@ -378,7 +376,7 @@ bool JitBlock::ContainsAddress(u32 em_address) // Spurious entrances from previously linked blocks can only come through checkedEntry XEmitter emit((u8 *)b.checkedEntry); emit.MOV(32, M(&PC), Imm32(b.originalAddress)); - emit.JMP(asm_routines.dispatcher, true); + emit.JMP(jit->GetAsmRoutines()->dispatcher, true); // this is not needed really /* emit.SetCodePtr((u8 *)blockCodePointers[blocknum]); diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.h b/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.h index 76c2e08290..6029c65d2c 100644 --- a/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.h +++ b/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.h @@ -24,9 +24,6 @@ #include "../Gekko.h" #include "../PPCAnalyst.h" -#ifdef _WIN32 -#include -#endif // emulate CPU with unlimited instruction cache // the only way to invalidate a region is the "icbi" instruction @@ -59,9 +56,9 @@ struct JitBlock #ifdef _WIN32 // we don't really need to save start and stop // TODO (mb2): ticStart and ticStop -> "local var" mean "in block" ... low priority ;) - LARGE_INTEGER ticStart; // for profiling - time. - LARGE_INTEGER ticStop; // for profiling - time. - LARGE_INTEGER ticCounter; // for profiling - time. + u64 ticStart; // for profiling - time. + u64 ticStop; // for profiling - time. + u64 ticCounter; // for profiling - time. #endif const u8 *checkedEntry; const u8 *normalEntry; @@ -92,8 +89,9 @@ class JitBlockCache void LinkBlock(int i); public: - JitBlockCache() {} - + JitBlockCache() : + blockCodePointers(0), blocks(0), num_blocks(0), + iCache(0), iCacheEx(0), iCacheVMEM(0), MAX_NUM_BLOCKS(0) { } int AllocateBlock(u32 em_address); void FinalizeBlock(int block_num, bool block_link, const u8 *code_ptr); diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Util.cpp b/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Util.cpp index 265c121fc7..e8a69ee903 100644 --- a/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Util.cpp +++ b/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Util.cpp @@ -26,17 +26,8 @@ #include "../PPCTables.h" #include "x64Emitter.h" #include "ABI.h" - -#ifdef JITTEST -#include "../Jit64IL/Jit.h" -#include "JitCache.h" -#include "../Jit64IL/JitAsm.h" -#else -#include "../Jit64/Jit.h" -#include "JitCache.h" -#include "../Jit64/JitAsm.h" -#include "../Jit64/JitRegCache.h" -#endif +#include "JitBase.h" +#include "Jit_Util.h" using namespace Gen; @@ -191,7 +182,7 @@ void EmuCodeBlock::WriteFloatToConstRamAddress(const Gen::X64Reg& xmm_reg, u32 a void EmuCodeBlock::ForceSinglePrecisionS(X64Reg xmm) { // Most games don't need these. Zelda requires it though - some platforms get stuck without them. - if (jit.jo.accurateSinglePrecision) + if (jit->jo.accurateSinglePrecision) { CVTSD2SS(xmm, R(xmm)); CVTSS2SD(xmm, R(xmm)); @@ -200,7 +191,7 @@ void EmuCodeBlock::ForceSinglePrecisionS(X64Reg xmm) { void EmuCodeBlock::ForceSinglePrecisionP(X64Reg xmm) { // Most games don't need these. Zelda requires it though - some platforms get stuck without them. - if (jit.jo.accurateSinglePrecision) + if (jit->jo.accurateSinglePrecision) { CVTPD2PS(xmm, R(xmm)); CVTPS2PD(xmm, R(xmm)); diff --git a/Source/Core/Core/Src/PowerPC/PPCTables.cpp b/Source/Core/Core/Src/PowerPC/PPCTables.cpp index 9f8a5412fb..69f8c53dc7 100644 --- a/Source/Core/Core/Src/PowerPC/PPCTables.cpp +++ b/Source/Core/Core/Src/PowerPC/PPCTables.cpp @@ -24,13 +24,11 @@ #include "Interpreter/Interpreter.h" #include "Interpreter/Interpreter_Tables.h" #if !(defined(NOJIT) && NOJIT) -#include "JitCommon/Jit_Tables.h" +#include "Jit64IL/JitIL_Tables.h" +#include "Jit64/Jit64_Tables.h" -#if defined(_M_IX86) || defined(_M_X64) +#include "Jit64IL/JitIL.h" #include "Jit64/Jit.h" -#else -#error Unknown architecture! -#endif #endif struct op_inf @@ -156,13 +154,15 @@ bool UsesFPU(UGeckoInstruction _inst) return false; } } + void InitTables() { // Interpreter ALWAYS needs to be initialized InterpreterTables::InitTables(); #if !(defined(NOJIT) && NOJIT) // Should be able to do this a better way than defines in this function - JitTables::InitTables(); + Jit64Tables::InitTables(); + JitILTables::InitTables(); #endif } diff --git a/Source/Core/Core/Src/PowerPC/PowerPC.cpp b/Source/Core/Core/Src/PowerPC/PowerPC.cpp index 27103f7660..5d3b8db24b 100644 --- a/Source/Core/Core/Src/PowerPC/PowerPC.cpp +++ b/Source/Core/Core/Src/PowerPC/PowerPC.cpp @@ -27,6 +27,8 @@ #include "../CoreTiming.h" #include "Interpreter/Interpreter.h" +#include "JitCommon/JitBase.h" +#include "Jit64IL/JitIL.h" #include "Jit64/Jit.h" #include "PowerPC.h" #include "PPCTables.h" @@ -109,7 +111,7 @@ void ResetRegisters() rDEC = 0xFFFFFFFF; } -void Init() +void Init(int cpu_core) { enum { FPU_PREC_24 = 0 << 8, @@ -139,7 +141,12 @@ void Init() // Initialize both execution engines ... Interpreter::Init(); - jit.Init(); + + if (cpu_core == 1) + jit = new Jit64; + else + jit = new JitIL; + jit->Init(); // ... but start as interpreter by default. mode = MODE_INTERPRETER; state = CPU_STEPPING; @@ -150,7 +157,9 @@ void Init() void Shutdown() { // Shutdown both execution engines. Doesn't matter which one is active. - jit.Shutdown(); + jit->Shutdown(); + delete jit; + jit = 0; Interpreter::Shutdown(); } @@ -163,7 +172,7 @@ void SetMode(CoreMode new_mode) switch (mode) { case MODE_INTERPRETER: // Switching from JIT to interpreter - jit.ClearCache(); // Remove all those nasty JIT patches. + jit->ClearCache(); // Remove all those nasty JIT patches. break; case MODE_JIT: // Switching from interpreter to JIT. @@ -180,7 +189,7 @@ void SingleStep() Interpreter::SingleStep(); break; case MODE_JIT: - jit.SingleStep(); + jit->SingleStep(); break; } } @@ -194,7 +203,7 @@ void RunLoop() Interpreter::Run(); break; case MODE_JIT: - jit.Run(); + jit->Run(); break; } Host_UpdateDisasmDialog(); diff --git a/Source/Core/Core/Src/PowerPC/PowerPC.h b/Source/Core/Core/Src/PowerPC/PowerPC.h index 61595cb352..db6665e177 100644 --- a/Source/Core/Core/Src/PowerPC/PowerPC.h +++ b/Source/Core/Core/Src/PowerPC/PowerPC.h @@ -88,7 +88,7 @@ extern BreakPoints breakpoints; extern MemChecks memchecks; extern PPCDebugInterface debug_interface; -void Init(); +void Init(int cpu_core); void Shutdown(); void DoState(PointerWrap &p); diff --git a/Source/Core/Core/Src/PowerPC/Profiler.cpp b/Source/Core/Core/Src/PowerPC/Profiler.cpp index 14bb6400d4..b52d4e91b9 100644 --- a/Source/Core/Core/Src/PowerPC/Profiler.cpp +++ b/Source/Core/Core/Src/PowerPC/Profiler.cpp @@ -15,11 +15,15 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ -#include "Jit64/Jit.h" +#include "JitCommon/JitBase.h" #include #include +#ifdef _WIN32 +#include +#endif + #include "PPCSymbolDB.h" namespace Profiler @@ -41,19 +45,19 @@ struct BlockStat void WriteProfileResults(const char *filename) { std::vector stats; - stats.reserve(jit.GetBlockCache()->GetNumBlocks()); + stats.reserve(jit->GetBlockCache()->GetNumBlocks()); u64 cost_sum = 0; #ifdef _WIN32 u64 timecost_sum = 0; - LARGE_INTEGER countsPerSec; - QueryPerformanceFrequency(&countsPerSec); + u64 countsPerSec; + QueryPerformanceFrequency((LARGE_INTEGER *)&countsPerSec); #endif - for (int i = 0; i < jit.GetBlockCache()->GetNumBlocks(); i++) + for (int i = 0; i < jit->GetBlockCache()->GetNumBlocks(); i++) { - const JitBlock *block = jit.GetBlockCache()->GetBlock(i); + const JitBlock *block = jit->GetBlockCache()->GetBlock(i); u64 cost = (block->originalSize / 4) * block->runCount; // rough heuristic. mem instructions should cost more. #ifdef _WIN32 - u64 timecost = block->ticCounter.QuadPart; // Indeed ;) + u64 timecost = block->ticCounter; // Indeed ;) #endif if (block->runCount >= 1) { // Todo: tweak. stats.push_back(BlockStat(i, cost)); @@ -73,15 +77,15 @@ void WriteProfileResults(const char *filename) { fprintf(f, "origAddr\tblkName\tcost\ttimeCost\tpercent\ttimePercent\tOvAllinBlkTime(ms)\tblkCodeSize\n"); for (unsigned int i = 0; i < stats.size(); i++) { - const JitBlock *block = jit.GetBlockCache()->GetBlock(stats[i].blockNum); + const JitBlock *block = jit->GetBlockCache()->GetBlock(stats[i].blockNum); if (block) { std::string name = g_symbolDB.GetDescription(block->originalAddress); double percent = 100.0 * (double)stats[i].cost / (double)cost_sum; #ifdef _WIN32 - double timePercent = 100.0 * (double)block->ticCounter.QuadPart / (double)timecost_sum; + double timePercent = 100.0 * (double)block->ticCounter / (double)timecost_sum; fprintf(f, "%08x\t%s\t%llu\t%llu\t%.2lf\t%llf\t%lf\t%i\n", - block->originalAddress, name.c_str(), stats[i].cost, block->ticCounter.QuadPart, percent, timePercent, (double)block->ticCounter.QuadPart*1000.0/(double)countsPerSec.QuadPart, block->codeSize); + block->originalAddress, name.c_str(), stats[i].cost, block->ticCounter, percent, timePercent, (double)block->ticCounter*1000.0/(double)countsPerSec, block->codeSize); #else fprintf(f, "%08x\t%s\t%llu\t???\t%.2lf\t???\t???\t%i\n", block->originalAddress, name.c_str(), stats[i].cost, /*block->ticCounter.QuadPart,*/ percent, /*timePercent, (double)block->ticCounter.QuadPart*1000.0/(double)countsPerSec.QuadPart,*/ block->codeSize); diff --git a/Source/Core/Core/Src/PowerPC/Profiler.h b/Source/Core/Core/Src/PowerPC/Profiler.h index b05039ad20..e26c94ea5b 100644 --- a/Source/Core/Core/Src/PowerPC/Profiler.h +++ b/Source/Core/Core/Src/PowerPC/Profiler.h @@ -28,15 +28,15 @@ // TODO: r64 way // asm write : (u64) dt += t1-t0 #define PROFILER_ADD_DIFF_LARGE_INTEGER(pdt, pt1, pt0) \ - MOV(32, R(EAX), M(pt1.LowPart)); \ - SUB(32, R(EAX), M(pt0.LowPart)); \ - MOV(32, R(ECX), M(pt1.HighPart)); \ - SBB(32, R(ECX), M(pt0.HighPart)); \ - ADD(32, R(EAX), M(pdt.LowPart)); \ - MOV(32, R(EDX), M(pdt.HighPart)); \ + MOV(32, R(EAX), M(pt1)); \ + SUB(32, R(EAX), M(pt0)); \ + MOV(32, R(ECX), M(((u8*)pt1) + 4)); \ + SBB(32, R(ECX), M(((u8*)pt0) + 4)); \ + ADD(32, R(EAX), M(pdt)); \ + MOV(32, R(EDX), M(((u8*)pdt) + 4)); \ ADC(32, R(EDX), R(ECX)); \ - MOV(32, M(pdt.LowPart), R(EAX)); \ - MOV(32, M(pdt.HighPart), R(EDX)) + MOV(32, M(pdt), R(EAX)); \ + MOV(32, M(((u8*)pdt) + 4), R(EDX)) #define PROFILER_VPUSH PUSH(EAX);PUSH(ECX);PUSH(EDX) #define PROFILER_VPOP POP(EDX);POP(ECX);POP(EAX) diff --git a/Source/Core/Core/Src/SConscript b/Source/Core/Core/Src/SConscript index 16f95b4ce4..cd7c014394 100644 --- a/Source/Core/Core/Src/SConscript +++ b/Source/Core/Core/Src/SConscript @@ -90,13 +90,13 @@ files = ["ActionReplay.cpp", "PowerPC/JitCommon/JitAsmCommon.cpp", "PowerPC/JitCommon/JitCache.cpp", "PowerPC/JitCommon/JitBackpatch.cpp", + "PowerPC/JitCommon/JitBase.cpp", "PowerPC/JitCommon/Jit_Util.cpp", "HLE/HLE.cpp", "HLE/HLE_Misc.cpp", "HLE/HLE_OS.cpp", ] if not env['NOJIT']: - if env['JITTEST']: files += ["PowerPC/Jit64IL/Jit.cpp", "PowerPC/Jit64IL/JitAsm.cpp", "PowerPC/Jit64IL/Jit_Branch.cpp", @@ -109,9 +109,8 @@ if not env['NOJIT']: "PowerPC/Jit64IL/Jit_SystemRegisters.cpp", "PowerPC/Jit64IL/IR.cpp", "PowerPC/Jit64IL/IR_X86.cpp", - "PowerPC/JitCommon//Jit_Tables.cpp", + "PowerPC/Jit64IL/JitIL_Tables.cpp", ] - else: files += ["PowerPC/Jit64/Jit.cpp", "PowerPC/Jit64/JitRegCache.cpp", "PowerPC/Jit64/JitAsm.cpp", @@ -123,7 +122,7 @@ if not env['NOJIT']: "PowerPC/Jit64/Jit_LoadStore.cpp", "PowerPC/Jit64/Jit_LoadStoreFloating.cpp", "PowerPC/Jit64/Jit_SystemRegisters.cpp", - "PowerPC/JitCommon/Jit_Tables.cpp", + "PowerPC/Jit64/Jit64_Tables.cpp", ] if sys.platform == 'win32': diff --git a/Source/Core/Core/Src/State.cpp b/Source/Core/Core/Src/State.cpp index 703b726842..0e6ab8e017 100644 --- a/Source/Core/Core/Src/State.cpp +++ b/Source/Core/Core/Src/State.cpp @@ -24,11 +24,7 @@ #include "CoreTiming.h" #include "HW/HW.h" #include "PowerPC/PowerPC.h" -#ifdef JITTEST -#include "PowerPC/Jit64IL/Jit.h" -#else -#include "PowerPC/Jit64/Jit.h" -#endif +#include "PowerPC/JitCommon/JitBase.h" #include "PluginManager.h" @@ -97,9 +93,9 @@ void DoState(PointerWrap &p) HW::DoState(p); CoreTiming::DoState(p); #ifdef JIT_UNLIMITED_ICACHE - p.DoVoid(jit.GetBlockCache()->GetICache(), JIT_ICACHE_SIZE); - p.DoVoid(jit.GetBlockCache()->GetICacheEx(), JIT_ICACHEEX_SIZE); - p.DoVoid(jit.GetBlockCache()->GetICacheVMEM(), JIT_ICACHE_SIZE); + p.DoVoid(jit->GetBlockCache()->GetICache(), JIT_ICACHE_SIZE); + p.DoVoid(jit->GetBlockCache()->GetICacheEx(), JIT_ICACHEEX_SIZE); + p.DoVoid(jit->GetBlockCache()->GetICacheVMEM(), JIT_ICACHE_SIZE); #endif } @@ -110,7 +106,7 @@ void LoadBufferStateCallback(u64 userdata, int cyclesLate) return; } - jit.ClearCache(); + jit->ClearCache(); u8 *ptr = *cur_buffer; PointerWrap p(&ptr, PointerWrap::MODE_READ); @@ -129,7 +125,7 @@ void SaveBufferStateCallback(u64 userdata, int cyclesLate) return; } - jit.ClearCache(); + jit->ClearCache(); u8 *ptr = NULL; @@ -228,7 +224,7 @@ void SaveStateCallback(u64 userdata, int cyclesLate) saveThread = NULL; } - jit.ClearCache(); + jit->ClearCache(); // Measure the size of the buffer. u8 *ptr = 0; @@ -340,7 +336,7 @@ void LoadStateCallback(u64 userdata, int cyclesLate) fclose(f); - jit.ClearCache(); + jit->ClearCache(); u8 *ptr = buffer; PointerWrap p(&ptr, PointerWrap::MODE_READ); diff --git a/Source/Core/DebuggerWX/Src/CodeWindow.cpp b/Source/Core/DebuggerWX/Src/CodeWindow.cpp index 4d8aa10a41..36db64cc2e 100644 --- a/Source/Core/DebuggerWX/Src/CodeWindow.cpp +++ b/Source/Core/DebuggerWX/Src/CodeWindow.cpp @@ -54,7 +54,7 @@ #include "PowerPC/PPCSymbolDB.h" #include "PowerPC/SignatureDB.h" #include "PowerPC/PPCTables.h" -#include "PowerPC/Jit64/Jit.h" +#include "PowerPC/JitCommon/JitBase.h" #include "PowerPC/JitCommon/JitCache.h" // for ClearCache() #include "PluginManager.h" @@ -435,7 +435,7 @@ void CCodeWindow::CreateMenu(const SCoreStartupParameter& _LocalCoreStartupParam " and stepping to work as explained in the Developer Documentation. But it can be very" " slow, perhaps slower than 1 fps.") , wxITEM_CHECK); - interpreter->Check(!_LocalCoreStartupParameter.bUseJIT); + interpreter->Check(_LocalCoreStartupParameter.iCPUCore == 0); pCoreMenu->AppendSeparator(); jitblocklinking = pCoreMenu->Append(IDM_JITBLOCKLINKING, _T("&JIT Block Linking off"), @@ -551,7 +551,7 @@ void CCodeWindow::OnCPUMode(wxCommandEvent& event) } // Clear the JIT cache to enable these changes - jit.ClearCache(); + jit->ClearCache(); // Update UpdateButtonStates(); } @@ -563,7 +563,7 @@ void CCodeWindow::OnJitMenu(wxCommandEvent& event) PPCTables::LogCompiledInstructions(); break; case IDM_CLEARCODECACHE: - jit.ClearCache(); break; + jit->ClearCache(); break; case IDM_SEARCHINSTRUCTION: { diff --git a/Source/Core/DebuggerWX/Src/CodeWindowFunctions.cpp b/Source/Core/DebuggerWX/Src/CodeWindowFunctions.cpp index 8c785fa0b8..4588fdb05c 100644 --- a/Source/Core/DebuggerWX/Src/CodeWindowFunctions.cpp +++ b/Source/Core/DebuggerWX/Src/CodeWindowFunctions.cpp @@ -61,7 +61,7 @@ #include "PowerPC/PPCSymbolDB.h" #include "PowerPC/SignatureDB.h" #include "PowerPC/PPCTables.h" -#include "PowerPC/Jit64/Jit.h" +#include "PowerPC/JitCommon/JitBase.h" #include "PowerPC/JitCommon/JitCache.h" // for ClearCache() #include "PluginManager.h" @@ -221,7 +221,7 @@ void CCodeWindow::OnProfilerMenu(wxCommandEvent& event) switch (event.GetId()) { case IDM_PROFILEBLOCKS: - jit.ClearCache(); + jit->ClearCache(); Profiler::g_ProfileBlocks = GetMenuBar()->IsChecked(IDM_PROFILEBLOCKS); break; case IDM_WRITEPROFILE: diff --git a/Source/Core/DebuggerWX/Src/JitWindow.cpp b/Source/Core/DebuggerWX/Src/JitWindow.cpp index c3543140e4..190a410aa4 100644 --- a/Source/Core/DebuggerWX/Src/JitWindow.cpp +++ b/Source/Core/DebuggerWX/Src/JitWindow.cpp @@ -27,11 +27,7 @@ #include "JitWindow.h" #include "HW/CPU.h" #include "PowerPC/PowerPC.h" -#if JITTEST -#include "PowerPC/Jit64/Jit.h" -#else -#include "PowerPC/Jit64IL/Jit.h" -#endif +#include "PowerPC/JitCommon/JitBase.h" #include "PowerPC/JitCommon/JitCache.h" #include "PowerPC/PPCAnalyst.h" #include "PowerPCDisasm.h" @@ -130,16 +126,16 @@ void CJitWindow::Compare(u32 em_address) disassembler x64disasm; x64disasm.set_syntax_intel(); - int block_num = jit.GetBlockCache()->GetBlockNumberFromStartAddress(em_address); + int block_num = jit->GetBlockCache()->GetBlockNumberFromStartAddress(em_address); if (block_num < 0) { for (int i = 0; i < 500; i++) { - block_num = jit.GetBlockCache()->GetBlockNumberFromStartAddress(em_address - 4 * i); + block_num = jit->GetBlockCache()->GetBlockNumberFromStartAddress(em_address - 4 * i); if (block_num >= 0) break; } if (block_num >= 0) { - JitBlock *block = jit.GetBlockCache()->GetBlock(block_num); + JitBlock *block = jit->GetBlockCache()->GetBlock(block_num); if (!(block->originalAddress <= em_address && block->originalSize + block->originalAddress >= em_address)) block_num = -1; } @@ -150,12 +146,12 @@ void CJitWindow::Compare(u32 em_address) return; } } - JitBlock *block = jit.GetBlockCache()->GetBlock(block_num); + JitBlock *block = jit->GetBlockCache()->GetBlock(block_num); // 800031f0 // == Fill in x86 box - const u8 *code = (const u8 *)jit.GetBlockCache()->GetCompiledCodeFromBlock(block_num); + const u8 *code = (const u8 *)jit->GetBlockCache()->GetCompiledCodeFromBlock(block_num); u64 disasmPtr = (u64)code; int size = block->codeSize; const u8 *end = code + size; diff --git a/Source/Core/DolphinWX/DolphinWX.vcproj b/Source/Core/DolphinWX/DolphinWX.vcproj index 0af4eef3e1..2919540d26 100644 --- a/Source/Core/DolphinWX/DolphinWX.vcproj +++ b/Source/Core/DolphinWX/DolphinWX.vcproj @@ -700,122 +700,6 @@ ExcludedFromBuild="false" /> - - - - - - - - - - - - - - - - - - - - - - @@ -1281,15 +1156,6 @@ ForcedIncludeFiles="$(NOINHERIT)" /> - - - @@ -1357,15 +1223,6 @@ ForcedIncludeFiles="$(NOINHERIT)" /> - - - @@ -1441,15 +1298,6 @@ ForcedIncludeFiles="$(NOINHERIT)" /> - - - @@ -1495,14 +1343,6 @@ WarnAsError="false" /> - - - - - - - - - diff --git a/Source/Core/DolphinWX/Src/BootManager.cpp b/Source/Core/DolphinWX/Src/BootManager.cpp index 10bef0d7bd..883742aedb 100644 --- a/Source/Core/DolphinWX/Src/BootManager.cpp +++ b/Source/Core/DolphinWX/Src/BootManager.cpp @@ -82,7 +82,7 @@ bool BootCore(const std::string& _rFilename) if (main_frame->g_pCodeWindow) { //StartUp.bCPUThread = code_frame->UseDualCore(); - StartUp.bUseJIT = !main_frame->g_pCodeWindow->UseInterpreter(); + StartUp.iCPUCore = !main_frame->g_pCodeWindow->UseInterpreter(); StartUp.bBootToPause = main_frame->g_pCodeWindow->BootToPause(); StartUp.bAutomaticStart = main_frame->g_pCodeWindow->AutomaticStart(); StartUp.bJITUnlimitedCache = main_frame->g_pCodeWindow->UnlimitedJITCache(); diff --git a/Source/Core/DolphinWX/Src/ConfigMain.cpp b/Source/Core/DolphinWX/Src/ConfigMain.cpp index 2abeab78eb..0c35829390 100644 --- a/Source/Core/DolphinWX/Src/ConfigMain.cpp +++ b/Source/Core/DolphinWX/Src/ConfigMain.cpp @@ -29,7 +29,6 @@ #include "SysConf.h" #include "Frame.h" - extern CFrame* main_frame; // Strings for Device Selections @@ -45,7 +44,6 @@ extern CFrame* main_frame; #define EXIDEV_BBA_STR "BBA" #define EXIDEV_AM_BB_STR "AM-Baseboard" - BEGIN_EVENT_TABLE(CConfigMain, wxDialog) EVT_CLOSE(CConfigMain::OnClose) @@ -62,6 +60,7 @@ EVT_CHOICE(ID_INTERFACE_LANG, CConfigMain::CoreSettingsChanged) EVT_CHECKBOX(ID_ALWAYS_HLE_BS2, CConfigMain::CoreSettingsChanged) EVT_RADIOBUTTON(ID_RADIOJIT, CConfigMain::CoreSettingsChanged) +EVT_RADIOBUTTON(ID_RADIOJITIL, CConfigMain::CoreSettingsChanged) EVT_RADIOBUTTON(ID_RADIOINT, CConfigMain::CoreSettingsChanged) EVT_CHECKBOX(ID_CPUTHREAD, CConfigMain::CoreSettingsChanged) EVT_CHECKBOX(ID_DSPTHREAD, CConfigMain::CoreSettingsChanged) @@ -128,7 +127,6 @@ CConfigMain::~CConfigMain() { } - // Used to restrict changing of some options while emulator is running void CConfigMain::UpdateGUI() { @@ -183,7 +181,7 @@ void CConfigMain::CreateGUIControls() // Framelimit arrayStringFor_Framelimit.Add(wxT("Off")); arrayStringFor_Framelimit.Add(wxT("Auto")); - for (int i = 20; i <= 120; i+=10) // from 20 to 120 + for (int i = 20; i <= 120; i += 10) // from 20 to 120 arrayStringFor_Framelimit.Add(wxString::Format(wxT("%i"), i)); // Create the notebook and pages @@ -200,8 +198,6 @@ void CConfigMain::CreateGUIControls() Notebook->AddPage(PathsPage, wxT("Paths")); Notebook->AddPage(PluginPage, wxT("Plugins")); - - // General page // Core Settings - Basic @@ -222,9 +218,14 @@ void CConfigMain::CreateGUIControls() // AlwaysHLE_BS2 = new wxCheckBox(GeneralPage, ID_ALWAYS_HLE_BS2, wxT("HLE the IPL (recommended)"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); AlwaysHLE_BS2->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bHLE_BS2); - m_RadioJIT = new wxRadioButton(GeneralPage, ID_RADIOJIT, wxT("JIT Recompiler (recommended)")); - m_RadioInt = new wxRadioButton(GeneralPage, ID_RADIOINT, wxT("Interpreter (very slow)")); - SConfig::GetInstance().m_LocalCoreStartupParameter.bUseJIT ? m_RadioJIT->SetValue(true) : m_RadioInt->SetValue(true); + m_RadioJIT = new wxRadioButton(GeneralPage, ID_RADIOJIT, wxT("JIT recompiler (recommended)")); + m_RadioJITIL = new wxRadioButton(GeneralPage, ID_RADIOJITIL, wxT("JitIL experimental recompiler")); + m_RadioInt = new wxRadioButton(GeneralPage, ID_RADIOINT, wxT("Interpreter (VERY slow)")); + switch (SConfig::GetInstance().m_LocalCoreStartupParameter.iCPUCore) { + case 0: m_RadioInt->SetValue(true); break; + case 1: m_RadioJIT->SetValue(true); break; + case 2: m_RadioJITIL->SetValue(true); break; + } LockThreads = new wxCheckBox(GeneralPage, ID_LOCKTHREADS, wxT("Lock threads to cores"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); LockThreads->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bLockThreads); DSPThread = new wxCheckBox(GeneralPage, ID_DSPTHREAD, wxT("DSP on thread (recommended)"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); @@ -310,6 +311,7 @@ void CConfigMain::CreateGUIControls() sbAdvanced->Add(AlwaysHLE_BS2, 0, wxALL, 5); wxStaticBoxSizer* sizerCoreType = new wxStaticBoxSizer(wxVERTICAL, GeneralPage, wxT("CPU Emulator Engine")); sizerCoreType->Add(m_RadioJIT, 0, wxALL | wxEXPAND, 5); + sizerCoreType->Add(m_RadioJITIL, 0, wxALL | wxEXPAND, 5); sizerCoreType->Add(m_RadioInt, 0, wxALL | wxEXPAND, 5); sbAdvanced->Add(sizerCoreType, 0, wxALL, 5); sbAdvanced->Add(LockThreads, 0, wxALL, 5); @@ -689,11 +691,15 @@ void CConfigMain::CoreSettingsChanged(wxCommandEvent& event) SConfig::GetInstance().m_LocalCoreStartupParameter.bHLE_BS2 = AlwaysHLE_BS2->IsChecked(); break; case ID_RADIOJIT: - SConfig::GetInstance().m_LocalCoreStartupParameter.bUseJIT = true; + SConfig::GetInstance().m_LocalCoreStartupParameter.iCPUCore = 1; + if (main_frame->g_pCodeWindow) main_frame->g_pCodeWindow->GetMenuBar()->Check(IDM_INTERPRETER, false); + break; + case ID_RADIOJITIL: + SConfig::GetInstance().m_LocalCoreStartupParameter.iCPUCore = 2; if (main_frame->g_pCodeWindow) main_frame->g_pCodeWindow->GetMenuBar()->Check(IDM_INTERPRETER, false); break; case ID_RADIOINT: - SConfig::GetInstance().m_LocalCoreStartupParameter.bUseJIT = false; + SConfig::GetInstance().m_LocalCoreStartupParameter.iCPUCore = 0; if (main_frame->g_pCodeWindow) main_frame->g_pCodeWindow->GetMenuBar()->Check(IDM_INTERPRETER, true); break; case ID_CPUTHREAD: @@ -974,15 +980,12 @@ void CConfigMain::OnConfig(wxCommandEvent& event) case ID_GRAPHIC_CONFIG: CallConfig(GraphicSelection); break; - case ID_DSP_CONFIG: CallConfig(DSPSelection); break; - case ID_PAD_CONFIG: CallConfig(PADSelection); break; - case ID_WIIMOTE_CONFIG: CallConfig(WiimoteSelection); break; @@ -993,11 +996,9 @@ void CConfigMain::CallConfig(wxChoice* _pChoice) { int Index = _pChoice->GetSelection(); INFO_LOG(CONSOLE, "CallConfig: %i\n", Index); - if (Index >= 0) { const CPluginInfo* pInfo = static_cast(_pChoice->GetClientData(Index)); - if (pInfo != NULL) CPluginManager::GetInstance().OpenConfig((HWND) this->GetHandle(), pInfo->GetFilename().c_str(), pInfo->GetPluginInfo().Type); } @@ -1034,7 +1035,6 @@ bool CConfigMain::GetFilename(wxChoice* _pChoice, std::string& _rFilename) { _rFilename.clear(); int Index = _pChoice->GetSelection(); - if (Index >= 0) { const CPluginInfo* pInfo = static_cast(_pChoice->GetClientData(Index)); diff --git a/Source/Core/DolphinWX/Src/ConfigMain.h b/Source/Core/DolphinWX/Src/ConfigMain.h index 584aec8640..36f31456df 100644 --- a/Source/Core/DolphinWX/Src/ConfigMain.h +++ b/Source/Core/DolphinWX/Src/ConfigMain.h @@ -63,8 +63,9 @@ private: wxBoxSizer* sCore; wxStaticBoxSizer* sbBasic, *sbAdvanced, *sbInterface; wxCheckBox* AlwaysHLE_BS2; - wxRadioButton* m_RadioJIT; wxRadioButton* m_RadioInt; + wxRadioButton* m_RadioJIT; + wxRadioButton* m_RadioJITIL; wxCheckBox* CPUThread; wxCheckBox* DSPThread; wxCheckBox* LockThreads; @@ -160,6 +161,7 @@ private: ID_ALWAYS_HLE_BS2, ID_RADIOJIT, + ID_RADIOJITIL, ID_RADIOINT, ID_CPUTHREAD, ID_DSPTHREAD, diff --git a/Source/Core/DolphinWX/Src/Frame.cpp b/Source/Core/DolphinWX/Src/Frame.cpp index 5e8f2389f8..2fcbbbd06e 100644 --- a/Source/Core/DolphinWX/Src/Frame.cpp +++ b/Source/Core/DolphinWX/Src/Frame.cpp @@ -39,6 +39,7 @@ #include "AboutDolphin.h" #include "GameListCtrl.h" #include "BootManager.h" +#include "ConsoleListener.h" #include "ConfigManager.h" // Core #include "Core.h" diff --git a/Source/Core/DolphinWX/Src/FrameAui.cpp b/Source/Core/DolphinWX/Src/FrameAui.cpp index a51196dc2a..26575133f7 100644 --- a/Source/Core/DolphinWX/Src/FrameAui.cpp +++ b/Source/Core/DolphinWX/Src/FrameAui.cpp @@ -40,6 +40,7 @@ #include "WxUtils.h" #include "ConfigManager.h" // Core +#include "ConsoleListener.h" #include "Core.h" #include "OnFrame.h" #include "HW/DVDInterface.h" diff --git a/Source/Core/DolphinWX/Src/LogWindow.cpp b/Source/Core/DolphinWX/Src/LogWindow.cpp index ea3bc012ad..d295d89e95 100644 --- a/Source/Core/DolphinWX/Src/LogWindow.cpp +++ b/Source/Core/DolphinWX/Src/LogWindow.cpp @@ -25,8 +25,10 @@ #include "Core.h" // for Core::GetState() #include "LogWindow.h" +#include "ConsoleListener.h" #include "Console.h" + // Milliseconds between msgQueue flushes to wxTextCtrl #define UPDATETIME 200 diff --git a/Source/Core/VideoCommon/Src/TextureDecoder.cpp b/Source/Core/VideoCommon/Src/TextureDecoder.cpp index fe5fd1127e..45ebaedbc6 100644 --- a/Source/Core/VideoCommon/Src/TextureDecoder.cpp +++ b/Source/Core/VideoCommon/Src/TextureDecoder.cpp @@ -283,7 +283,6 @@ inline void decodebytesC8_To_Raw16(u16* dst, const u8* src, int tlutaddr) } -//inline void decodebytesC14X2(u32 *dst, const u16 *src, int numpixels, int tlutaddr, int tlutfmt) inline void decodebytesC14X2_5A3_To_BGRA32(u32 *dst, const u16 *src, int tlutaddr) { u16 *tlut = (u16*)(texMem + tlutaddr); @@ -304,7 +303,7 @@ inline void decodebytesC14X2_To_Raw16(u16* dst, const u16* src, int tlutaddr) } } -//inline void decodebytesIA4(u16 *dst, const u8 *src, int numbytes) +// Needs more speed. inline void decodebytesIA4(u16 *dst, const u8 *src) { for (int x = 0; x < 8; x++) @@ -316,7 +315,6 @@ inline void decodebytesIA4(u16 *dst, const u8 *src) } } -//inline void decodebytesRGB5A3(u32 *dst, const u16 *src, int numpixels) inline void decodebytesRGB5A3(u32 *dst, const u16 *src) { for (int x = 0; x < 4; x++) @@ -324,6 +322,7 @@ inline void decodebytesRGB5A3(u32 *dst, const u16 *src) } // This one is used by many video formats. It'd therefore be good if it was fast. +// Needs more speed. inline void decodebytesARGB8_4(u32 *dst, const u16 *src, const u16 *src2) { for (int x = 0; x < 4; x++) { @@ -352,6 +351,7 @@ inline u32 makeRGBA(int r, int g, int b, int a) void decodeDXTBlock(u32 *dst, const DXTBlock *src, int pitch) { // S3TC Decoder (Note: GCN decodes differently from PC so we can't use native support) + // Needs more speed. u16 c1 = Common::swap16(src->color1); u16 c2 = Common::swap16(src->color2); int blue1 = Convert5To8(c1 & 0x1F); @@ -523,7 +523,7 @@ PC_TexFormat TexDecoder_DirectDecode_real(u8 *dst, const u8 *src, int width, int } } return PC_TEX_FMT_IA8; - case GX_TF_I8: // speed critical + case GX_TF_I8: // speed critical. Needs speed. { for (int y = 0; y < height; y += 4) for (int x = 0; x < width; x += 8) @@ -531,7 +531,7 @@ PC_TexFormat TexDecoder_DirectDecode_real(u8 *dst, const u8 *src, int width, int for (int ix = 0; ix < 8; ix++,src++) { int stride = (y + iy)*Pitch+(x + ix) * 2; - if(stride < TexLen) + if (stride < TexLen) { dst[stride] = src[0]; dst[stride + 1] = src[0]; @@ -714,13 +714,14 @@ PC_TexFormat TexDecoder_DirectDecode_real(u8 *dst, const u8 *src, int width, int case GX_TF_RGBA8: // speed critical { for (int y = 0; y < height; y += 4) + { for (int x = 0; x < width; x += 4) { for (int iy = 0; iy < 4 && (y + iy) < height; iy++) { //decodebytesARGB8_4(((u32*)((u8*)dst + (y+iy)*Pitch)) + x, (u16*)src + 4 * iy, (u16*)src + 4 * iy + 16); - u16 *src1 = (u16*)src + 4 * iy; - u16 *src2 = (u16*)src + 4 * iy + 16; + u16 *src1 = (u16*)src + 4 * iy; + u16 *src2 = (u16*)src + 4 * iy + 16; for (int ix = 0; ix < 4; ix++) { int stride = (y+iy)*Pitch + (x + ix) * 4; @@ -734,8 +735,10 @@ PC_TexFormat TexDecoder_DirectDecode_real(u8 *dst, const u8 *src, int width, int } src += 64; } + } } return PC_TEX_FMT_BGRA32; + case GX_TF_CMPR: // speed critical // The metroid games use this format almost exclusively. { @@ -760,17 +763,17 @@ PC_TexFormat TexDecoder_DirectDecode_real(u8 *dst, const u8 *src, int width, int #else for (int y = 0; y < height; y += 8) { - for (int x = 0; x < width; x += 8) - { - decodeDXTBlock(((u32*)((u8*)dst + y * Pitch)) + x, (DXTBlock*)src, width); - src += sizeof(DXTBlock); - decodeDXTBlock(((u32*)((u8*)dst + y * Pitch)) + x + 4, (DXTBlock*)src, width); - src += sizeof(DXTBlock); - decodeDXTBlock(((u32*)((u8*)dst + (y + 4) * Pitch)) + x, (DXTBlock*)src, width); - src += sizeof(DXTBlock); - decodeDXTBlock(((u32*)((u8*)dst + (y + 4) * Pitch)) + x + 4, (DXTBlock*)src, width); - src += sizeof(DXTBlock); - } + for (int x = 0; x < width; x += 8) + { + decodeDXTBlock(((u32*)((u8*)dst + y * Pitch)) + x, (DXTBlock *)src, width); + src += sizeof(DXTBlock); + decodeDXTBlock(((u32*)((u8*)dst + y * Pitch)) + x + 4, (DXTBlock *)src, width); + src += sizeof(DXTBlock); + decodeDXTBlock(((u32*)((u8*)dst + (y + 4) * Pitch)) + x, (DXTBlock *)src, width); + src += sizeof(DXTBlock); + decodeDXTBlock(((u32*)((u8*)dst + (y + 4) * Pitch)) + x + 4, (DXTBlock *)src, width); + src += sizeof(DXTBlock); + } } #endif return PC_TEX_FMT_BGRA32; diff --git a/Source/Dolphin.sln b/Source/Dolphin.sln index 33b0ecf4bf..7ceab2933f 100644 --- a/Source/Dolphin.sln +++ b/Source/Dolphin.sln @@ -206,8 +206,6 @@ Global Debug|x64 = Debug|x64 DebugFast|Win32 = DebugFast|Win32 DebugFast|x64 = DebugFast|x64 - Release_JITIL|Win32 = Release_JITIL|Win32 - Release_JITIL|x64 = Release_JITIL|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection @@ -220,10 +218,6 @@ Global {F0B874CB-4476-4199-9315-8343D05AE684}.DebugFast|Win32.Build.0 = DebugFast|Win32 {F0B874CB-4476-4199-9315-8343D05AE684}.DebugFast|x64.ActiveCfg = DebugFast|x64 {F0B874CB-4476-4199-9315-8343D05AE684}.DebugFast|x64.Build.0 = DebugFast|x64 - {F0B874CB-4476-4199-9315-8343D05AE684}.Release_JITIL|Win32.ActiveCfg = Release_JITIL|Win32 - {F0B874CB-4476-4199-9315-8343D05AE684}.Release_JITIL|Win32.Build.0 = Release_JITIL|Win32 - {F0B874CB-4476-4199-9315-8343D05AE684}.Release_JITIL|x64.ActiveCfg = Release_JITIL|x64 - {F0B874CB-4476-4199-9315-8343D05AE684}.Release_JITIL|x64.Build.0 = Release_JITIL|x64 {F0B874CB-4476-4199-9315-8343D05AE684}.Release|Win32.ActiveCfg = Release|Win32 {F0B874CB-4476-4199-9315-8343D05AE684}.Release|Win32.Build.0 = Release|Win32 {F0B874CB-4476-4199-9315-8343D05AE684}.Release|x64.ActiveCfg = Release|x64 @@ -236,10 +230,6 @@ Global {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.DebugFast|Win32.Build.0 = DebugFast|Win32 {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.DebugFast|x64.ActiveCfg = DebugFast|x64 {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.DebugFast|x64.Build.0 = DebugFast|x64 - {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Release_JITIL|Win32.Build.0 = Release|Win32 - {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Release_JITIL|x64.ActiveCfg = Release|x64 - {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Release_JITIL|x64.Build.0 = Release|x64 {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Release|Win32.ActiveCfg = Release|Win32 {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Release|Win32.Build.0 = Release|Win32 {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Release|x64.ActiveCfg = Release|x64 @@ -252,10 +242,6 @@ Global {9A183B48-ECC2-4121-876A-9B3793686073}.DebugFast|Win32.Build.0 = DebugFast|Win32 {9A183B48-ECC2-4121-876A-9B3793686073}.DebugFast|x64.ActiveCfg = DebugFast|x64 {9A183B48-ECC2-4121-876A-9B3793686073}.DebugFast|x64.Build.0 = DebugFast|x64 - {9A183B48-ECC2-4121-876A-9B3793686073}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {9A183B48-ECC2-4121-876A-9B3793686073}.Release_JITIL|Win32.Build.0 = Release|Win32 - {9A183B48-ECC2-4121-876A-9B3793686073}.Release_JITIL|x64.ActiveCfg = Release|x64 - {9A183B48-ECC2-4121-876A-9B3793686073}.Release_JITIL|x64.Build.0 = Release|x64 {9A183B48-ECC2-4121-876A-9B3793686073}.Release|Win32.ActiveCfg = Release|Win32 {9A183B48-ECC2-4121-876A-9B3793686073}.Release|Win32.Build.0 = Release|Win32 {9A183B48-ECC2-4121-876A-9B3793686073}.Release|x64.ActiveCfg = Release|x64 @@ -268,10 +254,6 @@ Global {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.DebugFast|Win32.Build.0 = Release|Win32 {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.DebugFast|x64.ActiveCfg = Release|x64 {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.DebugFast|x64.Build.0 = Release|x64 - {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Release_JITIL|Win32.Build.0 = Release|Win32 - {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Release_JITIL|x64.ActiveCfg = Release|x64 - {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Release_JITIL|x64.Build.0 = Release|x64 {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Release|Win32.ActiveCfg = Release|Win32 {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Release|Win32.Build.0 = Release|Win32 {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Release|x64.ActiveCfg = Release|x64 @@ -284,10 +266,6 @@ Global {3E03C179-8251-46E4-81F4-466F114BAC63}.DebugFast|Win32.Build.0 = Release|Win32 {3E03C179-8251-46E4-81F4-466F114BAC63}.DebugFast|x64.ActiveCfg = Release|x64 {3E03C179-8251-46E4-81F4-466F114BAC63}.DebugFast|x64.Build.0 = Release|x64 - {3E03C179-8251-46E4-81F4-466F114BAC63}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {3E03C179-8251-46E4-81F4-466F114BAC63}.Release_JITIL|Win32.Build.0 = Release|Win32 - {3E03C179-8251-46E4-81F4-466F114BAC63}.Release_JITIL|x64.ActiveCfg = Release|x64 - {3E03C179-8251-46E4-81F4-466F114BAC63}.Release_JITIL|x64.Build.0 = Release|x64 {3E03C179-8251-46E4-81F4-466F114BAC63}.Release|Win32.ActiveCfg = Release|Win32 {3E03C179-8251-46E4-81F4-466F114BAC63}.Release|Win32.Build.0 = Release|Win32 {3E03C179-8251-46E4-81F4-466F114BAC63}.Release|x64.ActiveCfg = Release|x64 @@ -300,10 +278,6 @@ Global {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.DebugFast|Win32.Build.0 = DebugFast|Win32 {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.DebugFast|x64.ActiveCfg = DebugFast|x64 {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.DebugFast|x64.Build.0 = DebugFast|x64 - {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Release_JITIL|Win32.Build.0 = Release|Win32 - {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Release_JITIL|x64.ActiveCfg = Release|x64 - {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Release_JITIL|x64.Build.0 = Release|x64 {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Release|Win32.ActiveCfg = Release|Win32 {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Release|Win32.Build.0 = Release|Win32 {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Release|x64.ActiveCfg = Release|x64 @@ -316,10 +290,6 @@ Global {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.DebugFast|Win32.Build.0 = DebugFast|Win32 {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.DebugFast|x64.ActiveCfg = DebugFast|x64 {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.DebugFast|x64.Build.0 = DebugFast|x64 - {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Release_JITIL|Win32.Build.0 = Release|Win32 - {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Release_JITIL|x64.ActiveCfg = Release|x64 - {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Release_JITIL|x64.Build.0 = Release|x64 {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Release|Win32.ActiveCfg = Release|Win32 {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Release|Win32.Build.0 = Release|Win32 {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Release|x64.ActiveCfg = Release|x64 @@ -332,10 +302,6 @@ Global {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.DebugFast|Win32.Build.0 = DebugFast|Win32 {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.DebugFast|x64.ActiveCfg = DebugFast|x64 {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.DebugFast|x64.Build.0 = DebugFast|x64 - {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Release_JITIL|Win32.Build.0 = Release|Win32 - {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Release_JITIL|x64.ActiveCfg = Release|x64 - {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Release_JITIL|x64.Build.0 = Release|x64 {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Release|Win32.ActiveCfg = Release|Win32 {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Release|Win32.Build.0 = Release|Win32 {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Release|x64.ActiveCfg = Release|x64 @@ -348,10 +314,6 @@ Global {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.DebugFast|Win32.Build.0 = DebugFast|Win32 {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.DebugFast|x64.ActiveCfg = DebugFast|x64 {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.DebugFast|x64.Build.0 = DebugFast|x64 - {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Release_JITIL|Win32.ActiveCfg = Release_JITIL|Win32 - {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Release_JITIL|Win32.Build.0 = Release_JITIL|Win32 - {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Release_JITIL|x64.ActiveCfg = Release_JITIL|x64 - {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Release_JITIL|x64.Build.0 = Release_JITIL|x64 {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Release|Win32.ActiveCfg = Release|Win32 {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Release|Win32.Build.0 = Release|Win32 {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Release|x64.ActiveCfg = Release|x64 @@ -364,10 +326,6 @@ Global {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.DebugFast|Win32.Build.0 = DebugFast|Win32 {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.DebugFast|x64.ActiveCfg = DebugFast|x64 {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.DebugFast|x64.Build.0 = DebugFast|x64 - {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Release_JITIL|Win32.Build.0 = Release|Win32 - {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Release_JITIL|x64.ActiveCfg = Release|x64 - {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Release_JITIL|x64.Build.0 = Release|x64 {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Release|Win32.ActiveCfg = Release|Win32 {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Release|Win32.Build.0 = Release|Win32 {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Release|x64.ActiveCfg = Release|x64 @@ -380,10 +338,6 @@ Global {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.DebugFast|Win32.Build.0 = DebugFast|Win32 {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.DebugFast|x64.ActiveCfg = DebugFast|x64 {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.DebugFast|x64.Build.0 = DebugFast|x64 - {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.Release_JITIL|Win32.Build.0 = Release|Win32 - {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.Release_JITIL|x64.ActiveCfg = Release|x64 - {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.Release_JITIL|x64.Build.0 = Release|x64 {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.Release|Win32.ActiveCfg = Release|Win32 {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.Release|Win32.Build.0 = Release|Win32 {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.Release|x64.ActiveCfg = Release|x64 @@ -396,10 +350,6 @@ Global {521498BE-6089-4780-8223-E67C22F4E068}.DebugFast|Win32.Build.0 = DebugFast|Win32 {521498BE-6089-4780-8223-E67C22F4E068}.DebugFast|x64.ActiveCfg = DebugFast|x64 {521498BE-6089-4780-8223-E67C22F4E068}.DebugFast|x64.Build.0 = DebugFast|x64 - {521498BE-6089-4780-8223-E67C22F4E068}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {521498BE-6089-4780-8223-E67C22F4E068}.Release_JITIL|Win32.Build.0 = Release|Win32 - {521498BE-6089-4780-8223-E67C22F4E068}.Release_JITIL|x64.ActiveCfg = Release|x64 - {521498BE-6089-4780-8223-E67C22F4E068}.Release_JITIL|x64.Build.0 = Release|x64 {521498BE-6089-4780-8223-E67C22F4E068}.Release|Win32.ActiveCfg = Release|Win32 {521498BE-6089-4780-8223-E67C22F4E068}.Release|Win32.Build.0 = Release|Win32 {521498BE-6089-4780-8223-E67C22F4E068}.Release|x64.ActiveCfg = Release|x64 @@ -412,10 +362,6 @@ Global {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.DebugFast|Win32.Build.0 = DebugFast|Win32 {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.DebugFast|x64.ActiveCfg = DebugFast|x64 {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.DebugFast|x64.Build.0 = DebugFast|x64 - {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Release_JITIL|Win32.Build.0 = Release|Win32 - {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Release_JITIL|x64.ActiveCfg = Release|x64 - {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Release_JITIL|x64.Build.0 = Release|x64 {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Release|Win32.ActiveCfg = Release|Win32 {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Release|Win32.Build.0 = Release|Win32 {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Release|x64.ActiveCfg = Release|x64 @@ -428,10 +374,6 @@ Global {33546D62-7F34-4EA6-A88E-D538B36E16BF}.DebugFast|Win32.Build.0 = Release|Win32 {33546D62-7F34-4EA6-A88E-D538B36E16BF}.DebugFast|x64.ActiveCfg = Release|x64 {33546D62-7F34-4EA6-A88E-D538B36E16BF}.DebugFast|x64.Build.0 = Release|x64 - {33546D62-7F34-4EA6-A88E-D538B36E16BF}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {33546D62-7F34-4EA6-A88E-D538B36E16BF}.Release_JITIL|Win32.Build.0 = Release|Win32 - {33546D62-7F34-4EA6-A88E-D538B36E16BF}.Release_JITIL|x64.ActiveCfg = Release|x64 - {33546D62-7F34-4EA6-A88E-D538B36E16BF}.Release_JITIL|x64.Build.0 = Release|x64 {33546D62-7F34-4EA6-A88E-D538B36E16BF}.Release|Win32.ActiveCfg = Release|Win32 {33546D62-7F34-4EA6-A88E-D538B36E16BF}.Release|Win32.Build.0 = Release|Win32 {33546D62-7F34-4EA6-A88E-D538B36E16BF}.Release|x64.ActiveCfg = Release|x64 @@ -444,10 +386,6 @@ Global {8D612734-FAA5-4B8A-804F-4DEA2367D495}.DebugFast|Win32.Build.0 = DebugFast|Win32 {8D612734-FAA5-4B8A-804F-4DEA2367D495}.DebugFast|x64.ActiveCfg = DebugFast|x64 {8D612734-FAA5-4B8A-804F-4DEA2367D495}.DebugFast|x64.Build.0 = DebugFast|x64 - {8D612734-FAA5-4B8A-804F-4DEA2367D495}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {8D612734-FAA5-4B8A-804F-4DEA2367D495}.Release_JITIL|Win32.Build.0 = Release|Win32 - {8D612734-FAA5-4B8A-804F-4DEA2367D495}.Release_JITIL|x64.ActiveCfg = Release|x64 - {8D612734-FAA5-4B8A-804F-4DEA2367D495}.Release_JITIL|x64.Build.0 = Release|x64 {8D612734-FAA5-4B8A-804F-4DEA2367D495}.Release|Win32.ActiveCfg = Release|Win32 {8D612734-FAA5-4B8A-804F-4DEA2367D495}.Release|Win32.Build.0 = Release|Win32 {8D612734-FAA5-4B8A-804F-4DEA2367D495}.Release|x64.ActiveCfg = Release|x64 @@ -460,10 +398,6 @@ Global {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.DebugFast|Win32.Build.0 = DebugFast|Win32 {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.DebugFast|x64.ActiveCfg = DebugFast|x64 {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.DebugFast|x64.Build.0 = DebugFast|x64 - {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Release_JITIL|Win32.Build.0 = Release|Win32 - {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Release_JITIL|x64.ActiveCfg = Release|x64 - {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Release_JITIL|x64.Build.0 = Release|x64 {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Release|Win32.ActiveCfg = Release|Win32 {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Release|Win32.Build.0 = Release|Win32 {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Release|x64.ActiveCfg = Release|x64 @@ -476,10 +410,6 @@ Global {FBAFB369-07EB-4460-9CAD-08BE5789DAB6}.DebugFast|Win32.Build.0 = DebugFast|Win32 {FBAFB369-07EB-4460-9CAD-08BE5789DAB6}.DebugFast|x64.ActiveCfg = DebugFast|x64 {FBAFB369-07EB-4460-9CAD-08BE5789DAB6}.DebugFast|x64.Build.0 = DebugFast|x64 - {FBAFB369-07EB-4460-9CAD-08BE5789DAB6}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {FBAFB369-07EB-4460-9CAD-08BE5789DAB6}.Release_JITIL|Win32.Build.0 = Release|Win32 - {FBAFB369-07EB-4460-9CAD-08BE5789DAB6}.Release_JITIL|x64.ActiveCfg = Release|x64 - {FBAFB369-07EB-4460-9CAD-08BE5789DAB6}.Release_JITIL|x64.Build.0 = Release|x64 {FBAFB369-07EB-4460-9CAD-08BE5789DAB6}.Release|Win32.ActiveCfg = Release|Win32 {FBAFB369-07EB-4460-9CAD-08BE5789DAB6}.Release|Win32.Build.0 = Release|Win32 {FBAFB369-07EB-4460-9CAD-08BE5789DAB6}.Release|x64.ActiveCfg = Release|x64 @@ -492,10 +422,6 @@ Global {3D8156A9-64D1-4C8E-ADBE-1B319030E4A4}.DebugFast|Win32.Build.0 = DebugFast|Win32 {3D8156A9-64D1-4C8E-ADBE-1B319030E4A4}.DebugFast|x64.ActiveCfg = DebugFast|x64 {3D8156A9-64D1-4C8E-ADBE-1B319030E4A4}.DebugFast|x64.Build.0 = DebugFast|x64 - {3D8156A9-64D1-4C8E-ADBE-1B319030E4A4}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {3D8156A9-64D1-4C8E-ADBE-1B319030E4A4}.Release_JITIL|Win32.Build.0 = Release|Win32 - {3D8156A9-64D1-4C8E-ADBE-1B319030E4A4}.Release_JITIL|x64.ActiveCfg = Release|x64 - {3D8156A9-64D1-4C8E-ADBE-1B319030E4A4}.Release_JITIL|x64.Build.0 = Release|x64 {3D8156A9-64D1-4C8E-ADBE-1B319030E4A4}.Release|Win32.ActiveCfg = Release|Win32 {3D8156A9-64D1-4C8E-ADBE-1B319030E4A4}.Release|Win32.Build.0 = Release|Win32 {3D8156A9-64D1-4C8E-ADBE-1B319030E4A4}.Release|x64.ActiveCfg = Release|x64 @@ -508,10 +434,6 @@ Global {838A89A3-3AA0-4A45-ACBE-3D1E0980C2ED}.DebugFast|Win32.Build.0 = DebugFast|Win32 {838A89A3-3AA0-4A45-ACBE-3D1E0980C2ED}.DebugFast|x64.ActiveCfg = DebugFast|x64 {838A89A3-3AA0-4A45-ACBE-3D1E0980C2ED}.DebugFast|x64.Build.0 = DebugFast|x64 - {838A89A3-3AA0-4A45-ACBE-3D1E0980C2ED}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {838A89A3-3AA0-4A45-ACBE-3D1E0980C2ED}.Release_JITIL|Win32.Build.0 = Release|Win32 - {838A89A3-3AA0-4A45-ACBE-3D1E0980C2ED}.Release_JITIL|x64.ActiveCfg = Release|x64 - {838A89A3-3AA0-4A45-ACBE-3D1E0980C2ED}.Release_JITIL|x64.Build.0 = Release|x64 {838A89A3-3AA0-4A45-ACBE-3D1E0980C2ED}.Release|Win32.ActiveCfg = Release|Win32 {838A89A3-3AA0-4A45-ACBE-3D1E0980C2ED}.Release|Win32.Build.0 = Release|Win32 {838A89A3-3AA0-4A45-ACBE-3D1E0980C2ED}.Release|x64.ActiveCfg = Release|x64 @@ -524,10 +446,6 @@ Global {1970D175-3DE8-4738-942A-4D98D1CDBF64}.DebugFast|Win32.Build.0 = DebugFast|Win32 {1970D175-3DE8-4738-942A-4D98D1CDBF64}.DebugFast|x64.ActiveCfg = DebugFast|x64 {1970D175-3DE8-4738-942A-4D98D1CDBF64}.DebugFast|x64.Build.0 = DebugFast|x64 - {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release_JITIL|Win32.Build.0 = Release|Win32 - {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release_JITIL|x64.ActiveCfg = Release|x64 - {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release_JITIL|x64.Build.0 = Release|x64 {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release|Win32.ActiveCfg = Release|Win32 {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release|x64.ActiveCfg = Release|x64 {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release|x64.Build.0 = Release|x64 @@ -535,8 +453,6 @@ Global {3877AA3E-9CC0-4ADF-8E71-272EE4443478}.Debug|x64.ActiveCfg = Wii|x64 {3877AA3E-9CC0-4ADF-8E71-272EE4443478}.DebugFast|Win32.ActiveCfg = Wii|Win32 {3877AA3E-9CC0-4ADF-8E71-272EE4443478}.DebugFast|x64.ActiveCfg = Wii|x64 - {3877AA3E-9CC0-4ADF-8E71-272EE4443478}.Release_JITIL|Win32.ActiveCfg = Wii|Win32 - {3877AA3E-9CC0-4ADF-8E71-272EE4443478}.Release_JITIL|x64.ActiveCfg = Wii|x64 {3877AA3E-9CC0-4ADF-8E71-272EE4443478}.Release|Win32.ActiveCfg = Wii|Win32 {3877AA3E-9CC0-4ADF-8E71-272EE4443478}.Release|x64.ActiveCfg = Wii|x64 {C0B84DA9-FF15-4FAB-9590-17132F3C6DE4}.Debug|Win32.ActiveCfg = Debug|Win32 @@ -547,10 +463,6 @@ Global {C0B84DA9-FF15-4FAB-9590-17132F3C6DE4}.DebugFast|Win32.Build.0 = Release|Win32 {C0B84DA9-FF15-4FAB-9590-17132F3C6DE4}.DebugFast|x64.ActiveCfg = Release|x64 {C0B84DA9-FF15-4FAB-9590-17132F3C6DE4}.DebugFast|x64.Build.0 = Release|x64 - {C0B84DA9-FF15-4FAB-9590-17132F3C6DE4}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {C0B84DA9-FF15-4FAB-9590-17132F3C6DE4}.Release_JITIL|Win32.Build.0 = Release|Win32 - {C0B84DA9-FF15-4FAB-9590-17132F3C6DE4}.Release_JITIL|x64.ActiveCfg = Release|x64 - {C0B84DA9-FF15-4FAB-9590-17132F3C6DE4}.Release_JITIL|x64.Build.0 = Release|x64 {C0B84DA9-FF15-4FAB-9590-17132F3C6DE4}.Release|Win32.ActiveCfg = Release|Win32 {C0B84DA9-FF15-4FAB-9590-17132F3C6DE4}.Release|Win32.Build.0 = Release|Win32 {C0B84DA9-FF15-4FAB-9590-17132F3C6DE4}.Release|x64.ActiveCfg = Release|x64 @@ -563,10 +475,6 @@ Global {823DDC98-42D5-4A38-88CF-9DC06C788AE4}.DebugFast|Win32.Build.0 = Release|Win32 {823DDC98-42D5-4A38-88CF-9DC06C788AE4}.DebugFast|x64.ActiveCfg = Release|x64 {823DDC98-42D5-4A38-88CF-9DC06C788AE4}.DebugFast|x64.Build.0 = Release|x64 - {823DDC98-42D5-4A38-88CF-9DC06C788AE4}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {823DDC98-42D5-4A38-88CF-9DC06C788AE4}.Release_JITIL|Win32.Build.0 = Release|Win32 - {823DDC98-42D5-4A38-88CF-9DC06C788AE4}.Release_JITIL|x64.ActiveCfg = Release|x64 - {823DDC98-42D5-4A38-88CF-9DC06C788AE4}.Release_JITIL|x64.Build.0 = Release|x64 {823DDC98-42D5-4A38-88CF-9DC06C788AE4}.Release|Win32.ActiveCfg = Release|Win32 {823DDC98-42D5-4A38-88CF-9DC06C788AE4}.Release|Win32.Build.0 = Release|Win32 {823DDC98-42D5-4A38-88CF-9DC06C788AE4}.Release|x64.ActiveCfg = Release|x64 @@ -577,10 +485,6 @@ Global {40C636FA-B5BF-4D67-ABC8-376B524A7551}.DebugFast|Win32.Build.0 = Release|Win32 {40C636FA-B5BF-4D67-ABC8-376B524A7551}.DebugFast|x64.ActiveCfg = Release|x64 {40C636FA-B5BF-4D67-ABC8-376B524A7551}.DebugFast|x64.Build.0 = Release|x64 - {40C636FA-B5BF-4D67-ABC8-376B524A7551}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {40C636FA-B5BF-4D67-ABC8-376B524A7551}.Release_JITIL|Win32.Build.0 = Release|Win32 - {40C636FA-B5BF-4D67-ABC8-376B524A7551}.Release_JITIL|x64.ActiveCfg = Release|x64 - {40C636FA-B5BF-4D67-ABC8-376B524A7551}.Release_JITIL|x64.Build.0 = Release|x64 {40C636FA-B5BF-4D67-ABC8-376B524A7551}.Release|Win32.ActiveCfg = Release|Win32 {40C636FA-B5BF-4D67-ABC8-376B524A7551}.Release|Win32.Build.0 = Release|Win32 {40C636FA-B5BF-4D67-ABC8-376B524A7551}.Release|x64.ActiveCfg = Release|x64 @@ -593,10 +497,6 @@ Global {F81AE75C-3D17-4D8C-A201-82FA5351C123}.DebugFast|Win32.Build.0 = DebugFast|Win32 {F81AE75C-3D17-4D8C-A201-82FA5351C123}.DebugFast|x64.ActiveCfg = DebugFast|x64 {F81AE75C-3D17-4D8C-A201-82FA5351C123}.DebugFast|x64.Build.0 = DebugFast|x64 - {F81AE75C-3D17-4D8C-A201-82FA5351C123}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {F81AE75C-3D17-4D8C-A201-82FA5351C123}.Release_JITIL|Win32.Build.0 = Release|Win32 - {F81AE75C-3D17-4D8C-A201-82FA5351C123}.Release_JITIL|x64.ActiveCfg = Release|x64 - {F81AE75C-3D17-4D8C-A201-82FA5351C123}.Release_JITIL|x64.Build.0 = Release|x64 {F81AE75C-3D17-4D8C-A201-82FA5351C123}.Release|Win32.ActiveCfg = Release|Win32 {F81AE75C-3D17-4D8C-A201-82FA5351C123}.Release|Win32.Build.0 = Release|Win32 {F81AE75C-3D17-4D8C-A201-82FA5351C123}.Release|x64.ActiveCfg = Release|x64 @@ -609,10 +509,6 @@ Global {DA4CA030-A741-4DDC-9DA8-B2F351F0F158}.DebugFast|Win32.Build.0 = Release|Win32 {DA4CA030-A741-4DDC-9DA8-B2F351F0F158}.DebugFast|x64.ActiveCfg = Release|x64 {DA4CA030-A741-4DDC-9DA8-B2F351F0F158}.DebugFast|x64.Build.0 = Release|x64 - {DA4CA030-A741-4DDC-9DA8-B2F351F0F158}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {DA4CA030-A741-4DDC-9DA8-B2F351F0F158}.Release_JITIL|Win32.Build.0 = Release|Win32 - {DA4CA030-A741-4DDC-9DA8-B2F351F0F158}.Release_JITIL|x64.ActiveCfg = Release|x64 - {DA4CA030-A741-4DDC-9DA8-B2F351F0F158}.Release_JITIL|x64.Build.0 = Release|x64 {DA4CA030-A741-4DDC-9DA8-B2F351F0F158}.Release|Win32.ActiveCfg = Release|Win32 {DA4CA030-A741-4DDC-9DA8-B2F351F0F158}.Release|Win32.Build.0 = Release|Win32 {DA4CA030-A741-4DDC-9DA8-B2F351F0F158}.Release|x64.ActiveCfg = Release|x64 @@ -625,10 +521,6 @@ Global {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}.DebugFast|Win32.Build.0 = Release|Win32 {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}.DebugFast|x64.ActiveCfg = Release|x64 {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}.DebugFast|x64.Build.0 = Release|x64 - {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}.Release_JITIL|Win32.Build.0 = Release|Win32 - {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}.Release_JITIL|x64.ActiveCfg = Release|x64 - {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}.Release_JITIL|x64.Build.0 = Release|x64 {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}.Release|Win32.ActiveCfg = Release|Win32 {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}.Release|Win32.Build.0 = Release|Win32 {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}.Release|x64.ActiveCfg = Release|x64 @@ -641,10 +533,6 @@ Global {05C75041-D67D-4903-A362-8395A7B35C75}.DebugFast|Win32.Build.0 = Release|Win32 {05C75041-D67D-4903-A362-8395A7B35C75}.DebugFast|x64.ActiveCfg = Release|x64 {05C75041-D67D-4903-A362-8395A7B35C75}.DebugFast|x64.Build.0 = Release|x64 - {05C75041-D67D-4903-A362-8395A7B35C75}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {05C75041-D67D-4903-A362-8395A7B35C75}.Release_JITIL|Win32.Build.0 = Release|Win32 - {05C75041-D67D-4903-A362-8395A7B35C75}.Release_JITIL|x64.ActiveCfg = Release|x64 - {05C75041-D67D-4903-A362-8395A7B35C75}.Release_JITIL|x64.Build.0 = Release|x64 {05C75041-D67D-4903-A362-8395A7B35C75}.Release|Win32.ActiveCfg = Release|Win32 {05C75041-D67D-4903-A362-8395A7B35C75}.Release|Win32.Build.0 = Release|Win32 {05C75041-D67D-4903-A362-8395A7B35C75}.Release|x64.ActiveCfg = Release|x64 @@ -657,10 +545,6 @@ Global {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.DebugFast|Win32.Build.0 = Release|Win32 {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.DebugFast|x64.ActiveCfg = Release|x64 {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.DebugFast|x64.Build.0 = Release|x64 - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Release_JITIL|Win32.Build.0 = Release|Win32 - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Release_JITIL|x64.ActiveCfg = Release|x64 - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Release_JITIL|x64.Build.0 = Release|x64 {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Release|Win32.ActiveCfg = Release|Win32 {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Release|Win32.Build.0 = Release|Win32 {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Release|x64.ActiveCfg = Release|x64 @@ -673,10 +557,6 @@ Global {11F55366-12EC-4C44-A8CB-1D4E315D61ED}.DebugFast|Win32.Build.0 = Release|Win32 {11F55366-12EC-4C44-A8CB-1D4E315D61ED}.DebugFast|x64.ActiveCfg = Release|x64 {11F55366-12EC-4C44-A8CB-1D4E315D61ED}.DebugFast|x64.Build.0 = Release|x64 - {11F55366-12EC-4C44-A8CB-1D4E315D61ED}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {11F55366-12EC-4C44-A8CB-1D4E315D61ED}.Release_JITIL|Win32.Build.0 = Release|Win32 - {11F55366-12EC-4C44-A8CB-1D4E315D61ED}.Release_JITIL|x64.ActiveCfg = Release|x64 - {11F55366-12EC-4C44-A8CB-1D4E315D61ED}.Release_JITIL|x64.Build.0 = Release|x64 {11F55366-12EC-4C44-A8CB-1D4E315D61ED}.Release|Win32.ActiveCfg = Release|Win32 {11F55366-12EC-4C44-A8CB-1D4E315D61ED}.Release|Win32.Build.0 = Release|Win32 {11F55366-12EC-4C44-A8CB-1D4E315D61ED}.Release|x64.ActiveCfg = Release|x64 @@ -689,30 +569,10 @@ Global {66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.DebugFast|Win32.Build.0 = Release|Win32 {66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.DebugFast|x64.ActiveCfg = Release|x64 {66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.DebugFast|x64.Build.0 = Release|x64 - {66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release_JITIL|Win32.Build.0 = Release|Win32 - {66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release_JITIL|x64.ActiveCfg = Release|x64 - {66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release_JITIL|x64.Build.0 = Release|x64 {66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|Win32.ActiveCfg = Release|Win32 {66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|Win32.Build.0 = Release|Win32 {66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|x64.ActiveCfg = Release|x64 {66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|x64.Build.0 = Release|x64 - {E251479F-74CD-462C-90E4-0F8345AA6628}.Debug|Win32.ActiveCfg = Debug|Win32 - {E251479F-74CD-462C-90E4-0F8345AA6628}.Debug|Win32.Build.0 = Debug|Win32 - {E251479F-74CD-462C-90E4-0F8345AA6628}.Debug|x64.ActiveCfg = Debug|x64 - {E251479F-74CD-462C-90E4-0F8345AA6628}.Debug|x64.Build.0 = Debug|x64 - {E251479F-74CD-462C-90E4-0F8345AA6628}.DebugFast|Win32.ActiveCfg = Release|Win32 - {E251479F-74CD-462C-90E4-0F8345AA6628}.DebugFast|Win32.Build.0 = Release|Win32 - {E251479F-74CD-462C-90E4-0F8345AA6628}.DebugFast|x64.ActiveCfg = Release|x64 - {E251479F-74CD-462C-90E4-0F8345AA6628}.DebugFast|x64.Build.0 = Release|x64 - {E251479F-74CD-462C-90E4-0F8345AA6628}.Release_JITIL|Win32.ActiveCfg = Release|Win32 - {E251479F-74CD-462C-90E4-0F8345AA6628}.Release_JITIL|Win32.Build.0 = Release|Win32 - {E251479F-74CD-462C-90E4-0F8345AA6628}.Release_JITIL|x64.ActiveCfg = Release|x64 - {E251479F-74CD-462C-90E4-0F8345AA6628}.Release_JITIL|x64.Build.0 = Release|x64 - {E251479F-74CD-462C-90E4-0F8345AA6628}.Release|Win32.ActiveCfg = Release|Win32 - {E251479F-74CD-462C-90E4-0F8345AA6628}.Release|Win32.Build.0 = Release|Win32 - {E251479F-74CD-462C-90E4-0F8345AA6628}.Release|x64.ActiveCfg = Release|x64 - {E251479F-74CD-462C-90E4-0F8345AA6628}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Source/PluginSpecs/PluginSpecs.h b/Source/PluginSpecs/PluginSpecs.h index 6f486816c1..77db4eaa34 100644 --- a/Source/PluginSpecs/PluginSpecs.h +++ b/Source/PluginSpecs/PluginSpecs.h @@ -2,23 +2,18 @@ //________________________________________________________________________________________ // File description: Common plugin spec, version #1.0 maintained by F|RES - #ifndef _PLUGINS_H_INCLUDED__ #define _PLUGINS_H_INCLUDED__ - - // Includes // ------------ +// TODO: See if we can get rid of the windows.h include. #ifdef _WIN32 #include #endif #include "CommonTypes.h" - - - -/* Plugin communication. I place this here rather in Common.h to rebuild less if any of this is changed */ +// Plugin communication. I place this here rather in Common.h to rebuild less if any of this is changed // ----------------- enum PLUGIN_COMM { @@ -34,9 +29,6 @@ enum PLUGIN_COMM INPUT_FRAME_COUNTER // Wind back the frame counter for rerecording }; - - - // System specific declarations and definitions // ------------ @@ -64,7 +56,6 @@ enum PLUGIN_COMM - // Global values // ------------