aboutsummaryrefslogtreecommitdiff
path: root/vm/compiler/codegen/arm/CodegenDriver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'vm/compiler/codegen/arm/CodegenDriver.cpp')
-rw-r--r--vm/compiler/codegen/arm/CodegenDriver.cpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/vm/compiler/codegen/arm/CodegenDriver.cpp b/vm/compiler/codegen/arm/CodegenDriver.cpp
index 75b86a456..85ecb7892 100644
--- a/vm/compiler/codegen/arm/CodegenDriver.cpp
+++ b/vm/compiler/codegen/arm/CodegenDriver.cpp
@@ -384,11 +384,14 @@ static void genIPut(CompilationUnit *cUnit, MIR *mir, OpSize size,
NULL);/* null object? */
if (isVolatile) {
- dvmCompilerGenMemBarrier(cUnit, kSY);
+ dvmCompilerGenMemBarrier(cUnit, kST);
}
HEAP_ACCESS_SHADOW(true);
storeBaseDisp(cUnit, rlObj.lowReg, fieldOffset, rlSrc.lowReg, size);
HEAP_ACCESS_SHADOW(false);
+ if (isVolatile) {
+ dvmCompilerGenMemBarrier(cUnit, kSY);
+ }
if (isObject) {
/* NOTE: marking card based on object head */
markCard(cUnit, rlSrc.lowReg, rlObj.lowReg);
@@ -1757,6 +1760,9 @@ static bool handleFmt21c_Fmt31c_Fmt41c(CompilationUnit *cUnit, MIR *mir)
objHead = dvmCompilerAllocTemp(cUnit);
loadWordDisp(cUnit, tReg, OFFSETOF_MEMBER(Field, clazz), objHead);
}
+ if (isVolatile) {
+ dvmCompilerGenMemBarrier(cUnit, kST);
+ }
HEAP_ACCESS_SHADOW(true);
storeWordDisp(cUnit, tReg, valOffset ,rlSrc.lowReg);
dvmCompilerFreeTemp(cUnit, tReg);