Skip to content

remove the simple_llvm_intrinsic wrappers #10730

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 0 additions & 67 deletions src/librustc/middle/trans/intrinsic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,18 +38,6 @@ pub fn trans_intrinsic(ccx: @mut CrateContext,
ref_id: Option<ast::NodeId>) {
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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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"),
Expand All @@ -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),
Expand Down
71 changes: 0 additions & 71 deletions src/librustc/middle/typeck/check/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)),
Expand Down Expand Up @@ -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()),
Expand All @@ -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()],
Expand Down
183 changes: 116 additions & 67 deletions src/libstd/unstable/intrinsics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -366,68 +481,6 @@ extern "rust-intrinsic" {
/// `min_align_of::<T>()`
pub fn set_memory<T>(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;
Expand All @@ -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);
Expand Down
Loading