diff options
Diffstat (limited to 'vm/compiler')
-rw-r--r-- | vm/compiler/codegen/CompilerCodegen.h | 2 | ||||
-rw-r--r-- | vm/compiler/codegen/arm/CodegenDriver.c | 12 | ||||
-rw-r--r-- | vm/compiler/codegen/arm/Thumb2/Gen.c | 4 | ||||
-rw-r--r-- | vm/compiler/codegen/arm/armv5te-vfp/ArchVariant.c | 2 | ||||
-rw-r--r-- | vm/compiler/codegen/arm/armv5te/ArchVariant.c | 2 | ||||
-rw-r--r-- | vm/compiler/codegen/arm/armv7-a-neon/ArchVariant.c | 4 | ||||
-rw-r--r-- | vm/compiler/codegen/arm/armv7-a/ArchVariant.c | 4 | ||||
-rw-r--r-- | vm/compiler/codegen/x86/ia32/ArchVariant.c | 2 |
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) { } |