Skip to content

Commit 4cf27cc

Browse files
rmacnak-googleCommit Queue
authored andcommitted
[vm, compiler] Fix assert assembling add/subs with extended register.
This is not symmetric with add/sub, accepting ZR instead of CSP. TEST=vm/cc/Assembler_CmpExtReg, dartfuzz Bug: #60092 Change-Id: Icc24f7883a113eac504fd8fc29c0d6f781cb7657 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/408901 Reviewed-by: Alexander Markov <[email protected]> Commit-Queue: Ryan Macnak <[email protected]>
1 parent d21fd1f commit 4cf27cc

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

runtime/vm/compiler/assembler/assembler_arm64.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2342,7 +2342,11 @@ 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 != ZR) && (rn != ZR));
2345+
if (set_flags) {
2346+
ASSERT((rd != CSP) && (rn != ZR));
2347+
} else {
2348+
ASSERT((rd != ZR) && (rn != ZR));
2349+
}
23462350
EmitAddSubShiftExtOp(subtract ? SUB : ADD, crd, crn, o, os, set_flags);
23472351
}
23482352
}

runtime/vm/compiler/assembler/assembler_arm64_test.cc

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,31 @@ ASSEMBLER_TEST_RUN(AddExtReg, test) {
335335
"ret\n");
336336
}
337337

338+
ASSEMBLER_TEST_GENERATE(CmpExtReg, assembler) {
339+
Label not_equal;
340+
__ LoadImmediate(R0, 0x100000000);
341+
__ cmp(R0, Operand(R0, SXTW, 0));
342+
__ BranchIf(NOT_EQUAL, &not_equal);
343+
__ LoadImmediate(R0, 1);
344+
__ ret();
345+
__ Bind(&not_equal);
346+
__ LoadImmediate(R0, 2);
347+
__ ret();
348+
}
349+
350+
ASSEMBLER_TEST_RUN(CmpExtReg, test) {
351+
typedef int64_t (*Int64Return)() DART_UNUSED;
352+
EXPECT_EQ(2, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
353+
EXPECT_DISASSEMBLY(
354+
"mov r0, 0x100000000\n"
355+
"cmp r0, r0 sxtw\n"
356+
"bne +12\n"
357+
"movz r0, #0x1\n"
358+
"ret\n"
359+
"movz r0, #0x2\n"
360+
"ret\n");
361+
}
362+
338363
ASSEMBLER_TEST_GENERATE(AddCarryInOut, assembler) {
339364
__ LoadImmediate(R2, -1);
340365
__ LoadImmediate(R1, 1);

0 commit comments

Comments
 (0)