Optimize the mterp field setter.
Same as getters. FindFieldFast does ligth-weight access checks
which are not necessary when running under mterp.
This reduces the overhead of non-quickened code from 1.35x to 1.25x.
(golem benchmarks on arm64 with quickening manually disabled)
Test: profiled benchmark locally on host
Change-Id: I6ccb45ee28de0a395798448e8e5d181ea11c3876
diff --git a/runtime/interpreter/mterp/mterp.cc b/runtime/interpreter/mterp/mterp.cc
index abbc509..e0a4874 100644
--- a/runtime/interpreter/mterp/mterp.cc
+++ b/runtime/interpreter/mterp/mterp.cc
@@ -763,7 +763,7 @@
uint8_t new_value,
ArtMethod* referrer)
REQUIRES_SHARED(Locks::mutator_lock_) {
- ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite, sizeof(int8_t));
+ ArtField* field = referrer->GetDexCache()->GetResolvedField(field_idx, kRuntimePointerSize);
if (LIKELY(field != nullptr && obj != nullptr)) {
Primitive::Type type = field->GetTypeAsPrimitiveType();
if (type == Primitive::kPrimBoolean) {
@@ -782,8 +782,7 @@
uint16_t new_value,
ArtMethod* referrer)
REQUIRES_SHARED(Locks::mutator_lock_) {
- ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
- sizeof(int16_t));
+ ArtField* field = referrer->GetDexCache()->GetResolvedField(field_idx, kRuntimePointerSize);
if (LIKELY(field != nullptr && obj != nullptr)) {
Primitive::Type type = field->GetTypeAsPrimitiveType();
if (type == Primitive::kPrimChar) {
@@ -802,8 +801,7 @@
uint32_t new_value,
ArtMethod* referrer)
REQUIRES_SHARED(Locks::mutator_lock_) {
- ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
- sizeof(int32_t));
+ ArtField* field = referrer->GetDexCache()->GetResolvedField(field_idx, kRuntimePointerSize);
if (LIKELY(field != nullptr && obj != nullptr)) {
field->Set32<false>(obj, new_value);
return 0; // success
@@ -816,8 +814,7 @@
uint64_t* new_value,
ArtMethod* referrer)
REQUIRES_SHARED(Locks::mutator_lock_) {
- ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
- sizeof(int64_t));
+ ArtField* field = referrer->GetDexCache()->GetResolvedField(field_idx, kRuntimePointerSize);
if (LIKELY(field != nullptr && obj != nullptr)) {
field->Set64<false>(obj, *new_value);
return 0; // success
@@ -830,8 +827,7 @@
mirror::Object* new_value,
ArtMethod* referrer)
REQUIRES_SHARED(Locks::mutator_lock_) {
- ArtField* field = FindFieldFast(field_idx, referrer, InstanceObjectWrite,
- sizeof(mirror::HeapReference<mirror::Object>));
+ ArtField* field = referrer->GetDexCache()->GetResolvedField(field_idx, kRuntimePointerSize);
if (LIKELY(field != nullptr && obj != nullptr)) {
field->SetObj<false>(obj, new_value);
return 0; // success