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 <windows.h> 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
This commit is contained in:
hrydgard 2010-01-19 19:28:27 +00:00
commit 576990c5a3
82 changed files with 1365 additions and 1953 deletions

View file

@ -535,6 +535,10 @@
RelativePath=".\Src\ConsoleListener.cpp" RelativePath=".\Src\ConsoleListener.cpp"
> >
</File> </File>
<File
RelativePath=".\Src\ConsoleListener.h"
>
</File>
<File <File
RelativePath=".\Src\Log.h" RelativePath=".\Src\Log.h"
> >

View file

@ -3,6 +3,30 @@
#include "CDUtils.h" #include "CDUtils.h"
#include "Common.h" #include "Common.h"
#ifdef _WIN32
#include <windows.h>
#define PATH_MAX MAX_PATH
#elif __APPLE__
#include <paths.h>
#include <Carbon/Carbon.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/storage/IOCDMedia.h>
#include <IOKit/storage/IOMedia.h>
#include <IOKit/IOBSD.h>
#elif __linux__
#include <mntent.h>
#include <unistd.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <linux/cdrom.h>
#endif // WIN32
// Follow symlinks until we have the real device file (idea taken from libunieject). // Follow symlinks until we have the real device file (idea taken from libunieject).
void cdio_follow_symlink(const char * src, char * dst) { void cdio_follow_symlink(const char * src, char * dst) {
#ifndef _WIN32 #ifndef _WIN32

View file

@ -5,30 +5,6 @@
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#ifdef _WIN32
#include <windows.h>
#define PATH_MAX MAX_PATH
#elif __APPLE__
#include <paths.h>
#include <Carbon/Carbon.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/storage/IOCDMedia.h>
#include <IOKit/storage/IOMedia.h>
#include <IOKit/IOBSD.h>
#elif __linux__
#include <mntent.h>
#include <unistd.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <linux/cdrom.h>
#endif // WIN32
// Returns a pointer to an array of strings with the device names // Returns a pointer to an array of strings with the device names
char **cdio_get_devices(); char **cdio_get_devices();

View file

@ -18,6 +18,9 @@
#ifndef _COMMON_H_ #ifndef _COMMON_H_
#define _COMMON_H_ #define _COMMON_H_
// DO NOT EVER INCLUDE <windows.h> directly _or indirectly_ from this file
// since it slows down the build a lot.
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>

View file

@ -28,6 +28,7 @@
#include "Common.h" #include "Common.h"
#include "LogManager.h" // Common #include "LogManager.h" // Common
#include "ConsoleListener.h" // Common
ConsoleListener::ConsoleListener() ConsoleListener::ConsoleListener()
{ {

View file

@ -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 <windows.h>
#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

View file

@ -69,7 +69,7 @@ int LinearDiskCache::OpenAndRead(const char *filename, LinearDiskCacheReader *re
fclose(file_); fclose(file_);
unlink(filename); unlink(filename);
PanicAlert("LinearDiskCache file header broken."); // PanicAlert("LinearDiskCache file header broken.");
file_ = fopen(filename, "wb"); file_ = fopen(filename, "wb");
WriteHeader(); WriteHeader();
@ -86,8 +86,8 @@ int LinearDiskCache::OpenAndRead(const char *filename, LinearDiskCacheReader *re
break; break;
} }
if (key_size <= 0 || value_size < 0 || key_size_size != 4 || value_size_size != 4) { 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, // 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); // key_size, value_size, key_size_size, value_size_size);
file_corrupt = true; file_corrupt = true;
break; 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_key_size = (int)fread(key, 1, key_size, file_);
int actual_value_size = (int)fread(value, 1, value_size, file_); int actual_value_size = (int)fread(value, 1, value_size, file_);
if (actual_key_size != key_size || actual_value_size != value_size) { 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, // 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); // key_size, actual_key_size, value_size, actual_value_size);
file_corrupt = true; file_corrupt = true;
} else { } else {
reader->Read(key, key_size, value, value_size); reader->Read(key, key_size, value, value_size);

View file

@ -16,7 +16,10 @@
// http://code.google.com/p/dolphin-emu/ // http://code.google.com/p/dolphin-emu/
#include "LogManager.h" #include "LogManager.h"
#include "ConsoleListener.h"
#include "Timer.h" #include "Timer.h"
#include "Thread.h"
void GenericLog(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, void GenericLog(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type,
const char *file, int line, const char* fmt, ...) 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::m_logManager = NULL;
LogManager::LogManager() : logMutex(1) { LogManager::LogManager() {
logMutex = new Common::CriticalSection(1);
// create log files // create log files
m_Log[LogTypes::MASTER_LOG] = new LogContainer("*", "Master Log"); m_Log[LogTypes::MASTER_LOG] = new LogContainer("*", "Master Log");
m_Log[LogTypes::BOOT] = new LogContainer("BOOT", "Boot"); m_Log[LogTypes::BOOT] = new LogContainer("BOOT", "Boot");
@ -92,6 +97,7 @@ LogManager::~LogManager() {
} }
delete m_fileLog; delete m_fileLog;
delete m_consoleLog; delete m_consoleLog;
delete logMutex;
} }
void LogManager::Log(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, 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], file, line, level_to_char[(int)level],
log->getShortName(), temp); log->getShortName(), temp);
logMutex.Enter(); logMutex->Enter();
log->trigger(level, msg); log->trigger(level, msg);
logMutex.Leave(); logMutex->Leave();
} }
void LogManager::removeListener(LogTypes::LOG_TYPE type, LogListener *listener) { void LogManager::removeListener(LogTypes::LOG_TYPE type, LogListener *listener) {
logMutex.Enter(); logMutex->Enter();
m_Log[type]->removeListener(listener); m_Log[type]->removeListener(listener);
logMutex.Leave(); logMutex->Leave();
} }
LogContainer::LogContainer(const char* shortName, const char* fullName, bool enable) LogContainer::LogContainer(const char* shortName, const char* fullName, bool enable)

View file

@ -19,11 +19,8 @@
#define _LOGMANAGER_H_ #define _LOGMANAGER_H_
#include "Log.h" #include "Log.h"
#include "Thread.h"
#include "StringUtil.h" #include "StringUtil.h"
#ifdef _WIN32
#include <windows.h>
#endif
#include <vector> #include <vector>
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
@ -67,34 +64,6 @@ private:
bool m_enable; 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 { class LogContainer {
public: public:
LogContainer(const char* shortName, const char* fullName, bool enable = false); LogContainer(const char* shortName, const char* fullName, bool enable = false);
@ -130,16 +99,26 @@ private:
std::vector<LogListener *> listeners; std::vector<LogListener *> listeners;
}; };
class ConsoleListener;
// Avoid <windows.h> include through Thread.h
namespace Common {
class CriticalSection;
}
class LogManager class LogManager
{ {
private: private:
LogContainer* m_Log[LogTypes::NUMBER_OF_LOGS]; LogContainer* m_Log[LogTypes::NUMBER_OF_LOGS];
Common::CriticalSection logMutex; Common::CriticalSection *logMutex;
FileLogListener *m_fileLog; FileLogListener *m_fileLog;
ConsoleListener *m_consoleLog; ConsoleListener *m_consoleLog;
static LogManager *m_logManager; // Singleton. Ugh. static LogManager *m_logManager; // Singleton. Ugh.
public: public:
LogManager();
~LogManager();
static u32 GetMaxLevel() { return MAX_LOGLEVEL; } static u32 GetMaxLevel() { return MAX_LOGLEVEL; }
void Log(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, void Log(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type,
@ -192,9 +171,6 @@ public:
static void SetInstance(LogManager *logManager) { static void SetInstance(LogManager *logManager) {
m_logManager = logManager; m_logManager = logManager;
} }
LogManager();
~LogManager();
}; };
#endif // _LOGMANAGER_H_ #endif // _LOGMANAGER_H_

View file

@ -18,7 +18,7 @@
#ifndef _MEMORYUTIL_H #ifndef _MEMORYUTIL_H
#define _MEMORYUTIL_H #define _MEMORYUTIL_H
#include <iostream> #include <string>
void* AllocateExecutableMemory(size_t size, bool low = true); void* AllocateExecutableMemory(size_t size, bool low = true);
void* AllocateMemoryPages(size_t size); void* AllocateMemoryPages(size_t size);

View file

@ -18,6 +18,9 @@
#ifndef __SYSCONF_MANAGER_h__ #ifndef __SYSCONF_MANAGER_h__
#define __SYSCONF_MANAGER_h__ #define __SYSCONF_MANAGER_h__
#include <string>
#include <vector>
// This class is meant to edit the values in a given Wii SYSCONF file // This class is meant to edit the values in a given Wii SYSCONF file
// It currently does not add/remove/rearrange sections, // It currently does not add/remove/rearrange sections,
// instead only modifies exiting sections' data // instead only modifies exiting sections' data

File diff suppressed because it is too large Load diff

View file

@ -22,6 +22,10 @@
#include "ARDecrypt.h" #include "ARDecrypt.h"
#include <algorithm> #include <algorithm>
#ifdef _WIN32
#include <windows.h>
#endif
namespace ActionReplay namespace ActionReplay
{ {

View file

@ -17,10 +17,6 @@
#ifndef _ARDECRYPT_H_ #ifndef _ARDECRYPT_H_
#define _ARDECRYPT_H_ #define _ARDECRYPT_H_
#ifdef _WIN32
#include <windows.h>
#endif
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>

View file

@ -104,7 +104,7 @@ void SConfig::SaveSettings()
// Core // Core
ini.Set("Core", "HLE_BS2", m_LocalCoreStartupParameter.bHLE_BS2); 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", "CPUThread", m_LocalCoreStartupParameter.bCPUThread);
ini.Set("Core", "DSPThread", m_LocalCoreStartupParameter.bDSPThread); ini.Set("Core", "DSPThread", m_LocalCoreStartupParameter.bDSPThread);
ini.Set("Core", "SkipIdle", m_LocalCoreStartupParameter.bSkipIdle); ini.Set("Core", "SkipIdle", m_LocalCoreStartupParameter.bSkipIdle);
@ -224,7 +224,7 @@ void SConfig::LoadSettings()
// Core // Core
ini.Get("Core", "HLE_BS2", &m_LocalCoreStartupParameter.bHLE_BS2, true); 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", "DSPThread", &m_LocalCoreStartupParameter.bDSPThread, true);
ini.Get("Core", "CPUThread", &m_LocalCoreStartupParameter.bCPUThread, true); ini.Get("Core", "CPUThread", &m_LocalCoreStartupParameter.bCPUThread, true);
ini.Get("Core", "SkipIdle", &m_LocalCoreStartupParameter.bSkipIdle, true); ini.Get("Core", "SkipIdle", &m_LocalCoreStartupParameter.bSkipIdle, true);

View file

@ -25,7 +25,7 @@
#include "PowerPC/PPCTables.h" #include "PowerPC/PPCTables.h"
#include "CoreTiming.h" #include "CoreTiming.h"
#include "Core.h" #include "Core.h"
#include "PowerPC/Jit64/Jit.h" #include "PowerPC/JitCommon/JitBase.h"
#include "PowerPC/PPCSymbolDB.h" #include "PowerPC/PPCSymbolDB.h"
#include "PowerPCDisasm.h" #include "PowerPCDisasm.h"
#include "Console.h" #include "Console.h"

View file

@ -47,6 +47,7 @@
#include "HW/SystemTimers.h" #include "HW/SystemTimers.h"
#include "PowerPC/PowerPC.h" #include "PowerPC/PowerPC.h"
#include "PowerPC/JitCommon/JitBase.h"
#include "PluginManager.h" #include "PluginManager.h"
#include "ConfigManager.h" #include "ConfigManager.h"
@ -387,7 +388,7 @@ THREAD_RETURN EmuThread(void *pArg)
g_pUpdateFPSDisplay(("Loading " + _CoreParameter.m_strFilename).c_str()); g_pUpdateFPSDisplay(("Loading " + _CoreParameter.m_strFilename).c_str());
// Setup our core, but can't use dynarec if we are compare server // 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); PowerPC::SetMode(PowerPC::MODE_JIT);
else else
PowerPC::SetMode(PowerPC::MODE_INTERPRETER); PowerPC::SetMode(PowerPC::MODE_INTERPRETER);
@ -592,18 +593,10 @@ void VideoThrottle()
// Settings are shown the same for both extended and summary info // Settings are shown the same for both extended and summary info
std::string SSettings = StringFromFormat("%s %s", std::string SSettings = StringFromFormat("%s %s",
#if defined(JITTEST) && JITTEST #ifdef _M_IX86
#ifdef _M_IX86 _CoreParameter.iCPUCore ? jit->GetName() : "Int32",
_CoreParameter.bUseJIT ? "JIT32IL" : "Int32",
#else
_CoreParameter.bUseJIT ? "JIT64IL" : "Int64",
#endif
#else #else
#ifdef _M_IX86 _CoreParameter.iCPUCore ? jit->GetName() : "Int64",
_CoreParameter.bUseJIT ? "JIT32" : "Int32",
#else
_CoreParameter.bUseJIT ? "JIT64" : "Int64",
#endif
#endif #endif
_CoreParameter.bCPUThread ? "DC" : "SC"); _CoreParameter.bCPUThread ? "DC" : "SC");

View file

@ -37,7 +37,7 @@ SCoreStartupParameter::SCoreStartupParameter()
void SCoreStartupParameter::LoadDefaults() void SCoreStartupParameter::LoadDefaults()
{ {
bEnableDebugging = false; bEnableDebugging = false;
bUseJIT = false; iCPUCore = 1;
bCPUThread = false; bCPUThread = false;
bSkipIdle = false; bSkipIdle = false;
bRunCompareServer = false; bRunCompareServer = false;

View file

@ -18,10 +18,6 @@
#ifndef _COREPARAMETER_H #ifndef _COREPARAMETER_H
#define _COREPARAMETER_H #define _COREPARAMETER_H
#ifdef _WIN32
#include <windows.h>
#endif
#include "IniFile.h" #include "IniFile.h"
#include <string> #include <string>
@ -30,18 +26,22 @@
struct SCoreStartupParameter struct SCoreStartupParameter
{ {
#ifdef _WIN32 void * hInstance; // HINSTANCE but we don't want to include <windows.h>
HINSTANCE hInstance;
#endif
// Windows/GUI related // Windows/GUI related
void* hMainWindow; void* hMainWindow;
// Settings // Settings
bool bEnableDebugging; bool bAutomaticStart; bool bBootToPause; bool bEnableDebugging;
bool bUseJIT; bool bAutomaticStart;
bool bBootToPause;
// JIT // 0 = Interpreter
// 1 = Jit
// 2 = JitIL
int iCPUCore;
// JIT (shared between JIT and JITIL)
bool bJITUnlimitedCache, bJITBlockLinking; bool bJITUnlimitedCache, bJITBlockLinking;
bool bJITOff; bool bJITOff;
bool bJITLoadStoreOff, bJITLoadStorelXzOff, bJITLoadStorelwzOff, bJITLoadStorelbzxOff; bool bJITLoadStoreOff, bJITLoadStorelXzOff, bJITLoadStorelwzOff, bJITLoadStorelbzxOff;

View file

@ -25,7 +25,7 @@
#include "../HW/DSP.h" #include "../HW/DSP.h"
#include "../HW/Memmap.h" #include "../HW/Memmap.h"
#include "../PowerPC/PowerPC.h" #include "../PowerPC/PowerPC.h"
#include "../PowerPC/Jit64/Jit.h" #include "../PowerPC/JitCommon/JitBase.h"
#include "../PowerPC/PPCSymbolDB.h" #include "../PowerPC/PPCSymbolDB.h"
void PPCDebugInterface::disasm(unsigned int address, char *dest, int max_size) 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) void PPCDebugInterface::setBreakpoint(unsigned int address)
{ {
if (PowerPC::breakpoints.Add(address)) if (PowerPC::breakpoints.Add(address))
jit.NotifyBreakpoint(address, true); jit->NotifyBreakpoint(address, true);
} }
void PPCDebugInterface::clearBreakpoint(unsigned int address) void PPCDebugInterface::clearBreakpoint(unsigned int address)
{ {
if (PowerPC::breakpoints.Remove(address)) if (PowerPC::breakpoints.Remove(address))
jit.NotifyBreakpoint(address, false); jit->NotifyBreakpoint(address, false);
} }
void PPCDebugInterface::clearAllBreakpoints() {} void PPCDebugInterface::clearAllBreakpoints() {}

View file

@ -30,10 +30,10 @@ namespace
static Common::Event *m_SyncEvent; static Common::Event *m_SyncEvent;
} }
void CCPU::Init() void CCPU::Init(int cpu_core)
{ {
m_StepEvent.Init(); m_StepEvent.Init();
PowerPC::Init(); PowerPC::Init(cpu_core);
m_SyncEvent = 0; m_SyncEvent = 0;
} }

View file

@ -27,7 +27,7 @@ class CCPU
{ {
public: public:
// init // init
static void Init(); static void Init(int cpu_core);
// shutdown // shutdown
static void Shutdown(); static void Shutdown();

View file

@ -76,7 +76,7 @@ void STACKALIGN CheckGatherPipe()
// move back the spill bytes // move back the spill bytes
m_gatherPipeCount -= GATHER_PIPE_SIZE; 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); memcpy(m_gatherPipe, m_gatherPipe + GATHER_PIPE_SIZE, m_gatherPipeCount);
// increase the CPUWritePointer // increase the CPUWritePointer

View file

@ -58,7 +58,7 @@ namespace HW
DVDInterface::Init(); DVDInterface::Init();
GPFifo::Init(); GPFifo::Init();
ExpansionInterface::Init(); ExpansionInterface::Init();
CCPU::Init(); CCPU::Init(SConfig::GetInstance().m_LocalCoreStartupParameter.iCPUCore);
SystemTimers::Init(); SystemTimers::Init();
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii) if (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii)
{ {

View file

@ -29,7 +29,7 @@ may be redirected here (for example to Read_U32()).
#include "Memmap.h" #include "Memmap.h"
#include "../Core.h" #include "../Core.h"
#include "../PowerPC/PowerPC.h" #include "../PowerPC/PowerPC.h"
#include "../PowerPC/Jit64/Jit.h" #include "../PowerPC/JitCommon/JitBase.h"
#include "../HLE/HLE.h" #include "../HLE/HLE.h"
#include "CPU.h" #include "CPU.h"
#include "ProcessorInterface.h" #include "ProcessorInterface.h"
@ -81,6 +81,7 @@ u8 *m_pRAM;
u8 *m_pL1Cache; u8 *m_pL1Cache;
u8 *m_pEXRAM; u8 *m_pEXRAM;
u8 *m_pFakeVMEM; u8 *m_pFakeVMEM;
u8 *m_pEFB;
// 64-bit: Pointers to high-mem mirrors // 64-bit: Pointers to high-mem mirrors
// 32-bit: Same as above // 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 // Don't map any memory for the EFB. We want all access to this area to go
// through the hardware access handlers. // through the hardware access handlers.
#ifndef _M_X64
// {&m_pEFB, &m_pVirtualEFB, 0xC8000000, EFB_SIZE, 0}, // {&m_pEFB, &m_pVirtualEFB, 0xC8000000, EFB_SIZE, 0},
#endif
{&m_pL1Cache, &m_pVirtualL1Cache, 0xE0000000, L1_CACHE_SIZE, 0}, {&m_pL1Cache, &m_pVirtualL1Cache, 0xE0000000, L1_CACHE_SIZE, 0},
{&m_pFakeVMEM, &m_pVirtualFakeVMEM, 0x7E000000, FAKEVMEM_SIZE, MV_FAKE_VMEM}, {&m_pFakeVMEM, &m_pVirtualFakeVMEM, 0x7E000000, FAKEVMEM_SIZE, MV_FAKE_VMEM},
@ -427,17 +430,17 @@ u32 Read_Opcode_JIT(const u32 _Address)
u32 addr; u32 addr;
if (_Address & JIT_ICACHE_VMEM_BIT) if (_Address & JIT_ICACHE_VMEM_BIT)
{ {
iCache = jit.GetBlockCache()->GetICacheVMEM(); iCache = jit->GetBlockCache()->GetICacheVMEM();
addr = _Address & JIT_ICACHE_MASK; addr = _Address & JIT_ICACHE_MASK;
} }
else if (_Address & JIT_ICACHE_EXRAM_BIT) else if (_Address & JIT_ICACHE_EXRAM_BIT)
{ {
iCache = jit.GetBlockCache()->GetICacheEx(); iCache = jit->GetBlockCache()->GetICacheEx();
addr = _Address & JIT_ICACHEEX_MASK; addr = _Address & JIT_ICACHEEX_MASK;
} }
else else
{ {
iCache = jit.GetBlockCache()->GetICache(); iCache = jit->GetBlockCache()->GetICache();
addr = _Address & JIT_ICACHE_MASK; addr = _Address & JIT_ICACHE_MASK;
} }
u32 inst = *(u32*)(iCache + addr); u32 inst = *(u32*)(iCache + addr);
@ -455,7 +458,7 @@ u32 Read_Opcode_JIT(const u32 _Address)
#endif #endif
if ((inst & 0xfc000000) == 0) if ((inst & 0xfc000000) == 0)
{ {
inst = jit.GetBlockCache()->GetOriginalFirstOp(inst); inst = jit->GetBlockCache()->GetOriginalFirstOp(inst);
} }
// if a crash occured after that message // if a crash occured after that message
@ -481,17 +484,17 @@ u32 Read_Opcode_JIT_LC(const u32 _Address)
u32 addr; u32 addr;
if (_Address & JIT_ICACHE_VMEM_BIT) if (_Address & JIT_ICACHE_VMEM_BIT)
{ {
iCache = jit.GetBlockCache()->GetICacheVMEM(); iCache = jit->GetBlockCache()->GetICacheVMEM();
addr = _Address & JIT_ICACHE_MASK; addr = _Address & JIT_ICACHE_MASK;
} }
else if (_Address & JIT_ICACHE_EXRAM_BIT) else if (_Address & JIT_ICACHE_EXRAM_BIT)
{ {
iCache = jit.GetBlockCache()->GetICacheEx(); iCache = jit->GetBlockCache()->GetICacheEx();
addr = _Address & JIT_ICACHEEX_MASK; addr = _Address & JIT_ICACHEEX_MASK;
} }
else else
{ {
iCache = jit.GetBlockCache()->GetICache(); iCache = jit->GetBlockCache()->GetICache();
addr = _Address & JIT_ICACHE_MASK; addr = _Address & JIT_ICACHE_MASK;
} }
u32 inst = *(u32*)(iCache + addr); u32 inst = *(u32*)(iCache + addr);
@ -504,7 +507,7 @@ u32 Read_Opcode_JIT_LC(const u32 _Address)
#endif #endif
if ((inst & 0xfc000000) == 0) if ((inst & 0xfc000000) == 0)
{ {
inst = jit.GetBlockCache()->GetOriginalFirstOp(inst); inst = jit->GetBlockCache()->GetOriginalFirstOp(inst);
} }
return inst; return inst;
} }
@ -516,14 +519,14 @@ void Write_Opcode_JIT(const u32 _Address, const u32 _Value)
#ifdef JIT_UNLIMITED_ICACHE #ifdef JIT_UNLIMITED_ICACHE
if (_Address & JIT_ICACHE_VMEM_BIT) 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) 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 else
*(u32*)(jit.GetBlockCache()->GetICache() + (_Address & JIT_ICACHE_MASK)) = Common::swap32(_Value); *(u32*)(jit->GetBlockCache()->GetICache() + (_Address & JIT_ICACHE_MASK)) = Common::swap32(_Value);
#else #else
Memory::WriteUnchecked_U32(_Value, _Address); Memory::WriteUnchecked_U32(_Value, _Address);
#endif #endif

View file

@ -20,7 +20,6 @@
#include <string> #include <string>
#include <queue> #include <queue>
#include "../HW/Memmap.h" #include "../HW/Memmap.h"
#include "../HW/CPU.h"
class PointerWrap; class PointerWrap;

View file

@ -20,6 +20,9 @@
#include "WII_IPC_HLE_Device_usb.h" #include "WII_IPC_HLE_Device_usb.h"
#include "WII_IPC_HLE_Device_usb_kbd.h" #include "WII_IPC_HLE_Device_usb_kbd.h"
#ifdef _WIN32
#include <windows.h>
#endif
CWII_IPC_HLE_Device_usb_kbd::CWII_IPC_HLE_Device_usb_kbd(u32 _DeviceID, const std::string& _rDeviceName) CWII_IPC_HLE_Device_usb_kbd::CWII_IPC_HLE_Device_usb_kbd(u32 _DeviceID, const std::string& _rDeviceName)
: IWII_IPC_HLE_Device(_DeviceID, _rDeviceName) : IWII_IPC_HLE_Device(_DeviceID, _rDeviceName)

View file

@ -33,6 +33,9 @@
#define CREG_EIP(ctx) (*(ctx))->__ss.__eip #define CREG_EIP(ctx) (*(ctx))->__ss.__eip
#endif #endif
#else
#include <windows.h>
#endif #endif
#include <vector> #include <vector>
@ -41,7 +44,7 @@
#include "MemTools.h" #include "MemTools.h"
#include "HW/Memmap.h" #include "HW/Memmap.h"
#include "PowerPC/PowerPC.h" #include "PowerPC/PowerPC.h"
#include "PowerPC/Jit64/Jit.h" #include "PowerPC/JitCommon/JitBase.h"
#include "x64Analyzer.h" #include "x64Analyzer.h"
namespace EMM namespace EMM
@ -65,7 +68,7 @@ LONG NTAPI Handler(PEXCEPTION_POINTERS pPtrs)
PVOID codeAddr = pPtrs->ExceptionRecord->ExceptionAddress; PVOID codeAddr = pPtrs->ExceptionRecord->ExceptionAddress;
unsigned char *codePtr = (unsigned char*)codeAddr; unsigned char *codePtr = (unsigned char*)codeAddr;
if (!jit.IsInCodeSpace(codePtr)) { if (!jit->IsInCodeSpace(codePtr)) {
// Let's not prevent debugging. // Let's not prevent debugging.
return (DWORD)EXCEPTION_CONTINUE_SEARCH; 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 //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. //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. // Rip/Eip needs to be updated.
if (new_rip) if (new_rip)
@ -190,7 +193,7 @@ void sigsegv_handler(int signal, siginfo_t *info, void *raw_context)
#else #else
u8 *fault_instruction_ptr = (u8 *)CREG_EIP(ctx); u8 *fault_instruction_ptr = (u8 *)CREG_EIP(ctx);
#endif #endif
if (!jit.IsInCodeSpace(fault_instruction_ptr)) { if (!jit->IsInCodeSpace(fault_instruction_ptr)) {
// Let's not prevent debugging. // Let's not prevent debugging.
return; return;
} }
@ -217,7 +220,7 @@ void sigsegv_handler(int signal, siginfo_t *info, void *raw_context)
fake_ctx.Eax = CREG_EAX(ctx); fake_ctx.Eax = CREG_EAX(ctx);
fake_ctx.Eip = CREG_EIP(ctx); fake_ctx.Eip = CREG_EIP(ctx);
#endif #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) { if (new_rip) {
#ifdef _M_X64 #ifdef _M_X64
CREG_RAX(ctx) = fake_ctx.Rax; CREG_RAX(ctx) = fake_ctx.Rax;

View file

@ -23,7 +23,7 @@
#include "Interpreter.h" #include "Interpreter.h"
#include "../../Core.h" #include "../../Core.h"
#include "../Jit64/Jit.h" #include "../JitCommon/JitBase.h"
#include "../JitCommon/JitCache.h" #include "../JitCommon/JitCache.h"
#include "Interpreter_FPUtils.h" #include "Interpreter_FPUtils.h"
@ -374,7 +374,7 @@ void icbi(UGeckoInstruction _inst)
{ {
u32 address = Helper_Get_EA_X(_inst); u32 address = Helper_Get_EA_X(_inst);
PowerPC::ppcState.iCache.Invalidate(address); PowerPC::ppcState.iCache.Invalidate(address);
jit.GetBlockCache()->InvalidateICache(address); jit->GetBlockCache()->InvalidateICache(address);
} }
void lbzux(UGeckoInstruction _inst) void lbzux(UGeckoInstruction _inst)

View file

@ -17,6 +17,11 @@
#include <map> #include <map>
// for the PROFILER stuff
#ifdef _WIN32
#include <windows.h>
#endif
#include "Common.h" #include "Common.h"
#include "x64Emitter.h" #include "x64Emitter.h"
#include "ABI.h" #include "ABI.h"
@ -35,17 +40,11 @@
#include "Jit.h" #include "Jit.h"
#include "JitAsm.h" #include "JitAsm.h"
#include "JitRegCache.h" #include "JitRegCache.h"
#include "../JitCommon/Jit_Tables.h" #include "Jit64_Tables.h"
#if defined JITTEST && JITTEST
#error Jit64 cannot have JITTEST define
#endif
using namespace Gen; using namespace Gen;
using namespace PowerPC; using namespace PowerPC;
extern int blocksExecuted;
// Dolphin's PowerPC->x86 JIT dynamic recompiler // Dolphin's PowerPC->x86 JIT dynamic recompiler
// (Nearly) all code by ector (hrydgard) // (Nearly) all code by ector (hrydgard)
// Features: // Features:
@ -110,7 +109,7 @@ extern int blocksExecuted;
/* /*
* Assume SP is in main RAM (in Wii mode too?) - partly done * 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 * 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? * AMD only - use movaps instead of movapd when loading ps from memory?
* HLE functions like floorf, sin, memcpy, etc - they can be much faster * 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. * ABI optimizations - drop F0-F13 on blr, for example. Watch out for context switching.
@ -161,42 +160,15 @@ ps_adds1
*/ */
//#define NAN_CHECK static int CODE_SIZE = 1024*1024*16;
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;
namespace CPUCompare namespace CPUCompare
{ {
extern u32 m_BlockStart; extern u32 m_BlockStart;
} }
void Jit(u32 em_address)
{
jit.Jit(em_address);
}
void Jit64::Init() void Jit64::Init()
{ {
asm_routines.compareEnabled = ::Core::g_CoreStartupParameter.bRunCompareClient;
jo.optimizeStack = true; jo.optimizeStack = true;
/* This will enable block linking in JitBlockCache::FinalizeBlock(), it gives faster execution but may not /* 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 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) void Jit64::unknown_instruction(UGeckoInstruction inst)
{ {
// CCPU::Break();
PanicAlert("unknown_instruction %08x - Fix me ;)", inst.hex); PanicAlert("unknown_instruction %08x - Fix me ;)", inst.hex);
} }
@ -310,7 +281,7 @@ static const bool ImHereDebug = false;
static const bool ImHereLog = false; static const bool ImHereLog = false;
static std::map<u32, int> been_here; static std::map<u32, int> been_here;
void ImHere() static void ImHere()
{ {
static FILE *f = 0; static FILE *f = 0;
if (ImHereLog) { if (ImHereLog) {
@ -338,13 +309,6 @@ void Jit64::Cleanup()
{ {
if (jo.optimizeGatherPipe && js.fifoBytesThisBlock > 0) if (jo.optimizeGatherPipe && js.fifoBytesThisBlock > 0)
ABI_CallFunction((void *)&GPFifo::CheckGatherPipe); 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) 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) { if (Profiler::g_ProfileBlocks) {
ADD(32, M(&b->runCount), Imm8(1)); ADD(32, M(&b->runCount), Imm8(1));
#ifdef _WIN32 #ifdef _WIN32
b->ticCounter.QuadPart = 0; b->ticCounter = 0;
b->ticStart.QuadPart = 0; b->ticStart = 0;
b->ticStop.QuadPart = 0; b->ticStop = 0;
#else #else
//TODO //TODO
#endif #endif
@ -555,7 +519,7 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc
} }
if (!ops[i].skip) if (!ops[i].skip)
JitTables::CompileInstruction(ops[i].inst); Jit64Tables::CompileInstruction(ops[i].inst);
gpr.SanityCheck(); gpr.SanityCheck();
fpr.SanityCheck(); fpr.SanityCheck();

View file

@ -31,14 +31,8 @@
// ---------- // ----------
#define JIT_OFF_OPTIONS // Compile with JIT off options #define JIT_OFF_OPTIONS // Compile with JIT off options
// Include #ifndef _JIT64_H
// ---------- #define _JIT64_H
#if JITTEST
#include "../Jit64IL/Jit.h"
#else
#ifndef _JIT_H
#define _JIT_H
#include "../PPCAnalyst.h" #include "../PPCAnalyst.h"
#include "../JitCommon/JitCache.h" #include "../JitCommon/JitCache.h"
@ -46,32 +40,9 @@
#include "JitRegCache.h" #include "JitRegCache.h"
#include "x64Emitter.h" #include "x64Emitter.h"
#include "x64Analyzer.h" #include "x64Analyzer.h"
#include "../JitCommon/JitBackpatch.h"
#ifdef _WIN32 #include "../JitCommon/JitBase.h"
#include <windows.h> #include "JitAsm.h"
#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
// Use these to control the instruction selection // Use these to control the instruction selection
// #define INSTRUCTION_START Default(inst); return; // #define INSTRUCTION_START Default(inst); return;
@ -83,18 +54,7 @@ void Jit(u32 em_address);
Core::g_CoreStartupParameter.bJIT##type##Off) \ Core::g_CoreStartupParameter.bJIT##type##Off) \
{Default(inst); return;} {Default(inst); return;}
class TrampolineCache : public Gen::XCodeBlock class Jit64 : public JitBase
{
public:
void Init();
void Shutdown();
const u8 *GetReadTrampoline(const InstructionInfo &info);
const u8 *GetWriteTrampoline(const InstructionInfo &info);
};
class Jit64 : public EmuCodeBlock
{ {
private: private:
struct JitState struct JitState
@ -121,35 +81,19 @@ private:
JitBlock *curBlock; 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; GPRRegCache gpr;
FPURegCache fpr; FPURegCache fpr;
// The default code buffer. We keep it around to not have to alloc/dealloc a // The default code buffer. We keep it around to not have to alloc/dealloc a
// large chunk of memory for each recompiled block. // large chunk of memory for each recompiled block.
PPCAnalyst::CodeBuffer code_buffer; PPCAnalyst::CodeBuffer code_buffer;
Jit64AsmRoutineManager asm_routines;
public: public:
Jit64() : code_buffer(32000) {} Jit64() : code_buffer(32000) {}
~Jit64() {} ~Jit64() {}
JitState js; JitState js;
JitOptions jo;
// Initialization, etc
void Init(); void Init();
void Shutdown(); void Shutdown();
@ -165,15 +109,25 @@ public:
void ClearCache(); 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! // Run!
void Run(); void Run();
void SingleStep(); void SingleStep();
const u8 *BackPatch(u8 *codePtr, int accessType, u32 em_address, CONTEXT *ctx);
#define JIT_OPCODE 0
// Utilities for use by opcodes // Utilities for use by opcodes
void WriteExit(u32 destination, int exit_num); void WriteExit(u32 destination, int exit_num);
@ -296,7 +250,6 @@ public:
void icbi(UGeckoInstruction inst); void icbi(UGeckoInstruction inst);
}; };
extern Jit64 jit; void ProfiledReJit();
#endif // _JIT_H #endif // _JIT64_H
#endif // JITTEST

View file

@ -15,25 +15,24 @@
// Official SVN repository and contact information can be found at // Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/ // 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 // Should be moved in to the Jit class
typedef void (Jit64::*_Instruction) (UGeckoInstruction instCode); typedef void (Jit64::*_Instruction) (UGeckoInstruction instCode);
_Instruction dynaOpTable[64]; static _Instruction dynaOpTable[64];
_Instruction dynaOpTable4[1024]; static _Instruction dynaOpTable4[1024];
_Instruction dynaOpTable19[1024]; static _Instruction dynaOpTable19[1024];
_Instruction dynaOpTable31[1024]; static _Instruction dynaOpTable31[1024];
_Instruction dynaOpTable59[32]; static _Instruction dynaOpTable59[32];
_Instruction dynaOpTable63[1024]; static _Instruction dynaOpTable63[1024];
void Jit64::DynaRunTable4(UGeckoInstruction _inst) {(this->*dynaOpTable4 [_inst.SUBOP10])(_inst);} void Jit64::DynaRunTable4(UGeckoInstruction _inst) {(this->*dynaOpTable4 [_inst.SUBOP10])(_inst);}
void Jit64::DynaRunTable19(UGeckoInstruction _inst) {(this->*dynaOpTable19[_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::DynaRunTable31(UGeckoInstruction _inst) {(this->*dynaOpTable31[_inst.SUBOP10])(_inst);}
void Jit64::DynaRunTable59(UGeckoInstruction _inst) {(this->*dynaOpTable59[_inst.SUBOP5 ])(_inst);} void Jit64::DynaRunTable59(UGeckoInstruction _inst) {(this->*dynaOpTable59[_inst.SUBOP5 ])(_inst);}
void Jit64::DynaRunTable63(UGeckoInstruction _inst) {(this->*dynaOpTable63[_inst.SUBOP10])(_inst);} void Jit64::DynaRunTable63(UGeckoInstruction _inst) {(this->*dynaOpTable63[_inst.SUBOP10])(_inst);}
struct GekkoOPTemplate struct GekkoOPTemplate
{ {
int opcode; 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}}, {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}}, {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}}, {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}}, {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}}, {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}}, {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}}, {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}}, {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}}, {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}}, {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}}, {470, &Jit64::Default}, //"dcbi", OPTYPE_DCACHE, 0, 4}},
{758, &Jit64::Default}, //"dcba", OPTYPE_DCACHE, 0, 4}}, {758, &Jit64::Default}, //"dcba", OPTYPE_DCACHE, 0, 4}},
{1014, &Jit64::dcbz}, //"dcbz", 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 //load word
{23, &Jit64::lwzx}, //"lwzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, {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}}, {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 //load byte
{87, &Jit64::lbzx}, //"lbzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, {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}}, {119, &Jit64::Default}, //"lbzux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}},
#endif
//load byte reverse //load byte reverse
{534, &Jit64::Default}, //"lwbrx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, {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}}, {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}}, {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}}, {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}}, {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}}, {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}}, {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}}, {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}}, {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}}, {31, &Jit64::fmaddXX}, //"fnmaddx", OPTYPE_FPU, FL_RC_BIT_F}},
}; };
namespace JitTables namespace Jit64Tables
{ {
void CompileInstruction(UGeckoInstruction _inst) void CompileInstruction(UGeckoInstruction _inst)
{ {
(jit.*dynaOpTable[_inst.OPCD])(_inst); Jit64 *jit64 = (Jit64 *)jit;
(jit64->*dynaOpTable[_inst.OPCD])(_inst);
GekkoOPInfo *info = GetOpInfo(_inst); GekkoOPInfo *info = GetOpInfo(_inst);
if (info) { if (info) {
#ifdef OPLOG #ifdef OPLOG
@ -416,11 +388,12 @@ void CompileInstruction(UGeckoInstruction _inst)
} }
#endif #endif
info->compileCount++; info->compileCount++;
info->lastUse = jit.js.compilerPC; info->lastUse = jit->js.compilerPC;
} else { } 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() void InitTables()
{ {
//clear //clear
@ -512,4 +485,5 @@ void InitTables()
} }
} }
} }
}
} // namespace

View file

@ -15,18 +15,14 @@
// Official SVN repository and contact information can be found at // Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/ // http://code.google.com/p/dolphin-emu/
#ifndef JIT_TABLES_H #ifndef JIT64_TABLES_H
#define JIT_TABLES_H #define JIT64_TABLES_H
#include "../Gekko.h" #include "../Gekko.h"
#include "../PPCTables.h" #include "../PPCTables.h"
#if defined JITTEST && JITTEST
#include "../Jit64IL/Jit.h"
#else
#include "../Jit64/Jit.h" #include "../Jit64/Jit.h"
#endif
namespace Jit64Tables
namespace JitTables
{ {
void CompileInstruction(UGeckoInstruction _inst); void CompileInstruction(UGeckoInstruction _inst);
void InitTables(); void InitTables();

View file

@ -33,12 +33,9 @@
#include "JitAsm.h" #include "JitAsm.h"
using namespace Gen; using namespace Gen;
int blocksExecuted;
static int temp32; static int temp32;
bool compareEnabled = false;
//TODO - make an option //TODO - make an option
//#if _DEBUG //#if _DEBUG
static bool enableDebug = false; static bool enableDebug = false;
@ -56,21 +53,21 @@ static bool enableStatistics = false;
//RBX - Base pointer of memory //RBX - Base pointer of memory
//R15 - Pointer to array of block pointers //R15 - Pointer to array of block pointers
AsmRoutineManager asm_routines; Jit64AsmRoutineManager asm_routines;
// PLAN: no more block numbers - crazy opcodes just contain offset within // PLAN: no more block numbers - crazy opcodes just contain offset within
// dynarec buffer // dynarec buffer
// At this offset - 4, there is an int specifying the block number. // At this offset - 4, there is an int specifying the block number.
void AsmRoutineManager::Generate() void Jit64AsmRoutineManager::Generate()
{ {
enterCode = AlignCode16(); enterCode = AlignCode16();
ABI_PushAllCalleeSavedRegsAndAdjustStack(); ABI_PushAllCalleeSavedRegsAndAdjustStack();
#ifndef _M_IX86 #ifndef _M_IX86
// Two statically allocated registers. // Two statically allocated registers.
MOV(64, R(RBX), Imm64((u64)Memory::base)); 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 #endif
const u8 *outerLoop = GetCodePtr(); const u8 *outerLoop = GetCodePtr();
@ -94,17 +91,13 @@ void AsmRoutineManager::Generate()
FixupBranch notfound = J_CC(CC_NZ); FixupBranch notfound = J_CC(CC_NZ);
BSWAP(32, EAX); BSWAP(32, EAX);
//IDEA - we have 26 bits, why not just use offsets from base of code? //IDEA - we have 26 bits, why not just use offsets from base of code?
if (enableStatistics)
{
ADD(32, M(&blocksExecuted), Imm8(1));
}
if (enableDebug) if (enableDebug)
{ {
ADD(32, M(&PowerPC::ppcState.DebugCount), Imm8(1)); ADD(32, M(&PowerPC::ppcState.DebugCount), Imm8(1));
} }
//grab from list and jump to it //grab from list and jump to it
#ifdef _M_IX86 #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)); JMPptr(MComplex(EDX, EAX, 4, 0));
#else #else
JMPptr(MComplex(R15, RAX, 8, 0)); JMPptr(MComplex(R15, RAX, 8, 0));
@ -166,9 +159,9 @@ void AsmRoutineManager::Generate()
AND(32, R(EAX), Imm32(JIT_ICACHE_MASK)); AND(32, R(EAX), Imm32(JIT_ICACHE_MASK));
#ifdef _M_IX86 #ifdef _M_IX86
MOV(32, R(EAX), MDisp(EAX, (u32)jit.GetBlockCache()->GetICache())); MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->GetICache()));
#else #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)); MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0));
#endif #endif
@ -177,9 +170,9 @@ void AsmRoutineManager::Generate()
AND(32, R(EAX), Imm32(JIT_ICACHEEX_MASK)); AND(32, R(EAX), Imm32(JIT_ICACHEEX_MASK));
#ifdef _M_IX86 #ifdef _M_IX86
MOV(32, R(EAX), MDisp(EAX, (u32)jit.GetBlockCache()->GetICacheEx())); MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->GetICacheEx()));
#else #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)); MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0));
#endif #endif
@ -188,9 +181,9 @@ void AsmRoutineManager::Generate()
AND(32, R(EAX), Imm32(JIT_ICACHE_MASK)); AND(32, R(EAX), Imm32(JIT_ICACHE_MASK));
#ifdef _M_IX86 #ifdef _M_IX86
MOV(32, R(EAX), MDisp(EAX, (u32)jit.GetBlockCache()->GetICacheVMEM())); MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->GetICacheVMEM()));
#else #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)); MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0));
#endif #endif
@ -216,7 +209,7 @@ void AsmRoutineManager::Generate()
GenerateCommon(); GenerateCommon();
} }
void AsmRoutineManager::GenerateCommon() void Jit64AsmRoutineManager::GenerateCommon()
{ {
// USES_CR // USES_CR
computeRc = AlignCode16(); computeRc = AlignCode16();

View file

@ -15,8 +15,8 @@
// Official SVN repository and contact information can be found at // Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/ // http://code.google.com/p/dolphin-emu/
#ifndef _JITASM_H #ifndef _JIT64ASM_H
#define _JITASM_H #define _JIT64ASM_H
#include "x64Emitter.h" #include "x64Emitter.h"
#include "../JitCommon/JitAsmCommon.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. // 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. // Also, possibly increase the size of the code buffer.
class AsmRoutineManager : public CommonAsmRoutines class Jit64AsmRoutineManager : public CommonAsmRoutines
{ {
private: private:
void Generate(); void Generate();
@ -51,33 +51,8 @@ public:
void Shutdown() { void Shutdown() {
FreeCodeSpace(); 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

View file

@ -25,6 +25,17 @@
using namespace Gen; using namespace Gen;
using namespace PowerPC; 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) void RegCache::Start(PPCAnalyst::BlockRegStats &stats)
{ {
for (int i = 0; i < NUMXREGS; i++) for (int i = 0; i < NUMXREGS; i++)

View file

@ -15,8 +15,8 @@
// Official SVN repository and contact information can be found at // Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/ // http://code.google.com/p/dolphin-emu/
#ifndef _JITREGCACHE_H #ifndef _JIT64REGCACHE_H
#define _JITREGCACHE_H #define _JIT64REGCACHE_H
#include "x64Emitter.h" #include "x64Emitter.h"
@ -75,6 +75,8 @@ protected:
XEmitter *emit; XEmitter *emit;
public: public:
RegCache();
virtual ~RegCache() {} virtual ~RegCache() {}
virtual void Start(PPCAnalyst::BlockRegStats &stats) = 0; virtual void Start(PPCAnalyst::BlockRegStats &stats) = 0;
@ -147,4 +149,4 @@ public:
OpArg GetDefaultLocation(int reg) const; OpArg GetDefaultLocation(int reg) const;
}; };
#endif #endif // _JIT64REGCACHE_H

View file

@ -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) void Jit64::addx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START

View file

@ -19,7 +19,7 @@
// Should give a very noticable speed boost to paired single heavy code. // Should give a very noticable speed boost to paired single heavy code.
#include "Common.h" #include "Common.h"
#include "Thunk.h" #include "Thunk.h"
#include "../PowerPC.h" #include "../PowerPC.h"
#include "../../Core.h" #include "../../Core.h"

View file

@ -134,8 +134,8 @@ Fix profiled loads/stores to work safely. On 32-bit, one solution is to
#include "../../CoreTiming.h" #include "../../CoreTiming.h"
#include "Thunk.h" #include "Thunk.h"
#include "../../HW/Memmap.h" #include "../../HW/Memmap.h"
#include "JitAsm.h" #include "JitILAsm.h"
#include "Jit.h" #include "JitIL.h"
#include "../../HW/GPFifo.h" #include "../../HW/GPFifo.h"
#include "../../Core.h" #include "../../Core.h"
using namespace Gen; using namespace Gen;

View file

@ -42,8 +42,8 @@ The register allocation is just a simple forward greedy allocator.
#include "../../CoreTiming.h" #include "../../CoreTiming.h"
#include "Thunk.h" #include "Thunk.h"
#include "../../HW/Memmap.h" #include "../../HW/Memmap.h"
#include "JitAsm.h" #include "JitILAsm.h"
#include "Jit.h" #include "JitIL.h"
#include "../../HW/GPFifo.h" #include "../../HW/GPFifo.h"
#include "../../Core.h" #include "../../Core.h"
#include "x64Emitter.h" #include "x64Emitter.h"
@ -52,7 +52,7 @@ using namespace IREmitter;
using namespace Gen; using namespace Gen;
struct RegInfo { struct RegInfo {
Jit64* Jit; JitIL *Jit;
IRBuilder* Build; IRBuilder* Build;
InstLoc FirstI; InstLoc FirstI;
std::vector<unsigned> IInfo; std::vector<unsigned> IInfo;
@ -65,7 +65,7 @@ struct RegInfo {
unsigned numProfiledLoads; unsigned numProfiledLoads;
unsigned exitNumber; 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++) { for (unsigned i = 0; i < 16; i++) {
regs[i] = 0; regs[i] = 0;
fregs[i] = 0; fregs[i] = 0;
@ -296,7 +296,7 @@ static void fregNormalRegClear(RegInfo& RI, InstLoc I) {
} }
static void regEmitBinInst(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&), const OpArg&),
bool commutable = false) { bool commutable = false) {
X64Reg reg; X64Reg reg;
@ -327,7 +327,7 @@ static void regEmitBinInst(RegInfo& RI, InstLoc I,
} }
static void fregEmitBinInst(RegInfo& RI, InstLoc I, static void fregEmitBinInst(RegInfo& RI, InstLoc I,
void (Jit64::*op)(X64Reg, OpArg)) { void (JitIL::*op)(X64Reg, OpArg)) {
X64Reg reg; X64Reg reg;
if (RI.IInfo[I - RI.FirstI] & 4) { if (RI.IInfo[I - RI.FirstI] & 4) {
reg = fregEnsureInReg(RI, getOp1(I)); reg = fregEnsureInReg(RI, getOp1(I));
@ -577,7 +577,7 @@ static void regEmitMemStore(RegInfo& RI, InstLoc I, unsigned Size) {
regClearInst(RI, getOp1(I)); 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); X64Reg reg = regBinLHSReg(RI, I);
if (isImm(*getOp2(I))) { if (isImm(*getOp2(I))) {
@ -634,7 +634,7 @@ static void regWriteExit(RegInfo& RI, InstLoc dest) {
} }
RI.Jit->Cleanup(); RI.Jit->Cleanup();
RI.Jit->SUB(32, M(&CoreTiming::downcount), Imm32(RI.Jit->js.downcountAmount)); 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; return;
} }
if (isImm(*dest)) { 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); //printf("Writing block: %x\n", js.blockStart);
RegInfo RI(Jit, ibuild->getFirstInst(), ibuild->getNumInsts()); RegInfo RI(Jit, ibuild->getFirstInst(), ibuild->getNumInsts());
RI.Build = ibuild; RI.Build = ibuild;
@ -994,27 +994,27 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak
} }
case And: { case And: {
if (!thisUsed) break; if (!thisUsed) break;
regEmitBinInst(RI, I, &Jit64::AND, true); regEmitBinInst(RI, I, &JitIL::AND, true);
break; break;
} }
case Xor: { case Xor: {
if (!thisUsed) break; if (!thisUsed) break;
regEmitBinInst(RI, I, &Jit64::XOR, true); regEmitBinInst(RI, I, &JitIL::XOR, true);
break; break;
} }
case Sub: { case Sub: {
if (!thisUsed) break; if (!thisUsed) break;
regEmitBinInst(RI, I, &Jit64::SUB); regEmitBinInst(RI, I, &JitIL::SUB);
break; break;
} }
case Or: { case Or: {
if (!thisUsed) break; if (!thisUsed) break;
regEmitBinInst(RI, I, &Jit64::OR, true); regEmitBinInst(RI, I, &JitIL::OR, true);
break; break;
} }
case Add: { case Add: {
if (!thisUsed) break; if (!thisUsed) break;
regEmitBinInst(RI, I, &Jit64::ADD, true); regEmitBinInst(RI, I, &JitIL::ADD, true);
break; break;
} }
case Mul: { case Mul: {
@ -1037,22 +1037,22 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak
} }
case Rol: { case Rol: {
if (!thisUsed) break; if (!thisUsed) break;
regEmitShiftInst(RI, I, &Jit64::ROL); regEmitShiftInst(RI, I, &JitIL::ROL);
break; break;
} }
case Shl: { case Shl: {
if (!thisUsed) break; if (!thisUsed) break;
regEmitShiftInst(RI, I, &Jit64::SHL); regEmitShiftInst(RI, I, &JitIL::SHL);
break; break;
} }
case Shrl: { case Shrl: {
if (!thisUsed) break; if (!thisUsed) break;
regEmitShiftInst(RI, I, &Jit64::SHR); regEmitShiftInst(RI, I, &JitIL::SHR);
break; break;
} }
case Sarl: { case Sarl: {
if (!thisUsed) break; if (!thisUsed) break;
regEmitShiftInst(RI, I, &Jit64::SAR); regEmitShiftInst(RI, I, &JitIL::SAR);
break; break;
} }
case ICmpEq: { case ICmpEq: {
@ -1183,7 +1183,7 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak
Jit->SHL(32, R(EDX), Imm8(3)); Jit->SHL(32, R(EDX), Imm8(3));
#endif #endif
Jit->MOV(32, R(ECX), regLocForInst(RI, getOp1(I))); 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)); Jit->MOVAPD(reg, R(XMM0));
RI.fregs[reg] = I; RI.fregs[reg] = I;
regNormalRegClear(RI, I); regNormalRegClear(RI, I);
@ -1242,7 +1242,7 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak
#endif #endif
Jit->MOV(32, R(ECX), regLocForInst(RI, getOp2(I))); Jit->MOV(32, R(ECX), regLocForInst(RI, getOp2(I)));
Jit->MOVAPD(XMM0, fregLocForInst(RI, getOp1(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) if (RI.IInfo[I - RI.FirstI] & 4)
fregClearInst(RI, getOp1(I)); fregClearInst(RI, getOp1(I));
if (RI.IInfo[I - RI.FirstI] & 8) if (RI.IInfo[I - RI.FirstI] & 8)
@ -1376,17 +1376,17 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak
} }
case FSMul: { case FSMul: {
if (!thisUsed) break; if (!thisUsed) break;
fregEmitBinInst(RI, I, &Jit64::MULSS); fregEmitBinInst(RI, I, &JitIL::MULSS);
break; break;
} }
case FSAdd: { case FSAdd: {
if (!thisUsed) break; if (!thisUsed) break;
fregEmitBinInst(RI, I, &Jit64::ADDSS); fregEmitBinInst(RI, I, &JitIL::ADDSS);
break; break;
} }
case FSSub: { case FSSub: {
if (!thisUsed) break; if (!thisUsed) break;
fregEmitBinInst(RI, I, &Jit64::SUBSS); fregEmitBinInst(RI, I, &JitIL::SUBSS);
break; break;
} }
case FSRSqrt: { case FSRSqrt: {
@ -1399,17 +1399,17 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak
} }
case FDMul: { case FDMul: {
if (!thisUsed) break; if (!thisUsed) break;
fregEmitBinInst(RI, I, &Jit64::MULSD); fregEmitBinInst(RI, I, &JitIL::MULSD);
break; break;
} }
case FDAdd: { case FDAdd: {
if (!thisUsed) break; if (!thisUsed) break;
fregEmitBinInst(RI, I, &Jit64::ADDSD); fregEmitBinInst(RI, I, &JitIL::ADDSD);
break; break;
} }
case FDSub: { case FDSub: {
if (!thisUsed) break; if (!thisUsed) break;
fregEmitBinInst(RI, I, &Jit64::SUBSD); fregEmitBinInst(RI, I, &JitIL::SUBSD);
break; break;
} }
case FDCmpCR: { case FDCmpCR: {
@ -1443,17 +1443,17 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak
} }
case FPAdd: { case FPAdd: {
if (!thisUsed) break; if (!thisUsed) break;
fregEmitBinInst(RI, I, &Jit64::ADDPS); fregEmitBinInst(RI, I, &JitIL::ADDPS);
break; break;
} }
case FPMul: { case FPMul: {
if (!thisUsed) break; if (!thisUsed) break;
fregEmitBinInst(RI, I, &Jit64::MULPS); fregEmitBinInst(RI, I, &JitIL::MULPS);
break; break;
} }
case FPSub: { case FPSub: {
if (!thisUsed) break; if (!thisUsed) break;
fregEmitBinInst(RI, I, &Jit64::SUBPS); fregEmitBinInst(RI, I, &JitIL::SUBPS);
break; break;
} }
case FPMerge00: { case FPMerge00: {
@ -1518,7 +1518,7 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak
Jit->ABI_CallFunction((void *)&PowerPC::OnIdleIL); Jit->ABI_CallFunction((void *)&PowerPC::OnIdleIL);
Jit->MOV(32, M(&PC), Imm32(ibuild->GetImmValue( getOp2(I) ))); 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); Jit->SetJumpTarget(cont);
if (RI.IInfo[I - RI.FirstI] & 4) 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)); unsigned InstLoc = ibuild->GetImmValue(getOp1(I));
Jit->ABI_CallFunction((void *)&CoreTiming::Idle); Jit->ABI_CallFunction((void *)&CoreTiming::Idle);
Jit->MOV(32, M(&PC), Imm32(InstLoc)); Jit->MOV(32, M(&PC), Imm32(InstLoc));
Jit->JMP(asm_routines.testExceptions, true); Jit->JMP(((JitIL *)jit)->asm_routines.testExceptions, true);
break; break;
} }
case SystemCall: { case SystemCall: {
@ -1580,7 +1580,7 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak
Jit->Cleanup(); Jit->Cleanup();
Jit->OR(32, M(&PowerPC::ppcState.Exceptions), Imm32(EXCEPTION_SYSCALL)); Jit->OR(32, M(&PowerPC::ppcState.Exceptions), Imm32(EXCEPTION_SYSCALL));
Jit->MOV(32, M(&PC), Imm32(InstLoc + 4)); Jit->MOV(32, M(&PC), Imm32(InstLoc + 4));
Jit->JMP(asm_routines.testExceptions, true); Jit->JMP(((JitIL *)jit)->asm_routines.testExceptions, true);
break; break;
} }
case InterpreterBranch: { case InterpreterBranch: {
@ -1635,13 +1635,13 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile, bool Mak
Jit->UD2(); Jit->UD2();
} }
void Jit64::WriteCode() { void JitIL::WriteCode() {
DoWriteCode(&ibuild, this, false, Core::GetStartupParameter().bJITProfiledReJIT); DoWriteCode(&ibuild, this, false, Core::GetStartupParameter().bJITProfiledReJIT);
} }
void ProfiledReJit() { void ProfiledReJit() {
jit.SetCodePtr(jit.js.rewriteStart); jit->SetCodePtr(jit->js.rewriteStart);
DoWriteCode(&jit.ibuild, &jit, true, false); DoWriteCode(&((JitIL *)jit)->ibuild, (JitIL *)jit, true, false);
jit.js.curBlock->codeSize = (int)(jit.GetCodePtr() - jit.js.rewriteStart); 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->GetBlockCache()->FinalizeBlock(jit->js.curBlock->blockNum, jit->jo.enableBlocklink, jit->js.curBlock->normalEntry);
} }

View file

@ -31,16 +31,14 @@
#include "../PPCAnalyst.h" #include "../PPCAnalyst.h"
#include "../../HW/Memmap.h" #include "../../HW/Memmap.h"
#include "../../HW/GPFifo.h" #include "../../HW/GPFifo.h"
#include "Jit.h"
#include "JitAsm.h"
#include "../JitCommon/JitCache.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 Gen;
using namespace PowerPC; using namespace PowerPC;
extern int blocksExecuted;
// Dolphin's PowerPC->x86 JIT dynamic recompiler // Dolphin's PowerPC->x86 JIT dynamic recompiler
// (Nearly) all code by ector (hrydgard) // (Nearly) all code by ector (hrydgard)
// Features: // Features:
@ -156,34 +154,22 @@ ps_adds1
*/ */
Jit64 jit; static int CODE_SIZE = 1024*1024*16;
int CODE_SIZE = 1024*1024*16;
namespace CPUCompare namespace CPUCompare
{ {
extern u32 m_BlockStart; 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) if (Core::g_CoreStartupParameter.bJITUnlimitedCache)
CODE_SIZE = 1024*1024*8*8; CODE_SIZE = 1024*1024*8*8;
jo.optimizeStack = true; jo.optimizeStack = true;
jo.enableBlocklink = true; // Speed boost, but not 100% safe jo.enableBlocklink = true; // Speed boost, but not 100% safe
#ifdef _M_X64 #ifdef _M_X64
#ifdef JITTEST
jo.enableFastMem = false; jo.enableFastMem = false;
#else
jo.enableFastMem = Core::GetStartupParameter().bUseFastMem;
#endif
#else #else
jo.enableFastMem = false; jo.enableFastMem = false;
#endif #endif
@ -200,14 +186,14 @@ void Jit64::Init()
asm_routines.Init(); asm_routines.Init();
} }
void Jit64::ClearCache() void JitIL::ClearCache()
{ {
blocks.Clear(); blocks.Clear();
trampolines.ClearCodeSpace(); trampolines.ClearCodeSpace();
ClearCodeSpace(); ClearCodeSpace();
} }
void Jit64::Shutdown() void JitIL::Shutdown()
{ {
FreeCodeSpace(); FreeCodeSpace();
@ -217,7 +203,7 @@ void Jit64::Shutdown()
} }
void Jit64::WriteCallInterpreter(UGeckoInstruction inst) void JitIL::WriteCallInterpreter(UGeckoInstruction inst)
{ {
if (js.isLastInstruction) 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(); // CCPU::Break();
PanicAlert("unknown_instruction %08x - Fix me ;)", inst.hex); PanicAlert("unknown_instruction %08x - Fix me ;)", inst.hex);
} }
void Jit64::Default(UGeckoInstruction _inst) void JitIL::Default(UGeckoInstruction _inst)
{ {
ibuild.EmitInterpreterFallback( ibuild.EmitInterpreterFallback(
ibuild.EmitIntConst(_inst.hex), ibuild.EmitIntConst(_inst.hex),
ibuild.EmitIntConst(js.compilerPC)); ibuild.EmitIntConst(js.compilerPC));
} }
void Jit64::HLEFunction(UGeckoInstruction _inst) void JitIL::HLEFunction(UGeckoInstruction _inst)
{ {
ABI_CallFunctionCC((void*)&HLE::Execute, js.compilerPC, _inst.hex); ABI_CallFunctionCC((void*)&HLE::Execute, js.compilerPC, _inst.hex);
MOV(32, R(EAX), M(&NPC)); MOV(32, R(EAX), M(&NPC));
WriteExitDestInEAX(0); WriteExitDestInEAX(0);
} }
void Jit64::DoNothing(UGeckoInstruction _inst) void JitIL::DoNothing(UGeckoInstruction _inst)
{ {
// Yup, just don't do anything. // 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); int block_num = blocks.GetBlockNumberFromStartAddress(em_address);
if (block_num >= 0) if (block_num >= 0)
@ -271,7 +257,7 @@ static const bool ImHereDebug = false;
static const bool ImHereLog = false; static const bool ImHereLog = false;
static std::map<u32, int> been_here; static std::map<u32, int> been_here;
void ImHere() static void ImHere()
{ {
static FILE *f = 0; static FILE *f = 0;
if (ImHereLog) if (ImHereLog)
@ -296,13 +282,13 @@ void ImHere()
been_here[PC] = 1; been_here[PC] = 1;
} }
void Jit64::Cleanup() void JitIL::Cleanup()
{ {
if (jo.optimizeGatherPipe && js.fifoBytesThisBlock > 0) if (jo.optimizeGatherPipe && js.fifoBytesThisBlock > 0)
ABI_CallFunction((void *)&GPFifo::CheckGatherPipe); ABI_CallFunction((void *)&GPFifo::CheckGatherPipe);
} }
void Jit64::WriteExit(u32 destination, int exit_num) void JitIL::WriteExit(u32 destination, int exit_num)
{ {
Cleanup(); Cleanup();
SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); 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)); MOV(32, M(&PC), R(EAX));
Cleanup(); Cleanup();
@ -335,7 +321,7 @@ void Jit64::WriteExitDestInEAX(int exit_num)
JMP(asm_routines.dispatcher, true); JMP(asm_routines.dispatcher, true);
} }
void Jit64::WriteRfiExitDestInEAX() void JitIL::WriteRfiExitDestInEAX()
{ {
MOV(32, M(&PC), R(EAX)); MOV(32, M(&PC), R(EAX));
Cleanup(); Cleanup();
@ -343,7 +329,7 @@ void Jit64::WriteRfiExitDestInEAX()
JMP(asm_routines.testExceptions, true); JMP(asm_routines.testExceptions, true);
} }
void Jit64::WriteExceptionExit(u32 exception) void JitIL::WriteExceptionExit(u32 exception)
{ {
Cleanup(); Cleanup();
OR(32, M(&PowerPC::ppcState.Exceptions), Imm32(exception)); OR(32, M(&PowerPC::ppcState.Exceptions), Imm32(exception));
@ -351,14 +337,14 @@ void Jit64::WriteExceptionExit(u32 exception)
JMP(asm_routines.testExceptions, true); JMP(asm_routines.testExceptions, true);
} }
void STACKALIGN Jit64::Run() void STACKALIGN JitIL::Run()
{ {
CompiledCode pExecAddr = (CompiledCode)asm_routines.enterCode; CompiledCode pExecAddr = (CompiledCode)asm_routines.enterCode;
pExecAddr(); pExecAddr();
//Will return when PowerPC::state changes //Will return when PowerPC::state changes
} }
void Jit64::SingleStep() void JitIL::SingleStep()
{ {
// NOT USED, NOT TESTED, PROBABLY NOT WORKING YET // NOT USED, NOT TESTED, PROBABLY NOT WORKING YET
// PanicAlert("Single"); // PanicAlert("Single");
@ -370,7 +356,7 @@ void Jit64::SingleStep()
pExecAddr();*/ pExecAddr();*/
} }
void STACKALIGN Jit64::Jit(u32 em_address) void STACKALIGN JitIL::Jit(u32 em_address)
{ {
if (GetSpaceLeft() < 0x10000 || blocks.IsFull()) 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)); 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) if (em_address == 0)
PanicAlert("ERROR : Trying to compile at 0. LR=%08x", LR); 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) if (!ops[i].skip)
JitTables::CompileInstruction(ops[i].inst); {
JitILTables::CompileInstruction(ops[i].inst);
}
} }
// Perform actual code generation // Perform actual code generation

View file

@ -27,36 +27,19 @@
// * A flush simply does a conditional write to the appropriate CRx. // * A flush simply does a conditional write to the appropriate CRx.
// * If flag available, branch code can become absolutely trivial. // * If flag available, branch code can become absolutely trivial.
#ifndef _JIT_H #ifndef _JITIL_H
#define _JIT_H #define _JITIL_H
#include "../PPCAnalyst.h" #include "../PPCAnalyst.h"
#include "../JitCommon/JitBase.h"
#include "../JitCommon/JitCache.h" #include "../JitCommon/JitCache.h"
#include "../JitCommon/JitBackpatch.h"
#include "../JitCommon/Jit_Util.h" #include "../JitCommon/Jit_Util.h"
#include "x64Emitter.h" #include "x64Emitter.h"
#include "x64Analyzer.h" #include "x64Analyzer.h"
#include "IR.h" #include "IR.h"
#include "../JitCommon/JitBase.h"
#ifdef _WIN32 #include "JitILAsm.h"
#include <windows.h>
#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
// #define INSTRUCTION_START Default(inst); return; // #define INSTRUCTION_START Default(inst); return;
// #define INSTRUCTION_START PPCTables::CountInstruction(inst); // #define INSTRUCTION_START PPCTables::CountInstruction(inst);
@ -74,70 +57,21 @@ struct CONTEXT
#define DISABLE64 #define DISABLE64
#endif #endif
class JitIL : public JitBase
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
{ {
private: 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 // The default code buffer. We keep it around to not have to alloc/dealloc a
// large chunk of memory for each recompiled block. // large chunk of memory for each recompiled block.
PPCAnalyst::CodeBuffer code_buffer; PPCAnalyst::CodeBuffer code_buffer;
public: public:
Jit64() : code_buffer(32000) {} JitILAsmRoutineManager asm_routines;
~Jit64() {}
JitIL() : code_buffer(32000) {}
~JitIL() {}
JitState js;
JitOptions jo;
IREmitter::IRBuilder ibuild; IREmitter::IRBuilder ibuild;
// Initialization, etc // Initialization, etc
@ -150,21 +84,29 @@ public:
void Jit(u32 em_address); void Jit(u32 em_address);
const u8* DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buffer, JitBlock *b); const u8* DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buffer, JitBlock *b);
JitBlockCache *GetBlockCache() { return &blocks; }
void NotifyBreakpoint(u32 em_address, bool set); void NotifyBreakpoint(u32 em_address, bool set);
void ClearCache(); 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! // Run!
void Run(); void Run();
void SingleStep(); void SingleStep();
const u8 *BackPatch(u8 *codePtr, int accessType, u32 em_address, CONTEXT *ctx);
#define JIT_OPCODE 0
// Utilities for use by opcodes // Utilities for use by opcodes
void WriteExit(u32 destination, int exit_num); void WriteExit(u32 destination, int exit_num);
@ -178,10 +120,10 @@ public:
void WriteFloatToConstRamAddress(const Gen::X64Reg& xmm_reg, u32 address); void WriteFloatToConstRamAddress(const Gen::X64Reg& xmm_reg, u32 address);
void GenerateCarry(Gen::X64Reg temp_reg); 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); 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 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 (XEmitter::*op)(Gen::X64Reg, Gen::OpArg)); void fp_tri_op(int d, int a, int b, bool reversible, bool dupe, void (Gen::XEmitter::*op)(Gen::X64Reg, Gen::OpArg));
void WriteCode(); void WriteCode();
@ -288,10 +230,8 @@ public:
void icbi(UGeckoInstruction inst); void icbi(UGeckoInstruction inst);
}; };
extern Jit64 jit;
void Jit(u32 em_address); void Jit(u32 em_address);
void ProfiledReJit(); void ProfiledReJit();
#endif #endif // _JITIL_H

