Commit Graph

51 Commits

Author SHA1 Message Date
Nekotekina
5d45a3e47d Implement cpu_thread::suspend_all
Remove Accurate PUTLLC option.
Implement fallback path for SPU transactions.
2019-06-19 20:36:12 +03:00
Nekotekina
a6cde36dc4 Link LLVMAsmParser library 2019-05-19 17:46:55 +03:00
Nekotekina
7492f335e9 SPU analyser: basic function detection in Giga mode
Misc: fix EH frame registration (LLVM, non-Windows).
Misc: constant-folding bitcast (cpu_translator).
Misc: add syntax for LLVM arrays (cpu_translator).
Misc: use function names for proper linkage (SPU LLVM).

Changed function search and verification in Giga mode.
Basic stack frame layout analysis.
Function detection in Giga mode.
Basic use of new information in SPU LLVM.
Fixed jump table compilation in SPU LLVM.
Disable broken optimization in Accurate xfloat mode.
Make compiled SPU modules position-independent in SPU LLVM.

Optimizations include but not limited to:
 * Compiling SPU functions as native functions when eligible
 * Avoiding register context write-out
 * Aligned stack assumption (CWD alike instruction)
2019-05-11 02:13:19 +03:00
Nekotekina
d873802b9c Use LLVM 9
Use new add/sub with saturation intrinsics
2019-03-30 01:36:48 +03:00
Nekotekina
4b381fbbb1 Implement spu_runtime::reset
To handle JIT: Out Of Memory error.
2019-03-23 02:43:41 +03:00
Nekotekina
849411693a PPU LLVM: add MemoryManager3
For temporary allocations.
Add flags in jit_compiler constructor.
2019-03-23 02:43:41 +03:00
Nekotekina
efe067bfa0 LLVM: handle cascadelake CPU name 2019-03-05 21:47:34 +03:00
Nekotekina
ebb24375d1 LLVM: handle icelake-client and icelake-server CPU names
Correct AVX / AVX-512 disabling logic
2019-03-01 00:20:04 +03:00
Nekotekina
4292997a01 Added jit_runtime class
Is a memory manager for ASMJIT, replaces asmjit::JitRuntime
Unified memory manager for ASMJIT and LLVM
Unified SPU trampoline generation
Remove previous workarounds
2019-01-29 03:32:16 +03:00
Nekotekina
4f152ad126 SPU: multithread compilation
Allow parallel compilation of SPU code, both at startup and runtime
Remove 'SPU Shared Runtime' option (it became obsolete)
Refactor spu_runtime class (now is common for ASMJIT and LLVM)
Implement SPU ubertrampoline generation in raw assembly (LLVM)
Minor improvement of balanced_wait_until<> and balanced_awaken<>
Make JIT MemoryManager2 shared (global)
Fix wrong assertion in cond_variable
2019-01-22 22:02:02 +03:00
Nekotekina
b2f29cd4d4 LLVM: remove false alarm errors
Writable sections ARE supported
2018-09-27 12:16:43 +03:00
Lassi Hämäläinen
972de4c730 CMake: Fix Linux WITHOUT_LLVM build
- _XABORT_RETRY is defined in immintrin.h which wasn't included
2018-09-19 21:17:01 +03:00
scribam
a745f02a07 cleanup: remove compatibility code for old versions of clang 2018-09-06 13:15:59 +03:00
Nekotekina
ca5158a03e Cleanup semaphore<> (sema.h) and mutex.h (shared_mutex)
Remove semaphore_lock and writer_lock classes, replace with std::lock_guard
Change semaphore<> interface to Lockable (+ exotic try_unlock method)
2018-09-03 23:00:36 +03:00
scribam
b09321354a clang: fix compilation on 3.7 2018-07-15 12:51:09 +04:00
scribam
4babe9076b clang: fix compilation on 3.8 2018-07-15 12:51:09 +04:00
Nekotekina
e4da284176 SPU: analyser v4 and fixes
Build SPU cache after PPU, fix mixing progress
SPU ASMJIT: add support for Giga mode
SPU ASMJIT: use the same spu.log location as SPU LLVM
SPU: improve spu.log disasm
SPU: improve trampolines, unify with SPU ASMJIT
SPU: decode interrupt handler address from BR/BRA at 0x0
SPU LLVM: support Mega/Giga modes
SPU LLVM: implement function chunks
SPU LLVM: use PHI nodes, value visibility across basic blocks
SPU LLVM: implement function chunk table
New simple memory manager for LLVM (bugfix)
2018-06-21 22:29:34 +03:00
Nekotekina
37577714fa SPU LLVM: emulate PSHUFB
For targets without SSSE3 support
2018-05-30 20:35:35 +03:00
Nekotekina
33a1c743a4 Transactions: move loops inside
Rewrite loops in assembler (minor optimization)
2018-05-21 00:18:37 +03:00
Nekotekina
367f039523 Build transactions at runtime
Drop _xbegin family intrinsics due to bad codegen
Implemented `notifier` class, replacing vm::notify
Minor optimization: detach transactions from global mutex on TSX path
Minor optimization: don't acquire vm::passive_lock on PPU on TSX path
2018-05-16 17:31:58 +03:00
Nekotekina
fd525ae1cf Implement build_function_asm
Uses ASMJIT to build function at startup
2018-05-16 15:48:35 +03:00
Nekotekina
a77896c1b6 Update LLVM commit, use small code model 2018-05-13 00:03:08 +03:00
Nekotekina
a975ecdc4f Use LLVM 6 2018-05-08 13:05:29 +03:00
Nekotekina
19944eeed0 Implement SPRX precompilation
Automatically precompile firmware modules
Add "Create LLVM Cache" menu (for games)
Reimplement jit_compiler::cpu as static method
2018-03-22 23:24:58 +03:00
Nekotekina
198e9dce1d Fix #4005 regression
Delay unregister EH frames (Linux)
2018-01-01 10:41:07 +03:00
Nekotekina
d40aaf0391 PPU: use shared jit_compiler instance
(Linux) Fix deregisterEHFrames error message
2017-12-31 22:08:17 +03:00
scribam
42c2df877f Remove std::move on a const variable 2017-12-10 16:48:33 +04:00
scribam
c2ae7ee402 Remove redondant "virtual" keyword when "override" is used 2017-12-10 16:48:33 +04:00
Jan Beich
dd5791a2cc Fixes from FreeBSD package (#3765)
* Thread: unbreak on BSDs after dbc9bdfe02

Utilities/Thread.cpp:1920:2: error: unknown type name 'cpu_set_t'; did you mean 'cpusetid_t'?
        cpu_set_t cs;
        ^~~~~~~~~
        cpusetid_t
/usr/include/sys/types.h:84:22: note: 'cpusetid_t' declared here
typedef __cpusetid_t    cpusetid_t;
                        ^
Utilities/Thread.cpp:1921:2: error: use of undeclared identifier 'CPU_ZERO'
        CPU_ZERO(&cs);
        ^
Utilities/Thread.cpp:1922:2: error: use of undeclared identifier 'CPU_SET'
        CPU_SET(core, &cs);
        ^
Utilities/Thread.cpp:1923:48: error: unknown type name 'cpu_set_t'; did you mean 'cpusetid_t'?
        pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cs);
                                                      ^~~~~~~~~
                                                      cpusetid_t

