From 98bb3ae46e2e6a4da0c039fbf4e1d28b3fdd1de8 Mon Sep 17 00:00:00 2001 From: Timothy Beyer Date: Mon, 27 Jun 2022 15:08:18 +0800 Subject: emulators/libretro-reicast: Fix 32-bit / i386 build PR: 264216 --- emulators/libretro-reicast/Makefile | 7 +- ...patch-libswirl_hw_arm7_arm7__jit__virt__x86.cpp | 109 +++++++++++++++++++++ 2 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 emulators/libretro-reicast/files/patch-libswirl_hw_arm7_arm7__jit__virt__x86.cpp 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 ++ ++#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 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 +@@ -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 -- cgit v1.2.3