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