Skip to content

Commit f2d70ce

Browse files
alexmarkovCommit Queue
authored andcommitted
[vm,arm64] Fix AddImmediate in case of CSP
Use extended register variant of add instruction when Rd or Rn register is CSP (SP). Also fix assertion which was incorrectly testing that Rd cannot be CSP if extended register operand is used (actually it cannot be ZR). TEST=vm/cc/Assembler_Drop Fixes #46433 Change-Id: I542dd7bc0661b3195fa466e43cd65998c1c4ac81 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/408141 Commit-Queue: Alexander Markov <[email protected]> Reviewed-by: Ryan Macnak <[email protected]>
1 parent 5f9e3af commit f2d70ce

File tree

2 files changed

+6
-2
lines changed

2 files changed

+6
-2
lines changed

runtime/vm/compiler/assembler/assembler_arm64.cc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -807,7 +807,11 @@ void Assembler::AddImmediate(Register dest,
807807
// TODO(zra): Try adding top 12 bits, then bottom 12 bits.
808808
ASSERT(rn != TMP2);
809809
LoadImmediate(TMP2, imm);
810-
add(dest, rn, Operand(TMP2), sz);
810+
if ((dest == CSP) || (rn == CSP)) {
811+
add(dest, rn, Operand(TMP2, UXTX, 0), sz);
812+
} else {
813+
add(dest, rn, Operand(TMP2), sz);
814+
}
811815
}
812816
}
813817

runtime/vm/compiler/assembler/assembler_arm64.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2342,7 +2342,7 @@ class Assembler : public AssemblerBase {
23422342
EmitAddSubShiftExtOp(subtract ? SUB : ADD, crd, crn, o, os, set_flags);
23432343
} else {
23442344
ASSERT(o.type() == Operand::Extended);
2345-
ASSERT((rd != CSP) && (rn != ZR));
2345+
ASSERT((rd != ZR) && (rn != ZR));
23462346
EmitAddSubShiftExtOp(subtract ? SUB : ADD, crd, crn, o, os, set_flags);
23472347
}
23482348
}

0 commit comments

Comments
 (0)