aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimothy Beyer <beyert@cs.ucr.edu>2022-06-27 07:08:18 +0000
committerLi-Wen Hsu <lwhsu@FreeBSD.org>2022-06-27 07:08:18 +0000
commit98bb3ae46e2e6a4da0c039fbf4e1d28b3fdd1de8 (patch)
treec26b1b589913445287817454d3c9889b715997da
parenta0109b55f2f188328d77c6a375a77c26ee0aa4d2 (diff)
downloadports-98bb3ae46e2e6a4da0c039fbf4e1d28b3fdd1de8.tar.gz
ports-98bb3ae46e2e6a4da0c039fbf4e1d28b3fdd1de8.zip
emulators/libretro-reicast: Fix 32-bit / i386 build
PR: 264216
-rw-r--r--emulators/libretro-reicast/Makefile7
-rw-r--r--emulators/libretro-reicast/files/patch-libswirl_hw_arm7_arm7__jit__virt__x86.cpp109
2 files changed, 113 insertions, 3 deletions
diff --git a/emulators/libretro-reicast/Makefile b/emulators/libretro-reicast/Makefile
index a5e090211451..10e8667810ed 100644
--- a/emulators/libretro-reicast/Makefile
+++ b/emulators/libretro-reicast/Makefile
@@ -2,6 +2,7 @@
PORTNAME= libretro-reicast
PORTVERSION= 0.20201231
+PORTREVISION= 1
CATEGORIES= emulators games
MAINTAINER= beyert@cs.ucr.edu
@@ -18,7 +19,7 @@ LIB_DEPENDS= libao.so:audio/libao \
libpulse.so:audio/pulseaudio \
libudev.so:devel/libudev-devd
-USES= cmake compiler gl xorg
+USES= cmake compiler gl xorg
USE_GCC= yes
USE_LDCONFIG= yes
@@ -34,12 +35,12 @@ GH_ACCOUNT= reicast
GH_PROJECT= reicast-emulator
GH_TAGNAME= 0bd6ea3
-USE_GL= egl gbm gl
+USE_GL= egl gbm gl
PLIST_FILES= lib/libretro/reicast_libretro.so
do-install:
- ${MKDIR} ${STAGEDIR}/${PREFIX}/lib/libretro;
+ @${MKDIR} ${STAGEDIR}/${PREFIX}/lib/libretro;
${INSTALL_LIB} ${WRKDIR}/.build/libreicast.so \
${STAGEDIR}/${PREFIX}/lib/libretro/reicast_libretro.so;
diff --git a/emulators/libretro-reicast/files/patch-libswirl_hw_arm7_arm7__jit__virt__x86.cpp b/emulators/libretro-reicast/files/patch-libswirl_hw_arm7_arm7__jit__virt__x86.cpp
new file mode 100644
index 000000000000..f2c04dd29ffa
--- /dev/null
+++ b/emulators/libretro-reicast/files/patch-libswirl_hw_arm7_arm7__jit__virt__x86.cpp
@@ -0,0 +1,109 @@
+--- libswirl/hw/arm7/arm7_jit_virt_x86.cpp.orig 2020-10-18 11:22:48 UTC
++++ libswirl/hw/arm7/arm7_jit_virt_x86.cpp
+@@ -13,6 +13,99 @@
+
+ #if HOST_OS == OS_LINUX || HOST_OS == OS_DARWIN
+ #include <sys/mman.h>
++
++#define DP_R_ROFC (OP_READ_FLAGS_S|OP_READ_REG_1) //Reads reg1, op2, flags if S
++#define DP_R_ROF (OP_READ_FLAGS|OP_READ_REG_1) //Reads reg1, op2, flags (ADC & co)
++#define DP_R_OFC (OP_READ_FLAGS_S) //Reads op2, flags if S
++
++#define DP_W_RFC (OP_WRITE_FLAGS_S|OP_WRITE_REG) //Writes reg, and flags if S
++#define DP_W_F (OP_WRITE_FLAGS) //Writes only flags, always (S=1)
++
++struct ArmDPOP {
++ u32 key;
++ u32 mask;
++ u32 flags;
++};
++
++vector<ArmDPOP> ops;
++
++void AddDPOP(u32 subcd, u32 rflags, u32 wflags) {
++ ArmDPOP op;
++
++ u32 key = subcd << 21;
++ u32 mask = (15 << 21) | (7 << 25);
++
++ op.flags = rflags | wflags;
++
++ if (wflags == DP_W_F) {
++ //also match S bit for opcodes that must write to flags (CMP & co)
++ mask |= 1 << 20;
++ key |= 1 << 20;
++ }
++
++ //ISR form (bit 25=0, bit 4 = 0)
++ op.key = key;
++ op.mask = mask | (1 << 4);
++ ops.push_back(op);
++
++ //RSR form (bit 25=0, bit 4 = 1, bit 7=0)
++ op.key = key | (1 << 4);
++ op.mask = mask | (1 << 4) | (1 << 7);
++ ops.push_back(op);
++
++ //imm8r4 form (bit 25=1)
++ op.key = key | (1 << 25);
++ op.mask = mask;
++ ops.push_back(op);
++}
++
++void InitHash() {
++ /*
++ COND | 00 I OP1 S Rn Rd OPER2 -- Data opcode, PSR xfer
++ Data processing opcodes
++ */
++
++ //AND 0000 Rn, OPER2, {Flags} Rd, {Flags}
++ //EOR 0001 Rn, OPER2, {Flags} Rd, {Flags}
++ //SUB 0010 Rn, OPER2, {Flags} Rd, {Flags}
++ //RSB 0011 Rn, OPER2, {Flags} Rd, {Flags}
++ //ADD 0100 Rn, OPER2, {Flags} Rd, {Flags}
++ //ORR 1100 Rn, OPER2, {Flags} Rd, {Flags}
++ //BIC 1110 Rn, OPER2, {Flags} Rd, {Flags}
++ AddDPOP(0, DP_R_ROFC, DP_W_RFC);
++ AddDPOP(1, DP_R_ROFC, DP_W_RFC);
++ AddDPOP(2, DP_R_ROFC, DP_W_RFC);
++ AddDPOP(3, DP_R_ROFC, DP_W_RFC);
++ AddDPOP(4, DP_R_ROFC, DP_W_RFC);
++ AddDPOP(12, DP_R_ROFC, DP_W_RFC);
++ AddDPOP(14, DP_R_ROFC, DP_W_RFC);
++
++ //ADC 0101 Rn, OPER2, Flags Rd, {Flags}
++ //SBC 0110 Rn, OPER2, Flags Rd, {Flags}
++ //RSC 0111 Rn, OPER2, Flags Rd, {Flags}
++ AddDPOP(5, DP_R_ROF, DP_W_RFC);
++ AddDPOP(6, DP_R_ROF, DP_W_RFC);
++ AddDPOP(7, DP_R_ROF, DP_W_RFC);
++
++ //TST 1000 S=1 Rn, OPER2, Flags Flags
++ //TEQ 1001 S=1 Rn, OPER2, Flags Flags
++ AddDPOP(8, DP_R_ROF, DP_W_F);
++ AddDPOP(9, DP_R_ROF, DP_W_F);
++
++ //CMP 1010 S=1 Rn, OPER2 Flags
++ //CMN 1011 S=1 Rn, OPER2 Flags
++ AddDPOP(10, DP_R_ROF, DP_W_F);
++ AddDPOP(11, DP_R_ROF, DP_W_F);
++
++ //MOV 1101 OPER2, {Flags} Rd, {Flags}
++ //MVN 1111 OPER2, {Flags} Rd, {Flags}
++ AddDPOP(13, DP_R_OFC, DP_W_RFC);
++ AddDPOP(15, DP_R_OFC, DP_W_RFC);
++}
++
++void armt_init() {
++ InitHash();
++}
+ #endif
+ #if HOST_OS == OS_WINDOWS
+ #include <Windows.h>
+@@ -455,4 +548,4 @@ struct Arm7VirtBackendX86 : Arm7VirtBackend {
+ Arm7VirtBackend* Arm7VirtBackend::Create(ARM7Backend* arm, Arm7Context* ctx) {
+ return new Arm7VirtBackendX86(arm, ctx);
+ }
+-#endif
+\ No newline at end of file
++#endif