diff --git a/README.md b/README.md index e096d75864..fdfd86f824 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ __Windows__ * [Visual Studio 2015](https://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx) * [Visual C++ Redistributable Packages for Visual Studio 2015](http://www.microsoft.com/en-us/download/details.aspx?id=48145) * [Cmake 3.1.0+](http://www.cmake.org/download/) (required; add to PATH) -* [Python](https://www.python.org/downloads/) (required; add to PATH) +* [Python 3.3+](https://www.python.org/downloads/) (required; add to PATH) __Linux__ * GCC 5.1+ or Clang 3.5.0+ diff --git a/rpcs3-tests/rpcs3-tests.vcxproj b/rpcs3-tests/rpcs3-tests.vcxproj index 2c21977ca9..eabcf3e5d5 100644 --- a/rpcs3-tests/rpcs3-tests.vcxproj +++ b/rpcs3-tests/rpcs3-tests.vcxproj @@ -51,7 +51,7 @@ Disabled - ..\;..\rpcs3;$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) + ..\;..\llvm\include;..\llvm_build\include;..\rpcs3;$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) true @@ -63,7 +63,7 @@ MaxSpeed true true - ..\;..\rpcs3;$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) + ..\;..\llvm\include;..\llvm_build\include;..\rpcs3;$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) true diff --git a/rpcs3.sln b/rpcs3.sln index 08e16c40e8..3fea14a93d 100644 --- a/rpcs3.sln +++ b/rpcs3.sln @@ -221,6 +221,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VKGSRender", "rpcs3\VKGSRen {8F85B6CC-250F-4ACA-A617-E820A74E3E3C} = {8F85B6CC-250F-4ACA-A617-E820A74E3E3C} EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PPULLVMRecompiler", "rpcs3\PPULLVMRecompiler.vcxproj", "{304A6E8B-A311-4EC5-8045-BFA8D08175CE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug - LLVM|x64 = Debug - LLVM|x64 @@ -787,6 +789,20 @@ Global {3EE5F075-B546-42C4-B6A8-E3CCEF38B78D}.Release - LLVM|x64.Build.0 = Release|x64 {3EE5F075-B546-42C4-B6A8-E3CCEF38B78D}.Release|x64.ActiveCfg = Release|x64 {3EE5F075-B546-42C4-B6A8-E3CCEF38B78D}.Release|x64.Build.0 = Release|x64 + {304A6E8B-A311-4EC5-8045-BFA8D08175CE}.Debug - LLVM|x64.ActiveCfg = Debug - LLVM|x64 + {304A6E8B-A311-4EC5-8045-BFA8D08175CE}.Debug - LLVM|x64.Build.0 = Debug - LLVM|x64 + {304A6E8B-A311-4EC5-8045-BFA8D08175CE}.Debug - MemLeak|x64.ActiveCfg = Debug - MemLeak|x64 + {304A6E8B-A311-4EC5-8045-BFA8D08175CE}.Debug - MemLeak|x64.Build.0 = Debug - MemLeak|x64 + {304A6E8B-A311-4EC5-8045-BFA8D08175CE}.Debug|x64.ActiveCfg = Debug|x64 + {304A6E8B-A311-4EC5-8045-BFA8D08175CE}.Debug|x64.Build.0 = Debug|x64 + {304A6E8B-A311-4EC5-8045-BFA8D08175CE}.DLL Debug|x64.ActiveCfg = Debug|x64 + {304A6E8B-A311-4EC5-8045-BFA8D08175CE}.DLL Debug|x64.Build.0 = Debug|x64 + {304A6E8B-A311-4EC5-8045-BFA8D08175CE}.DLL Release|x64.ActiveCfg = Release|x64 + {304A6E8B-A311-4EC5-8045-BFA8D08175CE}.DLL Release|x64.Build.0 = Release|x64 + {304A6E8B-A311-4EC5-8045-BFA8D08175CE}.Release - LLVM|x64.ActiveCfg = Release - LLVM|x64 + {304A6E8B-A311-4EC5-8045-BFA8D08175CE}.Release - LLVM|x64.Build.0 = Release - LLVM|x64 + {304A6E8B-A311-4EC5-8045-BFA8D08175CE}.Release|x64.ActiveCfg = Release|x64 + {304A6E8B-A311-4EC5-8045-BFA8D08175CE}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -830,5 +846,6 @@ Global {58B40697-B15E-429E-B325-D52C28AEBCBF} = {09AD61F7-97FE-4FF8-8F7F-63FEA9B746F4} {8F85B6CC-250F-4ACA-A617-E820A74E3E3C} = {09AD61F7-97FE-4FF8-8F7F-63FEA9B746F4} {3EE5F075-B546-42C4-B6A8-E3CCEF38B78D} = {10FBF193-D532-4CCF-B875-4C7091A7F6C2} + {304A6E8B-A311-4EC5-8045-BFA8D08175CE} = {10FBF193-D532-4CCF-B875-4C7091A7F6C2} EndGlobalSection EndGlobal diff --git a/rpcs3/Emu/Cell/PPUInterpreter.h b/rpcs3/Emu/Cell/PPUInterpreter.h index 9e550bea4d..984723c34e 100644 --- a/rpcs3/Emu/Cell/PPUInterpreter.h +++ b/rpcs3/Emu/Cell/PPUInterpreter.h @@ -2277,7 +2277,7 @@ private: static void ADDIS_impl(PPUThread *CPU, u32 rd, u32 ra, s32 simm16) { - CPU->GPR[rd] = ra ? ((s64)CPU->GPR[ra] + (simm16 << 16)) : (simm16 << 16); + CPU->GPR[rd] = ra ? ((s64)CPU->GPR[ra] + (static_cast(simm16) << 16)) : (static_cast(simm16) << 16); } void ADDIS(u32 rd, u32 ra, s32 simm16) override { diff --git a/rpcs3/Emu/Cell/PPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/PPULLVMRecompiler.cpp index 561e498f2d..d1e621c44d 100644 --- a/rpcs3/Emu/Cell/PPULLVMRecompiler.cpp +++ b/rpcs3/Emu/Cell/PPULLVMRecompiler.cpp @@ -215,6 +215,8 @@ RecompilationEngine::RecompilationEngine() FunctionCache = (ExecutableStorageType *)memory_helper::reserve_memory(VIRTUAL_INSTRUCTION_COUNT * sizeof(ExecutableStorageType)); // Each char can store 8 page status FunctionCachePagesCommited = (char *)malloc(VIRTUAL_INSTRUCTION_COUNT / (8 * PAGE_SIZE)); + if (FunctionCachePagesCommited == nullptr) + throw EXCEPTION("Memory error"); memset(FunctionCachePagesCommited, 0, VIRTUAL_INSTRUCTION_COUNT / (8 * PAGE_SIZE)); } @@ -455,7 +457,7 @@ bool RecompilationEngine::AnalyseBlock(BlockEntry &functionData, size_t maxSize) // Used to decode instructions PPUDisAsm dis_asm(CPUDisAsm_DumpMode); dis_asm.offset = vm::ps3::_ptr(startAddress); - for (size_t instructionAddress = startAddress; instructionAddress < startAddress + maxSize; instructionAddress += 4) + for (u32 instructionAddress = startAddress; instructionAddress < startAddress + maxSize; instructionAddress += 4) { u32 instr = vm::ps3::read32((u32)instructionAddress); diff --git a/rpcs3/Emu/Cell/PPULLVMRecompilerCore.cpp b/rpcs3/Emu/Cell/PPULLVMRecompilerCore.cpp index 3e36a47bf7..b9a0c065d2 100644 --- a/rpcs3/Emu/Cell/PPULLVMRecompilerCore.cpp +++ b/rpcs3/Emu/Cell/PPULLVMRecompilerCore.cpp @@ -539,7 +539,8 @@ void Compiler::VCMPGTUW_(u32 vd, u32 va, u32 vb) { void Compiler::VCTSXS(u32 vd, u32 uimm5, u32 vb) { auto vb_v4f32 = GetVrAsFloatVec(vb); if (uimm5) { - vb_v4f32 = m_ir_builder->CreateFMul(vb_v4f32, m_ir_builder->CreateVectorSplat(4, ConstantFP::get(m_ir_builder->getFloatTy(), 1 << uimm5))); + u64 power_of_two = UINT64_C(1) << uimm5; + vb_v4f32 = m_ir_builder->CreateFMul(vb_v4f32, m_ir_builder->CreateVectorSplat(4, ConstantFP::get(m_ir_builder->getFloatTy(), static_cast(power_of_two)))); } auto res_v4i32 = (Value *)m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_cvtps2dq), vb_v4f32); @@ -554,7 +555,8 @@ void Compiler::VCTSXS(u32 vd, u32 uimm5, u32 vb) { void Compiler::VCTUXS(u32 vd, u32 uimm5, u32 vb) { auto vb_v4f32 = GetVrAsFloatVec(vb); if (uimm5) { - vb_v4f32 = m_ir_builder->CreateFMul(vb_v4f32, m_ir_builder->CreateVectorSplat(4, ConstantFP::get(m_ir_builder->getFloatTy(), 1 << uimm5))); + u64 power_of_two = UINT64_C(1) << uimm5; + vb_v4f32 = m_ir_builder->CreateFMul(vb_v4f32, m_ir_builder->CreateVectorSplat(4, ConstantFP::get(m_ir_builder->getFloatTy(), static_cast(power_of_two)))); } auto res_v4f32 = (Value *)m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse_max_ps), vb_v4f32, m_ir_builder->CreateVectorSplat(4, ConstantFP::get(m_ir_builder->getFloatTy(), 0))); @@ -2842,11 +2844,11 @@ void Compiler::MTOCRF(u32 l, u32 crm, u32 rs) { auto rs_i32 = GetGpr(rs, 32); auto cr_i32 = GetCr(); - u32 mask = 0; + u64 mask = 0; for (u32 i = 0; i < 8; i++) { if (crm & (1 << i)) { - mask |= 0xF << (i * 4); // move 0xF to the left i positions (in hex form) + mask |= UINT64_C(0xF) << (i * 4); // move 0xF to the left i positions (in hex form) if (l) { break; } @@ -4560,10 +4562,10 @@ void Compiler::MFFS(u32 frd, u32 rc) { } void Compiler::MTFSF(u32 flm, u32 frb, u32 rc) { - u32 mask = 0; + u64 mask = 0; for (u32 i = 0; i < 8; i++) { if (flm & (1 << i)) { - mask |= 0xF << (i * 4); + mask |= UINT64_C(0xF) << (i * 4); } } @@ -4979,7 +4981,7 @@ BasicBlock * Compiler::GetBasicBlockFromAddress(u32 address, const std::string & } Value * Compiler::GetBit(Value * val, u32 n) { - Value * bit; + Value * bit = val; #ifdef PPU_LLVM_RECOMPILER_USE_BMI if (val->getType()->isIntegerTy(32)) { @@ -5485,11 +5487,12 @@ void Compiler::CreateBranch(llvm::Value * cmp_i1, llvm::Value * target_i32, bool m_state.hit_branch_instruction = true; } +// FIXME: Find out why alignement is needed Value * Compiler::ReadMemory(Value * addr_i64, u32 bits, u32 alignment, bool bswap, bool could_be_mmio) { addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFF); auto eaddr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64((u64)vm::base(0))); auto eaddr_ix_ptr = m_ir_builder->CreateIntToPtr(eaddr_i64, m_ir_builder->getIntNTy(bits)->getPointerTo()); - auto val_ix = (Value *)m_ir_builder->CreateLoad(eaddr_ix_ptr, alignment); + auto val_ix = (Value *)m_ir_builder->CreateLoad(eaddr_ix_ptr); if (bits > 8 && bswap) { val_ix = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::bswap, m_ir_builder->getIntNTy(bits)), val_ix); } diff --git a/rpcs3/PPULLVMRecompiler.vcxproj b/rpcs3/PPULLVMRecompiler.vcxproj new file mode 100644 index 0000000000..89ce2d8f9b --- /dev/null +++ b/rpcs3/PPULLVMRecompiler.vcxproj @@ -0,0 +1,110 @@ + + + + + Debug - LLVM + x64 + + + Debug - MemLeak + x64 + + + Debug + x64 + + + Release - LLVM + x64 + + + Release + x64 + + + + + true + ..\llvm\include;..\llvm_build\include;%(AdditionalIncludeDirectories) + + + + + true + ..\llvm\include;..\llvm_build\include;%(AdditionalIncludeDirectories) + + + + + true + ..\llvm\include;..\llvm_build\include;%(AdditionalIncludeDirectories) + + + + + true + ..\llvm\include;..\llvm_build\include;%(AdditionalIncludeDirectories) + + + + + true + ..\llvm\include;..\llvm_build\include;%(AdditionalIncludeDirectories) + + + + + + + + + + + + {c4a10229-4712-4bd2-b63e-50d93c67a038} + + + + {304A6E8B-A311-4EC5-8045-BFA8D08175CE} + Win32Proj + PPULLVMRecompiler + 8.1 + + + + StaticLibrary + v140 + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/rpcs3/PPULLVMRecompiler.vcxproj.filters b/rpcs3/PPULLVMRecompiler.vcxproj.filters new file mode 100644 index 0000000000..3db3255af1 --- /dev/null +++ b/rpcs3/PPULLVMRecompiler.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + + + Source Files + + + \ No newline at end of file diff --git a/rpcs3/PPULLVMRecompiler.vcxproj.user b/rpcs3/PPULLVMRecompiler.vcxproj.user new file mode 100644 index 0000000000..abe8dd8961 --- /dev/null +++ b/rpcs3/PPULLVMRecompiler.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 1861bd7ce0..a6e8e0254c 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -58,6 +58,31 @@ + + + ..\llvm\include;..\llvm_build\include; + + + + + ..\llvm\include;..\llvm_build\include; + + + + + ..\llvm\include;..\llvm_build\include; + + + + + ..\llvm\include;..\llvm_build\include; + + + + + ..\llvm\include;..\llvm_build\include; + + @@ -75,7 +100,6 @@ - @@ -359,7 +383,6 @@ - Create @@ -648,7 +671,6 @@ - diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index d3b2a9660c..3da5f64a88 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -485,9 +485,6 @@ Emu\SysCalls\Modules - - Emu\CPU\Cell - Emu\CPU\ARMv7 @@ -722,9 +719,6 @@ Emu\SysCalls\Modules - - Emu\CPU\Cell - Emu\SysCalls\Modules @@ -1445,9 +1439,6 @@ Crypto - - Emu\CPU\Cell - Emu\CPU\ARMv7 diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index d1474f63e0..02ef058685 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -188,6 +188,9 @@ {30a05c4d-f5fd-421c-a864-17a64bdeaa75} + + {304a6e8b-a311-4ec5-8045-bfa8d08175ce} + {3ee5f075-b546-42c4-b6a8-e3ccef38b78d} diff --git a/rpcs3_debug.props b/rpcs3_debug.props index 64d1781b74..c631bcd1a6 100644 --- a/rpcs3_debug.props +++ b/rpcs3_debug.props @@ -8,6 +8,7 @@ + _SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) Disabled MultiThreadedDebugDLL diff --git a/rpcs3_default.props b/rpcs3_default.props index 9af3f5e7ef..f2039b1838 100644 --- a/rpcs3_default.props +++ b/rpcs3_default.props @@ -3,7 +3,7 @@ - .\;..\;..\asmjit\src\asmjit;..\wxWidgets\include\msvc;..\wxWidgets\include;..\ffmpeg\WindowsInclude;..\ffmpeg\Windows\x86_64\Include;$(VC_IncludePath);$(WindowsSDK_IncludePath);..\llvm\include;..\llvm_build\include;$(UniversalCRT_IncludePath);..\minidx12\Include;..\glm;..\GSL\include;..\libpng + .\;..\;..\asmjit\src\asmjit;..\wxWidgets\include\msvc;..\wxWidgets\include;..\ffmpeg\WindowsInclude;..\ffmpeg\Windows\x86_64\Include;$(VC_IncludePath);$(WindowsSDK_IncludePath);$(UniversalCRT_IncludePath);..\minidx12\Include;..\glm;..\GSL\include;..\libpng $(SolutionDir)lib\$(Configuration)-$(Platform)\ $(SolutionDir)lib\$(Configuration)-$(Platform)\;$(UniversalCRT_LibraryPath_x64);$(LibraryPath) $(SolutionDir)tmp\$(ProjectName)-$(Configuration)-$(Platform)\