14185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee%default { "postbarrier":"@ no-op ", "prebarrier":"@ no-op " }
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "executed"
3919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee%verify "field already resolved"
4919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee%verify "field not yet resolved"
5919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee%verify "field cannot be resolved"
6919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    /*
7919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * 32-bit SPUT handler for objects
8919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     *
9919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: sput-object, sput-object-volatile
10919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     */
11919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    /* op vAA, field@BBBB */
129f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
13919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    FETCH(r1, 1)                        @ r1<- field ref BBBB
149a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
159a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
16919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    cmp     r0, #0                      @ is resolved entry null?
179a3147c7412f4794434b4c2604aa2ba784867774buzbee    beq     .L${opcode}_resolve         @ yes, do resolve
18b78c76f88ea42e7a3b295c210ca9ee86e7290043buzbee.L${opcode}_finish:   @ field ptr in r0
19919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    mov     r2, rINST, lsr #8           @ r2<- AA
20919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
21919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    GET_VREG(r1, r2)                    @ r1<- fp[AA]
229f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
23b78c76f88ea42e7a3b295c210ca9ee86e7290043buzbee    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
24919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
254185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee    $prebarrier                        @ releasing store
269a3147c7412f4794434b4c2604aa2ba784867774buzbee    b       .L${opcode}_end
279a3147c7412f4794434b4c2604aa2ba784867774buzbee%break
289a3147c7412f4794434b4c2604aa2ba784867774buzbee
299a3147c7412f4794434b4c2604aa2ba784867774buzbee
309a3147c7412f4794434b4c2604aa2ba784867774buzbee.L${opcode}_end:
31b78c76f88ea42e7a3b295c210ca9ee86e7290043buzbee    str     r1, [r0, #offStaticField_value]  @ field<- vAA
324185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee    $postbarrier
33919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    cmp     r1, #0                      @ stored a null object?
34d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
35919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    GOTO_OPCODE(ip)                     @ jump to next instruction
369a3147c7412f4794434b4c2604aa2ba784867774buzbee
379a3147c7412f4794434b4c2604aa2ba784867774buzbee    /* Continuation if the field has not yet been resolved.
389a3147c7412f4794434b4c2604aa2ba784867774buzbee     * r1:  BBBB field ref
399a3147c7412f4794434b4c2604aa2ba784867774buzbee     * r10: dvmDex->pResFields
409a3147c7412f4794434b4c2604aa2ba784867774buzbee     */
419a3147c7412f4794434b4c2604aa2ba784867774buzbee.L${opcode}_resolve:
429a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
439a3147c7412f4794434b4c2604aa2ba784867774buzbee#if defined(WITH_JIT)
449a3147c7412f4794434b4c2604aa2ba784867774buzbee    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
459a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
469a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()                         @ resolve() could throw, so export now
479a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
489a3147c7412f4794434b4c2604aa2ba784867774buzbee    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
499a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r0, #0                      @ success?
509a3147c7412f4794434b4c2604aa2ba784867774buzbee    beq     common_exceptionThrown      @ no, handle exception
519a3147c7412f4794434b4c2604aa2ba784867774buzbee#if defined(WITH_JIT)
529a3147c7412f4794434b4c2604aa2ba784867774buzbee    /*
539a3147c7412f4794434b4c2604aa2ba784867774buzbee     * If the JIT is actively building a trace we need to make sure
549a3147c7412f4794434b4c2604aa2ba784867774buzbee     * that the field is fully resolved before including this instruction.
559a3147c7412f4794434b4c2604aa2ba784867774buzbee     */
569a3147c7412f4794434b4c2604aa2ba784867774buzbee    bl      common_verifyField
579a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
589a3147c7412f4794434b4c2604aa2ba784867774buzbee    b       .L${opcode}_finish          @ resume
599a3147c7412f4794434b4c2604aa2ba784867774buzbee
60