aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-12-08 22:00:35 -0500
committerAlon Zakai <alonzakai@gmail.com>2013-12-08 22:00:35 -0500
commitb26cb01dccec605e70287ec876ec887f1828f113 (patch)
treec2fd75911a477d782b4a6f6691a6e31c6b2a5456 /lib/Transforms
parent157acdad8b75baa91beab3ac8a8ee336453bf818 (diff)
legalize fptosi
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/NaCl/ExpandI64.cpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/lib/Transforms/NaCl/ExpandI64.cpp b/lib/Transforms/NaCl/ExpandI64.cpp
index 6b3762b298..d81af616bf 100644
--- a/lib/Transforms/NaCl/ExpandI64.cpp
+++ b/lib/Transforms/NaCl/ExpandI64.cpp
@@ -90,7 +90,7 @@ namespace {
void finalizeInst(Instruction *I);
- Function *Add, *Sub, *Mul, *SDiv, *UDiv, *SRem, *URem, *LShr, *AShr, *Shl, *GetHigh, *SetHigh;
+ Function *Add, *Sub, *Mul, *SDiv, *UDiv, *SRem, *URem, *LShr, *AShr, *Shl, *GetHigh, *SetHigh, *FPtoILow, *FPtoIHigh;
void ensureFuncs();
@@ -394,6 +394,17 @@ void ExpandI64::splitInst(Instruction *I, DataLayout& DL) {
Split.ToFix.push_back(H); Split.LowHigh.High = H;
break;
}
+ case Instruction::FPToSI: {
+ ensureFuncs();
+ SmallVector<Value *, 1> Args;
+ Args.push_back(I->getOperand(0));
+ Instruction *L = CopyDebug(CallInst::Create(FPtoILow, Args, "", I), I);
+ Instruction *H = CopyDebug(CallInst::Create(FPtoIHigh, Args, "", I), I);
+ SplitInfo &Split = Splits[I];
+ Split.LowHigh.Low = L;
+ Split.LowHigh.High = H;
+ break;
+ }
default: {
dumpIR(I);
assert(0 && "some i64 thing we can't legalize yet");
@@ -430,7 +441,10 @@ void ExpandI64::finalizeInst(Instruction *I) {
switch (I->getOpcode()) {
case Instruction::Load:
case Instruction::SExt:
- case Instruction::ZExt: break; // input was legal
+ case Instruction::ZExt:
+ case Instruction::FPToSI: {
+ break; // input was legal
+ }
case Instruction::Trunc: {
assert(I->getType()->getIntegerBitWidth() == 32);
LowHighPair LowHigh = getLowHigh(I->getOperand(0));
@@ -563,6 +577,14 @@ void ExpandI64::ensureFuncs() {
FunctionType *SetHighFunc = FunctionType::get(V, SetHighArgTypes, false);
SetHigh = Function::Create(SetHighFunc, GlobalValue::ExternalLinkage,
"setHigh32", TheModule);
+
+ SmallVector<Type*, 1> FPtoITypes;
+ SetHighArgTypes.push_back(Type::getDoubleTy(TheModule->getContext()));
+ FunctionType *FPtoIFunc = FunctionType::get(i32, FPtoITypes, false);
+ FPtoILow = Function::Create(FPtoIFunc, GlobalValue::ExternalLinkage,
+ "FPtoILow", TheModule);
+ FPtoIHigh = Function::Create(FPtoIFunc, GlobalValue::ExternalLinkage,
+ "FPtoIHigh", TheModule);
}
bool ExpandI64::runOnModule(Module &M) {