diff options
author | John Hodge <tpg@mutabah.net> | 2017-01-02 16:58:35 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2017-01-02 16:58:35 +0800 |
commit | 379ca7a473e13fe242edcc847aaff341da58d9cc (patch) | |
tree | 4efbdaeaa27dd2914940eec232273535de2d73da | |
parent | 9858e3a7ac6b1eed7992bcc2e8c78ccb92610c8f (diff) | |
download | mrust-379ca7a473e13fe242edcc847aaff341da58d9cc.tar.gz |
Codegen C - Down-mask unsigned integer literals
-rw-r--r-- | src/trans/codegen_c.cpp | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index e29a1a10..a376721d 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -1016,9 +1016,37 @@ namespace { m_of << c; ), (Uint, + ::HIR::TypeRef tmp; + const auto& ty = mir_res.get_lvalue_type(tmp, e.dst); emit_lvalue(e.dst); m_of << " = "; - m_of << ::std::hex << "0x" << c << ::std::dec; + switch(ty.m_data.as_Primitive()) + { + case ::HIR::CoreType::U8: + m_of << ::std::hex << "0x" << (c & 0xFF) << ::std::dec; + break; + case ::HIR::CoreType::U16: + m_of << ::std::hex << "0x" << (c & 0xFFFF) << ::std::dec; + break; + case ::HIR::CoreType::U32: + m_of << ::std::hex << "0x" << (c & 0xFFFFFFFF) << ::std::dec; + break; + case ::HIR::CoreType::U64: + case ::HIR::CoreType::Usize: + m_of << ::std::hex << "0x" << c << ::std::dec; + break; + case ::HIR::CoreType::Char: + assert(0 <= c && c <= 0x10FFFF); + if( c < 256 ) { + m_of << c; + } + else { + m_of << ::std::hex << "0x" << c << ::std::dec; + } + break; + default: + MIR_BUG(*m_mir_res, "Invalid type for UInt literal - " << ty); + } ), (Float, emit_lvalue(e.dst); @@ -1958,7 +1986,8 @@ namespace { } ), (Integer, - emit_dst(); m_of << " = " << ::std::hex << "0x" << e << ::std::dec; + emit_dst(); m_of << " = "; + emit_literal(ty, lit, {}); ), (Float, emit_dst(); m_of << " = " << e; |