View file

@ -26,20 +26,17 @@
#include "CPUDetect.h" #include "CPUDetect.h"
#include "ABI.h" #include "ABI.h"
#include "Jit.h"
#include "Thunk.h" #include "Thunk.h"
#include "../../HW/GPFifo.h" #include "../../HW/GPFifo.h"
#include "../../Core.h" #include "../../Core.h"
#include "JitAsm.h" #include "JitIL.h"
#include "JitILAsm.h"
using namespace Gen; using namespace Gen;
int blocksExecuted;
static int temp32; static int temp32;
bool compareEnabled = false;
//TODO - make an option //TODO - make an option
//#if _DEBUG //#if _DEBUG
static bool enableDebug = false; static bool enableDebug = false;
@ -57,20 +54,20 @@ static bool enableStatistics = false;
//RBX - Base pointer of memory //RBX - Base pointer of memory
//R15 - Pointer to array of block pointers //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 // PLAN: no more block numbers - crazy opcodes just contain offset within
// dynarec buffer // dynarec buffer
// At this offset - 4, there is an int specifying the block number. // At this offset - 4, there is an int specifying the block number.
void AsmRoutineManager::Generate() void JitILAsmRoutineManager::Generate()
{ {
enterCode = AlignCode16(); enterCode = AlignCode16();
ABI_PushAllCalleeSavedRegsAndAdjustStack(); ABI_PushAllCalleeSavedRegsAndAdjustStack();
#ifndef _M_IX86 #ifndef _M_IX86
// Two statically allocated registers. // Two statically allocated registers.
MOV(64, R(RBX), Imm64((u64)Memory::base)); 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 #endif
// INT3(); // INT3();
@ -96,17 +93,13 @@ void AsmRoutineManager::Generate()
FixupBranch notfound = J_CC(CC_NZ); FixupBranch notfound = J_CC(CC_NZ);
BSWAP(32, EAX); BSWAP(32, EAX);
//IDEA - we have 26 bits, why not just use offsets from base of code? //IDEA - we have 26 bits, why not just use offsets from base of code?
if (enableStatistics)
{
ADD(32, M(&blocksExecuted), Imm8(1));
}
if (enableDebug) if (enableDebug)
{ {
ADD(32, M(&PowerPC::ppcState.DebugCount), Imm8(1)); ADD(32, M(&PowerPC::ppcState.DebugCount), Imm8(1));
} }
//grab from list and jump to it //grab from list and jump to it
#ifdef _M_IX86 #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)); JMPptr(MComplex(EDX, EAX, 4, 0));
#else #else
JMPptr(MComplex(R15, RAX, 8, 0)); JMPptr(MComplex(R15, RAX, 8, 0));
@ -171,9 +164,9 @@ void AsmRoutineManager::Generate()
AND(32, R(EAX), Imm32(JIT_ICACHE_MASK)); AND(32, R(EAX), Imm32(JIT_ICACHE_MASK));
#ifdef _M_IX86 #ifdef _M_IX86
MOV(32, R(EAX), MDisp(EAX, (u32)jit.GetBlockCache()->GetICache())); MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->GetICache()));
#else #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)); MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0));
#endif #endif
@ -182,9 +175,9 @@ void AsmRoutineManager::Generate()
AND(32, R(EAX), Imm32(JIT_ICACHEEX_MASK)); AND(32, R(EAX), Imm32(JIT_ICACHEEX_MASK));
#ifdef _M_IX86 #ifdef _M_IX86
MOV(32, R(EAX), MDisp(EAX, (u32)jit.GetBlockCache()->GetICacheEx())); MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->GetICacheEx()));
#else #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)); MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0));
#endif #endif
@ -193,9 +186,9 @@ void AsmRoutineManager::Generate()
AND(32, R(EAX), Imm32(JIT_ICACHE_MASK)); AND(32, R(EAX), Imm32(JIT_ICACHE_MASK));
#ifdef _M_IX86 #ifdef _M_IX86
MOV(32, R(EAX), MDisp(EAX, (u32)jit.GetBlockCache()->GetICacheVMEM())); MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->GetICacheVMEM()));
#else #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)); MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0));
#endif #endif
@ -215,7 +208,7 @@ void AsmRoutineManager::Generate()
GenerateCommon(); GenerateCommon();
} }
void AsmRoutineManager::GenerateCommon() void JitILAsmRoutineManager::GenerateCommon()
{ {
// USES_CR // USES_CR
computeRc = AlignCode16(); computeRc = AlignCode16();

View file

@ -35,7 +35,7 @@
// To add a new asm routine, just add another const here, and add the code to Generate. // 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. // Also, possibly increase the size of the code buffer.
class AsmRoutineManager : public CommonAsmRoutines class JitILAsmRoutineManager : public CommonAsmRoutines
{ {
private: private:
void Generate(); void Generate();
@ -52,35 +52,9 @@ public:
FreeCodeSpace(); 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; const u8 *doReJit;
bool compareEnabled;
}; };
extern AsmRoutineManager asm_routines; extern JitILAsmRoutineManager jitil_asm_routines;
#endif #endif

View file

@ -23,8 +23,8 @@
#include "../PPCTables.h" #include "../PPCTables.h"
#include "x64Emitter.h" #include "x64Emitter.h"
#include "Jit.h" #include "JitIL.h"
#include "JitAsm.h" #include "JitILAsm.h"
#include "../../HW/Memmap.h" #include "../../HW/Memmap.h"
@ -44,17 +44,17 @@
using namespace Gen; using namespace Gen;
void Jit64::sc(UGeckoInstruction inst) void JitIL::sc(UGeckoInstruction inst)
{ {
ibuild.EmitSystemCall(ibuild.EmitIntConst(js.compilerPC)); ibuild.EmitSystemCall(ibuild.EmitIntConst(js.compilerPC));
} }
void Jit64::rfi(UGeckoInstruction inst) void JitIL::rfi(UGeckoInstruction inst)
{ {
ibuild.EmitRFIExit(); ibuild.EmitRFIExit();
} }
void Jit64::bx(UGeckoInstruction inst) void JitIL::bx(UGeckoInstruction inst)
{ {
NORMALBRANCH_START NORMALBRANCH_START
INSTRUCTION_START; INSTRUCTION_START;
@ -113,7 +113,7 @@ static IREmitter::InstLoc TestBranch(IREmitter::IRBuilder& ibuild, UGeckoInstruc
return Test; return Test;
} }
void Jit64::bcx(UGeckoInstruction inst) void JitIL::bcx(UGeckoInstruction inst)
{ {
NORMALBRANCH_START NORMALBRANCH_START
if (inst.LK) if (inst.LK)
@ -144,7 +144,7 @@ void Jit64::bcx(UGeckoInstruction inst)
ibuild.EmitBranchUncond(ibuild.EmitIntConst(js.compilerPC + 4)); ibuild.EmitBranchUncond(ibuild.EmitIntConst(js.compilerPC + 4));
} }
void Jit64::bcctrx(UGeckoInstruction inst) void JitIL::bcctrx(UGeckoInstruction inst)
{ {
NORMALBRANCH_START NORMALBRANCH_START
if ((inst.BO & 4) == 0) { if ((inst.BO & 4) == 0) {
@ -173,7 +173,7 @@ void Jit64::bcctrx(UGeckoInstruction inst)
ibuild.EmitBranchUncond(destination); ibuild.EmitBranchUncond(destination);
} }
void Jit64::bclrx(UGeckoInstruction inst) void JitIL::bclrx(UGeckoInstruction inst)
{ {
NORMALBRANCH_START NORMALBRANCH_START
if (inst.hex == 0x4e800020) { if (inst.hex == 0x4e800020) {

View file

@ -22,12 +22,12 @@
#include "../PPCTables.h" #include "../PPCTables.h"
#include "x64Emitter.h" #include "x64Emitter.h"
#include "Jit.h" #include "JitIL.h"
//#define INSTRUCTION_START Default(inst); return; //#define INSTRUCTION_START Default(inst); return;
#define INSTRUCTION_START #define INSTRUCTION_START
void Jit64::fp_arith_s(UGeckoInstruction inst) void JitIL::fp_arith_s(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(FloatingPoint) JITDISABLE(FloatingPoint)
@ -70,7 +70,7 @@ void Jit64::fp_arith_s(UGeckoInstruction inst)
ibuild.EmitStoreFReg(val, inst.FD); ibuild.EmitStoreFReg(val, inst.FD);
} }
void Jit64::fmaddXX(UGeckoInstruction inst) void JitIL::fmaddXX(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(FloatingPoint) JITDISABLE(FloatingPoint)
@ -98,7 +98,7 @@ void Jit64::fmaddXX(UGeckoInstruction inst)
ibuild.EmitStoreFReg(val, inst.FD); ibuild.EmitStoreFReg(val, inst.FD);
} }
void Jit64::fmrx(UGeckoInstruction inst) void JitIL::fmrx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(FloatingPoint) JITDISABLE(FloatingPoint)
@ -110,7 +110,7 @@ void Jit64::fmrx(UGeckoInstruction inst)
ibuild.EmitStoreFReg(val, inst.FD); ibuild.EmitStoreFReg(val, inst.FD);
} }
void Jit64::fcmpx(UGeckoInstruction inst) void JitIL::fcmpx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(FloatingPoint) JITDISABLE(FloatingPoint)
@ -122,7 +122,7 @@ void Jit64::fcmpx(UGeckoInstruction inst)
ibuild.EmitStoreCR(res, inst.CRFD); ibuild.EmitStoreCR(res, inst.CRFD);
} }
void Jit64::fsign(UGeckoInstruction inst) void JitIL::fsign(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(FloatingPoint) JITDISABLE(FloatingPoint)

View file

@ -24,8 +24,8 @@
#include "../PPCTables.h" #include "../PPCTables.h"
#include "x64Emitter.h" #include "x64Emitter.h"
#include "Jit.h" #include "JitIL.h"
#include "JitAsm.h" #include "JitILAsm.h"
//#define INSTRUCTION_START Default(inst); return; //#define INSTRUCTION_START Default(inst); return;
#define INSTRUCTION_START #define INSTRUCTION_START
@ -37,7 +37,7 @@ static void ComputeRC(IREmitter::IRBuilder& ibuild,
ibuild.EmitStoreCR(res, 0); ibuild.EmitStoreCR(res, 0);
} }
void Jit64::reg_imm(UGeckoInstruction inst) void JitIL::reg_imm(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -105,7 +105,7 @@ void Jit64::reg_imm(UGeckoInstruction inst)
} }
} }
void Jit64::cmpXX(UGeckoInstruction inst) void JitIL::cmpXX(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -129,7 +129,7 @@ void Jit64::cmpXX(UGeckoInstruction inst)
ibuild.EmitStoreCR(res, inst.CRFD); ibuild.EmitStoreCR(res, inst.CRFD);
} }
void Jit64::orx(UGeckoInstruction inst) void JitIL::orx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -142,7 +142,7 @@ void Jit64::orx(UGeckoInstruction inst)
// m_GPR[_inst.RA] = m_GPR[_inst.RS] ^ m_GPR[_inst.RB]; // m_GPR[_inst.RA] = m_GPR[_inst.RS] ^ m_GPR[_inst.RB];
void Jit64::xorx(UGeckoInstruction inst) void JitIL::xorx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -153,7 +153,7 @@ void Jit64::xorx(UGeckoInstruction inst)
ComputeRC(ibuild, val); ComputeRC(ibuild, val);
} }
void Jit64::andx(UGeckoInstruction inst) void JitIL::andx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -164,7 +164,7 @@ void Jit64::andx(UGeckoInstruction inst)
ComputeRC(ibuild, val); ComputeRC(ibuild, val);
} }
void Jit64::extsbx(UGeckoInstruction inst) void JitIL::extsbx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -175,7 +175,7 @@ void Jit64::extsbx(UGeckoInstruction inst)
ComputeRC(ibuild, val); ComputeRC(ibuild, val);
} }
void Jit64::extshx(UGeckoInstruction inst) void JitIL::extshx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -186,7 +186,7 @@ void Jit64::extshx(UGeckoInstruction inst)
ComputeRC(ibuild, val); ComputeRC(ibuild, val);
} }
void Jit64::subfic(UGeckoInstruction inst) void JitIL::subfic(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -205,7 +205,7 @@ void Jit64::subfic(UGeckoInstruction inst)
ibuild.EmitStoreCarry(test); ibuild.EmitStoreCarry(test);
} }
void Jit64::subfcx(UGeckoInstruction inst) void JitIL::subfcx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -222,7 +222,7 @@ void Jit64::subfcx(UGeckoInstruction inst)
ComputeRC(ibuild, val); ComputeRC(ibuild, val);
} }
void Jit64::subfex(UGeckoInstruction inst) void JitIL::subfex(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -243,7 +243,7 @@ void Jit64::subfex(UGeckoInstruction inst)
ComputeRC(ibuild, val); ComputeRC(ibuild, val);
} }
void Jit64::subfx(UGeckoInstruction inst) void JitIL::subfx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -255,7 +255,7 @@ void Jit64::subfx(UGeckoInstruction inst)
ComputeRC(ibuild, val); ComputeRC(ibuild, val);
} }
void Jit64::mulli(UGeckoInstruction inst) void JitIL::mulli(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -264,7 +264,7 @@ void Jit64::mulli(UGeckoInstruction inst)
ibuild.EmitStoreGReg(val, inst.RD); ibuild.EmitStoreGReg(val, inst.RD);
} }
void Jit64::mullwx(UGeckoInstruction inst) void JitIL::mullwx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -275,7 +275,7 @@ void Jit64::mullwx(UGeckoInstruction inst)
ComputeRC(ibuild, val); ComputeRC(ibuild, val);
} }
void Jit64::mulhwux(UGeckoInstruction inst) void JitIL::mulhwux(UGeckoInstruction inst)
{ {
Default(inst); return; Default(inst); return;
#if 0 #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 // 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; Default(inst); return;
#if 0 #if 0
int a = inst.RA, b = inst.RB, d = inst.RD; int a = inst.RA, b = inst.RB, d = inst.RD;
@ -334,16 +334,7 @@ void Jit64::divwux(UGeckoInstruction inst) {
#endif #endif
} }
u32 Helper_Mask(u8 mb, u8 me) void JitIL::addx(UGeckoInstruction inst)
{
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 INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -354,7 +345,7 @@ void Jit64::addx(UGeckoInstruction inst)
ComputeRC(ibuild, val); ComputeRC(ibuild, val);
} }
void Jit64::addzex(UGeckoInstruction inst) void JitIL::addzex(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -368,7 +359,7 @@ void Jit64::addzex(UGeckoInstruction inst)
ComputeRC(ibuild, val); ComputeRC(ibuild, val);
} }
// This can be optimized // This can be optimized
void Jit64::addex(UGeckoInstruction inst) void JitIL::addex(UGeckoInstruction inst)
{ {
Default(inst); return; Default(inst); return;
#if 0 #if 0
@ -399,7 +390,7 @@ void Jit64::addex(UGeckoInstruction inst)
#endif #endif
} }
void Jit64::rlwinmx(UGeckoInstruction inst) void JitIL::rlwinmx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -413,7 +404,7 @@ void Jit64::rlwinmx(UGeckoInstruction inst)
} }
void Jit64::rlwimix(UGeckoInstruction inst) void JitIL::rlwimix(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -429,7 +420,7 @@ void Jit64::rlwimix(UGeckoInstruction inst)
ComputeRC(ibuild, val); ComputeRC(ibuild, val);
} }
void Jit64::rlwnmx(UGeckoInstruction inst) void JitIL::rlwnmx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -442,7 +433,7 @@ void Jit64::rlwnmx(UGeckoInstruction inst)
ComputeRC(ibuild, val); ComputeRC(ibuild, val);
} }
void Jit64::negx(UGeckoInstruction inst) void JitIL::negx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -453,7 +444,7 @@ void Jit64::negx(UGeckoInstruction inst)
ComputeRC(ibuild, val); ComputeRC(ibuild, val);
} }
void Jit64::srwx(UGeckoInstruction inst) void JitIL::srwx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -472,7 +463,7 @@ void Jit64::srwx(UGeckoInstruction inst)
ComputeRC(ibuild, val); ComputeRC(ibuild, val);
} }
void Jit64::slwx(UGeckoInstruction inst) void JitIL::slwx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -491,7 +482,7 @@ void Jit64::slwx(UGeckoInstruction inst)
ComputeRC(ibuild, val); ComputeRC(ibuild, val);
} }
void Jit64::srawx(UGeckoInstruction inst) void JitIL::srawx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -514,7 +505,7 @@ void Jit64::srawx(UGeckoInstruction inst)
ibuild.EmitStoreCarry(test); ibuild.EmitStoreCarry(test);
} }
void Jit64::srawix(UGeckoInstruction inst) void JitIL::srawix(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)
@ -531,7 +522,7 @@ void Jit64::srawix(UGeckoInstruction inst)
} }
// count leading zeroes // count leading zeroes
void Jit64::cntlzwx(UGeckoInstruction inst) void JitIL::cntlzwx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Integer) JITDISABLE(Integer)

