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 */
119f601a917c8878204482c37aec7005054b6776fabuzbee    movl    rSELF,%ecx
12a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    SPILL(rIBASE)                               # preserve rIBASE
13a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    movzwl  2(rPC),rIBASE                       # rIBASE<- 0000CCCC
14a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
15f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    movzbl  rINSTbl,%ecx                        # ecx<- BA
16f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    sarl    $$4,%ecx                            # ecx<- B
17f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
18f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    andb    $$0xf,rINSTbl                       # rINST<- A
19f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
20a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    movl    (%eax,rIBASE,4),%eax                # resolved entry
21f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    testl   %eax,%eax                           # is resolved entry null?
22f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    jne     .L${opcode}_finish                  # no, already resolved
23a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    movl    rIBASE,OUT_ARG1(%esp)               # for dvmResolveInstField
24a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    movl    rSELF,rIBASE
25f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    EXPORT_PC
26a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
27a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
28f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    SPILL_TMP1(%ecx)                            # save objpointer across call
29f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    movl    rPC,OUT_ARG0(%esp)                  # pass in method->clazz
30f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    call    dvmResolveInstField                 #  ... to dvmResolveInstField
31f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    UNSPILL_TMP1(%ecx)
32f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    testl   %eax,%eax                           # returns InstrField ptr
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .L${opcode}_finish
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_finish:
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
41f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee     *   rINST holds A
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
43f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
44f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    testl   %ecx,%ecx                           # object null?
45f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    je      common_errNullObject                # object was null
46f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    leal    (%ecx,%eax,1),%eax                  # eax<- address of field
47f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    movl    (%eax),%ecx                         # ecx<- lsw
48f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    movl    4(%eax),%eax                        # eax<- msw
49f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    SET_VREG_WORD %ecx rINST 0
50a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    FETCH_INST_OPCODE 2 %ecx
51a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    UNSPILL(rIBASE)                             # restore rIBASE
52f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    SET_VREG_WORD %eax rINST 1
53f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    ADVANCE_PC 2
54a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    GOTO_NEXT_R %ecx
55