提交 27558915 编写于 作者: D Denis Merigoux 提交者: Eduard-Mihai Burtescu

Generalized AtomicRmwBinOp for BuilderMethods

上级 1bcb4df1
......@@ -1059,13 +1059,19 @@ fn atomic_cmpxchg(
}
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 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,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册