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