summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
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;