1 //! Emulate LLVM intrinsics
3 use crate::intrinsics::*;
6 use rustc_middle::ty::subst::SubstsRef;
8 pub(crate) fn codegen_llvm_intrinsic_call<'tcx>(
9 fx: &mut FunctionCx<'_, '_, 'tcx>,
11 substs: SubstsRef<'tcx>,
12 args: &[mir::Operand<'tcx>],
14 target: Option<BasicBlock>,
16 if intrinsic.starts_with("llvm.aarch64") {
17 return llvm_aarch64::codegen_aarch64_llvm_intrinsic_call(
18 fx, intrinsic, substs, args, ret, target,
21 if intrinsic.starts_with("llvm.x86") {
22 return llvm_x86::codegen_x86_llvm_intrinsic_call(fx, intrinsic, substs, args, ret, target);
26 _ if intrinsic.starts_with("llvm.ctlz.v") => {
27 intrinsic_args!(fx, args => (a); intrinsic);
29 simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _res_lane_ty, lane| {
30 fx.bcx.ins().clz(lane)
34 _ if intrinsic.starts_with("llvm.ctpop.v") => {
35 intrinsic_args!(fx, args => (a); intrinsic);
37 simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _res_lane_ty, lane| {
38 fx.bcx.ins().popcnt(lane)
45 .warn(&format!("unsupported llvm intrinsic {}; replacing with trap", intrinsic));
46 crate::trap::trap_unimplemented(fx, intrinsic);
51 let dest = target.expect("all llvm intrinsics used by stdlib should return");
52 let ret_block = fx.get_block(dest);
53 fx.bcx.ins().jump(ret_block, &[]);