* JIT: use MAP_32BIT on Linux and FreeBSD

Unless RLIMIT_DATA is low enough FreeBSD by default reserves lower 2Gb
for brk(2) style heap, ignoring mmap(2) address hint requested by RPCS3.
Passing MAP_32BIT fixes the following crash

Assertion failed: ((Type == ELF::R_X86_64_32 && (Value <= UINT32_MAX)) || (Type == ELF::R_X86_64_32S && ((int64_t)Value <= INT32_MAX && (int64_t)Value >= INT32_MIN))), function resolveX86_64Relocation, file /usr/ports/devel/llvm40/work/llvm-4.0.1.src/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp, line 287.

* build: unbreak -DVULKAN_PREBUILT with system glslang on Unix

rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp:4:10: fatal error: '../../../../Vulkan/glslang/SPIRV/GlslangToSpv.h' file not found
 #include "../../../../Vulkan/glslang/SPIRV/GlslangToSpv.h"
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

rpcs3/CMakeFiles/rpcs3.dir/Emu/RSX/VK/VKCommonDecompiler.cpp.o: In function `vk::compile_glsl_to_spv(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, glsl::program_domain, std::__1::vector<unsigned int, std::__1::allocator<unsigned int> >&)':
rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp:(.text+0x50e): undefined reference to `glslang::TProgram::TProgram()'
rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp:(.text+0x51d): undefined reference to `glslang::TShader::TShader(EShLanguage)'
rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp:(.text+0x542): undefined reference to `glslang::TShader::setStrings(char const* const*, int)'
rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp:(.text+0x581): undefined reference to `glslang::TShader::parse(TBuiltInResource const*, int, EProfile, bool, bool, EShMessages, glslang::TShader::Includer&)'
rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp:(.text+0x5d6): undefined reference to `glslang::TProgram::link(EShMessages)'
rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp:(.text+0x5f1): undefined reference to `glslang::GlslangToSpv(glslang::TIntermediate const&, std::__1::vector<unsigned int, std::__1::allocator<unsigned int> >&, glslang::SpvOptions*)'
rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp:(.text+0x5ff): undefined reference to `glslang::TShader::getInfoLog()'
rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp:(.text+0x61a): undefined reference to `glslang::TShader::getInfoDebugLog()'
rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp:(.text+0x630): undefined reference to `glslang::TShader::~TShader()'
rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp:(.text+0x63c): undefined reference to `glslang::TProgram::~TProgram()'
rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp:(.text+0x6d2): undefined reference to `glslang::TShader::~TShader()'
rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp:(.text+0x6de): undefined reference to `glslang::TProgram::~TProgram()'
rpcs3/CMakeFiles/rpcs3.dir/Emu/RSX/VK/VKCommonDecompiler.cpp.o: In function `vk::initialize_compiler_context()':
rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp:(.text+0x6f5): undefined reference to `glslang::InitializeProcess()'
rpcs3/CMakeFiles/rpcs3.dir/Emu/RSX/VK/VKCommonDecompiler.cpp.o: In function `vk::finalize_compiler_context()':
rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp:(.text+0x856): undefined reference to `glslang::FinalizeProcess()'

* build/msvc: add missing glslang include directory after 6bb3f1b4d7

"c:\projects\rpcs3\rpcs3\VKGSRender.vcxproj" (default target) (15) ->
(ClCompile target) ->
  Emu\RSX\VK\VKCommonDecompiler.cpp(4): fatal error C1083: Cannot open include file: 'SPIRV/GlslangToSpv.h': No such file or directory [c:\projects\rpcs3\rpcs3\VKGSRender.vcxproj]
2017-11-21 01:56:25 +04:00
Aurora
7e1c6a5819 Make it build on macOS with Clang 2017-08-08 23:20:07 +03:00
Nekotekina
0fa148e65e Improve CPU feature check
Damn exit on SSSE3 failure
Check AVX for Intel processors
2017-07-20 17:22:09 +03:00
Nekotekina
2ef2f0f63b PPU LLVM: simplify module loading 2017-07-17 16:49:46 +03:00
Nekotekina
3c064439b3 PPU LLVM: new mptr/cptr format 2017-06-29 17:48:55 +03:00
Nekotekina
6561ddae41 PPU LLVM: multithread compilation 2017-06-24 19:12:19 +03:00
Nekotekina
aea094730b PPU LLVM: paradigm shift
For now, compile only one block at time
Use tail calls to move between blocks
Fully write PPU context (except CIA)

This fixes many compatibility problems
2017-06-23 20:09:33 +03:00
Nekotekina
3e6f9faf71 Use LLVM 4.0 2017-03-21 23:32:14 +03:00
Nekotekina
ad72168143 LLVM: load .pdata section 2017-03-21 20:16:41 +03:00
Nekotekina
560d6776af LLVM: generate trampolines
Must fix issues with older CPUs
JIT.cpp refactored to use utils::memory*
2017-03-21 20:16:41 +03:00
Nekotekina
07646c2124 LLVM CPU override option 2017-03-14 16:12:03 +03:00
Nekotekina
1f17109203 __chkstk workaround 2017-03-11 19:49:32 +03:00
Nekotekina
0eb6bf6a67 LLVM: splitting and caching 2017-02-26 20:14:18 +03:00
Nekotekina
bb111d325f memory fix 2017-02-10 23:27:58 +03:00
Ivan
fb56c14853 LLVM fix (skylake) (#2269) 2017-01-21 23:40:37 +03:00
Nekotekina
dafb6b5c92 %p fmt fix 2016-08-15 16:57:51 +03:00
Nekotekina
84d0d396ed EXPECTS usage removed 2016-08-15 16:29:38 +03:00
Nekotekina
0f87c4485d Silly macro removed-2 2016-08-14 18:19:42 +03:00
Nekotekina
912072e60c LLVM: minor fixes (JIT.cpp) 2016-08-10 13:09:11 +03:00
Nekotekina
a7e808b35b EXCEPTION macro removed
fmt::throw_exception<> implemented
::narrow improved
Minor fixes
2016-08-08 19:19:32 +03:00
Nekotekina
44bee7d0ba LLVM: Use small code model
Global variables modified:
__mptr: pointer to memory base addr
__cptr: pointer to function map addr

Use 32 bit pointers in function map
2016-07-25 18:26:02 +03:00
Nekotekina
06c6c8212d Minor fixes
elf_object
Loader fix
Analyser fix
2016-07-11 16:30:11 +03:00