diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index 5f5db9b4487..8d2b9d7a0ee 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -2648,10 +2648,10 @@ pub fn p2i(ccx: &CrateContext, v: ValueRef) -> ValueRef { } macro_rules! ifn ( - ($name:expr, $args:expr, $ret:expr) => ({ + ($intrinsics:ident, $name:expr, $args:expr, $ret:expr) => ({ let name = $name; let f = decl_cdecl_fn(llmod, name, Type::func($args, &$ret)); - intrinsics.insert(name, f); + $intrinsics.insert(name, f); }) ) @@ -2659,135 +2659,135 @@ pub fn declare_intrinsics(llmod: ModuleRef) -> HashMap<&'static str, ValueRef> { let i8p = Type::i8p(); let mut intrinsics = HashMap::new(); - ifn!("llvm.memcpy.p0i8.p0i8.i32", + ifn!(intrinsics, "llvm.memcpy.p0i8.p0i8.i32", [i8p, i8p, Type::i32(), Type::i32(), Type::i1()], Type::void()); - ifn!("llvm.memcpy.p0i8.p0i8.i64", + ifn!(intrinsics, "llvm.memcpy.p0i8.p0i8.i64", [i8p, i8p, Type::i64(), Type::i32(), Type::i1()], Type::void()); - ifn!("llvm.memmove.p0i8.p0i8.i32", + ifn!(intrinsics, "llvm.memmove.p0i8.p0i8.i32", [i8p, i8p, Type::i32(), Type::i32(), Type::i1()], Type::void()); - ifn!("llvm.memmove.p0i8.p0i8.i64", + ifn!(intrinsics, "llvm.memmove.p0i8.p0i8.i64", [i8p, i8p, Type::i64(), Type::i32(), Type::i1()], Type::void()); - ifn!("llvm.memset.p0i8.i32", + ifn!(intrinsics, "llvm.memset.p0i8.i32", [i8p, Type::i8(), Type::i32(), Type::i32(), Type::i1()], Type::void()); - ifn!("llvm.memset.p0i8.i64", + ifn!(intrinsics, "llvm.memset.p0i8.i64", [i8p, Type::i8(), Type::i64(), Type::i32(), Type::i1()], Type::void()); - ifn!("llvm.trap", [], Type::void()); - ifn!("llvm.frameaddress", [Type::i32()], i8p); + ifn!(intrinsics, "llvm.trap", [], Type::void()); + ifn!(intrinsics, "llvm.frameaddress", [Type::i32()], i8p); - ifn!("llvm.powi.f32", [Type::f32(), Type::i32()], Type::f32()); - ifn!("llvm.powi.f64", [Type::f64(), Type::i32()], Type::f64()); - ifn!("llvm.pow.f32", [Type::f32(), Type::f32()], Type::f32()); - ifn!("llvm.pow.f64", [Type::f64(), Type::f64()], Type::f64()); + ifn!(intrinsics, "llvm.powi.f32", [Type::f32(), Type::i32()], Type::f32()); + ifn!(intrinsics, "llvm.powi.f64", [Type::f64(), Type::i32()], Type::f64()); + ifn!(intrinsics, "llvm.pow.f32", [Type::f32(), Type::f32()], Type::f32()); + ifn!(intrinsics, "llvm.pow.f64", [Type::f64(), Type::f64()], Type::f64()); - ifn!("llvm.sqrt.f32", [Type::f32()], Type::f32()); - ifn!("llvm.sqrt.f64", [Type::f64()], Type::f64()); - ifn!("llvm.sin.f32", [Type::f32()], Type::f32()); - ifn!("llvm.sin.f64", [Type::f64()], Type::f64()); - ifn!("llvm.cos.f32", [Type::f32()], Type::f32()); - ifn!("llvm.cos.f64", [Type::f64()], Type::f64()); - ifn!("llvm.exp.f32", [Type::f32()], Type::f32()); - ifn!("llvm.exp.f64", [Type::f64()], Type::f64()); - ifn!("llvm.exp2.f32", [Type::f32()], Type::f32()); - ifn!("llvm.exp2.f64", [Type::f64()], Type::f64()); - ifn!("llvm.log.f32", [Type::f32()], Type::f32()); - ifn!("llvm.log.f64", [Type::f64()], Type::f64()); - ifn!("llvm.log10.f32",[Type::f32()], Type::f32()); - ifn!("llvm.log10.f64",[Type::f64()], Type::f64()); - ifn!("llvm.log2.f32", [Type::f32()], Type::f32()); - ifn!("llvm.log2.f64", [Type::f64()], Type::f64()); + ifn!(intrinsics, "llvm.sqrt.f32", [Type::f32()], Type::f32()); + ifn!(intrinsics, "llvm.sqrt.f64", [Type::f64()], Type::f64()); + ifn!(intrinsics, "llvm.sin.f32", [Type::f32()], Type::f32()); + ifn!(intrinsics, "llvm.sin.f64", [Type::f64()], Type::f64()); + ifn!(intrinsics, "llvm.cos.f32", [Type::f32()], Type::f32()); + ifn!(intrinsics, "llvm.cos.f64", [Type::f64()], Type::f64()); + ifn!(intrinsics, "llvm.exp.f32", [Type::f32()], Type::f32()); + ifn!(intrinsics, "llvm.exp.f64", [Type::f64()], Type::f64()); + ifn!(intrinsics, "llvm.exp2.f32", [Type::f32()], Type::f32()); + ifn!(intrinsics, "llvm.exp2.f64", [Type::f64()], Type::f64()); + ifn!(intrinsics, "llvm.log.f32", [Type::f32()], Type::f32()); + ifn!(intrinsics, "llvm.log.f64", [Type::f64()], Type::f64()); + ifn!(intrinsics, "llvm.log10.f32",[Type::f32()], Type::f32()); + ifn!(intrinsics, "llvm.log10.f64",[Type::f64()], Type::f64()); + ifn!(intrinsics, "llvm.log2.f32", [Type::f32()], Type::f32()); + ifn!(intrinsics, "llvm.log2.f64", [Type::f64()], Type::f64()); - ifn!("llvm.fma.f32", [Type::f32(), Type::f32(), Type::f32()], Type::f32()); - ifn!("llvm.fma.f64", [Type::f64(), Type::f64(), Type::f64()], Type::f64()); + ifn!(intrinsics, "llvm.fma.f32", [Type::f32(), Type::f32(), Type::f32()], Type::f32()); + ifn!(intrinsics, "llvm.fma.f64", [Type::f64(), Type::f64(), Type::f64()], Type::f64()); - ifn!("llvm.fabs.f32", [Type::f32()], Type::f32()); - ifn!("llvm.fabs.f64", [Type::f64()], Type::f64()); - ifn!("llvm.floor.f32",[Type::f32()], Type::f32()); - ifn!("llvm.floor.f64",[Type::f64()], Type::f64()); - ifn!("llvm.ceil.f32", [Type::f32()], Type::f32()); - ifn!("llvm.ceil.f64", [Type::f64()], Type::f64()); - ifn!("llvm.trunc.f32",[Type::f32()], Type::f32()); - ifn!("llvm.trunc.f64",[Type::f64()], Type::f64()); + ifn!(intrinsics, "llvm.fabs.f32", [Type::f32()], Type::f32()); + ifn!(intrinsics, "llvm.fabs.f64", [Type::f64()], Type::f64()); + ifn!(intrinsics, "llvm.floor.f32",[Type::f32()], Type::f32()); + ifn!(intrinsics, "llvm.floor.f64",[Type::f64()], Type::f64()); + ifn!(intrinsics, "llvm.ceil.f32", [Type::f32()], Type::f32()); + ifn!(intrinsics, "llvm.ceil.f64", [Type::f64()], Type::f64()); + ifn!(intrinsics, "llvm.trunc.f32",[Type::f32()], Type::f32()); + ifn!(intrinsics, "llvm.trunc.f64",[Type::f64()], Type::f64()); - ifn!("llvm.ctpop.i8", [Type::i8()], Type::i8()); - ifn!("llvm.ctpop.i16",[Type::i16()], Type::i16()); - ifn!("llvm.ctpop.i32",[Type::i32()], Type::i32()); - ifn!("llvm.ctpop.i64",[Type::i64()], Type::i64()); + ifn!(intrinsics, "llvm.ctpop.i8", [Type::i8()], Type::i8()); + ifn!(intrinsics, "llvm.ctpop.i16",[Type::i16()], Type::i16()); + ifn!(intrinsics, "llvm.ctpop.i32",[Type::i32()], Type::i32()); + ifn!(intrinsics, "llvm.ctpop.i64",[Type::i64()], Type::i64()); - ifn!("llvm.ctlz.i8", [Type::i8() , Type::i1()], Type::i8()); - ifn!("llvm.ctlz.i16", [Type::i16(), Type::i1()], Type::i16()); - ifn!("llvm.ctlz.i32", [Type::i32(), Type::i1()], Type::i32()); - ifn!("llvm.ctlz.i64", [Type::i64(), Type::i1()], Type::i64()); + ifn!(intrinsics, "llvm.ctlz.i8", [Type::i8() , Type::i1()], Type::i8()); + ifn!(intrinsics, "llvm.ctlz.i16", [Type::i16(), Type::i1()], Type::i16()); + ifn!(intrinsics, "llvm.ctlz.i32", [Type::i32(), Type::i1()], Type::i32()); + ifn!(intrinsics, "llvm.ctlz.i64", [Type::i64(), Type::i1()], Type::i64()); - ifn!("llvm.cttz.i8", [Type::i8() , Type::i1()], Type::i8()); - ifn!("llvm.cttz.i16", [Type::i16(), Type::i1()], Type::i16()); - ifn!("llvm.cttz.i32", [Type::i32(), Type::i1()], Type::i32()); - ifn!("llvm.cttz.i64", [Type::i64(), Type::i1()], Type::i64()); + ifn!(intrinsics, "llvm.cttz.i8", [Type::i8() , Type::i1()], Type::i8()); + ifn!(intrinsics, "llvm.cttz.i16", [Type::i16(), Type::i1()], Type::i16()); + ifn!(intrinsics, "llvm.cttz.i32", [Type::i32(), Type::i1()], Type::i32()); + ifn!(intrinsics, "llvm.cttz.i64", [Type::i64(), Type::i1()], Type::i64()); - ifn!("llvm.bswap.i16",[Type::i16()], Type::i16()); - ifn!("llvm.bswap.i32",[Type::i32()], Type::i32()); - ifn!("llvm.bswap.i64",[Type::i64()], Type::i64()); + ifn!(intrinsics, "llvm.bswap.i16",[Type::i16()], Type::i16()); + ifn!(intrinsics, "llvm.bswap.i32",[Type::i32()], Type::i32()); + ifn!(intrinsics, "llvm.bswap.i64",[Type::i64()], Type::i64()); - ifn!("llvm.sadd.with.overflow.i8", + ifn!(intrinsics, "llvm.sadd.with.overflow.i8", [Type::i8(), Type::i8()], Type::struct_([Type::i8(), Type::i1()], false)); - ifn!("llvm.sadd.with.overflow.i16", + ifn!(intrinsics, "llvm.sadd.with.overflow.i16", [Type::i16(), Type::i16()], Type::struct_([Type::i16(), Type::i1()], false)); - ifn!("llvm.sadd.with.overflow.i32", + ifn!(intrinsics, "llvm.sadd.with.overflow.i32", [Type::i32(), Type::i32()], Type::struct_([Type::i32(), Type::i1()], false)); - ifn!("llvm.sadd.with.overflow.i64", + ifn!(intrinsics, "llvm.sadd.with.overflow.i64", [Type::i64(), Type::i64()], Type::struct_([Type::i64(), Type::i1()], false)); - ifn!("llvm.uadd.with.overflow.i8", + ifn!(intrinsics, "llvm.uadd.with.overflow.i8", [Type::i8(), Type::i8()], Type::struct_([Type::i8(), Type::i1()], false)); - ifn!("llvm.uadd.with.overflow.i16", + ifn!(intrinsics, "llvm.uadd.with.overflow.i16", [Type::i16(), Type::i16()], Type::struct_([Type::i16(), Type::i1()], false)); - ifn!("llvm.uadd.with.overflow.i32", + ifn!(intrinsics, "llvm.uadd.with.overflow.i32", [Type::i32(), Type::i32()], Type::struct_([Type::i32(), Type::i1()], false)); - ifn!("llvm.uadd.with.overflow.i64", + ifn!(intrinsics, "llvm.uadd.with.overflow.i64", [Type::i64(), Type::i64()], Type::struct_([Type::i64(), Type::i1()], false)); - ifn!("llvm.ssub.with.overflow.i8", + ifn!(intrinsics, "llvm.ssub.with.overflow.i8", [Type::i8(), Type::i8()], Type::struct_([Type::i8(), Type::i1()], false)); - ifn!("llvm.ssub.with.overflow.i16", + ifn!(intrinsics, "llvm.ssub.with.overflow.i16", [Type::i16(), Type::i16()], Type::struct_([Type::i16(), Type::i1()], false)); - ifn!("llvm.ssub.with.overflow.i32", + ifn!(intrinsics, "llvm.ssub.with.overflow.i32", [Type::i32(), Type::i32()], Type::struct_([Type::i32(), Type::i1()], false)); - ifn!("llvm.ssub.with.overflow.i64", + ifn!(intrinsics, "llvm.ssub.with.overflow.i64", [Type::i64(), Type::i64()], Type::struct_([Type::i64(), Type::i1()], false)); - ifn!("llvm.usub.with.overflow.i8", + ifn!(intrinsics, "llvm.usub.with.overflow.i8", [Type::i8(), Type::i8()], Type::struct_([Type::i8(), Type::i1()], false)); - ifn!("llvm.usub.with.overflow.i16", + ifn!(intrinsics, "llvm.usub.with.overflow.i16", [Type::i16(), Type::i16()], Type::struct_([Type::i16(), Type::i1()], false)); - ifn!("llvm.usub.with.overflow.i32", + ifn!(intrinsics, "llvm.usub.with.overflow.i32", [Type::i32(), Type::i32()], Type::struct_([Type::i32(), Type::i1()], false)); - ifn!("llvm.usub.with.overflow.i64", + ifn!(intrinsics, "llvm.usub.with.overflow.i64", [Type::i64(), Type::i64()], Type::struct_([Type::i64(), Type::i1()], false)); - ifn!("llvm.smul.with.overflow.i8", + ifn!(intrinsics, "llvm.smul.with.overflow.i8", [Type::i8(), Type::i8()], Type::struct_([Type::i8(), Type::i1()], false)); - ifn!("llvm.smul.with.overflow.i16", + ifn!(intrinsics, "llvm.smul.with.overflow.i16", [Type::i16(), Type::i16()], Type::struct_([Type::i16(), Type::i1()], false)); - ifn!("llvm.smul.with.overflow.i32", + ifn!(intrinsics, "llvm.smul.with.overflow.i32", [Type::i32(), Type::i32()], Type::struct_([Type::i32(), Type::i1()], false)); - ifn!("llvm.smul.with.overflow.i64", + ifn!(intrinsics, "llvm.smul.with.overflow.i64", [Type::i64(), Type::i64()], Type::struct_([Type::i64(), Type::i1()], false)); - ifn!("llvm.umul.with.overflow.i8", + ifn!(intrinsics, "llvm.umul.with.overflow.i8", [Type::i8(), Type::i8()], Type::struct_([Type::i8(), Type::i1()], false)); - ifn!("llvm.umul.with.overflow.i16", + ifn!(intrinsics, "llvm.umul.with.overflow.i16", [Type::i16(), Type::i16()], Type::struct_([Type::i16(), Type::i1()], false)); - ifn!("llvm.umul.with.overflow.i32", + ifn!(intrinsics, "llvm.umul.with.overflow.i32", [Type::i32(), Type::i32()], Type::struct_([Type::i32(), Type::i1()], false)); - ifn!("llvm.umul.with.overflow.i64", + ifn!(intrinsics, "llvm.umul.with.overflow.i64", [Type::i64(), Type::i64()], Type::struct_([Type::i64(), Type::i1()], false)); return intrinsics; } pub fn declare_dbg_intrinsics(llmod: ModuleRef, intrinsics: &mut HashMap<&'static str, ValueRef>) { - ifn!("llvm.dbg.declare", [Type::metadata(), Type::metadata()], Type::void()); - ifn!("llvm.dbg.value", [Type::metadata(), Type::i64(), Type::metadata()], Type::void()); + ifn!(intrinsics, "llvm.dbg.declare", [Type::metadata(), Type::metadata()], Type::void()); + ifn!(intrinsics, "llvm.dbg.value", [Type::metadata(), Type::i64(), Type::metadata()], Type::void()); } pub fn trap(bcx: @mut Block) {