diff options
| author | Luqman Aden <laden@csclub.uwaterloo.ca> | 2012-10-21 22:23:50 -0400 |
|---|---|---|
| committer | Luqman Aden <laden@csclub.uwaterloo.ca> | 2012-10-21 22:23:50 -0400 |
| commit | e1db959ec22712376763e062dc2fbffc18f33d9c (patch) | |
| tree | 63c0810cfa7f2860e77be5885cda1c9eead3dc71 /src/rustc | |
| parent | 082d3d51674203d97fd21e6cda6181b4dccfb2e1 (diff) | |
| download | rust-e1db959ec22712376763e062dc2fbffc18f33d9c.tar.gz rust-e1db959ec22712376763e062dc2fbffc18f33d9c.zip | |
rustc: add new intrinsics - atomic_cxchg{_acq,_rel}
Diffstat (limited to 'src/rustc')
| -rw-r--r-- | src/rustc/lib/llvm.rs | 3 | ||||
| -rw-r--r-- | src/rustc/middle/trans/build.rs | 5 | ||||
| -rw-r--r-- | src/rustc/middle/trans/foreign.rs | 24 | ||||
| -rw-r--r-- | src/rustc/middle/trans/type_use.rs | 11 | ||||
| -rw-r--r-- | src/rustc/middle/typeck/check.rs | 10 |
5 files changed, 47 insertions, 6 deletions
diff --git a/src/rustc/lib/llvm.rs b/src/rustc/lib/llvm.rs index 0d92c19b952..f1397006b16 100644 --- a/src/rustc/lib/llvm.rs +++ b/src/rustc/lib/llvm.rs @@ -843,6 +843,9 @@ extern mod llvm { Name: *c_char) -> ValueRef; /* Atomic Operations */ + fn LLVMBuildAtomicCmpXchg(B: BuilderRef, LHS: ValueRef, + CMP: ValueRef, RHS: ValueRef, + ++Order: AtomicOrdering) -> ValueRef; fn LLVMBuildAtomicRMW(B: BuilderRef, ++Op: AtomicBinOp, LHS: ValueRef, RHS: ValueRef, ++Order: AtomicOrdering) -> ValueRef; diff --git a/src/rustc/middle/trans/build.rs b/src/rustc/middle/trans/build.rs index ea992600ae1..f7690b7bc93 100644 --- a/src/rustc/middle/trans/build.rs +++ b/src/rustc/middle/trans/build.rs @@ -813,6 +813,11 @@ fn Resume(cx: block, Exn: ValueRef) -> ValueRef { } // Atomic Operations +fn AtomicCmpXchg(cx: block, dst: ValueRef, + cmp: ValueRef, src: ValueRef, + order: AtomicOrdering) -> ValueRef { + llvm::LLVMBuildAtomicCmpXchg(B(cx), dst, cmp, src, order) +} fn AtomicRMW(cx: block, op: AtomicBinOp, dst: ValueRef, src: ValueRef, order: AtomicOrdering) -> ValueRef { diff --git a/src/rustc/middle/trans/foreign.rs b/src/rustc/middle/trans/foreign.rs index d307fcb5dca..8fa23ef8fab 100644 --- a/src/rustc/middle/trans/foreign.rs +++ b/src/rustc/middle/trans/foreign.rs @@ -799,6 +799,30 @@ fn trans_intrinsic(ccx: @crate_ctxt, decl: ValueRef, item: @ast::foreign_item, Some(substs), Some(item.span)); let mut bcx = top_scope_block(fcx, None), lltop = bcx.llbb; match ccx.sess.str_of(item.ident) { + ~"atomic_cxchg" => { + let old = AtomicCmpXchg(bcx, + get_param(decl, first_real_arg), + get_param(decl, first_real_arg + 1u), + get_param(decl, first_real_arg + 2u), + SequentiallyConsistent); + Store(bcx, old, fcx.llretptr); + } + ~"atomic_cxchg_acq" => { + let old = AtomicCmpXchg(bcx, + get_param(decl, first_real_arg), + get_param(decl, first_real_arg + 1u), + get_param(decl, first_real_arg + 2u), + Acquire); + Store(bcx, old, fcx.llretptr); + } + ~"atomic_cxchg_rel" => { + let old = AtomicCmpXchg(bcx, + get_param(decl, first_real_arg), + get_param(decl, first_real_arg + 1u), + get_param(decl, first_real_arg + 2u), + Release); + Store(bcx, old, fcx.llretptr); + } ~"atomic_xchg" => { let old = AtomicRMW(bcx, Xchg, get_param(decl, first_real_arg), diff --git a/src/rustc/middle/trans/type_use.rs b/src/rustc/middle/trans/type_use.rs index 8b2efacd4d1..ddd50d47c08 100644 --- a/src/rustc/middle/trans/type_use.rs +++ b/src/rustc/middle/trans/type_use.rs @@ -98,11 +98,12 @@ fn type_uses_for(ccx: @crate_ctxt, fn_id: def_id, n_tps: uint) ~"get_tydesc" | ~"needs_drop" => use_tydesc, - ~"atomic_xchg" | ~"atomic_xadd" | - ~"atomic_xsub" | ~"atomic_xchg_acq" | - ~"atomic_xadd_acq" | ~"atomic_xsub_acq" | - ~"atomic_xchg_rel" | ~"atomic_xadd_rel" | - ~"atomic_xsub_rel" => 0, + ~"atomic_cxchg" | ~"atomic_cxchg_acq"| + ~"atomic_cxchg_rel"| ~"atomic_xchg" | + ~"atomic_xadd" | ~"atomic_xsub" | + ~"atomic_xchg_acq" | ~"atomic_xadd_acq" | + ~"atomic_xsub_acq" | ~"atomic_xchg_rel" | + ~"atomic_xadd_rel" | ~"atomic_xsub_rel" => 0, ~"visit_tydesc" | ~"forget" | ~"addr_of" | ~"frame_address" | ~"morestack_addr" => 0, diff --git a/src/rustc/middle/typeck/check.rs b/src/rustc/middle/typeck/check.rs index 5f9e584fa7b..f4764c5d595 100644 --- a/src/rustc/middle/typeck/check.rs +++ b/src/rustc/middle/typeck/check.rs @@ -2605,7 +2605,15 @@ fn check_intrinsic_type(ccx: @crate_ctxt, it: @ast::foreign_item) { } ~"needs_drop" => (1u, ~[], ty::mk_bool(tcx)), - ~"atomic_xchg" | ~"atomic_xadd" | ~"atomic_xsub" | + ~"atomic_cxchg" | ~"atomic_cxchg_acq"| ~"atomic_cxchg_rel" => { + (0u, ~[arg(ast::by_copy, + ty::mk_mut_rptr(tcx, ty::re_bound(ty::br_anon(0)), + ty::mk_int(tcx))), + arg(ast::by_copy, ty::mk_int(tcx)), + arg(ast::by_copy, ty::mk_int(tcx))], + ty::mk_int(tcx)) + } + ~"atomic_xchg" | ~"atomic_xadd" | ~"atomic_xsub" | ~"atomic_xchg_acq" | ~"atomic_xadd_acq" | ~"atomic_xsub_acq" | ~"atomic_xchg_rel" | ~"atomic_xadd_rel" | ~"atomic_xsub_rel" => { (0u, ~[arg(ast::by_copy, |
