summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler_llvm/method_compiler.cc12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index c2e03cb13a..3612d2413a 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -1675,7 +1675,17 @@ void MethodCompiler::EmitInsn_Neg(uint32_t dex_pc,
void MethodCompiler::EmitInsn_Not(uint32_t dex_pc,
Instruction const* insn,
JType op_jty) {
- // UNIMPLEMENTED(WARNING);
+
+ Instruction::DecodedInstruction dec_insn(insn);
+
+ DCHECK(op_jty == kInt || op_jty == kLong) << op_jty;
+
+ llvm::Value* src_value = EmitLoadDalvikReg(dec_insn.vB_, op_jty, kAccurate);
+ llvm::Value* result_value =
+ irb_.CreateXor(src_value, static_cast<uint64_t>(-1));
+
+ EmitStoreDalvikReg(dec_insn.vA_, op_jty, kAccurate, result_value);
+
irb_.CreateBr(GetNextBasicBlock(dex_pc));
}