diff --git a/src/libcore/num/f32.rs b/src/libcore/num/f32.rs index 6361a6a5cb75e..cbfc20fe81bf6 100644 --- a/src/libcore/num/f32.rs +++ b/src/libcore/num/f32.rs @@ -16,7 +16,7 @@ use num::NumCast; use num::strconv; use num; use option::Option; -use unstable::intrinsics::floorf32; +use unstable::intrinsics; use from_str; use to_str; @@ -93,7 +93,6 @@ delegate!(fn ldexp_radix(n: c_float, i: c_int) -> c_float = cmath::c_float_utils::ldexp_radix) delegate!(fn sin(n: c_float) -> c_float = cmath::c_float_utils::sin) delegate!(fn sinh(n: c_float) -> c_float = cmath::c_float_utils::sinh) -delegate!(fn sqrt(n: c_float) -> c_float = cmath::c_float_utils::sqrt) delegate!(fn tan(n: c_float) -> c_float = cmath::c_float_utils::tan) delegate!(fn tanh(n: c_float) -> c_float = cmath::c_float_utils::tanh) delegate!(fn tgamma(n: c_float) -> c_float = cmath::c_float_utils::tgamma) @@ -146,7 +145,10 @@ pub fn gt(x: f32, y: f32) -> bool { return x > y; } /// Returns `x` rounded down #[inline(always)] -pub fn floor(x: f32) -> f32 { unsafe { floorf32(x) } } +pub fn floor(x: f32) -> f32 { unsafe { intrinsics::llvm::floorf32(x) } } + +#[inline(always)] +pub fn sqrt(x: f32) -> f32 { unsafe { intrinsics::llvm::sqrtf32(x) } } // FIXME (#1999): replace the predicates below with llvm intrinsics or // calls to the libmath macros in the rust runtime for performance. diff --git a/src/libcore/num/f64.rs b/src/libcore/num/f64.rs index 9e731e61ec49e..eedc96cf2e94a 100644 --- a/src/libcore/num/f64.rs +++ b/src/libcore/num/f64.rs @@ -16,7 +16,7 @@ use num::NumCast; use num::strconv; use num; use option::Option; -use unstable::intrinsics::floorf64; +use unstable::intrinsics; use to_str; use from_str; @@ -94,7 +94,6 @@ delegate!(fn ldexp_radix(n: c_double, i: c_int) -> c_double = cmath::c_double_utils::ldexp_radix) delegate!(fn sin(n: c_double) -> c_double = cmath::c_double_utils::sin) delegate!(fn sinh(n: c_double) -> c_double = cmath::c_double_utils::sinh) -delegate!(fn sqrt(n: c_double) -> c_double = cmath::c_double_utils::sqrt) delegate!(fn tan(n: c_double) -> c_double = cmath::c_double_utils::tan) delegate!(fn tanh(n: c_double) -> c_double = cmath::c_double_utils::tanh) delegate!(fn tgamma(n: c_double) -> c_double = cmath::c_double_utils::tgamma) @@ -221,7 +220,10 @@ pub fn is_finite(x: f64) -> bool { /// Returns `x` rounded down #[inline(always)] -pub fn floor(x: f64) -> f64 { unsafe { floorf64(x) } } +pub fn floor(x: f64) -> f64 { unsafe { intrinsics::llvm::floorf64(x) } } + +#[inline(always)] +pub fn sqrt(x: f64) -> f64 { unsafe { intrinsics::llvm::sqrtf64(x) } } // FIXME (#1999): add is_normal, is_subnormal, and fpclassify diff --git a/src/libcore/unstable/intrinsics.rs b/src/libcore/unstable/intrinsics.rs index ba96c6e5d3036..1d50c50bc3cb2 100644 --- a/src/libcore/unstable/intrinsics.rs +++ b/src/libcore/unstable/intrinsics.rs @@ -63,69 +63,213 @@ pub extern "rust-intrinsic" { pub fn memmove32(dst: *mut u8, src: *u8, size: u32); pub fn memmove64(dst: *mut u8, src: *u8, size: u64); +} +#[nolink] +pub extern mod llvm { + #[rust_stack] + #[inline(always)] + #[link_name="llvm.sqrt.f32"] pub fn sqrtf32(x: f32) -> f32; + + #[rust_stack] + #[inline(always)] + #[link_name="llvm.sqrt.f64"] pub fn sqrtf64(x: f64) -> f64; + #[rust_stack] + #[inline(always)] + #[link_name="llvm.powi.f32"] pub fn powif32(a: f32, x: i32) -> f32; + + #[rust_stack] + #[inline(always)] + #[link_name="llvm.powi.f64"] pub fn powif64(a: f64, x: i32) -> f64; + #[rust_stack] + #[inline(always)] + #[link_name="llvm.sin.f32"] pub fn sinf32(x: f32) -> f32; + + #[rust_stack] + #[inline(always)] + #[link_name="llvm.sin.f64"] pub fn sinf64(x: f64) -> f64; + #[rust_stack] + #[inline(always)] + #[link_name="llvm.cos.f32"] pub fn cosf32(x: f32) -> f32; + + #[rust_stack] + #[inline(always)] + #[link_name="llvm.cos.f64"] pub fn cosf64(x: f64) -> f64; + #[rust_stack] + #[inline(always)] + #[link_name="llvm.pow.f32"] pub fn powf32(a: f32, x: f32) -> f32; + + #[rust_stack] + #[inline(always)] + #[link_name="llvm.pow.f64"] pub fn powf64(a: f64, x: f64) -> f64; + #[rust_stack] + #[inline(always)] + #[link_name="llvm.exp.f32"] pub fn expf32(x: f32) -> f32; - pub fn expf64(x: f64) -> f64; - pub fn exp2f32(x: f32) -> f32; - pub fn exp2f64(x: f64) -> f64; + #[rust_stack] + #[inline(always)] + #[link_name="llvm.exp.f64"] + pub fn expf64(x: f64) -> f64; + #[rust_stack] + #[inline(always)] + #[link_name="llvm.log.f32"] pub fn logf32(x: f32) -> f32; + + #[rust_stack] + #[inline(always)] + #[link_name="llvm.log.f64"] pub fn logf64(x: f64) -> f64; + /* NOTE: Do these intrinsics even exist? + pub fn exp2f32(x: f32) -> f32; + pub fn exp2f64(x: f64) -> f64; + pub fn log10f32(x: f32) -> f32; pub fn log10f64(x: f64) -> f64; pub fn log2f32(x: f32) -> f32; pub fn log2f64(x: f64) -> f64; + */ + #[rust_stack] + #[inline(always)] + #[link_name="llvm.fma.f32"] pub fn fmaf32(a: f32, b: f32, c: f32) -> f32; + + #[rust_stack] + #[inline(always)] + #[link_name="llvm.fma.f64"] pub fn fmaf64(a: f64, b: f64, c: f64) -> f64; + #[rust_stack] + #[inline(always)] + #[link_name="llvm.fabs.f32"] pub fn fabsf32(x: f32) -> f32; + + #[rust_stack] + #[inline(always)] + #[link_name="llvm.fabs.f64"] pub fn fabsf64(x: f64) -> f64; + #[rust_stack] + #[inline(always)] + #[link_name="llvm.floor.f32"] pub fn floorf32(x: f32) -> f32; + + #[rust_stack] + #[inline(always)] + #[link_name="llvm.floor.f64"] pub fn floorf64(x: f64) -> f64; + /* NOTE: Needs LLVM 3.3 + #[rust_stack] + #[link_name="llvm.ceil.f32"] pub fn ceilf32(x: f32) -> f32; + + #[rust_stack] + #[link_name="llvm.ceil.f64"] pub fn ceilf64(x: f64) -> f64; + #[rust_stack] + #[link_name="llvm.trunc.f32"] pub fn truncf32(x: f32) -> f32; + + #[rust_stack] + #[link_name="llvm.trunc.f64"] pub fn truncf64(x: f64) -> f64; + */ + #[rust_stack] + #[inline(always)] + #[link_name="llvm.ctpop.i8"] pub fn ctpop8(x: i8) -> i8; + + #[rust_stack] + #[inline(always)] + #[link_name="llvm.ctpop.i16"] pub fn ctpop16(x: i16) -> i16; - pub fn ctpop32(x: i32) -> i32; - pub fn ctpop64(x: i64) -> i64; - pub fn ctlz8(x: i8) -> i8; - pub fn ctlz16(x: i16) -> i16; - pub fn ctlz32(x: i32) -> i32; - pub fn ctlz64(x: i64) -> i64; + #[rust_stack] + #[inline(always)] + #[link_name="llvm.ctpop.i32"] + pub fn ctpop32(x: i32) -> i32; - pub fn cttz8(x: i8) -> i8; - pub fn cttz16(x: i16) -> i16; - pub fn cttz32(x: i32) -> i32; - pub fn cttz64(x: i64) -> i64; + #[rust_stack] + #[inline(always)] + #[link_name="llvm.ctpop.i64"] + pub fn ctpop64(x: i64) -> i64; + /* NOTE: Needs i1 constants + #[rust_stack] + #[inline(always)] + #[link_name="llvm.ctlz.i8"] + pub fn ctlz8(x: i8, is_zero_undef: bool) -> i8; + + #[rust_stack] + #[inline(always)] + #[link_name="llvm.ctlz.i16"] + pub fn ctlz16(x: i16, is_zero_undef: bool) -> i16; + + #[rust_stack] + #[inline(always)] + #[link_name="llvm.ctlz.i32"] + pub fn ctlz32(x: i32, is_zero_undef: bool) -> i32; + + #[rust_stack] + #[inline(always)] + #[link_name="llvm.ctlz.i64"] + pub fn ctlz64(x: i64, is_zero_undef: bool) -> i64; + + #[rust_stack] + #[inline(always)] + #[link_name="llvm.cttz.i8"] + pub fn cttz8(x: i8, is_zero_undef: bool) -> i8; + + #[rust_stack] + #[inline(always)] + #[link_name="llvm.cttz.i16"] + pub fn cttz16(x: i16, is_zero_undef: bool) -> i16; + + #[rust_stack] + #[inline(always)] + #[link_name="llvm.cttz.i32"] + pub fn cttz32(x: i32, is_zero_undef: bool) -> i32; + + #[rust_stack] + #[inline(always)] + #[link_name="llvm.cttz.i64"] + pub fn cttz64(x: i64, is_zero_undef: bool) -> i64; + */ + + #[rust_stack] + #[inline(always)] + #[link_name="llvm.bswap.i16"] pub fn bswap16(x: i16) -> i16; + + #[rust_stack] + #[inline(always)] + #[link_name="llvm.bswap.i32"] pub fn bswap32(x: i32) -> i32; + + #[rust_stack] + #[inline(always)] + #[link_name="llvm.bswap.i64"] pub fn bswap64(x: i64) -> i64; } - diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index 15238f168944d..d3173444ab1ae 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -2652,96 +2652,6 @@ pub fn declare_intrinsics(llmod: ModuleRef) -> LinearMap<~str, ValueRef> { let frameaddress = decl_cdecl_fn(llmod, ~"llvm.frameaddress", T_fn(T_frameaddress_args, T_ptr(T_i8()))); - let sqrtf32 = decl_cdecl_fn(llmod, ~"llvm.sqrt.f32", - T_fn(~[T_f32()], T_f32())); - let sqrtf64 = decl_cdecl_fn(llmod, ~"llvm.sqrt.f64", - T_fn(~[T_f64()], T_f64())); - let powif32 = decl_cdecl_fn(llmod, ~"llvm.powi.f32", - T_fn(~[T_f32(), T_i32()], T_f32())); - let powif64 = decl_cdecl_fn(llmod, ~"llvm.powi.f64", - T_fn(~[T_f64(), T_i32()], T_f64())); - let sinf32 = decl_cdecl_fn(llmod, ~"llvm.sin.f32", - T_fn(~[T_f32()], T_f32())); - let sinf64 = decl_cdecl_fn(llmod, ~"llvm.sin.f64", - T_fn(~[T_f64()], T_f64())); - let cosf32 = decl_cdecl_fn(llmod, ~"llvm.cos.f32", - T_fn(~[T_f32()], T_f32())); - let cosf64 = decl_cdecl_fn(llmod, ~"llvm.cos.f64", - T_fn(~[T_f64()], T_f64())); - let powf32 = decl_cdecl_fn(llmod, ~"llvm.pow.f32", - T_fn(~[T_f32(), T_f32()], T_f32())); - let powf64 = decl_cdecl_fn(llmod, ~"llvm.pow.f64", - T_fn(~[T_f64(), T_f64()], T_f64())); - let expf32 = decl_cdecl_fn(llmod, ~"llvm.exp.f32", - T_fn(~[T_f32()], T_f32())); - let expf64 = decl_cdecl_fn(llmod, ~"llvm.exp.f64", - T_fn(~[T_f64()], T_f64())); - let exp2f32 = decl_cdecl_fn(llmod, ~"llvm.exp2.f32", - T_fn(~[T_f32()], T_f32())); - let exp2f64 = decl_cdecl_fn(llmod, ~"llvm.exp2.f64", - T_fn(~[T_f64()], T_f64())); - let logf32 = decl_cdecl_fn(llmod, ~"llvm.log.f32", - T_fn(~[T_f32()], T_f32())); - let logf64 = decl_cdecl_fn(llmod, ~"llvm.log.f64", - T_fn(~[T_f64()], T_f64())); - let log10f32 = decl_cdecl_fn(llmod, ~"llvm.log10.f32", - T_fn(~[T_f32()], T_f32())); - let log10f64 = decl_cdecl_fn(llmod, ~"llvm.log10.f64", - T_fn(~[T_f64()], T_f64())); - let log2f32 = decl_cdecl_fn(llmod, ~"llvm.log2.f32", - T_fn(~[T_f32()], T_f32())); - let log2f64 = decl_cdecl_fn(llmod, ~"llvm.log2.f64", - T_fn(~[T_f64()], T_f64())); - let fmaf32 = decl_cdecl_fn(llmod, ~"llvm.fma.f32", - T_fn(~[T_f32(), T_f32(), T_f32()], T_f32())); - let fmaf64 = decl_cdecl_fn(llmod, ~"llvm.fma.f64", - T_fn(~[T_f64(), T_f64(), T_f64()], T_f64())); - let fabsf32 = decl_cdecl_fn(llmod, ~"llvm.fabs.f32", - T_fn(~[T_f32()], T_f32())); - let fabsf64 = decl_cdecl_fn(llmod, ~"llvm.fabs.f64", - T_fn(~[T_f64()], T_f64())); - let floorf32 = decl_cdecl_fn(llmod, ~"llvm.floor.f32", - T_fn(~[T_f32()], T_f32())); - let floorf64 = decl_cdecl_fn(llmod, ~"llvm.floor.f64", - T_fn(~[T_f64()], T_f64())); - let ceilf32 = decl_cdecl_fn(llmod, ~"llvm.ceil.f32", - T_fn(~[T_f32()], T_f32())); - let ceilf64 = decl_cdecl_fn(llmod, ~"llvm.ceil.f64", - T_fn(~[T_f64()], T_f64())); - let truncf32 = decl_cdecl_fn(llmod, ~"llvm.trunc.f32", - T_fn(~[T_f32()], T_f32())); - let truncf64 = decl_cdecl_fn(llmod, ~"llvm.trunc.f64", - T_fn(~[T_f64()], T_f64())); - let ctpop8 = decl_cdecl_fn(llmod, ~"llvm.ctpop.i8", - T_fn(~[T_i8()], T_i8())); - let ctpop16 = decl_cdecl_fn(llmod, ~"llvm.ctpop.i16", - T_fn(~[T_i16()], T_i16())); - let ctpop32 = decl_cdecl_fn(llmod, ~"llvm.ctpop.i32", - T_fn(~[T_i32()], T_i32())); - let ctpop64 = decl_cdecl_fn(llmod, ~"llvm.ctpop.i64", - T_fn(~[T_i64()], T_i64())); - let ctlz8 = decl_cdecl_fn(llmod, ~"llvm.ctlz.i8", - T_fn(~[T_i8(), T_i1()], T_i8())); - let ctlz16 = decl_cdecl_fn(llmod, ~"llvm.ctlz.i16", - T_fn(~[T_i16(), T_i1()], T_i16())); - let ctlz32 = decl_cdecl_fn(llmod, ~"llvm.ctlz.i32", - T_fn(~[T_i32(), T_i1()], T_i32())); - let ctlz64 = decl_cdecl_fn(llmod, ~"llvm.ctlz.i64", - T_fn(~[T_i64(), T_i1()], T_i64())); - let cttz8 = decl_cdecl_fn(llmod, ~"llvm.cttz.i8", - T_fn(~[T_i8(), T_i1()], T_i8())); - let cttz16 = decl_cdecl_fn(llmod, ~"llvm.cttz.i16", - T_fn(~[T_i16(), T_i1()], T_i16())); - let cttz32 = decl_cdecl_fn(llmod, ~"llvm.cttz.i32", - T_fn(~[T_i32(), T_i1()], T_i32())); - let cttz64 = decl_cdecl_fn(llmod, ~"llvm.cttz.i64", - T_fn(~[T_i64(), T_i1()], T_i64())); - let bswap16 = decl_cdecl_fn(llmod, ~"llvm.bswap.i16", - T_fn(~[T_i16()], T_i16())); - let bswap32 = decl_cdecl_fn(llmod, ~"llvm.bswap.i32", - T_fn(~[T_i32()], T_i32())); - let bswap64 = decl_cdecl_fn(llmod, ~"llvm.bswap.i64", - T_fn(~[T_i64()], T_i64())); let mut intrinsics = LinearMap::new(); intrinsics.insert(~"llvm.gcroot", gcroot); @@ -2754,51 +2664,6 @@ pub fn declare_intrinsics(llmod: ModuleRef) -> LinearMap<~str, ValueRef> { intrinsics.insert(~"llvm.memset.p0i8.i64", memset64); intrinsics.insert(~"llvm.trap", trap); intrinsics.insert(~"llvm.frameaddress", frameaddress); - intrinsics.insert(~"llvm.sqrt.f32", sqrtf32); - intrinsics.insert(~"llvm.sqrt.f64", sqrtf64); - intrinsics.insert(~"llvm.powi.f32", powif32); - intrinsics.insert(~"llvm.powi.f64", powif64); - intrinsics.insert(~"llvm.sin.f32", sinf32); - intrinsics.insert(~"llvm.sin.f64", sinf64); - intrinsics.insert(~"llvm.cos.f32", cosf32); - intrinsics.insert(~"llvm.cos.f64", cosf64); - intrinsics.insert(~"llvm.pow.f32", powf32); - intrinsics.insert(~"llvm.pow.f64", powf64); - intrinsics.insert(~"llvm.exp.f32", expf32); - intrinsics.insert(~"llvm.exp.f64", expf64); - intrinsics.insert(~"llvm.exp2.f32", exp2f32); - intrinsics.insert(~"llvm.exp2.f64", exp2f64); - intrinsics.insert(~"llvm.log.f32", logf32); - intrinsics.insert(~"llvm.log.f64", logf64); - intrinsics.insert(~"llvm.log10.f32", log10f32); - intrinsics.insert(~"llvm.log10.f64", log10f64); - intrinsics.insert(~"llvm.log2.f32", log2f32); - intrinsics.insert(~"llvm.log2.f64", log2f64); - intrinsics.insert(~"llvm.fma.f32", fmaf32); - intrinsics.insert(~"llvm.fma.f64", fmaf64); - intrinsics.insert(~"llvm.fabs.f32", fabsf32); - intrinsics.insert(~"llvm.fabs.f64", fabsf64); - intrinsics.insert(~"llvm.floor.f32", floorf32); - intrinsics.insert(~"llvm.floor.f64", floorf64); - intrinsics.insert(~"llvm.ceil.f32", ceilf32); - intrinsics.insert(~"llvm.ceil.f64", ceilf64); - intrinsics.insert(~"llvm.trunc.f32", truncf32); - intrinsics.insert(~"llvm.trunc.f64", truncf64); - intrinsics.insert(~"llvm.ctpop.i8", ctpop8); - intrinsics.insert(~"llvm.ctpop.i16", ctpop16); - intrinsics.insert(~"llvm.ctpop.i32", ctpop32); - intrinsics.insert(~"llvm.ctpop.i64", ctpop64); - intrinsics.insert(~"llvm.ctlz.i8", ctlz8); - intrinsics.insert(~"llvm.ctlz.i16", ctlz16); - intrinsics.insert(~"llvm.ctlz.i32", ctlz32); - intrinsics.insert(~"llvm.ctlz.i64", ctlz64); - intrinsics.insert(~"llvm.cttz.i8", cttz8); - intrinsics.insert(~"llvm.cttz.i16", cttz16); - intrinsics.insert(~"llvm.cttz.i32", cttz32); - intrinsics.insert(~"llvm.cttz.i64", cttz64); - intrinsics.insert(~"llvm.bswap.i16", bswap16); - intrinsics.insert(~"llvm.bswap.i32", bswap32); - intrinsics.insert(~"llvm.bswap.i64", bswap64); return intrinsics; } diff --git a/src/librustc/middle/trans/foreign.rs b/src/librustc/middle/trans/foreign.rs index 7dc2e385e2cf6..08b534784e399 100644 --- a/src/librustc/middle/trans/foreign.rs +++ b/src/librustc/middle/trans/foreign.rs @@ -707,247 +707,6 @@ pub fn trans_intrinsic(ccx: @CrateContext, &~"llvm.memmove.p0i8.p0i8.i64"); Call(bcx, llfn, ~[dst_ptr, src_ptr, size, align, volatile]); } - ~"sqrtf32" => { - let x = get_param(decl, first_real_arg); - let sqrtf = *ccx.intrinsics.get(&~"llvm.sqrt.f32"); - Store(bcx, Call(bcx, sqrtf, ~[x]), fcx.llretptr); - } - ~"sqrtf64" => { - let x = get_param(decl, first_real_arg); - let sqrtf = *ccx.intrinsics.get(&~"llvm.sqrt.f64"); - Store(bcx, Call(bcx, sqrtf, ~[x]), fcx.llretptr); - } - ~"powif32" => { - let a = get_param(decl, first_real_arg); - let x = get_param(decl, first_real_arg + 1u); - let powif = *ccx.intrinsics.get(&~"llvm.powi.f32"); - Store(bcx, Call(bcx, powif, ~[a, x]), fcx.llretptr); - } - ~"powif64" => { - let a = get_param(decl, first_real_arg); - let x = get_param(decl, first_real_arg + 1u); - let powif = *ccx.intrinsics.get(&~"llvm.powi.f64"); - Store(bcx, Call(bcx, powif, ~[a, x]), fcx.llretptr); - } - ~"sinf32" => { - let x = get_param(decl, first_real_arg); - let sinf = *ccx.intrinsics.get(&~"llvm.sin.f32"); - Store(bcx, Call(bcx, sinf, ~[x]), fcx.llretptr); - } - ~"sinf64" => { - let x = get_param(decl, first_real_arg); - let sinf = *ccx.intrinsics.get(&~"llvm.sin.f64"); - Store(bcx, Call(bcx, sinf, ~[x]), fcx.llretptr); - } - ~"cosf32" => { - let x = get_param(decl, first_real_arg); - let cosf = *ccx.intrinsics.get(&~"llvm.cos.f32"); - Store(bcx, Call(bcx, cosf, ~[x]), fcx.llretptr); - } - ~"cosf64" => { - let x = get_param(decl, first_real_arg); - let cosf = *ccx.intrinsics.get(&~"llvm.cos.f64"); - Store(bcx, Call(bcx, cosf, ~[x]), fcx.llretptr); - } - ~"powf32" => { - let a = get_param(decl, first_real_arg); - let x = get_param(decl, first_real_arg + 1u); - let powf = *ccx.intrinsics.get(&~"llvm.pow.f32"); - Store(bcx, Call(bcx, powf, ~[a, x]), fcx.llretptr); - } - ~"powf64" => { - let a = get_param(decl, first_real_arg); - let x = get_param(decl, first_real_arg + 1u); - let powf = *ccx.intrinsics.get(&~"llvm.pow.f64"); - Store(bcx, Call(bcx, powf, ~[a, x]), fcx.llretptr); - } - ~"expf32" => { - let x = get_param(decl, first_real_arg); - let expf = *ccx.intrinsics.get(&~"llvm.exp.f32"); - Store(bcx, Call(bcx, expf, ~[x]), fcx.llretptr); - } - ~"expf64" => { - let x = get_param(decl, first_real_arg); - let expf = *ccx.intrinsics.get(&~"llvm.exp.f64"); - Store(bcx, Call(bcx, expf, ~[x]), fcx.llretptr); - } - ~"exp2f32" => { - let x = get_param(decl, first_real_arg); - let exp2f = *ccx.intrinsics.get(&~"llvm.exp2.f32"); - Store(bcx, Call(bcx, exp2f, ~[x]), fcx.llretptr); - } - ~"exp2f64" => { - let x = get_param(decl, first_real_arg); - let exp2f = *ccx.intrinsics.get(&~"llvm.exp2.f64"); - Store(bcx, Call(bcx, exp2f, ~[x]), fcx.llretptr); - } - ~"logf32" => { - let x = get_param(decl, first_real_arg); - let logf = *ccx.intrinsics.get(&~"llvm.log.f32"); - Store(bcx, Call(bcx, logf, ~[x]), fcx.llretptr); - } - ~"logf64" => { - let x = get_param(decl, first_real_arg); - let logf = *ccx.intrinsics.get(&~"llvm.log.f64"); - Store(bcx, Call(bcx, logf, ~[x]), fcx.llretptr); - } - ~"log10f32" => { - let x = get_param(decl, first_real_arg); - let log10f = *ccx.intrinsics.get(&~"llvm.log10.f32"); - Store(bcx, Call(bcx, log10f, ~[x]), fcx.llretptr); - } - ~"log10f64" => { - let x = get_param(decl, first_real_arg); - let log10f = *ccx.intrinsics.get(&~"llvm.log10.f64"); - Store(bcx, Call(bcx, log10f, ~[x]), fcx.llretptr); - } - ~"log2f32" => { - let x = get_param(decl, first_real_arg); - let log2f = *ccx.intrinsics.get(&~"llvm.log2.f32"); - Store(bcx, Call(bcx, log2f, ~[x]), fcx.llretptr); - } - ~"log2f64" => { - let x = get_param(decl, first_real_arg); - let log2f = *ccx.intrinsics.get(&~"llvm.log2.f64"); - Store(bcx, Call(bcx, log2f, ~[x]), fcx.llretptr); - } - ~"fmaf32" => { - let a = get_param(decl, first_real_arg); - let b = get_param(decl, first_real_arg + 1u); - let c = get_param(decl, first_real_arg + 2u); - let fmaf = *ccx.intrinsics.get(&~"llvm.fma.f32"); - Store(bcx, Call(bcx, fmaf, ~[a, b, c]), fcx.llretptr); - } - ~"fmaf64" => { - let a = get_param(decl, first_real_arg); - let b = get_param(decl, first_real_arg + 1u); - let c = get_param(decl, first_real_arg + 2u); - let fmaf = *ccx.intrinsics.get(&~"llvm.fma.f64"); - Store(bcx, Call(bcx, fmaf, ~[a, b, c]), fcx.llretptr); - } - ~"fabsf32" => { - let x = get_param(decl, first_real_arg); - let fabsf = *ccx.intrinsics.get(&~"llvm.fabs.f32"); - Store(bcx, Call(bcx, fabsf, ~[x]), fcx.llretptr); - } - ~"fabsf64" => { - let x = get_param(decl, first_real_arg); - let fabsf = *ccx.intrinsics.get(&~"llvm.fabs.f64"); - Store(bcx, Call(bcx, fabsf, ~[x]), fcx.llretptr); - } - ~"floorf32" => { - let x = get_param(decl, first_real_arg); - let floorf = *ccx.intrinsics.get(&~"llvm.floor.f32"); - Store(bcx, Call(bcx, floorf, ~[x]), fcx.llretptr); - } - ~"floorf64" => { - let x = get_param(decl, first_real_arg); - let floorf = *ccx.intrinsics.get(&~"llvm.floor.f64"); - Store(bcx, Call(bcx, floorf, ~[x]), fcx.llretptr); - } - ~"ceilf32" => { - let x = get_param(decl, first_real_arg); - let ceilf = *ccx.intrinsics.get(&~"llvm.ceil.f32"); - Store(bcx, Call(bcx, ceilf, ~[x]), fcx.llretptr); - } - ~"ceilf64" => { - let x = get_param(decl, first_real_arg); - let ceilf = *ccx.intrinsics.get(&~"llvm.ceil.f64"); - Store(bcx, Call(bcx, ceilf, ~[x]), fcx.llretptr); - } - ~"truncf32" => { - let x = get_param(decl, first_real_arg); - let truncf = *ccx.intrinsics.get(&~"llvm.trunc.f32"); - Store(bcx, Call(bcx, truncf, ~[x]), fcx.llretptr); - } - ~"truncf64" => { - let x = get_param(decl, first_real_arg); - let truncf = *ccx.intrinsics.get(&~"llvm.trunc.f64"); - Store(bcx, Call(bcx, truncf, ~[x]), fcx.llretptr); - } - ~"ctpop8" => { - let x = get_param(decl, first_real_arg); - let ctpop = *ccx.intrinsics.get(&~"llvm.ctpop.i8"); - Store(bcx, Call(bcx, ctpop, ~[x]), fcx.llretptr) - } - ~"ctpop16" => { - let x = get_param(decl, first_real_arg); - let ctpop = *ccx.intrinsics.get(&~"llvm.ctpop.i16"); - Store(bcx, Call(bcx, ctpop, ~[x]), fcx.llretptr) - } - ~"ctpop32" => { - let x = get_param(decl, first_real_arg); - let ctpop = *ccx.intrinsics.get(&~"llvm.ctpop.i32"); - Store(bcx, Call(bcx, ctpop, ~[x]), fcx.llretptr) - } - ~"ctpop64" => { - let x = get_param(decl, first_real_arg); - let ctpop = *ccx.intrinsics.get(&~"llvm.ctpop.i64"); - Store(bcx, Call(bcx, ctpop, ~[x]), fcx.llretptr) - } - ~"ctlz8" => { - let x = get_param(decl, first_real_arg); - let y = C_i1(false); - let ctlz = *ccx.intrinsics.get(&~"llvm.ctlz.i8"); - Store(bcx, Call(bcx, ctlz, ~[x, y]), fcx.llretptr) - } - ~"ctlz16" => { - let x = get_param(decl, first_real_arg); - let y = C_i1(false); - let ctlz = *ccx.intrinsics.get(&~"llvm.ctlz.i16"); - Store(bcx, Call(bcx, ctlz, ~[x, y]), fcx.llretptr) - } - ~"ctlz32" => { - let x = get_param(decl, first_real_arg); - let y = C_i1(false); - let ctlz = *ccx.intrinsics.get(&~"llvm.ctlz.i32"); - Store(bcx, Call(bcx, ctlz, ~[x, y]), fcx.llretptr) - } - ~"ctlz64" => { - let x = get_param(decl, first_real_arg); - let y = C_i1(false); - let ctlz = *ccx.intrinsics.get(&~"llvm.ctlz.i64"); - Store(bcx, Call(bcx, ctlz, ~[x, y]), fcx.llretptr) - } - ~"cttz8" => { - let x = get_param(decl, first_real_arg); - let y = C_i1(false); - let cttz = *ccx.intrinsics.get(&~"llvm.cttz.i8"); - Store(bcx, Call(bcx, cttz, ~[x, y]), fcx.llretptr) - } - ~"cttz16" => { - let x = get_param(decl, first_real_arg); - let y = C_i1(false); - let cttz = *ccx.intrinsics.get(&~"llvm.cttz.i16"); - Store(bcx, Call(bcx, cttz, ~[x, y]), fcx.llretptr) - } - ~"cttz32" => { - let x = get_param(decl, first_real_arg); - let y = C_i1(false); - let cttz = *ccx.intrinsics.get(&~"llvm.cttz.i32"); - Store(bcx, Call(bcx, cttz, ~[x, y]), fcx.llretptr) - } - ~"cttz64" => { - let x = get_param(decl, first_real_arg); - let y = C_i1(false); - let cttz = *ccx.intrinsics.get(&~"llvm.cttz.i64"); - Store(bcx, Call(bcx, cttz, ~[x, y]), fcx.llretptr) - } - ~"bswap16" => { - let x = get_param(decl, first_real_arg); - let cttz = *ccx.intrinsics.get(&~"llvm.bswap.i16"); - Store(bcx, Call(bcx, cttz, ~[x]), fcx.llretptr) - } - ~"bswap32" => { - let x = get_param(decl, first_real_arg); - let cttz = *ccx.intrinsics.get(&~"llvm.bswap.i32"); - Store(bcx, Call(bcx, cttz, ~[x]), fcx.llretptr) - } - ~"bswap64" => { - let x = get_param(decl, first_real_arg); - let cttz = *ccx.intrinsics.get(&~"llvm.bswap.i64"); - Store(bcx, Call(bcx, cttz, ~[x]), fcx.llretptr) - } _ => { // Could we make this an enum rather than a string? does it get // checked earlier? diff --git a/src/librustc/middle/trans/type_use.rs b/src/librustc/middle/trans/type_use.rs index 572e9348f63f0..32f8258358ea7 100644 --- a/src/librustc/middle/trans/type_use.rs +++ b/src/librustc/middle/trans/type_use.rs @@ -141,22 +141,6 @@ pub fn type_uses_for(ccx: @CrateContext, fn_id: def_id, n_tps: uint) ~"memmove32" | ~"memmove64" => 0, - ~"sqrtf32" | ~"sqrtf64" | ~"powif32" | ~"powif64" | - ~"sinf32" | ~"sinf64" | ~"cosf32" | ~"cosf64" | - ~"powf32" | ~"powf64" | ~"expf32" | ~"expf64" | - ~"exp2f32" | ~"exp2f64" | ~"logf32" | ~"logf64" | - ~"log10f32"| ~"log10f64"| ~"log2f32" | ~"log2f64" | - ~"fmaf32" | ~"fmaf64" | ~"fabsf32" | ~"fabsf64" | - ~"floorf32"| ~"floorf64"| ~"ceilf32" | ~"ceilf64" | - ~"truncf32"| ~"truncf64" => 0, - - ~"ctpop8" | ~"ctpop16" | ~"ctpop32" | ~"ctpop64" => 0, - - ~"ctlz8" | ~"ctlz16" | ~"ctlz32" | ~"ctlz64" => 0, - ~"cttz8" | ~"cttz16" | ~"cttz32" | ~"cttz64" => 0, - - ~"bswap16" | ~"bswap32" | ~"bswap64" => 0, - // would be cool to make these an enum instead of strings! _ => fail!(~"unknown intrinsic in type_use") }; diff --git a/src/librustc/middle/typeck/check/mod.rs b/src/librustc/middle/typeck/check/mod.rs index 056ccf185995b..2c8547f5c6e16 100644 --- a/src/librustc/middle/typeck/check/mod.rs +++ b/src/librustc/middle/typeck/check/mod.rs @@ -3488,194 +3488,6 @@ pub fn check_intrinsic_type(ccx: @mut CrateCtxt, it: @ast::foreign_item) { ty::mk_u64(tcx))], ty::mk_nil(tcx)) } - ~"sqrtf32" => { - (0u, ~[arg(ast::by_copy, ty::mk_f32(tcx))], - ty::mk_f32(tcx)) - } - ~"sqrtf64" => { - (0u, ~[arg(ast::by_copy, ty::mk_f64(tcx))], - ty::mk_f64(tcx)) - } - ~"powif32" => { - (0u, ~[arg(ast::by_copy, ty::mk_f32(tcx)), - arg(ast::by_copy, ty::mk_i32(tcx))], - ty::mk_f32(tcx)) - } - ~"powif64" => { - (0u, ~[arg(ast::by_copy, ty::mk_f64(tcx)), - arg(ast::by_copy, ty::mk_i32(tcx))], - ty::mk_f64(tcx)) - } - ~"sinf32" => { - (0u, ~[arg(ast::by_copy, ty::mk_f32(tcx))], - ty::mk_f32(tcx)) - } - ~"sinf64" => { - (0u, ~[arg(ast::by_copy, ty::mk_f64(tcx))], - ty::mk_f64(tcx)) - } - ~"cosf32" => { - (0u, ~[arg(ast::by_copy, ty::mk_f32(tcx))], - ty::mk_f32(tcx)) - } - ~"cosf64" => { - (0u, ~[arg(ast::by_copy, ty::mk_f64(tcx))], - ty::mk_f64(tcx)) - } - ~"powf32" => { - (0u, ~[arg(ast::by_copy, ty::mk_f32(tcx)), - arg(ast::by_copy, ty::mk_f32(tcx))], - ty::mk_f32(tcx)) - } - ~"powf64" => { - (0u, ~[arg(ast::by_copy, ty::mk_f64(tcx)), - arg(ast::by_copy, ty::mk_f64(tcx))], - ty::mk_f64(tcx)) - } - ~"expf32" => { - (0u, ~[arg(ast::by_copy, ty::mk_f32(tcx))], - ty::mk_f32(tcx)) - } - ~"expf64" => { - (0u, ~[arg(ast::by_copy, ty::mk_f64(tcx))], - ty::mk_f64(tcx)) - } - ~"exp2f32" => { - (0u, ~[arg(ast::by_copy, ty::mk_f32(tcx))], - ty::mk_f32(tcx)) - } - ~"exp2f64" => { - (0u, ~[arg(ast::by_copy, ty::mk_f64(tcx))], - ty::mk_f64(tcx)) - } - ~"logf32" => { - (0u, ~[arg(ast::by_copy, ty::mk_f32(tcx))], - ty::mk_f32(tcx)) - } - ~"logf64" => { - (0u, ~[arg(ast::by_copy, ty::mk_f64(tcx))], - ty::mk_f64(tcx)) - } - ~"log10f32" => { - (0u, ~[arg(ast::by_copy, ty::mk_f32(tcx))], - ty::mk_f32(tcx)) - } - ~"log10f64" => { - (0u, ~[arg(ast::by_copy, ty::mk_f64(tcx))], - ty::mk_f64(tcx)) - } - ~"log2f32" => { - (0u, ~[arg(ast::by_copy, ty::mk_f32(tcx))], - ty::mk_f32(tcx)) - } - ~"log2f64" => { - (0u, ~[arg(ast::by_copy, ty::mk_f64(tcx))], - ty::mk_f64(tcx)) - } - ~"fmaf32" => { - (0u, ~[arg(ast::by_copy, ty::mk_f32(tcx)), - arg(ast::by_copy, ty::mk_f32(tcx)), - arg(ast::by_copy, ty::mk_f32(tcx))], - ty::mk_f32(tcx)) - } - ~"fmaf64" => { - (0u, ~[arg(ast::by_copy, ty::mk_f64(tcx)), - arg(ast::by_copy, ty::mk_f64(tcx)), - arg(ast::by_copy, ty::mk_f64(tcx))], - ty::mk_f64(tcx)) - } - ~"fabsf32" => { - (0u, ~[arg(ast::by_copy, ty::mk_f32(tcx))], - ty::mk_f32(tcx)) - } - ~"fabsf64" => { - (0u, ~[arg(ast::by_copy, ty::mk_f64(tcx))], - ty::mk_f64(tcx)) - } - ~"floorf32" => { - (0u, ~[arg(ast::by_copy, ty::mk_f32(tcx))], - ty::mk_f32(tcx)) - } - ~"floorf64" => { - (0u, ~[arg(ast::by_copy, ty::mk_f64(tcx))], - ty::mk_f64(tcx)) - } - ~"ceilf32" => { - (0u, ~[arg(ast::by_copy, ty::mk_f32(tcx))], - ty::mk_f32(tcx)) - } - ~"ceilf64" => { - (0u, ~[arg(ast::by_copy, ty::mk_f64(tcx))], - ty::mk_f64(tcx)) - } - ~"truncf32" => { - (0u, ~[arg(ast::by_copy, ty::mk_f32(tcx))], - ty::mk_f32(tcx)) - } - ~"truncf64" => { - (0u, ~[arg(ast::by_copy, ty::mk_f64(tcx))], - ty::mk_f64(tcx)) - } - ~"ctpop8" => { - (0u, ~[arg(ast::by_copy, ty::mk_i8(tcx))], - ty::mk_i8(tcx)) - } - ~"ctpop16" => { - (0u, ~[arg(ast::by_copy, ty::mk_i16(tcx))], - ty::mk_i16(tcx)) - } - ~"ctpop32" => { - (0u, ~[arg(ast::by_copy, ty::mk_i32(tcx))], - ty::mk_i32(tcx)) - } - ~"ctpop64" => { - (0u, ~[arg(ast::by_copy, ty::mk_i64(tcx))], - ty::mk_i64(tcx)) - } - ~"ctlz8" => { - (0u, ~[arg(ast::by_copy, ty::mk_i8(tcx))], - ty::mk_i8(tcx)) - } - ~"ctlz16" => { - (0u, ~[arg(ast::by_copy, ty::mk_i16(tcx))], - ty::mk_i16(tcx)) - } - ~"ctlz32" => { - (0u, ~[arg(ast::by_copy, ty::mk_i32(tcx))], - ty::mk_i32(tcx)) - } - ~"ctlz64" => { - (0u, ~[arg(ast::by_copy, ty::mk_i64(tcx))], - ty::mk_i64(tcx)) - } - ~"cttz8" => { - (0u, ~[arg(ast::by_copy, ty::mk_i8(tcx))], - ty::mk_i8(tcx)) - } - ~"cttz16" => { - (0u, ~[arg(ast::by_copy, ty::mk_i16(tcx))], - ty::mk_i16(tcx)) - } - ~"cttz32" => { - (0u, ~[arg(ast::by_copy, ty::mk_i32(tcx))], - ty::mk_i32(tcx)) - } - ~"cttz64" => { - (0u, ~[arg(ast::by_copy, ty::mk_i64(tcx))], - ty::mk_i64(tcx)) - } - ~"bswap16" => { - (0u, ~[arg(ast::by_copy, ty::mk_i16(tcx))], - ty::mk_i16(tcx)) - } - ~"bswap32" => { - (0u, ~[arg(ast::by_copy, ty::mk_i32(tcx))], - ty::mk_i32(tcx)) - } - ~"bswap64" => { - (0u, ~[arg(ast::by_copy, ty::mk_i64(tcx))], - ty::mk_i64(tcx)) - } ref other => { tcx.sess.span_err(it.span, ~"unrecognized intrinsic function: `" + (*other) + ~"`"); diff --git a/src/test/run-pass/intrinsics-integer.rs b/src/test/run-pass/intrinsics-integer.rs index b96ea8cbb7b43..c7a1f686b2cae 100644 --- a/src/test/run-pass/intrinsics-integer.rs +++ b/src/test/run-pass/intrinsics-integer.rs @@ -10,35 +10,9 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -extern mod std; - -mod rusti { - #[abi = "rust-intrinsic"] - pub extern "rust-intrinsic" { - fn ctpop8(x: i8) -> i8; - fn ctpop16(x: i16) -> i16; - fn ctpop32(x: i32) -> i32; - fn ctpop64(x: i64) -> i64; - - fn ctlz8(x: i8) -> i8; - fn ctlz16(x: i16) -> i16; - fn ctlz32(x: i32) -> i32; - fn ctlz64(x: i64) -> i64; - - fn cttz8(x: i8) -> i8; - fn cttz16(x: i16) -> i16; - fn cttz32(x: i32) -> i32; - fn cttz64(x: i64) -> i64; - - fn bswap16(x: i16) -> i16; - fn bswap32(x: i32) -> i32; - fn bswap64(x: i64) -> i64; - } -} - pub fn main() { unsafe { - use rusti::*; + use core::unstable::intrinsics::llvm::*; assert!((ctpop8(0i8) == 0i8)); assert!((ctpop16(0i16) == 0i16)); @@ -65,6 +39,7 @@ pub fn main() { assert!((ctpop32(-1i32) == 32i32)); assert!((ctpop64(-1i64) == 64i64)); + /* NOTE: These depend on i8 constants, that are not currently available assert!((ctlz8(0i8) == 8i8)); assert!((ctlz16(0i16) == 16i16)); assert!((ctlz32(0i32) == 32i32)); @@ -114,6 +89,7 @@ pub fn main() { assert!((cttz16(-1i16) == 0i16)); assert!((cttz32(-1i32) == 0i32)); assert!((cttz64(-1i64) == 0i64)); + */ assert!((bswap16(0x0A0Bi16) == 0x0B0Ai16)); assert!((bswap32(0x0ABBCC0Di32) == 0x0DCCBB0Ai32)); diff --git a/src/test/run-pass/intrinsics-math.rs b/src/test/run-pass/intrinsics-math.rs index 60e32a56ee5d8..a8a4b29f51415 100644 --- a/src/test/run-pass/intrinsics-math.rs +++ b/src/test/run-pass/intrinsics-math.rs @@ -14,45 +14,9 @@ extern mod std; use std::cmp::FuzzyEq; -mod rusti { - #[abi = "rust-intrinsic"] - pub extern "rust-intrinsic" { - fn sqrtf32(x: f32) -> f32; - fn sqrtf64(x: f64) -> f64; - fn powif32(a: f32, x: i32) -> f32; - fn powif64(a: f64, x: i32) -> f64; - fn sinf32(x: f32) -> f32; - fn sinf64(x: f64) -> f64; - fn cosf32(x: f32) -> f32; - fn cosf64(x: f64) -> f64; - fn powf32(a: f32, x: f32) -> f32; - fn powf64(a: f64, x: f64) -> f64; - fn expf32(x: f32) -> f32; - fn expf64(x: f64) -> f64; - fn exp2f32(x: f32) -> f32; - fn exp2f64(x: f64) -> f64; - fn logf32(x: f32) -> f32; - fn logf64(x: f64) -> f64; - fn log10f32(x: f32) -> f32; - fn log10f64(x: f64) -> f64; - fn log2f32(x: f32) -> f32; - fn log2f64(x: f64) -> f64; - fn fmaf32(a: f32, b: f32, c: f32) -> f32; - fn fmaf64(a: f64, b: f64, c: f64) -> f64; - fn fabsf32(x: f32) -> f32; - fn fabsf64(x: f64) -> f64; - fn floorf32(x: f32) -> f32; - fn floorf64(x: f64) -> f64; - fn ceilf32(x: f32) -> f32; - fn ceilf64(x: f64) -> f64; - fn truncf32(x: f32) -> f32; - fn truncf64(x: f64) -> f64; - } -} - pub fn main() { unsafe { - use rusti::*; + use core::unstable::intrinsics::llvm::*; assert!((sqrtf32(64f32).fuzzy_eq(&8f32))); assert!((sqrtf64(64f64).fuzzy_eq(&8f64))); @@ -72,18 +36,22 @@ pub fn main() { assert!((fabsf32(expf32(1f32) - f32::consts::e).fuzzy_eq(&0f32))); assert!((expf64(1f64).fuzzy_eq(&f64::consts::e))); + /* NOTE: These are not documented in LLVM assert!((exp2f32(10f32).fuzzy_eq(&1024f32))); assert!((exp2f64(50f64).fuzzy_eq(&1125899906842624f64))); + */ assert!((fabsf32(logf32(f32::consts::e) - 1f32).fuzzy_eq(&0f32))); assert!((logf64(1f64).fuzzy_eq(&0f64))); + /* NOTE: These are not documented in LLVM assert!((log10f32(10f32).fuzzy_eq(&1f32))); assert!((log10f64(f64::consts::e).fuzzy_eq(&f64::consts::log10_e))); assert!((log2f32(8f32).fuzzy_eq(&3f32))); assert!((log2f64(f64::consts::e).fuzzy_eq(&f64::consts::log2_e))); - + */ + assert!((fmaf32(1.0f32, 2.0f32, 5.0f32).fuzzy_eq(&7.0f32))); assert!((fmaf64(0.0f64, -2.0f64, f64::consts::e).fuzzy_eq(&f64::consts::e))); @@ -93,12 +61,12 @@ pub fn main() { assert!((floorf32(3.8f32).fuzzy_eq(&3.0f32))); assert!((floorf64(-1.1f64).fuzzy_eq(&-2.0f64))); - // Causes linker error + // NOTE: Causes linker error on LLVM below 3.3 // undefined reference to llvm.ceil.f32/64 //assert!((ceilf32(-2.3f32) == -2.0f32)); //assert!((ceilf64(3.8f64) == 4.0f64)); - // Causes linker error + // NOTE: Causes linker error on LLVM below 3.3 // undefined reference to llvm.trunc.f32/64 //assert!((truncf32(0.1f32) == 0.0f32)); //assert!((truncf64(-0.1f64) == 0.0f64));