summaryrefslogtreecommitdiffstats
path: root/vm/compiler
diff options
context:
space:
mode:
authorbuzbee <buzbee@google.com>2010-11-01 15:53:27 -0700
committerbuzbee <buzbee@google.com>2010-11-01 15:53:27 -0700
commit2ce33c938286c7694238b417be65a9918f421b3d (patch)
treebe34c46ad9d193db22a4c4517a418d18912b49c6 /vm/compiler
parentd4b3b2f5293e40c91e767acce61dc1286929ffcb (diff)
downloadandroid_dalvik-2ce33c938286c7694238b417be65a9918f421b3d.tar.gz
android_dalvik-2ce33c938286c7694238b417be65a9918f421b3d.tar.bz2
android_dalvik-2ce33c938286c7694238b417be65a9918f421b3d.zip
JIT - support for return-void-barrier [Issue 2992352]
Slight reworking of the memory barrier instruction generation to generalize it, and then add "dmb st" for the new return-void-barrier instruction. Change-Id: Iad95aa5b0ba9b616a17dcbe4c6ca2e3906bb49dc
Diffstat (limited to 'vm/compiler')
-rw-r--r--vm/compiler/codegen/CompilerCodegen.h2
-rw-r--r--vm/compiler/codegen/arm/CodegenDriver.c12
-rw-r--r--vm/compiler/codegen/arm/Thumb2/Gen.c4
-rw-r--r--vm/compiler/codegen/arm/armv5te-vfp/ArchVariant.c2
-rw-r--r--vm/compiler/codegen/arm/armv5te/ArchVariant.c2
-rw-r--r--vm/compiler/codegen/arm/armv7-a-neon/ArchVariant.c4
-rw-r--r--vm/compiler/codegen/arm/armv7-a/ArchVariant.c4
-rw-r--r--vm/compiler/codegen/x86/ia32/ArchVariant.c2
8 files changed, 17 insertions, 15 deletions
diff --git a/vm/compiler/codegen/CompilerCodegen.h b/vm/compiler/codegen/CompilerCodegen.h
index 7379d502e..d871c3b7b 100644
--- a/vm/compiler/codegen/CompilerCodegen.h
+++ b/vm/compiler/codegen/CompilerCodegen.h
@@ -62,6 +62,6 @@ bool dvmCompilerArchVariantInit(void);
int dvmCompilerTargetOptHint(int key);
/* Implemented in codegen/<target>/<target_variant>/ArchVariant.c */
-void dvmCompilerGenMemBarrier(CompilationUnit *cUnit);
+void dvmCompilerGenMemBarrier(CompilationUnit *cUnit, int barrierKind);
#endif /* _DALVIK_VM_COMPILERCODEGEN_H_ */
diff --git a/vm/compiler/codegen/arm/CodegenDriver.c b/vm/compiler/codegen/arm/CodegenDriver.c
index d90050b6e..f0745aed2 100644
--- a/vm/compiler/codegen/arm/CodegenDriver.c
+++ b/vm/compiler/codegen/arm/CodegenDriver.c
@@ -317,7 +317,7 @@ static void genIGet(CompilationUnit *cUnit, MIR *mir, OpSize size,
size, rlObj.sRegLow);
HEAP_ACCESS_SHADOW(false);
if (isVolatile) {
- dvmCompilerGenMemBarrier(cUnit);
+ dvmCompilerGenMemBarrier(cUnit, kSY);
}
storeValue(cUnit, rlDest, rlResult);
@@ -339,7 +339,7 @@ static void genIPut(CompilationUnit *cUnit, MIR *mir, OpSize size,
NULL);/* null object? */
if (isVolatile) {
- dvmCompilerGenMemBarrier(cUnit);
+ dvmCompilerGenMemBarrier(cUnit, kSY);
}
HEAP_ACCESS_SHADOW(true);
storeBaseDisp(cUnit, rlObj.lowReg, fieldOffset, rlSrc.lowReg, size);
@@ -1329,8 +1329,10 @@ static bool handleFmt10x(CompilationUnit *cUnit, MIR *mir)
return true;
}
switch (dalvikOpCode) {
- case OP_RETURN_VOID:
case OP_RETURN_VOID_BARRIER:
+ dvmCompilerGenMemBarrier(cUnit, kST);
+ // Intentional fallthrough
+ case OP_RETURN_VOID:
genReturnCommon(cUnit,mir);
break;
case OP_UNUSED_73:
@@ -1486,7 +1488,7 @@ static bool handleFmt21c_Fmt31c(CompilationUnit *cUnit, MIR *mir)
loadConstant(cUnit, tReg, (int) fieldPtr + valOffset);
if (isVolatile) {
- dvmCompilerGenMemBarrier(cUnit);
+ dvmCompilerGenMemBarrier(cUnit, kSY);
}
HEAP_ACCESS_SHADOW(true);
loadWordDisp(cUnit, tReg, 0, rlResult.lowReg);
@@ -1561,7 +1563,7 @@ static bool handleFmt21c_Fmt31c(CompilationUnit *cUnit, MIR *mir)
dvmCompilerFreeTemp(cUnit, tReg);
HEAP_ACCESS_SHADOW(false);
if (isVolatile) {
- dvmCompilerGenMemBarrier(cUnit);
+ dvmCompilerGenMemBarrier(cUnit, kSY);
}
if (isSputObject) {
/* NOTE: marking card based sfield->clazz */
diff --git a/vm/compiler/codegen/arm/Thumb2/Gen.c b/vm/compiler/codegen/arm/Thumb2/Gen.c
index 8858bb01e..ef1e8a9f1 100644
--- a/vm/compiler/codegen/arm/Thumb2/Gen.c
+++ b/vm/compiler/codegen/arm/Thumb2/Gen.c
@@ -213,7 +213,7 @@ static void genMonitorEnter(CompilationUnit *cUnit, MIR *mir)
LW_LOCK_OWNER_SHIFT - 1);
hopBranch = newLIR2(cUnit, kThumb2Cbnz, r2, 0);
newLIR4(cUnit, kThumb2Strex, r2, r3, r1, offsetof(Object, lock) >> 2);
- dvmCompilerGenMemBarrier(cUnit);
+ dvmCompilerGenMemBarrier(cUnit, kSY);
branch = newLIR2(cUnit, kThumb2Cbz, r2, 0);
hopTarget = newLIR0(cUnit, kArmPseudoTargetLabel);
@@ -268,7 +268,7 @@ static void genMonitorExit(CompilationUnit *cUnit, MIR *mir)
LW_LOCK_OWNER_SHIFT - 1);
opRegReg(cUnit, kOpSub, r2, r3);
hopBranch = opCondBranch(cUnit, kArmCondNe);
- dvmCompilerGenMemBarrier(cUnit);
+ dvmCompilerGenMemBarrier(cUnit, kSY);
storeWordDisp(cUnit, r1, offsetof(Object, lock), r7);
branch = opNone(cUnit, kOpUncondBr);
diff --git a/vm/compiler/codegen/arm/armv5te-vfp/ArchVariant.c b/vm/compiler/codegen/arm/armv5te-vfp/ArchVariant.c
index 6511eac22..3b4e7bfe2 100644
--- a/vm/compiler/codegen/arm/armv5te-vfp/ArchVariant.c
+++ b/vm/compiler/codegen/arm/armv5te-vfp/ArchVariant.c
@@ -93,7 +93,7 @@ int dvmCompilerTargetOptHint(int key)
return res;
}
-void dvmCompilerGenMemBarrier(CompilationUnit *cUnit)
+void dvmCompilerGenMemBarrier(CompilationUnit *cUnit, int barrierKind)
{
#if ANDROID_SMP != 0
#error armv5+smp not supported
diff --git a/vm/compiler/codegen/arm/armv5te/ArchVariant.c b/vm/compiler/codegen/arm/armv5te/ArchVariant.c
index 814f410ff..6a3ca8348 100644
--- a/vm/compiler/codegen/arm/armv5te/ArchVariant.c
+++ b/vm/compiler/codegen/arm/armv5te/ArchVariant.c
@@ -93,7 +93,7 @@ int dvmCompilerTargetOptHint(int key)
return res;
}
-void dvmCompilerGenMemBarrier(CompilationUnit *cUnit)
+void dvmCompilerGenMemBarrier(CompilationUnit *cUnit, int barrierKind)
{
#if ANDROID_SMP != 0
#error armv5+smp not supported
diff --git a/vm/compiler/codegen/arm/armv7-a-neon/ArchVariant.c b/vm/compiler/codegen/arm/armv7-a-neon/ArchVariant.c
index f1727c6f1..3aa429449 100644
--- a/vm/compiler/codegen/arm/armv7-a-neon/ArchVariant.c
+++ b/vm/compiler/codegen/arm/armv7-a-neon/ArchVariant.c
@@ -88,10 +88,10 @@ int dvmCompilerTargetOptHint(int key)
return res;
}
-void dvmCompilerGenMemBarrier(CompilationUnit *cUnit)
+void dvmCompilerGenMemBarrier(CompilationUnit *cUnit, int barrierKind)
{
#if ANDROID_SMP != 0
- ArmLIR *dmb = newLIR1(cUnit, kThumb2Dmb, kSY); // Full system DMB
+ ArmLIR *dmb = newLIR1(cUnit, kThumb2Dmb, barrierKind);
dmb->defMask = ENCODE_ALL;
#endif
}
diff --git a/vm/compiler/codegen/arm/armv7-a/ArchVariant.c b/vm/compiler/codegen/arm/armv7-a/ArchVariant.c
index f1727c6f1..3aa429449 100644
--- a/vm/compiler/codegen/arm/armv7-a/ArchVariant.c
+++ b/vm/compiler/codegen/arm/armv7-a/ArchVariant.c
@@ -88,10 +88,10 @@ int dvmCompilerTargetOptHint(int key)
return res;
}
-void dvmCompilerGenMemBarrier(CompilationUnit *cUnit)
+void dvmCompilerGenMemBarrier(CompilationUnit *cUnit, int barrierKind)
{
#if ANDROID_SMP != 0
- ArmLIR *dmb = newLIR1(cUnit, kThumb2Dmb, kSY); // Full system DMB
+ ArmLIR *dmb = newLIR1(cUnit, kThumb2Dmb, barrierKind);
dmb->defMask = ENCODE_ALL;
#endif
}
diff --git a/vm/compiler/codegen/x86/ia32/ArchVariant.c b/vm/compiler/codegen/x86/ia32/ArchVariant.c
index 2c0dfcba6..931189f19 100644
--- a/vm/compiler/codegen/x86/ia32/ArchVariant.c
+++ b/vm/compiler/codegen/x86/ia32/ArchVariant.c
@@ -93,6 +93,6 @@ int dvmCompilerTargetOptHint(int key)
return res;
}
-void dvmCompilerGenMemBarrier(CompilationUnit *cUnit)
+void dvmCompilerGenMemBarrier(CompilationUnit *cUnit, int barrierKind)
{
}