From 9b801672b017ffeb04e4f80180d3b1c42b7a2102 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Fri, 29 Nov 2013 19:01:09 -0500 Subject: [PATCH] remove the `simple_llvm_intrinsic` wrappers This removes a layer of generated wrappers from native LLVM intrinsics we can represent directly in the type system. There are a lot with `i1` parameters so there's still a need for those to be in the compiler. These are an implementation detail of the compiler, so the inconsistency is worth the simplification and faster compiles. --- src/librustc/middle/trans/intrinsic.rs | 67 --------- src/librustc/middle/typeck/check/mod.rs | 71 --------- src/libstd/unstable/intrinsics.rs | 183 +++++++++++++++--------- src/test/run-pass/intrinsics-integer.rs | 19 ++- src/test/run-pass/intrinsics-math.rs | 32 ++++- 5 files changed, 161 insertions(+), 211 deletions(-) diff --git a/src/librustc/middle/trans/intrinsic.rs b/src/librustc/middle/trans/intrinsic.rs index e57eed480eb53..e17e7c619233e 100644 --- a/src/librustc/middle/trans/intrinsic.rs +++ b/src/librustc/middle/trans/intrinsic.rs @@ -38,18 +38,6 @@ pub fn trans_intrinsic(ccx: @mut CrateContext, ref_id: Option) { debug!("trans_intrinsic(item.ident={})", ccx.sess.str_of(item.ident)); - fn simple_llvm_intrinsic(bcx: @mut Block, name: &'static str, num_args: uint) { - assert!(num_args <= 4); - let mut args = [0 as ValueRef, ..4]; - let first_real_arg = bcx.fcx.arg_pos(0u); - for i in range(0u, num_args) { - args[i] = get_param(bcx.fcx.llfn, first_real_arg + i); - } - let llfn = bcx.ccx().intrinsics.get_copy(&name); - let llcall = Call(bcx, llfn, args.slice(0, num_args), []); - Ret(bcx, llcall); - } - fn with_overflow_instrinsic(bcx: @mut Block, name: &'static str, t: ty::t) { let first_real_arg = bcx.fcx.arg_pos(0u); let a = get_param(bcx.fcx.llfn, first_real_arg); @@ -223,16 +211,6 @@ pub fn trans_intrinsic(ccx: @mut CrateContext, } match name { - "abort" => { - let llfn = bcx.ccx().intrinsics.get_copy(&("llvm.trap")); - Call(bcx, llfn, [], []); - Unreachable(bcx); - } - "breakpoint" => { - let llfn = bcx.ccx().intrinsics.get_copy(&("llvm.debugtrap")); - Call(bcx, llfn, [], []); - RetVoid(bcx); - } "size_of" => { let tp_ty = substs.tys[0]; let lltp_ty = type_of::type_of(ccx, tp_ty); @@ -417,48 +395,6 @@ pub fn trans_intrinsic(ccx: @mut CrateContext, "copy_nonoverlapping_memory" => copy_intrinsic(bcx, false, substs.tys[0]), "copy_memory" => copy_intrinsic(bcx, true, substs.tys[0]), "set_memory" => memset_intrinsic(bcx, substs.tys[0]), - "sqrtf32" => simple_llvm_intrinsic(bcx, "llvm.sqrt.f32", 1), - "sqrtf64" => simple_llvm_intrinsic(bcx, "llvm.sqrt.f64", 1), - "powif32" => simple_llvm_intrinsic(bcx, "llvm.powi.f32", 2), - "powif64" => simple_llvm_intrinsic(bcx, "llvm.powi.f64", 2), - "sinf32" => simple_llvm_intrinsic(bcx, "llvm.sin.f32", 1), - "sinf64" => simple_llvm_intrinsic(bcx, "llvm.sin.f64", 1), - "cosf32" => simple_llvm_intrinsic(bcx, "llvm.cos.f32", 1), - "cosf64" => simple_llvm_intrinsic(bcx, "llvm.cos.f64", 1), - "powf32" => simple_llvm_intrinsic(bcx, "llvm.pow.f32", 2), - "powf64" => simple_llvm_intrinsic(bcx, "llvm.pow.f64", 2), - "expf32" => simple_llvm_intrinsic(bcx, "llvm.exp.f32", 1), - "expf64" => simple_llvm_intrinsic(bcx, "llvm.exp.f64", 1), - "exp2f32" => simple_llvm_intrinsic(bcx, "llvm.exp2.f32", 1), - "exp2f64" => simple_llvm_intrinsic(bcx, "llvm.exp2.f64", 1), - "logf32" => simple_llvm_intrinsic(bcx, "llvm.log.f32", 1), - "logf64" => simple_llvm_intrinsic(bcx, "llvm.log.f64", 1), - "log10f32" => simple_llvm_intrinsic(bcx, "llvm.log10.f32", 1), - "log10f64" => simple_llvm_intrinsic(bcx, "llvm.log10.f64", 1), - "log2f32" => simple_llvm_intrinsic(bcx, "llvm.log2.f32", 1), - "log2f64" => simple_llvm_intrinsic(bcx, "llvm.log2.f64", 1), - "fmaf32" => simple_llvm_intrinsic(bcx, "llvm.fma.f32", 3), - "fmaf64" => simple_llvm_intrinsic(bcx, "llvm.fma.f64", 3), - "fabsf32" => simple_llvm_intrinsic(bcx, "llvm.fabs.f32", 1), - "fabsf64" => simple_llvm_intrinsic(bcx, "llvm.fabs.f64", 1), - "copysignf32" => simple_llvm_intrinsic(bcx, "llvm.copysign.f32", 2), - "copysignf64" => simple_llvm_intrinsic(bcx, "llvm.copysign.f64", 2), - "floorf32" => simple_llvm_intrinsic(bcx, "llvm.floor.f32", 1), - "floorf64" => simple_llvm_intrinsic(bcx, "llvm.floor.f64", 1), - "ceilf32" => simple_llvm_intrinsic(bcx, "llvm.ceil.f32", 1), - "ceilf64" => simple_llvm_intrinsic(bcx, "llvm.ceil.f64", 1), - "truncf32" => simple_llvm_intrinsic(bcx, "llvm.trunc.f32", 1), - "truncf64" => simple_llvm_intrinsic(bcx, "llvm.trunc.f64", 1), - "rintf32" => simple_llvm_intrinsic(bcx, "llvm.rint.f32", 1), - "rintf64" => simple_llvm_intrinsic(bcx, "llvm.rint.f64", 1), - "nearbyintf32" => simple_llvm_intrinsic(bcx, "llvm.nearbyint.f32", 1), - "nearbyintf64" => simple_llvm_intrinsic(bcx, "llvm.nearbyint.f64", 1), - "roundf32" => simple_llvm_intrinsic(bcx, "llvm.round.f32", 1), - "roundf64" => simple_llvm_intrinsic(bcx, "llvm.round.f64", 1), - "ctpop8" => simple_llvm_intrinsic(bcx, "llvm.ctpop.i8", 1), - "ctpop16" => simple_llvm_intrinsic(bcx, "llvm.ctpop.i16", 1), - "ctpop32" => simple_llvm_intrinsic(bcx, "llvm.ctpop.i32", 1), - "ctpop64" => simple_llvm_intrinsic(bcx, "llvm.ctpop.i64", 1), "ctlz8" => count_zeros_intrinsic(bcx, "llvm.ctlz.i8"), "ctlz16" => count_zeros_intrinsic(bcx, "llvm.ctlz.i16"), "ctlz32" => count_zeros_intrinsic(bcx, "llvm.ctlz.i32"), @@ -467,9 +403,6 @@ pub fn trans_intrinsic(ccx: @mut CrateContext, "cttz16" => count_zeros_intrinsic(bcx, "llvm.cttz.i16"), "cttz32" => count_zeros_intrinsic(bcx, "llvm.cttz.i32"), "cttz64" => count_zeros_intrinsic(bcx, "llvm.cttz.i64"), - "bswap16" => simple_llvm_intrinsic(bcx, "llvm.bswap.i16", 1), - "bswap32" => simple_llvm_intrinsic(bcx, "llvm.bswap.i32", 1), - "bswap64" => simple_llvm_intrinsic(bcx, "llvm.bswap.i64", 1), "i8_add_with_overflow" => with_overflow_instrinsic(bcx, "llvm.sadd.with.overflow.i8", output_type), diff --git a/src/librustc/middle/typeck/check/mod.rs b/src/librustc/middle/typeck/check/mod.rs index 8caf873a8896a..4c4024bea551d 100644 --- a/src/librustc/middle/typeck/check/mod.rs +++ b/src/librustc/middle/typeck/check/mod.rs @@ -3973,8 +3973,6 @@ pub fn check_intrinsic_type(ccx: @mut CrateCtxt, it: @ast::foreign_item) { } else { match name { - "abort" => (0, ~[], ty::mk_bot()), - "breakpoint" => (0, ~[], ty::mk_nil()), "size_of" | "pref_align_of" | "min_align_of" => (1u, ~[], ty::mk_uint()), "init" => (1u, ~[], param(ccx, 0u)), @@ -4090,72 +4088,6 @@ pub fn check_intrinsic_type(ccx: @mut CrateCtxt, it: @ast::foreign_item) { ], ty::mk_nil()) } - "sqrtf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()), - "sqrtf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()), - "powif32" => { - (0, - ~[ ty::mk_f32(), ty::mk_i32() ], - ty::mk_f32()) - } - "powif64" => { - (0, - ~[ ty::mk_f64(), ty::mk_i32() ], - ty::mk_f64()) - } - "sinf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()), - "sinf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()), - "cosf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()), - "cosf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()), - "powf32" => { - (0, - ~[ ty::mk_f32(), ty::mk_f32() ], - ty::mk_f32()) - } - "powf64" => { - (0, - ~[ ty::mk_f64(), ty::mk_f64() ], - ty::mk_f64()) - } - "expf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()), - "expf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()), - "exp2f32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()), - "exp2f64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()), - "logf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()), - "logf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()), - "log10f32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()), - "log10f64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()), - "log2f32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()), - "log2f64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()), - "fmaf32" => { - (0, - ~[ ty::mk_f32(), ty::mk_f32(), ty::mk_f32() ], - ty::mk_f32()) - } - "fmaf64" => { - (0, - ~[ ty::mk_f64(), ty::mk_f64(), ty::mk_f64() ], - ty::mk_f64()) - } - "fabsf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()), - "fabsf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()), - "copysignf32" => (0, ~[ ty::mk_f32(), ty::mk_f32() ], ty::mk_f32()), - "copysignf64" => (0, ~[ ty::mk_f64(), ty::mk_f64() ], ty::mk_f64()), - "floorf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()), - "floorf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()), - "ceilf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()), - "ceilf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()), - "truncf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()), - "truncf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()), - "rintf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()), - "rintf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()), - "nearbyintf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()), - "nearbyintf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()), - "roundf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()), - "roundf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()), - "ctpop8" => (0, ~[ ty::mk_i8() ], ty::mk_i8()), - "ctpop16" => (0, ~[ ty::mk_i16() ], ty::mk_i16()), - "ctpop32" => (0, ~[ ty::mk_i32() ], ty::mk_i32()), - "ctpop64" => (0, ~[ ty::mk_i64() ], ty::mk_i64()), "ctlz8" => (0, ~[ ty::mk_i8() ], ty::mk_i8()), "ctlz16" => (0, ~[ ty::mk_i16() ], ty::mk_i16()), "ctlz32" => (0, ~[ ty::mk_i32() ], ty::mk_i32()), @@ -4164,9 +4096,6 @@ pub fn check_intrinsic_type(ccx: @mut CrateCtxt, it: @ast::foreign_item) { "cttz16" => (0, ~[ ty::mk_i16() ], ty::mk_i16()), "cttz32" => (0, ~[ ty::mk_i32() ], ty::mk_i32()), "cttz64" => (0, ~[ ty::mk_i64() ], ty::mk_i64()), - "bswap16" => (0, ~[ ty::mk_i16() ], ty::mk_i16()), - "bswap32" => (0, ~[ ty::mk_i32() ], ty::mk_i32()), - "bswap64" => (0, ~[ ty::mk_i64() ], ty::mk_i64()), "i8_add_with_overflow" | "i8_sub_with_overflow" | "i8_mul_with_overflow" => (0, ~[ty::mk_i8(), ty::mk_i8()], diff --git a/src/libstd/unstable/intrinsics.rs b/src/libstd/unstable/intrinsics.rs index 89a51a5ddddd3..da49c9e65a4dd 100644 --- a/src/libstd/unstable/intrinsics.rs +++ b/src/libstd/unstable/intrinsics.rs @@ -172,13 +172,128 @@ pub trait TyVisitor { fn visit_closure_ptr(&mut self, ck: uint) -> bool; } -extern "rust-intrinsic" { +extern { /// Abort the execution of the process. + #[link_name = "llvm.trap"] pub fn abort() -> !; /// Execute a breakpoint trap, for inspection by a debugger. + #[link_name = "llvm.debugtrap"] pub fn breakpoint(); + #[link_name = "llvm.sqrt.f32"] + pub fn sqrtf32(x: f32) -> f32; + #[link_name = "llvm.sqrt.f64"] + pub fn sqrtf64(x: f64) -> f64; + + #[link_name = "llvm.powi.f32"] + pub fn powif32(a: f32, x: i32) -> f32; + #[link_name = "llvm.powi.f64"] + pub fn powif64(a: f64, x: i32) -> f64; + + #[link_name = "llvm.sin.f32"] + pub fn sinf32(x: f32) -> f32; + #[link_name = "llvm.sin.f64"] + pub fn sinf64(x: f64) -> f64; + + #[link_name = "llvm.cos.f32"] + pub fn cosf32(x: f32) -> f32; + #[link_name = "llvm.cos.f64"] + pub fn cosf64(x: f64) -> f64; + + #[link_name = "llvm.pow.f32"] + pub fn powf32(a: f32, x: f32) -> f32; + #[link_name = "llvm.pow.f64"] + pub fn powf64(a: f64, x: f64) -> f64; + + #[link_name = "llvm.exp.f32"] + pub fn expf32(x: f32) -> f32; + #[link_name = "llvm.exp.f64"] + pub fn expf64(x: f64) -> f64; + + #[link_name = "llvm.exp2.f32"] + pub fn exp2f32(x: f32) -> f32; + #[link_name = "llvm.exp2.f64"] + pub fn exp2f64(x: f64) -> f64; + + #[link_name = "llvm.log.f32"] + pub fn logf32(x: f32) -> f32; + #[link_name = "llvm.log.f64"] + pub fn logf64(x: f64) -> f64; + + #[link_name = "llvm.log10.f32"] + pub fn log10f32(x: f32) -> f32; + #[link_name = "llvm.log10.f64"] + pub fn log10f64(x: f64) -> f64; + + #[link_name = "llvm.log2.f32"] + pub fn log2f32(x: f32) -> f32; + #[link_name = "llvm.log2.f64"] + pub fn log2f64(x: f64) -> f64; + + #[link_name = "llvm.fma.f32"] + pub fn fmaf32(a: f32, b: f32, c: f32) -> f32; + #[link_name = "llvm.fma.f64"] + pub fn fmaf64(a: f64, b: f64, c: f64) -> f64; + + #[link_name = "llvm.fabs.f32"] + pub fn fabsf32(x: f32) -> f32; + #[link_name = "llvm.fabs.f64"] + pub fn fabsf64(x: f64) -> f64; + + #[link_name = "llvm.copysign.f32"] + pub fn copysignf32(x: f32, y: f32) -> f32; + #[link_name = "llvm.copysign.f64"] + pub fn copysignf64(x: f64, y: f64) -> f64; + + #[link_name = "llvm.floor.f32"] + pub fn floorf32(x: f32) -> f32; + #[link_name = "llvm.floor.f64"] + pub fn floorf64(x: f64) -> f64; + + #[link_name = "llvm.ceil.f32"] + pub fn ceilf32(x: f32) -> f32; + #[link_name = "llvm.ceil.f64"] + pub fn ceilf64(x: f64) -> f64; + + #[link_name = "llvm.trunc.f32"] + pub fn truncf32(x: f32) -> f32; + #[link_name = "llvm.trunc.f64"] + pub fn truncf64(x: f64) -> f64; + + #[link_name = "llvm.rint.f32"] + pub fn rintf32(x: f32) -> f32; + #[link_name = "llvm.rint.f64"] + pub fn rintf64(x: f64) -> f64; + + #[link_name = "llvm.nearbyint.f32"] + pub fn nearbyintf32(x: f32) -> f32; + #[link_name = "llvm.nearbyint.f64"] + pub fn nearbyintf64(x: f64) -> f64; + + #[link_name = "llvm.round.f32"] + pub fn roundf32(x: f32) -> f32; + #[link_name = "llvm.round.f64"] + pub fn roundf64(x: f64) -> f64; + + #[link_name = "llvm.ctpop.i8"] + pub fn ctpop8(x: i8) -> i8; + #[link_name = "llvm.ctpop.i16"] + pub fn ctpop16(x: i16) -> i16; + #[link_name = "llvm.ctpop.i32"] + pub fn ctpop32(x: i32) -> i32; + #[link_name = "llvm.ctpop.i64"] + pub fn ctpop64(x: i64) -> i64; + + #[link_name = "llvm.bswap.i16"] + pub fn bswap16(x: i16) -> i16; + #[link_name = "llvm.bswap.i32"] + pub fn bswap32(x: i32) -> i32; + #[link_name = "llvm.bswap.i64"] + pub fn bswap64(x: i64) -> i64; +} + +extern "rust-intrinsic" { /// Atomic compare and exchange, sequentially consistent. pub fn atomic_cxchg(dst: &mut int, old: int, src: int) -> int; /// Atomic compare and exchange, acquire ordering. @@ -366,68 +481,6 @@ extern "rust-intrinsic" { /// `min_align_of::()` pub fn set_memory(dst: *mut T, val: u8, count: uint); - pub fn sqrtf32(x: f32) -> f32; - pub fn sqrtf64(x: f64) -> f64; - - pub fn powif32(a: f32, x: i32) -> f32; - pub fn powif64(a: f64, x: i32) -> f64; - - pub fn sinf32(x: f32) -> f32; - pub fn sinf64(x: f64) -> f64; - - pub fn cosf32(x: f32) -> f32; - pub fn cosf64(x: f64) -> f64; - - pub fn powf32(a: f32, x: f32) -> f32; - pub fn powf64(a: f64, x: f64) -> f64; - - pub fn expf32(x: f32) -> f32; - pub fn expf64(x: f64) -> f64; - - pub fn exp2f32(x: f32) -> f32; - pub fn exp2f64(x: f64) -> f64; - - pub fn logf32(x: f32) -> f32; - pub fn logf64(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; - - pub fn fmaf32(a: f32, b: f32, c: f32) -> f32; - pub fn fmaf64(a: f64, b: f64, c: f64) -> f64; - - pub fn fabsf32(x: f32) -> f32; - pub fn fabsf64(x: f64) -> f64; - - pub fn copysignf32(x: f32, y: f32) -> f32; - pub fn copysignf64(x: f64, y: f64) -> f64; - - pub fn floorf32(x: f32) -> f32; - pub fn floorf64(x: f64) -> f64; - - pub fn ceilf32(x: f32) -> f32; - pub fn ceilf64(x: f64) -> f64; - - pub fn truncf32(x: f32) -> f32; - pub fn truncf64(x: f64) -> f64; - - pub fn rintf32(x: f32) -> f32; - pub fn rintf64(x: f64) -> f64; - - pub fn nearbyintf32(x: f32) -> f32; - pub fn nearbyintf64(x: f64) -> f64; - - pub fn roundf32(x: f32) -> f32; - pub fn roundf64(x: f64) -> f64; - - pub fn ctpop8(x: i8) -> i8; - 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; @@ -438,10 +491,6 @@ extern "rust-intrinsic" { pub fn cttz32(x: i32) -> i32; pub fn cttz64(x: i64) -> i64; - pub fn bswap16(x: i16) -> i16; - pub fn bswap32(x: i32) -> i32; - pub fn bswap64(x: i64) -> i64; - pub fn i8_add_with_overflow(x: i8, y: i8) -> (i8, bool); pub fn i16_add_with_overflow(x: i16, y: i16) -> (i16, bool); pub fn i32_add_with_overflow(x: i32, y: i32) -> (i32, bool); diff --git a/src/test/run-pass/intrinsics-integer.rs b/src/test/run-pass/intrinsics-integer.rs index e45472634e619..c285324c1765d 100644 --- a/src/test/run-pass/intrinsics-integer.rs +++ b/src/test/run-pass/intrinsics-integer.rs @@ -15,12 +15,25 @@ extern mod extra; mod rusti { - extern "rust-intrinsic" { + extern { + #[link_name = "llvm.ctpop.i8"] pub fn ctpop8(x: i8) -> i8; + #[link_name = "llvm.ctpop.i16"] pub fn ctpop16(x: i16) -> i16; + #[link_name = "llvm.ctpop.i32"] pub fn ctpop32(x: i32) -> i32; + #[link_name = "llvm.ctpop.i64"] pub fn ctpop64(x: i64) -> i64; + #[link_name = "llvm.bswap.i16"] + pub fn bswap16(x: i16) -> i16; + #[link_name = "llvm.bswap.i32"] + pub fn bswap32(x: i32) -> i32; + #[link_name = "llvm.bswap.i64"] + pub fn bswap64(x: i64) -> i64; + } + + extern "rust-intrinsic" { pub fn ctlz8(x: i8) -> i8; pub fn ctlz16(x: i16) -> i16; pub fn ctlz32(x: i32) -> i32; @@ -30,10 +43,6 @@ mod rusti { pub fn cttz16(x: i16) -> i16; pub fn cttz32(x: i32) -> i32; pub fn cttz64(x: i64) -> i64; - - pub fn bswap16(x: i16) -> i16; - pub fn bswap32(x: i32) -> i32; - pub fn bswap64(x: i64) -> i64; } } diff --git a/src/test/run-pass/intrinsics-math.rs b/src/test/run-pass/intrinsics-math.rs index 2a6143979feb1..c313f776043f4 100644 --- a/src/test/run-pass/intrinsics-math.rs +++ b/src/test/run-pass/intrinsics-math.rs @@ -13,36 +13,66 @@ #[feature(globs)]; mod rusti { - extern "rust-intrinsic" { + extern { + #[link_name = "llvm.sqrt.f32"] pub fn sqrtf32(x: f32) -> f32; + #[link_name = "llvm.sqrt.f64"] pub fn sqrtf64(x: f64) -> f64; + #[link_name = "llvm.powi.f32"] pub fn powif32(a: f32, x: i32) -> f32; + #[link_name = "llvm.powi.f64"] pub fn powif64(a: f64, x: i32) -> f64; + #[link_name = "llvm.sin.f32"] pub fn sinf32(x: f32) -> f32; + #[link_name = "llvm.sin.f64"] pub fn sinf64(x: f64) -> f64; + #[link_name = "llvm.cos.f32"] pub fn cosf32(x: f32) -> f32; + #[link_name = "llvm.cos.f64"] pub fn cosf64(x: f64) -> f64; + #[link_name = "llvm.pow.f32"] pub fn powf32(a: f32, x: f32) -> f32; + #[link_name = "llvm.pow.f64"] pub fn powf64(a: f64, x: f64) -> f64; + #[link_name = "llvm.exp.f32"] pub fn expf32(x: f32) -> f32; + #[link_name = "llvm.exp.f64"] pub fn expf64(x: f64) -> f64; + #[link_name = "llvm.exp2.f32"] pub fn exp2f32(x: f32) -> f32; + #[link_name = "llvm.exp2.f64"] pub fn exp2f64(x: f64) -> f64; + #[link_name = "llvm.log.f32"] pub fn logf32(x: f32) -> f32; + #[link_name = "llvm.log.f64"] pub fn logf64(x: f64) -> f64; + #[link_name = "llvm.log10.f32"] pub fn log10f32(x: f32) -> f32; + #[link_name = "llvm.log10.f64"] pub fn log10f64(x: f64) -> f64; + #[link_name = "llvm.log2.f32"] pub fn log2f32(x: f32) -> f32; + #[link_name = "llvm.log2.f64"] pub fn log2f64(x: f64) -> f64; + #[link_name = "llvm.fma.f32"] pub fn fmaf32(a: f32, b: f32, c: f32) -> f32; + #[link_name = "llvm.fma.f64"] pub fn fmaf64(a: f64, b: f64, c: f64) -> f64; + #[link_name = "llvm.fabs.f32"] pub fn fabsf32(x: f32) -> f32; + #[link_name = "llvm.fabs.f64"] pub fn fabsf64(x: f64) -> f64; + #[link_name = "llvm.floor.f32"] pub fn floorf32(x: f32) -> f32; + #[link_name = "llvm.floor.f64"] pub fn floorf64(x: f64) -> f64; + #[link_name = "llvm.ceil.f32"] pub fn ceilf32(x: f32) -> f32; + #[link_name = "llvm.ceil.f64"] pub fn ceilf64(x: f64) -> f64; + #[link_name = "llvm.trunc.f32"] pub fn truncf32(x: f32) -> f32; + #[link_name = "llvm.trunc.f64"] pub fn truncf64(x: f64) -> f64; } }