1861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden%default {"volatile":"0"}
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "executed"
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 SPUT handler.
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* sput-wide vAA, field@BBBB */
109f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
129a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
149a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r2, [r10, r1, lsl #2]        @ r2<- resolved StaticField ptr
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
16861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    cmp     r2, #0                      @ is resolved entry null?
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .L${opcode}_resolve         @ yes, do resolve
18861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden.L${opcode}_finish: @ field ptr in r2, AA in r9
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
20861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
21861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GET_INST_OPCODE(r10)                @ extract opcode from rINST
22861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if $volatile
23861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r2, r2, #offStaticField_value @ r2<- pointer to data
244185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
25861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
26861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
27861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
28861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GOTO_OPCODE(r10)                    @ jump to next instruction
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%break
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
339a3147c7412f4794434b4c2604aa2ba784867774buzbee     *  r1:  BBBB field ref
349a3147c7412f4794434b4c2604aa2ba784867774buzbee     *  r9:  &fp[AA]
359a3147c7412f4794434b4c2604aa2ba784867774buzbee     *  r10: dvmDex->pResFields
36861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     *
37861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     * Returns StaticField pointer in r2.
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_resolve:
409f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
419a3147c7412f4794434b4c2604aa2ba784867774buzbee#if defined(WITH_JIT)
429a3147c7412f4794434b4c2604aa2ba784867774buzbee    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
439a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
48861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r2, r0                      @ copy to r2
499a3147c7412f4794434b4c2604aa2ba784867774buzbee    beq     common_exceptionThrown      @ no, handle exception
509a3147c7412f4794434b4c2604aa2ba784867774buzbee#if defined(WITH_JIT)
519a3147c7412f4794434b4c2604aa2ba784867774buzbee    /*
529a3147c7412f4794434b4c2604aa2ba784867774buzbee     * If the JIT is actively building a trace we need to make sure
539a3147c7412f4794434b4c2604aa2ba784867774buzbee     * that the field is fully resolved before including this instruction.
549a3147c7412f4794434b4c2604aa2ba784867774buzbee     */
559a3147c7412f4794434b4c2604aa2ba784867774buzbee    bl      common_verifyField
569a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
579a3147c7412f4794434b4c2604aa2ba784867774buzbee    b       .L${opcode}_finish          @ resume
58