Rollup merge of #137489 - RalfJung:no-more-rustc_intrinsic_must_be_overridden, r=oli-obk
remove `#[rustc_intrinsic_must_be_overridde]` In https://github.com/rust-lang/rust/pull/135031, we gained support for just leaving away the body. Now that the bootstrap compiler got bumped, stop using the old style and remove support for it. r? `@oli-obk` There are a few more mentions of this attribute in RA code that I didn't touch; Cc `@rust-lang/rust-analyzer`
This commit is contained in:
commit
8f729e9cff
28 changed files with 427 additions and 1636 deletions
|
@ -620,70 +620,31 @@ pub union MaybeUninit<T> {
|
|||
|
||||
pub mod intrinsics {
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn abort() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub fn abort() -> !;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn size_of<T>() -> usize {
|
||||
loop {}
|
||||
}
|
||||
pub fn size_of<T>() -> usize;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn size_of_val<T: ?::Sized>(_val: *const T) -> usize {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn size_of_val<T: ?::Sized>(_val: *const T) -> usize;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn min_align_of<T>() -> usize {
|
||||
loop {}
|
||||
}
|
||||
pub fn min_align_of<T>() -> usize;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn min_align_of_val<T: ?::Sized>(_val: *const T) -> usize {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn min_align_of_val<T: ?::Sized>(_val: *const T) -> usize;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn copy<T>(_src: *const T, _dst: *mut T, _count: usize) {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn copy<T>(_src: *const T, _dst: *mut T, _count: usize);
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn transmute<T, U>(_e: T) -> U {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn transmute<T, U>(_e: T) -> U;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn ctlz_nonzero<T>(_x: T) -> u32 {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn ctlz_nonzero<T>(_x: T) -> u32;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn needs_drop<T: ?::Sized>() -> bool {
|
||||
loop {}
|
||||
}
|
||||
pub fn needs_drop<T: ?::Sized>() -> bool;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn bitreverse<T>(_x: T) -> T {
|
||||
loop {}
|
||||
}
|
||||
pub fn bitreverse<T>(_x: T) -> T;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn bswap<T>(_x: T) -> T {
|
||||
loop {}
|
||||
}
|
||||
pub fn bswap<T>(_x: T) -> T;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn write_bytes<T>(_dst: *mut T, _val: u8, _count: usize) {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn write_bytes<T>(_dst: *mut T, _val: u8, _count: usize);
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn unreachable() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn unreachable() -> !;
|
||||
}
|
||||
|
||||
pub mod libc {
|
||||
|
|
|
@ -591,70 +591,31 @@ pub union MaybeUninit<T> {
|
|||
|
||||
pub mod intrinsics {
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn abort() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub fn abort() -> !;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn size_of<T>() -> usize {
|
||||
loop {}
|
||||
}
|
||||
pub fn size_of<T>() -> usize;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn size_of_val<T: ?::Sized>(_val: *const T) -> usize {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn size_of_val<T: ?::Sized>(_val: *const T) -> usize;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn min_align_of<T>() -> usize {
|
||||
loop {}
|
||||
}
|
||||
pub fn min_align_of<T>() -> usize;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn min_align_of_val<T: ?::Sized>(_val: *const T) -> usize {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn min_align_of_val<T: ?::Sized>(_val: *const T) -> usize;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn copy<T>(_src: *const T, _dst: *mut T, _count: usize) {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn copy<T>(_src: *const T, _dst: *mut T, _count: usize);
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn transmute<T, U>(_e: T) -> U {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn transmute<T, U>(_e: T) -> U;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn ctlz_nonzero<T>(_x: T) -> u32 {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn ctlz_nonzero<T>(_x: T) -> u32;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn needs_drop<T: ?::Sized>() -> bool {
|
||||
loop {}
|
||||
}
|
||||
pub fn needs_drop<T: ?::Sized>() -> bool;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn bitreverse<T>(_x: T) -> T {
|
||||
loop {}
|
||||
}
|
||||
pub fn bitreverse<T>(_x: T) -> T;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn bswap<T>(_x: T) -> T {
|
||||
loop {}
|
||||
}
|
||||
pub fn bswap<T>(_x: T) -> T;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn write_bytes<T>(_dst: *mut T, _val: u8, _count: usize) {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn write_bytes<T>(_dst: *mut T, _val: u8, _count: usize);
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn unreachable() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn unreachable() -> !;
|
||||
}
|
||||
|
||||
pub mod libc {
|
||||
|
|
|
@ -36,10 +36,7 @@ mod intrinsics {
|
|||
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn abort() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub fn abort() -> !;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -36,10 +36,7 @@ mod intrinsics {
|
|||
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn abort() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub fn abort() -> !;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -59,10 +59,7 @@ mod libc {
|
|||
mod intrinsics {
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn abort() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub fn abort() -> !;
|
||||
}
|
||||
|
||||
#[lang = "panic"]
|
||||
|
|
|
@ -61,10 +61,7 @@ mod libc {
|
|||
mod intrinsics {
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn abort() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub fn abort() -> !;
|
||||
}
|
||||
|
||||
#[lang = "panic"]
|
||||
|
|
|
@ -67,10 +67,7 @@ mod libc {
|
|||
mod intrinsics {
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn abort() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub fn abort() -> !;
|
||||
}
|
||||
|
||||
#[lang = "panic"]
|
||||
|
|
|
@ -49,10 +49,7 @@ mod intrinsics {
|
|||
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn abort() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub fn abort() -> !;
|
||||
}
|
||||
|
||||
mod libc {
|
||||
|
|
|
@ -7,12 +7,8 @@ Erroneous code example:
|
|||
#![allow(internal_features)]
|
||||
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
fn size_of<T, U>() -> usize // error: intrinsic has wrong number
|
||||
// of type parameters
|
||||
{
|
||||
loop {}
|
||||
}
|
||||
fn size_of<T, U>() -> usize; // error: intrinsic has wrong number
|
||||
// of type parameters
|
||||
```
|
||||
|
||||
Please check that you provided the right number of type parameters
|
||||
|
@ -24,9 +20,5 @@ Example:
|
|||
#![allow(internal_features)]
|
||||
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
fn size_of<T>() -> usize // ok!
|
||||
{
|
||||
loop {}
|
||||
}
|
||||
fn size_of<T>() -> usize; // ok!
|
||||
```
|
||||
|
|
|
@ -1005,10 +1005,6 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
rustc_intrinsic, Normal, template!(Word), ErrorFollowing, EncodeCrossCrate::Yes, intrinsics,
|
||||
"the `#[rustc_intrinsic]` attribute is used to declare intrinsics as function items",
|
||||
),
|
||||
gated!(
|
||||
rustc_intrinsic_must_be_overridden, Normal, template!(Word), ErrorFollowing, EncodeCrossCrate::Yes, intrinsics,
|
||||
"the `#[rustc_intrinsic_must_be_overridden]` attribute is used to declare intrinsics without real bodies",
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_no_mir_inline, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::Yes,
|
||||
"#[rustc_no_mir_inline] prevents the MIR inliner from inlining a function while not affecting codegen"
|
||||
|
|
|
@ -1755,13 +1755,12 @@ pub fn intrinsic_raw(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<ty::Intrinsi
|
|||
&& (matches!(tcx.fn_sig(def_id).skip_binder().abi(), ExternAbi::RustIntrinsic)
|
||||
|| tcx.has_attr(def_id, sym::rustc_intrinsic))
|
||||
{
|
||||
let must_be_overridden = tcx.has_attr(def_id, sym::rustc_intrinsic_must_be_overridden)
|
||||
|| match tcx.hir_node_by_def_id(def_id) {
|
||||
hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn { has_body, .. }, .. }) => {
|
||||
!has_body
|
||||
}
|
||||
_ => true,
|
||||
};
|
||||
let must_be_overridden = match tcx.hir_node_by_def_id(def_id) {
|
||||
hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn { has_body, .. }, .. }) => {
|
||||
!has_body
|
||||
}
|
||||
_ => true,
|
||||
};
|
||||
Some(ty::IntrinsicDef {
|
||||
name: tcx.item_name(def_id.into()),
|
||||
must_be_overridden,
|
||||
|
|
|
@ -1764,7 +1764,6 @@ symbols! {
|
|||
rustc_insignificant_dtor,
|
||||
rustc_intrinsic,
|
||||
rustc_intrinsic_const_stable_indirect,
|
||||
rustc_intrinsic_must_be_overridden,
|
||||
rustc_layout,
|
||||
rustc_layout_scalar_valid_range_end,
|
||||
rustc_layout_scalar_valid_range_start,
|
||||
|
|
|
@ -238,11 +238,8 @@ pub struct Box<
|
|||
///
|
||||
/// This is the surface syntax for `box <expr>` expressions.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[unstable(feature = "liballoc_internals", issue = "none")]
|
||||
pub fn box_new<T>(_x: T) -> Box<T> {
|
||||
unreachable!()
|
||||
}
|
||||
pub fn box_new<T>(_x: T) -> Box<T>;
|
||||
|
||||
impl<T> Box<T> {
|
||||
/// Allocates memory on the heap and then places `x` into it.
|
||||
|
|
|
@ -305,25 +305,16 @@ impl<'f> Drop for VaListImpl<'f> {
|
|||
/// Destroy the arglist `ap` after initialization with `va_start` or
|
||||
/// `va_copy`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
unsafe fn va_end(_ap: &mut VaListImpl<'_>) {
|
||||
unreachable!()
|
||||
}
|
||||
unsafe fn va_end(_ap: &mut VaListImpl<'_>);
|
||||
|
||||
/// Copies the current location of arglist `src` to the arglist `dst`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
unsafe fn va_copy<'f>(_dest: *mut VaListImpl<'f>, _src: &VaListImpl<'f>) {
|
||||
unreachable!()
|
||||
}
|
||||
unsafe fn va_copy<'f>(_dest: *mut VaListImpl<'f>, _src: &VaListImpl<'f>);
|
||||
|
||||
/// Loads an argument of type `T` from the `va_list` `ap` and increment the
|
||||
/// argument `ap` points to.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
unsafe fn va_arg<T: sealed_trait::VaArgSafe>(_ap: &mut VaListImpl<'_>) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
unsafe fn va_arg<T: sealed_trait::VaArgSafe>(_ap: &mut VaListImpl<'_>) -> T;
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -10,11 +10,8 @@
|
|||
///
|
||||
/// `idx` must be in-bounds of the vector.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_insert<T, U>(_x: T, _idx: u32, _val: U) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_insert<T, U>(_x: T, _idx: u32, _val: U) -> T;
|
||||
|
||||
/// Extracts an element from a vector.
|
||||
///
|
||||
|
@ -24,41 +21,29 @@ pub unsafe fn simd_insert<T, U>(_x: T, _idx: u32, _val: U) -> T {
|
|||
///
|
||||
/// `idx` must be in-bounds of the vector.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_extract<T, U>(_x: T, _idx: u32) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_extract<T, U>(_x: T, _idx: u32) -> U;
|
||||
|
||||
/// Adds two simd vectors elementwise.
|
||||
///
|
||||
/// `T` must be a vector of integer or floating point primitive types.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_add<T>(_x: T, _y: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_add<T>(_x: T, _y: T) -> T;
|
||||
|
||||
/// Subtracts `rhs` from `lhs` elementwise.
|
||||
///
|
||||
/// `T` must be a vector of integer or floating point primitive types.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_sub<T>(_lhs: T, _rhs: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_sub<T>(_lhs: T, _rhs: T) -> T;
|
||||
|
||||
/// Multiplies two simd vectors elementwise.
|
||||
///
|
||||
/// `T` must be a vector of integer or floating point primitive types.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_mul<T>(_x: T, _y: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_mul<T>(_x: T, _y: T) -> T;
|
||||
|
||||
/// Divides `lhs` by `rhs` elementwise.
|
||||
///
|
||||
|
@ -68,11 +53,8 @@ pub unsafe fn simd_mul<T>(_x: T, _y: T) -> T {
|
|||
/// For integers, `rhs` must not contain any zero elements.
|
||||
/// Additionally for signed integers, `<int>::MIN / -1` is undefined behavior.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_div<T>(_lhs: T, _rhs: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_div<T>(_lhs: T, _rhs: T) -> T;
|
||||
|
||||
/// Returns remainder of two vectors elementwise.
|
||||
///
|
||||
|
@ -82,11 +64,8 @@ pub unsafe fn simd_div<T>(_lhs: T, _rhs: T) -> T {
|
|||
/// For integers, `rhs` must not contain any zero elements.
|
||||
/// Additionally for signed integers, `<int>::MIN / -1` is undefined behavior.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_rem<T>(_lhs: T, _rhs: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_rem<T>(_lhs: T, _rhs: T) -> T;
|
||||
|
||||
/// Shifts vector left elementwise, with UB on overflow.
|
||||
///
|
||||
|
@ -98,11 +77,8 @@ pub unsafe fn simd_rem<T>(_lhs: T, _rhs: T) -> T {
|
|||
///
|
||||
/// Each element of `rhs` must be less than `<int>::BITS`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_shl<T>(_lhs: T, _rhs: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_shl<T>(_lhs: T, _rhs: T) -> T;
|
||||
|
||||
/// Shifts vector right elementwise, with UB on overflow.
|
||||
///
|
||||
|
@ -114,41 +90,29 @@ pub unsafe fn simd_shl<T>(_lhs: T, _rhs: T) -> T {
|
|||
///
|
||||
/// Each element of `rhs` must be less than `<int>::BITS`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_shr<T>(_lhs: T, _rhs: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_shr<T>(_lhs: T, _rhs: T) -> T;
|
||||
|
||||
/// "Ands" vectors elementwise.
|
||||
///
|
||||
/// `T` must be a vector of integer primitive types.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_and<T>(_x: T, _y: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_and<T>(_x: T, _y: T) -> T;
|
||||
|
||||
/// "Ors" vectors elementwise.
|
||||
///
|
||||
/// `T` must be a vector of integer primitive types.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_or<T>(_x: T, _y: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_or<T>(_x: T, _y: T) -> T;
|
||||
|
||||
/// "Exclusive ors" vectors elementwise.
|
||||
///
|
||||
/// `T` must be a vector of integer primitive types.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_xor<T>(_x: T, _y: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_xor<T>(_x: T, _y: T) -> T;
|
||||
|
||||
/// Numerically casts a vector, elementwise.
|
||||
///
|
||||
|
@ -169,11 +133,8 @@ pub unsafe fn simd_xor<T>(_x: T, _y: T) -> T {
|
|||
/// * Not be infinite
|
||||
/// * Be representable in the return type, after truncating off its fractional part
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_cast<T, U>(_x: T) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_cast<T, U>(_x: T) -> U;
|
||||
|
||||
/// Numerically casts a vector, elementwise.
|
||||
///
|
||||
|
@ -187,11 +148,8 @@ pub unsafe fn simd_cast<T, U>(_x: T) -> U {
|
|||
/// When casting integers to floats, the result is rounded.
|
||||
/// Otherwise, truncates or extends the value, maintaining the sign for signed integers.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_as<T, U>(_x: T) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_as<T, U>(_x: T) -> U;
|
||||
|
||||
/// Negates a vector elementwise.
|
||||
///
|
||||
|
@ -199,21 +157,15 @@ pub unsafe fn simd_as<T, U>(_x: T) -> U {
|
|||
///
|
||||
/// Rust panics for `-<int>::Min` due to overflow, but it is not UB with this intrinsic.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_neg<T>(_x: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_neg<T>(_x: T) -> T;
|
||||
|
||||
/// Returns absolute value of a vector, elementwise.
|
||||
///
|
||||
/// `T` must be a vector of floating-point primitive types.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_fabs<T>(_x: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_fabs<T>(_x: T) -> T;
|
||||
|
||||
/// Returns the minimum of two vectors, elementwise.
|
||||
///
|
||||
|
@ -221,11 +173,8 @@ pub unsafe fn simd_fabs<T>(_x: T) -> T {
|
|||
///
|
||||
/// Follows IEEE-754 `minNum` semantics.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_fmin<T>(_x: T, _y: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_fmin<T>(_x: T, _y: T) -> T;
|
||||
|
||||
/// Returns the maximum of two vectors, elementwise.
|
||||
///
|
||||
|
@ -233,11 +182,8 @@ pub unsafe fn simd_fmin<T>(_x: T, _y: T) -> T {
|
|||
///
|
||||
/// Follows IEEE-754 `maxNum` semantics.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_fmax<T>(_x: T, _y: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_fmax<T>(_x: T, _y: T) -> T;
|
||||
|
||||
/// Tests elementwise equality of two vectors.
|
||||
///
|
||||
|
@ -247,11 +193,8 @@ pub unsafe fn simd_fmax<T>(_x: T, _y: T) -> T {
|
|||
///
|
||||
/// Returns `0` for false and `!0` for true.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_eq<T, U>(_x: T, _y: T) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_eq<T, U>(_x: T, _y: T) -> U;
|
||||
|
||||
/// Tests elementwise inequality equality of two vectors.
|
||||
///
|
||||
|
@ -261,11 +204,8 @@ pub unsafe fn simd_eq<T, U>(_x: T, _y: T) -> U {
|
|||
///
|
||||
/// Returns `0` for false and `!0` for true.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_ne<T, U>(_x: T, _y: T) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_ne<T, U>(_x: T, _y: T) -> U;
|
||||
|
||||
/// Tests if `x` is less than `y`, elementwise.
|
||||
///
|
||||
|
@ -275,11 +215,8 @@ pub unsafe fn simd_ne<T, U>(_x: T, _y: T) -> U {
|
|||
///
|
||||
/// Returns `0` for false and `!0` for true.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_lt<T, U>(_x: T, _y: T) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_lt<T, U>(_x: T, _y: T) -> U;
|
||||
|
||||
/// Tests if `x` is less than or equal to `y`, elementwise.
|
||||
///
|
||||
|
@ -289,11 +226,8 @@ pub unsafe fn simd_lt<T, U>(_x: T, _y: T) -> U {
|
|||
///
|
||||
/// Returns `0` for false and `!0` for true.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_le<T, U>(_x: T, _y: T) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_le<T, U>(_x: T, _y: T) -> U;
|
||||
|
||||
/// Tests if `x` is greater than `y`, elementwise.
|
||||
///
|
||||
|
@ -303,11 +237,8 @@ pub unsafe fn simd_le<T, U>(_x: T, _y: T) -> U {
|
|||
///
|
||||
/// Returns `0` for false and `!0` for true.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_gt<T, U>(_x: T, _y: T) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_gt<T, U>(_x: T, _y: T) -> U;
|
||||
|
||||
/// Tests if `x` is greater than or equal to `y`, elementwise.
|
||||
///
|
||||
|
@ -317,11 +248,8 @@ pub unsafe fn simd_gt<T, U>(_x: T, _y: T) -> U {
|
|||
///
|
||||
/// Returns `0` for false and `!0` for true.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_ge<T, U>(_x: T, _y: T) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_ge<T, U>(_x: T, _y: T) -> U;
|
||||
|
||||
/// Shuffles two vectors by const indices.
|
||||
///
|
||||
|
@ -336,11 +264,8 @@ pub unsafe fn simd_ge<T, U>(_x: T, _y: T) -> U {
|
|||
/// is the concatenation of `x` and `y`. It is a compile-time error if `idx[i]` is out-of-bounds
|
||||
/// of `xy`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_shuffle<T, U, V>(_x: T, _y: T, _idx: U) -> V {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_shuffle<T, U, V>(_x: T, _y: T, _idx: U) -> V;
|
||||
|
||||
/// Reads a vector of pointers.
|
||||
///
|
||||
|
@ -360,11 +285,8 @@ pub unsafe fn simd_shuffle<T, U, V>(_x: T, _y: T, _idx: U) -> V {
|
|||
///
|
||||
/// `mask` must only contain `0` or `!0` values.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_gather<T, U, V>(_val: T, _ptr: U, _mask: V) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_gather<T, U, V>(_val: T, _ptr: U, _mask: V) -> T;
|
||||
|
||||
/// Writes to a vector of pointers.
|
||||
///
|
||||
|
@ -387,11 +309,8 @@ pub unsafe fn simd_gather<T, U, V>(_val: T, _ptr: U, _mask: V) -> T {
|
|||
///
|
||||
/// `mask` must only contain `0` or `!0` values.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_scatter<T, U, V>(_val: T, _ptr: U, _mask: V) {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_scatter<T, U, V>(_val: T, _ptr: U, _mask: V);
|
||||
|
||||
/// Reads a vector of pointers.
|
||||
///
|
||||
|
@ -413,11 +332,8 @@ pub unsafe fn simd_scatter<T, U, V>(_val: T, _ptr: U, _mask: V) {
|
|||
///
|
||||
/// `mask` must only contain `0` or `!0` values.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_masked_load<V, U, T>(_mask: V, _ptr: U, _val: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_masked_load<V, U, T>(_mask: V, _ptr: U, _val: T) -> T;
|
||||
|
||||
/// Writes to a vector of pointers.
|
||||
///
|
||||
|
@ -438,21 +354,15 @@ pub unsafe fn simd_masked_load<V, U, T>(_mask: V, _ptr: U, _val: T) -> T {
|
|||
///
|
||||
/// `mask` must only contain `0` or `!0` values.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_masked_store<V, U, T>(_mask: V, _ptr: U, _val: T) {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_masked_store<V, U, T>(_mask: V, _ptr: U, _val: T);
|
||||
|
||||
/// Adds two simd vectors elementwise, with saturation.
|
||||
///
|
||||
/// `T` must be a vector of integer primitive types.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_saturating_add<T>(_x: T, _y: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_saturating_add<T>(_x: T, _y: T) -> T;
|
||||
|
||||
/// Subtracts two simd vectors elementwise, with saturation.
|
||||
///
|
||||
|
@ -460,11 +370,8 @@ pub unsafe fn simd_saturating_add<T>(_x: T, _y: T) -> T {
|
|||
///
|
||||
/// Subtract `rhs` from `lhs`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_saturating_sub<T>(_lhs: T, _rhs: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_saturating_sub<T>(_lhs: T, _rhs: T) -> T;
|
||||
|
||||
/// Adds elements within a vector from left to right.
|
||||
///
|
||||
|
@ -474,11 +381,8 @@ pub unsafe fn simd_saturating_sub<T>(_lhs: T, _rhs: T) -> T {
|
|||
///
|
||||
/// Starting with the value `y`, add the elements of `x` and accumulate.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_add_ordered<T, U>(_x: T, _y: U) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_reduce_add_ordered<T, U>(_x: T, _y: U) -> U;
|
||||
|
||||
/// Adds elements within a vector in arbitrary order. May also be re-associated with
|
||||
/// unordered additions on the inputs/outputs.
|
||||
|
@ -487,11 +391,8 @@ pub unsafe fn simd_reduce_add_ordered<T, U>(_x: T, _y: U) -> U {
|
|||
///
|
||||
/// `U` must be the element type of `T`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_add_unordered<T, U>(_x: T) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_reduce_add_unordered<T, U>(_x: T) -> U;
|
||||
|
||||
/// Multiplies elements within a vector from left to right.
|
||||
///
|
||||
|
@ -501,11 +402,8 @@ pub unsafe fn simd_reduce_add_unordered<T, U>(_x: T) -> U {
|
|||
///
|
||||
/// Starting with the value `y`, multiply the elements of `x` and accumulate.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_mul_ordered<T, U>(_x: T, _y: U) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_reduce_mul_ordered<T, U>(_x: T, _y: U) -> U;
|
||||
|
||||
/// Multiplies elements within a vector in arbitrary order. May also be re-associated with
|
||||
/// unordered additions on the inputs/outputs.
|
||||
|
@ -514,11 +412,8 @@ pub unsafe fn simd_reduce_mul_ordered<T, U>(_x: T, _y: U) -> U {
|
|||
///
|
||||
/// `U` must be the element type of `T`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_mul_unordered<T, U>(_x: T) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_reduce_mul_unordered<T, U>(_x: T) -> U;
|
||||
|
||||
/// Checks if all mask values are true.
|
||||
///
|
||||
|
@ -527,11 +422,8 @@ pub unsafe fn simd_reduce_mul_unordered<T, U>(_x: T) -> U {
|
|||
/// # Safety
|
||||
/// `x` must contain only `0` or `!0`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_all<T>(_x: T) -> bool {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_reduce_all<T>(_x: T) -> bool;
|
||||
|
||||
/// Checks if any mask value is true.
|
||||
///
|
||||
|
@ -540,11 +432,8 @@ pub unsafe fn simd_reduce_all<T>(_x: T) -> bool {
|
|||
/// # Safety
|
||||
/// `x` must contain only `0` or `!0`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_any<T>(_x: T) -> bool {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_reduce_any<T>(_x: T) -> bool;
|
||||
|
||||
/// Returns the maximum element of a vector.
|
||||
///
|
||||
|
@ -554,11 +443,8 @@ pub unsafe fn simd_reduce_any<T>(_x: T) -> bool {
|
|||
///
|
||||
/// For floating-point values, uses IEEE-754 `maxNum`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_max<T, U>(_x: T) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_reduce_max<T, U>(_x: T) -> U;
|
||||
|
||||
/// Returns the minimum element of a vector.
|
||||
///
|
||||
|
@ -568,11 +454,8 @@ pub unsafe fn simd_reduce_max<T, U>(_x: T) -> U {
|
|||
///
|
||||
/// For floating-point values, uses IEEE-754 `minNum`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_min<T, U>(_x: T) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_reduce_min<T, U>(_x: T) -> U;
|
||||
|
||||
/// Logical "ands" all elements together.
|
||||
///
|
||||
|
@ -580,11 +463,8 @@ pub unsafe fn simd_reduce_min<T, U>(_x: T) -> U {
|
|||
///
|
||||
/// `U` must be the element type of `T`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_and<T, U>(_x: T) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_reduce_and<T, U>(_x: T) -> U;
|
||||
|
||||
/// Logical "ors" all elements together.
|
||||
///
|
||||
|
@ -592,11 +472,8 @@ pub unsafe fn simd_reduce_and<T, U>(_x: T) -> U {
|
|||
///
|
||||
/// `U` must be the element type of `T`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_or<T, U>(_x: T) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_reduce_or<T, U>(_x: T) -> U;
|
||||
|
||||
/// Logical "exclusive ors" all elements together.
|
||||
///
|
||||
|
@ -604,11 +481,8 @@ pub unsafe fn simd_reduce_or<T, U>(_x: T) -> U {
|
|||
///
|
||||
/// `U` must be the element type of `T`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_xor<T, U>(_x: T) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_reduce_xor<T, U>(_x: T) -> U;
|
||||
|
||||
/// Truncates an integer vector to a bitmask.
|
||||
///
|
||||
|
@ -644,11 +518,8 @@ pub unsafe fn simd_reduce_xor<T, U>(_x: T) -> U {
|
|||
/// # Safety
|
||||
/// `x` must contain only `0` and `!0`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_bitmask<T, U>(_x: T) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_bitmask<T, U>(_x: T) -> U;
|
||||
|
||||
/// Selects elements from a mask.
|
||||
///
|
||||
|
@ -663,11 +534,8 @@ pub unsafe fn simd_bitmask<T, U>(_x: T) -> U {
|
|||
/// # Safety
|
||||
/// `mask` must only contain `0` and `!0`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_select<M, T>(_mask: M, _if_true: T, _if_false: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_select<M, T>(_mask: M, _if_true: T, _if_false: T) -> T;
|
||||
|
||||
/// Selects elements from a bitmask.
|
||||
///
|
||||
|
@ -684,11 +552,8 @@ pub unsafe fn simd_select<M, T>(_mask: M, _if_true: T, _if_false: T) -> T {
|
|||
/// # Safety
|
||||
/// Padding bits must be all zero.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_select_bitmask<M, T>(_m: M, _yes: T, _no: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_select_bitmask<M, T>(_m: M, _yes: T, _no: T) -> T;
|
||||
|
||||
/// Calculates the offset from a pointer vector elementwise, potentially
|
||||
/// wrapping.
|
||||
|
@ -699,21 +564,15 @@ pub unsafe fn simd_select_bitmask<M, T>(_m: M, _yes: T, _no: T) -> T {
|
|||
///
|
||||
/// Operates as if by `<ptr>::wrapping_offset`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_arith_offset<T, U>(_ptr: T, _offset: U) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_arith_offset<T, U>(_ptr: T, _offset: U) -> T;
|
||||
|
||||
/// Casts a vector of pointers.
|
||||
///
|
||||
/// `T` and `U` must be vectors of pointers with the same number of elements.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_cast_ptr<T, U>(_ptr: T) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_cast_ptr<T, U>(_ptr: T) -> U;
|
||||
|
||||
/// Exposes a vector of pointers as a vector of addresses.
|
||||
///
|
||||
|
@ -721,11 +580,8 @@ pub unsafe fn simd_cast_ptr<T, U>(_ptr: T) -> U {
|
|||
///
|
||||
/// `U` must be a vector of `usize` with the same length as `T`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_expose_provenance<T, U>(_ptr: T) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_expose_provenance<T, U>(_ptr: T) -> U;
|
||||
|
||||
/// Creates a vector of pointers from a vector of addresses.
|
||||
///
|
||||
|
@ -733,123 +589,87 @@ pub unsafe fn simd_expose_provenance<T, U>(_ptr: T) -> U {
|
|||
///
|
||||
/// `U` must be a vector of pointers, with the same length as `T`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_with_exposed_provenance<T, U>(_addr: T) -> U {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_with_exposed_provenance<T, U>(_addr: T) -> U;
|
||||
|
||||
/// Swaps bytes of each element.
|
||||
///
|
||||
/// `T` must be a vector of integers.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_bswap<T>(_x: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_bswap<T>(_x: T) -> T;
|
||||
|
||||
/// Reverses bits of each element.
|
||||
///
|
||||
/// `T` must be a vector of integers.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_bitreverse<T>(_x: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_bitreverse<T>(_x: T) -> T;
|
||||
|
||||
/// Counts the leading zeros of each element.
|
||||
///
|
||||
/// `T` must be a vector of integers.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_ctlz<T>(_x: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_ctlz<T>(_x: T) -> T;
|
||||
|
||||
/// Counts the number of ones in each element.
|
||||
///
|
||||
/// `T` must be a vector of integers.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_ctpop<T>(_x: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_ctpop<T>(_x: T) -> T;
|
||||
|
||||
/// Counts the trailing zeros of each element.
|
||||
///
|
||||
/// `T` must be a vector of integers.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_cttz<T>(_x: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_cttz<T>(_x: T) -> T;
|
||||
|
||||
/// Rounds up each element to the next highest integer-valued float.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_ceil<T>(_x: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_ceil<T>(_x: T) -> T;
|
||||
|
||||
/// Rounds down each element to the next lowest integer-valued float.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_floor<T>(_x: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_floor<T>(_x: T) -> T;
|
||||
|
||||
/// Rounds each element to the closest integer-valued float.
|
||||
/// Ties are resolved by rounding away from 0.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_round<T>(_x: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_round<T>(_x: T) -> T;
|
||||
|
||||
/// Returns the integer part of each element as an integer-valued float.
|
||||
/// In other words, non-integer values are truncated towards zero.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_trunc<T>(_x: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_trunc<T>(_x: T) -> T;
|
||||
|
||||
/// Takes the square root of each element.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_fsqrt<T>(_x: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_fsqrt<T>(_x: T) -> T;
|
||||
|
||||
/// Computes `(x*y) + z` for each element, but without any intermediate rounding.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_fma<T>(_x: T, _y: T, _z: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_fma<T>(_x: T, _y: T, _z: T) -> T;
|
||||
|
||||
/// Computes `(x*y) + z` for each element, non-deterministically executing either
|
||||
/// a fused multiply-add or two operations with rounding of the intermediate result.
|
||||
|
@ -863,78 +683,54 @@ pub unsafe fn simd_fma<T>(_x: T, _y: T, _z: T) -> T {
|
|||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_relaxed_fma<T>(_x: T, _y: T, _z: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_relaxed_fma<T>(_x: T, _y: T, _z: T) -> T;
|
||||
|
||||
// Computes the sine of each element.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_fsin<T>(_a: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_fsin<T>(_a: T) -> T;
|
||||
|
||||
// Computes the cosine of each element.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_fcos<T>(_a: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_fcos<T>(_a: T) -> T;
|
||||
|
||||
// Computes the exponential function of each element.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_fexp<T>(_a: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_fexp<T>(_a: T) -> T;
|
||||
|
||||
// Computes 2 raised to the power of each element.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_fexp2<T>(_a: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_fexp2<T>(_a: T) -> T;
|
||||
|
||||
// Computes the base 10 logarithm of each element.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_flog10<T>(_a: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_flog10<T>(_a: T) -> T;
|
||||
|
||||
// Computes the base 2 logarithm of each element.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_flog2<T>(_a: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_flog2<T>(_a: T) -> T;
|
||||
|
||||
// Computes the natural logarithm of each element.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_flog<T>(_a: T) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
pub unsafe fn simd_flog<T>(_a: T) -> T;
|
||||
|
|
|
@ -62,13 +62,19 @@ These must be implemented by all backends.
|
|||
|
||||
### `#[rustc_intrinsic]` declarations
|
||||
|
||||
These are written like intrinsics with fallback bodies, but the body is irrelevant.
|
||||
Use `loop {}` for the body or call the intrinsic recursively and add
|
||||
`#[rustc_intrinsic_must_be_overridden]` to the function to ensure that backends don't
|
||||
invoke the body.
|
||||
These are written without a body:
|
||||
```rust
|
||||
#![feature(intrinsics)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
#[rustc_intrinsic]
|
||||
pub fn abort() -> !;
|
||||
```
|
||||
|
||||
### Legacy extern ABI based intrinsics
|
||||
|
||||
*This style is deprecated, always prefer the above form.*
|
||||
|
||||
These are imported as if they were FFI functions, with the special
|
||||
`rust-intrinsic` ABI. For example, if one was in a freestanding
|
||||
context, but wished to be able to `transmute` between types, and
|
||||
|
|
|
@ -51,10 +51,7 @@ enum Ordering {
|
|||
}
|
||||
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
fn three_way_compare<T: Copy>(lhs: T, rhs: T) -> Ordering {
|
||||
loop {}
|
||||
}
|
||||
fn three_way_compare<T: Copy>(lhs: T, rhs: T) -> Ordering;
|
||||
|
||||
// ^^^^^ core
|
||||
|
||||
|
|
|
@ -9,19 +9,13 @@
|
|||
#[stable(since="1.0.0", feature="rust1")]
|
||||
#[rustc_const_stable(feature = "const_transmute", since = "1.56.0")]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub const unsafe fn transmute<T, U>(_: T) -> U {
|
||||
loop {}
|
||||
}
|
||||
pub const unsafe fn transmute<T, U>(_: T) -> U;
|
||||
|
||||
//@ has 'foo/fn.unreachable.html'
|
||||
//@ has - '//pre[@class="rust item-decl"]' 'pub unsafe fn unreachable() -> !'
|
||||
#[stable(since="1.0.0", feature="rust1")]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn unreachable() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn unreachable() -> !;
|
||||
|
||||
extern "C" {
|
||||
//@ has 'foo/fn.needs_drop.html'
|
||||
|
|
|
@ -11,14 +11,8 @@ trait Sized {}
|
|||
//@ has 'foo/fn.abort.html'
|
||||
//@ has - '//pre[@class="rust item-decl"]' 'pub fn abort() -> !'
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn abort() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub fn abort() -> !;
|
||||
//@ has 'foo/fn.unreachable.html'
|
||||
//@ has - '//pre[@class="rust item-decl"]' 'pub unsafe fn unreachable() -> !'
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn unreachable() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn unreachable() -> !;
|
||||
|
|
|
@ -51,13 +51,11 @@ fn test_intrinsics() -> ControlFlow<()> {
|
|||
|
||||
/// This check is unfortunately tight to the implementation of intrinsics.
|
||||
///
|
||||
/// We want to ensure that StableMIR can handle intrinsics with and without fallback body.
|
||||
/// We want to ensure that StableMIR can handle intrinsics with and without fallback body:
|
||||
/// for intrinsics without a body, obviously we cannot expose anything.
|
||||
///
|
||||
/// If by any chance this test breaks because you changed how an intrinsic is implemented, please
|
||||
/// update the test to invoke a different intrinsic.
|
||||
///
|
||||
/// In StableMIR, we only expose intrinsic body if they are not marked with
|
||||
/// `rustc_intrinsic_must_be_overridden`.
|
||||
fn check_instance(instance: &Instance) {
|
||||
assert_eq!(instance.kind, InstanceKind::Intrinsic);
|
||||
let name = instance.intrinsic_name().unwrap();
|
||||
|
|
|
@ -1,10 +1,7 @@
|
|||
#![feature(intrinsics)]
|
||||
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
fn size_of<T, U>() -> usize {
|
||||
//~^ ERROR E0094
|
||||
loop {}
|
||||
}
|
||||
fn size_of<T, U>() -> usize;
|
||||
//~^ ERROR E0094
|
||||
|
||||
fn main() {}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
error[E0094]: intrinsic has wrong number of type parameters: found 2, expected 1
|
||||
--> $DIR/E0094.rs:5:11
|
||||
--> $DIR/E0094.rs:4:11
|
||||
|
|
||||
LL | fn size_of<T, U>() -> usize {
|
||||
LL | fn size_of<T, U>() -> usize;
|
||||
| ^^^^^^ expected 1 type parameter
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
|
|
@ -2,10 +2,7 @@
|
|||
#![feature(rustc_attrs)]
|
||||
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
fn size_of<T>() {
|
||||
//~^ ERROR E0308
|
||||
loop {}
|
||||
}
|
||||
fn size_of<T>();
|
||||
//~^ ERROR E0308
|
||||
|
||||
fn main() {}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
error[E0308]: intrinsic has wrong type
|
||||
--> $DIR/E0308.rs:6:16
|
||||
--> $DIR/E0308.rs:5:16
|
||||
|
|
||||
LL | fn size_of<T>() {
|
||||
LL | fn size_of<T>();
|
||||
| ^ expected `usize`, found `()`
|
||||
|
|
||||
= note: expected signature `fn() -> usize`
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
//! Check that `vtable_size` gets overridden by llvm backend even if there is no
|
||||
//! `rustc_intrinsic_must_be_overridden` attribute on this usage.
|
||||
//! Check that `vtable_size` gets overridden by llvm backend even if there is a
|
||||
//! fallback body.
|
||||
#![feature(intrinsics)]
|
||||
//@run-pass
|
||||
|
||||
|
|
|
@ -24,10 +24,7 @@ enum Foo {
|
|||
#[stable(feature = "intrinsics_for_test", since = "3.3.3")]
|
||||
#[rustc_const_stable(feature = "intrinsics_for_test", since = "3.3.3")]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
const fn size_of<T>() -> usize {
|
||||
loop {}
|
||||
}
|
||||
const fn size_of<T>() -> usize;
|
||||
|
||||
#[lang="sized"]
|
||||
trait Sized {}
|
||||
|
|
|
@ -21,10 +21,7 @@ impl Copy for bool {}
|
|||
#[stable(feature = "test", since = "1.0.0")]
|
||||
#[rustc_const_stable(feature = "test", since = "1.0.0")]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
const unsafe fn unreachable() -> ! {
|
||||
loop {}
|
||||
}
|
||||
const unsafe fn unreachable() -> !;
|
||||
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! cfg {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue