Extend the InvokeRuntime() changes to mips.

Also fix the side effects for <Static/Instance>Field<Get/Set>.

Test: test-art-target

Change-Id: Ia4284ccd9d0c88210eaa4458f74728c805e2e076
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h
index dfa8276..94913fc 100644
--- a/compiler/optimizing/nodes.h
+++ b/compiler/optimizing/nodes.h
@@ -5021,7 +5021,7 @@
                     Handle<mirror::DexCache> dex_cache,
                     uint32_t dex_pc)
       : HExpression(field_type,
-                    SideEffects::FieldReadOfType(field_type, is_volatile),
+                    SideEffectsForArchRuntimeCalls(field_type, is_volatile),
                     dex_pc),
         field_info_(field_offset,
                     field_type,
@@ -5053,6 +5053,16 @@
   Primitive::Type GetFieldType() const { return field_info_.GetFieldType(); }
   bool IsVolatile() const { return field_info_.IsVolatile(); }
 
+  static SideEffects SideEffectsForArchRuntimeCalls(Primitive::Type field_type, bool is_volatile) {
+    SideEffects side_effects = SideEffects::FieldReadOfType(field_type, is_volatile);
+
+    // MIPS delegates volatile kPrimLong and kPrimDouble loads to a runtime helper.
+    if (Primitive::Is64BitType(field_type)) {
+      side_effects.Add(SideEffects::CanTriggerGC());
+    }
+    return side_effects;
+  }
+
   DECLARE_INSTRUCTION(InstanceFieldGet);
 
  private:
@@ -5073,7 +5083,7 @@
                     const DexFile& dex_file,
                     Handle<mirror::DexCache> dex_cache,
                     uint32_t dex_pc)
-      : HTemplateInstruction(SideEffects::FieldWriteOfType(field_type, is_volatile),
+      : HTemplateInstruction(SideEffectsForArchRuntimeCalls(field_type, is_volatile),
                              dex_pc),
         field_info_(field_offset,
                     field_type,
@@ -5099,6 +5109,16 @@
   bool GetValueCanBeNull() const { return GetPackedFlag<kFlagValueCanBeNull>(); }
   void ClearValueCanBeNull() { SetPackedFlag<kFlagValueCanBeNull>(false); }
 
+  static SideEffects SideEffectsForArchRuntimeCalls(Primitive::Type field_type, bool is_volatile) {
+    SideEffects side_effects = SideEffects::FieldWriteOfType(field_type, is_volatile);
+
+    // MIPS delegates volatile kPrimLong and kPrimDouble stores to a runtime helper.
+    if (Primitive::Is64BitType(field_type)) {
+      side_effects.Add(SideEffects::CanTriggerGC());
+    }
+    return side_effects;
+  }
+
   DECLARE_INSTRUCTION(InstanceFieldSet);
 
  private:
@@ -5896,7 +5916,7 @@
                   Handle<mirror::DexCache> dex_cache,
                   uint32_t dex_pc)
       : HExpression(field_type,
-                    SideEffects::FieldReadOfType(field_type, is_volatile),
+                    SideEffectsForArchRuntimeCalls(field_type, is_volatile),
                     dex_pc),
         field_info_(field_offset,
                     field_type,
@@ -5925,6 +5945,16 @@
   Primitive::Type GetFieldType() const { return field_info_.GetFieldType(); }
   bool IsVolatile() const { return field_info_.IsVolatile(); }
 
+  static SideEffects SideEffectsForArchRuntimeCalls(Primitive::Type field_type, bool is_volatile) {
+    SideEffects side_effects = SideEffects::FieldReadOfType(field_type, is_volatile);
+
+    // MIPS delegates volatile kPrimLong and kPrimDouble loads to a runtime helper.
+    if (Primitive::Is64BitType(field_type)) {
+      side_effects.Add(SideEffects::CanTriggerGC());
+    }
+    return side_effects;
+  }
+
   DECLARE_INSTRUCTION(StaticFieldGet);
 
  private:
@@ -5945,7 +5975,7 @@
                   const DexFile& dex_file,
                   Handle<mirror::DexCache> dex_cache,
                   uint32_t dex_pc)
-      : HTemplateInstruction(SideEffects::FieldWriteOfType(field_type, is_volatile),
+      : HTemplateInstruction(SideEffectsForArchRuntimeCalls(field_type, is_volatile),
                              dex_pc),
         field_info_(field_offset,
                     field_type,
@@ -5968,6 +5998,16 @@
   bool GetValueCanBeNull() const { return GetPackedFlag<kFlagValueCanBeNull>(); }
   void ClearValueCanBeNull() { SetPackedFlag<kFlagValueCanBeNull>(false); }
 
+  static SideEffects SideEffectsForArchRuntimeCalls(Primitive::Type field_type, bool is_volatile) {
+    SideEffects side_effects = SideEffects::FieldWriteOfType(field_type, is_volatile);
+
+    // MIPS delegates volatile kPrimLong and kPrimDouble stores to a runtime helper.
+    if (Primitive::Is64BitType(field_type)) {
+      side_effects.Add(SideEffects::CanTriggerGC());
+    }
+    return side_effects;
+  }
+
   DECLARE_INSTRUCTION(StaticFieldSet);
 
  private: