aboutsummaryrefslogtreecommitdiff
path: root/src/aarch32/macro-assembler-aarch32.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/aarch32/macro-assembler-aarch32.h')
-rw-r--r--src/aarch32/macro-assembler-aarch32.h9
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); }