diff options
Diffstat (limited to 'src/aarch32/macro-assembler-aarch32.h')
-rw-r--r-- | src/aarch32/macro-assembler-aarch32.h | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/aarch32/macro-assembler-aarch32.h b/src/aarch32/macro-assembler-aarch32.h index 62c116d5..59b25a5d 100644 --- a/src/aarch32/macro-assembler-aarch32.h +++ b/src/aarch32/macro-assembler-aarch32.h @@ -2922,7 +2922,7 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); ITScope it_scope(this, &cond, guard); - if (registers.IsSingleRegister() && + if (registers.IsSingleRegister() && !registers.Includes(sp) && (!IsUsingT32() || !registers.IsR0toR7orLR())) { push(cond, registers.GetFirstAvailableRegister()); } else if (!registers.IsEmpty()) { @@ -2937,7 +2937,12 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); ITScope it_scope(this, &cond, guard); - push(cond, rt); + if (IsUsingA32() && rt.IsSP()) { + // Only the A32 multiple-register form can push sp. + push(cond, RegisterList(rt)); + } else { + push(cond, rt); + } } void Push(Register rt) { Push(al, rt); } |