Merge "Fix SEGV when allocation does not fail in stack trace building" into dalvik-dev
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index bd1bd67..bc47a8d 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -1757,7 +1757,15 @@
 void MethodCompiler::EmitInsn_FNeg(uint32_t dex_pc,
                                    Instruction const* insn,
                                    JType op_jty) {
-  // UNIMPLEMENTED(WARNING);
+
+  Instruction::DecodedInstruction dec_insn(insn);
+
+  DCHECK(op_jty == kFloat || op_jty == kDouble) << op_jty;
+
+  llvm::Value* src_value = EmitLoadDalvikReg(dec_insn.vB_, op_jty, kAccurate);
+  llvm::Value* result_value = irb_.CreateFNeg(src_value);
+  EmitStoreDalvikReg(dec_insn.vA_, op_jty, kAccurate, result_value);
+
   irb_.CreateBr(GetNextBasicBlock(dex_pc));
 }
 
@@ -1766,7 +1774,17 @@
                                       Instruction const* insn,
                                       JType src_jty,
                                       JType dest_jty) {
-  // UNIMPLEMENTED(WARNING);
+
+  Instruction::DecodedInstruction dec_insn(insn);
+
+  DCHECK(src_jty == kInt || src_jty == kLong) << src_jty;
+  DCHECK(dest_jty == kFloat || dest_jty == kDouble) << dest_jty;
+
+  llvm::Value* src_value = EmitLoadDalvikReg(dec_insn.vB_, src_jty, kAccurate);
+  llvm::Type* dest_type = irb_.getJType(dest_jty, kAccurate);
+  llvm::Value* dest_value = irb_.CreateSIToFP(src_value, dest_type);
+  EmitStoreDalvikReg(dec_insn.vA_, dest_jty, kAccurate, dest_value);
+
   irb_.CreateBr(GetNextBasicBlock(dex_pc));
 }
 
@@ -1775,14 +1793,30 @@
                                       Instruction const* insn,
                                       JType src_jty,
                                       JType dest_jty) {
-  // UNIMPLEMENTED(WARNING);
+
+  Instruction::DecodedInstruction dec_insn(insn);
+
+  DCHECK(src_jty == kFloat || src_jty == kDouble) << src_jty;
+  DCHECK(dest_jty == kInt || dest_jty == kLong) << dest_jty;
+
+  llvm::Value* src_value = EmitLoadDalvikReg(dec_insn.vB_, src_jty, kAccurate);
+  llvm::Type* dest_type = irb_.getJType(dest_jty, kAccurate);
+  llvm::Value* dest_value = irb_.CreateFPToSI(src_value, dest_type);
+  EmitStoreDalvikReg(dec_insn.vA_, dest_jty, kAccurate, dest_value);
+
   irb_.CreateBr(GetNextBasicBlock(dex_pc));
 }
 
 
 void MethodCompiler::EmitInsn_FExt(uint32_t dex_pc,
                                    Instruction const* insn) {
-  // UNIMPLEMENTED(WARNING);
+
+  Instruction::DecodedInstruction dec_insn(insn);
+
+  llvm::Value* src_value = EmitLoadDalvikReg(dec_insn.vB_, kFloat, kAccurate);
+  llvm::Value* result_value = irb_.CreateFPExt(src_value, irb_.getJDoubleTy());
+  EmitStoreDalvikReg(dec_insn.vA_, kDouble, kAccurate, result_value);
+
   irb_.CreateBr(GetNextBasicBlock(dex_pc));
 }
 
diff --git a/src/object.cc b/src/object.cc
index 97634d5..27b85b0 100644
--- a/src/object.cc
+++ b/src/object.cc
@@ -393,7 +393,8 @@
 }
 
 void Method::SetInferredRegCategoryMap(const InferredRegCategoryMap* map) {
-  const InferredRegCategoryMap* existing_map = GetInferredRegCategoryMap();
+  const InferredRegCategoryMap* existing_map = GetFieldPtr<const InferredRegCategoryMap*>(
+      OFFSET_OF_OBJECT_MEMBER(Method, gc_map_), false);
 
   DCHECK(existing_map == NULL) << PrettyMethod(this);
   DCHECK(map != NULL) << PrettyMethod(this);
@@ -406,7 +407,7 @@
 void Method::ResetInferredRegCategoryMap() {
   delete GetInferredRegCategoryMap();
   SetFieldPtr<const InferredRegCategoryMap*>(
-    OFFSET_OF_OBJECT_MEMBER(Method, gc_map_), NULL, false);
+      OFFSET_OF_OBJECT_MEMBER(Method, gc_map_), NULL, false);
 }
 
 #endif