summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbuzbee <buzbee@google.com>2010-09-27 11:30:22 -0700
committerbuzbee <buzbee@google.com>2010-09-28 10:54:48 -0700
commitd82097f6b409c5cd48568e54eb701604c3cceb18 (patch)
treea9eb6d7e9e226df033759811de9cd49c18921db6
parente8edf08f04ecbe37f3e18a650a7c9002ceee4275 (diff)
downloadandroid_dalvik-d82097f6b409c5cd48568e54eb701604c3cceb18.tar.gz
android_dalvik-d82097f6b409c5cd48568e54eb701604c3cceb18.tar.bz2
android_dalvik-d82097f6b409c5cd48568e54eb701604c3cceb18.zip
Change GC card making to use object head, bug fix for volatile sput obj
This CL changes the way we mark GC card to consistently use the object head (previously, we marked somewhere in the object - often the head, but not always). Also, previously a coding error caused us to skip the card mark for OP_APUT_OBJECT_VOLATILES. Fixed here. Change-Id: I133ef6395c51a0466c9708209b08e79c3083aff2
-rw-r--r--vm/compiler/codegen/arm/CodegenDriver.c19
-rw-r--r--vm/mterp/armv5te/OP_APUT_OBJECT.S15
-rw-r--r--vm/mterp/armv5te/OP_FILLED_NEW_ARRAY.S2
-rw-r--r--vm/mterp/armv5te/OP_IPUT_OBJECT.S3
-rw-r--r--vm/mterp/armv5te/OP_IPUT_OBJECT_QUICK.S2
-rw-r--r--vm/mterp/armv5te/OP_SPUT_OBJECT.S9
-rw-r--r--vm/mterp/out/InterpAsm-armv4t.S45
-rw-r--r--vm/mterp/out/InterpAsm-armv5te-vfp.S45
-rw-r--r--vm/mterp/out/InterpAsm-armv5te.S45
-rw-r--r--vm/mterp/out/InterpAsm-armv7-a-neon.S45
-rw-r--r--vm/mterp/out/InterpAsm-armv7-a.S45
-rw-r--r--vm/mterp/out/InterpAsm-x86.S32
-rw-r--r--vm/mterp/x86/OP_APUT_OBJECT.S6
-rw-r--r--vm/mterp/x86/OP_FILLED_NEW_ARRAY.S2
-rw-r--r--vm/mterp/x86/OP_IPUT_OBJECT.S2
-rw-r--r--vm/mterp/x86/OP_IPUT_OBJECT_QUICK.S2
-rw-r--r--vm/mterp/x86/OP_SPUT_OBJECT.S8
17 files changed, 176 insertions, 151 deletions
diff --git a/vm/compiler/codegen/arm/CodegenDriver.c b/vm/compiler/codegen/arm/CodegenDriver.c
index 0b6e433e6..706866252 100644
--- a/vm/compiler/codegen/arm/CodegenDriver.c
+++ b/vm/compiler/codegen/arm/CodegenDriver.c
@@ -1527,7 +1527,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*)
@@ -1537,6 +1539,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();
@@ -1545,18 +1550,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;
}
diff --git a/vm/mterp/armv5te/OP_APUT_OBJECT.S b/vm/mterp/armv5te/OP_APUT_OBJECT.S
index e926db66d..9e98784d1 100644
--- a/vm/mterp/armv5te/OP_APUT_OBJECT.S
+++ b/vm/mterp/armv5te/OP_APUT_OBJECT.S
@@ -10,13 +10,13 @@
mov r9, rINST, lsr #8 @ r9<- AA
and r2, r0, #255 @ r2<- BB
mov r3, r0, lsr #8 @ r3<- CC
- GET_VREG(r1, r2) @ r1<- vBB (array object)
+ GET_VREG(rINST, r2) @ rINST<- vBB (array object)
GET_VREG(r0, r3) @ r0<- vCC (requested index)
- cmp r1, #0 @ null array object?
+ cmp rINST, #0 @ null array object?
GET_VREG(r9, r9) @ r9<- vAA
beq common_errNullObject @ yes, bail
- ldr r3, [r1, #offArrayObject_length] @ r3<- arrayObj->length
- add r10, r1, r0, lsl #2 @ r10<- arrayObj + index*width
+ ldr r3, [rINST, #offArrayObject_length] @ r3<- arrayObj->length
+ add r10, rINST, r0, lsl #2 @ r10<- arrayObj + index*width
cmp r0, r3 @ compare unsigned index, length
bcc .L${opcode}_finish @ we're okay, continue on
b common_errArrayIndex @ index >= length, bail
@@ -24,7 +24,7 @@
%break
/*
* On entry:
- * r1 = vBB (arrayObj)
+ * rINST = vBB (arrayObj)
* r9 = vAA (obj)
* r10 = offset into array (vBB + vCC * width)
*/
@@ -32,16 +32,17 @@
cmp r9, #0 @ storing null reference?
beq .L${opcode}_skip_check @ yes, skip type checks
ldr r0, [r9, #offObject_clazz] @ r0<- obj->clazz
- ldr r1, [r1, #offObject_clazz] @ r1<- arrayObj->clazz
+ ldr r1, [rINST, #offObject_clazz] @ r1<- arrayObj->clazz
bl dvmCanPutArrayElement @ test object type vs. array type
cmp r0, #0 @ okay?
beq common_errArrayStore @ no
+ mov r1, rINST @ r1<- arrayObj
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
ldr r2, [rGLUE, #offGlue_cardTable] @ get biased CT base
add r10, #offArrayObject_contents @ r0<- pointer to slot
GET_INST_OPCODE(ip) @ extract opcode from rINST
str r9, [r10] @ vBB[vCC]<- vAA
- strb r2, [r2, r10, lsr #GC_CARD_SHIFT] @ mark card
+ strb r2, [r2, r1, lsr #GC_CARD_SHIFT] @ mark card using object head
GOTO_OPCODE(ip) @ jump to next instruction
.L${opcode}_skip_check:
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
diff --git a/vm/mterp/armv5te/OP_FILLED_NEW_ARRAY.S b/vm/mterp/armv5te/OP_FILLED_NEW_ARRAY.S
index b9abe5ace..5bb2d43b3 100644
--- a/vm/mterp/armv5te/OP_FILLED_NEW_ARRAY.S
+++ b/vm/mterp/armv5te/OP_FILLED_NEW_ARRAY.S
@@ -87,7 +87,7 @@
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
GET_INST_OPCODE(ip) @ ip<- opcode from rINST
cmp r1, #'I' @ Is int array?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card if not
+ strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
GOTO_OPCODE(ip) @ execute it
/*
diff --git a/vm/mterp/armv5te/OP_IPUT_OBJECT.S b/vm/mterp/armv5te/OP_IPUT_OBJECT.S
index 5e0fe834f..079094e9b 100644
--- a/vm/mterp/armv5te/OP_IPUT_OBJECT.S
+++ b/vm/mterp/armv5te/OP_IPUT_OBJECT.S
@@ -42,10 +42,9 @@
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
beq common_errNullObject @ object was null
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
- add r9, r3 @ r9<- direct ptr to target location
GET_INST_OPCODE(ip) @ extract opcode from rINST
$barrier @ releasing store
- str r0, [r9] @ obj.field (8/16/32 bits)<- r0
+ str r0, [r9, r3] @ obj.field (32 bits)<- r0
cmp r0, #0 @ stored a null reference?
strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card if not
GOTO_OPCODE(ip) @ jump to next instruction
diff --git a/vm/mterp/armv5te/OP_IPUT_OBJECT_QUICK.S b/vm/mterp/armv5te/OP_IPUT_OBJECT_QUICK.S
index 648a69cc8..7e7144a02 100644
--- a/vm/mterp/armv5te/OP_IPUT_OBJECT_QUICK.S
+++ b/vm/mterp/armv5te/OP_IPUT_OBJECT_QUICK.S
@@ -14,6 +14,6 @@
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
str r0, [r3, r1] @ obj.field (always 32 bits)<- r0
cmp r0, #0
- strneb r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card on non-null store
+ strneb r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GET_INST_OPCODE(ip) @ extract opcode from rINST
GOTO_OPCODE(ip) @ jump to next instruction
diff --git a/vm/mterp/armv5te/OP_SPUT_OBJECT.S b/vm/mterp/armv5te/OP_SPUT_OBJECT.S
index 54a04fcfb..5d9baec21 100644
--- a/vm/mterp/armv5te/OP_SPUT_OBJECT.S
+++ b/vm/mterp/armv5te/OP_SPUT_OBJECT.S
@@ -14,25 +14,26 @@
ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
cmp r0, #0 @ is resolved entry null?
+ ldr r9, [rGLUE, #offGlue_method] @ r9<- current method
bne .L${opcode}_finish @ no, continue
- ldr r2, [rGLUE, #offGlue_method] @ r2<- current method
EXPORT_PC() @ resolve() could throw, so export now
- ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
cmp r0, #0 @ success?
bne .L${opcode}_finish @ yes, finish
b common_exceptionThrown @ no, handle exception
%break
-.L${opcode}_finish: @ field ptr in r0
+.L${opcode}_finish: @ field ptr in r0, method in r9
mov r2, rINST, lsr #8 @ r2<- AA
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
GET_VREG(r1, r2) @ r1<- fp[AA]
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
+ ldr r9, [r9, #offMethod_clazz] @ r9<- obj head
GET_INST_OPCODE(ip) @ extract opcode from rINST
add r0, #offStaticField_value @ r0<- pointer to store target
$barrier @ releasing store
str r1, [r0] @ field<- vAA
cmp r1, #0 @ stored a null object?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ mark card if not
+ strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GOTO_OPCODE(ip) @ jump to next instruction
diff --git a/vm/mterp/out/InterpAsm-armv4t.S b/vm/mterp/out/InterpAsm-armv4t.S
index e31f96652..f57d5092b 100644
--- a/vm/mterp/out/InterpAsm-armv4t.S
+++ b/vm/mterp/out/InterpAsm-armv4t.S
@@ -2284,13 +2284,13 @@ dalvik_inst:
mov r9, rINST, lsr #8 @ r9<- AA
and r2, r0, #255 @ r2<- BB
mov r3, r0, lsr #8 @ r3<- CC
- GET_VREG(r1, r2) @ r1<- vBB (array object)
+ GET_VREG(rINST, r2) @ rINST<- vBB (array object)
GET_VREG(r0, r3) @ r0<- vCC (requested index)
- cmp r1, #0 @ null array object?
+ cmp rINST, #0 @ null array object?
GET_VREG(r9, r9) @ r9<- vAA
beq common_errNullObject @ yes, bail
- ldr r3, [r1, #offArrayObject_length] @ r3<- arrayObj->length
- add r10, r1, r0, lsl #2 @ r10<- arrayObj + index*width
+ ldr r3, [rINST, #offArrayObject_length] @ r3<- arrayObj->length
+ add r10, rINST, r0, lsl #2 @ r10<- arrayObj + index*width
cmp r0, r3 @ compare unsigned index, length
bcc .LOP_APUT_OBJECT_finish @ we're okay, continue on
b common_errArrayIndex @ index >= length, bail
@@ -3063,10 +3063,10 @@ dalvik_inst:
ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
cmp r0, #0 @ is resolved entry null?
+ ldr r9, [rGLUE, #offGlue_method] @ r9<- current method
bne .LOP_SPUT_OBJECT_finish @ no, continue
- ldr r2, [rGLUE, #offGlue_method] @ r2<- current method
EXPORT_PC() @ resolve() could throw, so export now
- ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
cmp r0, #0 @ success?
bne .LOP_SPUT_OBJECT_finish @ yes, finish
@@ -7895,7 +7895,7 @@ d2i_doconv:
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
str r0, [r3, r1] @ obj.field (always 32 bits)<- r0
cmp r0, #0
- strneb r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card on non-null store
+ strneb r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GET_INST_OPCODE(ip) @ extract opcode from rINST
GOTO_OPCODE(ip) @ jump to next instruction
@@ -8078,10 +8078,10 @@ d2i_doconv:
ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
cmp r0, #0 @ is resolved entry null?
+ ldr r9, [rGLUE, #offGlue_method] @ r9<- current method
bne .LOP_SPUT_OBJECT_VOLATILE_finish @ no, continue
- ldr r2, [rGLUE, #offGlue_method] @ r2<- current method
EXPORT_PC() @ resolve() could throw, so export now
- ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
cmp r0, #0 @ success?
bne .LOP_SPUT_OBJECT_VOLATILE_finish @ yes, finish
@@ -8416,7 +8416,7 @@ dvmAsmSisterStart:
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
GET_INST_OPCODE(ip) @ ip<- opcode from rINST
cmp r1, #'I' @ Is int array?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card if not
+ strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
GOTO_OPCODE(ip) @ execute it
/*
@@ -8500,7 +8500,7 @@ dvmAsmSisterStart:
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
GET_INST_OPCODE(ip) @ ip<- opcode from rINST
cmp r1, #'I' @ Is int array?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card if not
+ strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
GOTO_OPCODE(ip) @ execute it
/*
@@ -8721,7 +8721,7 @@ OP_CMPG_FLOAT_nan:
/* continuation for OP_APUT_OBJECT */
/*
* On entry:
- * r1 = vBB (arrayObj)
+ * rINST = vBB (arrayObj)
* r9 = vAA (obj)
* r10 = offset into array (vBB + vCC * width)
*/
@@ -8729,16 +8729,17 @@ OP_CMPG_FLOAT_nan:
cmp r9, #0 @ storing null reference?
beq .LOP_APUT_OBJECT_skip_check @ yes, skip type checks
ldr r0, [r9, #offObject_clazz] @ r0<- obj->clazz
- ldr r1, [r1, #offObject_clazz] @ r1<- arrayObj->clazz
+ ldr r1, [rINST, #offObject_clazz] @ r1<- arrayObj->clazz
bl dvmCanPutArrayElement @ test object type vs. array type
cmp r0, #0 @ okay?
beq common_errArrayStore @ no
+ mov r1, rINST @ r1<- arrayObj
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
ldr r2, [rGLUE, #offGlue_cardTable] @ get biased CT base
add r10, #offArrayObject_contents @ r0<- pointer to slot
GET_INST_OPCODE(ip) @ extract opcode from rINST
str r9, [r10] @ vBB[vCC]<- vAA
- strb r2, [r2, r10, lsr #GC_CARD_SHIFT] @ mark card
+ strb r2, [r2, r1, lsr #GC_CARD_SHIFT] @ mark card using object head
GOTO_OPCODE(ip) @ jump to next instruction
.LOP_APUT_OBJECT_skip_check:
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
@@ -8961,10 +8962,9 @@ OP_CMPG_FLOAT_nan:
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
beq common_errNullObject @ object was null
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
- add r9, r3 @ r9<- direct ptr to target location
GET_INST_OPCODE(ip) @ extract opcode from rINST
@ no-op @ releasing store
- str r0, [r9] @ obj.field (8/16/32 bits)<- r0
+ str r0, [r9, r3] @ obj.field (32 bits)<- r0
cmp r0, #0 @ stored a null reference?
strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card if not
GOTO_OPCODE(ip) @ jump to next instruction
@@ -9195,17 +9195,18 @@ OP_CMPG_FLOAT_nan:
b common_exceptionThrown @ no, handle exception
/* continuation for OP_SPUT_OBJECT */
-.LOP_SPUT_OBJECT_finish: @ field ptr in r0
+.LOP_SPUT_OBJECT_finish: @ field ptr in r0, method in r9
mov r2, rINST, lsr #8 @ r2<- AA
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
GET_VREG(r1, r2) @ r1<- fp[AA]
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
+ ldr r9, [r9, #offMethod_clazz] @ r9<- obj head
GET_INST_OPCODE(ip) @ extract opcode from rINST
add r0, #offStaticField_value @ r0<- pointer to store target
@ no-op @ releasing store
str r1, [r0] @ field<- vAA
cmp r1, #0 @ stored a null object?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ mark card if not
+ strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GOTO_OPCODE(ip) @ jump to next instruction
/* continuation for OP_SPUT_BOOLEAN */
@@ -9804,10 +9805,9 @@ d2l_doconv:
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
beq common_errNullObject @ object was null
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
- add r9, r3 @ r9<- direct ptr to target location
GET_INST_OPCODE(ip) @ extract opcode from rINST
SMP_DMB @ releasing store
- str r0, [r9] @ obj.field (8/16/32 bits)<- r0
+ str r0, [r9, r3] @ obj.field (32 bits)<- r0
cmp r0, #0 @ stored a null reference?
strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card if not
GOTO_OPCODE(ip) @ jump to next instruction
@@ -9828,17 +9828,18 @@ d2l_doconv:
b common_exceptionThrown @ no, handle exception
/* continuation for OP_SPUT_OBJECT_VOLATILE */
-.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0
+.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0, method in r9
mov r2, rINST, lsr #8 @ r2<- AA
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
GET_VREG(r1, r2) @ r1<- fp[AA]
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
+ ldr r9, [r9, #offMethod_clazz] @ r9<- obj head
GET_INST_OPCODE(ip) @ extract opcode from rINST
add r0, #offStaticField_value @ r0<- pointer to store target
SMP_DMB @ releasing store
str r1, [r0] @ field<- vAA
cmp r1, #0 @ stored a null object?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ mark card if not
+ strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GOTO_OPCODE(ip) @ jump to next instruction
.size dvmAsmSisterStart, .-dvmAsmSisterStart
diff --git a/vm/mterp/out/InterpAsm-armv5te-vfp.S b/vm/mterp/out/InterpAsm-armv5te-vfp.S
index 84b42b20f..b31572fb8 100644
--- a/vm/mterp/out/InterpAsm-armv5te-vfp.S
+++ b/vm/mterp/out/InterpAsm-armv5te-vfp.S
@@ -2264,13 +2264,13 @@ dalvik_inst:
mov r9, rINST, lsr #8 @ r9<- AA
and r2, r0, #255 @ r2<- BB
mov r3, r0, lsr #8 @ r3<- CC
- GET_VREG(r1, r2) @ r1<- vBB (array object)
+ GET_VREG(rINST, r2) @ rINST<- vBB (array object)
GET_VREG(r0, r3) @ r0<- vCC (requested index)
- cmp r1, #0 @ null array object?
+ cmp rINST, #0 @ null array object?
GET_VREG(r9, r9) @ r9<- vAA
beq common_errNullObject @ yes, bail
- ldr r3, [r1, #offArrayObject_length] @ r3<- arrayObj->length
- add r10, r1, r0, lsl #2 @ r10<- arrayObj + index*width
+ ldr r3, [rINST, #offArrayObject_length] @ r3<- arrayObj->length
+ add r10, rINST, r0, lsl #2 @ r10<- arrayObj + index*width
cmp r0, r3 @ compare unsigned index, length
bcc .LOP_APUT_OBJECT_finish @ we're okay, continue on
b common_errArrayIndex @ index >= length, bail
@@ -3043,10 +3043,10 @@ dalvik_inst:
ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
cmp r0, #0 @ is resolved entry null?
+ ldr r9, [rGLUE, #offGlue_method] @ r9<- current method
bne .LOP_SPUT_OBJECT_finish @ no, continue
- ldr r2, [rGLUE, #offGlue_method] @ r2<- current method
EXPORT_PC() @ resolve() could throw, so export now
- ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
cmp r0, #0 @ success?
bne .LOP_SPUT_OBJECT_finish @ yes, finish
@@ -7573,7 +7573,7 @@ dalvik_inst:
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
str r0, [r3, r1] @ obj.field (always 32 bits)<- r0
cmp r0, #0
- strneb r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card on non-null store
+ strneb r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GET_INST_OPCODE(ip) @ extract opcode from rINST
GOTO_OPCODE(ip) @ jump to next instruction
@@ -7756,10 +7756,10 @@ dalvik_inst:
ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
cmp r0, #0 @ is resolved entry null?
+ ldr r9, [rGLUE, #offGlue_method] @ r9<- current method
bne .LOP_SPUT_OBJECT_VOLATILE_finish @ no, continue
- ldr r2, [rGLUE, #offGlue_method] @ r2<- current method
EXPORT_PC() @ resolve() could throw, so export now
- ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
cmp r0, #0 @ success?
bne .LOP_SPUT_OBJECT_VOLATILE_finish @ yes, finish
@@ -8094,7 +8094,7 @@ dvmAsmSisterStart:
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
GET_INST_OPCODE(ip) @ ip<- opcode from rINST
cmp r1, #'I' @ Is int array?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card if not
+ strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
GOTO_OPCODE(ip) @ execute it
/*
@@ -8178,7 +8178,7 @@ dvmAsmSisterStart:
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
GET_INST_OPCODE(ip) @ ip<- opcode from rINST
cmp r1, #'I' @ Is int array?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card if not
+ strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
GOTO_OPCODE(ip) @ execute it
/*
@@ -8261,7 +8261,7 @@ dvmAsmSisterStart:
/* continuation for OP_APUT_OBJECT */
/*
* On entry:
- * r1 = vBB (arrayObj)
+ * rINST = vBB (arrayObj)
* r9 = vAA (obj)
* r10 = offset into array (vBB + vCC * width)
*/
@@ -8269,16 +8269,17 @@ dvmAsmSisterStart:
cmp r9, #0 @ storing null reference?
beq .LOP_APUT_OBJECT_skip_check @ yes, skip type checks
ldr r0, [r9, #offObject_clazz] @ r0<- obj->clazz
- ldr r1, [r1, #offObject_clazz] @ r1<- arrayObj->clazz
+ ldr r1, [rINST, #offObject_clazz] @ r1<- arrayObj->clazz
bl dvmCanPutArrayElement @ test object type vs. array type
cmp r0, #0 @ okay?
beq common_errArrayStore @ no
+ mov r1, rINST @ r1<- arrayObj
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
ldr r2, [rGLUE, #offGlue_cardTable] @ get biased CT base
add r10, #offArrayObject_contents @ r0<- pointer to slot
GET_INST_OPCODE(ip) @ extract opcode from rINST
str r9, [r10] @ vBB[vCC]<- vAA
- strb r2, [r2, r10, lsr #GC_CARD_SHIFT] @ mark card
+ strb r2, [r2, r1, lsr #GC_CARD_SHIFT] @ mark card using object head
GOTO_OPCODE(ip) @ jump to next instruction
.LOP_APUT_OBJECT_skip_check:
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
@@ -8500,10 +8501,9 @@ dvmAsmSisterStart:
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
beq common_errNullObject @ object was null
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
- add r9, r3 @ r9<- direct ptr to target location
GET_INST_OPCODE(ip) @ extract opcode from rINST
@ no-op @ releasing store
- str r0, [r9] @ obj.field (8/16/32 bits)<- r0
+ str r0, [r9, r3] @ obj.field (32 bits)<- r0
cmp r0, #0 @ stored a null reference?
strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card if not
GOTO_OPCODE(ip) @ jump to next instruction
@@ -8734,17 +8734,18 @@ dvmAsmSisterStart:
b common_exceptionThrown @ no, handle exception
/* continuation for OP_SPUT_OBJECT */
-.LOP_SPUT_OBJECT_finish: @ field ptr in r0
+.LOP_SPUT_OBJECT_finish: @ field ptr in r0, method in r9
mov r2, rINST, lsr #8 @ r2<- AA
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
GET_VREG(r1, r2) @ r1<- fp[AA]
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
+ ldr r9, [r9, #offMethod_clazz] @ r9<- obj head
GET_INST_OPCODE(ip) @ extract opcode from rINST
add r0, #offStaticField_value @ r0<- pointer to store target
@ no-op @ releasing store
str r1, [r0] @ field<- vAA
cmp r1, #0 @ stored a null object?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ mark card if not
+ strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GOTO_OPCODE(ip) @ jump to next instruction
/* continuation for OP_SPUT_BOOLEAN */
@@ -9342,10 +9343,9 @@ d2l_doconv:
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
beq common_errNullObject @ object was null
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
- add r9, r3 @ r9<- direct ptr to target location
GET_INST_OPCODE(ip) @ extract opcode from rINST
SMP_DMB @ releasing store
- str r0, [r9] @ obj.field (8/16/32 bits)<- r0
+ str r0, [r9, r3] @ obj.field (32 bits)<- r0
cmp r0, #0 @ stored a null reference?
strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card if not
GOTO_OPCODE(ip) @ jump to next instruction
@@ -9366,17 +9366,18 @@ d2l_doconv:
b common_exceptionThrown @ no, handle exception
/* continuation for OP_SPUT_OBJECT_VOLATILE */
-.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0
+.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0, method in r9
mov r2, rINST, lsr #8 @ r2<- AA
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
GET_VREG(r1, r2) @ r1<- fp[AA]
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
+ ldr r9, [r9, #offMethod_clazz] @ r9<- obj head
GET_INST_OPCODE(ip) @ extract opcode from rINST
add r0, #offStaticField_value @ r0<- pointer to store target
SMP_DMB @ releasing store
str r1, [r0] @ field<- vAA
cmp r1, #0 @ stored a null object?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ mark card if not
+ strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GOTO_OPCODE(ip) @ jump to next instruction
.size dvmAsmSisterStart, .-dvmAsmSisterStart
diff --git a/vm/mterp/out/InterpAsm-armv5te.S b/vm/mterp/out/InterpAsm-armv5te.S
index 9a3d34041..c444a5fa3 100644
--- a/vm/mterp/out/InterpAsm-armv5te.S
+++ b/vm/mterp/out/InterpAsm-armv5te.S
@@ -2286,13 +2286,13 @@ dalvik_inst:
mov r9, rINST, lsr #8 @ r9<- AA
and r2, r0, #255 @ r2<- BB
mov r3, r0, lsr #8 @ r3<- CC
- GET_VREG(r1, r2) @ r1<- vBB (array object)
+ GET_VREG(rINST, r2) @ rINST<- vBB (array object)
GET_VREG(r0, r3) @ r0<- vCC (requested index)
- cmp r1, #0 @ null array object?
+ cmp rINST, #0 @ null array object?
GET_VREG(r9, r9) @ r9<- vAA
beq common_errNullObject @ yes, bail
- ldr r3, [r1, #offArrayObject_length] @ r3<- arrayObj->length
- add r10, r1, r0, lsl #2 @ r10<- arrayObj + index*width
+ ldr r3, [rINST, #offArrayObject_length] @ r3<- arrayObj->length
+ add r10, rINST, r0, lsl #2 @ r10<- arrayObj + index*width
cmp r0, r3 @ compare unsigned index, length
bcc .LOP_APUT_OBJECT_finish @ we're okay, continue on
b common_errArrayIndex @ index >= length, bail
@@ -3065,10 +3065,10 @@ dalvik_inst:
ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
cmp r0, #0 @ is resolved entry null?
+ ldr r9, [rGLUE, #offGlue_method] @ r9<- current method
bne .LOP_SPUT_OBJECT_finish @ no, continue
- ldr r2, [rGLUE, #offGlue_method] @ r2<- current method
EXPORT_PC() @ resolve() could throw, so export now
- ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
cmp r0, #0 @ success?
bne .LOP_SPUT_OBJECT_finish @ yes, finish
@@ -7895,7 +7895,7 @@ d2i_doconv:
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
str r0, [r3, r1] @ obj.field (always 32 bits)<- r0
cmp r0, #0
- strneb r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card on non-null store
+ strneb r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GET_INST_OPCODE(ip) @ extract opcode from rINST
GOTO_OPCODE(ip) @ jump to next instruction
@@ -8078,10 +8078,10 @@ d2i_doconv:
ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
cmp r0, #0 @ is resolved entry null?
+ ldr r9, [rGLUE, #offGlue_method] @ r9<- current method
bne .LOP_SPUT_OBJECT_VOLATILE_finish @ no, continue
- ldr r2, [rGLUE, #offGlue_method] @ r2<- current method
EXPORT_PC() @ resolve() could throw, so export now
- ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
cmp r0, #0 @ success?
bne .LOP_SPUT_OBJECT_VOLATILE_finish @ yes, finish
@@ -8416,7 +8416,7 @@ dvmAsmSisterStart:
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
GET_INST_OPCODE(ip) @ ip<- opcode from rINST
cmp r1, #'I' @ Is int array?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card if not
+ strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
GOTO_OPCODE(ip) @ execute it
/*
@@ -8500,7 +8500,7 @@ dvmAsmSisterStart:
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
GET_INST_OPCODE(ip) @ ip<- opcode from rINST
cmp r1, #'I' @ Is int array?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card if not
+ strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
GOTO_OPCODE(ip) @ execute it
/*
@@ -8719,7 +8719,7 @@ OP_CMPG_FLOAT_nan:
/* continuation for OP_APUT_OBJECT */
/*
* On entry:
- * r1 = vBB (arrayObj)
+ * rINST = vBB (arrayObj)
* r9 = vAA (obj)
* r10 = offset into array (vBB + vCC * width)
*/
@@ -8727,16 +8727,17 @@ OP_CMPG_FLOAT_nan:
cmp r9, #0 @ storing null reference?
beq .LOP_APUT_OBJECT_skip_check @ yes, skip type checks
ldr r0, [r9, #offObject_clazz] @ r0<- obj->clazz
- ldr r1, [r1, #offObject_clazz] @ r1<- arrayObj->clazz
+ ldr r1, [rINST, #offObject_clazz] @ r1<- arrayObj->clazz
bl dvmCanPutArrayElement @ test object type vs. array type
cmp r0, #0 @ okay?
beq common_errArrayStore @ no
+ mov r1, rINST @ r1<- arrayObj
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
ldr r2, [rGLUE, #offGlue_cardTable] @ get biased CT base
add r10, #offArrayObject_contents @ r0<- pointer to slot
GET_INST_OPCODE(ip) @ extract opcode from rINST
str r9, [r10] @ vBB[vCC]<- vAA
- strb r2, [r2, r10, lsr #GC_CARD_SHIFT] @ mark card
+ strb r2, [r2, r1, lsr #GC_CARD_SHIFT] @ mark card using object head
GOTO_OPCODE(ip) @ jump to next instruction
.LOP_APUT_OBJECT_skip_check:
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
@@ -8958,10 +8959,9 @@ OP_CMPG_FLOAT_nan:
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
beq common_errNullObject @ object was null
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
- add r9, r3 @ r9<- direct ptr to target location
GET_INST_OPCODE(ip) @ extract opcode from rINST
@ no-op @ releasing store
- str r0, [r9] @ obj.field (8/16/32 bits)<- r0
+ str r0, [r9, r3] @ obj.field (32 bits)<- r0
cmp r0, #0 @ stored a null reference?
strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card if not
GOTO_OPCODE(ip) @ jump to next instruction
@@ -9192,17 +9192,18 @@ OP_CMPG_FLOAT_nan:
b common_exceptionThrown @ no, handle exception
/* continuation for OP_SPUT_OBJECT */
-.LOP_SPUT_OBJECT_finish: @ field ptr in r0
+.LOP_SPUT_OBJECT_finish: @ field ptr in r0, method in r9
mov r2, rINST, lsr #8 @ r2<- AA
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
GET_VREG(r1, r2) @ r1<- fp[AA]
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
+ ldr r9, [r9, #offMethod_clazz] @ r9<- obj head
GET_INST_OPCODE(ip) @ extract opcode from rINST
add r0, #offStaticField_value @ r0<- pointer to store target
@ no-op @ releasing store
str r1, [r0] @ field<- vAA
cmp r1, #0 @ stored a null object?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ mark card if not
+ strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GOTO_OPCODE(ip) @ jump to next instruction
/* continuation for OP_SPUT_BOOLEAN */
@@ -9800,10 +9801,9 @@ d2l_doconv:
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
beq common_errNullObject @ object was null
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
- add r9, r3 @ r9<- direct ptr to target location
GET_INST_OPCODE(ip) @ extract opcode from rINST
SMP_DMB @ releasing store
- str r0, [r9] @ obj.field (8/16/32 bits)<- r0
+ str r0, [r9, r3] @ obj.field (32 bits)<- r0
cmp r0, #0 @ stored a null reference?
strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card if not
GOTO_OPCODE(ip) @ jump to next instruction
@@ -9824,17 +9824,18 @@ d2l_doconv:
b common_exceptionThrown @ no, handle exception
/* continuation for OP_SPUT_OBJECT_VOLATILE */
-.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0
+.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0, method in r9
mov r2, rINST, lsr #8 @ r2<- AA
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
GET_VREG(r1, r2) @ r1<- fp[AA]
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
+ ldr r9, [r9, #offMethod_clazz] @ r9<- obj head
GET_INST_OPCODE(ip) @ extract opcode from rINST
add r0, #offStaticField_value @ r0<- pointer to store target
SMP_DMB @ releasing store
str r1, [r0] @ field<- vAA
cmp r1, #0 @ stored a null object?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ mark card if not
+ strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GOTO_OPCODE(ip) @ jump to next instruction
.size dvmAsmSisterStart, .-dvmAsmSisterStart
diff --git a/vm/mterp/out/InterpAsm-armv7-a-neon.S b/vm/mterp/out/InterpAsm-armv7-a-neon.S
index 6bd8e8d9f..035a11ff6 100644
--- a/vm/mterp/out/InterpAsm-armv7-a-neon.S
+++ b/vm/mterp/out/InterpAsm-armv7-a-neon.S
@@ -2264,13 +2264,13 @@ dalvik_inst:
mov r9, rINST, lsr #8 @ r9<- AA
and r2, r0, #255 @ r2<- BB
mov r3, r0, lsr #8 @ r3<- CC
- GET_VREG(r1, r2) @ r1<- vBB (array object)
+ GET_VREG(rINST, r2) @ rINST<- vBB (array object)
GET_VREG(r0, r3) @ r0<- vCC (requested index)
- cmp r1, #0 @ null array object?
+ cmp rINST, #0 @ null array object?
GET_VREG(r9, r9) @ r9<- vAA
beq common_errNullObject @ yes, bail
- ldr r3, [r1, #offArrayObject_length] @ r3<- arrayObj->length
- add r10, r1, r0, lsl #2 @ r10<- arrayObj + index*width
+ ldr r3, [rINST, #offArrayObject_length] @ r3<- arrayObj->length
+ add r10, rINST, r0, lsl #2 @ r10<- arrayObj + index*width
cmp r0, r3 @ compare unsigned index, length
bcc .LOP_APUT_OBJECT_finish @ we're okay, continue on
b common_errArrayIndex @ index >= length, bail
@@ -3043,10 +3043,10 @@ dalvik_inst:
ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
cmp r0, #0 @ is resolved entry null?
+ ldr r9, [rGLUE, #offGlue_method] @ r9<- current method
bne .LOP_SPUT_OBJECT_finish @ no, continue
- ldr r2, [rGLUE, #offGlue_method] @ r2<- current method
EXPORT_PC() @ resolve() could throw, so export now
- ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
cmp r0, #0 @ success?
bne .LOP_SPUT_OBJECT_finish @ yes, finish
@@ -7523,7 +7523,7 @@ dalvik_inst:
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
str r0, [r3, r1] @ obj.field (always 32 bits)<- r0
cmp r0, #0
- strneb r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card on non-null store
+ strneb r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GET_INST_OPCODE(ip) @ extract opcode from rINST
GOTO_OPCODE(ip) @ jump to next instruction
@@ -7706,10 +7706,10 @@ dalvik_inst:
ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
cmp r0, #0 @ is resolved entry null?
+ ldr r9, [rGLUE, #offGlue_method] @ r9<- current method
bne .LOP_SPUT_OBJECT_VOLATILE_finish @ no, continue
- ldr r2, [rGLUE, #offGlue_method] @ r2<- current method
EXPORT_PC() @ resolve() could throw, so export now
- ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
cmp r0, #0 @ success?
bne .LOP_SPUT_OBJECT_VOLATILE_finish @ yes, finish
@@ -8044,7 +8044,7 @@ dvmAsmSisterStart:
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
GET_INST_OPCODE(ip) @ ip<- opcode from rINST
cmp r1, #'I' @ Is int array?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card if not
+ strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
GOTO_OPCODE(ip) @ execute it
/*
@@ -8128,7 +8128,7 @@ dvmAsmSisterStart:
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
GET_INST_OPCODE(ip) @ ip<- opcode from rINST
cmp r1, #'I' @ Is int array?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card if not
+ strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
GOTO_OPCODE(ip) @ execute it
/*
@@ -8211,7 +8211,7 @@ dvmAsmSisterStart:
/* continuation for OP_APUT_OBJECT */
/*
* On entry:
- * r1 = vBB (arrayObj)
+ * rINST = vBB (arrayObj)
* r9 = vAA (obj)
* r10 = offset into array (vBB + vCC * width)
*/
@@ -8219,16 +8219,17 @@ dvmAsmSisterStart:
cmp r9, #0 @ storing null reference?
beq .LOP_APUT_OBJECT_skip_check @ yes, skip type checks
ldr r0, [r9, #offObject_clazz] @ r0<- obj->clazz
- ldr r1, [r1, #offObject_clazz] @ r1<- arrayObj->clazz
+ ldr r1, [rINST, #offObject_clazz] @ r1<- arrayObj->clazz
bl dvmCanPutArrayElement @ test object type vs. array type
cmp r0, #0 @ okay?
beq common_errArrayStore @ no
+ mov r1, rINST @ r1<- arrayObj
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
ldr r2, [rGLUE, #offGlue_cardTable] @ get biased CT base
add r10, #offArrayObject_contents @ r0<- pointer to slot
GET_INST_OPCODE(ip) @ extract opcode from rINST
str r9, [r10] @ vBB[vCC]<- vAA
- strb r2, [r2, r10, lsr #GC_CARD_SHIFT] @ mark card
+ strb r2, [r2, r1, lsr #GC_CARD_SHIFT] @ mark card using object head
GOTO_OPCODE(ip) @ jump to next instruction
.LOP_APUT_OBJECT_skip_check:
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
@@ -8434,10 +8435,9 @@ dvmAsmSisterStart:
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
beq common_errNullObject @ object was null
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
- add r9, r3 @ r9<- direct ptr to target location
GET_INST_OPCODE(ip) @ extract opcode from rINST
@ no-op @ releasing store
- str r0, [r9] @ obj.field (8/16/32 bits)<- r0
+ str r0, [r9, r3] @ obj.field (32 bits)<- r0
cmp r0, #0 @ stored a null reference?
strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card if not
GOTO_OPCODE(ip) @ jump to next instruction
@@ -8668,17 +8668,18 @@ dvmAsmSisterStart:
b common_exceptionThrown @ no, handle exception
/* continuation for OP_SPUT_OBJECT */
-.LOP_SPUT_OBJECT_finish: @ field ptr in r0
+.LOP_SPUT_OBJECT_finish: @ field ptr in r0, method in r9
mov r2, rINST, lsr #8 @ r2<- AA
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
GET_VREG(r1, r2) @ r1<- fp[AA]
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
+ ldr r9, [r9, #offMethod_clazz] @ r9<- obj head
GET_INST_OPCODE(ip) @ extract opcode from rINST
add r0, #offStaticField_value @ r0<- pointer to store target
@ no-op @ releasing store
str r1, [r0] @ field<- vAA
cmp r1, #0 @ stored a null object?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ mark card if not
+ strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GOTO_OPCODE(ip) @ jump to next instruction
/* continuation for OP_SPUT_BOOLEAN */
@@ -9276,10 +9277,9 @@ d2l_doconv:
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
beq common_errNullObject @ object was null
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
- add r9, r3 @ r9<- direct ptr to target location
GET_INST_OPCODE(ip) @ extract opcode from rINST
SMP_DMB @ releasing store
- str r0, [r9] @ obj.field (8/16/32 bits)<- r0
+ str r0, [r9, r3] @ obj.field (32 bits)<- r0
cmp r0, #0 @ stored a null reference?
strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card if not
GOTO_OPCODE(ip) @ jump to next instruction
@@ -9300,17 +9300,18 @@ d2l_doconv:
b common_exceptionThrown @ no, handle exception
/* continuation for OP_SPUT_OBJECT_VOLATILE */
-.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0
+.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0, method in r9
mov r2, rINST, lsr #8 @ r2<- AA
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
GET_VREG(r1, r2) @ r1<- fp[AA]
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
+ ldr r9, [r9, #offMethod_clazz] @ r9<- obj head
GET_INST_OPCODE(ip) @ extract opcode from rINST
add r0, #offStaticField_value @ r0<- pointer to store target
SMP_DMB @ releasing store
str r1, [r0] @ field<- vAA
cmp r1, #0 @ stored a null object?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ mark card if not
+ strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GOTO_OPCODE(ip) @ jump to next instruction
.size dvmAsmSisterStart, .-dvmAsmSisterStart
diff --git a/vm/mterp/out/InterpAsm-armv7-a.S b/vm/mterp/out/InterpAsm-armv7-a.S
index 1aed05f83..41e358491 100644
--- a/vm/mterp/out/InterpAsm-armv7-a.S
+++ b/vm/mterp/out/InterpAsm-armv7-a.S
@@ -2264,13 +2264,13 @@ dalvik_inst:
mov r9, rINST, lsr #8 @ r9<- AA
and r2, r0, #255 @ r2<- BB
mov r3, r0, lsr #8 @ r3<- CC
- GET_VREG(r1, r2) @ r1<- vBB (array object)
+ GET_VREG(rINST, r2) @ rINST<- vBB (array object)
GET_VREG(r0, r3) @ r0<- vCC (requested index)
- cmp r1, #0 @ null array object?
+ cmp rINST, #0 @ null array object?
GET_VREG(r9, r9) @ r9<- vAA
beq common_errNullObject @ yes, bail
- ldr r3, [r1, #offArrayObject_length] @ r3<- arrayObj->length
- add r10, r1, r0, lsl #2 @ r10<- arrayObj + index*width
+ ldr r3, [rINST, #offArrayObject_length] @ r3<- arrayObj->length
+ add r10, rINST, r0, lsl #2 @ r10<- arrayObj + index*width
cmp r0, r3 @ compare unsigned index, length
bcc .LOP_APUT_OBJECT_finish @ we're okay, continue on
b common_errArrayIndex @ index >= length, bail
@@ -3043,10 +3043,10 @@ dalvik_inst:
ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
cmp r0, #0 @ is resolved entry null?
+ ldr r9, [rGLUE, #offGlue_method] @ r9<- current method
bne .LOP_SPUT_OBJECT_finish @ no, continue
- ldr r2, [rGLUE, #offGlue_method] @ r2<- current method
EXPORT_PC() @ resolve() could throw, so export now
- ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
cmp r0, #0 @ success?
bne .LOP_SPUT_OBJECT_finish @ yes, finish
@@ -7523,7 +7523,7 @@ dalvik_inst:
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
str r0, [r3, r1] @ obj.field (always 32 bits)<- r0
cmp r0, #0
- strneb r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card on non-null store
+ strneb r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GET_INST_OPCODE(ip) @ extract opcode from rINST
GOTO_OPCODE(ip) @ jump to next instruction
@@ -7706,10 +7706,10 @@ dalvik_inst:
ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
cmp r0, #0 @ is resolved entry null?
+ ldr r9, [rGLUE, #offGlue_method] @ r9<- current method
bne .LOP_SPUT_OBJECT_VOLATILE_finish @ no, continue
- ldr r2, [rGLUE, #offGlue_method] @ r2<- current method
EXPORT_PC() @ resolve() could throw, so export now
- ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
cmp r0, #0 @ success?
bne .LOP_SPUT_OBJECT_VOLATILE_finish @ yes, finish
@@ -8044,7 +8044,7 @@ dvmAsmSisterStart:
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
GET_INST_OPCODE(ip) @ ip<- opcode from rINST
cmp r1, #'I' @ Is int array?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card if not
+ strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
GOTO_OPCODE(ip) @ execute it
/*
@@ -8128,7 +8128,7 @@ dvmAsmSisterStart:
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
GET_INST_OPCODE(ip) @ ip<- opcode from rINST
cmp r1, #'I' @ Is int array?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card if not
+ strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
GOTO_OPCODE(ip) @ execute it
/*
@@ -8211,7 +8211,7 @@ dvmAsmSisterStart:
/* continuation for OP_APUT_OBJECT */
/*
* On entry:
- * r1 = vBB (arrayObj)
+ * rINST = vBB (arrayObj)
* r9 = vAA (obj)
* r10 = offset into array (vBB + vCC * width)
*/
@@ -8219,16 +8219,17 @@ dvmAsmSisterStart:
cmp r9, #0 @ storing null reference?
beq .LOP_APUT_OBJECT_skip_check @ yes, skip type checks
ldr r0, [r9, #offObject_clazz] @ r0<- obj->clazz
- ldr r1, [r1, #offObject_clazz] @ r1<- arrayObj->clazz
+ ldr r1, [rINST, #offObject_clazz] @ r1<- arrayObj->clazz
bl dvmCanPutArrayElement @ test object type vs. array type
cmp r0, #0 @ okay?
beq common_errArrayStore @ no
+ mov r1, rINST @ r1<- arrayObj
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
ldr r2, [rGLUE, #offGlue_cardTable] @ get biased CT base
add r10, #offArrayObject_contents @ r0<- pointer to slot
GET_INST_OPCODE(ip) @ extract opcode from rINST
str r9, [r10] @ vBB[vCC]<- vAA
- strb r2, [r2, r10, lsr #GC_CARD_SHIFT] @ mark card
+ strb r2, [r2, r1, lsr #GC_CARD_SHIFT] @ mark card using object head
GOTO_OPCODE(ip) @ jump to next instruction
.LOP_APUT_OBJECT_skip_check:
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
@@ -8434,10 +8435,9 @@ dvmAsmSisterStart:
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
beq common_errNullObject @ object was null
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
- add r9, r3 @ r9<- direct ptr to target location
GET_INST_OPCODE(ip) @ extract opcode from rINST
@ no-op @ releasing store
- str r0, [r9] @ obj.field (8/16/32 bits)<- r0
+ str r0, [r9, r3] @ obj.field (32 bits)<- r0
cmp r0, #0 @ stored a null reference?
strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card if not
GOTO_OPCODE(ip) @ jump to next instruction
@@ -8668,17 +8668,18 @@ dvmAsmSisterStart:
b common_exceptionThrown @ no, handle exception
/* continuation for OP_SPUT_OBJECT */
-.LOP_SPUT_OBJECT_finish: @ field ptr in r0
+.LOP_SPUT_OBJECT_finish: @ field ptr in r0, method in r9
mov r2, rINST, lsr #8 @ r2<- AA
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
GET_VREG(r1, r2) @ r1<- fp[AA]
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
+ ldr r9, [r9, #offMethod_clazz] @ r9<- obj head
GET_INST_OPCODE(ip) @ extract opcode from rINST
add r0, #offStaticField_value @ r0<- pointer to store target
@ no-op @ releasing store
str r1, [r0] @ field<- vAA
cmp r1, #0 @ stored a null object?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ mark card if not
+ strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GOTO_OPCODE(ip) @ jump to next instruction
/* continuation for OP_SPUT_BOOLEAN */
@@ -9276,10 +9277,9 @@ d2l_doconv:
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
beq common_errNullObject @ object was null
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
- add r9, r3 @ r9<- direct ptr to target location
GET_INST_OPCODE(ip) @ extract opcode from rINST
SMP_DMB @ releasing store
- str r0, [r9] @ obj.field (8/16/32 bits)<- r0
+ str r0, [r9, r3] @ obj.field (32 bits)<- r0
cmp r0, #0 @ stored a null reference?
strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card if not
GOTO_OPCODE(ip) @ jump to next instruction
@@ -9300,17 +9300,18 @@ d2l_doconv:
b common_exceptionThrown @ no, handle exception
/* continuation for OP_SPUT_OBJECT_VOLATILE */
-.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0
+.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0, method in r9
mov r2, rINST, lsr #8 @ r2<- AA
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
GET_VREG(r1, r2) @ r1<- fp[AA]
ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base
+ ldr r9, [r9, #offMethod_clazz] @ r9<- obj head
GET_INST_OPCODE(ip) @ extract opcode from rINST
add r0, #offStaticField_value @ r0<- pointer to store target
SMP_DMB @ releasing store
str r1, [r0] @ field<- vAA
cmp r1, #0 @ stored a null object?
- strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ mark card if not
+ strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GOTO_OPCODE(ip) @ jump to next instruction
.size dvmAsmSisterStart, .-dvmAsmSisterStart
diff --git a/vm/mterp/out/InterpAsm-x86.S b/vm/mterp/out/InterpAsm-x86.S
index 2f7947626..6f1601f5d 100644
--- a/vm/mterp/out/InterpAsm-x86.S
+++ b/vm/mterp/out/InterpAsm-x86.S
@@ -6739,7 +6739,7 @@ dvmAsmSisterStart:
movl offGlue_retval(%ecx),%eax # eax<- object head
movl offGlue_cardTable(%ecx),%ecx # card table base
shrl $GC_CARD_SHIFT,%eax # convert to card num
- movb %cl,(%ecx,%eax) # mark card
+ movb %cl,(%ecx,%eax) # mark card based on object head
5:
ADVANCE_PC(3)
GOTO_NEXT
@@ -6856,7 +6856,7 @@ dvmAsmSisterStart:
movl offGlue_retval(%ecx),%eax # eax<- object head
movl offGlue_cardTable(%ecx),%ecx # card table base
shrl $GC_CARD_SHIFT,%eax # convert to card num
- movb %cl,(%ecx,%eax) # mark card
+ movb %cl,(%ecx,%eax) # mark card based on object head
5:
ADVANCE_PC(3)
GOTO_NEXT
@@ -6953,6 +6953,7 @@ dvmAsmSisterStart:
SPILL_TMP(%ecx)
movl offObject_clazz(%eax),%eax # eax<- arrayObj->clazz
movl offObject_clazz(rINST_FULL),%ecx # ecx<- obj->clazz
+ movl %eax,LOCAL0_OFFSET(%ebp) # save copy of object head
movl %eax,OUT_ARG1(%esp)
movl %ecx,OUT_ARG0(%esp)
call dvmCanPutArrayElement # test object type vs. array type
@@ -6963,9 +6964,10 @@ dvmAsmSisterStart:
je common_errArrayStore
movl offGlue_cardTable(%eax),%eax # get card table base
movl rINST_FULL,(%ecx)
+ movl LOCAL0_OFFSET(%ebp),%ecx # recover object head
FETCH_INST_WORD(2)
- shrl $GC_CARD_SHIFT,%ecx # convert addr to card number
- movb %al,(%eax,%ecx) # mark card
+ shrl $GC_CARD_SHIFT,%ecx # object head to card number
+ movb %al,(%eax,%ecx) # mark card using object head
ADVANCE_PC(2)
GOTO_NEXT
@@ -7349,7 +7351,7 @@ dvmAsmSisterStart:
FETCH_INST_WORD(2)
je 1f # skip card mark if null store
shrl $GC_CARD_SHIFT,%ecx # object head to card number
- movb %al,(%eax,%ecx) # mark card
+ movb %al,(%eax,%ecx) # mark card using object head
1:
ADVANCE_PC(2)
GOTO_NEXT
@@ -7682,11 +7684,13 @@ dvmAsmSisterStart:
.LOP_SPUT_OBJECT_continue:
- movl %ecx,offStaticField_value(%eax)
- testl %ecx,%ecx
+ movl %ecx,offStaticField_value(%eax) # do the store
+ testl %ecx,%ecx # stored null object ptr?
GET_GLUE(%ecx)
FETCH_INST_WORD(2)
- je 1f
+ movl offGlue_method(%ecx),%eax # eax<- current method
+ je 1f # skip card mark if null
+ movl offMethod_clazz(%eax),%eax # eax<- method_>clazz
movl offGlue_cardTable(%ecx),%ecx # get card table base
shrl $GC_CARD_SHIFT,%eax # head to card number
movb %cl,(%ecx,%eax) # mark card
@@ -8666,7 +8670,7 @@ dvmAsmSisterStart:
movl offGlue_cardTable(%eax),%eax # get card table base
je 1f # skip card mark if null store
shrl $GC_CARD_SHIFT,%ecx # object head to card number
- movb %al,(%eax,%ecx) # mark card
+ movb %al,(%eax,%ecx) # mark card based on object head
1:
ADVANCE_PC(2)
GOTO_NEXT
@@ -8709,7 +8713,7 @@ dvmAsmSisterStart:
FETCH_INST_WORD(2)
je 1f # skip card mark if null store
shrl $GC_CARD_SHIFT,%ecx # object head to card number
- movb %al,(%eax,%ecx) # mark card
+ movb %al,(%eax,%ecx) # mark card using object head
1:
ADVANCE_PC(2)
GOTO_NEXT
@@ -8738,11 +8742,13 @@ dvmAsmSisterStart:
.LOP_SPUT_OBJECT_VOLATILE_continue:
- movl %ecx,offStaticField_value(%eax)
- testl %ecx,%ecx
+ movl %ecx,offStaticField_value(%eax) # do the store
+ testl %ecx,%ecx # stored null object ptr?
GET_GLUE(%ecx)
FETCH_INST_WORD(2)
- je 1f
+ movl offGlue_method(%ecx),%eax # eax<- current method
+ je 1f # skip card mark if null
+ movl offMethod_clazz(%eax),%eax # eax<- method_>clazz
movl offGlue_cardTable(%ecx),%ecx # get card table base
shrl $GC_CARD_SHIFT,%eax # head to card number
movb %cl,(%ecx,%eax) # mark card
diff --git a/vm/mterp/x86/OP_APUT_OBJECT.S b/vm/mterp/x86/OP_APUT_OBJECT.S
index d2ec56557..18eb9f409 100644
--- a/vm/mterp/x86/OP_APUT_OBJECT.S
+++ b/vm/mterp/x86/OP_APUT_OBJECT.S
@@ -31,6 +31,7 @@
SPILL_TMP(%ecx)
movl offObject_clazz(%eax),%eax # eax<- arrayObj->clazz
movl offObject_clazz(rINST_FULL),%ecx # ecx<- obj->clazz
+ movl %eax,LOCAL0_OFFSET(%ebp) # save copy of object head
movl %eax,OUT_ARG1(%esp)
movl %ecx,OUT_ARG0(%esp)
call dvmCanPutArrayElement # test object type vs. array type
@@ -41,9 +42,10 @@
je common_errArrayStore
movl offGlue_cardTable(%eax),%eax # get card table base
movl rINST_FULL,(%ecx)
+ movl LOCAL0_OFFSET(%ebp),%ecx # recover object head
FETCH_INST_WORD(2)
- shrl $$GC_CARD_SHIFT,%ecx # convert addr to card number
- movb %al,(%eax,%ecx) # mark card
+ shrl $$GC_CARD_SHIFT,%ecx # object head to card number
+ movb %al,(%eax,%ecx) # mark card using object head
ADVANCE_PC(2)
GOTO_NEXT
diff --git a/vm/mterp/x86/OP_FILLED_NEW_ARRAY.S b/vm/mterp/x86/OP_FILLED_NEW_ARRAY.S
index b990aeb81..55b1f848a 100644
--- a/vm/mterp/x86/OP_FILLED_NEW_ARRAY.S
+++ b/vm/mterp/x86/OP_FILLED_NEW_ARRAY.S
@@ -122,7 +122,7 @@
movl offGlue_retval(%ecx),%eax # eax<- object head
movl offGlue_cardTable(%ecx),%ecx # card table base
shrl $$GC_CARD_SHIFT,%eax # convert to card num
- movb %cl,(%ecx,%eax) # mark card
+ movb %cl,(%ecx,%eax) # mark card based on object head
5:
ADVANCE_PC(3)
GOTO_NEXT
diff --git a/vm/mterp/x86/OP_IPUT_OBJECT.S b/vm/mterp/x86/OP_IPUT_OBJECT.S
index 39c64e712..87ce9152d 100644
--- a/vm/mterp/x86/OP_IPUT_OBJECT.S
+++ b/vm/mterp/x86/OP_IPUT_OBJECT.S
@@ -64,7 +64,7 @@
FETCH_INST_WORD(2)
je 1f # skip card mark if null store
shrl $$GC_CARD_SHIFT,%ecx # object head to card number
- movb %al,(%eax,%ecx) # mark card
+ movb %al,(%eax,%ecx) # mark card using object head
1:
ADVANCE_PC(2)
GOTO_NEXT
diff --git a/vm/mterp/x86/OP_IPUT_OBJECT_QUICK.S b/vm/mterp/x86/OP_IPUT_OBJECT_QUICK.S
index fb7205b38..35376283b 100644
--- a/vm/mterp/x86/OP_IPUT_OBJECT_QUICK.S
+++ b/vm/mterp/x86/OP_IPUT_OBJECT_QUICK.S
@@ -22,7 +22,7 @@
movl offGlue_cardTable(%eax),%eax # get card table base
je 1f # skip card mark if null store
shrl $$GC_CARD_SHIFT,%ecx # object head to card number
- movb %al,(%eax,%ecx) # mark card
+ movb %al,(%eax,%ecx) # mark card based on object head
1:
ADVANCE_PC(2)
GOTO_NEXT
diff --git a/vm/mterp/x86/OP_SPUT_OBJECT.S b/vm/mterp/x86/OP_SPUT_OBJECT.S
index f55d15110..91a6ca70d 100644
--- a/vm/mterp/x86/OP_SPUT_OBJECT.S
+++ b/vm/mterp/x86/OP_SPUT_OBJECT.S
@@ -21,11 +21,13 @@
.L${opcode}_continue:
- movl %ecx,offStaticField_value(%eax)
- testl %ecx,%ecx
+ movl %ecx,offStaticField_value(%eax) # do the store
+ testl %ecx,%ecx # stored null object ptr?
GET_GLUE(%ecx)
FETCH_INST_WORD(2)
- je 1f
+ movl offGlue_method(%ecx),%eax # eax<- current method
+ je 1f # skip card mark if null
+ movl offMethod_clazz(%eax),%eax # eax<- method_>clazz
movl offGlue_cardTable(%ecx),%ecx # get card table base
shrl $$GC_CARD_SHIFT,%eax # head to card number
movb %cl,(%ecx,%eax) # mark card