Add support for static fields in optimizing compiler.
Change-Id: Id2f010589e2bd6faf42c05bb33abf6816ebe9fa9
diff --git a/compiler/utils/arm/assembler_arm.h b/compiler/utils/arm/assembler_arm.h
index 14d48b7..c1ed6a2 100644
--- a/compiler/utils/arm/assembler_arm.h
+++ b/compiler/utils/arm/assembler_arm.h
@@ -523,6 +523,9 @@
virtual void blx(Register rm, Condition cond = AL) = 0;
virtual void bx(Register rm, Condition cond = AL) = 0;
+ // Memory barriers.
+ virtual void dmb(DmbOptions flavor) = 0;
+
void Pad(uint32_t bytes);
// Macros.
diff --git a/compiler/utils/arm/assembler_arm32.cc b/compiler/utils/arm/assembler_arm32.cc
index 3d46617..d262b6a 100644
--- a/compiler/utils/arm/assembler_arm32.cc
+++ b/compiler/utils/arm/assembler_arm32.cc
@@ -1471,9 +1471,14 @@
void Arm32Assembler::MemoryBarrier(ManagedRegister mscratch) {
CHECK_EQ(mscratch.AsArm().AsCoreRegister(), R12);
+ dmb(SY);
+}
+
+
+void Arm32Assembler::dmb(DmbOptions flavor) {
#if ANDROID_SMP != 0
int32_t encoding = 0xf57ff05f; // dmb
- Emit(encoding);
+ Emit(encoding | flavor);
#endif
}
diff --git a/compiler/utils/arm/assembler_arm32.h b/compiler/utils/arm/assembler_arm32.h
index c89fd04..cfc300b 100644
--- a/compiler/utils/arm/assembler_arm32.h
+++ b/compiler/utils/arm/assembler_arm32.h
@@ -228,6 +228,8 @@
void CompareAndBranchIfZero(Register r, Label* label) OVERRIDE;
void CompareAndBranchIfNonZero(Register r, Label* label) OVERRIDE;
+ // Memory barriers.
+ void dmb(DmbOptions flavor) OVERRIDE;
// Macros.
// Add signed constant value to rd. May clobber IP.
diff --git a/compiler/utils/arm/assembler_thumb2.cc b/compiler/utils/arm/assembler_thumb2.cc
index 37478c4..633f55b 100644
--- a/compiler/utils/arm/assembler_thumb2.cc
+++ b/compiler/utils/arm/assembler_thumb2.cc
@@ -2521,9 +2521,14 @@
void Thumb2Assembler::MemoryBarrier(ManagedRegister mscratch) {
CHECK_EQ(mscratch.AsArm().AsCoreRegister(), R12);
+ dmb(SY);
+}
+
+
+void Thumb2Assembler::dmb(DmbOptions flavor) {
#if ANDROID_SMP != 0
- int32_t encoding = 0xf3bf8f5f; // dmb in T1 encoding.
- Emit32(encoding);
+ int32_t encoding = 0xf3bf8f50; // dmb in T1 encoding.
+ Emit32(encoding | flavor);
#endif
}
diff --git a/compiler/utils/arm/assembler_thumb2.h b/compiler/utils/arm/assembler_thumb2.h
index 9e7d394..b26173f 100644
--- a/compiler/utils/arm/assembler_thumb2.h
+++ b/compiler/utils/arm/assembler_thumb2.h
@@ -259,6 +259,9 @@
void CompareAndBranchIfZero(Register r, Label* label) OVERRIDE;
void CompareAndBranchIfNonZero(Register r, Label* label) OVERRIDE;
+ // Memory barriers.
+ void dmb(DmbOptions flavor) OVERRIDE;
+
// Macros.
// Add signed constant value to rd. May clobber IP.
void AddConstant(Register rd, int32_t value, Condition cond = AL) OVERRIDE;
diff --git a/compiler/utils/arm/constants_arm.h b/compiler/utils/arm/constants_arm.h
index 092c891..702e03a 100644
--- a/compiler/utils/arm/constants_arm.h
+++ b/compiler/utils/arm/constants_arm.h
@@ -47,6 +47,16 @@
#error "Exactly one of VFPv3_D16 or VFPv3_D32 can be defined at a time."
#endif
+// 4 bits option for the dmb instruction.
+// Order and values follows those of the ARM Architecture Reference Manual.
+enum DmbOptions {
+ SY = 0xf,
+ ST = 0xe,
+ ISH = 0xb,
+ ISHST = 0xa,
+ NSH = 0x7,
+ NSHST = 0x6
+};
enum ScaleFactor {
TIMES_1 = 0,