From 1c1425a4067afa1f59bca195f2433c7b86dd27e3 Mon Sep 17 00:00:00 2001 From: hrydgard Date: Mon, 16 Feb 2009 22:06:11 +0000 Subject: [PATCH] Assorted jit64-related bugfixes. Discovered and papered over nasty codegen bug. No, IL64 still doesn't work. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2281 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/Common/Src/ABI.cpp | 15 +- Source/Core/Common/Src/MsgHandler.cpp | 151 +++++++++--------- Source/Core/Common/Src/x64Emitter.h | 11 +- Source/Core/Core/Core.vcproj | 2 +- Source/Core/Core/Src/Core.cpp | 2 + Source/Core/Core/Src/HW/MemmapFunctions.cpp | 8 +- .../Core/Src/PowerPC/Jit64/JitRegCache.cpp | 7 +- .../Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp | 2 +- Source/Core/Core/Src/PowerPC/Jit64IL/IR.cpp | 25 ++- .../Core/Src/PowerPC/Jit64IL/JitRegCache.cpp | 4 +- 10 files changed, 127 insertions(+), 100 deletions(-) diff --git a/Source/Core/Common/Src/ABI.cpp b/Source/Core/Common/Src/ABI.cpp index 0cc5083240..09d8fda388 100644 --- a/Source/Core/Common/Src/ABI.cpp +++ b/Source/Core/Common/Src/ABI.cpp @@ -186,10 +186,17 @@ void XEmitter::ABI_CallFunctionR(void *func, X64Reg reg1) { // Pass a register as a paremeter. void XEmitter::ABI_CallFunctionRR(void *func, X64Reg reg1, X64Reg reg2) { - if (reg1 != ABI_PARAM1) - MOV(32, R(ABI_PARAM1), R(reg1)); - if (reg2 != ABI_PARAM2) - MOV(32, R(ABI_PARAM2), R(reg2)); + if (reg2 != ABI_PARAM1) { + if (reg1 != ABI_PARAM1) + MOV(32, R(ABI_PARAM1), R(reg1)); + if (reg2 != ABI_PARAM2) + MOV(32, R(ABI_PARAM2), R(reg2)); + } else { + if (reg2 != ABI_PARAM2) + MOV(32, R(ABI_PARAM2), R(reg2)); + if (reg1 != ABI_PARAM1) + MOV(32, R(ABI_PARAM1), R(reg1)); + } CALL(func); } diff --git a/Source/Core/Common/Src/MsgHandler.cpp b/Source/Core/Common/Src/MsgHandler.cpp index 61888a8c6f..f685d76dff 100644 --- a/Source/Core/Common/Src/MsgHandler.cpp +++ b/Source/Core/Common/Src/MsgHandler.cpp @@ -1,83 +1,82 @@ -// Copyright (C) 2003-2008 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/ - - +// Copyright (C) 2003-2008 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 and declarations -// ŻŻŻŻŻŻŻŻŻ -#include // System - -#include "Common.h" // Local -#include "StringUtil.h" - -bool DefaultMsgHandler(const char* caption, const char* text, bool yes_no, int Style); -static MsgAlertHandler msg_handler = DefaultMsgHandler; -///////////////////////////// - - -/* Select which of these functions that are used for message boxes. If wxWidgets is enabled - we will use wxMsgAlert() that is defined in main.cpp */ -void RegisterMsgAlertHandler(MsgAlertHandler handler) -{ - msg_handler = handler; -} - +// ŻŻŻŻŻŻŻŻŻ +#include // System + +#include "Common.h" // Local +#include "StringUtil.h" + +bool DefaultMsgHandler(const char* caption, const char* text, bool yes_no, int Style); +static MsgAlertHandler msg_handler = DefaultMsgHandler; +///////////////////////////// + + +/* Select which of these functions that are used for message boxes. If wxWidgets is enabled + we will use wxMsgAlert() that is defined in main.cpp */ +void RegisterMsgAlertHandler(MsgAlertHandler handler) +{ + msg_handler = handler; +} + ///////////////////////////////////////////////////////////// /* This is the first stop for messages where the log is updated and the correct windows is shown */ -// ŻŻŻŻŻŻŻŻŻ -bool MsgAlert(const char* caption, bool yes_no, int Style, const char* format, ...) -{ - // --------------------------------- - // Read message and write it to the log - // ----------- - char buffer[2048]; - va_list args; - bool ret = false; - - va_start(args, format); - CharArrayFromFormatV(buffer, 2048, format, args); - - LOG(MASTER_LOG, "%s: %s", caption, buffer); - // ----------- - - if (msg_handler) { - ret = msg_handler(caption, buffer, yes_no, Style); - } - - va_end(args); - return ret; -} - +// ŻŻŻŻŻŻŻŻŻ +bool MsgAlert(const char* caption, bool yes_no, int Style, const char* format, ...) +{ + // --------------------------------- + // Read message and write it to the log + // ----------- + char buffer[2048]; + bool ret = false; + + va_list args; + va_start(args, format); + CharArrayFromFormatV(buffer, 2047, format, args); + va_end(args); + + LOG(MASTER_LOG, "%s: %s", caption, buffer); + // ----------- + + if (msg_handler) { + ret = msg_handler(caption, buffer, yes_no, Style); + } + return ret; +} + ///////////////////////////////////////////////////////////// /* This is used in the No-GUI build */ -// ŻŻŻŻŻŻŻŻŻ -bool DefaultMsgHandler(const char* caption, const char* text, bool yes_no, int Style) -{ -#ifdef _WIN32 - int STYLE = MB_ICONINFORMATION; - if(Style == QUESTION) STYLE = MB_ICONQUESTION; - if(Style == WARNING) STYLE = MB_ICONWARNING; - - return IDYES == MessageBox(0, text, caption, STYLE | (yes_no ? MB_YESNO : MB_OK)); - -#else - printf("%s\n", text); - return true; -#endif -} - +// ŻŻŻŻŻŻŻŻŻ +bool DefaultMsgHandler(const char* caption, const char* text, bool yes_no, int Style) +{ +#ifdef _WIN32 + int STYLE = MB_ICONINFORMATION; + if (Style == QUESTION) STYLE = MB_ICONQUESTION; + if (Style == WARNING) STYLE = MB_ICONWARNING; + + return IDYES == MessageBox(0, text, caption, STYLE | (yes_no ? MB_YESNO : MB_OK)); + +#else + printf("%s\n", text); + return true; +#endif +} + diff --git a/Source/Core/Common/Src/x64Emitter.h b/Source/Core/Common/Src/x64Emitter.h index edf2016ce0..5f336968c0 100644 --- a/Source/Core/Common/Src/x64Emitter.h +++ b/Source/Core/Common/Src/x64Emitter.h @@ -114,6 +114,8 @@ struct OpArg operandReg = 0; scale = (u8)_scale; offsetOrBaseReg = (u8)rmReg; + if (rmReg == R12) + PanicAlert("Codegen for R12 known buggy"); indexReg = (u8)scaledReg; //if scale == 0 never mind offseting offset = _offset; @@ -170,11 +172,14 @@ inline OpArg M(void *ptr) {return OpArg((u64)ptr, (int)SCALE_RIP);} inline OpArg R(X64Reg value) {return OpArg(0, SCALE_NONE, value);} inline OpArg MatR(X64Reg value) {return OpArg(0, SCALE_ATREG, value);} inline OpArg MDisp(X64Reg value, int offset) { - return OpArg((u32)offset, SCALE_ATREG, value); } -inline OpArg MComplex(X64Reg base, X64Reg scaled, int scale, int offset) -{ + return OpArg((u32)offset, SCALE_ATREG, value); +} +inline OpArg MComplex(X64Reg base, X64Reg scaled, int scale, int offset) { return OpArg(offset, scale, base, scaled); } +inline OpArg MRegSum(X64Reg base, X64Reg offset) { + return MComplex(base, offset, 1, 0); +} inline OpArg Imm8 (u8 imm) {return OpArg(imm, SCALE_IMM8);} inline OpArg Imm16(u16 imm) {return OpArg(imm, SCALE_IMM16);} //rarely used inline OpArg Imm32(u32 imm) {return OpArg(imm, SCALE_IMM32);} diff --git a/Source/Core/Core/Core.vcproj b/Source/Core/Core/Core.vcproj index ae38ec2be0..507107041d 100644 --- a/Source/Core/Core/Core.vcproj +++ b/Source/Core/Core/Core.vcproj @@ -579,7 +579,7 @@ AssemblerListingLocation="$(IntDir)\" WarningLevel="3" WarnAsError="false" - DebugInformationFormat="0" + DebugInformationFormat="3" ForcedIncludeFiles="stdafx.h" />