summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-12-16 22:59:06 +0800
committerJohn Hodge <tpg@mutabah.net>2016-12-16 22:59:06 +0800
commitaa17374e03e4bcd5060576dfb8b63a46694d3852 (patch)
tree791880ca020b674829dc0cf836e01c7a2143dded
parente5d9f5037803892a0f3dfd24dbca982ed8d22839 (diff)
downloadmrust-aa17374e03e4bcd5060576dfb8b63a46694d3852.tar.gz
Trans C - Atomic add
-rw-r--r--src/trans/codegen_c.cpp7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp
index 937db11f..cee8228b 100644
--- a/src/trans/codegen_c.cpp
+++ b/src/trans/codegen_c.cpp
@@ -779,6 +779,9 @@ namespace {
else if( name == "copy_nonoverlapping" ) {
m_of << "memcpy( "; emit_lvalue(e.args.at(0)); m_of << ", "; emit_lvalue(e.args.at(1)); m_of << ", "; emit_lvalue(e.args.at(2)); m_of << ")";
}
+ else if( name == "copy" ) {
+ m_of << "memmove( "; emit_lvalue(e.args.at(0)); m_of << ", "; emit_lvalue(e.args.at(1)); m_of << ", "; emit_lvalue(e.args.at(2)); m_of << ")";
+ }
else if( name == "forget" ) {
// Nothing needs to be done, this just stops the destructor from running.
}
@@ -853,6 +856,10 @@ namespace {
auto ordering = H::get_atomic_ordering(mir_res, name, 7+4+1);
emit_lvalue(e.ret_val); m_of << " = atomic_fetch_add_explicit("; emit_lvalue(e.args.at(0)); m_of << ", "; emit_lvalue(e.args.at(1)); m_of << ", " << ordering << ")";
}
+ else if( name == "atomic_xsub" || name.compare(0, 7+4+1, "atomic_xsub_") == 0 ) {
+ auto ordering = H::get_atomic_ordering(mir_res, name, 7+4+1);
+ emit_lvalue(e.ret_val); m_of << " = atomic_fetch_sub_explicit("; emit_lvalue(e.args.at(0)); m_of << ", "; emit_lvalue(e.args.at(1)); m_of << ", " << ordering << ")";
+ }
else if( name == "atomic_load" || name.compare(0, 7+4+1, "atomic_load_") == 0 ) {
auto ordering = H::get_atomic_ordering(mir_res, name, 7+4+1);
emit_lvalue(e.ret_val); m_of << " = atomic_load_explicit("; emit_lvalue(e.args.at(0)); m_of << ", " << ordering << ")";