diff options
author | John Hodge <tpg@ucc.asn.au> | 2017-05-15 12:13:35 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2017-05-15 12:13:35 +0800 |
commit | 53095a15c500b5bb216727a86f21cd7fc9530e3f (patch) | |
tree | 09c7d4cfd05cce98aa9554e0da4049985b4b6a98 /src/trans/codegen_c.cpp | |
parent | 7e6dbc2b30d68be64b7caa18b9790148c99ecd8e (diff) | |
download | mrust-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.cpp | 22 |
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() ) |