diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-12-15 11:06:10 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-12-15 11:06:10 -0800 |
commit | 567be43a95fc941e1f99491343927fc7ac6679da (patch) | |
tree | 2e69e234eb808798679fdd90b3811d02e95a5d08 | |
parent | 8baa3e012238480f98bb3a6992cfb5b8265d683d (diff) |
handle i64 to float, not just double
-rw-r--r-- | lib/Target/CppBackend/CallHandlers.h | 26 | ||||
-rw-r--r-- | lib/Transforms/NaCl/ExpandI64.cpp | 38 |
2 files changed, 44 insertions, 20 deletions
diff --git a/lib/Target/CppBackend/CallHandlers.h b/lib/Target/CppBackend/CallHandlers.h index 8e3326fe5f..3f3203676c 100644 --- a/lib/Target/CppBackend/CallHandlers.h +++ b/lib/Target/CppBackend/CallHandlers.h @@ -51,17 +51,29 @@ DEF_CALL_HANDLER(FPtoIHigh, { return getAssign(getCppName(CI), CI->getType()) + "Math_abs(" + Input + ") >= +1 ? " + Input + " > +0 ? (Math_min(+Math_floor(" + Input + " / +4294967296), +4294967295) | 0) >>> 0 : ~~+Math_ceil((" + Input + " - +(~~" + Input + " >>> 0)) / +4294967296) >>> 0 : 0"; }) -DEF_CALL_HANDLER(SItoFP, { +DEF_CALL_HANDLER(SItoF, { + // TODO: fround return getAssign(getCppName(CI), CI->getType()) + "(+" + getValueAsCastParenStr(CI->getArgOperand(0), ASM_UNSIGNED) + ") + " + "(+4294967296*(+" + getValueAsCastParenStr(CI->getArgOperand(1), ASM_SIGNED) + "))"; }) -DEF_CALL_HANDLER(UItoFP, { +DEF_CALL_HANDLER(UItoF, { + // TODO: fround return getAssign(getCppName(CI), CI->getType()) + "(+" + getValueAsCastParenStr(CI->getArgOperand(0), ASM_UNSIGNED) + ") + " + "(+4294967296*(+" + getValueAsCastParenStr(CI->getArgOperand(1), ASM_UNSIGNED) + "))"; }) -DEF_CALL_HANDLER(BItoFP, { +DEF_CALL_HANDLER(SItoD, { + return getAssign(getCppName(CI), CI->getType()) + "(+" + getValueAsCastParenStr(CI->getArgOperand(0), ASM_UNSIGNED) + ") + " + + "(+4294967296*(+" + getValueAsCastParenStr(CI->getArgOperand(1), ASM_SIGNED) + "))"; +}) + +DEF_CALL_HANDLER(UItoD, { + return getAssign(getCppName(CI), CI->getType()) + "(+" + getValueAsCastParenStr(CI->getArgOperand(0), ASM_UNSIGNED) + ") + " + + "(+4294967296*(+" + getValueAsCastParenStr(CI->getArgOperand(1), ASM_UNSIGNED) + "))"; +}) + +DEF_CALL_HANDLER(BItoD, { return "HEAP32[tempDoublePtr>>2] = " + getValueAsStr(CI->getArgOperand(0)) + ";" + "HEAP32[tempDoublePtr+4>>2] = " + getValueAsStr(CI->getArgOperand(1)) + ";" + getAssign(getCppName(CI), CI->getType()) + "HEAPF64[tempDoublePtr>>3]"; @@ -389,9 +401,11 @@ void setupCallHandlers() { SETUP_CALL_HANDLER(setHigh32); SETUP_CALL_HANDLER(FPtoILow); SETUP_CALL_HANDLER(FPtoIHigh); - SETUP_CALL_HANDLER(SItoFP); - SETUP_CALL_HANDLER(UItoFP); - SETUP_CALL_HANDLER(BItoFP); + SETUP_CALL_HANDLER(SItoF); + SETUP_CALL_HANDLER(UItoF); + SETUP_CALL_HANDLER(SItoD); + SETUP_CALL_HANDLER(UItoD); + SETUP_CALL_HANDLER(BItoD); 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 17a3d88ae1..f794d72ed5 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, *BItoFP; + Function *Add, *Sub, *Mul, *SDiv, *UDiv, *SRem, *URem, *LShr, *AShr, *Shl, *GetHigh, *SetHigh, *FPtoILow, *FPtoIHigh, *SItoF, *UItoF, *SItoD, *UItoD, *BItoD; void ensureFuncs(); @@ -477,11 +477,11 @@ void ExpandI64::splitInst(Instruction *I, DataLayout& DL) { Args.push_back(Zero); Function *F; switch (I->getOpcode()) { - case Instruction::SIToFP: F = SItoFP; break; - case Instruction::UIToFP: F = UItoFP; break; + case Instruction::SIToFP: F = I->getType() == Type::getDoubleTy(TheModule->getContext()) ? SItoD : SItoF; break; + case Instruction::UIToFP: F = I->getType() == Type::getDoubleTy(TheModule->getContext()) ? UItoD : UItoF; break; case Instruction::BitCast: { assert(I->getType() == Type::getDoubleTy(TheModule->getContext())); - F = BItoFP; + F = BItoD; break; } default: assert(0); @@ -704,6 +704,8 @@ void ExpandI64::ensureFuncs() { "setHigh32", TheModule); Type *Double = Type::getDoubleTy(TheModule->getContext()); + Type *Float = Type::getFloatTy(TheModule->getContext()); + SmallVector<Type*, 1> FPtoITypes; FPtoITypes.push_back(Double); FunctionType *FPtoIFunc = FunctionType::get(i32, FPtoITypes, false); @@ -712,16 +714,24 @@ void ExpandI64::ensureFuncs() { FPtoIHigh = Function::Create(FPtoIFunc, GlobalValue::ExternalLinkage, "FPtoIHigh", TheModule); - SmallVector<Type*, 2> ItoFPTypes; - ItoFPTypes.push_back(i32); - ItoFPTypes.push_back(i32); - FunctionType *ItoFPFunc = FunctionType::get(Double, ItoFPTypes, false); - SItoFP = Function::Create(ItoFPFunc, GlobalValue::ExternalLinkage, - "SItoFP", TheModule); - UItoFP = Function::Create(ItoFPFunc, GlobalValue::ExternalLinkage, - "UItoFP", TheModule); - BItoFP = Function::Create(ItoFPFunc, GlobalValue::ExternalLinkage, - "BItoFP", TheModule); + SmallVector<Type*, 2> ItoTypes; + ItoTypes.push_back(i32); + ItoTypes.push_back(i32); + + FunctionType *ItoFFunc = FunctionType::get(Float, ItoTypes, false); + SItoF = Function::Create(ItoFFunc, GlobalValue::ExternalLinkage, + "SItoF", TheModule); + UItoF = Function::Create(ItoFFunc, GlobalValue::ExternalLinkage, + "UItoF", TheModule); + + FunctionType *ItoDFunc = FunctionType::get(Double, ItoTypes, false); + SItoD = Function::Create(ItoDFunc, GlobalValue::ExternalLinkage, + "SItoD", TheModule); + UItoD = Function::Create(ItoDFunc, GlobalValue::ExternalLinkage, + "UItoD", TheModule); + + BItoD = Function::Create(ItoDFunc, GlobalValue::ExternalLinkage, + "BItoD", TheModule); } bool ExpandI64::runOnModule(Module &M) { |