summaryrefslogtreecommitdiff
path: root/src/trans/codegen_c.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2017-05-15 12:13:35 +0800
committerJohn Hodge <tpg@ucc.asn.au>2017-05-15 12:13:35 +0800
commit53095a15c500b5bb216727a86f21cd7fc9530e3f (patch)
tree09c7d4cfd05cce98aa9554e0da4049985b4b6a98 /src/trans/codegen_c.cpp
parent7e6dbc2b30d68be64b7caa18b9790148c99ecd8e (diff)
downloadmrust-53095a15c500b5bb216727a86f21cd7fc9530e3f.tar.gz
Codegen C - Fix some edge cases with floats, add newer intrinsics
Diffstat (limited to 'src/trans/codegen_c.cpp')
-rw-r--r--src/trans/codegen_c.cpp22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp
index 2d7a521d..5ea03eca 100644
--- a/src/trans/codegen_c.cpp
+++ b/src/trans/codegen_c.cpp
@@ -1062,7 +1062,15 @@ namespace {
}
),
(Float,
- m_of << e;
+ if( ::std::isnan(e) ) {
+ m_of << "NAN";
+ }
+ else if( ::std::isinf(e) ) {
+ m_of << "INFINITY";
+ }
+ else {
+ m_of << e;
+ }
),
(BorrowOf,
TU_MATCHA( (e.m_data), (pe),
@@ -2273,6 +2281,12 @@ namespace {
else if( name == "unchecked_rem" ) {
emit_lvalue(e.ret_val); m_of << " = "; emit_param(e.args.at(0)); m_of << " % "; emit_param(e.args.at(1));
}
+ else if( name == "unchecked_shl" ) {
+ emit_lvalue(e.ret_val); m_of << " = "; emit_param(e.args.at(0)); m_of << " << "; emit_param(e.args.at(1));
+ }
+ else if( name == "unchecked_shr" ) {
+ emit_lvalue(e.ret_val); m_of << " = "; emit_param(e.args.at(0)); m_of << " >> "; emit_param(e.args.at(1));
+ }
// Bit Twiddling
// - CounT Leading Zeroes
// - CounT Trailing Zeroes
@@ -2463,6 +2477,9 @@ namespace {
auto ordering = H::get_atomic_ordering(mir_res, name, 7+6);
m_of << "atomic_thread_fence(" << ordering << ")";
}
+ else if( name == "atomic_singlethreadfence" || name.compare(0, 7+18, "atomic_singlethreadfence_") == 0 ) {
+ // TODO: Does this matter?
+ }
else {
MIR_BUG(mir_res, "Unknown intrinsic '" << name << "'");
}
@@ -2718,7 +2735,8 @@ namespace {
emit_literal(ty, lit, {});
),
(Float,
- emit_dst(); m_of << " = " << e;
+ emit_dst(); m_of << " = ";
+ emit_literal(ty, lit, {});
),
(BorrowOf,
if( ty.m_data.is_Function() )