aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Target/CppBackend/CallHandlers.h7
-rw-r--r--lib/Transforms/NaCl/ExpandI64.cpp24
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) {