diff options
| author | 2012-01-02 23:29:32 +0800 | |
|---|---|---|
| committer | 2012-02-17 00:01:03 -0800 | |
| commit | 8dabb43c4640b6f64a3c288d670b97ed1cd7b537 (patch) | |
| tree | 9b3fd1f151862a575b270d20379a9630d69a985f /src/compiler_llvm/method_compiler.cc | |
| parent | e27fdbb2c5b4a53b3c40570d861fd62d9fd3601c (diff) | |
Implement aput* instructions.
Change-Id: I02ad144690405fd0e6a8c19476e3debe87a6c0f0
Diffstat (limited to 'src/compiler_llvm/method_compiler.cc')
| -rw-r--r-- | src/compiler_llvm/method_compiler.cc | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc index 4864eb43b1..596ae876e3 100644 --- a/src/compiler_llvm/method_compiler.cc +++ b/src/compiler_llvm/method_compiler.cc @@ -1667,7 +1667,23 @@ void MethodCompiler::EmitInsn_AGet(uint32_t dex_pc, void MethodCompiler::EmitInsn_APut(uint32_t dex_pc, Instruction const* insn, JType elem_jty) { - // UNIMPLEMENTED(WARNING); + + Instruction::DecodedInstruction dec_insn(insn); + + llvm::Value* array_addr = EmitLoadDalvikReg(dec_insn.vB_, kObject, kAccurate); + llvm::Value* index_value = EmitLoadDalvikReg(dec_insn.vC_, kInt, kAccurate); + + EmitGuard_ArrayException(dex_pc, array_addr, index_value); + + llvm::Type* elem_type = irb_.getJType(elem_jty, kArray); + + llvm::Value* array_elem_addr = + EmitArrayGEP(array_addr, index_value, elem_type); + + llvm::Value* new_value = EmitLoadDalvikReg(dec_insn.vA_, elem_jty, kArray); + + irb_.CreateStore(new_value, array_elem_addr); + irb_.CreateBr(GetNextBasicBlock(dex_pc)); } |