aboutsummaryrefslogtreecommitdiff
path: root/vm/compiler/codegen/arm/CodegenDriver.c
diff options
context:
space:
mode:
authorbuzbee <buzbee@google.com>2010-09-28 15:22:48 -0700
committerbuzbee <buzbee@google.com>2010-09-28 15:22:48 -0700
commit453d1aed5e813adfb5225fa12a95822d6ab8c14e (patch)
tree21143ef96ac1e98c4779285aa34677f2c5edf786 /vm/compiler/codegen/arm/CodegenDriver.c
parent432e74e6edf67b9775d26e4811e700c4860a33a3 (diff)
parent2e75e47d5e19d3096e0947c1a6c826efdc589826 (diff)
resolved conflicts for merge of 2e75e47d to master
Change-Id: I644b3cd50e3c63b209741c8b818b4c1435ee8218
Diffstat (limited to 'vm/compiler/codegen/arm/CodegenDriver.c')
-rw-r--r--vm/compiler/codegen/arm/CodegenDriver.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/vm/compiler/codegen/arm/CodegenDriver.c b/vm/compiler/codegen/arm/CodegenDriver.c
index 177b1c6ae..481bea353 100644
--- a/vm/compiler/codegen/arm/CodegenDriver.c
+++ b/vm/compiler/codegen/arm/CodegenDriver.c
@@ -1523,7 +1523,9 @@ static bool handleFmt21c_Fmt31c(CompilationUnit *cUnit, MIR *mir)
case OP_SPUT: {
int valOffset = offsetof(StaticField, value);
int tReg = dvmCompilerAllocTemp(cUnit);
+ int objHead;
bool isVolatile;
+ bool isSputObject;
const Method *method = (mir->OptimizationFlags & MIR_CALLEE) ?
mir->meta.calleeMethod : cUnit->method;
void *fieldPtr = (void*)
@@ -1533,6 +1535,9 @@ static bool handleFmt21c_Fmt31c(CompilationUnit *cUnit, MIR *mir)
(mir->dalvikInsn.opCode == OP_SPUT_OBJECT_VOLATILE) ||
dvmIsVolatileField(fieldPtr);
+ isSputObject = (mir->dalvikInsn.opCode == OP_SPUT_OBJECT) ||
+ (mir->dalvikInsn.opCode == OP_SPUT_OBJECT_VOLATILE);
+
if (fieldPtr == NULL) {
LOGE("Unexpected null static field");
dvmAbort();
@@ -1541,18 +1546,22 @@ static bool handleFmt21c_Fmt31c(CompilationUnit *cUnit, MIR *mir)
rlSrc = dvmCompilerGetSrc(cUnit, mir, 0);
rlSrc = loadValue(cUnit, rlSrc, kAnyReg);
loadConstant(cUnit, tReg, (int) fieldPtr + valOffset);
-
+ if (isSputObject) {
+ objHead = dvmCompilerAllocTemp(cUnit);
+ loadConstant(cUnit, objHead, (intptr_t)method->clazz);
+ }
HEAP_ACCESS_SHADOW(true);
storeWordDisp(cUnit, tReg, 0 ,rlSrc.lowReg);
+ dvmCompilerFreeTemp(cUnit, tReg);
HEAP_ACCESS_SHADOW(false);
if (isVolatile) {
dvmCompilerGenMemBarrier(cUnit);
}
- if (mir->dalvikInsn.opCode == OP_SPUT_OBJECT) {
- /* NOTE: marking card based on field address */
- markCard(cUnit, rlSrc.lowReg, tReg);
+ if (isSputObject) {
+ /* NOTE: marking card based object head */
+ markCard(cUnit, rlSrc.lowReg, objHead);
+ dvmCompilerFreeTemp(cUnit, objHead);
}
- dvmCompilerFreeTemp(cUnit, tReg);
break;
}