diff options
Diffstat (limited to 'compiler/optimizing/intrinsics_x86_64.cc')
-rw-r--r-- | compiler/optimizing/intrinsics_x86_64.cc | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/compiler/optimizing/intrinsics_x86_64.cc b/compiler/optimizing/intrinsics_x86_64.cc index 888c7b8037..ea342e9382 100644 --- a/compiler/optimizing/intrinsics_x86_64.cc +++ b/compiler/optimizing/intrinsics_x86_64.cc @@ -1251,6 +1251,9 @@ static void GenUnsafeGet(LocationSummary* locations, Primitive::Type type, case Primitive::kPrimInt: case Primitive::kPrimNot: __ movl(trg, Address(base, offset, ScaleFactor::TIMES_1, 0)); + if (type == Primitive::kPrimNot) { + __ MaybeUnpoisonHeapReference(trg); + } break; case Primitive::kPrimLong: @@ -1325,7 +1328,7 @@ static void CreateIntIntIntIntToVoidPlusTempsLocations(ArenaAllocator* arena, locations->SetInAt(3, Location::RequiresRegister()); if (type == Primitive::kPrimNot) { // Need temp registers for card-marking. - locations->AddTemp(Location::RequiresRegister()); + locations->AddTemp(Location::RequiresRegister()); // Possibly used for reference poisoning too. locations->AddTemp(Location::RequiresRegister()); } } @@ -1369,6 +1372,11 @@ static void GenUnsafePut(LocationSummary* locations, Primitive::Type type, bool if (type == Primitive::kPrimLong) { __ movq(Address(base, offset, ScaleFactor::TIMES_1, 0), value); + } else if (kPoisonHeapReferences && type == Primitive::kPrimNot) { + CpuRegister temp = locations->GetTemp(0).AsRegister<CpuRegister>(); + __ movl(temp, value); + __ PoisonHeapReference(temp); + __ movl(Address(base, offset, ScaleFactor::TIMES_1, 0), temp); } else { __ movl(Address(base, offset, ScaleFactor::TIMES_1, 0), value); } @@ -1471,6 +1479,11 @@ static void GenCAS(Primitive::Type type, HInvoke* invoke, CodeGeneratorX86_64* c base, value, value_can_be_null); + + if (kPoisonHeapReferences) { + __ PoisonHeapReference(expected); + __ PoisonHeapReference(value); + } } __ LockCmpxchgl(Address(base, offset, TIMES_1, 0), value); @@ -1482,6 +1495,11 @@ static void GenCAS(Primitive::Type type, HInvoke* invoke, CodeGeneratorX86_64* c // Convert ZF into the boolean result. __ setcc(kZero, out); __ movzxb(out, out); + + if (kPoisonHeapReferences && type == Primitive::kPrimNot) { + __ UnpoisonHeapReference(value); + __ UnpoisonHeapReference(expected); + } } void IntrinsicCodeGeneratorX86_64::VisitUnsafeCASInt(HInvoke* invoke) { @@ -1598,5 +1616,9 @@ UNIMPLEMENTED_INTRINSIC(StringGetCharsNoCheck) UNIMPLEMENTED_INTRINSIC(SystemArrayCopyChar) UNIMPLEMENTED_INTRINSIC(ReferenceGetReferent) +#undef UNIMPLEMENTED_INTRINSIC + +#undef __ + } // namespace x86_64 } // namespace art |