diff options
| author | Vladimir Marko <vmarko@google.com> | 2018-08-07 10:40:38 +0100 |
|---|---|---|
| committer | Vladimir Marko <vmarko@google.com> | 2018-08-07 16:27:17 +0100 |
| commit | 0ecac681bd0f55fad16027fe341f55edd632e3db (patch) | |
| tree | 016727b357ef37b9be41451359f5ca1c1edea8dd /compiler/optimizing/code_generator_arm64.h | |
| parent | 008e09f35541bcce782cd172d0745b802a720033 (diff) | |
| download | art-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.h | 16 |
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) | |
