mirror of https://github.com/mgba-emu/mgba.git
ARM: Fix long multiply-and-accumulate register write order (fixes #1956)
This commit is contained in:
parent
98799dae6d
commit
fbba3efb34
1
CHANGES
1
CHANGES
|
@ -19,6 +19,7 @@ Emulation fixes:
|
|||
- ARM: Fix ALU reading PC after shifting
|
||||
- ARM: Fix STR storing PC after address calculation
|
||||
- ARM: Fix Addressing mode 1 shifter on rs == pc (fixes mgba.io/i/1926)
|
||||
- ARM: Fix long multiply-and-accumulate register write order (fixes mgba.io/1/1956)
|
||||
- GB: Partially fix timing for skipped BIOS
|
||||
- GB: Downgrade DMG-only ROMs from CGB mode even without boot ROM
|
||||
- GB Audio: Fix serializing sweep time
|
||||
|
|
|
@ -526,12 +526,11 @@ DEFINE_MULTIPLY_INSTRUCTION_2_ARM(MLA, cpu->gprs[rdHi] = cpu->gprs[rm] * cpu->gp
|
|||
DEFINE_MULTIPLY_INSTRUCTION_ARM(MUL, cpu->gprs[rd] = cpu->gprs[rm] * cpu->gprs[rs], ARM_NEUTRAL_S(cpu->gprs[rm], cpu->gprs[rs], cpu->gprs[rd]))
|
||||
|
||||
DEFINE_MULTIPLY_INSTRUCTION_2_ARM(SMLAL,
|
||||
int64_t d = ((int64_t) cpu->gprs[rm]) * ((int64_t) cpu->gprs[rs]);
|
||||
int32_t dm = cpu->gprs[rd];
|
||||
int32_t dn = d;
|
||||
cpu->gprs[rd] = dm + dn;
|
||||
cpu->gprs[rdHi] = cpu->gprs[rdHi] + (d >> 32) + ARM_CARRY_FROM(dm, dn, cpu->gprs[rd]);,
|
||||
ARM_NEUTRAL_HI_S(cpu->gprs[rd], cpu->gprs[rdHi]), 3)
|
||||
int64_t d = ((int64_t) cpu->gprs[rm]) * ((int64_t) cpu->gprs[rs]) + ((uint32_t) cpu->gprs[rd]);
|
||||
int32_t dHi = cpu->gprs[rdHi] + (d >> 32);
|
||||
cpu->gprs[rd] = d;
|
||||
cpu->gprs[rdHi] = dHi;,
|
||||
ARM_NEUTRAL_HI_S(cpu->gprs[rd], dHi), 3)
|
||||
|
||||
DEFINE_MULTIPLY_INSTRUCTION_2_ARM(SMULL,
|
||||
int64_t d = ((int64_t) cpu->gprs[rm]) * ((int64_t) cpu->gprs[rs]);
|
||||
|
@ -540,12 +539,11 @@ DEFINE_MULTIPLY_INSTRUCTION_2_ARM(SMULL,
|
|||
ARM_NEUTRAL_HI_S(cpu->gprs[rd], cpu->gprs[rdHi]), 2)
|
||||
|
||||
DEFINE_MULTIPLY_INSTRUCTION_2_ARM(UMLAL,
|
||||
uint64_t d = ARM_UXT_64(cpu->gprs[rm]) * ARM_UXT_64(cpu->gprs[rs]);
|
||||
int32_t dm = cpu->gprs[rd];
|
||||
int32_t dn = d;
|
||||
cpu->gprs[rd] = dm + dn;
|
||||
cpu->gprs[rdHi] = cpu->gprs[rdHi] + (d >> 32) + ARM_CARRY_FROM(dm, dn, cpu->gprs[rd]);,
|
||||
ARM_NEUTRAL_HI_S(cpu->gprs[rd], cpu->gprs[rdHi]), 3)
|
||||
uint64_t d = ARM_UXT_64(cpu->gprs[rm]) * ARM_UXT_64(cpu->gprs[rs]) + ((uint32_t) cpu->gprs[rd]);
|
||||
uint32_t dHi = ((uint32_t) cpu->gprs[rdHi]) + (d >> 32);
|
||||
cpu->gprs[rd] = d;
|
||||
cpu->gprs[rdHi] = dHi;,
|
||||
ARM_NEUTRAL_HI_S(cpu->gprs[rd], dHi), 3)
|
||||
|
||||
DEFINE_MULTIPLY_INSTRUCTION_2_ARM(UMULL,
|
||||
uint64_t d = ARM_UXT_64(cpu->gprs[rm]) * ARM_UXT_64(cpu->gprs[rs]);
|
||||
|
|
Loading…
Reference in New Issue