Skip to content

Commit 4650dc6

Browse files
Linux support. (#3)
* Compiling and running on Linux. * Fix xpointer constructor. * Convert dependencies to submodules. * Fix wchar_t usage for Linux.
1 parent 45c00cf commit 4650dc6

19 files changed

Lines changed: 293 additions & 199 deletions

File tree

.gitmodules

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[submodule "thirdparty/xxHash"]
2+
path = thirdparty/xxHash
3+
url = https://github.com/Cyan4973/xxHash.git
4+
[submodule "thirdparty/fmt"]
5+
path = thirdparty/fmt
6+
url = https://github.com/fmtlib/fmt.git
7+
[submodule "thirdparty/tomlplusplus"]
8+
path = thirdparty/tomlplusplus
9+
url = https://github.com/marzer/tomlplusplus.git

CMakeLists.txt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
cmake_minimum_required (VERSION 3.20)
22

3-
include($ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake)
43
set(THIRDPARTY_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty)
54

65
set(CMAKE_CXX_STANDARD 17)
@@ -16,10 +15,10 @@ set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
1615

1716
include("cmake/bin2h.cmake")
1817

19-
add_subdirectory(${THIRDPARTY_ROOT}/disasm)
18+
add_subdirectory(${THIRDPARTY_ROOT})
2019
set(POWERANALYSE_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/PowerAnalyse)
21-
set(POWERRECOMP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/PowerRecomp)
2220
set(POWERUTILS_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/PowerUtils)
21+
set(POWERRECOMP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/PowerRecomp)
2322

2423
project ("PowerRecomp-ALL")
2524

PowerAnalyse/CMakeLists.txt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22

33
project("PowerAnalyse")
44

5-
add_executable(PowerAnalyse "main.cpp" "function.h" "function.cpp")
6-
add_library(LibPowerAnalyse "function.h" "function.cpp")
5+
add_executable(PowerAnalyse
6+
"main.cpp"
7+
"function.cpp")
78

8-
find_package(fmt CONFIG REQUIRED)
9+
target_link_libraries(PowerAnalyse PRIVATE PowerUtils fmt::fmt)
910

10-
target_include_directories(LibPowerAnalyse PUBLIC .)
11+
add_library(LibPowerAnalyse "function.cpp")
12+
target_include_directories(LibPowerAnalyse PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
1113
target_link_libraries(LibPowerAnalyse PUBLIC PowerUtils)
1214

13-
target_link_libraries(PowerAnalyse PRIVATE PowerUtils fmt::fmt)

PowerAnalyse/function.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#pragma once
2+
3+
#include <cstddef>
24
#include <vector>
35

46
#ifdef _DEBUG

PowerAnalyse/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ int main()
364364

365365
if (f.base == 0x82BD7420)
366366
{
367-
__debugbreak();
367+
__builtin_debugtrap();
368368
}
369369

370370
image.symbols.emplace(fmt::format("sub_{:X}", f.base), f.base, f.size, Symbol_Function);

PowerRecomp/CMakeLists.txt

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,29 @@ cmake_minimum_required (VERSION 3.8)
22

33
project("PowerRecomp")
44

5-
BIN2H(SOURCE_FILE ${POWERUTILS_ROOT}/ppc_context.h HEADER_FILE "generated/ppc_context.gen.h" ARRAY_TYPE "char" VARIABLE_NAME "g_PPCContextText")
5+
BIN2H(SOURCE_FILE
6+
${POWERUTILS_ROOT}/ppc_context.h
7+
HEADER_FILE "generated/ppc_context.gen.h"
8+
ARRAY_TYPE "char"
9+
VARIABLE_NAME "g_PPCContextText")
610

7-
add_executable(PowerRecomp "main.cpp" "pch.h" "recompiler.cpp" "recompiler.h" "test_recompiler.cpp" "test_recompiler.h" "recompiler_config.h" "recompiler_config.cpp")
8-
target_precompile_headers(PowerRecomp PUBLIC "pch.h")
11+
add_executable(PowerRecomp
12+
"main.cpp"
13+
"recompiler.cpp"
14+
"test_recompiler.cpp"
15+
"recompiler_config.cpp")
916

10-
find_package(fmt CONFIG REQUIRED)
11-
find_package(PkgConfig REQUIRED)
12-
pkg_check_modules(tomlplusplus REQUIRED IMPORTED_TARGET tomlplusplus)
13-
find_package(xxHash CONFIG REQUIRED)
17+
target_precompile_headers(PowerRecomp PUBLIC "pch.h")
1418

15-
target_link_libraries(PowerRecomp PRIVATE LibPowerAnalyse fmt::fmt PkgConfig::tomlplusplus xxHash::xxhash)
19+
target_link_libraries(PowerRecomp PRIVATE
20+
LibPowerAnalyse
21+
PowerUtils
22+
fmt::fmt
23+
tomlplusplus::tomlplusplus
24+
xxHash::xxhash)
1625

1726
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
18-
target_compile_options(PowerRecomp PRIVATE -Wno-switch -Wno-unused-variable)
27+
target_compile_options(PowerRecomp PRIVATE -Wno-switch -Wno-unused-variable -Wno-null-arithmetic)
1928
endif()
2029

2130
target_compile_definitions(PowerRecomp PRIVATE _CRT_SECURE_NO_WARNINGS)

PowerRecomp/pch.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#pragma once
22

3+
#include <algorithm>
34
#include <cassert>
5+
#include <cstddef>
46
#include <charconv>
57
#include <disasm.h>
68
#include <file.h>
@@ -14,4 +16,5 @@
1416
#include <xbox.h>
1517
#include <xxhash.h>
1618
#include <fmt/core.h>
19+
#include <xmmintrin.h>
1720
#include "generated/ppc_context.gen.h"

PowerRecomp/recompiler.cpp

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,7 @@ bool Recompiler::Recompile(
607607
break;
608608

609609
case PPC_INST_BLRL:
610-
println("__debugbreak();");
610+
println("__builtin_debugtrap();");
611611
break;
612612

613613
case PPC_INST_BLT:
@@ -688,7 +688,7 @@ bool Recompiler::Recompile(
688688
break;
689689

690690
case PPC_INST_CNTLZW:
691-
println("\t{}.u64 = __lzcnt({}.u32);", r(insn.operands[0]), r(insn.operands[1]));
691+
println("\t{}.u64 = __lzcnt32({}.u32);", r(insn.operands[0]), r(insn.operands[1]));
692692
break;
693693

694694
case PPC_INST_DB16CYC:
@@ -1263,43 +1263,43 @@ bool Recompiler::Recompile(
12631263
break;
12641264

12651265
case PPC_INST_RLDICL:
1266-
println("\t{}.u64 = _rotl64({}.u64, {}) & 0x{:X};", r(insn.operands[0]), r(insn.operands[1]), insn.operands[2], ComputeMask(insn.operands[3], 63));
1266+
println("\t{}.u64 = __builtin_rotateleft64({}.u64, {}) & 0x{:X};", r(insn.operands[0]), r(insn.operands[1]), insn.operands[2], ComputeMask(insn.operands[3], 63));
12671267
break;
12681268

12691269
case PPC_INST_RLDICR:
1270-
println("\t{}.u64 = _rotl64({}.u64, {}) & 0x{:X};", r(insn.operands[0]), r(insn.operands[1]), insn.operands[2], ComputeMask(0, insn.operands[3]));
1270+
println("\t{}.u64 = __builtin_rotateleft64({}.u64, {}) & 0x{:X};", r(insn.operands[0]), r(insn.operands[1]), insn.operands[2], ComputeMask(0, insn.operands[3]));
12711271
break;
12721272

12731273
case PPC_INST_RLDIMI:
12741274
{
12751275
const uint64_t mask = ComputeMask(insn.operands[3], ~insn.operands[2]);
1276-
println("\t{}.u64 = (_rotl64({}.u64, {}) & 0x{:X}) | ({}.u64 & 0x{:X});", r(insn.operands[0]), r(insn.operands[1]), insn.operands[2], mask, r(insn.operands[0]), ~mask);
1276+
println("\t{}.u64 = (__builtin_rotateleft64({}.u64, {}) & 0x{:X}) | ({}.u64 & 0x{:X});", r(insn.operands[0]), r(insn.operands[1]), insn.operands[2], mask, r(insn.operands[0]), ~mask);
12771277
break;
12781278
}
12791279

12801280
case PPC_INST_RLWIMI:
12811281
{
12821282
const uint64_t mask = ComputeMask(insn.operands[3] + 32, insn.operands[4] + 32);
1283-
println("\t{}.u64 = (_rotl({}.u32, {}) & 0x{:X}) | ({}.u64 & 0x{:X});", r(insn.operands[0]), r(insn.operands[1]), insn.operands[2], mask, r(insn.operands[0]), ~mask);
1283+
println("\t{}.u64 = (__builtin_rotateleft32({}.u32, {}) & 0x{:X}) | ({}.u64 & 0x{:X});", r(insn.operands[0]), r(insn.operands[1]), insn.operands[2], mask, r(insn.operands[0]), ~mask);
12841284
break;
12851285
}
12861286

12871287
case PPC_INST_RLWINM:
1288-
println("\t{}.u64 = _rotl64({}.u32 | ({}.u64 << 32), {}) & 0x{:X};", r(insn.operands[0]), r(insn.operands[1]), r(insn.operands[1]), insn.operands[2], ComputeMask(insn.operands[3] + 32, insn.operands[4] + 32));
1288+
println("\t{}.u64 = __builtin_rotateleft64({}.u32 | ({}.u64 << 32), {}) & 0x{:X};", r(insn.operands[0]), r(insn.operands[1]), r(insn.operands[1]), insn.operands[2], ComputeMask(insn.operands[3] + 32, insn.operands[4] + 32));
12891289
if (strchr(insn.opcode->name, '.'))
12901290
println("\t{}.compare<int32_t>({}.s32, 0, {});", cr(0), r(insn.operands[0]), xer());
12911291
break;
12921292

12931293
case PPC_INST_ROTLDI:
1294-
println("\t{}.u64 = _rotl64({}.u64, {});", r(insn.operands[0]), r(insn.operands[1]), insn.operands[2]);
1294+
println("\t{}.u64 = __builtin_rotateleft64({}.u64, {});", r(insn.operands[0]), r(insn.operands[1]), insn.operands[2]);
12951295
break;
12961296

12971297
case PPC_INST_ROTLW:
1298-
println("\t{}.u64 = _rotl({}.u32, {}.u8 & 0x1F);", r(insn.operands[0]), r(insn.operands[1]), r(insn.operands[2]));
1298+
println("\t{}.u64 = __builtin_rotateleft32({}.u32, {}.u8 & 0x1F);", r(insn.operands[0]), r(insn.operands[1]), r(insn.operands[2]));
12991299
break;
13001300

13011301
case PPC_INST_ROTLWI:
1302-
println("\t{}.u64 = _rotl({}.u32, {});", r(insn.operands[0]), r(insn.operands[1]), insn.operands[2]);
1302+
println("\t{}.u64 = __builtin_rotateleft32({}.u32, {});", r(insn.operands[0]), r(insn.operands[1]), insn.operands[2]);
13031303
if (strchr(insn.opcode->name, '.'))
13041304
println("\t{}.compare<int32_t>({}.s32, 0, {});", cr(0), r(insn.operands[0]), xer());
13051305
break;
@@ -1398,10 +1398,10 @@ bool Recompiler::Recompile(
13981398
case PPC_INST_STDCX:
13991399
println("\t{}.lt = 0;", cr(0));
14001400
println("\t{}.gt = 0;", cr(0));
1401-
print("\t{}.eq = _InterlockedCompareExchange64(reinterpret_cast<__int64*>(base + ", cr(0));
1401+
print("\t{}.eq = __sync_bool_compare_and_swap(reinterpret_cast<uint64_t*>(base + ", cr(0));
14021402
if (insn.operands[1] != 0)
14031403
print("{}.u32 + ", r(insn.operands[1]));
1404-
println("{}.u32), __builtin_bswap64({}.s64), {}.s64) == {}.s64;", r(insn.operands[2]), r(insn.operands[0]), reserved(), reserved());
1404+
println("{}.u32), {}.s64, __builtin_bswap64({}.s64));", r(insn.operands[2]), reserved(), r(insn.operands[0]));
14051405
println("\t{}.so = {}.so;", cr(0), xer());
14061406
break;
14071407

@@ -1553,10 +1553,10 @@ bool Recompiler::Recompile(
15531553
case PPC_INST_STWCX:
15541554
println("\t{}.lt = 0;", cr(0));
15551555
println("\t{}.gt = 0;", cr(0));
1556-
print("\t{}.eq = _InterlockedCompareExchange(reinterpret_cast<long*>(base + ", cr(0));
1556+
print("\t{}.eq = __sync_bool_compare_and_swap(reinterpret_cast<uint32_t*>(base + ", cr(0));
15571557
if (insn.operands[1] != 0)
15581558
print("{}.u32 + ", r(insn.operands[1]));
1559-
println("{}.u32), __builtin_bswap32({}.s32), {}.s32) == {}.s32;", r(insn.operands[2]), r(insn.operands[0]), reserved(), reserved());
1559+
println("{}.u32), {}.s32, __builtin_bswap32({}.s32));", r(insn.operands[2]), reserved(), r(insn.operands[0]));
15601560
println("\t{}.so = {}.so;", cr(0), xer());
15611561
break;
15621562

@@ -1726,7 +1726,7 @@ bool Recompiler::Recompile(
17261726

17271727
case PPC_INST_VCMPBFP:
17281728
case PPC_INST_VCMPBFP128:
1729-
println("\t__debugbreak();");
1729+
println("\t__builtin_debugtrap();");
17301730
break;
17311731

17321732
case PPC_INST_VCMPEQFP:
@@ -1910,7 +1910,7 @@ bool Recompiler::Recompile(
19101910
break;
19111911

19121912
default:
1913-
println("\t__debugbreak();");
1913+
println("\t__builtin_debugtrap();");
19141914
break;
19151915
}
19161916
break;
@@ -2086,7 +2086,7 @@ bool Recompiler::Recompile(
20862086
break;
20872087

20882088
default:
2089-
println("\t__debugbreak();");
2089+
println("\t__builtin_debugtrap();");
20902090
break;
20912091
}
20922092
break;

PowerUtils/image.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "elf.h"
33
#include "xex.h"
44
#include <cassert>
5+
#include <cstring>
56

67
void Image::Map(const std::string_view& name, size_t base, uint32_t size, uint8_t flags, uint8_t* data)
78
{

PowerUtils/ppc_context.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,22 @@
55
#error "ppc_config.h must be included before ppc_context.h"
66
#endif
77

8+
#include <climits>
89
#include <cmath>
910
#include <csetjmp>
1011
#include <cstdint>
1112
#include <cstdlib>
1213
#include <cstring>
1314

14-
#include <intrin.h>
1515
#include <x86intrin.h>
1616

17+
#ifdef _WIN32
18+
#include <intrin.h>
19+
#else
20+
#include <xmmintrin.h>
21+
#include <smmintrin.h>
22+
#endif
23+
1724
#define PPC_JOIN(x, y) x##y
1825
#define PPC_XSTRINGIFY(x) #x
1926
#define PPC_STRINGIFY(x) PPC_XSTRINGIFY(x)

0 commit comments

Comments
 (0)