diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/CppBackend/CallHandlers.h | 7 | ||||
-rw-r--r-- | lib/Transforms/NaCl/ExpandI64.cpp | 24 |
2 files changed, 30 insertions, 1 deletions
diff --git a/lib/Target/CppBackend/CallHandlers.h b/lib/Target/CppBackend/CallHandlers.h index 14c418704b..1120bb862a 100644 --- a/lib/Target/CppBackend/CallHandlers.h +++ b/lib/Target/CppBackend/CallHandlers.h @@ -61,6 +61,12 @@ DEF_CALL_HANDLER(UItoFP, { "(+4294967296*(+" + getValueAsCastParenStr(CI->getArgOperand(1), ASM_UNSIGNED) + "))"; }) +DEF_CALL_HANDLER(BItoFP, { + return "HEAP32[tempDoublePtr>>2] = " + getValueAsStr(CI->getArgOperand(0)) + ";" + + "HEAP32[tempDoublePtr+4>>2] = " + getValueAsStr(CI->getArgOperand(1)) + ";" + + getAssign(getCppName(CI), CI->getType()) + "HEAPF64[tempDoublePtr>>3]"; +}) + DEF_CALL_HANDLER(llvm_nacl_atomic_store_i32, { return "HEAP32[" + getValueAsStr(CI->getArgOperand(0)) + ">>2]=" + getValueAsStr(CI->getArgOperand(1)); }) @@ -381,6 +387,7 @@ void setupCallHandlers() { SETUP_CALL_HANDLER(FPtoIHigh); SETUP_CALL_HANDLER(SItoFP); SETUP_CALL_HANDLER(UItoFP); + SETUP_CALL_HANDLER(BItoFP); SETUP_CALL_HANDLER(llvm_nacl_atomic_store_i32); SETUP_CALL_HANDLER(llvm_memcpy_p0i8_p0i8_i32); SETUP_CALL_HANDLER(llvm_memset_p0i8_i32); diff --git a/lib/Transforms/NaCl/ExpandI64.cpp b/lib/Transforms/NaCl/ExpandI64.cpp index 061f4fbc53..d9b614634d 100644 --- a/lib/Transforms/NaCl/ExpandI64.cpp +++ b/lib/Transforms/NaCl/ExpandI64.cpp @@ -96,7 +96,7 @@ namespace { void finalizeInst(Instruction *I); - Function *Add, *Sub, *Mul, *SDiv, *UDiv, *SRem, *URem, *LShr, *AShr, *Shl, *GetHigh, *SetHigh, *FPtoILow, *FPtoIHigh, *SItoFP, *UItoFP; + Function *Add, *Sub, *Mul, *SDiv, *UDiv, *SRem, *URem, *LShr, *AShr, *Shl, *GetHigh, *SetHigh, *FPtoILow, *FPtoIHigh, *SItoFP, *UItoFP, *BItoFP; void ensureFuncs(); @@ -461,6 +461,14 @@ void ExpandI64::splitInst(Instruction *I, DataLayout& DL) { Split.LowHigh.High = H; break; } + case Instruction::BitCast: { + if (I->getType() == Type::getDoubleTy(TheModule->getContext())) { + // fall through to itofp + } else { + assert(0); // TODO: support the opposite bitcast + break; + } + } case Instruction::SIToFP: case Instruction::UIToFP: { ensureFuncs(); @@ -471,6 +479,11 @@ void ExpandI64::splitInst(Instruction *I, DataLayout& DL) { switch (I->getOpcode()) { case Instruction::SIToFP: F = SItoFP; break; case Instruction::UIToFP: F = UItoFP; break; + case Instruction::BitCast: { + assert(I->getType() == Type::getDoubleTy(TheModule->getContext())); + F = BItoFP; + break; + } default: assert(0); } Instruction *D = CopyDebug(CallInst::Create(F, Args, "", I), I); @@ -532,6 +545,13 @@ void ExpandI64::finalizeInst(Instruction *I) { Split.ToFix[1]->setOperand(0, LowHigh.High); break; } + case Instruction::BitCast: { + if (I->getType() == Type::getDoubleTy(TheModule->getContext())) { + // fall through to itofp + } else { + assert(0); // TODO: support the opposite bitcast + } + } case Instruction::SIToFP: case Instruction::UIToFP: { // generic fix of an instruction with one 64-bit input, and a legal output @@ -700,6 +720,8 @@ void ExpandI64::ensureFuncs() { "SItoFP", TheModule); UItoFP = Function::Create(ItoFPFunc, GlobalValue::ExternalLinkage, "UItoFP", TheModule); + BItoFP = Function::Create(ItoFPFunc, GlobalValue::ExternalLinkage, + "BItoFP", TheModule); } bool ExpandI64::runOnModule(Module &M) { |