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