summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2018-03-03 17:30:13 +0800
committerJohn Hodge <tpg@mutabah.net>2018-03-03 17:30:13 +0800
commit567eb80309d856f41db5977866b9a8cd664ebbb8 (patch)
tree4454b0b2b9f7ccda7a5c83215518e0727cc3d81a /src
parenta098a18b95d2520ca9787cec9f0254caf0f1364e (diff)
downloadmrust-567eb80309d856f41db5977866b9a8cd664ebbb8.tar.gz
Codegen C - Work around InterlockedExchangeSubtract not existing for all types by emulating with add
Diffstat (limited to 'src')
-rw-r--r--src/trans/codegen_c.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp
index acd54528..10bbdecc 100644
--- a/src/trans/codegen_c.cpp
+++ b/src/trans/codegen_c.cpp
@@ -3606,8 +3606,12 @@ namespace {
}
switch(op)
{
- case AtomicOp::Add: emit_msvc_atomic_op("InterlockedExchangeAdd", ordering); break;
- case AtomicOp::Sub: emit_msvc_atomic_op("InterlockedExchangeSubtract", ordering); break;
+ case AtomicOp::Add: emit_msvc_atomic_op("InterlockedExchangeAdd", ordering, true); break;
+ case AtomicOp::Sub:
+ emit_msvc_atomic_op("InterlockedExchangeAdd", ordering, true);
+ emit_param(e.args.at(0)); m_of << ", ~(";
+ emit_param(e.args.at(1)); m_of << ")+1)";
+ return ;
case AtomicOp::And: emit_msvc_atomic_op("InterlockedAnd", ordering); break;
case AtomicOp::Or: emit_msvc_atomic_op("InterlockedOr", ordering); break;
case AtomicOp::Xor: emit_msvc_atomic_op("InterlockedXor", ordering); break;