Skip to content

Commit 1cf804e

Browse files
rmacnak-googleCommit Queue
authored andcommitted
[vm, compiler] Fix Load[D]FromOffset for offsets with bits 21-23 set on ARM.
TEST=vm/cc/Assembler_LargeOffsets Bug: flutter/flutter#172626 Change-Id: I88f41a3f075ea4b22a1211884e6abcf8587515d9 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/443632 Commit-Queue: Ryan Macnak <[email protected]> Reviewed-by: Alexander Markov <[email protected]>
1 parent 4480ea6 commit 1cf804e

File tree

2 files changed

+31
-5
lines changed

2 files changed

+31
-5
lines changed

runtime/vm/compiler/assembler/assembler_arm.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -260,13 +260,15 @@ class Address : public ValueObject {
260260
kind_ = Immediate;
261261
base_ = rn;
262262
offset_ = offset;
263-
// If the offset can't be encoded in fewer bits, then it'll conflict with
264-
// the encoding of the mode and we won't be able to retrieve it later.
265-
ASSERT(Utils::MagnitudeIsUint(kOpcodeShift, offset));
263+
// The offset might overflow what can be encoded temporarily before being
264+
// split by PrepareLargeAddress. Make sure this doesn't lead to corruption
265+
// of the mode.
266+
constexpr int32_t kOffsetMask = (1 << kOpcodeShift) - 1;
266267
if (offset < 0) {
267-
encoding_ = (am ^ (1 << kUShift)) | -offset; // Flip U to adjust sign.
268+
// Flip U to adjust sign.
269+
encoding_ = (am ^ (1 << kUShift)) | ((-offset) & kOffsetMask);
268270
} else {
269-
encoding_ = am | offset;
271+
encoding_ = am | (offset & kOffsetMask);
270272
}
271273
encoding_ |= ArmEncode::Rn(rn);
272274
}

runtime/vm/compiler/assembler/assembler_arm_test.cc

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4077,6 +4077,30 @@ intptr_t RegRegImmTests::Asr(intptr_t value, intptr_t shift, OperandSize sz) {
40774077
return ExtendValue(SignExtendValue(value, sz) >> shift, sz);
40784078
}
40794079

4080+
// Regression test for https://github.com/flutter/flutter/issues/172626.
4081+
ASSEMBLER_TEST_GENERATE(LargeOffsets, assembler) {
4082+
__ LoadFromOffset(R0, PP, 0x208577); // Has bit 21 set.
4083+
__ LoadDFromOffset(D0, PP, 0x208577);
4084+
__ StoreToOffset(R0, PP, 0x208577);
4085+
__ StoreDToOffset(D0, PP, 0x208577);
4086+
}
4087+
4088+
ASSEMBLER_TEST_RUN(LargeOffsets, test) {
4089+
EXPECT_DISASSEMBLY(
4090+
"e285c982 add tmp, pp, #2129920\n"
4091+
"e59c0577 ldr r0, [tmp, #+1399]\n"
4092+
"e308c403 movw tmp, #0x8403\n"
4093+
"e340c020 movt tmp, #0x20\n"
4094+
"e085c00c add tmp, pp, tmp\n"
4095+
"ed9c0b5d vldrd d0, [tmp, #+372]\n"
4096+
"e285c982 add tmp, pp, #2129920\n"
4097+
"e58c0577 str r0, [tmp, #+1399]\n"
4098+
"e308c403 movw tmp, #0x8403\n"
4099+
"e340c020 movt tmp, #0x20\n"
4100+
"e085c00c add tmp, pp, tmp\n"
4101+
"ed8c0b5d vstrd d0, [tmp, #+372]\n");
4102+
}
4103+
40804104
} // namespace compiler
40814105
} // namespace dart
40824106

0 commit comments

Comments
 (0)