OP_IGET_WIDE.S revision f6c387128427e121477c1b32ad35cdcaa5101ba3
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 */ 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_GLUE(%ecx) 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SPILL(rIBASE) # need another reg 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movzwl 2(rPC),rIBASE # rIBASE<- 0000CCCC 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl offGlue_methodClassDex(%ecx),%eax # eax<- DvmDex 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movzbl rINST_HI,%ecx # ecx<- BA 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sarl $$4,%ecx # ecx<- B 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl offDvmDex_pResFields(%eax),%eax # eax<- pDvmDex->pResFields 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movzbl rINST_HI,rINST_FULL # rINST_FULL<- BA 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project andb $$0xf,rINST_LO # rINST_FULL<- A 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(%ecx,%ecx) # ecx<- fp[B], the object ptr 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl (%eax,rIBASE,4),%eax # resolved entry 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project testl %eax,%eax # is resolved entry null? 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jne .L${opcode}_finish # no, already resolved 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl rIBASE,OUT_ARG1(%esp) # needed by dvmResolveInstField 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_GLUE(rIBASE) 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmp .L${opcode}_resolve 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%break 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_resolve: 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SPILL(rPC) 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl offGlue_method(rIBASE),rPC # rPC<- current method 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project UNSPILL(rIBASE) 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl offMethod_clazz(rPC),rPC # rPC<- method->clazz 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SPILL_TMP(%ecx) # save object pointer across call 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl rPC,OUT_ARG0(%esp) # pass in method->clazz 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project call dvmResolveInstField # ... to dvmResolveInstField 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project UNSPILL_TMP(%ecx) 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project UNSPILL(rPC) 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project testl %eax,%eax # ... which returns InstrField ptr 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jne .L${opcode}_finish 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmp common_exceptionThrown 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_finish: 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * eax holds resolved field 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ecx holds object 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rIBASE is scratch, but needs to be unspilled 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rINST_FULL holds A 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl offInstField_byteOffset(%eax),%eax # eax<- byte offset of field 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project UNSPILL(rIBASE) 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project testl %ecx,%ecx # object null? 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project je common_errNullObject # object was null 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project leal (%ecx,%eax,1),%eax # eax<- address of field 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl (%eax),%ecx # ecx<- lsw 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl 4(%eax),%eax # eax<- msw 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG_WORD(%ecx,rINST_FULL,0) 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG_WORD(%eax,rINST_FULL,1) 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_INST_WORD(2) 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ADVANCE_PC(2) 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_NEXT 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 66