X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Flibrustc_codegen_llvm%2Fintrinsic.rs;h=dc3631e2ee17b3927a4613373a91444d91019833;hb=4c98cb6f7586d92be37c94c6063fa9645a448e92;hp=060c295eb7af19b13664aea56355b193626481d8;hpb=93fc627c7d4d15bd45a0a900260897fd9a0bb958;p=rust.git diff --git a/src/librustc_codegen_llvm/intrinsic.rs b/src/librustc_codegen_llvm/intrinsic.rs index 060c295eb7a..dc3631e2ee1 100644 --- a/src/librustc_codegen_llvm/intrinsic.rs +++ b/src/librustc_codegen_llvm/intrinsic.rs @@ -55,6 +55,10 @@ fn get_simple_intrinsic(cx: &CodegenCx<'ll, '_>, name: &str) -> Option<&'ll Valu "fmaf64" => "llvm.fma.f64", "fabsf32" => "llvm.fabs.f32", "fabsf64" => "llvm.fabs.f64", + "minnumf32" => "llvm.minnum.f32", + "minnumf64" => "llvm.minnum.f64", + "maxnumf32" => "llvm.maxnum.f32", + "maxnumf64" => "llvm.maxnum.f64", "copysignf32" => "llvm.copysign.f32", "copysignf64" => "llvm.copysign.f64", "floorf32" => "llvm.floor.f32", @@ -212,7 +216,7 @@ fn codegen_intrinsic_call( } "type_name" => { let tp_ty = substs.type_at(0); - let ty_name = rustc_mir::interpret::type_name(self.tcx, tp_ty); + let ty_name = self.tcx.type_name(tp_ty); OperandRef::from_const(self, ty_name).immediate_or_packed_pair(self) } "type_id" => { @@ -334,7 +338,8 @@ fn codegen_intrinsic_call( "ctlz" | "ctlz_nonzero" | "cttz" | "cttz_nonzero" | "ctpop" | "bswap" | "bitreverse" | "add_with_overflow" | "sub_with_overflow" | "mul_with_overflow" | "overflowing_add" | "overflowing_sub" | "overflowing_mul" | - "unchecked_div" | "unchecked_rem" | "unchecked_shl" | "unchecked_shr" | "exact_div" | + "unchecked_div" | "unchecked_rem" | "unchecked_shl" | "unchecked_shr" | + "unchecked_add" | "unchecked_sub" | "unchecked_mul" | "exact_div" | "rotate_left" | "rotate_right" | "saturating_add" | "saturating_sub" => { let ty = arg_tys[0]; match int_type_width_signed(ty, self) { @@ -430,6 +435,27 @@ fn codegen_intrinsic_call( } else { self.lshr(args[0].immediate(), args[1].immediate()) }, + "unchecked_add" => { + if signed { + self.unchecked_sadd(args[0].immediate(), args[1].immediate()) + } else { + self.unchecked_uadd(args[0].immediate(), args[1].immediate()) + } + }, + "unchecked_sub" => { + if signed { + self.unchecked_ssub(args[0].immediate(), args[1].immediate()) + } else { + self.unchecked_usub(args[0].immediate(), args[1].immediate()) + } + }, + "unchecked_mul" => { + if signed { + self.unchecked_smul(args[0].immediate(), args[1].immediate()) + } else { + self.unchecked_umul(args[0].immediate(), args[1].immediate()) + } + }, "rotate_left" | "rotate_right" => { let is_left = name == "rotate_left"; let val = args[0].immediate(); @@ -915,8 +941,8 @@ fn codegen_msvc_try( bx.store(ret, dest, i32_align); } -// Definition of the standard "try" function for Rust using the GNU-like model -// of exceptions (e.g., the normal semantics of LLVM's landingpad and invoke +// Definition of the standard `try` function for Rust using the GNU-like model +// of exceptions (e.g., the normal semantics of LLVM's `landingpad` and `invoke` // instructions). // // This codegen is a little surprising because we always call a shim @@ -1391,7 +1417,7 @@ macro_rules! return_error { // FIXME: use: // https://github.com/llvm-mirror/llvm/blob/master/include/llvm/IR/Function.h#L182 // https://github.com/llvm-mirror/llvm/blob/master/include/llvm/IR/Intrinsics.h#L81 - fn llvm_vector_str(elem_ty: ty::Ty<'_>, vec_len: usize, no_pointers: usize) -> String { + fn llvm_vector_str(elem_ty: Ty<'_>, vec_len: usize, no_pointers: usize) -> String { let p0s: String = "p0".repeat(no_pointers); match elem_ty.sty { ty::Int(v) => format!("v{}{}i{}", vec_len, p0s, v.bit_width().unwrap()), @@ -1401,7 +1427,7 @@ fn llvm_vector_str(elem_ty: ty::Ty<'_>, vec_len: usize, no_pointers: usize) -> S } } - fn llvm_vector_ty(cx: &CodegenCx<'ll, '_>, elem_ty: ty::Ty<'_>, vec_len: usize, + fn llvm_vector_ty(cx: &CodegenCx<'ll, '_>, elem_ty: Ty<'_>, vec_len: usize, mut no_pointers: usize) -> &'ll Type { // FIXME: use cx.layout_of(ty).llvm_type() ? let mut elem_ty = match elem_ty.sty { @@ -1447,7 +1473,7 @@ fn llvm_vector_ty(cx: &CodegenCx<'ll, '_>, elem_ty: ty::Ty<'_>, vec_len: usize, in_ty, ret_ty); // This counts how many pointers - fn ptr_count(t: ty::Ty<'_>) -> usize { + fn ptr_count(t: Ty<'_>) -> usize { match t.sty { ty::RawPtr(p) => 1 + ptr_count(p.ty), _ => 0, @@ -1455,7 +1481,7 @@ fn ptr_count(t: ty::Ty<'_>) -> usize { } // Non-ptr type - fn non_ptr(t: ty::Ty<'_>) -> ty::Ty<'_> { + fn non_ptr(t: Ty<'_>) -> Ty<'_> { match t.sty { ty::RawPtr(p) => non_ptr(p.ty), _ => t, @@ -1546,7 +1572,7 @@ fn non_ptr(t: ty::Ty<'_>) -> ty::Ty<'_> { arg_tys[2].simd_size(tcx)); // This counts how many pointers - fn ptr_count(t: ty::Ty<'_>) -> usize { + fn ptr_count(t: Ty<'_>) -> usize { match t.sty { ty::RawPtr(p) => 1 + ptr_count(p.ty), _ => 0, @@ -1554,7 +1580,7 @@ fn ptr_count(t: ty::Ty<'_>) -> usize { } // Non-ptr type - fn non_ptr(t: ty::Ty<'_>) -> ty::Ty<'_> { + fn non_ptr(t: Ty<'_>) -> Ty<'_> { match t.sty { ty::RawPtr(p) => non_ptr(p.ty), _ => t,