Files
sdk/runtime/vm/compiler/assembler
Regis Crelier 037cff952c [VM/assembler] Use correct operand size in FieldAddress on arm64.
This change prevents the scaled addressing mode to be wrongly applied by the assembler.

Let's illustrate with an example:

__ ldr(R1, FieldAddress(R1, target::Type::nullability_offset()), kUnsignedByte);

Let's assume that target::Type::nullability_offset() == 57 (it is currently 61, but will be 57 in a forthcoming CL).
FieldAddress substracts 1 and builds an Address with offset 56.
The default operand size passed to Address is kDoubleWord, i.e. a scaling factor of 3.
Because 56 == (56 >> 3) << 3, the scaled addressing mode is chosen with a scaled offset of 7, which would be correct for a kDoubleWord access, but not for a kUnsignedByte access.

It is important to specify the same operand size in the instruction as in FieldAddress:
__ ldr(R1, FieldAddress(R1, target::Type::nullability_offset(), kByte), kUnsignedByte);

Change-Id: I46cf2b6ac103b2acec723189c88e211567b795af
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/167900
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Régis Crelier <regis@google.com>
2020-10-19 18:54:37 +00:00
..
2020-06-26 09:39:15 +00:00