diff options
| author | buzbee <buzbee@google.com> | 2010-09-27 11:30:22 -0700 |
|---|---|---|
| committer | buzbee <buzbee@google.com> | 2010-09-28 10:54:48 -0700 |
| commit | d82097f6b409c5cd48568e54eb701604c3cceb18 (patch) | |
| tree | a9eb6d7e9e226df033759811de9cd49c18921db6 | |
| parent | e8edf08f04ecbe37f3e18a650a7c9002ceee4275 (diff) | |
| download | android_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.c | 19 | ||||
| -rw-r--r-- | vm/mterp/armv5te/OP_APUT_OBJECT.S | 15 | ||||
| -rw-r--r-- | vm/mterp/armv5te/OP_FILLED_NEW_ARRAY.S | 2 | ||||
| -rw-r--r-- | vm/mterp/armv5te/OP_IPUT_OBJECT.S | 3 | ||||
| -rw-r--r-- | vm/mterp/armv5te/OP_IPUT_OBJECT_QUICK.S | 2 | ||||
| -rw-r--r-- | vm/mterp/armv5te/OP_SPUT_OBJECT.S | 9 | ||||
| -rw-r--r-- | vm/mterp/out/InterpAsm-armv4t.S | 45 | ||||
| -rw-r--r-- | vm/mterp/out/InterpAsm-armv5te-vfp.S | 45 | ||||
| -rw-r--r-- | vm/mterp/out/InterpAsm-armv5te.S | 45 | ||||
| -rw-r--r-- | vm/mterp/out/InterpAsm-armv7-a-neon.S | 45 | ||||
| -rw-r--r-- | vm/mterp/out/InterpAsm-armv7-a.S | 45 | ||||
| -rw-r--r-- | vm/mterp/out/InterpAsm-x86.S | 32 | ||||
| -rw-r--r-- | vm/mterp/x86/OP_APUT_OBJECT.S | 6 | ||||
| -rw-r--r-- | vm/mterp/x86/OP_FILLED_NEW_ARRAY.S | 2 | ||||
| -rw-r--r-- | vm/mterp/x86/OP_IPUT_OBJECT.S | 2 | ||||
| -rw-r--r-- | vm/mterp/x86/OP_IPUT_OBJECT_QUICK.S | 2 | ||||
| -rw-r--r-- | vm/mterp/x86/OP_SPUT_OBJECT.S | 8 |
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 |
