mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
Generalized AtomicRmwBinOp for BuilderMethods
This commit is contained in:
parent
1bcb4df166
commit
275589150b
@ -1059,13 +1059,19 @@ impl BuilderMethods<'a, 'll, 'tcx, Value, BasicBlock>
|
||||
}
|
||||
fn atomic_rmw(
|
||||
&self,
|
||||
op: AtomicRmwBinOp,
|
||||
op: traits::AtomicRmwBinOp,
|
||||
dst: &'ll Value,
|
||||
src: &'ll Value,
|
||||
order: AtomicOrdering,
|
||||
) -> &'ll Value {
|
||||
unsafe {
|
||||
llvm::LLVMBuildAtomicRMW(self.llbuilder, op, dst, src, order, False)
|
||||
llvm::LLVMBuildAtomicRMW(
|
||||
self.llbuilder,
|
||||
AtomicRmwBinOp::from_generic(op),
|
||||
dst,
|
||||
src,
|
||||
order,
|
||||
False)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -31,7 +31,7 @@ use syntax::symbol::Symbol;
|
||||
use builder::Builder;
|
||||
use value::Value;
|
||||
|
||||
use traits::BuilderMethods;
|
||||
use traits::{BuilderMethods, AtomicRmwBinOp};
|
||||
|
||||
use rustc::session::Session;
|
||||
use syntax_pos::Span;
|
||||
@ -533,17 +533,17 @@ pub fn codegen_intrinsic_call(
|
||||
// These are all AtomicRMW ops
|
||||
op => {
|
||||
let atom_op = match op {
|
||||
"xchg" => llvm::AtomicXchg,
|
||||
"xadd" => llvm::AtomicAdd,
|
||||
"xsub" => llvm::AtomicSub,
|
||||
"and" => llvm::AtomicAnd,
|
||||
"nand" => llvm::AtomicNand,
|
||||
"or" => llvm::AtomicOr,
|
||||
"xor" => llvm::AtomicXor,
|
||||
"max" => llvm::AtomicMax,
|
||||
"min" => llvm::AtomicMin,
|
||||
"umax" => llvm::AtomicUMax,
|
||||
"umin" => llvm::AtomicUMin,
|
||||
"xchg" => AtomicRmwBinOp::AtomicXchg,
|
||||
"xadd" => AtomicRmwBinOp::AtomicAdd,
|
||||
"xsub" => AtomicRmwBinOp::AtomicSub,
|
||||
"and" => AtomicRmwBinOp::AtomicAnd,
|
||||
"nand" => AtomicRmwBinOp::AtomicNand,
|
||||
"or" => AtomicRmwBinOp::AtomicOr,
|
||||
"xor" => AtomicRmwBinOp::AtomicXor,
|
||||
"max" => AtomicRmwBinOp::AtomicMax,
|
||||
"min" => AtomicRmwBinOp::AtomicMin,
|
||||
"umax" => AtomicRmwBinOp::AtomicUMax,
|
||||
"umin" => AtomicRmwBinOp::AtomicUMin,
|
||||
_ => cx.sess().fatal("unknown atomic operation")
|
||||
};
|
||||
|
||||
|
@ -244,6 +244,24 @@ pub enum AtomicRmwBinOp {
|
||||
AtomicUMin = 10,
|
||||
}
|
||||
|
||||
impl AtomicRmwBinOp {
|
||||
pub fn from_generic(op : traits::AtomicRmwBinOp) -> Self {
|
||||
match op {
|
||||
traits::AtomicRmwBinOp::AtomicXchg => AtomicRmwBinOp::AtomicXchg,
|
||||
traits::AtomicRmwBinOp::AtomicAdd => AtomicRmwBinOp::AtomicAdd,
|
||||
traits::AtomicRmwBinOp::AtomicSub => AtomicRmwBinOp::AtomicSub,
|
||||
traits::AtomicRmwBinOp::AtomicAnd => AtomicRmwBinOp::AtomicAnd,
|
||||
traits::AtomicRmwBinOp::AtomicNand => AtomicRmwBinOp::AtomicNand,
|
||||
traits::AtomicRmwBinOp::AtomicOr => AtomicRmwBinOp::AtomicOr,
|
||||
traits::AtomicRmwBinOp::AtomicXor => AtomicRmwBinOp::AtomicXor,
|
||||
traits::AtomicRmwBinOp::AtomicMax => AtomicRmwBinOp::AtomicMax,
|
||||
traits::AtomicRmwBinOp::AtomicMin => AtomicRmwBinOp::AtomicMin,
|
||||
traits::AtomicRmwBinOp::AtomicUMax => AtomicRmwBinOp::AtomicUMax,
|
||||
traits::AtomicRmwBinOp::AtomicUMin => AtomicRmwBinOp::AtomicUMin
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// LLVMAtomicOrdering
|
||||
#[derive(Copy, Clone)]
|
||||
#[repr(C)]
|
||||
|
@ -8,7 +8,7 @@
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use llvm::{AtomicRmwBinOp, AtomicOrdering, SynchronizationScope, AsmDialect};
|
||||
use llvm::{AtomicOrdering, SynchronizationScope, AsmDialect};
|
||||
use common::*;
|
||||
use type_::Type;
|
||||
use libc::c_char;
|
||||
@ -30,7 +30,7 @@ impl OperandBundleDef<'ll, &'ll Value> {
|
||||
pub fn new(name: &'ll str, val: &'ll Value) -> Self {
|
||||
OperandBundleDef {
|
||||
name,
|
||||
val,
|
||||
val
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -45,7 +45,7 @@ pub enum IntPredicate {
|
||||
IntSGT,
|
||||
IntSGE,
|
||||
IntSLT,
|
||||
IntSLE,
|
||||
IntSLE
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
@ -65,7 +65,21 @@ pub enum RealPredicate {
|
||||
RealULT,
|
||||
RealULE,
|
||||
RealUNE,
|
||||
RealPredicateTrue,
|
||||
RealPredicateTrue
|
||||
}
|
||||
|
||||
pub enum AtomicRmwBinOp {
|
||||
AtomicXchg,
|
||||
AtomicAdd,
|
||||
AtomicSub,
|
||||
AtomicAnd,
|
||||
AtomicNand,
|
||||
AtomicOr,
|
||||
AtomicXor,
|
||||
AtomicMax,
|
||||
AtomicMin,
|
||||
AtomicUMax,
|
||||
AtomicUMin
|
||||
}
|
||||
|
||||
pub trait BuilderMethods<'a, 'll :'a, 'tcx: 'll,
|
||||
|
Loading…
Reference in New Issue
Block a user