From a32d452ee6792663a1d73d4b082c224a20c3caa4 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sun, 11 Dec 2016 12:34:00 +0800 Subject: Trans C - A few extra intrinsics, fix atomic cxchg --- src/trans/codegen_c.cpp | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index a8fe0b0b..6bac1e09 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -41,7 +41,9 @@ namespace { << "#include \n" << "#include \n" << "#include \n" - << "#include \n" + << "#include \n" // atomic_* + << "#include \n" // abort + << "#include \n" // mem* << "typedef uint32_t CHAR;\n" << "typedef struct { } tUNIT;\n" << "typedef struct { } tBANG;\n" @@ -634,9 +636,10 @@ namespace { } }; auto emit_atomic_cxchg = [&](const auto& e, const char* o_succ, const char* o_fail) { - emit_lvalue(e.ret_val); m_of << " = atomic_compare_exchange_strong_explicit("; + emit_lvalue(e.ret_val); m_of << "._0 = "; emit_lvalue(e.args.at(1)); m_of << ";\n\t"; + emit_lvalue(e.ret_val); m_of << "._1 = atomic_compare_exchange_strong_explicit("; emit_lvalue(e.args.at(0)); - m_of << ", &"; emit_lvalue(e.args.at(1)); + m_of << ", &"; emit_lvalue(e.ret_val); m_of << "._0"; m_of << ", "; emit_lvalue(e.args.at(2)); m_of << ", "< Single-ordering atomics else if( name == "atomic_xadd" || name.compare(0, 7+4+1, "atomic_xadd_") == 0 ) { -- cgit v1.2.3