]> git.proxmox.com Git - rustc.git/blame - compiler/rustc_codegen_cranelift/src/intrinsics/llvm.rs
New upstream version 1.68.2+dfsg1
[rustc.git] / compiler / rustc_codegen_cranelift / src / intrinsics / llvm.rs
CommitLineData
29967ef6
XL
1//! Emulate LLVM intrinsics
2
3use crate::intrinsics::*;
4use crate::prelude::*;
5
6use rustc_middle::ty::subst::SubstsRef;
7
8pub(crate) fn codegen_llvm_intrinsic_call<'tcx>(
6a06907d 9 fx: &mut FunctionCx<'_, '_, 'tcx>,
29967ef6 10 intrinsic: &str,
9c376795 11 substs: SubstsRef<'tcx>,
29967ef6 12 args: &[mir::Operand<'tcx>],
923072b8
FG
13 ret: CPlace<'tcx>,
14 target: Option<BasicBlock>,
29967ef6 15) {
9c376795
FG
16 if intrinsic.starts_with("llvm.aarch64") {
17 return llvm_aarch64::codegen_aarch64_llvm_intrinsic_call(
18 fx, intrinsic, substs, args, ret, target,
19 );
20 }
21 if intrinsic.starts_with("llvm.x86") {
22 return llvm_x86::codegen_x86_llvm_intrinsic_call(fx, intrinsic, substs, args, ret, target);
23 }
2b03887a 24
9c376795
FG
25 match intrinsic {
26 _ if intrinsic.starts_with("llvm.ctlz.v") => {
064997fb
FG
27 intrinsic_args!(fx, args => (a); intrinsic);
28
9c376795
FG
29 simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _res_lane_ty, lane| {
30 fx.bcx.ins().clz(lane)
29967ef6 31 });
064997fb 32 }
064997fb 33
9c376795
FG
34 _ if intrinsic.starts_with("llvm.ctpop.v") => {
35 intrinsic_args!(fx, args => (a); intrinsic);
064997fb 36
9c376795
FG
37 simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _res_lane_ty, lane| {
38 fx.bcx.ins().popcnt(lane)
29967ef6 39 });
064997fb 40 }
064997fb 41
064997fb
FG
42 _ => {
43 fx.tcx
44 .sess
45 .warn(&format!("unsupported llvm intrinsic {}; replacing with trap", intrinsic));
46 crate::trap::trap_unimplemented(fx, intrinsic);
f2b60f7d 47 return;
064997fb 48 }
29967ef6
XL
49 }
50
923072b8 51 let dest = target.expect("all llvm intrinsics used by stdlib should return");
5e7ed085
FG
52 let ret_block = fx.get_block(dest);
53 fx.bcx.ins().jump(ret_block, &[]);
29967ef6 54}