1a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham%default { "postbarrier":"# no-op", "prebarrier":"# no-op" } 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 * General 32-bit SPUT handler. 8a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * 9a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * for: sput-object, sput-object-volatile 10a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */ 11a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* op vAA, field@BBBB */ 12a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham LOAD_rSELF_methodClassDex(a2) # a2 <- DvmDex 13a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham FETCH(a1, 1) # a1 <- field ref BBBB 14a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham LOAD_base_offDvmDex_pResFields(rBIX, a2) # rBIX <- dvmDex->pResFields 15a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham LOAD_eas2(a0, rBIX, a1) # a0 <- resolved StaticField ptr 16a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham bnez a0, .L${opcode}_finish # is resolved entry null? 17a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 18a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* Continuation if the field has not yet been resolved. 19a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * a1: BBBB field ref 20a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * rBIX: dvmDex->pResFields 21a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */ 22a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham LOAD_rSELF_method(a2) # a2 <- current method 23a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#if defined(WITH_JIT) 24a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham EAS2(rBIX, rBIX, a1) # rBIX<- &dvmDex->pResFields[field] 25a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#endif 26a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham EXPORT_PC() # resolve() may throw, so export now 27a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham LOAD_base_offMethod_clazz(a0, a2) # a0 <- method->clazz 28a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham JAL(dvmResolveStaticField) # v0 <- resolved StaticField ptr 29a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham move a0, v0 30a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham beqz v0, common_exceptionThrown # success? no, handle exception 31a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#if defined(WITH_JIT) 32a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* 33a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * If the JIT is actively building a trace we need to make sure 34a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * that the field is fully resolved before including this instruction. 35a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */ 36a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham JAL(common_verifyField) 37a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#endif 38a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham b .L${opcode}_finish # resume 39a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 40a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham%break 41a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham.L${opcode}_finish: # field ptr in a0 42a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham GET_OPA(a2) # a2 <- AA 43a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham FETCH_ADVANCE_INST(2) # advance rPC, load rINST 44a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham GET_VREG(a1, a2) # a1 <- fp[AA] 45a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham lw a2, offThread_cardTable(rSELF) # a2 <- card table base 46a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham lw t1, offField_clazz(a0) # t1 <- field->clazz 47a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham GET_INST_OPCODE(t0) # extract opcode from rINST 48a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham $prebarrier # releasing store 49a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sw a1, offStaticField_value(a0) # field <- vAA 50a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham $postbarrier 51a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham beqz a1, 1f 52a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham srl t2, t1, GC_CARD_SHIFT 53a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham addu t3, a2, t2 54a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sb a2, (t3) 55a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham1: 56a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham GOTO_OPCODE(t0) # jump to next instruction 57