diff options
author | John Hodge <tpg@mutabah.net> | 2019-11-10 20:39:40 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2019-11-10 20:39:40 +0800 |
commit | 8ddb05ad09a873375be6179d33a9bcd330112c43 (patch) | |
tree | c4c64ef6115fabf866893d58bc0c69b44bd957d5 | |
parent | a49bda9adff96a3bb5926ce1d6df8a199224976b (diff) | |
download | mrust-8ddb05ad09a873375be6179d33a9bcd330112c43.tar.gz |
Codegen C - Fix errors from travis OSX
-rw-r--r-- | src/trans/codegen_c.cpp | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index 85246749..20ff95cb 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -602,7 +602,12 @@ namespace { } else { - m_of << "static inline uint128_t __mrustc_bitrev128(uint128_t v) { if(v==0) return 0; uint128_t rv = ((uint128_t)__mrustc_bitrev64(v>>64))|((uint128_t)__mrustc_bitrev64(v)<<64); }\n"; + m_of << "static inline uint128_t __mrustc_bitrev128(uint128_t v) {" + << " if(v==0) return 0;" + << " uint128_t rv = ((uint128_t)__mrustc_bitrev64(v>>64))|((uint128_t)__mrustc_bitrev64(v)<<64);" + << " return rv;" + << " }\n" + ; } for(int sz = 8; sz <= 64; sz *= 2) { @@ -3949,9 +3954,15 @@ namespace { if (::std::strcmp(r, "{eax}") == 0 || ::std::strcmp(r, "{rax}") == 0) { return "a"; } + else if (::std::strcmp(r, "{ebx}") == 0 || ::std::strcmp(r, "{rbx}") == 0) { + return "b"; + } else if (::std::strcmp(r, "{ecx}") == 0 || ::std::strcmp(r, "{rcx}") == 0) { return "c"; } + else if (::std::strcmp(r, "{edx}") == 0 || ::std::strcmp(r, "{rdx}") == 0) { + return "d"; + } else { return r; } @@ -4010,12 +4021,16 @@ namespace { { const auto& v = e.inputs[i]; if (i != 0) m_of << ", "; + // TODO: If this is the same reg as an output, use the output index m_of << "\"" << H::convert_reg(v.first.c_str()) << "\" ("; emit_lvalue(v.second); m_of << ")"; } m_of << ": "; for (unsigned int i = 0; i < e.clobbers.size(); i++) { if (i != 0) m_of << ", "; + if( e.tpl == "cpuid\n" && e.clobbers[i] == "rbx" ) { + continue; + } m_of << "\"" << e.clobbers[i] << "\""; } m_of << ");\n"; @@ -5214,6 +5229,7 @@ namespace { auto ordering = get_atomic_ordering(name, 7+4+1); const auto& ty = params.m_types.at(0); emit_lvalue(e.ret_val); m_of << " = __mrustc_atomicloop" << get_prim_size(ty) << "("; + m_of << "(volatile "; emit_ctype(ty); m_of << "*)"; emit_param(e.args.at(0)); m_of << ", "; emit_param(e.args.at(1)); if( m_compiler == Compiler::Gcc ) { @@ -5236,6 +5252,7 @@ namespace { const auto& ty = params.m_types.at(0); const char* op = (name.c_str()[7+1] == 'a' ? "imax" : "imin"); // m'a'x vs m'i'n emit_lvalue(e.ret_val); m_of << " = __mrustc_atomicloop" << get_prim_size(ty) << "("; + m_of << "(volatile "; emit_ctype(ty); m_of << "*)"; emit_param(e.args.at(0)); m_of << ", "; emit_param(e.args.at(1)); if( m_compiler == Compiler::Gcc ) { @@ -5250,6 +5267,7 @@ namespace { const auto& ty = params.m_types.at(0); const char* op = (name.c_str()[7+2] == 'a' ? "umax" : "umin"); // m'a'x vs m'i'n emit_lvalue(e.ret_val); m_of << " = __mrustc_atomicloop" << get_prim_size(ty) << "("; + m_of << "(volatile "; emit_ctype(ty); m_of << "*)"; emit_param(e.args.at(0)); m_of << ", "; emit_param(e.args.at(1)); if( m_compiler == Compiler::Gcc ) { |