ARM/ARM64: Introspection Baker RB for intrinsics.

Namely Unsafe.getObject/-Volatile().

Test: Additional tests in 160-read-barrier-stress.
Test: m test-art-host-gtest
Test: Pixel 2 XL boots.
Test: testrunner.py --target --optimizing
Test: ART_HEAP_POISONING=true testrunner.py --target --optimizing
Bug: 36141117
Change-Id: I7305d75ab0ae8c9621843f9a382ad3a5e0aefa0b
diff --git a/compiler/optimizing/intrinsics_arm64.cc b/compiler/optimizing/intrinsics_arm64.cc
index 4b2bcc8..e95cc6e 100644
--- a/compiler/optimizing/intrinsics_arm64.cc
+++ b/compiler/optimizing/intrinsics_arm64.cc
@@ -745,15 +745,15 @@
   if (type == DataType::Type::kReference && kEmitCompilerReadBarrier && kUseBakerReadBarrier) {
     // UnsafeGetObject/UnsafeGetObjectVolatile with Baker's read barrier case.
     Register temp = WRegisterFrom(locations->GetTemp(0));
-    codegen->GenerateReferenceLoadWithBakerReadBarrier(invoke,
-                                                       trg_loc,
-                                                       base,
-                                                       /* offset */ 0u,
-                                                       /* index */ offset_loc,
-                                                       /* scale_factor */ 0u,
-                                                       temp,
-                                                       /* needs_null_check */ false,
-                                                       is_volatile);
+    MacroAssembler* masm = codegen->GetVIXLAssembler();
+    // Piggy-back on the field load path using introspection for the Baker read barrier.
+    __ Add(temp, base, offset.W());  // Offset should not exceed 32 bits.
+    codegen->GenerateFieldLoadWithBakerReadBarrier(invoke,
+                                                   trg_loc,
+                                                   base,
+                                                   MemOperand(temp.X()),
+                                                   /* needs_null_check */ false,
+                                                   is_volatile);
   } else {
     // Other cases.
     MemOperand mem_op(base.X(), offset);
@@ -782,9 +782,9 @@
                                       kIntrinsified);
   if (can_call && kUseBakerReadBarrier) {
     locations->SetCustomSlowPathCallerSaves(RegisterSet::Empty());  // No caller-save registers.
-    // We need a temporary register for the read barrier marking slow
-    // path in CodeGeneratorARM64::GenerateReferenceLoadWithBakerReadBarrier.
-    locations->AddTemp(Location::RequiresRegister());
+    // We need a temporary register for the read barrier load in order to use
+    // CodeGeneratorARM64::GenerateFieldLoadWithBakerReadBarrier().
+    locations->AddTemp(FixedTempLocation());
   }
   locations->SetInAt(0, Location::NoLocation());        // Unused receiver.
   locations->SetInAt(1, Location::RequiresRegister());