1a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham%default {"volatile":"0"}
2a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham%verify "executed"
3a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham%verify "field already resolved"
4a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham%verify "field not yet resolved"
5a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham%verify "field cannot be resolved"
6a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    /*
7a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham     * 64-bit SPUT handler.
8a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham     */
9a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    # sput-wide vAA, field                 /* BBBB */
10a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
11a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    FETCH(a1, 1)                           #  a1 <- field ref BBBB
12a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
13a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    GET_OPA(t0)                            #  t0 <- AA
14a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    LOAD_eas2(a2, rBIX, a1)                #  a2 <- resolved StaticField ptr
15a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    EAS2(rOBJ, rFP, t0)                    #  rOBJ<- &fp[AA]
16a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    # is resolved entry null?
17a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    beqz      a2, .L${opcode}_resolve      #  yes, do resolve
18a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham.L${opcode}_finish:                        #  field ptr in a2, AA in rOBJ
19a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
20a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    LOAD64(a0, a1, rOBJ)                   #  a0/a1 <- vAA/vAA+1
21a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    GET_INST_OPCODE(rBIX)                  #  extract opcode from rINST
22a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    .if $volatile
23a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    addu    a2, offStaticField_value       #  a2<- pointer to data
24a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    JAL(dvmQuasiAtomicSwap64Sync)          #  stores a0/a1 into addr a2
25a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    .else
26a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    STORE64_off(a0, a1, a2, offStaticField_value) #  field <- vAA/vAA+1
27a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    .endif
28a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    GOTO_OPCODE(rBIX)                      #  jump to next instruction
29a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham%break
30a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
31a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    /*
32a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham     * Continuation if the field has not yet been resolved.
33a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham     *  a1:  BBBB field ref
34a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham     *  rOBJ:  &fp[AA]
35a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham     *  rBIX: dvmDex->pResFields
36a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham     *
37a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham     * Returns StaticField pointer in a2.
38a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham     */
39a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham.L${opcode}_resolve:
40a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    LOAD_rSELF_method(a2)                  #  a2 <- current method
41a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#if defined(WITH_JIT)
42a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
43a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#endif
44a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    EXPORT_PC()                            #  resolve() could throw, so export now
45a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
46a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
47a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    # success ?
48a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    move      a0, v0
49a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    beqz      v0, common_exceptionThrown   #  no, handle exception
50a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#if defined(WITH_JIT)
51a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    /*
52a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham     * If the JIT is actively building a trace we need to make sure
53a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham     * that the field is fully resolved before including this instruction.
54a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham     */
55a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    JAL(common_verifyField)
56a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#endif
57a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    move      a2, v0
58a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    b         .L${opcode}_finish           # resume
59