summaryrefslogtreecommitdiff
path: root/compiler/optimizing/nodes.h
diff options
context:
space:
mode:
author Nicolas Geoffray <ngeoffray@google.com> 2016-09-05 12:54:42 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2016-09-05 12:54:43 +0000
commitcf8b2fa07572513cb01d5cba99cb3b4da8c7f43e (patch)
tree38ffb3320dedac9d4fe64b901a8d601bfddde4b3 /compiler/optimizing/nodes.h
parentebb7b22f4e227176eca40a554990a8e89e283fcf (diff)
parentfc734088e6656a918b6c75094eb942a22bd799e8 (diff)
Merge changes I3f825746,Ia4284ccd,I437ffd43
* changes: Extend the InvokeRuntime() changes to mips64. Extend the InvokeRuntime() changes to mips. Extend the InvokeRuntime() changes to x86 and x86_64.
Diffstat (limited to 'compiler/optimizing/nodes.h')
-rw-r--r--compiler/optimizing/nodes.h48
1 files changed, 44 insertions, 4 deletions
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h
index 62e39f5a0b..19e499ba8c 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: