summaryrefslogtreecommitdiff
path: root/src/compiler_llvm/method_compiler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler_llvm/method_compiler.cc')
-rw-r--r--src/compiler_llvm/method_compiler.cc25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index 59b31d49aa..3bd79c7ed9 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -1217,14 +1217,35 @@ void MethodCompiler::EmitInsn_LoadConstantClass(uint32_t dex_pc,
void MethodCompiler::EmitInsn_MonitorEnter(uint32_t dex_pc,
Instruction const* insn) {
- // UNIMPLEMENTED(WARNING);
+
+ Instruction::DecodedInstruction dec_insn(insn);
+
+ llvm::Value* object_addr =
+ EmitLoadDalvikReg(dec_insn.vA_, kObject, kAccurate);
+
+ // TODO: Slow path always. May not need NullPointerException check.
+ EmitGuard_NullPointerException(dex_pc, object_addr);
+
+ irb_.CreateCall(irb_.GetRuntime(LockObject), object_addr);
+ EmitGuard_ExceptionLandingPad(dex_pc);
+
irb_.CreateBr(GetNextBasicBlock(dex_pc));
}
void MethodCompiler::EmitInsn_MonitorExit(uint32_t dex_pc,
Instruction const* insn) {
- // UNIMPLEMENTED(WARNING);
+
+ Instruction::DecodedInstruction dec_insn(insn);
+
+ llvm::Value* object_addr =
+ EmitLoadDalvikReg(dec_insn.vA_, kObject, kAccurate);
+
+ EmitGuard_NullPointerException(dex_pc, object_addr);
+
+ irb_.CreateCall(irb_.GetRuntime(UnlockObject), object_addr);
+ EmitGuard_ExceptionLandingPad(dex_pc);
+
irb_.CreateBr(GetNextBasicBlock(dex_pc));
}