]>
Commit | Line | Data |
---|---|---|
29967ef6 XL |
1 | //! Emulate LLVM intrinsics |
2 | ||
3 | use crate::intrinsics::*; | |
4 | use crate::prelude::*; | |
5 | ||
6 | use rustc_middle::ty::subst::SubstsRef; | |
7 | ||
8 | pub(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 | } |