diff options
author | John Hodge <tpg@mutabah.net> | 2018-03-03 21:43:03 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2018-03-03 21:43:03 +0800 |
commit | e44cf19bbf20ff3715ffa3e5c8d4fd4e92617825 (patch) | |
tree | b0f86266b810af326a67cea529f86d2ef4f59d5a | |
parent | ec4afe2cd3bf1049d5eabd4f9ae788e8e8c0f594 (diff) | |
download | mrust-e44cf19bbf20ff3715ffa3e5c8d4fd4e92617825.tar.gz |
Codegen C - Fix ordering of InterlockedCompareExchange arguments
-rw-r--r-- | src/trans/codegen_c.cpp | 7 |
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 << ")"; |