all repos — mgba @ 73010a4121c978fb96a162380cee77995def0d22

mGBA Game Boy Advance Emulator

ARM: Prevent register check code from being inlined
Vicki Pfau vi@endrift.com
Thu, 15 Feb 2018 22:15:45 -0800
commit

73010a4121c978fb96a162380cee77995def0d22

parent

a31e13f2d862c8119cbea9fe4b41f0f0403e1949

2 files changed, 25 insertions(+), 11 deletions(-)

jump to
M include/mgba-util/common.hinclude/mgba-util/common.h

@@ -191,9 +191,11 @@

#ifdef _MSC_VER #define ATTRIBUTE_UNUSED #define ATTRIBUTE_FORMAT(X, Y, Z) +#define ATTRIBUTE_NOINLINE #else #define ATTRIBUTE_UNUSED __attribute__((unused)) #define ATTRIBUTE_FORMAT(X, Y, Z) __attribute__((format(X, Y, Z))) +#define ATTRIBUTE_NOINLINE __attribute__((noinline)) #endif #define DECL_BITFIELD(NAME, TYPE) typedef TYPE NAME
M src/arm/isa-arm.csrc/arm/isa-arm.c

@@ -184,15 +184,32 @@

// Instruction definitions // Beware pre-processor antics +ATTRIBUTE_NOINLINE static void _additionS(struct ARMCore* cpu, int32_t m, int32_t n, int32_t d) { + cpu->cpsr.n = ARM_SIGN(d); + cpu->cpsr.z = !d; + cpu->cpsr.c = ARM_CARRY_FROM(m, n, d); + cpu->cpsr.v = ARM_V_ADDITION(m, n, d); +} + +ATTRIBUTE_NOINLINE static void _subtractionS(struct ARMCore* cpu, int32_t m, int32_t n, int32_t d) { + cpu->cpsr.n = ARM_SIGN(d); + cpu->cpsr.z = !d; + cpu->cpsr.c = ARM_BORROW_FROM(m, n, d); + cpu->cpsr.v = ARM_V_SUBTRACTION(m, n, d); +} + +ATTRIBUTE_NOINLINE static void _neutralS(struct ARMCore* cpu, int32_t d) { + cpu->cpsr.n = ARM_SIGN(d); + cpu->cpsr.z = !d; \ + cpu->cpsr.c = cpu->shifterCarryOut; \ +} + #define ARM_ADDITION_S(M, N, D) \ if (rd == ARM_PC && _ARMModeHasSPSR(cpu->cpsr.priv)) { \ cpu->cpsr = cpu->spsr; \ _ARMReadCPSR(cpu); \ } else { \ - cpu->cpsr.n = ARM_SIGN(D); \ - cpu->cpsr.z = !(D); \ - cpu->cpsr.c = ARM_CARRY_FROM(M, N, D); \ - cpu->cpsr.v = ARM_V_ADDITION(M, N, D); \ + _additionS(cpu, M, N, D); \ } #define ARM_SUBTRACTION_S(M, N, D) \

@@ -200,10 +217,7 @@ if (rd == ARM_PC && _ARMModeHasSPSR(cpu->cpsr.priv)) { \

cpu->cpsr = cpu->spsr; \ _ARMReadCPSR(cpu); \ } else { \ - cpu->cpsr.n = ARM_SIGN(D); \ - cpu->cpsr.z = !(D); \ - cpu->cpsr.c = ARM_BORROW_FROM(M, N, D); \ - cpu->cpsr.v = ARM_V_SUBTRACTION(M, N, D); \ + _subtractionS(cpu, M, N, D); \ } #define ARM_SUBTRACTION_CARRY_S(M, N, D, C) \

@@ -222,9 +236,7 @@ if (rd == ARM_PC && _ARMModeHasSPSR(cpu->cpsr.priv)) { \

cpu->cpsr = cpu->spsr; \ _ARMReadCPSR(cpu); \ } else { \ - cpu->cpsr.n = ARM_SIGN(D); \ - cpu->cpsr.z = !(D); \ - cpu->cpsr.c = cpu->shifterCarryOut; \ + _neutralS(cpu, D); \ } #define ARM_NEUTRAL_HI_S(DLO, DHI) \