From bf8c1d1b4b52d45cd84590dc7bd7d40b0dffc7bd Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 31 Mar 2019 11:59:18 -0700 Subject: [PATCH] ARM: Remove need for CPSR load in some flag calculations --- include/mgba/internal/arm/arm.h | 14 ++++++++++++++ src/arm/isa-arm.c | 2 ++ src/arm/isa-thumb.c | 2 ++ 3 files changed, 18 insertions(+) diff --git a/include/mgba/internal/arm/arm.h b/include/mgba/internal/arm/arm.h index 7bc1328bf..55e847c7f 100644 --- a/include/mgba/internal/arm/arm.h +++ b/include/mgba/internal/arm/arm.h @@ -93,6 +93,20 @@ union PSR { #endif }; + struct { +#if defined(__BIG_ENDIAN__) + uint8_t flags; + uint8_t status; + uint8_t extension; + uint8_t control; +#else + uint8_t control; + uint8_t extension; + uint8_t status; + uint8_t flags; +#endif + }; + int32_t packed; }; diff --git a/src/arm/isa-arm.c b/src/arm/isa-arm.c index 901174b75..ae8d61820 100644 --- a/src/arm/isa-arm.c +++ b/src/arm/isa-arm.c @@ -185,6 +185,7 @@ static inline void _immediate(struct ARMCore* cpu, uint32_t opcode) { // Beware pre-processor antics ATTRIBUTE_NOINLINE static void _additionS(struct ARMCore* cpu, int32_t m, int32_t n, int32_t d) { + cpu->cpsr.flags = 0; cpu->cpsr.n = ARM_SIGN(d); cpu->cpsr.z = !d; cpu->cpsr.c = ARM_CARRY_FROM(m, n, d); @@ -192,6 +193,7 @@ ATTRIBUTE_NOINLINE static void _additionS(struct ARMCore* cpu, int32_t m, int32_ } ATTRIBUTE_NOINLINE static void _subtractionS(struct ARMCore* cpu, int32_t m, int32_t n, int32_t d) { + cpu->cpsr.flags = 0; cpu->cpsr.n = ARM_SIGN(d); cpu->cpsr.z = !d; cpu->cpsr.c = ARM_BORROW_FROM(m, n, d); diff --git a/src/arm/isa-thumb.c b/src/arm/isa-thumb.c index ad72bffb9..ede7ba368 100644 --- a/src/arm/isa-thumb.c +++ b/src/arm/isa-thumb.c @@ -12,12 +12,14 @@ // Beware pre-processor insanity #define THUMB_ADDITION_S(M, N, D) \ + cpu->cpsr.flags = 0; \ 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); #define THUMB_SUBTRACTION_S(M, N, D) \ + cpu->cpsr.flags = 0; \ cpu->cpsr.n = ARM_SIGN(D); \ cpu->cpsr.z = !(D); \ cpu->cpsr.c = ARM_BORROW_FROM(M, N, D); \