diff options
| author | 2016-07-14 09:21:59 +0100 | |
|---|---|---|
| committer | 2016-08-31 17:22:54 +0100 | |
| commit | fca16663334e5838790631d8eac95f4ffdb0cc2e (patch) | |
| tree | 2a1f018b428ef0f4097004af92ab44c82e987d12 /compiler/optimizing/nodes.h | |
| parent | ba45db072c48783e19a2a73ab4e45ae143c1c7c9 (diff) | |
Extend the InvokeRuntime() changes to mips.
Also fix the side effects for <Static/Instance>Field<Get/Set>.
Test: test-art-target
Change-Id: Ia4284ccd9d0c88210eaa4458f74728c805e2e076
Diffstat (limited to 'compiler/optimizing/nodes.h')
| -rw-r--r-- | compiler/optimizing/nodes.h | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h index dfa8276651..94913fc562 100644 --- a/compiler/optimizing/nodes.h +++ b/compiler/optimizing/nodes.h @@ -5021,7 +5021,7 @@ class HInstanceFieldGet FINAL : public HExpression<1> { 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 @@ class HInstanceFieldGet FINAL : public HExpression<1> { 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 @@ class HInstanceFieldSet FINAL : public HTemplateInstruction<2> { 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 @@ class HInstanceFieldSet FINAL : public HTemplateInstruction<2> { 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 @@ class HStaticFieldGet FINAL : public HExpression<1> { 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 @@ class HStaticFieldGet FINAL : public HExpression<1> { 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 @@ class HStaticFieldSet FINAL : public HTemplateInstruction<2> { 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 @@ class HStaticFieldSet FINAL : public HTemplateInstruction<2> { 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: |