ARM: Prevent register check code from being inlined
Vicki Pfau vi@endrift.com
Thu, 15 Feb 2018 22:15:45 -0800
2 files changed,
25 insertions(+),
11 deletions(-)
M
include/mgba-util/common.h
→
include/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.c
→
src/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) \