summaryrefslogtreecommitdiffstats
path: root/compiler/optimizing/code_generator_arm64.h
diff options
context:
space:
mode:
authorVladimir Marko <vmarko@google.com>2018-08-07 10:40:38 +0100
committerVladimir Marko <vmarko@google.com>2018-08-07 16:27:17 +0100
commit0ecac681bd0f55fad16027fe341f55edd632e3db (patch)
tree016727b357ef37b9be41451359f5ca1c1edea8dd /compiler/optimizing/code_generator_arm64.h
parent008e09f35541bcce782cd172d0745b802a720033 (diff)
downloadart-0ecac681bd0f55fad16027fe341f55edd632e3db.tar.gz
art-0ecac681bd0f55fad16027fe341f55edd632e3db.tar.bz2
art-0ecac681bd0f55fad16027fe341f55edd632e3db.zip
ARM64: Introspection Baker RB for volatile fields.
Test: Already covered by 160-read-barrier-stress. Test: m test-art-host-gtest Test: Pixel 2 XL boots. Test: m test-art-target-gtest Test: testrunner.py --target --optimizing --jit --64 Bug: 36141117 Change-Id: I2f9a707587d1ee27c0efb19d77becba7ec7ffec4
Diffstat (limited to 'compiler/optimizing/code_generator_arm64.h')
-rw-r--r--compiler/optimizing/code_generator_arm64.h16
1 files changed, 13 insertions, 3 deletions
diff --git a/compiler/optimizing/code_generator_arm64.h b/compiler/optimizing/code_generator_arm64.h
index 5aeb0b4034..6a358a4306 100644
--- a/compiler/optimizing/code_generator_arm64.h
+++ b/compiler/optimizing/code_generator_arm64.h
@@ -797,9 +797,10 @@ class CodeGeneratorARM64 : public CodeGenerator {
// Encoding of thunk type and data for link-time generated thunks for Baker read barriers.
enum class BakerReadBarrierKind : uint8_t {
- kField, // Field get or array get with constant offset (i.e. constant index).
- kArray, // Array get with index in register.
- kGcRoot, // GC root load.
+ kField, // Field get or array get with constant offset (i.e. constant index).
+ kAcquire, // Volatile field get.
+ kArray, // Array get with index in register.
+ kGcRoot, // GC root load.
kLast = kGcRoot
};
@@ -832,6 +833,15 @@ class CodeGeneratorARM64 : public CodeGenerator {
BakerReadBarrierSecondRegField::Encode(holder_reg);
}
+ static inline uint32_t EncodeBakerReadBarrierAcquireData(uint32_t base_reg, uint32_t holder_reg) {
+ CheckValidReg(base_reg);
+ CheckValidReg(holder_reg);
+ DCHECK_NE(base_reg, holder_reg);
+ return BakerReadBarrierKindField::Encode(BakerReadBarrierKind::kAcquire) |
+ BakerReadBarrierFirstRegField::Encode(base_reg) |
+ BakerReadBarrierSecondRegField::Encode(holder_reg);
+ }
+
static inline uint32_t EncodeBakerReadBarrierArrayData(uint32_t base_reg) {
CheckValidReg(base_reg);
return BakerReadBarrierKindField::Encode(BakerReadBarrierKind::kArray) |