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