View file

@ -29,13 +29,13 @@
#include "x64Emitter.h" #include "x64Emitter.h"
#include "ABI.h" #include "ABI.h"
#include "Jit.h" #include "JitIL.h"
#include "JitAsm.h" #include "JitILAsm.h"
//#define INSTRUCTION_START Default(inst); return; //#define INSTRUCTION_START Default(inst); return;
#define INSTRUCTION_START #define INSTRUCTION_START
void Jit64::lhax(UGeckoInstruction inst) void JitIL::lhax(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(LoadStore) JITDISABLE(LoadStore)
@ -47,7 +47,7 @@ void Jit64::lhax(UGeckoInstruction inst)
ibuild.EmitStoreGReg(val, inst.RD); ibuild.EmitStoreGReg(val, inst.RD);
} }
void Jit64::lXz(UGeckoInstruction inst) void JitIL::lXz(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(LoadStore) JITDISABLE(LoadStore)
@ -67,7 +67,7 @@ void Jit64::lXz(UGeckoInstruction inst)
ibuild.EmitStoreGReg(val, inst.RD); ibuild.EmitStoreGReg(val, inst.RD);
} }
void Jit64::lha(UGeckoInstruction inst) void JitIL::lha(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(LoadStore) JITDISABLE(LoadStore)
@ -80,7 +80,7 @@ void Jit64::lha(UGeckoInstruction inst)
ibuild.EmitStoreGReg(val, inst.RD); ibuild.EmitStoreGReg(val, inst.RD);
} }
void Jit64::lXzx(UGeckoInstruction inst) void JitIL::lXzx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(LoadStore) JITDISABLE(LoadStore)
@ -102,7 +102,7 @@ void Jit64::lXzx(UGeckoInstruction inst)
} }
// Zero cache line. // Zero cache line.
void Jit64::dcbz(UGeckoInstruction inst) void JitIL::dcbz(UGeckoInstruction inst)
{ {
Default(inst); return; Default(inst); return;
@ -127,7 +127,7 @@ void Jit64::dcbz(UGeckoInstruction inst)
#endif #endif
} }
void Jit64::stX(UGeckoInstruction inst) void JitIL::stX(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(LoadStore) JITDISABLE(LoadStore)
@ -146,7 +146,7 @@ void Jit64::stX(UGeckoInstruction inst)
} }
} }
void Jit64::stXx(UGeckoInstruction inst) void JitIL::stXx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(LoadStore) JITDISABLE(LoadStore)
@ -165,7 +165,7 @@ void Jit64::stXx(UGeckoInstruction inst)
} }
// A few games use these heavily in video codecs. (GFZP01 @ 0x80020E18) // A few games use these heavily in video codecs. (GFZP01 @ 0x80020E18)
void Jit64::lmw(UGeckoInstruction inst) void JitIL::lmw(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(LoadStore) JITDISABLE(LoadStore)
@ -180,7 +180,7 @@ void Jit64::lmw(UGeckoInstruction inst)
} }
} }
void Jit64::stmw(UGeckoInstruction inst) void JitIL::stmw(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(LoadStore) JITDISABLE(LoadStore)
@ -195,7 +195,7 @@ void Jit64::stmw(UGeckoInstruction inst)
} }
} }
void Jit64::icbi(UGeckoInstruction inst) void JitIL::icbi(UGeckoInstruction inst)
{ {
Default(inst); Default(inst);
ibuild.EmitBranchUncond(ibuild.EmitIntConst(js.compilerPC + 4)); ibuild.EmitBranchUncond(ibuild.EmitIntConst(js.compilerPC + 4));

View file

@ -29,8 +29,8 @@
#include "x64Emitter.h" #include "x64Emitter.h"
#include "ABI.h" #include "ABI.h"
#include "Jit.h" #include "JitIL.h"
#include "JitAsm.h" #include "JitILAsm.h"
//#define INSTRUCTION_START Default(inst); return; //#define INSTRUCTION_START Default(inst); return;
#define INSTRUCTION_START #define INSTRUCTION_START
@ -39,7 +39,7 @@
// and pshufb could help a lot. // and pshufb could help a lot.
// Also add hacks for things like lfs/stfs the same reg consecutively, that is, simple memory moves. // 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 INSTRUCTION_START
JITDISABLE(LoadStoreFloating) JITDISABLE(LoadStoreFloating)
@ -52,7 +52,7 @@ void Jit64::lfs(UGeckoInstruction inst)
} }
void Jit64::lfd(UGeckoInstruction inst) void JitIL::lfd(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(LoadStoreFloating) JITDISABLE(LoadStoreFloating)
@ -66,7 +66,7 @@ void Jit64::lfd(UGeckoInstruction inst)
} }
void Jit64::stfd(UGeckoInstruction inst) void JitIL::stfd(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(LoadStoreFloating) JITDISABLE(LoadStoreFloating)
@ -81,7 +81,7 @@ void Jit64::stfd(UGeckoInstruction inst)
} }
void Jit64::stfs(UGeckoInstruction inst) void JitIL::stfs(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(LoadStoreFloating) JITDISABLE(LoadStoreFloating)
@ -97,7 +97,7 @@ void Jit64::stfs(UGeckoInstruction inst)
} }
void Jit64::stfsx(UGeckoInstruction inst) void JitIL::stfsx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(LoadStoreFloating) JITDISABLE(LoadStoreFloating)
@ -111,7 +111,7 @@ void Jit64::stfsx(UGeckoInstruction inst)
} }
void Jit64::lfsx(UGeckoInstruction inst) void JitIL::lfsx(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(LoadStoreFloating) JITDISABLE(LoadStoreFloating)

View file

@ -27,13 +27,13 @@
#include "x64Emitter.h" #include "x64Emitter.h"
#include "ABI.h" #include "ABI.h"
#include "Jit.h" #include "JitIL.h"
#include "JitAsm.h" #include "JitILAsm.h"
//#define INSTRUCTION_START Default(inst); return; //#define INSTRUCTION_START Default(inst); return;
#define INSTRUCTION_START #define INSTRUCTION_START
void Jit64::psq_st(UGeckoInstruction inst) void JitIL::psq_st(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(LoadStorePaired) JITDISABLE(LoadStorePaired)
@ -48,7 +48,7 @@ void Jit64::psq_st(UGeckoInstruction inst)
ibuild.EmitStorePaired(val, addr, inst.I); ibuild.EmitStorePaired(val, addr, inst.I);
} }
void Jit64::psq_l(UGeckoInstruction inst) void JitIL::psq_l(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(LoadStorePaired) JITDISABLE(LoadStorePaired)

View file

@ -23,29 +23,29 @@
#include "x64Emitter.h" #include "x64Emitter.h"
#include "../../HW/GPFifo.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; Default(inst); return;
} }
void Jit64::ps_sel(UGeckoInstruction inst) void JitIL::ps_sel(UGeckoInstruction inst)
{ {
Default(inst); return; Default(inst); return;
} }
void Jit64::ps_sign(UGeckoInstruction inst) void JitIL::ps_sign(UGeckoInstruction inst)
{ {
Default(inst); return; Default(inst); return;
} }
void Jit64::ps_rsqrte(UGeckoInstruction inst) void JitIL::ps_rsqrte(UGeckoInstruction inst)
{ {
Default(inst); return; Default(inst); return;
} }
void Jit64::ps_arith(UGeckoInstruction inst) void JitIL::ps_arith(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(Paired) JITDISABLE(Paired)
@ -74,7 +74,7 @@ void Jit64::ps_arith(UGeckoInstruction inst)
ibuild.EmitStoreFReg(val, inst.FD); 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... // FIXME: This operation strikes me as a bit strange...
// perhaps we can optimize it depending on the users? // 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 INSTRUCTION_START
JITDISABLE(Paired) 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 //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 INSTRUCTION_START
JITDISABLE(Paired) 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 INSTRUCTION_START
JITDISABLE(Paired) JITDISABLE(Paired)

View file

@ -26,12 +26,12 @@
#include "ABI.h" #include "ABI.h"
#include "Thunk.h" #include "Thunk.h"
#include "Jit.h" #include "JitIL.h"
//#define INSTRUCTION_START Default(inst); return; //#define INSTRUCTION_START Default(inst); return;
#define INSTRUCTION_START #define INSTRUCTION_START
void Jit64::mtspr(UGeckoInstruction inst) void JitIL::mtspr(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(SystemRegisters) JITDISABLE(SystemRegisters)
@ -67,7 +67,7 @@ void Jit64::mtspr(UGeckoInstruction inst)
} }
} }
void Jit64::mfspr(UGeckoInstruction inst) void JitIL::mfspr(UGeckoInstruction inst)
{ {
INSTRUCTION_START INSTRUCTION_START
JITDISABLE(SystemRegisters) JITDISABLE(SystemRegisters)
@ -104,7 +104,7 @@ void Jit64::mfspr(UGeckoInstruction inst)
// ======================================================================================= // =======================================================================================
// Don't interpret this, if we do we get thrown out // 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.EmitStoreMSR(ibuild.EmitLoadGReg(inst.RS));
ibuild.EmitBranchUncond(ibuild.EmitIntConst(js.compilerPC + 4)); 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 INSTRUCTION_START
JITDISABLE(SystemRegisters) JITDISABLE(SystemRegisters)
ibuild.EmitStoreGReg(ibuild.EmitLoadMSR(), inst.RD); ibuild.EmitStoreGReg(ibuild.EmitLoadMSR(), inst.RD);
} }
void Jit64::mftb(UGeckoInstruction inst) void JitIL::mftb(UGeckoInstruction inst)
{ {
INSTRUCTION_START; INSTRUCTION_START;
JITDISABLE(SystemRegisters) JITDISABLE(SystemRegisters)
mfspr(inst); mfspr(inst);
} }
void Jit64::mfcr(UGeckoInstruction inst) void JitIL::mfcr(UGeckoInstruction inst)
{ {
Default(inst); return; Default(inst); return;
#if 0 #if 0
@ -147,7 +147,7 @@ void Jit64::mfcr(UGeckoInstruction inst)
#endif #endif
} }
void Jit64::mtcrf(UGeckoInstruction inst) void JitIL::mtcrf(UGeckoInstruction inst)
{ {
Default(inst); return; Default(inst); return;
#if 0 #if 0

View file

@ -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;
}
}
}
}

