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