aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/CppBackend
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/Target/CppBackend
parent157acdad8b75baa91beab3ac8a8ee336453bf818 (diff)
legalize fptosi
Diffstat (limited to 'lib/Target/CppBackend')
-rw-r--r--lib/Target/CppBackend/CallHandlers.h11
1 files changed, 11 insertions, 0 deletions
diff --git a/lib/Target/CppBackend/CallHandlers.h b/lib/Target/CppBackend/CallHandlers.h
index fba392160c..3e85c04fed 100644
--- a/lib/Target/CppBackend/CallHandlers.h
+++ b/lib/Target/CppBackend/CallHandlers.h
@@ -42,6 +42,15 @@ DEF_CALL_HANDLER(setHigh32, {
return "tempRet0 = " + getValueAsStr(CI->getArgOperand(0));
})
+DEF_CALL_HANDLER(FPtoILow, {
+ return getAssign(getCppName(CI), CI->getType()) + "(~~" + getValueAsStr(CI->getArgOperand(0)) + ")>>>0";
+})
+
+DEF_CALL_HANDLER(FPtoIHigh, {
+ std::string Input = getValueAsStr(CI->getArgOperand(0));
+ return getAssign(getCppName(CI), CI->getType()) + "Math_abs(" + Input + ") >= 1.0 ? " + Input + " > 0.0 ? (Math_min(+Math_floor(" + Input + " / 4294967296.0), 4294967295.0) | 0) >>> 0 : ~~+Math_ceil((" + Input + " - +(~~" + Input + " >>> 0)) / 4294967296.0) >>> 0 : 0)";
+})
+
DEF_CALL_HANDLER(llvm_nacl_atomic_store_i32, {
return "HEAP32[" + getValueAsStr(CI->getArgOperand(0)) + ">>2]=" + getValueAsStr(CI->getArgOperand(1));
})
@@ -94,6 +103,8 @@ void setupCallHandlers() {
SETUP_CALL_HANDLER(__default__);
SETUP_CALL_HANDLER(getHigh32);
SETUP_CALL_HANDLER(setHigh32);
+ SETUP_CALL_HANDLER(FPtoILow);
+ SETUP_CALL_HANDLER(FPtoIHigh);
SETUP_CALL_HANDLER(llvm_nacl_atomic_store_i32);
SETUP_CALL_HANDLER(llvm_memcpy_p0i8_p0i8_i32);
SETUP_CALL_HANDLER(llvm_memset_p0i8_i32);