View file

@ -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

View file

@ -31,6 +31,26 @@ public:
void GenFifoXmm64Write(); void GenFifoXmm64Write();
void GenFifoFloatWrite(); 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: array index: GQR to use.
// In: ECX: Address to read from. // In: ECX: Address to read from.
// Out: XMM0: Bottom two 32-bit slots hold the read value, // Out: XMM0: Bottom two 32-bit slots hold the read value,

View file

@ -19,13 +19,9 @@
#include "Common.h" #include "Common.h"
#include "disasm.h" #include "disasm.h"
#ifdef JITTEST #include "../JitCommon/JitBase.h"
#include "../Jit64IL/Jit.h" #include "../JitCommon/JitBackpatch.h"
#include "../Jit64IL/JitAsm.h"
#else
#include "../Jit64/Jit.h"
#include "../Jit64/JitAsm.h"
#endif
#include "../../HW/Memmap.h" #include "../../HW/Memmap.h"
#include "x64Emitter.h" #include "x64Emitter.h"
@ -34,6 +30,27 @@
#include "x64Analyzer.h" #include "x64Analyzer.h"
#include "StringUtil.h" #include "StringUtil.h"
#ifdef _WIN32
#include <windows.h>
#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; using namespace Gen;
@ -118,7 +135,7 @@ const u8 *TrampolineCache::GetWriteTrampoline(const InstructionInfo &info)
CMP(32, R(addrReg), Imm32(0xCC008000)); CMP(32, R(addrReg), Imm32(0xCC008000));
FixupBranch skip_fast = J_CC(CC_NE, false); FixupBranch skip_fast = J_CC(CC_NE, false);
MOV(32, R(ABI_PARAM1), R((X64Reg)dataReg)); MOV(32, R(ABI_PARAM1), R((X64Reg)dataReg));
CALL((void*)asm_routines.fifoDirectWrite32); CALL((void*)jit->GetAsmRoutines()->fifoDirectWrite32);
RET(); RET();
SetJumpTarget(skip_fast); SetJumpTarget(skip_fast);
ABI_PushAllCallerSavedRegsAndAdjustStack(); 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. // 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 // 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. // 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 #ifdef _M_X64
if (!jit.IsInCodeSpace(codePtr)) if (!jit->IsInCodeSpace(codePtr))
return 0; // this will become a regular crash real soon after this return 0; // this will become a regular crash real soon after this
InstructionInfo info; InstructionInfo info;

