Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit 1ede305

Browse files
committed
m64p mods
1 parent 770ea55 commit 1ede305

File tree

2 files changed

+79
-137
lines changed

2 files changed

+79
-137
lines changed

CMakeLists.txt

Lines changed: 32 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,36 @@ set(CMAKE_CXX_STANDARD 14)
33
set(CMAKE_C_STANDARD 99)
44
project(parallel-rsp LANGUAGES CXX C)
55

6+
7+
set(NAME_PLUGIN_M64P "mupen64plus-rsp-parallel")
8+
9+
include_directories(../mupen64plus-core/src/api)
10+
add_definitions(-DM64P_PLUGIN_API)
11+
add_definitions(-DPARALLEL_INTEGRATION)
12+
13+
# check for INTERPROCEDURAL_OPTIMIZATION support
14+
if((${CMAKE_VERSION} VERSION_EQUAL 3.9) OR (${CMAKE_VERSION} VERSION_GREATER 3.9))
15+
cmake_policy(SET CMP0069 NEW)
16+
17+
include(CheckIPOSupported)
18+
check_ipo_supported(RESULT ENABLE_IPO)
19+
if(ENABLE_IPO)
20+
message("Interprocedural optimizations enabled")
21+
endif(ENABLE_IPO)
22+
endif()
23+
24+
if(ENABLE_IPO AND (CMAKE_BUILD_TYPE STREQUAL "Release"))
25+
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON)
26+
endif()
27+
628
if (CMAKE_COMPILER_IS_GNUCXX OR (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang"))
729
set(PARALLEL_RSP_CXX_FLAGS -Wall -Wextra -Wno-missing-field-initializers -Wno-empty-body -ffast-math -Wno-unused-parameter)
830
elseif (MSVC)
931
set(PARALLEL_RSP_CXX_FLAGS /D_CRT_SECURE_NO_WARNINGS /wd4267 /wd4244 /wd4309 /wd4005 /MP /DNOMINMAX)
1032
endif()
1133

12-
add_library(parallel-rsp STATIC
34+
add_library(${NAME_PLUGIN_M64P} SHARED
35+
parallel.cpp
1336
rsp/vfunctions.cpp
1437
rsp_jit.cpp rsp_jit.hpp
1538
jit_allocator.cpp jit_allocator.hpp
@@ -49,24 +72,15 @@ add_library(parallel-rsp STATIC
4972
arch/simd/rsp/vxor.h
5073
arch/simd/rsp/vmulm.h)
5174

52-
option(PARALLEL_RSP_DEBUG_JIT "Enable the debug JIT." ON)
53-
54-
if (PARALLEL_RSP_DEBUG_JIT)
55-
if (ANDROID)
56-
message("Android does not support debug JIT. Disabling it.")
57-
elseif (NOT WIN32)
58-
target_sources(parallel-rsp PRIVATE debug_rsp.cpp debug_rsp.hpp debug_jit.cpp debug_jit.hpp)
59-
target_compile_definitions(parallel-rsp PUBLIC PARALLEL_RSP_DEBUG_JIT)
60-
endif()
61-
endif()
62-
63-
target_include_directories(parallel-rsp PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
64-
target_include_directories(parallel-rsp PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/arch/simd/rsp)
65-
target_compile_options(parallel-rsp PRIVATE ${PARALLEL_RSP_CXX_FLAGS})
75+
set_target_properties(${NAME_PLUGIN_M64P} PROPERTIES PREFIX "")
76+
target_include_directories(${NAME_PLUGIN_M64P} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
77+
target_include_directories(${NAME_PLUGIN_M64P} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/arch/simd/rsp)
78+
target_include_directories(${NAME_PLUGIN_M64P} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/api)
79+
target_compile_options(${NAME_PLUGIN_M64P} PRIVATE ${PARALLEL_RSP_CXX_FLAGS})
6680

6781
option(PARALLEL_RSP_BAKED_LIGHTNING "Use built-in Lightning." ON)
6882

69-
target_compile_definitions(parallel-rsp PUBLIC PARALLEL_RSP_LIGHTNING)
83+
target_compile_definitions(${NAME_PLUGIN_M64P} PUBLIC PARALLEL_RSP_LIGHTNING)
7084
if (PARALLEL_RSP_BAKED_LIGHTNING)
7185
add_library(lightning STATIC
7286
lightning/lib/jit_disasm.c
@@ -76,127 +90,12 @@ if (PARALLEL_RSP_BAKED_LIGHTNING)
7690
lightning/lib/jit_print.c
7791
lightning/lib/jit_size.c
7892
lightning/lib/lightning.c)
93+
set_property(TARGET lightning PROPERTY POSITION_INDEPENDENT_CODE ON)
7994
target_include_directories(lightning PUBLIC
8095
${CMAKE_CURRENT_SOURCE_DIR}/lightning/include)
8196
if (WIN32)
8297
target_sources(lightning PRIVATE win32/mman/sys/mman.c)
8398
target_include_directories(lightning PRIVATE win32/mman)
8499
endif()
85100
endif()
86-
target_link_libraries(parallel-rsp PUBLIC lightning)
87-
target_compile_definitions(parallel-rsp PUBLIC DEBUG_JIT)
88-
89-
if (NOT WIN32)
90-
target_link_libraries(parallel-rsp PRIVATE dl)
91-
endif()
92-
93-
add_executable(rsp-runner main.cpp)
94-
target_link_libraries(rsp-runner PRIVATE parallel-rsp)
95-
target_compile_options(rsp-runner PRIVATE ${PARALLEL_RSP_CXX_FLAGS})
96-
97-
if (PARALLEL_RSP_DEBUG_JIT AND NOT WIN32)
98-
set_target_properties(rsp-runner PROPERTIES LINK_FLAGS "-rdynamic")
99-
endif()
100-
101-
option(PARALLEL_RSP_TESTS "Enable unit tests for Lightning CPU." ON)
102-
103-
add_executable(rsp-vu-fuzzer rsp_vu_fuzzer.cpp)
104-
target_link_libraries(rsp-vu-fuzzer PRIVATE parallel-rsp)
105-
target_compile_options(rsp-vu-fuzzer PRIVATE ${PARALLEL_RSP_CXX_FLAGS})
106-
107-
if (PARALLEL_RSP_TESTS)
108-
enable_testing()
109-
110-
if (ANDROID)
111-
add_test(NAME rsp-vu-fuzz
112-
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/android_fuzz_runner.sh
113-
${CMAKE_CURRENT_BINARY_DIR}/rsp-vu-fuzzer)
114-
else()
115-
add_test(NAME rsp-vu-fuzz COMMAND $<TARGET_FILE:rsp-vu-fuzzer>)
116-
endif()
117-
add_custom_target(rsp-tests ALL)
118-
119-
add_custom_target(rsp-test-crt
120-
COMMAND ${CMAKE_MAKE_PROGRAM} crt-obj -j1
121-
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/debug-toolchain)
122-
123-
function(rsp_add_test NAME)
124-
add_custom_target(rsp-test-binary-${NAME}
125-
COMMAND ${CMAKE_MAKE_PROGRAM} RSP_TEST=${NAME} -j1
126-
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/debug-toolchain
127-
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/debug-toolchain/${NAME}.s)
128-
add_dependencies(rsp-test-binary-${NAME} rsp-test-crt)
129-
add_dependencies(rsp-tests rsp-test-binary-${NAME})
130-
131-
if (ANDROID)
132-
add_test(NAME rsp-test-${NAME}
133-
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/android_test_runner.sh
134-
${CMAKE_CURRENT_BINARY_DIR}/rsp-runner
135-
${CMAKE_CURRENT_SOURCE_DIR}/debug-toolchain ${NAME})
136-
else()
137-
add_test(NAME rsp-test-${NAME}
138-
COMMAND $<TARGET_FILE:rsp-runner>
139-
${CMAKE_CURRENT_SOURCE_DIR}/debug-toolchain/${NAME}.global.bin
140-
${CMAKE_CURRENT_SOURCE_DIR}/debug-toolchain/${NAME}.bin)
141-
endif()
142-
endfunction()
143-
144-
rsp_add_test(sll)
145-
rsp_add_test(srl)
146-
rsp_add_test(sra)
147-
rsp_add_test(sllv)
148-
rsp_add_test(srlv)
149-
rsp_add_test(srav)
150-
rsp_add_test(add)
151-
rsp_add_test(sub)
152-
rsp_add_test(or)
153-
rsp_add_test(and)
154-
rsp_add_test(xor)
155-
rsp_add_test(nor)
156-
rsp_add_test(slt)
157-
rsp_add_test(sltu)
158-
rsp_add_test(addi)
159-
rsp_add_test(slti)
160-
rsp_add_test(sltiu)
161-
rsp_add_test(andi)
162-
rsp_add_test(ori)
163-
rsp_add_test(xori)
164-
rsp_add_test(lui)
165-
rsp_add_test(lb)
166-
rsp_add_test(lbu)
167-
rsp_add_test(lh)
168-
rsp_add_test(lhu)
169-
rsp_add_test(lh-unaligned)
170-
rsp_add_test(lhu-unaligned)
171-
rsp_add_test(lw)
172-
rsp_add_test(lw-unaligned)
173-
rsp_add_test(sb)
174-
rsp_add_test(sh)
175-
rsp_add_test(sw)
176-
rsp_add_test(sh-unaligned)
177-
rsp_add_test(sw-unaligned)
178-
rsp_add_test(beq-impossible-delay-slot-second-taken)
179-
rsp_add_test(beq-impossible-delay-slot-first-taken)
180-
#rsp_add_test(beq-impossible-delay-slot-both-taken) Hangs the reference implementation :D
181-
rsp_add_test(bne)
182-
rsp_add_test(blez)
183-
rsp_add_test(bltz)
184-
rsp_add_test(bltzal)
185-
rsp_add_test(bgtz)
186-
rsp_add_test(bgezal)
187-
rsp_add_test(j)
188-
rsp_add_test(jal)
189-
rsp_add_test(jr)
190-
rsp_add_test(jalr)
191-
rsp_add_test(lw-unaligned-in-branch-delay)
192-
rsp_add_test(delay-slot-before-break)
193-
rsp_add_test(delay-slot-before-new-block)
194-
rsp_add_test(delay-slot-before-new-block-illegal)
195-
rsp_add_test(delay-slot-before-new-block-not-taken)
196-
rsp_add_test(unconditional-delay-slot-before-break)
197-
rsp_add_test(cop0)
198-
rsp_add_test(cop2-basic)
199-
rsp_add_test(cop2-ls)
200-
rsp_add_test(cop2-vector)
201-
rsp_add_test(bug-shl-into-branch)
202-
endif()
101+
target_link_libraries(${NAME_PLUGIN_M64P} PUBLIC lightning)

parallel.cpp

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,37 @@
44
#include "rsp_jit.hpp"
55
#endif
66
#include <stdint.h>
7+
#include <cstdarg>
78

89
#include "m64p_plugin.h"
910
#include "rsp_1.1.h"
1011

1112
#define RSP_PARALLEL_VERSION 0x0101
1213
#define RSP_PLUGIN_API_VERSION 0x020000
1314

15+
static void (*l_DebugCallback)(void *, int, const char *) = NULL;
16+
static void *l_DebugCallContext = NULL;
17+
18+
19+
#define ATTR_FMT(fmtpos, attrpos) __attribute__ ((format (printf, fmtpos, attrpos)))
20+
static void DebugMessage(int level, const char *message, ...) ATTR_FMT(2, 3);
21+
22+
void DebugMessage(int level, const char *message, ...)
23+
{
24+
char msgbuf[1024];
25+
va_list args;
26+
27+
if (l_DebugCallback == NULL)
28+
return;
29+
30+
va_start(args, message);
31+
vsprintf(msgbuf, message, args);
32+
33+
(*l_DebugCallback)(l_DebugCallContext, level, msgbuf);
34+
35+
va_end(args);
36+
}
37+
1438
namespace RSP
1539
{
1640
RSP_INFO rsp;
@@ -50,7 +74,7 @@ extern "C"
5074
}
5175
#endif
5276

53-
EXPORT unsigned int CALL parallelRSPDoRspCycles(unsigned int cycles)
77+
EXPORT unsigned int CALL DoRspCycles(unsigned int cycles)
5478
{
5579
if (*RSP::rsp.SP_STATUS_REG & (SP_STATUS_HALT | SP_STATUS_BROKE))
5680
return 0;
@@ -95,7 +119,7 @@ extern "C"
95119
return cycles;
96120
}
97121

98-
EXPORT m64p_error CALL parallelRSPPluginGetVersion(m64p_plugin_type *PluginType, int *PluginVersion,
122+
EXPORT m64p_error CALL PluginGetVersion(m64p_plugin_type *PluginType, int *PluginVersion,
99123
int *APIVersion, const char **PluginNamePtr, int *Capabilities)
100124
{
101125
/* set version info */
@@ -114,12 +138,12 @@ extern "C"
114138
return M64ERR_SUCCESS;
115139
}
116140

117-
EXPORT void CALL parallelRSPRomClosed(void)
141+
EXPORT void CALL RomClosed(void)
118142
{
119143
*RSP::rsp.SP_PC_REG = 0x00000000;
120144
}
121145

122-
EXPORT void CALL parallelRSPInitiateRSP(RSP_INFO Rsp_Info, unsigned int *CycleCount)
146+
EXPORT void CALL InitiateRSP(RSP_INFO Rsp_Info, unsigned int *CycleCount)
123147
{
124148
if (CycleCount)
125149
*CycleCount = 0;
@@ -158,4 +182,23 @@ extern "C"
158182
RSP::cpu.set_imem(reinterpret_cast<uint32_t *>(Rsp_Info.IMEM));
159183
RSP::cpu.set_rdram(reinterpret_cast<uint32_t *>(Rsp_Info.RDRAM));
160184
}
185+
186+
EXPORT m64p_error CALL PluginStartup(m64p_dynlib_handle CoreLibHandle, void *Context,
187+
void (*DebugCallback)(void *, int, const char *))
188+
{
189+
/* first thing is to set the callback function for debug info */
190+
l_DebugCallback = DebugCallback;
191+
l_DebugCallContext = Context;
192+
return M64ERR_SUCCESS;
193+
}
194+
195+
EXPORT m64p_error CALL PluginShutdown(void)
196+
{
197+
return M64ERR_SUCCESS;
198+
}
199+
200+
EXPORT int CALL RomOpen(void)
201+
{
202+
return 1;
203+
}
161204
}

0 commit comments

Comments
 (0)