Skip to content

Commit 2755891

Browse files
denismerigouxeddyb
authored andcommitted
Generalized AtomicRmwBinOp for BuilderMethods
1 parent 1bcb4df commit 2755891

File tree

4 files changed

+56
-18
lines changed

4 files changed

+56
-18
lines changed

src/librustc_codegen_llvm/builder.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,13 +1059,19 @@ impl BuilderMethods<'a, 'll, 'tcx, Value, BasicBlock>
10591059
}
10601060
fn atomic_rmw(
10611061
&self,
1062-
op: AtomicRmwBinOp,
1062+
op: traits::AtomicRmwBinOp,
10631063
dst: &'ll Value,
10641064
src: &'ll Value,
10651065
order: AtomicOrdering,
10661066
) -> &'ll Value {
10671067
unsafe {
1068-
llvm::LLVMBuildAtomicRMW(self.llbuilder, op, dst, src, order, False)
1068+
llvm::LLVMBuildAtomicRMW(
1069+
self.llbuilder,
1070+
AtomicRmwBinOp::from_generic(op),
1071+
dst,
1072+
src,
1073+
order,
1074+
False)
10691075
}
10701076
}
10711077

src/librustc_codegen_llvm/intrinsic.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use syntax::symbol::Symbol;
3131
use builder::Builder;
3232
use value::Value;
3333

34-
use traits::BuilderMethods;
34+
use traits::{BuilderMethods, AtomicRmwBinOp};
3535

3636
use rustc::session::Session;
3737
use syntax_pos::Span;
@@ -533,17 +533,17 @@ pub fn codegen_intrinsic_call(
533533
// These are all AtomicRMW ops
534534
op => {
535535
let atom_op = match op {
536-
"xchg" => llvm::AtomicXchg,
537-
"xadd" => llvm::AtomicAdd,
538-
"xsub" => llvm::AtomicSub,
539-
"and" => llvm::AtomicAnd,
540-
"nand" => llvm::AtomicNand,
541-
"or" => llvm::AtomicOr,
542-
"xor" => llvm::AtomicXor,
543-
"max" => llvm::AtomicMax,
544-
"min" => llvm::AtomicMin,
545-
"umax" => llvm::AtomicUMax,
546-
"umin" => llvm::AtomicUMin,
536+
"xchg" => AtomicRmwBinOp::AtomicXchg,
537+
"xadd" => AtomicRmwBinOp::AtomicAdd,
538+
"xsub" => AtomicRmwBinOp::AtomicSub,
539+
"and" => AtomicRmwBinOp::AtomicAnd,
540+
"nand" => AtomicRmwBinOp::AtomicNand,
541+
"or" => AtomicRmwBinOp::AtomicOr,
542+
"xor" => AtomicRmwBinOp::AtomicXor,
543+
"max" => AtomicRmwBinOp::AtomicMax,
544+
"min" => AtomicRmwBinOp::AtomicMin,
545+
"umax" => AtomicRmwBinOp::AtomicUMax,
546+
"umin" => AtomicRmwBinOp::AtomicUMin,
547547
_ => cx.sess().fatal("unknown atomic operation")
548548
};
549549

src/librustc_codegen_llvm/llvm/ffi.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,24 @@ pub enum AtomicRmwBinOp {
244244
AtomicUMin = 10,
245245
}
246246

247+
impl AtomicRmwBinOp {
248+
pub fn from_generic(op : traits::AtomicRmwBinOp) -> Self {
249+
match op {
250+
traits::AtomicRmwBinOp::AtomicXchg => AtomicRmwBinOp::AtomicXchg,
251+
traits::AtomicRmwBinOp::AtomicAdd => AtomicRmwBinOp::AtomicAdd,
252+
traits::AtomicRmwBinOp::AtomicSub => AtomicRmwBinOp::AtomicSub,
253+
traits::AtomicRmwBinOp::AtomicAnd => AtomicRmwBinOp::AtomicAnd,
254+
traits::AtomicRmwBinOp::AtomicNand => AtomicRmwBinOp::AtomicNand,
255+
traits::AtomicRmwBinOp::AtomicOr => AtomicRmwBinOp::AtomicOr,
256+
traits::AtomicRmwBinOp::AtomicXor => AtomicRmwBinOp::AtomicXor,
257+
traits::AtomicRmwBinOp::AtomicMax => AtomicRmwBinOp::AtomicMax,
258+
traits::AtomicRmwBinOp::AtomicMin => AtomicRmwBinOp::AtomicMin,
259+
traits::AtomicRmwBinOp::AtomicUMax => AtomicRmwBinOp::AtomicUMax,
260+
traits::AtomicRmwBinOp::AtomicUMin => AtomicRmwBinOp::AtomicUMin
261+
}
262+
}
263+
}
264+
247265
/// LLVMAtomicOrdering
248266
#[derive(Copy, Clone)]
249267
#[repr(C)]

src/librustc_codegen_llvm/traits.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
use llvm::{AtomicRmwBinOp, AtomicOrdering, SynchronizationScope, AsmDialect};
11+
use llvm::{AtomicOrdering, SynchronizationScope, AsmDialect};
1212
use common::*;
1313
use type_::Type;
1414
use libc::c_char;
@@ -30,7 +30,7 @@ impl OperandBundleDef<'ll, &'ll Value> {
3030
pub fn new(name: &'ll str, val: &'ll Value) -> Self {
3131
OperandBundleDef {
3232
name,
33-
val,
33+
val
3434
}
3535
}
3636
}
@@ -45,7 +45,7 @@ pub enum IntPredicate {
4545
IntSGT,
4646
IntSGE,
4747
IntSLT,
48-
IntSLE,
48+
IntSLE
4949
}
5050

5151
#[allow(dead_code)]
@@ -65,7 +65,21 @@ pub enum RealPredicate {
6565
RealULT,
6666
RealULE,
6767
RealUNE,
68-
RealPredicateTrue,
68+
RealPredicateTrue
69+
}
70+
71+
pub enum AtomicRmwBinOp {
72+
AtomicXchg,
73+
AtomicAdd,
74+
AtomicSub,
75+
AtomicAnd,
76+
AtomicNand,
77+
AtomicOr,
78+
AtomicXor,
79+
AtomicMax,
80+
AtomicMin,
81+
AtomicUMax,
82+
AtomicUMin
6983
}
7084

7185
pub trait BuilderMethods<'a, 'll :'a, 'tcx: 'll,

0 commit comments

Comments
 (0)