View file

@ -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

View file

@ -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

View file

@ -23,6 +23,11 @@
// locating performance issues. // locating performance issues.
#include "Common.h" #include "Common.h"
#ifdef _WIN32
#include <windows.h>
#endif
#include "../../Core.h" #include "../../Core.h"
#include "MemoryUtil.h" #include "MemoryUtil.h"
@ -36,15 +41,8 @@
#include "x64Emitter.h" #include "x64Emitter.h"
#include "x64Analyzer.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 "JitCache.h"
#include "JitBase.h"
#include "disasm.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 // Spurious entrances from previously linked blocks can only come through checkedEntry
XEmitter emit((u8 *)b.checkedEntry); XEmitter emit((u8 *)b.checkedEntry);
emit.MOV(32, M(&PC), Imm32(b.originalAddress)); 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 // this is not needed really
/* /*
emit.SetCodePtr((u8 *)blockCodePointers[blocknum]); emit.SetCodePtr((u8 *)blockCodePointers[blocknum]);

View file

@ -24,9 +24,6 @@
#include "../Gekko.h" #include "../Gekko.h"
#include "../PPCAnalyst.h" #include "../PPCAnalyst.h"
#ifdef _WIN32
#include <windows.h>
#endif
// emulate CPU with unlimited instruction cache // emulate CPU with unlimited instruction cache
// the only way to invalidate a region is the "icbi" instruction // the only way to invalidate a region is the "icbi" instruction
@ -59,9 +56,9 @@ struct JitBlock
#ifdef _WIN32 #ifdef _WIN32
// we don't really need to save start and stop // we don't really need to save start and stop
// TODO (mb2): ticStart and ticStop -> "local var" mean "in block" ... low priority ;) // TODO (mb2): ticStart and ticStop -> "local var" mean "in block" ... low priority ;)
LARGE_INTEGER ticStart; // for profiling - time. u64 ticStart; // for profiling - time.
LARGE_INTEGER ticStop; // for profiling - time. u64 ticStop; // for profiling - time.
LARGE_INTEGER ticCounter; // for profiling - time. u64 ticCounter; // for profiling - time.
#endif #endif
const u8 *checkedEntry; const u8 *checkedEntry;
const u8 *normalEntry; const u8 *normalEntry;
@ -92,8 +89,9 @@ class JitBlockCache
void LinkBlock(int i); void LinkBlock(int i);
public: 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); int AllocateBlock(u32 em_address);
void FinalizeBlock(int block_num, bool block_link, const u8 *code_ptr); void FinalizeBlock(int block_num, bool block_link, const u8 *code_ptr);

View file

@ -26,17 +26,8 @@
#include "../PPCTables.h" #include "../PPCTables.h"
#include "x64Emitter.h" #include "x64Emitter.h"
#include "ABI.h" #include "ABI.h"
#include "JitBase.h"
#ifdef JITTEST #include "Jit_Util.h"
#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
using namespace Gen; using namespace Gen;
@ -191,7 +182,7 @@ void EmuCodeBlock::WriteFloatToConstRamAddress(const Gen::X64Reg& xmm_reg, u32 a
void EmuCodeBlock::ForceSinglePrecisionS(X64Reg xmm) { void EmuCodeBlock::ForceSinglePrecisionS(X64Reg xmm) {
// Most games don't need these. Zelda requires it though - some platforms get stuck without them. // 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)); CVTSD2SS(xmm, R(xmm));
CVTSS2SD(xmm, R(xmm)); CVTSS2SD(xmm, R(xmm));
@ -200,7 +191,7 @@ void EmuCodeBlock::ForceSinglePrecisionS(X64Reg xmm) {
void EmuCodeBlock::ForceSinglePrecisionP(X64Reg xmm) { void EmuCodeBlock::ForceSinglePrecisionP(X64Reg xmm) {
// Most games don't need these. Zelda requires it though - some platforms get stuck without them. // 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)); CVTPD2PS(xmm, R(xmm));
CVTPS2PD(xmm, R(xmm)); CVTPS2PD(xmm, R(xmm));

View file

@ -24,13 +24,11 @@
#include "Interpreter/Interpreter.h" #include "Interpreter/Interpreter.h"
#include "Interpreter/Interpreter_Tables.h" #include "Interpreter/Interpreter_Tables.h"
#if !(defined(NOJIT) && NOJIT) #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" #include "Jit64/Jit.h"
#else
#error Unknown architecture!
#endif
#endif #endif
struct op_inf struct op_inf
@ -156,13 +154,15 @@ bool UsesFPU(UGeckoInstruction _inst)
return false; return false;
} }
} }
void InitTables() void InitTables()
{ {
// Interpreter ALWAYS needs to be initialized // Interpreter ALWAYS needs to be initialized
InterpreterTables::InitTables(); InterpreterTables::InitTables();
#if !(defined(NOJIT) && NOJIT) #if !(defined(NOJIT) && NOJIT)
// Should be able to do this a better way than defines in this function // Should be able to do this a better way than defines in this function
JitTables::InitTables(); Jit64Tables::InitTables();
JitILTables::InitTables();
#endif #endif
} }

View file

@ -27,6 +27,8 @@
#include "../CoreTiming.h" #include "../CoreTiming.h"
#include "Interpreter/Interpreter.h" #include "Interpreter/Interpreter.h"
#include "JitCommon/JitBase.h"
#include "Jit64IL/JitIL.h"
#include "Jit64/Jit.h" #include "Jit64/Jit.h"
#include "PowerPC.h" #include "PowerPC.h"
#include "PPCTables.h" #include "PPCTables.h"
@ -109,7 +111,7 @@ void ResetRegisters()
rDEC = 0xFFFFFFFF; rDEC = 0xFFFFFFFF;
} }
void Init() void Init(int cpu_core)
{ {
enum { enum {
FPU_PREC_24 = 0 << 8, FPU_PREC_24 = 0 << 8,
@ -139,7 +141,12 @@ void Init()
// Initialize both execution engines ... // Initialize both execution engines ...
Interpreter::Init(); Interpreter::Init();
jit.Init();
if (cpu_core == 1)
jit = new Jit64;
else
jit = new JitIL;
jit->Init();
// ... but start as interpreter by default. // ... but start as interpreter by default.
mode = MODE_INTERPRETER; mode = MODE_INTERPRETER;
state = CPU_STEPPING; state = CPU_STEPPING;
@ -150,7 +157,9 @@ void Init()
void Shutdown() void Shutdown()
{ {
// Shutdown both execution engines. Doesn't matter which one is active. // Shutdown both execution engines. Doesn't matter which one is active.
jit.Shutdown(); jit->Shutdown();
delete jit;
jit = 0;
Interpreter::Shutdown(); Interpreter::Shutdown();
} }
@ -163,7 +172,7 @@ void SetMode(CoreMode new_mode)
switch (mode) switch (mode)
{ {
case MODE_INTERPRETER: // Switching from JIT to interpreter 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; break;
case MODE_JIT: // Switching from interpreter to JIT. case MODE_JIT: // Switching from interpreter to JIT.
@ -180,7 +189,7 @@ void SingleStep()
Interpreter::SingleStep(); Interpreter::SingleStep();
break; break;
case MODE_JIT: case MODE_JIT:
jit.SingleStep(); jit->SingleStep();
break; break;
} }
} }
@ -194,7 +203,7 @@ void RunLoop()
Interpreter::Run(); Interpreter::Run();
break; break;
case MODE_JIT: case MODE_JIT:
jit.Run(); jit->Run();
break; break;
} }
Host_UpdateDisasmDialog(); Host_UpdateDisasmDialog();

View file

@ -88,7 +88,7 @@ extern BreakPoints breakpoints;
extern MemChecks memchecks; extern MemChecks memchecks;
extern PPCDebugInterface debug_interface; extern PPCDebugInterface debug_interface;
void Init(); void Init(int cpu_core);
void Shutdown(); void Shutdown();
void DoState(PointerWrap &p); void DoState(PointerWrap &p);

View file

@ -15,11 +15,15 @@
// Official SVN repository and contact information can be found at // Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/ // http://code.google.com/p/dolphin-emu/
#include "Jit64/Jit.h" #include "JitCommon/JitBase.h"
#include <vector> #include <vector>
#include <algorithm> #include <algorithm>
#ifdef _WIN32
#include <windows.h>
#endif
#include "PPCSymbolDB.h" #include "PPCSymbolDB.h"
namespace Profiler namespace Profiler
@ -41,19 +45,19 @@ struct BlockStat
void WriteProfileResults(const char *filename) { void WriteProfileResults(const char *filename) {
std::vector<BlockStat> stats; std::vector<BlockStat> stats;
stats.reserve(jit.GetBlockCache()->GetNumBlocks()); stats.reserve(jit->GetBlockCache()->GetNumBlocks());
u64 cost_sum = 0; u64 cost_sum = 0;
#ifdef _WIN32 #ifdef _WIN32
u64 timecost_sum = 0; u64 timecost_sum = 0;
LARGE_INTEGER countsPerSec; u64 countsPerSec;
QueryPerformanceFrequency(&countsPerSec); QueryPerformanceFrequency((LARGE_INTEGER *)&countsPerSec);
#endif #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. u64 cost = (block->originalSize / 4) * block->runCount; // rough heuristic. mem instructions should cost more.
#ifdef _WIN32 #ifdef _WIN32
u64 timecost = block->ticCounter.QuadPart; // Indeed ;) u64 timecost = block->ticCounter; // Indeed ;)
#endif #endif
if (block->runCount >= 1) { // Todo: tweak. if (block->runCount >= 1) { // Todo: tweak.
stats.push_back(BlockStat(i, cost)); 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"); fprintf(f, "origAddr\tblkName\tcost\ttimeCost\tpercent\ttimePercent\tOvAllinBlkTime(ms)\tblkCodeSize\n");
for (unsigned int i = 0; i < stats.size(); i++) 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) if (block)
{ {
std::string name = g_symbolDB.GetDescription(block->originalAddress); std::string name = g_symbolDB.GetDescription(block->originalAddress);
double percent = 100.0 * (double)stats[i].cost / (double)cost_sum; double percent = 100.0 * (double)stats[i].cost / (double)cost_sum;
#ifdef _WIN32 #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", 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 #else
fprintf(f, "%08x\t%s\t%llu\t???\t%.2lf\t???\t???\t%i\n", 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); block->originalAddress, name.c_str(), stats[i].cost, /*block->ticCounter.QuadPart,*/ percent, /*timePercent, (double)block->ticCounter.QuadPart*1000.0/(double)countsPerSec.QuadPart,*/ block->codeSize);

