From 567eb80309d856f41db5977866b9a8cd664ebbb8 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sat, 3 Mar 2018 17:30:13 +0800 Subject: Codegen C - Work around InterlockedExchangeSubtract not existing for all types by emulating with add --- src/trans/codegen_c.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src') 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; -- cgit v1.2.3