ARM: Expose ARMSelectBank API

This commit is contained in:
Adam Higerd 2020-08-10 10:20:58 -05:00 committed by Vicki Pfau
parent e68d3ed00f
commit 07667955f6
2 changed files with 24 additions and 26 deletions

View File

@ -142,4 +142,26 @@ static inline bool ARMTestCondition(struct ARMCore* cpu, unsigned condition) {
} }
} }
static inline enum RegisterBank ARMSelectBank(enum PrivilegeMode mode) {
switch (mode) {
case MODE_USER:
case MODE_SYSTEM:
// No banked registers
return BANK_NONE;
case MODE_FIQ:
return BANK_FIQ;
case MODE_IRQ:
return BANK_IRQ;
case MODE_SUPERVISOR:
return BANK_SUPERVISOR;
case MODE_ABORT:
return BANK_ABORT;
case MODE_UNDEFINED:
return BANK_UNDEFINED;
default:
// This should be unreached
return BANK_NONE;
}
}
#endif #endif

View File

@ -9,16 +9,14 @@
#include <mgba/internal/arm/isa-inlines.h> #include <mgba/internal/arm/isa-inlines.h>
#include <mgba/internal/arm/isa-thumb.h> #include <mgba/internal/arm/isa-thumb.h>
static inline enum RegisterBank _ARMSelectBank(enum PrivilegeMode);
void ARMSetPrivilegeMode(struct ARMCore* cpu, enum PrivilegeMode mode) { void ARMSetPrivilegeMode(struct ARMCore* cpu, enum PrivilegeMode mode) {
if (mode == cpu->privilegeMode) { if (mode == cpu->privilegeMode) {
// Not switching modes after all // Not switching modes after all
return; return;
} }
enum RegisterBank newBank = _ARMSelectBank(mode); enum RegisterBank newBank = ARMSelectBank(mode);
enum RegisterBank oldBank = _ARMSelectBank(cpu->privilegeMode); enum RegisterBank oldBank = ARMSelectBank(cpu->privilegeMode);
if (newBank != oldBank) { if (newBank != oldBank) {
// Switch banked registers // Switch banked registers
if (mode == MODE_FIQ || cpu->privilegeMode == MODE_FIQ) { if (mode == MODE_FIQ || cpu->privilegeMode == MODE_FIQ) {
@ -46,28 +44,6 @@ void ARMSetPrivilegeMode(struct ARMCore* cpu, enum PrivilegeMode mode) {
cpu->privilegeMode = mode; cpu->privilegeMode = mode;
} }
static inline enum RegisterBank _ARMSelectBank(enum PrivilegeMode mode) {
switch (mode) {
case MODE_USER:
case MODE_SYSTEM:
// No banked registers
return BANK_NONE;
case MODE_FIQ:
return BANK_FIQ;
case MODE_IRQ:
return BANK_IRQ;
case MODE_SUPERVISOR:
return BANK_SUPERVISOR;
case MODE_ABORT:
return BANK_ABORT;
case MODE_UNDEFINED:
return BANK_UNDEFINED;
default:
// This should be unreached
return BANK_NONE;
}
}
void ARMInit(struct ARMCore* cpu) { void ARMInit(struct ARMCore* cpu) {
cpu->master->init(cpu, cpu->master); cpu->master->init(cpu, cpu->master);
size_t i; size_t i;