View file

@ -28,15 +28,15 @@
// TODO: r64 way // TODO: r64 way
// asm write : (u64) dt += t1-t0 // asm write : (u64) dt += t1-t0
#define PROFILER_ADD_DIFF_LARGE_INTEGER(pdt, pt1, pt0) \ #define PROFILER_ADD_DIFF_LARGE_INTEGER(pdt, pt1, pt0) \
MOV(32, R(EAX), M(pt1.LowPart)); \ MOV(32, R(EAX), M(pt1)); \
SUB(32, R(EAX), M(pt0.LowPart)); \ SUB(32, R(EAX), M(pt0)); \
MOV(32, R(ECX), M(pt1.HighPart)); \ MOV(32, R(ECX), M(((u8*)pt1) + 4)); \
SBB(32, R(ECX), M(pt0.HighPart)); \ SBB(32, R(ECX), M(((u8*)pt0) + 4)); \
ADD(32, R(EAX), M(pdt.LowPart)); \ ADD(32, R(EAX), M(pdt)); \
MOV(32, R(EDX), M(pdt.HighPart)); \ MOV(32, R(EDX), M(((u8*)pdt) + 4)); \
ADC(32, R(EDX), R(ECX)); \ ADC(32, R(EDX), R(ECX)); \
MOV(32, M(pdt.LowPart), R(EAX)); \ MOV(32, M(pdt), R(EAX)); \
MOV(32, M(pdt.HighPart), R(EDX)) MOV(32, M(((u8*)pdt) + 4), R(EDX))
#define PROFILER_VPUSH PUSH(EAX);PUSH(ECX);PUSH(EDX) #define PROFILER_VPUSH PUSH(EAX);PUSH(ECX);PUSH(EDX)
#define PROFILER_VPOP POP(EDX);POP(ECX);POP(EAX) #define PROFILER_VPOP POP(EDX);POP(ECX);POP(EAX)

View file

@ -90,13 +90,13 @@ files = ["ActionReplay.cpp",
"PowerPC/JitCommon/JitAsmCommon.cpp", "PowerPC/JitCommon/JitAsmCommon.cpp",
"PowerPC/JitCommon/JitCache.cpp", "PowerPC/JitCommon/JitCache.cpp",
"PowerPC/JitCommon/JitBackpatch.cpp", "PowerPC/JitCommon/JitBackpatch.cpp",
"PowerPC/JitCommon/JitBase.cpp",
"PowerPC/JitCommon/Jit_Util.cpp", "PowerPC/JitCommon/Jit_Util.cpp",
"HLE/HLE.cpp", "HLE/HLE.cpp",
"HLE/HLE_Misc.cpp", "HLE/HLE_Misc.cpp",
"HLE/HLE_OS.cpp", "HLE/HLE_OS.cpp",
] ]
if not env['NOJIT']: if not env['NOJIT']:
if env['JITTEST']:
files += ["PowerPC/Jit64IL/Jit.cpp", files += ["PowerPC/Jit64IL/Jit.cpp",
"PowerPC/Jit64IL/JitAsm.cpp", "PowerPC/Jit64IL/JitAsm.cpp",
"PowerPC/Jit64IL/Jit_Branch.cpp", "PowerPC/Jit64IL/Jit_Branch.cpp",
@ -109,9 +109,8 @@ if not env['NOJIT']:
"PowerPC/Jit64IL/Jit_SystemRegisters.cpp", "PowerPC/Jit64IL/Jit_SystemRegisters.cpp",
"PowerPC/Jit64IL/IR.cpp", "PowerPC/Jit64IL/IR.cpp",
"PowerPC/Jit64IL/IR_X86.cpp", "PowerPC/Jit64IL/IR_X86.cpp",
"PowerPC/JitCommon//Jit_Tables.cpp", "PowerPC/Jit64IL/JitIL_Tables.cpp",
] ]
else:
files += ["PowerPC/Jit64/Jit.cpp", files += ["PowerPC/Jit64/Jit.cpp",
"PowerPC/Jit64/JitRegCache.cpp", "PowerPC/Jit64/JitRegCache.cpp",
"PowerPC/Jit64/JitAsm.cpp", "PowerPC/Jit64/JitAsm.cpp",
@ -123,7 +122,7 @@ if not env['NOJIT']:
"PowerPC/Jit64/Jit_LoadStore.cpp", "PowerPC/Jit64/Jit_LoadStore.cpp",
"PowerPC/Jit64/Jit_LoadStoreFloating.cpp", "PowerPC/Jit64/Jit_LoadStoreFloating.cpp",
"PowerPC/Jit64/Jit_SystemRegisters.cpp", "PowerPC/Jit64/Jit_SystemRegisters.cpp",
"PowerPC/JitCommon/Jit_Tables.cpp", "PowerPC/Jit64/Jit64_Tables.cpp",
] ]
if sys.platform == 'win32': if sys.platform == 'win32':

View file

@ -24,11 +24,7 @@
#include "CoreTiming.h" #include "CoreTiming.h"
#include "HW/HW.h" #include "HW/HW.h"
#include "PowerPC/PowerPC.h" #include "PowerPC/PowerPC.h"
#ifdef JITTEST #include "PowerPC/JitCommon/JitBase.h"
#include "PowerPC/Jit64IL/Jit.h"
#else
#include "PowerPC/Jit64/Jit.h"
#endif
#include "PluginManager.h" #include "PluginManager.h"
@ -97,9 +93,9 @@ void DoState(PointerWrap &p)
HW::DoState(p); HW::DoState(p);
CoreTiming::DoState(p); CoreTiming::DoState(p);
#ifdef JIT_UNLIMITED_ICACHE #ifdef JIT_UNLIMITED_ICACHE
p.DoVoid(jit.GetBlockCache()->GetICache(), JIT_ICACHE_SIZE); p.DoVoid(jit->GetBlockCache()->GetICache(), JIT_ICACHE_SIZE);
p.DoVoid(jit.GetBlockCache()->GetICacheEx(), JIT_ICACHEEX_SIZE); p.DoVoid(jit->GetBlockCache()->GetICacheEx(), JIT_ICACHEEX_SIZE);
p.DoVoid(jit.GetBlockCache()->GetICacheVMEM(), JIT_ICACHE_SIZE); p.DoVoid(jit->GetBlockCache()->GetICacheVMEM(), JIT_ICACHE_SIZE);
#endif #endif
} }
@ -110,7 +106,7 @@ void LoadBufferStateCallback(u64 userdata, int cyclesLate)
return; return;
} }
jit.ClearCache(); jit->ClearCache();
u8 *ptr = *cur_buffer; u8 *ptr = *cur_buffer;
PointerWrap p(&ptr, PointerWrap::MODE_READ); PointerWrap p(&ptr, PointerWrap::MODE_READ);
@ -129,7 +125,7 @@ void SaveBufferStateCallback(u64 userdata, int cyclesLate)
return; return;
} }
jit.ClearCache(); jit->ClearCache();
u8 *ptr = NULL; u8 *ptr = NULL;
@ -228,7 +224,7 @@ void SaveStateCallback(u64 userdata, int cyclesLate)
saveThread = NULL; saveThread = NULL;
} }
jit.ClearCache(); jit->ClearCache();
// Measure the size of the buffer. // Measure the size of the buffer.
u8 *ptr = 0; u8 *ptr = 0;
@ -340,7 +336,7 @@ void LoadStateCallback(u64 userdata, int cyclesLate)
fclose(f); fclose(f);
jit.ClearCache(); jit->ClearCache();
u8 *ptr = buffer; u8 *ptr = buffer;
PointerWrap p(&ptr, PointerWrap::MODE_READ); PointerWrap p(&ptr, PointerWrap::MODE_READ);

View file

