diff options
author | John Hodge <tpg@mutabah.net> | 2018-03-03 17:30:13 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2018-03-03 17:30:13 +0800 |
commit | 567eb80309d856f41db5977866b9a8cd664ebbb8 (patch) | |
tree | 4454b0b2b9f7ccda7a5c83215518e0727cc3d81a /src | |
parent | a098a18b95d2520ca9787cec9f0254caf0f1364e (diff) | |
download | mrust-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.cpp | 8 |
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; |