diff options
Diffstat (limited to 'vm/compiler/codegen/arm/CodegenDriver.cpp')
| -rw-r--r-- | vm/compiler/codegen/arm/CodegenDriver.cpp | 8 |
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); |