@ -54,7 +54,7 @@
#include "PowerPC/PPCSymbolDB.h" #include "PowerPC/PPCSymbolDB.h"
#include "PowerPC/SignatureDB.h" #include "PowerPC/SignatureDB.h"
#include "PowerPC/PPCTables.h" #include "PowerPC/PPCTables.h"
#include "PowerPC/Jit64/Jit.h" #include "PowerPC/JitCommon/JitBase.h"
#include "PowerPC/JitCommon/JitCache.h" // for ClearCache() #include "PowerPC/JitCommon/JitCache.h" // for ClearCache()
#include "PluginManager.h" #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" " and stepping to work as explained in the Developer Documentation. But it can be very"
" slow, perhaps slower than 1 fps.") " slow, perhaps slower than 1 fps.")
, wxITEM_CHECK); , wxITEM_CHECK);
interpreter->Check(!_LocalCoreStartupParameter.bUseJIT); interpreter->Check(_LocalCoreStartupParameter.iCPUCore == 0);
pCoreMenu->AppendSeparator(); pCoreMenu->AppendSeparator();
jitblocklinking = pCoreMenu->Append(IDM_JITBLOCKLINKING, _T("&JIT Block Linking off"), 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 // Clear the JIT cache to enable these changes
jit.ClearCache(); jit->ClearCache();
// Update // Update
UpdateButtonStates(); UpdateButtonStates();
} }
@ -563,7 +563,7 @@ void CCodeWindow::OnJitMenu(wxCommandEvent& event)
PPCTables::LogCompiledInstructions(); break; PPCTables::LogCompiledInstructions(); break;
case IDM_CLEARCODECACHE: case IDM_CLEARCODECACHE:
jit.ClearCache(); break; jit->ClearCache(); break;
case IDM_SEARCHINSTRUCTION: case IDM_SEARCHINSTRUCTION:
{ {

View file

@ -61,7 +61,7 @@
#include "PowerPC/PPCSymbolDB.h" #include "PowerPC/PPCSymbolDB.h"
#include "PowerPC/SignatureDB.h" #include "PowerPC/SignatureDB.h"
#include "PowerPC/PPCTables.h" #include "PowerPC/PPCTables.h"
#include "PowerPC/Jit64/Jit.h" #include "PowerPC/JitCommon/JitBase.h"
#include "PowerPC/JitCommon/JitCache.h" // for ClearCache() #include "PowerPC/JitCommon/JitCache.h" // for ClearCache()
#include "PluginManager.h" #include "PluginManager.h"
@ -221,7 +221,7 @@ void CCodeWindow::OnProfilerMenu(wxCommandEvent& event)
switch (event.GetId()) switch (event.GetId())
{ {
case IDM_PROFILEBLOCKS: case IDM_PROFILEBLOCKS:
jit.ClearCache(); jit->ClearCache();
Profiler::g_ProfileBlocks = GetMenuBar()->IsChecked(IDM_PROFILEBLOCKS); Profiler::g_ProfileBlocks = GetMenuBar()->IsChecked(IDM_PROFILEBLOCKS);
break; break;
case IDM_WRITEPROFILE: case IDM_WRITEPROFILE:

View file

@ -27,11 +27,7 @@
#include "JitWindow.h" #include "JitWindow.h"
#include "HW/CPU.h" #include "HW/CPU.h"
#include "PowerPC/PowerPC.h" #include "PowerPC/PowerPC.h"
#if JITTEST #include "PowerPC/JitCommon/JitBase.h"
#include "PowerPC/Jit64/Jit.h"
#else
#include "PowerPC/Jit64IL/Jit.h"
#endif
#include "PowerPC/JitCommon/JitCache.h" #include "PowerPC/JitCommon/JitCache.h"
#include "PowerPC/PPCAnalyst.h" #include "PowerPC/PPCAnalyst.h"
#include "PowerPCDisasm.h" #include "PowerPCDisasm.h"
@ -130,16 +126,16 @@ void CJitWindow::Compare(u32 em_address)
disassembler x64disasm; disassembler x64disasm;
x64disasm.set_syntax_intel(); x64disasm.set_syntax_intel();
int block_num = jit.GetBlockCache()->GetBlockNumberFromStartAddress(em_address); int block_num = jit->GetBlockCache()->GetBlockNumberFromStartAddress(em_address);
if (block_num < 0) if (block_num < 0)
{ {
for (int i = 0; i < 500; i++) { 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) if (block_num >= 0)
break; break;
} }
if (block_num >= 0) { 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)) if (!(block->originalAddress <= em_address && block->originalSize + block->originalAddress >= em_address))
block_num = -1; block_num = -1;
} }
@ -150,12 +146,12 @@ void CJitWindow::Compare(u32 em_address)
return; return;
} }
} }
JitBlock *block = jit.GetBlockCache()->GetBlock(block_num); JitBlock *block = jit->GetBlockCache()->GetBlock(block_num);
// 800031f0 // 800031f0
// == Fill in x86 box // == 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; u64 disasmPtr = (u64)code;
int size = block->codeSize; int size = block->codeSize;
const u8 *end = code + size; const u8 *end = code + size;

View file

@ -700,122 +700,6 @@
ExcludedFromBuild="false" ExcludedFromBuild="false"
/> />
</Configuration> </Configuration>
<Configuration
Name="Release_JITIL|Win32"
OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
CommandLine="&quot;$(ProjectDir)..\Common\SubWCRev.exe&quot; &quot;$(SolutionDir)\.&quot; &quot;$(ProjectDir)..\Common\src\svnrev_template.h&quot; &quot;$(ProjectDir)..\Common\src\svnrev.h&quot;"
ExcludedFromBuild="false"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="WIN32,__WXMSW__,_WINDOWS,NOPCH"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="1"
TypeLibraryName=".\vc_msw/toolbar.tlb"
HeaderFileName=""
/>
<Tool
Name="VCCLCompilerTool"
Optimization="3"
InlineFunctionExpansion="0"
FavorSizeOrSpeed="1"
AdditionalIncludeDirectories="..\Common\Src;..\Core\Src;..\DebuggerWX\src;..\DebuggerUICommon\src;..\DiscIO\Src;..\InputCommon\Src;..\..\PluginSpecs;..\..\..\Externals\wxWidgets\Include;..\..\..\Externals\wxWidgets\Include\msvc;..\..\..\Externals\SFML\include"
PreprocessorDefinitions="WIN32;__WXMSW__;_WINDOWS;NOPCH;_SECURE_SCL=0;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE"
StringPooling="false"
RuntimeLibrary="0"
BufferSecurityCheck="false"
EnableFunctionLevelLinking="false"
EnableEnhancedInstructionSet="2"
FloatingPointModel="0"
RuntimeTypeInfo="false"
UsePrecompiledHeader="2"
PrecompiledHeaderFile="$(IntDir)\$(TargetName).pch"
AssemblerListingLocation="$(IntDir)\"
ObjectFile="$(IntDir)\"
ProgramDataBaseFileName="$(IntDir)\vc80.pdb"
WarningLevel="4"
WarnAsError="false"
SuppressStartupBanner="true"
DebugInformationFormat="3"
ForcedIncludeFiles="stdafx.h"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="__WXMSW__,_WINDOWS,NOPCH"
Culture="1033"
AdditionalIncludeDirectories=".\..\..\lib\vc_lib\msw;.\..\..\include;.;.\..\..\samples"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib"
OutputFile="../../../Binary/Win32/DolphinIL.exe"
LinkIncremental="1"
SuppressStartupBanner="true"
AdditionalLibraryDirectories="&quot;$(SolutionDir)\Release\$(PlatformName)&quot;;&quot;..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)&quot;"
IgnoreAllDefaultLibraries="false"
IgnoreDefaultLibraryNames=""
GenerateDebugInformation="true"
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
GenerateMapFile="false"
MapFileName="$(TargetDir)linkermap.map"
SubSystem="2"
BaseAddress="0x00400000"
RandomizedBaseAddress="1"
DataExecutionPrevention="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
SuppressStartupBanner="true"
OutputFile=".\vc_msw/toolbar.bsc"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
Description="Copying Data\* to $(TargetDir)"
CommandLine="xcopy &quot;$(SolutionDir)..\Data&quot; &quot;$(TargetDir)&quot; /e /s /y /d&#x0D;&#x0A;echo Copying External .dlls&#x0D;&#x0A;xcopy &quot;$(SolutionDir)..\Externals\Cg\*.dll&quot; &quot;$(TargetDir)&quot; /e /s /y /q /d&#x0D;&#x0A;xcopy &quot;$(SolutionDir)..\Externals\SDL\win32\*.dll&quot; &quot;$(TargetDir)&quot; /e /s /y /q /d&#x0D;&#x0A;xcopy &quot;$(SolutionDir)..\Externals\WiiUse\Win32\*.dll&quot; &quot;$(TargetDir)&quot; /e /s /y /q /d&#x0D;&#x0A;"
ExcludedFromBuild="false"
/>
</Configuration>
<Configuration <Configuration
Name="Release_JITIL|x64" Name="Release_JITIL|x64"
OutputDirectory="$(PlatformName)\$(ConfigurationName)" OutputDirectory="$(PlatformName)\$(ConfigurationName)"
@ -1205,15 +1089,6 @@
ForcedIncludeFiles="$(NOINHERIT)" ForcedIncludeFiles="$(NOINHERIT)"
/> />
</FileConfiguration> </FileConfiguration>
<FileConfiguration
Name="Release_JITIL|Win32"
>
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="0"
ForcedIncludeFiles="$(NOINHERIT)"
/>
</FileConfiguration>
<FileConfiguration <FileConfiguration
Name="Release_JITIL|x64" Name="Release_JITIL|x64"
> >
@ -1281,15 +1156,6 @@
ForcedIncludeFiles="$(NOINHERIT)" ForcedIncludeFiles="$(NOINHERIT)"
/> />
</FileConfiguration> </FileConfiguration>
<FileConfiguration
Name="Release_JITIL|Win32"
>
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="0"
ForcedIncludeFiles="$(NOINHERIT)"
/>
</FileConfiguration>
<FileConfiguration <FileConfiguration
Name="Release_JITIL|x64" Name="Release_JITIL|x64"
> >
@ -1357,15 +1223,6 @@
ForcedIncludeFiles="$(NOINHERIT)" ForcedIncludeFiles="$(NOINHERIT)"
/> />
</FileConfiguration> </FileConfiguration>
<FileConfiguration
Name="Release_JITIL|Win32"
>
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="0"
ForcedIncludeFiles="$(NOINHERIT)"
/>
</FileConfiguration>
<FileConfiguration <FileConfiguration
Name="Release_JITIL|x64" Name="Release_JITIL|x64"
> >
@ -1441,15 +1298,6 @@
ForcedIncludeFiles="$(NOINHERIT)" ForcedIncludeFiles="$(NOINHERIT)"
/> />
</FileConfiguration> </FileConfiguration>
<FileConfiguration
Name="Release_JITIL|Win32"
>
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="0"
ForcedIncludeFiles="$(NOINHERIT)"
/>
</FileConfiguration>
<FileConfiguration <FileConfiguration
Name="Release_JITIL|x64" Name="Release_JITIL|x64"
> >
@ -1495,14 +1343,6 @@
WarnAsError="false" WarnAsError="false"
/> />
</FileConfiguration> </FileConfiguration>
<FileConfiguration
Name="Release_JITIL|Win32"
>
<Tool
Name="VCCLCompilerTool"
WarnAsError="false"
/>
</FileConfiguration>
</File> </File>
<File <File
RelativePath=".\src\MemoryCards\GCMemcard.h" RelativePath=".\src\MemoryCards\GCMemcard.h"
@ -1601,14 +1441,6 @@
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
/> />
</FileConfiguration> </FileConfiguration>
<FileConfiguration
Name="Release_JITIL|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration <FileConfiguration
Name="Release_JITIL|x64" Name="Release_JITIL|x64"
ExcludedFromBuild="true" ExcludedFromBuild="true"
@ -1677,14 +1509,6 @@
UsePrecompiledHeader="1" UsePrecompiledHeader="1"
/> />
</FileConfiguration> </FileConfiguration>
<FileConfiguration
Name="Release_JITIL|Win32"
>
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"
/>
</FileConfiguration>
<FileConfiguration <FileConfiguration
Name="Release_JITIL|x64" Name="Release_JITIL|x64"
> >

View file

