about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbjorn3 <bjorn3@users.noreply.github.com>2019-08-01 10:58:18 +0200
committerbjorn3 <bjorn3@users.noreply.github.com>2019-08-01 10:59:17 +0200
commit62166ed9c8cd1b495bddc3fcfb02f48d3fa0e043 (patch)
treebf43cfd37d68eb4813b241e4db29d136d27f12ef
parentbc914cd43b88794ae8d65534a2ba6c86336dcf8a (diff)
downloadrust-62166ed9c8cd1b495bddc3fcfb02f48d3fa0e043.tar.gz
rust-62166ed9c8cd1b495bddc3fcfb02f48d3fa0e043.zip
Correctly implement atomic_nand_* intrinsics
Fixes #639
-rw-r--r--src/intrinsics.rs7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/intrinsics.rs b/src/intrinsics.rs
index 7da7e738f52..8fee0fa457d 100644
--- a/src/intrinsics.rs
+++ b/src/intrinsics.rs
@@ -810,7 +810,12 @@ pub fn codegen_intrinsic_call<'a, 'tcx: 'a>(
             atomic_binop_return_old! (fx, band<T>(ptr, src) -> ret);
         };
         _ if intrinsic.starts_with("atomic_nand"), <T> (v ptr, v src) {
-            atomic_binop_return_old! (fx, band_not<T>(ptr, src) -> ret);
+            let clif_ty = fx.clif_type(T).unwrap();
+            let old = fx.bcx.ins().load(clif_ty, MemFlags::new(), ptr, 0);
+            let and = fx.bcx.ins().band(old, src);
+            let new = fx.bcx.ins().bnot(and);
+            fx.bcx.ins().store(MemFlags::new(), new, ptr, 0);
+            ret.write_cvalue(fx, CValue::by_val(old, fx.layout_of(T)));
         };
         _ if intrinsic.starts_with("atomic_or"), <T> (v ptr, v src) {
             atomic_binop_return_old! (fx, bor<T>(ptr, src) -> ret);