1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee%default { "store":"movl", "reg":"rINST", "sqnum":"0" } 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "executed" 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "null object" 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "field already resolved" 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "field not yet resolved" 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "field cannot be resolved" 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field put. 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 149f601a917c8878204482c37aec7005054b6776fabuzbee movl rSELF,%ecx 15a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee SPILL (rIBASE) 16a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee movzwl 2(rPC),rIBASE # rIBASE<- 0000CCCC 17a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee movl offThread_methodClassDex(%ecx),%eax # eax<- DvmDex 18f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movzbl rINSTbl,%ecx # ecx<- BA 19f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee sarl $$4,%ecx # ecx<- B 20f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movl offDvmDex_pResFields(%eax),%eax # eax<- pDvmDex->pResFields 21f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee andb $$0xf,rINSTbl # rINST<- A 22f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee GET_VREG_R %ecx %ecx # ecx<- fp[B], the object ptr 23a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee movl (%eax,rIBASE,4),%eax # resolved entry 24f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee testl %eax,%eax # is resolved entry null? 25f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee jne .L${opcode}_finish # no, already resolved 26a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee movl rIBASE,OUT_ARG1(%esp) 27a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee movl rSELF,rIBASE 28f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee EXPORT_PC 29a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee movl offThread_method(rIBASE),rIBASE # rIBASE<- current method 30a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee movl offMethod_clazz(rIBASE),rIBASE # rIBASE<- method->clazz 31f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee SPILL_TMP1(%ecx) # save obj pointer across call 32a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee movl rIBASE,OUT_ARG0(%esp) # pass in method->clazz 33f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee call dvmResolveInstField # ... to dvmResolveInstField 34f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee UNSPILL_TMP1(%ecx) 35f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee testl %eax,%eax # returns InstrField ptr 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jne .L${opcode}_finish 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmp common_exceptionThrown 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_finish: 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * eax holds resolved field 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ecx holds object 44f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee * rINST holds A 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 46f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee GET_VREG_R rINST rINST # rINST<- v[A] 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl offInstField_byteOffset(%eax),%eax # eax<- byte offset of field 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project testl %ecx,%ecx # object null? 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project je common_errNullObject # object was null 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project $store $reg,(%ecx,%eax,1) # obj.field <- v[A](8/16/32 bits) 51a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee FETCH_INST_OPCODE 2 %ecx 52a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee UNSPILL(rIBASE) 53f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee ADVANCE_PC 2 54a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee GOTO_NEXT_R %ecx 55