OP_IGET_WIDE.S revision f3e177289ac078f18401cfd8eebafe584dd0d01f
1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "executed" 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "null object" 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "field already resolved" 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "field not yet resolved" 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "field cannot be resolved" 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 64-bit instance field get. 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 11f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movl rGLUE,%ecx 12f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movzwl 2(rPC),%edx # edx<- 0000CCCC 13f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movl offGlue_methodClassDex(%ecx),%eax # eax<- DvmDex 14f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movzbl rINSTbl,%ecx # ecx<- BA 15f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee sarl $$4,%ecx # ecx<- B 16f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movl offDvmDex_pResFields(%eax),%eax # eax<- pDvmDex->pResFields 17f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee andb $$0xf,rINSTbl # rINST<- A 18f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee GET_VREG_R %ecx %ecx # ecx<- fp[B], the object ptr 19f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movl (%eax,%edx,4),%eax # resolved entry 20f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee testl %eax,%eax # is resolved entry null? 21f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee jne .L${opcode}_finish # no, already resolved 22f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movl %edx,OUT_ARG1(%esp) # for dvmResolveInstField 23f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movl rGLUE,%edx 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmp .L${opcode}_resolve 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%break 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_resolve: 29f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee EXPORT_PC 30f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movl offGlue_method(%edx),%edx # edx<- current method 31f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movl offMethod_clazz(%edx),%edx # edx<- method->clazz 32f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee SPILL_TMP1(%ecx) # save objpointer across call 33f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movl rPC,OUT_ARG0(%esp) # pass in method->clazz 34f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee call dvmResolveInstField # ... to dvmResolveInstField 35f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee UNSPILL_TMP1(%ecx) 36f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee testl %eax,%eax # returns InstrField ptr 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jne .L${opcode}_finish 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmp common_exceptionThrown 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_finish: 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * eax holds resolved field 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ecx holds object 45f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee * rINST holds A 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 47f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movl offInstField_byteOffset(%eax),%eax # eax<- byte offset of field 48f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee testl %ecx,%ecx # object null? 49f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee je common_errNullObject # object was null 50f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee leal (%ecx,%eax,1),%eax # eax<- address of field 51f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movl (%eax),%ecx # ecx<- lsw 52f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movl 4(%eax),%eax # eax<- msw 53f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee FETCH_INST_OPCODE 2 %edx 54f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee SET_VREG_WORD %ecx rINST 0 55f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee SET_VREG_WORD %eax rINST 1 56f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee ADVANCE_PC 2 57f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee GOTO_NEXT_R %edx 58