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