summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2018-03-03 21:43:03 +0800
committerJohn Hodge <tpg@mutabah.net>2018-03-03 21:43:03 +0800
commite44cf19bbf20ff3715ffa3e5c8d4fd4e92617825 (patch)
treeb0f86266b810af326a67cea529f86d2ef4f59d5a
parentec4afe2cd3bf1049d5eabd4f9ae788e8e8c0f594 (diff)
downloadmrust-e44cf19bbf20ff3715ffa3e5c8d4fd4e92617825.tar.gz
Codegen C - Fix ordering of InterlockedCompareExchange arguments
-rw-r--r--src/trans/codegen_c.cpp7
1 files changed, 4 insertions, 3 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp
index f847e5d9..829aa7f7 100644
--- a/src/trans/codegen_c.cpp
+++ b/src/trans/codegen_c.cpp
@@ -3569,14 +3569,15 @@ namespace {
emit_lvalue(e.ret_val); m_of << "._0 = "; emit_param(e.args.at(1)); m_of << ";\n\t";
emit_lvalue(e.ret_val); m_of << "._1 = atomic_compare_exchange_" << (is_weak ? "weak" : "strong") << "_explicit(";
emit_atomic_cast(); emit_param(e.args.at(0));
- m_of << ", &"; emit_lvalue(e.ret_val); m_of << "._0";
- m_of << ", "; emit_param(e.args.at(2));
+ m_of << ", &"; emit_lvalue(e.ret_val); m_of << "._0"; // Expected (i.e. the check value)
+ m_of << ", "; emit_param(e.args.at(2)); // `desired` (the new value for the slot if equal)
m_of << ", " << get_atomic_ty_gcc(o_succ) << ", " << get_atomic_ty_gcc(o_fail) << ")";
break;
case Compiler::Msvc:
emit_lvalue(e.ret_val); m_of << "._0 = ";
emit_msvc_atomic_op("InterlockedCompareExchange", Ordering::SeqCst, true); // TODO: Use ordering, but which one?
- emit_param(e.args.at(0)); m_of << ", "; emit_param(e.args.at(1)); m_of << ", "; emit_param(e.args.at(2)); m_of << ")";
+ // Slot, Exchange (new value), Comparand (expected value) - Note different order to the gcc/stdc version
+ emit_param(e.args.at(0)); m_of << ", "; emit_param(e.args.at(2)); m_of << ", "; emit_param(e.args.at(1)); m_of << ")";
m_of << ";\n\t";
// If the result equals the expected value, return true
emit_lvalue(e.ret_val); m_of << "._1 = ("; emit_lvalue(e.ret_val); m_of << "._0 == "; emit_param(e.args.at(1)); m_of << ")";