@ -82,7 +82,7 @@ bool BootCore(const std::string& _rFilename)
if (main_frame->g_pCodeWindow) if (main_frame->g_pCodeWindow)
{ {
//StartUp.bCPUThread = code_frame->UseDualCore(); //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.bBootToPause = main_frame->g_pCodeWindow->BootToPause();
StartUp.bAutomaticStart = main_frame->g_pCodeWindow->AutomaticStart(); StartUp.bAutomaticStart = main_frame->g_pCodeWindow->AutomaticStart();
StartUp.bJITUnlimitedCache = main_frame->g_pCodeWindow->UnlimitedJITCache(); StartUp.bJITUnlimitedCache = main_frame->g_pCodeWindow->UnlimitedJITCache();

View file

@ -29,7 +29,6 @@
#include "SysConf.h" #include "SysConf.h"
#include "Frame.h" #include "Frame.h"
extern CFrame* main_frame; extern CFrame* main_frame;
// Strings for Device Selections // Strings for Device Selections
@ -45,7 +44,6 @@ extern CFrame* main_frame;
#define EXIDEV_BBA_STR "BBA" #define EXIDEV_BBA_STR "BBA"
#define EXIDEV_AM_BB_STR "AM-Baseboard" #define EXIDEV_AM_BB_STR "AM-Baseboard"
BEGIN_EVENT_TABLE(CConfigMain, wxDialog) BEGIN_EVENT_TABLE(CConfigMain, wxDialog)
EVT_CLOSE(CConfigMain::OnClose) EVT_CLOSE(CConfigMain::OnClose)
@ -62,6 +60,7 @@ EVT_CHOICE(ID_INTERFACE_LANG, CConfigMain::CoreSettingsChanged)
EVT_CHECKBOX(ID_ALWAYS_HLE_BS2, CConfigMain::CoreSettingsChanged) EVT_CHECKBOX(ID_ALWAYS_HLE_BS2, CConfigMain::CoreSettingsChanged)
EVT_RADIOBUTTON(ID_RADIOJIT, CConfigMain::CoreSettingsChanged) EVT_RADIOBUTTON(ID_RADIOJIT, CConfigMain::CoreSettingsChanged)
EVT_RADIOBUTTON(ID_RADIOJITIL, CConfigMain::CoreSettingsChanged)
EVT_RADIOBUTTON(ID_RADIOINT, CConfigMain::CoreSettingsChanged) EVT_RADIOBUTTON(ID_RADIOINT, CConfigMain::CoreSettingsChanged)
EVT_CHECKBOX(ID_CPUTHREAD, CConfigMain::CoreSettingsChanged) EVT_CHECKBOX(ID_CPUTHREAD, CConfigMain::CoreSettingsChanged)
EVT_CHECKBOX(ID_DSPTHREAD, 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 // Used to restrict changing of some options while emulator is running
void CConfigMain::UpdateGUI() void CConfigMain::UpdateGUI()
{ {
@ -183,7 +181,7 @@ void CConfigMain::CreateGUIControls()
// Framelimit // Framelimit
arrayStringFor_Framelimit.Add(wxT("Off")); arrayStringFor_Framelimit.Add(wxT("Off"));
arrayStringFor_Framelimit.Add(wxT("Auto")); 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)); arrayStringFor_Framelimit.Add(wxString::Format(wxT("%i"), i));
// Create the notebook and pages // Create the notebook and pages
@ -200,8 +198,6 @@ void CConfigMain::CreateGUIControls()
Notebook->AddPage(PathsPage, wxT("Paths")); Notebook->AddPage(PathsPage, wxT("Paths"));
Notebook->AddPage(PluginPage, wxT("Plugins")); Notebook->AddPage(PluginPage, wxT("Plugins"));
// General page // General page
// Core Settings - Basic // 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 = 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); AlwaysHLE_BS2->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bHLE_BS2);
m_RadioJIT = new wxRadioButton(GeneralPage, ID_RADIOJIT, wxT("JIT Recompiler (recommended)")); m_RadioJIT = new wxRadioButton(GeneralPage, ID_RADIOJIT, wxT("JIT recompiler (recommended)"));
m_RadioInt = new wxRadioButton(GeneralPage, ID_RADIOINT, wxT("Interpreter (very slow)")); m_RadioJITIL = new wxRadioButton(GeneralPage, ID_RADIOJITIL, wxT("JitIL experimental recompiler"));
SConfig::GetInstance().m_LocalCoreStartupParameter.bUseJIT ? m_RadioJIT->SetValue(true) : m_RadioInt->SetValue(true); 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 = new wxCheckBox(GeneralPage, ID_LOCKTHREADS, wxT("Lock threads to cores"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
LockThreads->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bLockThreads); LockThreads->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bLockThreads);
DSPThread = new wxCheckBox(GeneralPage, ID_DSPTHREAD, wxT("DSP on thread (recommended)"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); 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); sbAdvanced->Add(AlwaysHLE_BS2, 0, wxALL, 5);
wxStaticBoxSizer* sizerCoreType = new wxStaticBoxSizer(wxVERTICAL, GeneralPage, wxT("CPU Emulator Engine")); wxStaticBoxSizer* sizerCoreType = new wxStaticBoxSizer(wxVERTICAL, GeneralPage, wxT("CPU Emulator Engine"));
sizerCoreType->Add(m_RadioJIT, 0, wxALL | wxEXPAND, 5); sizerCoreType->Add(m_RadioJIT, 0, wxALL | wxEXPAND, 5);
sizerCoreType->Add(m_RadioJITIL, 0, wxALL | wxEXPAND, 5);
sizerCoreType->Add(m_RadioInt, 0, wxALL | wxEXPAND, 5); sizerCoreType->Add(m_RadioInt, 0, wxALL | wxEXPAND, 5);
sbAdvanced->Add(sizerCoreType, 0, wxALL, 5); sbAdvanced->Add(sizerCoreType, 0, wxALL, 5);
sbAdvanced->Add(LockThreads, 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(); SConfig::GetInstance().m_LocalCoreStartupParameter.bHLE_BS2 = AlwaysHLE_BS2->IsChecked();
break; break;
case ID_RADIOJIT: 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); if (main_frame->g_pCodeWindow) main_frame->g_pCodeWindow->GetMenuBar()->Check(IDM_INTERPRETER, false);
break; break;
case ID_RADIOINT: 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); if (main_frame->g_pCodeWindow) main_frame->g_pCodeWindow->GetMenuBar()->Check(IDM_INTERPRETER, true);
break; break;
case ID_CPUTHREAD: case ID_CPUTHREAD:
@ -974,15 +980,12 @@ void CConfigMain::OnConfig(wxCommandEvent& event)
case ID_GRAPHIC_CONFIG: case ID_GRAPHIC_CONFIG:
CallConfig(GraphicSelection); CallConfig(GraphicSelection);
break; break;
case ID_DSP_CONFIG: case ID_DSP_CONFIG:
CallConfig(DSPSelection); CallConfig(DSPSelection);
break; break;
case ID_PAD_CONFIG: case ID_PAD_CONFIG:
CallConfig(PADSelection); CallConfig(PADSelection);
break; break;
case ID_WIIMOTE_CONFIG: case ID_WIIMOTE_CONFIG:
CallConfig(WiimoteSelection); CallConfig(WiimoteSelection);
break; break;
@ -993,11 +996,9 @@ void CConfigMain::CallConfig(wxChoice* _pChoice)
{ {
int Index = _pChoice->GetSelection(); int Index = _pChoice->GetSelection();
INFO_LOG(CONSOLE, "CallConfig: %i\n", Index); INFO_LOG(CONSOLE, "CallConfig: %i\n", Index);
if (Index >= 0) if (Index >= 0)
{ {
const CPluginInfo* pInfo = static_cast<CPluginInfo*>(_pChoice->GetClientData(Index)); const CPluginInfo* pInfo = static_cast<CPluginInfo*>(_pChoice->GetClientData(Index));
if (pInfo != NULL) if (pInfo != NULL)
CPluginManager::GetInstance().OpenConfig((HWND) this->GetHandle(), pInfo->GetFilename().c_str(), pInfo->GetPluginInfo().Type); 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(); _rFilename.clear();
int Index = _pChoice->GetSelection(); int Index = _pChoice->GetSelection();
if (Index >= 0) if (Index >= 0)
{ {
const CPluginInfo* pInfo = static_cast<CPluginInfo*>(_pChoice->GetClientData(Index)); const CPluginInfo* pInfo = static_cast<CPluginInfo*>(_pChoice->GetClientData(Index));

View file

@ -63,8 +63,9 @@ private:
wxBoxSizer* sCore; wxBoxSizer* sCore;
wxStaticBoxSizer* sbBasic, *sbAdvanced, *sbInterface; wxStaticBoxSizer* sbBasic, *sbAdvanced, *sbInterface;
wxCheckBox* AlwaysHLE_BS2; wxCheckBox* AlwaysHLE_BS2;
wxRadioButton* m_RadioJIT;
wxRadioButton* m_RadioInt; wxRadioButton* m_RadioInt;
wxRadioButton* m_RadioJIT;
wxRadioButton* m_RadioJITIL;
wxCheckBox* CPUThread; wxCheckBox* CPUThread;
wxCheckBox* DSPThread; wxCheckBox* DSPThread;
wxCheckBox* LockThreads; wxCheckBox* LockThreads;
@ -160,6 +161,7 @@ private:
ID_ALWAYS_HLE_BS2, ID_ALWAYS_HLE_BS2,
ID_RADIOJIT, ID_RADIOJIT,
ID_RADIOJITIL,
ID_RADIOINT, ID_RADIOINT,
ID_CPUTHREAD, ID_CPUTHREAD,
ID_DSPTHREAD, ID_DSPTHREAD,

View file

@ -39,6 +39,7 @@
#include "AboutDolphin.h" #include "AboutDolphin.h"
#include "GameListCtrl.h" #include "GameListCtrl.h"
#include "BootManager.h" #include "BootManager.h"
#include "ConsoleListener.h"
#include "ConfigManager.h" // Core #include "ConfigManager.h" // Core
#include "Core.h" #include "Core.h"

View file

@ -40,6 +40,7 @@
#include "WxUtils.h" #include "WxUtils.h"
#include "ConfigManager.h" // Core #include "ConfigManager.h" // Core
#include "ConsoleListener.h"
#include "Core.h" #include "Core.h"
#include "OnFrame.h" #include "OnFrame.h"
#include "HW/DVDInterface.h" #include "HW/DVDInterface.h"

View file

@ -25,8 +25,10 @@
#include "Core.h" // for Core::GetState() #include "Core.h" // for Core::GetState()
#include "LogWindow.h" #include "LogWindow.h"
#include "ConsoleListener.h"
#include "Console.h" #include "Console.h"
// Milliseconds between msgQueue flushes to wxTextCtrl // Milliseconds between msgQueue flushes to wxTextCtrl
#define UPDATETIME 200 #define UPDATETIME 200

View file

@ -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) inline void decodebytesC14X2_5A3_To_BGRA32(u32 *dst, const u16 *src, int tlutaddr)
{ {
u16 *tlut = (u16*)(texMem + 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) inline void decodebytesIA4(u16 *dst, const u8 *src)
{ {
for (int x = 0; x < 8; x++) 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) inline void decodebytesRGB5A3(u32 *dst, const u16 *src)
{ {
for (int x = 0; x < 4; x++) 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. // 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) inline void decodebytesARGB8_4(u32 *dst, const u16 *src, const u16 *src2)
{ {
for (int x = 0; x < 4; x++) { 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) void decodeDXTBlock(u32 *dst, const DXTBlock *src, int pitch)
{ {
// S3TC Decoder (Note: GCN decodes differently from PC so we can't use native support) // 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 c1 = Common::swap16(src->color1);
u16 c2 = Common::swap16(src->color2); u16 c2 = Common::swap16(src->color2);
int blue1 = Convert5To8(c1 & 0x1F); 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; 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 y = 0; y < height; y += 4)
for (int x = 0; x < width; x += 8) 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++) for (int ix = 0; ix < 8; ix++,src++)
{ {
int stride = (y + iy)*Pitch+(x + ix) * 2; int stride = (y + iy)*Pitch+(x + ix) * 2;
if(stride < TexLen) if (stride < TexLen)
{ {
dst[stride] = src[0]; dst[stride] = src[0];
dst[stride + 1] = 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 case GX_TF_RGBA8: // speed critical
{ {
for (int y = 0; y < height; y += 4) for (int y = 0; y < height; y += 4)
{
for (int x = 0; x < width; x += 4) for (int x = 0; x < width; x += 4)
{ {
for (int iy = 0; iy < 4 && (y + iy) < height; iy++) 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); //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 *src1 = (u16*)src + 4 * iy;
u16 *src2 = (u16*)src + 4 * iy + 16; u16 *src2 = (u16*)src + 4 * iy + 16;
for (int ix = 0; ix < 4; ix++) for (int ix = 0; ix < 4; ix++)
{ {
int stride = (y+iy)*Pitch + (x + ix) * 4; 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; src += 64;
} }
}
} }
return PC_TEX_FMT_BGRA32; return PC_TEX_FMT_BGRA32;
case GX_TF_CMPR: // speed critical case GX_TF_CMPR: // speed critical
// The metroid games use this format almost exclusively. // 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 #else
for (int y = 0; y < height; y += 8) for (int y = 0; y < height; y += 8)
{ {
for (int x = 0; x < width; x += 8) for (int x = 0; x < width; x += 8)
{ {
decodeDXTBlock(((u32*)((u8*)dst + y * Pitch)) + x, (DXTBlock*)src, width); decodeDXTBlock(((u32*)((u8*)dst + y * Pitch)) + x, (DXTBlock *)src, width);
src += sizeof(DXTBlock); src += sizeof(DXTBlock);
decodeDXTBlock(((u32*)((u8*)dst + y * Pitch)) + x + 4, (DXTBlock*)src, width); decodeDXTBlock(((u32*)((u8*)dst + y * Pitch)) + x + 4, (DXTBlock *)src, width);
src += sizeof(DXTBlock); src += sizeof(DXTBlock);
decodeDXTBlock(((u32*)((u8*)dst + (y + 4) * Pitch)) + x, (DXTBlock*)src, width); decodeDXTBlock(((u32*)((u8*)dst + (y + 4) * Pitch)) + x, (DXTBlock *)src, width);
src += sizeof(DXTBlock); src += sizeof(DXTBlock);
decodeDXTBlock(((u32*)((u8*)dst + (y + 4) * Pitch)) + x + 4, (DXTBlock*)src, width); decodeDXTBlock(((u32*)((u8*)dst + (y + 4) * Pitch)) + x + 4, (DXTBlock *)src, width);
src += sizeof(DXTBlock); src += sizeof(DXTBlock);
} }
} }
#endif #endif
return PC_TEX_FMT_BGRA32; return PC_TEX_FMT_BGRA32;

View file

@ -206,8 +206,6 @@ Global
Debug|x64 = Debug|x64 Debug|x64 = Debug|x64
DebugFast|Win32 = DebugFast|Win32 DebugFast|Win32 = DebugFast|Win32
DebugFast|x64 = DebugFast|x64 DebugFast|x64 = DebugFast|x64
Release_JITIL|Win32 = Release_JITIL|Win32
Release_JITIL|x64 = Release_JITIL|x64
Release|Win32 = Release|Win32 Release|Win32 = Release|Win32
Release|x64 = Release|x64 Release|x64 = Release|x64
EndGlobalSection EndGlobalSection
@ -220,10 +218,6 @@ Global
{F0B874CB-4476-4199-9315-8343D05AE684}.DebugFast|Win32.Build.0 = DebugFast|Win32 {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.ActiveCfg = DebugFast|x64
{F0B874CB-4476-4199-9315-8343D05AE684}.DebugFast|x64.Build.0 = 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.ActiveCfg = Release|Win32
{F0B874CB-4476-4199-9315-8343D05AE684}.Release|Win32.Build.0 = Release|Win32 {F0B874CB-4476-4199-9315-8343D05AE684}.Release|Win32.Build.0 = Release|Win32
{F0B874CB-4476-4199-9315-8343D05AE684}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = DebugFast|Win32
{636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.DebugFast|x64.ActiveCfg = DebugFast|x64 {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}.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.ActiveCfg = Release|Win32
{636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Release|Win32.Build.0 = Release|Win32 {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Release|Win32.Build.0 = Release|Win32
{636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = DebugFast|Win32
{9A183B48-ECC2-4121-876A-9B3793686073}.DebugFast|x64.ActiveCfg = DebugFast|x64 {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}.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.ActiveCfg = Release|Win32
{9A183B48-ECC2-4121-876A-9B3793686073}.Release|Win32.Build.0 = Release|Win32 {9A183B48-ECC2-4121-876A-9B3793686073}.Release|Win32.Build.0 = Release|Win32
{9A183B48-ECC2-4121-876A-9B3793686073}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = Release|Win32
{29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.DebugFast|x64.ActiveCfg = Release|x64 {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}.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.ActiveCfg = Release|Win32
{29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Release|Win32.Build.0 = Release|Win32 {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Release|Win32.Build.0 = Release|Win32
{29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = Release|Win32
{3E03C179-8251-46E4-81F4-466F114BAC63}.DebugFast|x64.ActiveCfg = Release|x64 {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}.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.ActiveCfg = Release|Win32
{3E03C179-8251-46E4-81F4-466F114BAC63}.Release|Win32.Build.0 = Release|Win32 {3E03C179-8251-46E4-81F4-466F114BAC63}.Release|Win32.Build.0 = Release|Win32
{3E03C179-8251-46E4-81F4-466F114BAC63}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = DebugFast|Win32
{B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.DebugFast|x64.ActiveCfg = DebugFast|x64 {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}.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.ActiveCfg = Release|Win32
{B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Release|Win32.Build.0 = Release|Win32 {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Release|Win32.Build.0 = Release|Win32
{B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = DebugFast|Win32
{CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.DebugFast|x64.ActiveCfg = DebugFast|x64 {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}.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.ActiveCfg = Release|Win32
{CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Release|Win32.Build.0 = Release|Win32 {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Release|Win32.Build.0 = Release|Win32
{CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = DebugFast|Win32
{C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.DebugFast|x64.ActiveCfg = DebugFast|x64 {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}.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.ActiveCfg = Release|Win32
{C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Release|Win32.Build.0 = Release|Win32 {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Release|Win32.Build.0 = Release|Win32
{C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = DebugFast|Win32
{A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.DebugFast|x64.ActiveCfg = DebugFast|x64 {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}.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.ActiveCfg = Release|Win32
{A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Release|Win32.Build.0 = Release|Win32 {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Release|Win32.Build.0 = Release|Win32
{A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = DebugFast|Win32
{4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.DebugFast|x64.ActiveCfg = DebugFast|x64 {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}.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.ActiveCfg = Release|Win32
{4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Release|Win32.Build.0 = Release|Win32 {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Release|Win32.Build.0 = Release|Win32
{4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = DebugFast|Win32
{E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.DebugFast|x64.ActiveCfg = DebugFast|x64 {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}.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.ActiveCfg = Release|Win32
{E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.Release|Win32.Build.0 = Release|Win32 {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.Release|Win32.Build.0 = Release|Win32
{E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = DebugFast|Win32
{521498BE-6089-4780-8223-E67C22F4E068}.DebugFast|x64.ActiveCfg = DebugFast|x64 {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}.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.ActiveCfg = Release|Win32
{521498BE-6089-4780-8223-E67C22F4E068}.Release|Win32.Build.0 = Release|Win32 {521498BE-6089-4780-8223-E67C22F4E068}.Release|Win32.Build.0 = Release|Win32
{521498BE-6089-4780-8223-E67C22F4E068}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = DebugFast|Win32
{D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.DebugFast|x64.ActiveCfg = DebugFast|x64 {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}.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.ActiveCfg = Release|Win32
{D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Release|Win32.Build.0 = Release|Win32 {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Release|Win32.Build.0 = Release|Win32
{D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = Release|Win32
{33546D62-7F34-4EA6-A88E-D538B36E16BF}.DebugFast|x64.ActiveCfg = Release|x64 {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}.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.ActiveCfg = Release|Win32
{33546D62-7F34-4EA6-A88E-D538B36E16BF}.Release|Win32.Build.0 = Release|Win32 {33546D62-7F34-4EA6-A88E-D538B36E16BF}.Release|Win32.Build.0 = Release|Win32
{33546D62-7F34-4EA6-A88E-D538B36E16BF}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = DebugFast|Win32
{8D612734-FAA5-4B8A-804F-4DEA2367D495}.DebugFast|x64.ActiveCfg = DebugFast|x64 {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}.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.ActiveCfg = Release|Win32
{8D612734-FAA5-4B8A-804F-4DEA2367D495}.Release|Win32.Build.0 = Release|Win32 {8D612734-FAA5-4B8A-804F-4DEA2367D495}.Release|Win32.Build.0 = Release|Win32
{8D612734-FAA5-4B8A-804F-4DEA2367D495}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = DebugFast|Win32
{C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.DebugFast|x64.ActiveCfg = DebugFast|x64 {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}.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.ActiveCfg = Release|Win32
{C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Release|Win32.Build.0 = Release|Win32 {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Release|Win32.Build.0 = Release|Win32
{C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = DebugFast|Win32
{FBAFB369-07EB-4460-9CAD-08BE5789DAB6}.DebugFast|x64.ActiveCfg = DebugFast|x64 {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}.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.ActiveCfg = Release|Win32
{FBAFB369-07EB-4460-9CAD-08BE5789DAB6}.Release|Win32.Build.0 = Release|Win32 {FBAFB369-07EB-4460-9CAD-08BE5789DAB6}.Release|Win32.Build.0 = Release|Win32
{FBAFB369-07EB-4460-9CAD-08BE5789DAB6}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = DebugFast|Win32
{3D8156A9-64D1-4C8E-ADBE-1B319030E4A4}.DebugFast|x64.ActiveCfg = DebugFast|x64 {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}.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.ActiveCfg = Release|Win32
{3D8156A9-64D1-4C8E-ADBE-1B319030E4A4}.Release|Win32.Build.0 = Release|Win32 {3D8156A9-64D1-4C8E-ADBE-1B319030E4A4}.Release|Win32.Build.0 = Release|Win32
{3D8156A9-64D1-4C8E-ADBE-1B319030E4A4}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = DebugFast|Win32
{838A89A3-3AA0-4A45-ACBE-3D1E0980C2ED}.DebugFast|x64.ActiveCfg = DebugFast|x64 {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}.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.ActiveCfg = Release|Win32
{838A89A3-3AA0-4A45-ACBE-3D1E0980C2ED}.Release|Win32.Build.0 = Release|Win32 {838A89A3-3AA0-4A45-ACBE-3D1E0980C2ED}.Release|Win32.Build.0 = Release|Win32
{838A89A3-3AA0-4A45-ACBE-3D1E0980C2ED}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = DebugFast|Win32
{1970D175-3DE8-4738-942A-4D98D1CDBF64}.DebugFast|x64.ActiveCfg = DebugFast|x64 {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}.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|Win32.ActiveCfg = Release|Win32
{1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release|x64.ActiveCfg = Release|x64 {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release|x64.ActiveCfg = Release|x64
{1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release|x64.Build.0 = 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}.Debug|x64.ActiveCfg = Wii|x64
{3877AA3E-9CC0-4ADF-8E71-272EE4443478}.DebugFast|Win32.ActiveCfg = Wii|Win32 {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}.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|Win32.ActiveCfg = Wii|Win32
{3877AA3E-9CC0-4ADF-8E71-272EE4443478}.Release|x64.ActiveCfg = Wii|x64 {3877AA3E-9CC0-4ADF-8E71-272EE4443478}.Release|x64.ActiveCfg = Wii|x64
{C0B84DA9-FF15-4FAB-9590-17132F3C6DE4}.Debug|Win32.ActiveCfg = Debug|Win32 {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|Win32.Build.0 = Release|Win32
{C0B84DA9-FF15-4FAB-9590-17132F3C6DE4}.DebugFast|x64.ActiveCfg = Release|x64 {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}.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.ActiveCfg = Release|Win32
{C0B84DA9-FF15-4FAB-9590-17132F3C6DE4}.Release|Win32.Build.0 = Release|Win32 {C0B84DA9-FF15-4FAB-9590-17132F3C6DE4}.Release|Win32.Build.0 = Release|Win32
{C0B84DA9-FF15-4FAB-9590-17132F3C6DE4}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = Release|Win32
{823DDC98-42D5-4A38-88CF-9DC06C788AE4}.DebugFast|x64.ActiveCfg = Release|x64 {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}.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.ActiveCfg = Release|Win32
{823DDC98-42D5-4A38-88CF-9DC06C788AE4}.Release|Win32.Build.0 = Release|Win32 {823DDC98-42D5-4A38-88CF-9DC06C788AE4}.Release|Win32.Build.0 = Release|Win32
{823DDC98-42D5-4A38-88CF-9DC06C788AE4}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = Release|Win32
{40C636FA-B5BF-4D67-ABC8-376B524A7551}.DebugFast|x64.ActiveCfg = Release|x64 {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}.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.ActiveCfg = Release|Win32
{40C636FA-B5BF-4D67-ABC8-376B524A7551}.Release|Win32.Build.0 = Release|Win32 {40C636FA-B5BF-4D67-ABC8-376B524A7551}.Release|Win32.Build.0 = Release|Win32
{40C636FA-B5BF-4D67-ABC8-376B524A7551}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = DebugFast|Win32
{F81AE75C-3D17-4D8C-A201-82FA5351C123}.DebugFast|x64.ActiveCfg = DebugFast|x64 {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}.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.ActiveCfg = Release|Win32
{F81AE75C-3D17-4D8C-A201-82FA5351C123}.Release|Win32.Build.0 = Release|Win32 {F81AE75C-3D17-4D8C-A201-82FA5351C123}.Release|Win32.Build.0 = Release|Win32
{F81AE75C-3D17-4D8C-A201-82FA5351C123}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = Release|Win32
{DA4CA030-A741-4DDC-9DA8-B2F351F0F158}.DebugFast|x64.ActiveCfg = Release|x64 {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}.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.ActiveCfg = Release|Win32
{DA4CA030-A741-4DDC-9DA8-B2F351F0F158}.Release|Win32.Build.0 = Release|Win32 {DA4CA030-A741-4DDC-9DA8-B2F351F0F158}.Release|Win32.Build.0 = Release|Win32
{DA4CA030-A741-4DDC-9DA8-B2F351F0F158}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = Release|Win32
{0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}.DebugFast|x64.ActiveCfg = Release|x64 {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}.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.ActiveCfg = Release|Win32
{0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}.Release|Win32.Build.0 = Release|Win32 {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}.Release|Win32.Build.0 = Release|Win32
{0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = Release|Win32
{05C75041-D67D-4903-A362-8395A7B35C75}.DebugFast|x64.ActiveCfg = Release|x64 {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}.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.ActiveCfg = Release|Win32
{05C75041-D67D-4903-A362-8395A7B35C75}.Release|Win32.Build.0 = Release|Win32 {05C75041-D67D-4903-A362-8395A7B35C75}.Release|Win32.Build.0 = Release|Win32
{05C75041-D67D-4903-A362-8395A7B35C75}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = Release|Win32
{1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.DebugFast|x64.ActiveCfg = Release|x64 {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}.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.ActiveCfg = Release|Win32
{1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Release|Win32.Build.0 = Release|Win32 {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Release|Win32.Build.0 = Release|Win32
{1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = Release|Win32
{11F55366-12EC-4C44-A8CB-1D4E315D61ED}.DebugFast|x64.ActiveCfg = Release|x64 {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}.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.ActiveCfg = Release|Win32
{11F55366-12EC-4C44-A8CB-1D4E315D61ED}.Release|Win32.Build.0 = Release|Win32 {11F55366-12EC-4C44-A8CB-1D4E315D61ED}.Release|Win32.Build.0 = Release|Win32
{11F55366-12EC-4C44-A8CB-1D4E315D61ED}.Release|x64.ActiveCfg = Release|x64 {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|Win32.Build.0 = Release|Win32
{66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.DebugFast|x64.ActiveCfg = Release|x64 {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}.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.ActiveCfg = Release|Win32
{66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|Win32.Build.0 = 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.ActiveCfg = Release|x64
{66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|x64.Build.0 = 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 EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View file

@ -2,23 +2,18 @@
//________________________________________________________________________________________ //________________________________________________________________________________________
// File description: Common plugin spec, version #1.0 maintained by F|RES // File description: Common plugin spec, version #1.0 maintained by F|RES
#ifndef _PLUGINS_H_INCLUDED__ #ifndef _PLUGINS_H_INCLUDED__
#define _PLUGINS_H_INCLUDED__ #define _PLUGINS_H_INCLUDED__
// Includes // Includes
// ------------ // ------------
// TODO: See if we can get rid of the windows.h include.
#ifdef _WIN32 #ifdef _WIN32
#include <windows.h> #include <windows.h>
#endif #endif
#include "CommonTypes.h" #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 enum PLUGIN_COMM
{ {
@ -34,9 +29,6 @@ enum PLUGIN_COMM
INPUT_FRAME_COUNTER // Wind back the frame counter for rerecording INPUT_FRAME_COUNTER // Wind back the frame counter for rerecording
}; };
// System specific declarations and definitions // System specific declarations and definitions
// ------------ // ------------
@ -64,7 +56,6 @@ enum PLUGIN_COMM
// Global values // Global values
// ------------ // ------------