GC Card marking fix for SPUT_OBJECT - use correct object head
Change-Id: I8b84a4f1e1690f5b62de7404ea6ede00317848bb
diff --git a/vm/compiler/codegen/arm/CodegenDriver.c b/vm/compiler/codegen/arm/CodegenDriver.c
index 7068662..657533b 100644
--- a/vm/compiler/codegen/arm/CodegenDriver.c
+++ b/vm/compiler/codegen/arm/CodegenDriver.c
@@ -1549,20 +1549,20 @@
rlSrc = dvmCompilerGetSrc(cUnit, mir, 0);
rlSrc = loadValue(cUnit, rlSrc, kAnyReg);
- loadConstant(cUnit, tReg, (int) fieldPtr + valOffset);
+ loadConstant(cUnit, tReg, (int) fieldPtr);
if (isSputObject) {
objHead = dvmCompilerAllocTemp(cUnit);
- loadConstant(cUnit, objHead, (intptr_t)method->clazz);
+ loadWordDisp(cUnit, tReg, offsetof(Field, clazz), objHead);
}
HEAP_ACCESS_SHADOW(true);
- storeWordDisp(cUnit, tReg, 0 ,rlSrc.lowReg);
+ storeWordDisp(cUnit, tReg, valOffset ,rlSrc.lowReg);
dvmCompilerFreeTemp(cUnit, tReg);
HEAP_ACCESS_SHADOW(false);
if (isVolatile) {
dvmCompilerGenMemBarrier(cUnit);
}
if (isSputObject) {
- /* NOTE: marking card based object head */
+ /* NOTE: marking card based sfield->clazz */
markCard(cUnit, rlSrc.lowReg, objHead);
dvmCompilerFreeTemp(cUnit, objHead);
}
diff --git a/vm/mterp/armv5te/OP_SPUT_OBJECT.S b/vm/mterp/armv5te/OP_SPUT_OBJECT.S
index 5d9baec..fe9fa4c 100644
--- a/vm/mterp/armv5te/OP_SPUT_OBJECT.S
+++ b/vm/mterp/armv5te/OP_SPUT_OBJECT.S
@@ -14,8 +14,8 @@
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 r9, [rGLUE, #offGlue_method] @ r9<- current method
EXPORT_PC() @ resolve() could throw, so export now
ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
@@ -24,16 +24,15 @@
b common_exceptionThrown @ no, handle exception
%break
-.L${opcode}_finish: @ field ptr in r0, method in r9
+.L${opcode}_finish: @ field ptr in r0
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
+ ldr r9, [r0, #offField_clazz] @ r9<- field->clazz
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
+ str r1, [r0, #offStaticField_value] @ field<- vAA
cmp r1, #0 @ stored a null object?
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/common/asm-constants.h b/vm/mterp/common/asm-constants.h
index affb599..aeed88b 100644
--- a/vm/mterp/common/asm-constants.h
+++ b/vm/mterp/common/asm-constants.h
@@ -161,6 +161,9 @@
MTERP_OFFSET(offInstField_byteOffset, InstField, byteOffset, 16)
#endif
+/* Field fields */
+MTERP_OFFSET(offField_clazz, Field, clazz, 0)
+
/* StaticField fields */
#ifdef PROFILE_FIELD_ACCESS
MTERP_OFFSET(offStaticField_value, StaticField, value, 24)
diff --git a/vm/mterp/out/InterpAsm-armv4t.S b/vm/mterp/out/InterpAsm-armv4t.S
index f57d509..2afeb9b 100644
--- a/vm/mterp/out/InterpAsm-armv4t.S
+++ b/vm/mterp/out/InterpAsm-armv4t.S
@@ -3063,8 +3063,8 @@
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 r9, [rGLUE, #offGlue_method] @ r9<- current method
EXPORT_PC() @ resolve() could throw, so export now
ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
@@ -8078,8 +8078,8 @@
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 r9, [rGLUE, #offGlue_method] @ r9<- current method
EXPORT_PC() @ resolve() could throw, so export now
ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
@@ -9195,16 +9195,15 @@
b common_exceptionThrown @ no, handle exception
/* continuation for OP_SPUT_OBJECT */
-.LOP_SPUT_OBJECT_finish: @ field ptr in r0, method in r9
+.LOP_SPUT_OBJECT_finish: @ field ptr in r0
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
+ ldr r9, [r0, #offField_clazz] @ r9<- field->clazz
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
+ str r1, [r0, #offStaticField_value] @ field<- vAA
cmp r1, #0 @ stored a null object?
strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GOTO_OPCODE(ip) @ jump to next instruction
@@ -9828,16 +9827,15 @@
b common_exceptionThrown @ no, handle exception
/* continuation for OP_SPUT_OBJECT_VOLATILE */
-.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0, method in r9
+.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0
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
+ ldr r9, [r0, #offField_clazz] @ r9<- field->clazz
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
+ str r1, [r0, #offStaticField_value] @ field<- vAA
cmp r1, #0 @ stored a null object?
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-armv5te-vfp.S b/vm/mterp/out/InterpAsm-armv5te-vfp.S
index b31572f..2637e59 100644
--- a/vm/mterp/out/InterpAsm-armv5te-vfp.S
+++ b/vm/mterp/out/InterpAsm-armv5te-vfp.S
@@ -3043,8 +3043,8 @@
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 r9, [rGLUE, #offGlue_method] @ r9<- current method
EXPORT_PC() @ resolve() could throw, so export now
ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
@@ -7756,8 +7756,8 @@
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 r9, [rGLUE, #offGlue_method] @ r9<- current method
EXPORT_PC() @ resolve() could throw, so export now
ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
@@ -8734,16 +8734,15 @@
b common_exceptionThrown @ no, handle exception
/* continuation for OP_SPUT_OBJECT */
-.LOP_SPUT_OBJECT_finish: @ field ptr in r0, method in r9
+.LOP_SPUT_OBJECT_finish: @ field ptr in r0
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
+ ldr r9, [r0, #offField_clazz] @ r9<- field->clazz
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
+ str r1, [r0, #offStaticField_value] @ field<- vAA
cmp r1, #0 @ stored a null object?
strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GOTO_OPCODE(ip) @ jump to next instruction
@@ -9366,16 +9365,15 @@
b common_exceptionThrown @ no, handle exception
/* continuation for OP_SPUT_OBJECT_VOLATILE */
-.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0, method in r9
+.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0
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
+ ldr r9, [r0, #offField_clazz] @ r9<- field->clazz
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
+ str r1, [r0, #offStaticField_value] @ field<- vAA
cmp r1, #0 @ stored a null object?
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-armv5te.S b/vm/mterp/out/InterpAsm-armv5te.S
index c444a5f..e6abac5 100644
--- a/vm/mterp/out/InterpAsm-armv5te.S
+++ b/vm/mterp/out/InterpAsm-armv5te.S
@@ -3065,8 +3065,8 @@
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 r9, [rGLUE, #offGlue_method] @ r9<- current method
EXPORT_PC() @ resolve() could throw, so export now
ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
@@ -8078,8 +8078,8 @@
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 r9, [rGLUE, #offGlue_method] @ r9<- current method
EXPORT_PC() @ resolve() could throw, so export now
ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
@@ -9192,16 +9192,15 @@
b common_exceptionThrown @ no, handle exception
/* continuation for OP_SPUT_OBJECT */
-.LOP_SPUT_OBJECT_finish: @ field ptr in r0, method in r9
+.LOP_SPUT_OBJECT_finish: @ field ptr in r0
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
+ ldr r9, [r0, #offField_clazz] @ r9<- field->clazz
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
+ str r1, [r0, #offStaticField_value] @ field<- vAA
cmp r1, #0 @ stored a null object?
strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GOTO_OPCODE(ip) @ jump to next instruction
@@ -9824,16 +9823,15 @@
b common_exceptionThrown @ no, handle exception
/* continuation for OP_SPUT_OBJECT_VOLATILE */
-.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0, method in r9
+.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0
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
+ ldr r9, [r0, #offField_clazz] @ r9<- field->clazz
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
+ str r1, [r0, #offStaticField_value] @ field<- vAA
cmp r1, #0 @ stored a null object?
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-armv7-a-neon.S b/vm/mterp/out/InterpAsm-armv7-a-neon.S
index 035a11f..3ffd35d 100644
--- a/vm/mterp/out/InterpAsm-armv7-a-neon.S
+++ b/vm/mterp/out/InterpAsm-armv7-a-neon.S
@@ -3043,8 +3043,8 @@
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 r9, [rGLUE, #offGlue_method] @ r9<- current method
EXPORT_PC() @ resolve() could throw, so export now
ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
@@ -7706,8 +7706,8 @@
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 r9, [rGLUE, #offGlue_method] @ r9<- current method
EXPORT_PC() @ resolve() could throw, so export now
ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
@@ -8668,16 +8668,15 @@
b common_exceptionThrown @ no, handle exception
/* continuation for OP_SPUT_OBJECT */
-.LOP_SPUT_OBJECT_finish: @ field ptr in r0, method in r9
+.LOP_SPUT_OBJECT_finish: @ field ptr in r0
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
+ ldr r9, [r0, #offField_clazz] @ r9<- field->clazz
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
+ str r1, [r0, #offStaticField_value] @ field<- vAA
cmp r1, #0 @ stored a null object?
strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GOTO_OPCODE(ip) @ jump to next instruction
@@ -9300,16 +9299,15 @@
b common_exceptionThrown @ no, handle exception
/* continuation for OP_SPUT_OBJECT_VOLATILE */
-.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0, method in r9
+.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0
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
+ ldr r9, [r0, #offField_clazz] @ r9<- field->clazz
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
+ str r1, [r0, #offStaticField_value] @ field<- vAA
cmp r1, #0 @ stored a null object?
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-armv7-a.S b/vm/mterp/out/InterpAsm-armv7-a.S
index 41e3584..ac5b2c3 100644
--- a/vm/mterp/out/InterpAsm-armv7-a.S
+++ b/vm/mterp/out/InterpAsm-armv7-a.S
@@ -3043,8 +3043,8 @@
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 r9, [rGLUE, #offGlue_method] @ r9<- current method
EXPORT_PC() @ resolve() could throw, so export now
ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
@@ -7706,8 +7706,8 @@
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 r9, [rGLUE, #offGlue_method] @ r9<- current method
EXPORT_PC() @ resolve() could throw, so export now
ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveStaticField @ r0<- resolved StaticField ptr
@@ -8668,16 +8668,15 @@
b common_exceptionThrown @ no, handle exception
/* continuation for OP_SPUT_OBJECT */
-.LOP_SPUT_OBJECT_finish: @ field ptr in r0, method in r9
+.LOP_SPUT_OBJECT_finish: @ field ptr in r0
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
+ ldr r9, [r0, #offField_clazz] @ r9<- field->clazz
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
+ str r1, [r0, #offStaticField_value] @ field<- vAA
cmp r1, #0 @ stored a null object?
strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head
GOTO_OPCODE(ip) @ jump to next instruction
@@ -9300,16 +9299,15 @@
b common_exceptionThrown @ no, handle exception
/* continuation for OP_SPUT_OBJECT_VOLATILE */
-.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0, method in r9
+.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0
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
+ ldr r9, [r0, #offField_clazz] @ r9<- field->clazz
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
+ str r1, [r0, #offStaticField_value] @ field<- vAA
cmp r1, #0 @ stored a null object?
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-x86.S b/vm/mterp/out/InterpAsm-x86.S
index 6f1601f..67df136 100644
--- a/vm/mterp/out/InterpAsm-x86.S
+++ b/vm/mterp/out/InterpAsm-x86.S
@@ -7686,11 +7686,10 @@
.LOP_SPUT_OBJECT_continue:
movl %ecx,offStaticField_value(%eax) # do the store
testl %ecx,%ecx # stored null object ptr?
- GET_GLUE(%ecx)
FETCH_INST_WORD(2)
- movl offGlue_method(%ecx),%eax # eax<- current method
je 1f # skip card mark if null
- movl offMethod_clazz(%eax),%eax # eax<- method_>clazz
+ GET_GLUE(%ecx)
+ movl offField_clazz(%eax),%eax # eax<- field->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
@@ -8744,11 +8743,10 @@
.LOP_SPUT_OBJECT_VOLATILE_continue:
movl %ecx,offStaticField_value(%eax) # do the store
testl %ecx,%ecx # stored null object ptr?
- GET_GLUE(%ecx)
FETCH_INST_WORD(2)
- movl offGlue_method(%ecx),%eax # eax<- current method
je 1f # skip card mark if null
- movl offMethod_clazz(%eax),%eax # eax<- method_>clazz
+ GET_GLUE(%ecx)
+ movl offField_clazz(%eax),%eax # eax<- field->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_SPUT_OBJECT.S b/vm/mterp/x86/OP_SPUT_OBJECT.S
index 91a6ca7..13fa860 100644
--- a/vm/mterp/x86/OP_SPUT_OBJECT.S
+++ b/vm/mterp/x86/OP_SPUT_OBJECT.S
@@ -23,11 +23,10 @@
.L${opcode}_continue:
movl %ecx,offStaticField_value(%eax) # do the store
testl %ecx,%ecx # stored null object ptr?
- GET_GLUE(%ecx)
FETCH_INST_WORD(2)
- movl offGlue_method(%ecx),%eax # eax<- current method
je 1f # skip card mark if null
- movl offMethod_clazz(%eax),%eax # eax<- method_>clazz
+ GET_GLUE(%ecx)
+ movl offField_clazz(%eax),%eax # eax<- field->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