1
Fork 0

Auto merge of #121516 - RalfJung:platform-intrinsics-begone, r=oli-obk

remove platform-intrinsics ABI; make SIMD intrinsics be regular intrinsics

`@Amanieu` `@workingjubilee` I don't think there is any reason these need to be "special"? The [original RFC](https://rust-lang.github.io/rfcs/1199-simd-infrastructure.html) indicated eventually making them stable, but I think that is no longer the plan, so seems to me like we can clean this up a bit.

Blocked on https://github.com/rust-lang/stdarch/pull/1538, https://github.com/rust-lang/rust/pull/121542.
This commit is contained in:
bors 2024-02-26 22:24:16 +00:00
commit 5c786a7fe3
114 changed files with 416 additions and 448 deletions

View file

@ -4,17 +4,14 @@
// Test that the simd_f{min,max} intrinsics produce the correct results. // Test that the simd_f{min,max} intrinsics produce the correct results.
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, core_intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
#[derive(Copy, Clone, PartialEq, Debug)] #[derive(Copy, Clone, PartialEq, Debug)]
struct f32x4(pub f32, pub f32, pub f32, pub f32); struct f32x4(pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { use std::intrinsics::simd::*;
fn simd_fmin<T>(x: T, y: T) -> T;
fn simd_fmax<T>(x: T, y: T) -> T;
}
fn main() { fn main() {
let x = f32x4(1.0, 2.0, 3.0, 4.0); let x = f32x4(1.0, 2.0, 3.0, 4.0);

View file

@ -3,9 +3,9 @@ Invalid monomorphization of an intrinsic function was used.
Erroneous code example: Erroneous code example:
```compile_fail,E0511 ```compile_fail,E0511
#![feature(platform_intrinsics)] #![feature(intrinsics)]
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_add<T>(a: T, b: T) -> T; fn simd_add<T>(a: T, b: T) -> T;
} }
@ -19,13 +19,13 @@ The generic type has to be a SIMD type. Example:
``` ```
#![feature(repr_simd)] #![feature(repr_simd)]
#![feature(platform_intrinsics)] #![feature(intrinsics)]
#[repr(simd)] #[repr(simd)]
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
struct i32x2(i32, i32); struct i32x2(i32, i32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_add<T>(a: T, b: T) -> T; fn simd_add<T>(a: T, b: T) -> T;
} }

View file

@ -156,6 +156,9 @@ declare_features! (
Some("removed in favor of `#![feature(marker_trait_attr)]`")), Some("removed in favor of `#![feature(marker_trait_attr)]`")),
(removed, panic_implementation, "1.28.0", Some(44489), (removed, panic_implementation, "1.28.0", Some(44489),
Some("subsumed by `#[panic_handler]`")), Some("subsumed by `#[panic_handler]`")),
/// Allows `extern "platform-intrinsic" { ... }`.
(removed, platform_intrinsics, "1.4.0", Some(27731),
Some("SIMD intrinsics use the regular intrinsics ABI now")),
/// Allows using `#![plugin(myplugin)]`. /// Allows using `#![plugin(myplugin)]`.
(removed, plugin, "1.75.0", Some(29597), (removed, plugin, "1.75.0", Some(29597),
Some("plugins are no longer supported")), Some("plugins are no longer supported")),

View file

@ -259,8 +259,6 @@ declare_features! (
(internal, needs_panic_runtime, "1.10.0", Some(32837)), (internal, needs_panic_runtime, "1.10.0", Some(32837)),
/// Allows using the `#![panic_runtime]` attribute. /// Allows using the `#![panic_runtime]` attribute.
(internal, panic_runtime, "1.10.0", Some(32837)), (internal, panic_runtime, "1.10.0", Some(32837)),
/// Allows `extern "platform-intrinsic" { ... }`.
(internal, platform_intrinsics, "1.4.0", Some(27731)),
/// Allows using `#[rustc_allow_const_fn_unstable]`. /// Allows using `#[rustc_allow_const_fn_unstable]`.
/// This is an attribute on `const fn` for the same /// This is an attribute on `const fn` for the same
/// purpose as `#[allow_internal_unstable]`. /// purpose as `#[allow_internal_unstable]`.

View file

@ -612,17 +612,6 @@ pub(crate) fn check_item_type(tcx: TyCtxt<'_>, def_id: LocalDefId) {
} }
} }
Abi::PlatformIntrinsic => {
for item in items {
intrinsic::check_platform_intrinsic_type(
tcx,
item.id.owner_id.def_id,
item.span,
item.ident.name,
);
}
}
_ => { _ => {
for item in items { for item in items {
let def_id = item.id.owner_id.def_id; let def_id = item.id.owner_id.def_id;

View file

@ -510,41 +510,12 @@ pub fn check_intrinsic_type(
sym::debug_assertions => (0, 1, Vec::new(), tcx.types.bool), sym::debug_assertions => (0, 1, Vec::new(), tcx.types.bool),
other => { sym::simd_eq
tcx.dcx().emit_err(UnrecognizedIntrinsicFunction { span, name: other }); | sym::simd_ne
return; | sym::simd_lt
} | sym::simd_le
}; | sym::simd_gt
(n_tps, 0, n_cts, inputs, output, unsafety) | sym::simd_ge => (2, 0, vec![param(0), param(0)], param(1)),
};
let sig = tcx.mk_fn_sig(inputs, output, false, unsafety, abi);
let sig = ty::Binder::bind_with_vars(sig, bound_vars);
equate_intrinsic_type(tcx, span, intrinsic_id, n_tps, n_lts, n_cts, sig)
}
/// Type-check `extern "platform-intrinsic" { ... }` functions.
pub fn check_platform_intrinsic_type(
tcx: TyCtxt<'_>,
intrinsic_id: LocalDefId,
span: Span,
name: Symbol,
) {
let generics = tcx.generics_of(intrinsic_id);
let param = |n| {
if let Some(&ty::GenericParamDef {
name, kind: ty::GenericParamDefKind::Type { .. }, ..
}) = generics.opt_param_at(n as usize, tcx)
{
Ty::new_param(tcx, n, name)
} else {
Ty::new_error_with_message(tcx, span, "expected param")
}
};
let (n_tps, n_cts, inputs, output) = match name {
sym::simd_eq | sym::simd_ne | sym::simd_lt | sym::simd_le | sym::simd_gt | sym::simd_ge => {
(2, 0, vec![param(0), param(0)], param(1))
}
sym::simd_add sym::simd_add
| sym::simd_sub | sym::simd_sub
| sym::simd_mul | sym::simd_mul
@ -609,14 +580,15 @@ pub fn check_platform_intrinsic_type(
| sym::simd_reduce_max => (2, 0, vec![param(0)], param(1)), | sym::simd_reduce_max => (2, 0, vec![param(0)], param(1)),
sym::simd_shuffle => (3, 0, vec![param(0), param(0), param(1)], param(2)), sym::simd_shuffle => (3, 0, vec![param(0), param(0), param(1)], param(2)),
sym::simd_shuffle_generic => (2, 1, vec![param(0), param(0)], param(1)), sym::simd_shuffle_generic => (2, 1, vec![param(0), param(0)], param(1)),
_ => {
let msg = format!("unrecognized platform-specific intrinsic function: `{name}`"); other => {
tcx.dcx().span_err(span, msg); tcx.dcx().emit_err(UnrecognizedIntrinsicFunction { span, name: other });
return; return;
} }
}; };
(n_tps, 0, n_cts, inputs, output, unsafety)
let sig = tcx.mk_fn_sig(inputs, output, false, hir::Unsafety::Unsafe, Abi::PlatformIntrinsic); };
let sig = ty::Binder::dummy(sig); let sig = tcx.mk_fn_sig(inputs, output, false, unsafety, abi);
equate_intrinsic_type(tcx, span, intrinsic_id, n_tps, 0, n_cts, sig) let sig = ty::Binder::bind_with_vars(sig, bound_vars);
equate_intrinsic_type(tcx, span, intrinsic_id, n_tps, n_lts, n_cts, sig)
} }

View file

@ -142,7 +142,7 @@ fn get_owner_return_paths(
/// as they must always be defined by the compiler. /// as they must always be defined by the compiler.
// FIXME: Move this to a more appropriate place. // FIXME: Move this to a more appropriate place.
pub fn forbid_intrinsic_abi(tcx: TyCtxt<'_>, sp: Span, abi: Abi) { pub fn forbid_intrinsic_abi(tcx: TyCtxt<'_>, sp: Span, abi: Abi) {
if let Abi::RustIntrinsic | Abi::PlatformIntrinsic = abi { if let Abi::RustIntrinsic = abi {
tcx.dcx().span_err(sp, "intrinsic must be in `extern \"rust-intrinsic\" { ... }` block"); tcx.dcx().span_err(sp, "intrinsic must be in `extern \"rust-intrinsic\" { ... }` block");
} }
} }

View file

@ -1677,10 +1677,7 @@ fn compute_sig_of_foreign_fn_decl<'tcx>(
// Feature gate SIMD types in FFI, since I am not sure that the // Feature gate SIMD types in FFI, since I am not sure that the
// ABIs are handled at all correctly. -huonw // ABIs are handled at all correctly. -huonw
if abi != abi::Abi::RustIntrinsic if abi != abi::Abi::RustIntrinsic && !tcx.features().simd_ffi {
&& abi != abi::Abi::PlatformIntrinsic
&& !tcx.features().simd_ffi
{
let check = |ast_ty: &hir::Ty<'_>, ty: Ty<'_>| { let check = |ast_ty: &hir::Ty<'_>, ty: Ty<'_>| {
if ty.is_simd() { if ty.is_simd() {
let snip = tcx let snip = tcx

View file

@ -1177,11 +1177,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
}; };
if let (Some(a_sig), Some(b_sig)) = (a_sig, b_sig) { if let (Some(a_sig), Some(b_sig)) = (a_sig, b_sig) {
// Intrinsics are not coercible to function pointers. // Intrinsics are not coercible to function pointers.
if a_sig.abi() == Abi::RustIntrinsic if a_sig.abi() == Abi::RustIntrinsic || b_sig.abi() == Abi::RustIntrinsic {
|| a_sig.abi() == Abi::PlatformIntrinsic
|| b_sig.abi() == Abi::RustIntrinsic
|| b_sig.abi() == Abi::PlatformIntrinsic
{
return Err(TypeError::IntrinsicCast); return Err(TypeError::IntrinsicCast);
} }
// The signature must match. // The signature must match.

View file

@ -1587,10 +1587,7 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> {
} }
fn is_internal_abi(&self, abi: SpecAbi) -> bool { fn is_internal_abi(&self, abi: SpecAbi) -> bool {
matches!( matches!(abi, SpecAbi::Rust | SpecAbi::RustCall | SpecAbi::RustIntrinsic)
abi,
SpecAbi::Rust | SpecAbi::RustCall | SpecAbi::RustIntrinsic | SpecAbi::PlatformIntrinsic
)
} }
/// Find any fn-ptr types with external ABIs in `ty`. /// Find any fn-ptr types with external ABIs in `ty`.

View file

@ -99,7 +99,7 @@ impl<'tcx> Collector<'tcx> {
let sess = self.tcx.sess; let sess = self.tcx.sess;
if matches!(abi, Abi::Rust | Abi::RustIntrinsic | Abi::PlatformIntrinsic) { if matches!(abi, Abi::Rust | Abi::RustIntrinsic) {
return; return;
} }

View file

@ -1244,7 +1244,6 @@ pub fn fn_can_unwind(tcx: TyCtxt<'_>, fn_def_id: Option<DefId>, abi: SpecAbi) ->
| RiscvInterruptS | RiscvInterruptS
| CCmseNonSecureCall | CCmseNonSecureCall
| Wasm | Wasm
| PlatformIntrinsic
| Unadjusted => false, | Unadjusted => false,
Rust | RustCall | RustCold | RustIntrinsic => { Rust | RustCall | RustCold | RustIntrinsic => {
tcx.sess.panic_strategy() == PanicStrategy::Unwind tcx.sess.panic_strategy() == PanicStrategy::Unwind

View file

@ -1643,7 +1643,7 @@ pub fn is_doc_notable_trait(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
/// Determines whether an item is an intrinsic by Abi. or by whether it has a `rustc_intrinsic` attribute /// Determines whether an item is an intrinsic by Abi. or by whether it has a `rustc_intrinsic` attribute
pub fn intrinsic(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<Symbol> { pub fn intrinsic(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<Symbol> {
if matches!(tcx.fn_sig(def_id).skip_binder().abi(), Abi::RustIntrinsic | Abi::PlatformIntrinsic) if matches!(tcx.fn_sig(def_id).skip_binder().abi(), Abi::RustIntrinsic)
|| tcx.has_attr(def_id, sym::rustc_intrinsic) || tcx.has_attr(def_id, sym::rustc_intrinsic)
{ {
Some(tcx.item_name(def_id.into())) Some(tcx.item_name(def_id.into()))

View file

@ -34,7 +34,6 @@ fn abi_can_unwind(abi: Abi) -> bool {
| CCmseNonSecureCall | CCmseNonSecureCall
| Wasm | Wasm
| RustIntrinsic | RustIntrinsic
| PlatformIntrinsic
| Unadjusted => false, | Unadjusted => false,
Rust | RustCall | RustCold => true, Rust | RustCall | RustCold => true,
} }

View file

@ -1389,7 +1389,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
if target == Target::ForeignMod if target == Target::ForeignMod
&& let hir::Node::Item(item) = self.tcx.hir_node(hir_id) && let hir::Node::Item(item) = self.tcx.hir_node(hir_id)
&& let Item { kind: ItemKind::ForeignMod { abi, .. }, .. } = item && let Item { kind: ItemKind::ForeignMod { abi, .. }, .. } = item
&& !matches!(abi, Abi::Rust | Abi::RustIntrinsic | Abi::PlatformIntrinsic) && !matches!(abi, Abi::Rust | Abi::RustIntrinsic)
{ {
return; return;
} }
@ -2071,7 +2071,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
) -> bool { ) -> bool {
if let Target::ForeignFn = target if let Target::ForeignFn = target
&& let hir::Node::Item(Item { && let hir::Node::Item(Item {
kind: ItemKind::ForeignMod { abi: Abi::RustIntrinsic | Abi::PlatformIntrinsic, .. }, kind: ItemKind::ForeignMod { abi: Abi::RustIntrinsic, .. },
.. ..
}) = self.tcx.parent_hir_node(hir_id) }) = self.tcx.parent_hir_node(hir_id)
{ {

View file

@ -173,10 +173,7 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> {
// If the current node is a function, has const stability attributes and if it doesn not have an intrinsic ABI, // If the current node is a function, has const stability attributes and if it doesn not have an intrinsic ABI,
// check if the function/method is const or the parent impl block is const // check if the function/method is const or the parent impl block is const
if let (Some(const_span), Some(fn_sig)) = (const_span, fn_sig) { if let (Some(const_span), Some(fn_sig)) = (const_span, fn_sig) {
if fn_sig.header.abi != Abi::RustIntrinsic if fn_sig.header.abi != Abi::RustIntrinsic && !fn_sig.header.is_const() {
&& fn_sig.header.abi != Abi::PlatformIntrinsic
&& !fn_sig.header.is_const()
{
if !self.in_trait_impl if !self.in_trait_impl
|| (self.in_trait_impl && !self.tcx.is_const_fn_raw(def_id.to_def_id())) || (self.in_trait_impl && !self.tcx.is_const_fn_raw(def_id.to_def_id()))
{ {

View file

@ -457,7 +457,6 @@ impl RustcInternal for Abi {
Abi::System { unwind } => rustc_target::spec::abi::Abi::System { unwind }, Abi::System { unwind } => rustc_target::spec::abi::Abi::System { unwind },
Abi::RustIntrinsic => rustc_target::spec::abi::Abi::RustIntrinsic, Abi::RustIntrinsic => rustc_target::spec::abi::Abi::RustIntrinsic,
Abi::RustCall => rustc_target::spec::abi::Abi::RustCall, Abi::RustCall => rustc_target::spec::abi::Abi::RustCall,
Abi::PlatformIntrinsic => rustc_target::spec::abi::Abi::PlatformIntrinsic,
Abi::Unadjusted => rustc_target::spec::abi::Abi::Unadjusted, Abi::Unadjusted => rustc_target::spec::abi::Abi::Unadjusted,
Abi::RustCold => rustc_target::spec::abi::Abi::RustCold, Abi::RustCold => rustc_target::spec::abi::Abi::RustCold,
Abi::RiscvInterruptM => rustc_target::spec::abi::Abi::RiscvInterruptM, Abi::RiscvInterruptM => rustc_target::spec::abi::Abi::RiscvInterruptM,

View file

@ -833,7 +833,6 @@ impl<'tcx> Stable<'tcx> for rustc_target::spec::abi::Abi {
abi::Abi::System { unwind } => Abi::System { unwind }, abi::Abi::System { unwind } => Abi::System { unwind },
abi::Abi::RustIntrinsic => Abi::RustIntrinsic, abi::Abi::RustIntrinsic => Abi::RustIntrinsic,
abi::Abi::RustCall => Abi::RustCall, abi::Abi::RustCall => Abi::RustCall,
abi::Abi::PlatformIntrinsic => Abi::PlatformIntrinsic,
abi::Abi::Unadjusted => Abi::Unadjusted, abi::Abi::Unadjusted => Abi::Unadjusted,
abi::Abi::RustCold => Abi::RustCold, abi::Abi::RustCold => Abi::RustCold,
abi::Abi::RiscvInterruptM => Abi::RiscvInterruptM, abi::Abi::RiscvInterruptM => Abi::RiscvInterruptM,

View file

@ -54,7 +54,6 @@ pub enum Abi {
}, },
RustIntrinsic, RustIntrinsic,
RustCall, RustCall,
PlatformIntrinsic,
Unadjusted, Unadjusted,
/// For things unlikely to be called, where reducing register pressure in /// For things unlikely to be called, where reducing register pressure in
/// `extern "Rust"` callers is worth paying extra cost in the callee. /// `extern "Rust"` callers is worth paying extra cost in the callee.
@ -129,7 +128,6 @@ const AbiDatas: &[AbiData] = &[
AbiData { abi: Abi::System { unwind: true }, name: "system-unwind" }, AbiData { abi: Abi::System { unwind: true }, name: "system-unwind" },
AbiData { abi: Abi::RustIntrinsic, name: "rust-intrinsic" }, AbiData { abi: Abi::RustIntrinsic, name: "rust-intrinsic" },
AbiData { abi: Abi::RustCall, name: "rust-call" }, AbiData { abi: Abi::RustCall, name: "rust-call" },
AbiData { abi: Abi::PlatformIntrinsic, name: "platform-intrinsic" },
AbiData { abi: Abi::Unadjusted, name: "unadjusted" }, AbiData { abi: Abi::Unadjusted, name: "unadjusted" },
AbiData { abi: Abi::RustCold, name: "rust-cold" }, AbiData { abi: Abi::RustCold, name: "rust-cold" },
AbiData { abi: Abi::RiscvInterruptM, name: "riscv-interrupt-m" }, AbiData { abi: Abi::RiscvInterruptM, name: "riscv-interrupt-m" },
@ -199,10 +197,6 @@ pub fn is_stable(name: &str) -> Result<(), AbiDisabled> {
feature: sym::intrinsics, feature: sym::intrinsics,
explain: "intrinsics are subject to change", explain: "intrinsics are subject to change",
}), }),
"platform-intrinsic" => Err(AbiDisabled::Unstable {
feature: sym::platform_intrinsics,
explain: "platform intrinsics are experimental and possibly buggy",
}),
"vectorcall" => Err(AbiDisabled::Unstable { "vectorcall" => Err(AbiDisabled::Unstable {
feature: sym::abi_vectorcall, feature: sym::abi_vectorcall,
explain: "vectorcall is experimental and subject to change", explain: "vectorcall is experimental and subject to change",
@ -299,11 +293,10 @@ impl Abi {
System { unwind: true } => 28, System { unwind: true } => 28,
RustIntrinsic => 29, RustIntrinsic => 29,
RustCall => 30, RustCall => 30,
PlatformIntrinsic => 31, Unadjusted => 31,
Unadjusted => 32, RustCold => 32,
RustCold => 33, RiscvInterruptM => 33,
RiscvInterruptM => 34, RiscvInterruptS => 34,
RiscvInterruptS => 35,
}; };
debug_assert!( debug_assert!(
AbiDatas AbiDatas

View file

@ -2448,7 +2448,6 @@ impl Target {
| System { .. } | System { .. }
| RustIntrinsic | RustIntrinsic
| RustCall | RustCall
| PlatformIntrinsic
| Unadjusted | Unadjusted
| Cdecl { .. } | Cdecl { .. }
| RustCold => true, | RustCold => true,

View file

@ -312,7 +312,7 @@ fn fn_sig_for_fn_abi<'tcx>(
fn conv_from_spec_abi(tcx: TyCtxt<'_>, abi: SpecAbi, c_variadic: bool) -> Conv { fn conv_from_spec_abi(tcx: TyCtxt<'_>, abi: SpecAbi, c_variadic: bool) -> Conv {
use rustc_target::spec::abi::Abi::*; use rustc_target::spec::abi::Abi::*;
match tcx.sess.target.adjust_abi(abi, c_variadic) { match tcx.sess.target.adjust_abi(abi, c_variadic) {
RustIntrinsic | PlatformIntrinsic | Rust | RustCall => Conv::Rust, RustIntrinsic | Rust | RustCall => Conv::Rust,
// This is intentionally not using `Conv::Cold`, as that has to preserve // This is intentionally not using `Conv::Cold`, as that has to preserve
// even SIMD registers, which is generally not a good trade-off. // even SIMD registers, which is generally not a good trade-off.
@ -605,7 +605,7 @@ fn fn_abi_new_uncached<'tcx>(
let linux_powerpc_gnu_like = let linux_powerpc_gnu_like =
target.os == "linux" && target.arch == "powerpc" && target_env_gnu_like; target.os == "linux" && target.arch == "powerpc" && target_env_gnu_like;
use SpecAbi::*; use SpecAbi::*;
let rust_abi = matches!(sig.abi, RustIntrinsic | PlatformIntrinsic | Rust | RustCall); let rust_abi = matches!(sig.abi, RustIntrinsic | Rust | RustCall);
let is_drop_in_place = let is_drop_in_place =
fn_def_id.is_some() && fn_def_id == cx.tcx.lang_items().drop_in_place_fn(); fn_def_id.is_some() && fn_def_id == cx.tcx.lang_items().drop_in_place_fn();
@ -713,11 +713,7 @@ fn fn_abi_adjust_for_abi<'tcx>(
return Ok(()); return Ok(());
} }
if abi == SpecAbi::Rust if abi == SpecAbi::Rust || abi == SpecAbi::RustCall || abi == SpecAbi::RustIntrinsic {
|| abi == SpecAbi::RustCall
|| abi == SpecAbi::RustIntrinsic
|| abi == SpecAbi::PlatformIntrinsic
{
// Look up the deduced parameter attributes for this function, if we have its def ID and // Look up the deduced parameter attributes for this function, if we have its def ID and
// we're optimizing in non-incremental mode. We'll tag its parameters with those attributes // we're optimizing in non-incremental mode. We'll tag its parameters with those attributes
// as appropriate. // as appropriate.
@ -753,12 +749,11 @@ fn fn_abi_adjust_for_abi<'tcx>(
// target feature sets. Some more information about this // target feature sets. Some more information about this
// issue can be found in #44367. // issue can be found in #44367.
// //
// Note that the platform intrinsic ABI is exempt here as // Note that the intrinsic ABI is exempt here as
// that's how we connect up to LLVM and it's unstable // that's how we connect up to LLVM and it's unstable
// anyway, we control all calls to it in libstd. // anyway, we control all calls to it in libstd.
Abi::Vector { .. } Abi::Vector { .. }
if abi != SpecAbi::PlatformIntrinsic if abi != SpecAbi::RustIntrinsic && cx.tcx.sess.target.simd_types_indirect =>
&& cx.tcx.sess.target.simd_types_indirect =>
{ {
arg.make_indirect(); arg.make_indirect();
return; return;

View file

@ -906,7 +906,6 @@ pub enum Abi {
System { unwind: bool }, System { unwind: bool },
RustIntrinsic, RustIntrinsic,
RustCall, RustCall,
PlatformIntrinsic,
Unadjusted, Unadjusted,
RustCold, RustCold,
RiscvInterruptM, RiscvInterruptM,

View file

@ -2,7 +2,11 @@
//! //!
//! In this module, a "vector" is any `repr(simd)` type. //! In this module, a "vector" is any `repr(simd)` type.
extern "platform-intrinsic" { // Temporary macro while we switch the ABI from "platform-intrinsics" to "intrinsics".
#[rustfmt::skip]
macro_rules! declare_intrinsics {
($abi:tt) => {
extern $abi {
/// Insert an element into a vector, returning the updated vector. /// Insert an element into a vector, returning the updated vector.
/// ///
/// `T` must be a vector with element type `U`. /// `T` must be a vector with element type `U`.
@ -10,6 +14,7 @@ extern "platform-intrinsic" {
/// # Safety /// # Safety
/// ///
/// `idx` must be in-bounds of the vector. /// `idx` must be in-bounds of the vector.
#[rustc_nounwind]
pub fn simd_insert<T, U>(x: T, idx: u32, val: U) -> T; pub fn simd_insert<T, U>(x: T, idx: u32, val: U) -> T;
/// Extract an element from a vector. /// Extract an element from a vector.
@ -19,21 +24,25 @@ extern "platform-intrinsic" {
/// # Safety /// # Safety
/// ///
/// `idx` must be in-bounds of the vector. /// `idx` must be in-bounds of the vector.
#[rustc_nounwind]
pub fn simd_extract<T, U>(x: T, idx: u32) -> U; pub fn simd_extract<T, U>(x: T, idx: u32) -> U;
/// Add two simd vectors elementwise. /// Add two simd vectors elementwise.
/// ///
/// `T` must be a vector of integer or floating point primitive types. /// `T` must be a vector of integer or floating point primitive types.
#[rustc_nounwind]
pub fn simd_add<T>(x: T, y: T) -> T; pub fn simd_add<T>(x: T, y: T) -> T;
/// Subtract `rhs` from `lhs` elementwise. /// Subtract `rhs` from `lhs` elementwise.
/// ///
/// `T` must be a vector of integer or floating point primitive types. /// `T` must be a vector of integer or floating point primitive types.
#[rustc_nounwind]
pub fn simd_sub<T>(lhs: T, rhs: T) -> T; pub fn simd_sub<T>(lhs: T, rhs: T) -> T;
/// Multiply two simd vectors elementwise. /// Multiply two simd vectors elementwise.
/// ///
/// `T` must be a vector of integer or floating point primitive types. /// `T` must be a vector of integer or floating point primitive types.
#[rustc_nounwind]
pub fn simd_mul<T>(x: T, y: T) -> T; pub fn simd_mul<T>(x: T, y: T) -> T;
/// Divide `lhs` by `rhs` elementwise. /// Divide `lhs` by `rhs` elementwise.
@ -43,6 +52,7 @@ extern "platform-intrinsic" {
/// # Safety /// # Safety
/// For integers, `rhs` must not contain any zero elements. /// For integers, `rhs` must not contain any zero elements.
/// Additionally for signed integers, `<int>::MIN / -1` is undefined behavior. /// Additionally for signed integers, `<int>::MIN / -1` is undefined behavior.
#[rustc_nounwind]
pub fn simd_div<T>(lhs: T, rhs: T) -> T; pub fn simd_div<T>(lhs: T, rhs: T) -> T;
/// Remainder of two vectors elementwise /// Remainder of two vectors elementwise
@ -52,6 +62,7 @@ extern "platform-intrinsic" {
/// # Safety /// # Safety
/// For integers, `rhs` must not contain any zero elements. /// For integers, `rhs` must not contain any zero elements.
/// Additionally for signed integers, `<int>::MIN / -1` is undefined behavior. /// Additionally for signed integers, `<int>::MIN / -1` is undefined behavior.
#[rustc_nounwind]
pub fn simd_rem<T>(lhs: T, rhs: T) -> T; pub fn simd_rem<T>(lhs: T, rhs: T) -> T;
/// Elementwise vector left shift, with UB on overflow. /// Elementwise vector left shift, with UB on overflow.
@ -63,6 +74,7 @@ extern "platform-intrinsic" {
/// # Safety /// # Safety
/// ///
/// Each element of `rhs` must be less than `<int>::BITS`. /// Each element of `rhs` must be less than `<int>::BITS`.
#[rustc_nounwind]
pub fn simd_shl<T>(lhs: T, rhs: T) -> T; pub fn simd_shl<T>(lhs: T, rhs: T) -> T;
/// Elementwise vector right shift, with UB on overflow. /// Elementwise vector right shift, with UB on overflow.
@ -74,21 +86,25 @@ extern "platform-intrinsic" {
/// # Safety /// # Safety
/// ///
/// Each element of `rhs` must be less than `<int>::BITS`. /// Each element of `rhs` must be less than `<int>::BITS`.
#[rustc_nounwind]
pub fn simd_shr<T>(lhs: T, rhs: T) -> T; pub fn simd_shr<T>(lhs: T, rhs: T) -> T;
/// Elementwise vector "and". /// Elementwise vector "and".
/// ///
/// `T` must be a vector of integer primitive types. /// `T` must be a vector of integer primitive types.
#[rustc_nounwind]
pub fn simd_and<T>(x: T, y: T) -> T; pub fn simd_and<T>(x: T, y: T) -> T;
/// Elementwise vector "or". /// Elementwise vector "or".
/// ///
/// `T` must be a vector of integer primitive types. /// `T` must be a vector of integer primitive types.
#[rustc_nounwind]
pub fn simd_or<T>(x: T, y: T) -> T; pub fn simd_or<T>(x: T, y: T) -> T;
/// Elementwise vector "exclusive or". /// Elementwise vector "exclusive or".
/// ///
/// `T` must be a vector of integer primitive types. /// `T` must be a vector of integer primitive types.
#[rustc_nounwind]
pub fn simd_xor<T>(x: T, y: T) -> T; pub fn simd_xor<T>(x: T, y: T) -> T;
/// Numerically cast a vector, elementwise. /// Numerically cast a vector, elementwise.
@ -109,6 +125,7 @@ extern "platform-intrinsic" {
/// * Not be `NaN` /// * Not be `NaN`
/// * Not be infinite /// * Not be infinite
/// * Be representable in the return type, after truncating off its fractional part /// * Be representable in the return type, after truncating off its fractional part
#[rustc_nounwind]
pub fn simd_cast<T, U>(x: T) -> U; pub fn simd_cast<T, U>(x: T) -> U;
/// Numerically cast a vector, elementwise. /// Numerically cast a vector, elementwise.
@ -122,6 +139,7 @@ extern "platform-intrinsic" {
/// When casting floats to integers, the result is truncated. /// When casting floats to integers, the result is truncated.
/// When casting integers to floats, the result is rounded. /// When casting integers to floats, the result is rounded.
/// Otherwise, truncates or extends the value, maintaining the sign for signed integers. /// Otherwise, truncates or extends the value, maintaining the sign for signed integers.
#[rustc_nounwind]
pub fn simd_as<T, U>(x: T) -> U; pub fn simd_as<T, U>(x: T) -> U;
/// Elementwise negation of a vector. /// Elementwise negation of a vector.
@ -129,11 +147,13 @@ extern "platform-intrinsic" {
/// `T` must be a vector of integer or floating-point primitive types. /// `T` must be a vector of integer or floating-point primitive types.
/// ///
/// Rust panics for `-<int>::Min` due to overflow, but it is not UB with this intrinsic. /// Rust panics for `-<int>::Min` due to overflow, but it is not UB with this intrinsic.
#[rustc_nounwind]
pub fn simd_neg<T>(x: T) -> T; pub fn simd_neg<T>(x: T) -> T;
/// Elementwise absolute value of a vector. /// Elementwise absolute value of a vector.
/// ///
/// `T` must be a vector of floating-point primitive types. /// `T` must be a vector of floating-point primitive types.
#[rustc_nounwind]
pub fn simd_fabs<T>(x: T) -> T; pub fn simd_fabs<T>(x: T) -> T;
/// Elementwise minimum of a vector. /// Elementwise minimum of a vector.
@ -141,6 +161,7 @@ extern "platform-intrinsic" {
/// `T` must be a vector of floating-point primitive types. /// `T` must be a vector of floating-point primitive types.
/// ///
/// Follows IEEE-754 `minNum` semantics. /// Follows IEEE-754 `minNum` semantics.
#[rustc_nounwind]
pub fn simd_fmin<T>(x: T, y: T) -> T; pub fn simd_fmin<T>(x: T, y: T) -> T;
/// Elementwise maximum of a vector. /// Elementwise maximum of a vector.
@ -148,6 +169,7 @@ extern "platform-intrinsic" {
/// `T` must be a vector of floating-point primitive types. /// `T` must be a vector of floating-point primitive types.
/// ///
/// Follows IEEE-754 `maxNum` semantics. /// Follows IEEE-754 `maxNum` semantics.
#[rustc_nounwind]
pub fn simd_fmax<T>(x: T, y: T) -> T; pub fn simd_fmax<T>(x: T, y: T) -> T;
/// Tests elementwise equality of two vectors. /// Tests elementwise equality of two vectors.
@ -157,6 +179,7 @@ extern "platform-intrinsic" {
/// `U` must be a vector of integers with the same number of elements and element size as `T`. /// `U` must be a vector of integers with the same number of elements and element size as `T`.
/// ///
/// Returns `0` for false and `!0` for true. /// Returns `0` for false and `!0` for true.
#[rustc_nounwind]
pub fn simd_eq<T, U>(x: T, y: T) -> U; pub fn simd_eq<T, U>(x: T, y: T) -> U;
/// Tests elementwise inequality equality of two vectors. /// Tests elementwise inequality equality of two vectors.
@ -166,6 +189,7 @@ extern "platform-intrinsic" {
/// `U` must be a vector of integers with the same number of elements and element size as `T`. /// `U` must be a vector of integers with the same number of elements and element size as `T`.
/// ///
/// Returns `0` for false and `!0` for true. /// Returns `0` for false and `!0` for true.
#[rustc_nounwind]
pub fn simd_ne<T, U>(x: T, y: T) -> U; pub fn simd_ne<T, U>(x: T, y: T) -> U;
/// Tests if `x` is less than `y`, elementwise. /// Tests if `x` is less than `y`, elementwise.
@ -175,6 +199,7 @@ extern "platform-intrinsic" {
/// `U` must be a vector of integers with the same number of elements and element size as `T`. /// `U` must be a vector of integers with the same number of elements and element size as `T`.
/// ///
/// Returns `0` for false and `!0` for true. /// Returns `0` for false and `!0` for true.
#[rustc_nounwind]
pub fn simd_lt<T, U>(x: T, y: T) -> U; pub fn simd_lt<T, U>(x: T, y: T) -> U;
/// Tests if `x` is less than or equal to `y`, elementwise. /// Tests if `x` is less than or equal to `y`, elementwise.
@ -184,6 +209,7 @@ extern "platform-intrinsic" {
/// `U` must be a vector of integers with the same number of elements and element size as `T`. /// `U` must be a vector of integers with the same number of elements and element size as `T`.
/// ///
/// Returns `0` for false and `!0` for true. /// Returns `0` for false and `!0` for true.
#[rustc_nounwind]
pub fn simd_le<T, U>(x: T, y: T) -> U; pub fn simd_le<T, U>(x: T, y: T) -> U;
/// Tests if `x` is greater than `y`, elementwise. /// Tests if `x` is greater than `y`, elementwise.
@ -193,6 +219,7 @@ extern "platform-intrinsic" {
/// `U` must be a vector of integers with the same number of elements and element size as `T`. /// `U` must be a vector of integers with the same number of elements and element size as `T`.
/// ///
/// Returns `0` for false and `!0` for true. /// Returns `0` for false and `!0` for true.
#[rustc_nounwind]
pub fn simd_gt<T, U>(x: T, y: T) -> U; pub fn simd_gt<T, U>(x: T, y: T) -> U;
/// Tests if `x` is greater than or equal to `y`, elementwise. /// Tests if `x` is greater than or equal to `y`, elementwise.
@ -202,6 +229,7 @@ extern "platform-intrinsic" {
/// `U` must be a vector of integers with the same number of elements and element size as `T`. /// `U` must be a vector of integers with the same number of elements and element size as `T`.
/// ///
/// Returns `0` for false and `!0` for true. /// Returns `0` for false and `!0` for true.
#[rustc_nounwind]
pub fn simd_ge<T, U>(x: T, y: T) -> U; pub fn simd_ge<T, U>(x: T, y: T) -> U;
/// Shuffle two vectors by const indices. /// Shuffle two vectors by const indices.
@ -216,6 +244,7 @@ extern "platform-intrinsic" {
/// Returns a new vector such that element `i` is selected from `xy[idx[i]]`, where `xy` /// Returns a new vector such that element `i` is selected from `xy[idx[i]]`, where `xy`
/// is the concatenation of `x` and `y`. It is a compile-time error if `idx[i]` is out-of-bounds /// is the concatenation of `x` and `y`. It is a compile-time error if `idx[i]` is out-of-bounds
/// of `xy`. /// of `xy`.
#[rustc_nounwind]
pub fn simd_shuffle<T, U, V>(x: T, y: T, idx: U) -> V; pub fn simd_shuffle<T, U, V>(x: T, y: T, idx: U) -> V;
/// Shuffle two vectors by const indices. /// Shuffle two vectors by const indices.
@ -227,6 +256,7 @@ extern "platform-intrinsic" {
/// Returns a new vector such that element `i` is selected from `xy[IDX[i]]`, where `xy` /// Returns a new vector such that element `i` is selected from `xy[IDX[i]]`, where `xy`
/// is the concatenation of `x` and `y`. It is a compile-time error if `IDX[i]` is out-of-bounds /// is the concatenation of `x` and `y`. It is a compile-time error if `IDX[i]` is out-of-bounds
/// of `xy`. /// of `xy`.
#[rustc_nounwind]
pub fn simd_shuffle_generic<T, U, const IDX: &'static [u32]>(x: T, y: T) -> U; pub fn simd_shuffle_generic<T, U, const IDX: &'static [u32]>(x: T, y: T) -> U;
/// Read a vector of pointers. /// Read a vector of pointers.
@ -249,6 +279,7 @@ extern "platform-intrinsic" {
/// type). /// type).
/// ///
/// `mask` must only contain `0` or `!0` values. /// `mask` must only contain `0` or `!0` values.
#[rustc_nounwind]
pub fn simd_gather<T, U, V>(val: T, ptr: U, mask: V) -> T; pub fn simd_gather<T, U, V>(val: T, ptr: U, mask: V) -> T;
/// Write to a vector of pointers. /// Write to a vector of pointers.
@ -271,6 +302,7 @@ extern "platform-intrinsic" {
/// type). /// type).
/// ///
/// `mask` must only contain `0` or `!0` values. /// `mask` must only contain `0` or `!0` values.
#[rustc_nounwind]
pub fn simd_scatter<T, U, V>(val: T, ptr: U, mask: V); pub fn simd_scatter<T, U, V>(val: T, ptr: U, mask: V);
/// Read a vector of pointers. /// Read a vector of pointers.
@ -292,6 +324,7 @@ extern "platform-intrinsic" {
/// type). /// type).
/// ///
/// `mask` must only contain `0` or `!0` values. /// `mask` must only contain `0` or `!0` values.
#[rustc_nounwind]
pub fn simd_masked_load<V, U, T>(mask: V, ptr: U, val: T) -> T; pub fn simd_masked_load<V, U, T>(mask: V, ptr: U, val: T) -> T;
/// Write to a vector of pointers. /// Write to a vector of pointers.
@ -312,11 +345,13 @@ extern "platform-intrinsic" {
/// type). /// type).
/// ///
/// `mask` must only contain `0` or `!0` values. /// `mask` must only contain `0` or `!0` values.
#[rustc_nounwind]
pub fn simd_masked_store<V, U, T>(mask: V, ptr: U, val: T); pub fn simd_masked_store<V, U, T>(mask: V, ptr: U, val: T);
/// Add two simd vectors elementwise, with saturation. /// Add two simd vectors elementwise, with saturation.
/// ///
/// `T` must be a vector of integer primitive types. /// `T` must be a vector of integer primitive types.
#[rustc_nounwind]
pub fn simd_saturating_add<T>(x: T, y: T) -> T; pub fn simd_saturating_add<T>(x: T, y: T) -> T;
/// Subtract two simd vectors elementwise, with saturation. /// Subtract two simd vectors elementwise, with saturation.
@ -324,6 +359,7 @@ extern "platform-intrinsic" {
/// `T` must be a vector of integer primitive types. /// `T` must be a vector of integer primitive types.
/// ///
/// Subtract `rhs` from `lhs`. /// Subtract `rhs` from `lhs`.
#[rustc_nounwind]
pub fn simd_saturating_sub<T>(lhs: T, rhs: T) -> T; pub fn simd_saturating_sub<T>(lhs: T, rhs: T) -> T;
/// Add elements within a vector from left to right. /// Add elements within a vector from left to right.
@ -333,6 +369,7 @@ extern "platform-intrinsic" {
/// `U` must be the element type of `T`. /// `U` must be the element type of `T`.
/// ///
/// Starting with the value `y`, add the elements of `x` and accumulate. /// Starting with the value `y`, add the elements of `x` and accumulate.
#[rustc_nounwind]
pub fn simd_reduce_add_ordered<T, U>(x: T, y: U) -> U; pub fn simd_reduce_add_ordered<T, U>(x: T, y: U) -> U;
/// Add elements within a vector in arbitrary order. May also be re-associated with /// Add elements within a vector in arbitrary order. May also be re-associated with
@ -341,6 +378,7 @@ extern "platform-intrinsic" {
/// `T` must be a vector of integer or floating-point primitive types. /// `T` must be a vector of integer or floating-point primitive types.
/// ///
/// `U` must be the element type of `T`. /// `U` must be the element type of `T`.
#[rustc_nounwind]
pub fn simd_reduce_add_unordered<T, U>(x: T) -> U; pub fn simd_reduce_add_unordered<T, U>(x: T) -> U;
/// Multiply elements within a vector from left to right. /// Multiply elements within a vector from left to right.
@ -350,6 +388,7 @@ extern "platform-intrinsic" {
/// `U` must be the element type of `T`. /// `U` must be the element type of `T`.
/// ///
/// Starting with the value `y`, multiply the elements of `x` and accumulate. /// Starting with the value `y`, multiply the elements of `x` and accumulate.
#[rustc_nounwind]
pub fn simd_reduce_mul_ordered<T, U>(x: T, y: U) -> U; pub fn simd_reduce_mul_ordered<T, U>(x: T, y: U) -> U;
/// Add elements within a vector in arbitrary order. May also be re-associated with /// Add elements within a vector in arbitrary order. May also be re-associated with
@ -358,6 +397,7 @@ extern "platform-intrinsic" {
/// `T` must be a vector of integer or floating-point primitive types. /// `T` must be a vector of integer or floating-point primitive types.
/// ///
/// `U` must be the element type of `T`. /// `U` must be the element type of `T`.
#[rustc_nounwind]
pub fn simd_reduce_mul_unordered<T, U>(x: T) -> U; pub fn simd_reduce_mul_unordered<T, U>(x: T) -> U;
/// Check if all mask values are true. /// Check if all mask values are true.
@ -366,6 +406,7 @@ extern "platform-intrinsic" {
/// ///
/// # Safety /// # Safety
/// `x` must contain only `0` or `!0`. /// `x` must contain only `0` or `!0`.
#[rustc_nounwind]
pub fn simd_reduce_all<T>(x: T) -> bool; pub fn simd_reduce_all<T>(x: T) -> bool;
/// Check if all mask values are true. /// Check if all mask values are true.
@ -374,6 +415,7 @@ extern "platform-intrinsic" {
/// ///
/// # Safety /// # Safety
/// `x` must contain only `0` or `!0`. /// `x` must contain only `0` or `!0`.
#[rustc_nounwind]
pub fn simd_reduce_any<T>(x: T) -> bool; pub fn simd_reduce_any<T>(x: T) -> bool;
/// Return the maximum element of a vector. /// Return the maximum element of a vector.
@ -383,6 +425,7 @@ extern "platform-intrinsic" {
/// `U` must be the element type of `T`. /// `U` must be the element type of `T`.
/// ///
/// For floating-point values, uses IEEE-754 `maxNum`. /// For floating-point values, uses IEEE-754 `maxNum`.
#[rustc_nounwind]
pub fn simd_reduce_max<T, U>(x: T) -> U; pub fn simd_reduce_max<T, U>(x: T) -> U;
/// Return the minimum element of a vector. /// Return the minimum element of a vector.
@ -392,6 +435,7 @@ extern "platform-intrinsic" {
/// `U` must be the element type of `T`. /// `U` must be the element type of `T`.
/// ///
/// For floating-point values, uses IEEE-754 `minNum`. /// For floating-point values, uses IEEE-754 `minNum`.
#[rustc_nounwind]
pub fn simd_reduce_min<T, U>(x: T) -> U; pub fn simd_reduce_min<T, U>(x: T) -> U;
/// Logical "and" all elements together. /// Logical "and" all elements together.
@ -399,6 +443,7 @@ extern "platform-intrinsic" {
/// `T` must be a vector of integer or floating-point primitive types. /// `T` must be a vector of integer or floating-point primitive types.
/// ///
/// `U` must be the element type of `T`. /// `U` must be the element type of `T`.
#[rustc_nounwind]
pub fn simd_reduce_and<T, U>(x: T) -> U; pub fn simd_reduce_and<T, U>(x: T) -> U;
/// Logical "or" all elements together. /// Logical "or" all elements together.
@ -406,6 +451,7 @@ extern "platform-intrinsic" {
/// `T` must be a vector of integer or floating-point primitive types. /// `T` must be a vector of integer or floating-point primitive types.
/// ///
/// `U` must be the element type of `T`. /// `U` must be the element type of `T`.
#[rustc_nounwind]
pub fn simd_reduce_or<T, U>(x: T) -> U; pub fn simd_reduce_or<T, U>(x: T) -> U;
/// Logical "exclusive or" all elements together. /// Logical "exclusive or" all elements together.
@ -413,6 +459,7 @@ extern "platform-intrinsic" {
/// `T` must be a vector of integer or floating-point primitive types. /// `T` must be a vector of integer or floating-point primitive types.
/// ///
/// `U` must be the element type of `T`. /// `U` must be the element type of `T`.
#[rustc_nounwind]
pub fn simd_reduce_xor<T, U>(x: T) -> U; pub fn simd_reduce_xor<T, U>(x: T) -> U;
/// Truncate an integer vector to a bitmask. /// Truncate an integer vector to a bitmask.
@ -441,6 +488,7 @@ extern "platform-intrinsic" {
/// ///
/// # Safety /// # Safety
/// `x` must contain only `0` and `!0`. /// `x` must contain only `0` and `!0`.
#[rustc_nounwind]
pub fn simd_bitmask<T, U>(x: T) -> U; pub fn simd_bitmask<T, U>(x: T) -> U;
/// Select elements from a mask. /// Select elements from a mask.
@ -455,6 +503,7 @@ extern "platform-intrinsic" {
/// ///
/// # Safety /// # Safety
/// `mask` must only contain `0` and `!0`. /// `mask` must only contain `0` and `!0`.
#[rustc_nounwind]
pub fn simd_select<M, T>(mask: M, if_true: T, if_false: T) -> T; pub fn simd_select<M, T>(mask: M, if_true: T, if_false: T) -> T;
/// Select elements from a bitmask. /// Select elements from a bitmask.
@ -471,6 +520,7 @@ extern "platform-intrinsic" {
/// ///
/// # Safety /// # Safety
/// Padding bits must be all zero. /// Padding bits must be all zero.
#[rustc_nounwind]
pub fn simd_select_bitmask<M, T>(m: M, yes: T, no: T) -> T; pub fn simd_select_bitmask<M, T>(m: M, yes: T, no: T) -> T;
/// Elementwise calculates the offset from a pointer vector, potentially wrapping. /// Elementwise calculates the offset from a pointer vector, potentially wrapping.
@ -480,11 +530,13 @@ extern "platform-intrinsic" {
/// `U` must be a vector of `isize` or `usize` with the same number of elements as `T`. /// `U` must be a vector of `isize` or `usize` with the same number of elements as `T`.
/// ///
/// Operates as if by `<ptr>::wrapping_offset`. /// Operates as if by `<ptr>::wrapping_offset`.
#[rustc_nounwind]
pub fn simd_arith_offset<T, U>(ptr: T, offset: U) -> T; pub fn simd_arith_offset<T, U>(ptr: T, offset: U) -> T;
/// Cast a vector of pointers. /// Cast a vector of pointers.
/// ///
/// `T` and `U` must be vectors of pointers with the same number of elements. /// `T` and `U` must be vectors of pointers with the same number of elements.
#[rustc_nounwind]
pub fn simd_cast_ptr<T, U>(ptr: T) -> U; pub fn simd_cast_ptr<T, U>(ptr: T) -> U;
/// Expose a vector of pointers as a vector of addresses. /// Expose a vector of pointers as a vector of addresses.
@ -492,6 +544,7 @@ extern "platform-intrinsic" {
/// `T` must be a vector of pointers. /// `T` must be a vector of pointers.
/// ///
/// `U` must be a vector of `usize` with the same length as `T`. /// `U` must be a vector of `usize` with the same length as `T`.
#[rustc_nounwind]
pub fn simd_expose_addr<T, U>(ptr: T) -> U; pub fn simd_expose_addr<T, U>(ptr: T) -> U;
/// Create a vector of pointers from a vector of addresses. /// Create a vector of pointers from a vector of addresses.
@ -499,92 +552,117 @@ extern "platform-intrinsic" {
/// `T` must be a vector of `usize`. /// `T` must be a vector of `usize`.
/// ///
/// `U` must be a vector of pointers, with the same length as `T`. /// `U` must be a vector of pointers, with the same length as `T`.
#[rustc_nounwind]
pub fn simd_from_exposed_addr<T, U>(addr: T) -> U; pub fn simd_from_exposed_addr<T, U>(addr: T) -> U;
/// Swap bytes of each element. /// Swap bytes of each element.
/// ///
/// `T` must be a vector of integers. /// `T` must be a vector of integers.
#[rustc_nounwind]
pub fn simd_bswap<T>(x: T) -> T; pub fn simd_bswap<T>(x: T) -> T;
/// Reverse bits of each element. /// Reverse bits of each element.
/// ///
/// `T` must be a vector of integers. /// `T` must be a vector of integers.
#[rustc_nounwind]
pub fn simd_bitreverse<T>(x: T) -> T; pub fn simd_bitreverse<T>(x: T) -> T;
/// Count the leading zeros of each element. /// Count the leading zeros of each element.
/// ///
/// `T` must be a vector of integers. /// `T` must be a vector of integers.
#[rustc_nounwind]
pub fn simd_ctlz<T>(x: T) -> T; pub fn simd_ctlz<T>(x: T) -> T;
/// Count the trailing zeros of each element. /// Count the trailing zeros of each element.
/// ///
/// `T` must be a vector of integers. /// `T` must be a vector of integers.
#[rustc_nounwind]
pub fn simd_cttz<T>(x: T) -> T; pub fn simd_cttz<T>(x: T) -> T;
/// Round up each element to the next highest integer-valued float. /// Round up each element to the next highest integer-valued float.
/// ///
/// `T` must be a vector of floats. /// `T` must be a vector of floats.
#[rustc_nounwind]
pub fn simd_ceil<T>(x: T) -> T; pub fn simd_ceil<T>(x: T) -> T;
/// Round down each element to the next lowest integer-valued float. /// Round down each element to the next lowest integer-valued float.
/// ///
/// `T` must be a vector of floats. /// `T` must be a vector of floats.
#[rustc_nounwind]
pub fn simd_floor<T>(x: T) -> T; pub fn simd_floor<T>(x: T) -> T;
/// Round each element to the closest integer-valued float. /// Round each element to the closest integer-valued float.
/// Ties are resolved by rounding away from 0. /// Ties are resolved by rounding away from 0.
/// ///
/// `T` must be a vector of floats. /// `T` must be a vector of floats.
#[rustc_nounwind]
pub fn simd_round<T>(x: T) -> T; pub fn simd_round<T>(x: T) -> T;
/// Return the integer part of each element as an integer-valued float. /// Return the integer part of each element as an integer-valued float.
/// In other words, non-integer values are truncated towards zero. /// In other words, non-integer values are truncated towards zero.
/// ///
/// `T` must be a vector of floats. /// `T` must be a vector of floats.
#[rustc_nounwind]
pub fn simd_trunc<T>(x: T) -> T; pub fn simd_trunc<T>(x: T) -> T;
/// Takes the square root of each element. /// Takes the square root of each element.
/// ///
/// `T` must be a vector of floats. /// `T` must be a vector of floats.
#[rustc_nounwind]
pub fn simd_fsqrt<T>(x: T) -> T; pub fn simd_fsqrt<T>(x: T) -> T;
/// Computes `(x*y) + z` for each element, but without any intermediate rounding. /// Computes `(x*y) + z` for each element, but without any intermediate rounding.
/// ///
/// `T` must be a vector of floats. /// `T` must be a vector of floats.
#[rustc_nounwind]
pub fn simd_fma<T>(x: T, y: T, z: T) -> T; pub fn simd_fma<T>(x: T, y: T, z: T) -> T;
// Computes the sine of each element. // Computes the sine of each element.
/// ///
/// `T` must be a vector of floats. /// `T` must be a vector of floats.
#[rustc_nounwind]
pub fn simd_fsin<T>(a: T) -> T; pub fn simd_fsin<T>(a: T) -> T;
// Computes the cosine of each element. // Computes the cosine of each element.
/// ///
/// `T` must be a vector of floats. /// `T` must be a vector of floats.
#[rustc_nounwind]
pub fn simd_fcos<T>(a: T) -> T; pub fn simd_fcos<T>(a: T) -> T;
// Computes the exponential function of each element. // Computes the exponential function of each element.
/// ///
/// `T` must be a vector of floats. /// `T` must be a vector of floats.
#[rustc_nounwind]
pub fn simd_fexp<T>(a: T) -> T; pub fn simd_fexp<T>(a: T) -> T;
// Computes 2 raised to the power of each element. // Computes 2 raised to the power of each element.
/// ///
/// `T` must be a vector of floats. /// `T` must be a vector of floats.
#[rustc_nounwind]
pub fn simd_fexp2<T>(a: T) -> T; pub fn simd_fexp2<T>(a: T) -> T;
// Computes the base 10 logarithm of each element. // Computes the base 10 logarithm of each element.
/// ///
/// `T` must be a vector of floats. /// `T` must be a vector of floats.
#[rustc_nounwind]
pub fn simd_flog10<T>(a: T) -> T; pub fn simd_flog10<T>(a: T) -> T;
// Computes the base 2 logarithm of each element. // Computes the base 2 logarithm of each element.
/// ///
/// `T` must be a vector of floats. /// `T` must be a vector of floats.
#[rustc_nounwind]
pub fn simd_flog2<T>(a: T) -> T; pub fn simd_flog2<T>(a: T) -> T;
// Computes the natural logarithm of each element. // Computes the natural logarithm of each element.
/// ///
/// `T` must be a vector of floats. /// `T` must be a vector of floats.
#[rustc_nounwind]
pub fn simd_flog<T>(a: T) -> T; pub fn simd_flog<T>(a: T) -> T;
} }
}
}
#[cfg(bootstrap)]
declare_intrinsics!("platform-intrinsic");
#[cfg(not(bootstrap))]
declare_intrinsics!("rust-intrinsic");

View file

@ -202,6 +202,7 @@
// //
// Language features: // Language features:
// tidy-alphabetical-start // tidy-alphabetical-start
#![cfg_attr(bootstrap, feature(platform_intrinsics))]
#![feature(abi_unadjusted)] #![feature(abi_unadjusted)]
#![feature(adt_const_params)] #![feature(adt_const_params)]
#![feature(allow_internal_unsafe)] #![feature(allow_internal_unsafe)]
@ -246,7 +247,6 @@
#![feature(never_type)] #![feature(never_type)]
#![feature(no_core)] #![feature(no_core)]
#![feature(no_sanitize)] #![feature(no_sanitize)]
#![feature(platform_intrinsics)]
#![feature(prelude_import)] #![feature(prelude_import)]
#![feature(repr_simd)] #![feature(repr_simd)]
#![feature(rustc_allow_const_fn_unstable)] #![feature(rustc_allow_const_fn_unstable)]

View file

@ -270,6 +270,7 @@
// //
// Language features: // Language features:
// tidy-alphabetical-start // tidy-alphabetical-start
#![cfg_attr(bootstrap, feature(platform_intrinsics))]
#![feature(alloc_error_handler)] #![feature(alloc_error_handler)]
#![feature(allocator_internals)] #![feature(allocator_internals)]
#![feature(allow_internal_unsafe)] #![feature(allow_internal_unsafe)]
@ -301,7 +302,6 @@
#![feature(negative_impls)] #![feature(negative_impls)]
#![feature(never_type)] #![feature(never_type)]
#![feature(no_sanitize)] #![feature(no_sanitize)]
#![feature(platform_intrinsics)]
#![feature(prelude_import)] #![feature(prelude_import)]
#![feature(rustc_attrs)] #![feature(rustc_attrs)]
#![feature(rustdoc_internals)] #![feature(rustdoc_internals)]

View file

@ -1,8 +1,6 @@
#![feature(platform_intrinsics, repr_simd)] #![feature(core_intrinsics, repr_simd)]
extern "platform-intrinsic" { use std::intrinsics::simd::simd_div;
pub(crate) fn simd_div<T>(x: T, y: T) -> T;
}
#[repr(simd)] #[repr(simd)]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]

View file

@ -1,8 +1,6 @@
#![feature(platform_intrinsics, repr_simd)] #![feature(core_intrinsics, repr_simd)]
extern "platform-intrinsic" { use std::intrinsics::simd::simd_div;
pub(crate) fn simd_div<T>(x: T, y: T) -> T;
}
#[repr(simd)] #[repr(simd)]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]

View file

@ -1,8 +1,6 @@
#![feature(platform_intrinsics, repr_simd)] #![feature(core_intrinsics, repr_simd)]
extern "platform-intrinsic" { use std::intrinsics::simd::simd_reduce_any;
pub(crate) fn simd_reduce_any<T>(x: T) -> bool;
}
#[repr(simd)] #[repr(simd)]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]

View file

@ -1,8 +1,6 @@
#![feature(platform_intrinsics, repr_simd)] #![feature(core_intrinsics, repr_simd)]
extern "platform-intrinsic" { use std::intrinsics::simd::simd_rem;
pub(crate) fn simd_rem<T>(x: T, y: T) -> T;
}
#[repr(simd)] #[repr(simd)]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]

View file

@ -1,8 +1,6 @@
#![feature(platform_intrinsics, repr_simd)] #![feature(core_intrinsics, repr_simd)]
extern "platform-intrinsic" { use std::intrinsics::simd::simd_select_bitmask;
fn simd_select_bitmask<M, T>(m: M, yes: T, no: T) -> T;
}
#[repr(simd)] #[repr(simd)]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]

View file

@ -1,8 +1,6 @@
#![feature(platform_intrinsics, repr_simd)] #![feature(core_intrinsics, repr_simd)]
extern "platform-intrinsic" { use std::intrinsics::simd::simd_select;
fn simd_select<M, T>(m: M, yes: T, no: T) -> T;
}
#[repr(simd)] #[repr(simd)]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]

View file

@ -1,8 +1,6 @@
#![feature(platform_intrinsics, repr_simd)] #![feature(core_intrinsics, repr_simd)]
extern "platform-intrinsic" { use std::intrinsics::simd::simd_shl;
pub(crate) fn simd_shl<T>(x: T, y: T) -> T;
}
#[repr(simd)] #[repr(simd)]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]

View file

@ -1,8 +1,6 @@
#![feature(platform_intrinsics, repr_simd)] #![feature(core_intrinsics, repr_simd)]
extern "platform-intrinsic" { use std::intrinsics::simd::simd_shr;
pub(crate) fn simd_shr<T>(x: T, y: T) -> T;
}
#[repr(simd)] #[repr(simd)]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]

View file

@ -1,4 +1,4 @@
#![feature(float_gamma, portable_simd, core_intrinsics, platform_intrinsics)] #![feature(float_gamma, portable_simd, core_intrinsics)]
use std::collections::HashSet; use std::collections::HashSet;
use std::fmt; use std::fmt;
use std::hash::Hash; use std::hash::Hash;
@ -525,12 +525,6 @@ fn test_simd() {
use std::intrinsics::simd::*; use std::intrinsics::simd::*;
use std::simd::*; use std::simd::*;
extern "platform-intrinsic" {
fn simd_fsqrt<T>(x: T) -> T;
fn simd_ceil<T>(x: T) -> T;
fn simd_fma<T>(x: T, y: T, z: T) -> T;
}
let nan = F32::nan(Neg, Quiet, 0).as_f32(); let nan = F32::nan(Neg, Quiet, 0).as_f32();
check_all_outcomes( check_all_outcomes(
HashSet::from_iter([F32::nan(Pos, Quiet, 0), F32::nan(Neg, Quiet, 0)]), HashSet::from_iter([F32::nan(Pos, Quiet, 0), F32::nan(Neg, Quiet, 0)]),

View file

@ -1,6 +1,6 @@
// Separate test without strict provenance // Separate test without strict provenance
//@compile-flags: -Zmiri-permissive-provenance //@compile-flags: -Zmiri-permissive-provenance
#![feature(portable_simd, platform_intrinsics)] #![feature(portable_simd)]
use std::ptr; use std::ptr;
use std::simd::prelude::*; use std::simd::prelude::*;

View file

@ -1,5 +1,5 @@
//@compile-flags: -Zmiri-strict-provenance //@compile-flags: -Zmiri-strict-provenance
#![feature(portable_simd, platform_intrinsics, adt_const_params, inline_const, core_intrinsics)] #![feature(portable_simd, adt_const_params, inline_const, core_intrinsics)]
#![allow(incomplete_features, internal_features)] #![allow(incomplete_features, internal_features)]
use std::intrinsics::simd as intrinsics; use std::intrinsics::simd as intrinsics;
use std::ptr; use std::ptr;
@ -216,10 +216,7 @@ fn simd_ops_i32() {
} }
fn simd_mask() { fn simd_mask() {
extern "platform-intrinsic" { use std::intrinsics::simd::*;
pub(crate) fn simd_bitmask<T, U>(x: T) -> U;
pub(crate) fn simd_select_bitmask<M, T>(m: M, yes: T, no: T) -> T;
}
let intmask = Mask::from_int(i32x4::from_array([0, -1, 0, 0])); let intmask = Mask::from_int(i32x4::from_array([0, -1, 0, 0]));
assert_eq!(intmask, Mask::from_array([false, true, false, false])); assert_eq!(intmask, Mask::from_array([false, true, false, false]));
@ -493,9 +490,6 @@ fn simd_round() {
fn simd_intrinsics() { fn simd_intrinsics() {
use intrinsics::*; use intrinsics::*;
extern "platform-intrinsic" {
fn simd_shuffle_generic<T, U, const IDX: &'static [u32]>(x: T, y: T) -> U;
}
unsafe { unsafe {
// Make sure simd_eq returns all-1 for `true` // Make sure simd_eq returns all-1 for `true`

View file

@ -1,4 +1,4 @@
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd)]
#[repr(simd)] #[repr(simd)]
#[derive(Copy, Clone, Debug, PartialEq)] #[derive(Copy, Clone, Debug, PartialEq)]

View file

@ -1,7 +1,7 @@
//@ compile-flags: -O --crate-type=rlib //@ compile-flags: -O --crate-type=rlib
#![feature(platform_intrinsics, repr_simd)] #![feature(intrinsics, repr_simd)]
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_fabs<T>(x: T) -> T; fn simd_fabs<T>(x: T) -> T;
fn simd_eq<T, U>(x: T, y: T) -> U; fn simd_eq<T, U>(x: T, y: T) -> U;
} }

View file

@ -2,7 +2,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -25,7 +25,7 @@ pub struct f32x16(pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32); pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_fabs<T>(x: T) -> T; fn simd_fabs<T>(x: T) -> T;
} }

View file

@ -2,7 +2,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -25,7 +25,7 @@ pub struct f32x16(pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32); pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_ceil<T>(x: T) -> T; fn simd_ceil<T>(x: T) -> T;
} }

View file

@ -2,7 +2,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -25,7 +25,7 @@ pub struct f32x16(pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32); pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_fcos<T>(x: T) -> T; fn simd_fcos<T>(x: T) -> T;
} }

View file

@ -2,7 +2,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -25,7 +25,7 @@ pub struct f32x16(pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32); pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_fexp<T>(x: T) -> T; fn simd_fexp<T>(x: T) -> T;
} }

View file

@ -2,7 +2,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -25,7 +25,7 @@ pub struct f32x16(pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32); pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_fexp2<T>(x: T) -> T; fn simd_fexp2<T>(x: T) -> T;
} }

View file

@ -2,7 +2,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -25,7 +25,7 @@ pub struct f32x16(pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32); pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_floor<T>(x: T) -> T; fn simd_floor<T>(x: T) -> T;
} }

View file

@ -2,7 +2,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -25,7 +25,7 @@ pub struct f32x16(pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32); pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_fma<T>(x: T, b: T, c: T) -> T; fn simd_fma<T>(x: T, b: T, c: T) -> T;
} }

View file

@ -2,7 +2,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -25,7 +25,7 @@ pub struct f32x16(pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32); pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_fsqrt<T>(x: T) -> T; fn simd_fsqrt<T>(x: T) -> T;
} }

View file

@ -2,7 +2,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -25,7 +25,7 @@ pub struct f32x16(pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32); pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_flog<T>(x: T) -> T; fn simd_flog<T>(x: T) -> T;
} }

View file

@ -2,7 +2,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -25,7 +25,7 @@ pub struct f32x16(pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32); pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_flog10<T>(x: T) -> T; fn simd_flog10<T>(x: T) -> T;
} }

View file

@ -2,7 +2,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -25,7 +25,7 @@ pub struct f32x16(pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32); pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_flog2<T>(x: T) -> T; fn simd_flog2<T>(x: T) -> T;
} }

View file

@ -2,14 +2,14 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
#[derive(Copy, Clone, PartialEq, Debug)] #[derive(Copy, Clone, PartialEq, Debug)]
pub struct f32x4(pub f32, pub f32, pub f32, pub f32); pub struct f32x4(pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_fmin<T>(x: T, y: T) -> T; fn simd_fmin<T>(x: T, y: T) -> T;
fn simd_fmax<T>(x: T, y: T) -> T; fn simd_fmax<T>(x: T, y: T) -> T;
} }

View file

@ -2,7 +2,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -25,7 +25,7 @@ pub struct f32x16(pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32); pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_fpow<T>(x: T, b: T) -> T; fn simd_fpow<T>(x: T, b: T) -> T;
} }

View file

@ -2,7 +2,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -25,7 +25,7 @@ pub struct f32x16(pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32); pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_fpowi<T>(x: T, b: i32) -> T; fn simd_fpowi<T>(x: T, b: i32) -> T;
} }

View file

@ -2,7 +2,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -25,7 +25,7 @@ pub struct f32x16(pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32, pub f32,
pub f32, pub f32, pub f32, pub f32); pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_fsin<T>(x: T) -> T; fn simd_fsin<T>(x: T) -> T;
} }

View file

@ -3,7 +3,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#![deny(unused)] #![deny(unused)]
@ -111,7 +111,7 @@
#[repr(simd)] #[derive(Copy, Clone)] pub struct u128x2(u128, u128); #[repr(simd)] #[derive(Copy, Clone)] pub struct u128x2(u128, u128);
#[repr(simd)] #[derive(Copy, Clone)] pub struct u128x4(u128, u128, u128, u128); #[repr(simd)] #[derive(Copy, Clone)] pub struct u128x4(u128, u128, u128, u128);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_saturating_add<T>(x: T, y: T) -> T; fn simd_saturating_add<T>(x: T, y: T) -> T;
fn simd_saturating_sub<T>(x: T, y: T) -> T; fn simd_saturating_sub<T>(x: T, y: T) -> T;
} }

View file

@ -3,7 +3,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -22,7 +22,7 @@ pub struct i8x16(
); );
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_bitmask<T, U>(x: T) -> U; fn simd_bitmask<T, U>(x: T) -> U;
} }

View file

@ -4,7 +4,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -15,7 +15,7 @@ pub struct Vec2<T>(pub T, pub T);
#[derive(Copy, Clone, PartialEq, Debug)] #[derive(Copy, Clone, PartialEq, Debug)]
pub struct Vec4<T>(pub T, pub T, pub T, pub T); pub struct Vec4<T>(pub T, pub T, pub T, pub T);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_gather<T, P, M>(value: T, pointers: P, mask: M) -> T; fn simd_gather<T, P, M>(value: T, pointers: P, mask: M) -> T;
} }

View file

@ -2,7 +2,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -13,7 +13,7 @@ pub struct Vec2<T>(pub T, pub T);
#[derive(Copy, Clone, PartialEq, Debug)] #[derive(Copy, Clone, PartialEq, Debug)]
pub struct Vec4<T>(pub T, pub T, pub T, pub T); pub struct Vec4<T>(pub T, pub T, pub T, pub T);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_masked_load<M, P, T>(mask: M, pointer: P, values: T) -> T; fn simd_masked_load<M, P, T>(mask: M, pointer: P, values: T) -> T;
} }

View file

@ -2,7 +2,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -13,7 +13,7 @@ pub struct Vec2<T>(pub T, pub T);
#[derive(Copy, Clone, PartialEq, Debug)] #[derive(Copy, Clone, PartialEq, Debug)]
pub struct Vec4<T>(pub T, pub T, pub T, pub T); pub struct Vec4<T>(pub T, pub T, pub T, pub T);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_masked_store<M, P, T>(mask: M, pointer: P, values: T) -> (); fn simd_masked_store<M, P, T>(mask: M, pointer: P, values: T) -> ();
} }

View file

@ -4,7 +4,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -15,7 +15,7 @@ pub struct Vec2<T>(pub T, pub T);
#[derive(Copy, Clone, PartialEq, Debug)] #[derive(Copy, Clone, PartialEq, Debug)]
pub struct Vec4<T>(pub T, pub T, pub T, pub T); pub struct Vec4<T>(pub T, pub T, pub T, pub T);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_scatter<T, P, M>(value: T, pointers: P, mask: M); fn simd_scatter<T, P, M>(value: T, pointers: P, mask: M);
} }

View file

@ -2,7 +2,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -17,7 +17,7 @@ pub struct f32x8(f32, f32, f32, f32, f32, f32, f32, f32);
#[derive(Copy, Clone, PartialEq, Debug)] #[derive(Copy, Clone, PartialEq, Debug)]
pub struct b8x4(pub i8, pub i8, pub i8, pub i8); pub struct b8x4(pub i8, pub i8, pub i8, pub i8);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_select<T, U>(x: T, a: U, b: U) -> U; fn simd_select<T, U>(x: T, a: U, b: U) -> U;
fn simd_select_bitmask<T, U>(x: T, a: U, b: U) -> U; fn simd_select_bitmask<T, U>(x: T, a: U, b: U) -> U;
} }

View file

@ -3,7 +3,7 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![feature(inline_const)] #![feature(inline_const)]
#[repr(simd)] #[repr(simd)]

View file

@ -3,9 +3,9 @@
// //
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
extern "platform-intrinsic" { extern "rust-intrinsic" {
pub(crate) fn simd_arith_offset<T, U>(ptrs: T, offsets: U) -> T; pub(crate) fn simd_arith_offset<T, U>(ptrs: T, offsets: U) -> T;
} }

View file

@ -1,11 +1,11 @@
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
//@ revisions:rpass1 rpass2 //@ revisions:rpass1 rpass2
#[repr(simd)] #[repr(simd)]
struct I32x2(i32, i32); struct I32x2(i32, i32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_shuffle<T, I, U>(x: T, y: T, idx: I) -> U; fn simd_shuffle<T, I, U>(x: T, y: T, idx: I) -> U;
} }

View file

@ -1,6 +1,6 @@
//@ run-pass //@ run-pass
#![feature(repr_simd)] #![feature(repr_simd)]
#![feature(platform_intrinsics)] #![feature(intrinsics)]
#![feature(staged_api)] #![feature(staged_api)]
#![stable(feature = "foo", since = "1.3.37")] #![stable(feature = "foo", since = "1.3.37")]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
@ -11,7 +11,7 @@
#[repr(simd)] struct i8x1_arr([i8; 1]); #[repr(simd)] struct i8x1_arr([i8; 1]);
#[repr(simd)] struct f32x4([f32; 4]); #[repr(simd)] struct f32x4([f32; 4]);
extern "platform-intrinsic" { extern "rust-intrinsic" {
#[rustc_const_stable(feature = "foo", since = "1.3.37")] #[rustc_const_stable(feature = "foo", since = "1.3.37")]
fn simd_insert<T, U>(x: T, idx: u32, val: U) -> T; fn simd_insert<T, U>(x: T, idx: u32, val: U) -> T;
#[rustc_const_stable(feature = "foo", since = "1.3.37")] #[rustc_const_stable(feature = "foo", since = "1.3.37")]

View file

@ -1,8 +1,8 @@
//@ build-fail //@ build-fail
#![feature(platform_intrinsics)] #![feature(intrinsics)]
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_add<T>(a: T, b: T) -> T; fn simd_add<T>(a: T, b: T) -> T;
} }

View file

@ -1,5 +1,4 @@
// gate-test-intrinsics // gate-test-intrinsics
// gate-test-platform_intrinsics
//@ compile-flags: --crate-type=rlib //@ compile-flags: --crate-type=rlib
#![feature(no_core, lang_items)] #![feature(no_core, lang_items)]
@ -15,7 +14,7 @@ trait Tuple { }
extern "rust-intrinsic" fn f1() {} //~ ERROR intrinsics are subject to change extern "rust-intrinsic" fn f1() {} //~ ERROR intrinsics are subject to change
//~^ ERROR intrinsic must be in //~^ ERROR intrinsic must be in
//~| ERROR unrecognized intrinsic function: `f1` //~| ERROR unrecognized intrinsic function: `f1`
extern "platform-intrinsic" fn f2() {} //~ ERROR platform intrinsics are experimental extern "rust-intrinsic" fn f2() {} //~ ERROR intrinsics are subject to change
//~^ ERROR intrinsic must be in //~^ ERROR intrinsic must be in
//~| ERROR unrecognized intrinsic function: `f2` //~| ERROR unrecognized intrinsic function: `f2`
extern "rust-call" fn f4(_: ()) {} //~ ERROR rust-call ABI is subject to change extern "rust-call" fn f4(_: ()) {} //~ ERROR rust-call ABI is subject to change
@ -24,7 +23,7 @@ extern "rust-call" fn f4(_: ()) {} //~ ERROR rust-call ABI is subject to change
trait Tr { trait Tr {
extern "rust-intrinsic" fn m1(); //~ ERROR intrinsics are subject to change extern "rust-intrinsic" fn m1(); //~ ERROR intrinsics are subject to change
//~^ ERROR intrinsic must be in //~^ ERROR intrinsic must be in
extern "platform-intrinsic" fn m2(); //~ ERROR platform intrinsics are experimental extern "rust-intrinsic" fn m2(); //~ ERROR intrinsics are subject to change
//~^ ERROR intrinsic must be in //~^ ERROR intrinsic must be in
extern "rust-call" fn m4(_: ()); //~ ERROR rust-call ABI is subject to change extern "rust-call" fn m4(_: ()); //~ ERROR rust-call ABI is subject to change
@ -37,7 +36,7 @@ struct S;
impl Tr for S { impl Tr for S {
extern "rust-intrinsic" fn m1() {} //~ ERROR intrinsics are subject to change extern "rust-intrinsic" fn m1() {} //~ ERROR intrinsics are subject to change
//~^ ERROR intrinsic must be in //~^ ERROR intrinsic must be in
extern "platform-intrinsic" fn m2() {} //~ ERROR platform intrinsics are experimental extern "rust-intrinsic" fn m2() {} //~ ERROR intrinsics are subject to change
//~^ ERROR intrinsic must be in //~^ ERROR intrinsic must be in
extern "rust-call" fn m4(_: ()) {} //~ ERROR rust-call ABI is subject to change extern "rust-call" fn m4(_: ()) {} //~ ERROR rust-call ABI is subject to change
} }
@ -46,17 +45,17 @@ impl Tr for S {
impl S { impl S {
extern "rust-intrinsic" fn im1() {} //~ ERROR intrinsics are subject to change extern "rust-intrinsic" fn im1() {} //~ ERROR intrinsics are subject to change
//~^ ERROR intrinsic must be in //~^ ERROR intrinsic must be in
extern "platform-intrinsic" fn im2() {} //~ ERROR platform intrinsics are experimental extern "rust-intrinsic" fn im2() {} //~ ERROR intrinsics are subject to change
//~^ ERROR intrinsic must be in //~^ ERROR intrinsic must be in
extern "rust-call" fn im4(_: ()) {} //~ ERROR rust-call ABI is subject to change extern "rust-call" fn im4(_: ()) {} //~ ERROR rust-call ABI is subject to change
} }
// Function pointer types // Function pointer types
type A1 = extern "rust-intrinsic" fn(); //~ ERROR intrinsics are subject to change type A1 = extern "rust-intrinsic" fn(); //~ ERROR intrinsics are subject to change
type A2 = extern "platform-intrinsic" fn(); //~ ERROR platform intrinsics are experimental type A2 = extern "rust-intrinsic" fn(); //~ ERROR intrinsics are subject to change
type A4 = extern "rust-call" fn(_: ()); //~ ERROR rust-call ABI is subject to change type A4 = extern "rust-call" fn(_: ()); //~ ERROR rust-call ABI is subject to change
// Foreign modules // Foreign modules
extern "rust-intrinsic" {} //~ ERROR intrinsics are subject to change extern "rust-intrinsic" {} //~ ERROR intrinsics are subject to change
extern "platform-intrinsic" {} //~ ERROR platform intrinsics are experimental extern "rust-intrinsic" {} //~ ERROR intrinsics are subject to change
extern "rust-call" {} //~ ERROR rust-call ABI is subject to change extern "rust-call" {} //~ ERROR rust-call ABI is subject to change

View file

@ -1,5 +1,5 @@
error[E0658]: intrinsics are subject to change error[E0658]: intrinsics are subject to change
--> $DIR/feature-gate-abi.rs:15:8 --> $DIR/feature-gate-abi.rs:14:8
| |
LL | extern "rust-intrinsic" fn f1() {} LL | extern "rust-intrinsic" fn f1() {}
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
@ -7,18 +7,17 @@ LL | extern "rust-intrinsic" fn f1() {}
= help: add `#![feature(intrinsics)]` to the crate attributes to enable = help: add `#![feature(intrinsics)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: platform intrinsics are experimental and possibly buggy error[E0658]: intrinsics are subject to change
--> $DIR/feature-gate-abi.rs:18:8 --> $DIR/feature-gate-abi.rs:17:8
| |
LL | extern "platform-intrinsic" fn f2() {} LL | extern "rust-intrinsic" fn f2() {}
| ^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
| |
= note: see issue #27731 <https://github.com/rust-lang/rust/issues/27731> for more information = help: add `#![feature(intrinsics)]` to the crate attributes to enable
= help: add `#![feature(platform_intrinsics)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: rust-call ABI is subject to change error[E0658]: rust-call ABI is subject to change
--> $DIR/feature-gate-abi.rs:21:8 --> $DIR/feature-gate-abi.rs:20:8
| |
LL | extern "rust-call" fn f4(_: ()) {} LL | extern "rust-call" fn f4(_: ()) {}
| ^^^^^^^^^^^ | ^^^^^^^^^^^
@ -28,7 +27,7 @@ LL | extern "rust-call" fn f4(_: ()) {}
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: intrinsics are subject to change error[E0658]: intrinsics are subject to change
--> $DIR/feature-gate-abi.rs:25:12 --> $DIR/feature-gate-abi.rs:24:12
| |
LL | extern "rust-intrinsic" fn m1(); LL | extern "rust-intrinsic" fn m1();
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
@ -36,18 +35,17 @@ LL | extern "rust-intrinsic" fn m1();
= help: add `#![feature(intrinsics)]` to the crate attributes to enable = help: add `#![feature(intrinsics)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: platform intrinsics are experimental and possibly buggy error[E0658]: intrinsics are subject to change
--> $DIR/feature-gate-abi.rs:27:12 --> $DIR/feature-gate-abi.rs:26:12
| |
LL | extern "platform-intrinsic" fn m2(); LL | extern "rust-intrinsic" fn m2();
| ^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
| |
= note: see issue #27731 <https://github.com/rust-lang/rust/issues/27731> for more information = help: add `#![feature(intrinsics)]` to the crate attributes to enable
= help: add `#![feature(platform_intrinsics)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: rust-call ABI is subject to change error[E0658]: rust-call ABI is subject to change
--> $DIR/feature-gate-abi.rs:29:12 --> $DIR/feature-gate-abi.rs:28:12
| |
LL | extern "rust-call" fn m4(_: ()); LL | extern "rust-call" fn m4(_: ());
| ^^^^^^^^^^^ | ^^^^^^^^^^^
@ -57,7 +55,7 @@ LL | extern "rust-call" fn m4(_: ());
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: rust-call ABI is subject to change error[E0658]: rust-call ABI is subject to change
--> $DIR/feature-gate-abi.rs:31:12 --> $DIR/feature-gate-abi.rs:30:12
| |
LL | extern "rust-call" fn dm4(_: ()) {} LL | extern "rust-call" fn dm4(_: ()) {}
| ^^^^^^^^^^^ | ^^^^^^^^^^^
@ -67,7 +65,7 @@ LL | extern "rust-call" fn dm4(_: ()) {}
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: intrinsics are subject to change error[E0658]: intrinsics are subject to change
--> $DIR/feature-gate-abi.rs:38:12 --> $DIR/feature-gate-abi.rs:37:12
| |
LL | extern "rust-intrinsic" fn m1() {} LL | extern "rust-intrinsic" fn m1() {}
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
@ -75,18 +73,17 @@ LL | extern "rust-intrinsic" fn m1() {}
= help: add `#![feature(intrinsics)]` to the crate attributes to enable = help: add `#![feature(intrinsics)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: platform intrinsics are experimental and possibly buggy error[E0658]: intrinsics are subject to change
--> $DIR/feature-gate-abi.rs:40:12 --> $DIR/feature-gate-abi.rs:39:12
| |
LL | extern "platform-intrinsic" fn m2() {} LL | extern "rust-intrinsic" fn m2() {}
| ^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
| |
= note: see issue #27731 <https://github.com/rust-lang/rust/issues/27731> for more information = help: add `#![feature(intrinsics)]` to the crate attributes to enable
= help: add `#![feature(platform_intrinsics)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: rust-call ABI is subject to change error[E0658]: rust-call ABI is subject to change
--> $DIR/feature-gate-abi.rs:42:12 --> $DIR/feature-gate-abi.rs:41:12
| |
LL | extern "rust-call" fn m4(_: ()) {} LL | extern "rust-call" fn m4(_: ()) {}
| ^^^^^^^^^^^ | ^^^^^^^^^^^
@ -96,7 +93,7 @@ LL | extern "rust-call" fn m4(_: ()) {}
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: intrinsics are subject to change error[E0658]: intrinsics are subject to change
--> $DIR/feature-gate-abi.rs:47:12 --> $DIR/feature-gate-abi.rs:46:12
| |
LL | extern "rust-intrinsic" fn im1() {} LL | extern "rust-intrinsic" fn im1() {}
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
@ -104,18 +101,17 @@ LL | extern "rust-intrinsic" fn im1() {}
= help: add `#![feature(intrinsics)]` to the crate attributes to enable = help: add `#![feature(intrinsics)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: platform intrinsics are experimental and possibly buggy error[E0658]: intrinsics are subject to change
--> $DIR/feature-gate-abi.rs:49:12 --> $DIR/feature-gate-abi.rs:48:12
| |
LL | extern "platform-intrinsic" fn im2() {} LL | extern "rust-intrinsic" fn im2() {}
| ^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
| |
= note: see issue #27731 <https://github.com/rust-lang/rust/issues/27731> for more information = help: add `#![feature(intrinsics)]` to the crate attributes to enable
= help: add `#![feature(platform_intrinsics)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: rust-call ABI is subject to change error[E0658]: rust-call ABI is subject to change
--> $DIR/feature-gate-abi.rs:51:12 --> $DIR/feature-gate-abi.rs:50:12
| |
LL | extern "rust-call" fn im4(_: ()) {} LL | extern "rust-call" fn im4(_: ()) {}
| ^^^^^^^^^^^ | ^^^^^^^^^^^
@ -125,7 +121,7 @@ LL | extern "rust-call" fn im4(_: ()) {}
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: intrinsics are subject to change error[E0658]: intrinsics are subject to change
--> $DIR/feature-gate-abi.rs:55:18 --> $DIR/feature-gate-abi.rs:54:18
| |
LL | type A1 = extern "rust-intrinsic" fn(); LL | type A1 = extern "rust-intrinsic" fn();
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
@ -133,18 +129,17 @@ LL | type A1 = extern "rust-intrinsic" fn();
= help: add `#![feature(intrinsics)]` to the crate attributes to enable = help: add `#![feature(intrinsics)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: platform intrinsics are experimental and possibly buggy error[E0658]: intrinsics are subject to change
--> $DIR/feature-gate-abi.rs:56:18 --> $DIR/feature-gate-abi.rs:55:18
| |
LL | type A2 = extern "platform-intrinsic" fn(); LL | type A2 = extern "rust-intrinsic" fn();
| ^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
| |
= note: see issue #27731 <https://github.com/rust-lang/rust/issues/27731> for more information = help: add `#![feature(intrinsics)]` to the crate attributes to enable
= help: add `#![feature(platform_intrinsics)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: rust-call ABI is subject to change error[E0658]: rust-call ABI is subject to change
--> $DIR/feature-gate-abi.rs:57:18 --> $DIR/feature-gate-abi.rs:56:18
| |
LL | type A4 = extern "rust-call" fn(_: ()); LL | type A4 = extern "rust-call" fn(_: ());
| ^^^^^^^^^^^ | ^^^^^^^^^^^
@ -153,6 +148,15 @@ LL | type A4 = extern "rust-call" fn(_: ());
= help: add `#![feature(unboxed_closures)]` to the crate attributes to enable = help: add `#![feature(unboxed_closures)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: intrinsics are subject to change
--> $DIR/feature-gate-abi.rs:59:8
|
LL | extern "rust-intrinsic" {}
| ^^^^^^^^^^^^^^^^
|
= help: add `#![feature(intrinsics)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: intrinsics are subject to change error[E0658]: intrinsics are subject to change
--> $DIR/feature-gate-abi.rs:60:8 --> $DIR/feature-gate-abi.rs:60:8
| |
@ -162,18 +166,8 @@ LL | extern "rust-intrinsic" {}
= help: add `#![feature(intrinsics)]` to the crate attributes to enable = help: add `#![feature(intrinsics)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: platform intrinsics are experimental and possibly buggy
--> $DIR/feature-gate-abi.rs:61:8
|
LL | extern "platform-intrinsic" {}
| ^^^^^^^^^^^^^^^^^^^^
|
= note: see issue #27731 <https://github.com/rust-lang/rust/issues/27731> for more information
= help: add `#![feature(platform_intrinsics)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: rust-call ABI is subject to change error[E0658]: rust-call ABI is subject to change
--> $DIR/feature-gate-abi.rs:62:8 --> $DIR/feature-gate-abi.rs:61:8
| |
LL | extern "rust-call" {} LL | extern "rust-call" {}
| ^^^^^^^^^^^ | ^^^^^^^^^^^
@ -183,7 +177,7 @@ LL | extern "rust-call" {}
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0093]: unrecognized intrinsic function: `f1` error[E0093]: unrecognized intrinsic function: `f1`
--> $DIR/feature-gate-abi.rs:15:28 --> $DIR/feature-gate-abi.rs:14:28
| |
LL | extern "rust-intrinsic" fn f1() {} LL | extern "rust-intrinsic" fn f1() {}
| ^^ unrecognized intrinsic | ^^ unrecognized intrinsic
@ -191,59 +185,59 @@ LL | extern "rust-intrinsic" fn f1() {}
= help: if you're adding an intrinsic, be sure to update `check_intrinsic_type` = help: if you're adding an intrinsic, be sure to update `check_intrinsic_type`
error[E0093]: unrecognized intrinsic function: `f2` error[E0093]: unrecognized intrinsic function: `f2`
--> $DIR/feature-gate-abi.rs:18:32 --> $DIR/feature-gate-abi.rs:17:28
| |
LL | extern "platform-intrinsic" fn f2() {} LL | extern "rust-intrinsic" fn f2() {}
| ^^ unrecognized intrinsic | ^^ unrecognized intrinsic
| |
= help: if you're adding an intrinsic, be sure to update `check_intrinsic_type` = help: if you're adding an intrinsic, be sure to update `check_intrinsic_type`
error: intrinsic must be in `extern "rust-intrinsic" { ... }` block error: intrinsic must be in `extern "rust-intrinsic" { ... }` block
--> $DIR/feature-gate-abi.rs:25:32 --> $DIR/feature-gate-abi.rs:24:32
| |
LL | extern "rust-intrinsic" fn m1(); LL | extern "rust-intrinsic" fn m1();
| ^^ | ^^
error: intrinsic must be in `extern "rust-intrinsic" { ... }` block error: intrinsic must be in `extern "rust-intrinsic" { ... }` block
--> $DIR/feature-gate-abi.rs:27:36 --> $DIR/feature-gate-abi.rs:26:32
| |
LL | extern "platform-intrinsic" fn m2(); LL | extern "rust-intrinsic" fn m2();
| ^^ | ^^
error: intrinsic must be in `extern "rust-intrinsic" { ... }` block error: intrinsic must be in `extern "rust-intrinsic" { ... }` block
--> $DIR/feature-gate-abi.rs:15:33 --> $DIR/feature-gate-abi.rs:14:33
| |
LL | extern "rust-intrinsic" fn f1() {} LL | extern "rust-intrinsic" fn f1() {}
| ^^ | ^^
error: intrinsic must be in `extern "rust-intrinsic" { ... }` block error: intrinsic must be in `extern "rust-intrinsic" { ... }` block
--> $DIR/feature-gate-abi.rs:18:37 --> $DIR/feature-gate-abi.rs:17:33
| |
LL | extern "platform-intrinsic" fn f2() {} LL | extern "rust-intrinsic" fn f2() {}
| ^^ | ^^
error: intrinsic must be in `extern "rust-intrinsic" { ... }` block error: intrinsic must be in `extern "rust-intrinsic" { ... }` block
--> $DIR/feature-gate-abi.rs:38:37 --> $DIR/feature-gate-abi.rs:37:37
| |
LL | extern "rust-intrinsic" fn m1() {} LL | extern "rust-intrinsic" fn m1() {}
| ^^ | ^^
error: intrinsic must be in `extern "rust-intrinsic" { ... }` block error: intrinsic must be in `extern "rust-intrinsic" { ... }` block
--> $DIR/feature-gate-abi.rs:40:41 --> $DIR/feature-gate-abi.rs:39:37
| |
LL | extern "platform-intrinsic" fn m2() {} LL | extern "rust-intrinsic" fn m2() {}
| ^^ | ^^
error: intrinsic must be in `extern "rust-intrinsic" { ... }` block error: intrinsic must be in `extern "rust-intrinsic" { ... }` block
--> $DIR/feature-gate-abi.rs:47:38 --> $DIR/feature-gate-abi.rs:46:38
| |
LL | extern "rust-intrinsic" fn im1() {} LL | extern "rust-intrinsic" fn im1() {}
| ^^ | ^^
error: intrinsic must be in `extern "rust-intrinsic" { ... }` block error: intrinsic must be in `extern "rust-intrinsic" { ... }` block
--> $DIR/feature-gate-abi.rs:49:42 --> $DIR/feature-gate-abi.rs:48:38
| |
LL | extern "platform-intrinsic" fn im2() {} LL | extern "rust-intrinsic" fn im2() {}
| ^^ | ^^
error: aborting due to 29 previous errors error: aborting due to 29 previous errors

View file

@ -6,5 +6,5 @@
fn main() { fn main() {
const { core::mem::transmute::<u8, u8> }; const { core::mem::transmute::<u8, u8> };
// Don't resolve the instance of this inline constant to be an intrinsic, // Don't resolve the instance of this inline constant to be an intrinsic,
// even if the type of the constant is `extern "intrinsic" fn(u8) -> u8`. // even if the type of the constant is `extern "rust-intrinsic" fn(u8) -> u8`.
} }

View file

@ -1,13 +1,13 @@
//@ build-fail //@ build-fail
#![feature(repr_simd, platform_intrinsics, core_intrinsics)] #![feature(repr_simd, intrinsics, core_intrinsics)]
#![allow(warnings)] #![allow(warnings)]
#![crate_type = "rlib"] #![crate_type = "rlib"]
// Bad monomorphizations could previously cause LLVM asserts even though the // Bad monomorphizations could previously cause LLVM asserts even though the
// error was caught in the compiler. // error was caught in the compiler.
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_add<T>(x: T, y: T) -> T; fn simd_add<T>(x: T, y: T) -> T;
} }

View file

@ -4,7 +4,7 @@
//@ pretty-expanded FIXME #23616 //@ pretty-expanded FIXME #23616
#![feature(repr_simd, platform_intrinsics, generic_const_exprs)] #![feature(repr_simd, intrinsics, generic_const_exprs)]
#![allow(non_camel_case_types, incomplete_features)] #![allow(non_camel_case_types, incomplete_features)]
pub trait Simd { pub trait Simd {
@ -25,7 +25,7 @@ pub struct T<S: Simd>([S::Lane; S::SIZE]);
//~| ERROR SIMD vector element type should be a primitive scalar //~| ERROR SIMD vector element type should be a primitive scalar
//~| ERROR unconstrained generic constant //~| ERROR unconstrained generic constant
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_insert<T, E>(x: T, idx: u32, y: E) -> T; fn simd_insert<T, E>(x: T, idx: u32, y: E) -> T;
fn simd_extract<T, E>(x: T, idx: u32) -> E; fn simd_extract<T, E>(x: T, idx: u32) -> E;
} }

View file

@ -3,7 +3,7 @@
//@ pretty-expanded FIXME #23616 //@ pretty-expanded FIXME #23616
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#[repr(simd)] #[repr(simd)]
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
@ -13,7 +13,7 @@ struct S([i32; 4]);
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
struct T<const N: usize>([i32; N]); struct T<const N: usize>([i32; N]);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_insert<T, E>(x: T, idx: u32, y: E) -> T; fn simd_insert<T, E>(x: T, idx: u32, y: E) -> T;
fn simd_extract<T, E>(x: T, idx: u32) -> E; fn simd_extract<T, E>(x: T, idx: u32) -> E;
} }

View file

@ -1,6 +1,6 @@
//@ run-pass //@ run-pass
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
use std::ops; use std::ops;
@ -21,7 +21,7 @@ struct B<T>([T; 4]);
struct C<T, const N: usize>([T; N]); struct C<T, const N: usize>([T; N]);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_add<T>(x: T, y: T) -> T; fn simd_add<T>(x: T, y: T) -> T;
} }

View file

@ -8,14 +8,14 @@
// Test that the simd floating-point math intrinsics produce correct results. // Test that the simd floating-point math intrinsics produce correct results.
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
#[derive(Copy, Clone, PartialEq, Debug)] #[derive(Copy, Clone, PartialEq, Debug)]
struct f32x4(pub f32, pub f32, pub f32, pub f32); struct f32x4(pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_fsqrt<T>(x: T) -> T; fn simd_fsqrt<T>(x: T) -> T;
fn simd_fabs<T>(x: T) -> T; fn simd_fabs<T>(x: T) -> T;
fn simd_fsin<T>(x: T) -> T; fn simd_fsin<T>(x: T) -> T;

View file

@ -3,17 +3,14 @@
// Test that the simd_f{min,max} intrinsics produce the correct results. // Test that the simd_f{min,max} intrinsics produce the correct results.
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, core_intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
#[derive(Copy, Clone, PartialEq, Debug)] #[derive(Copy, Clone, PartialEq, Debug)]
struct f32x4(pub f32, pub f32, pub f32, pub f32); struct f32x4(pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { use std::intrinsics::simd::*;
fn simd_fmin<T>(x: T, y: T) -> T;
fn simd_fmax<T>(x: T, y: T) -> T;
}
fn main() { fn main() {
let x = f32x4(1.0, 2.0, 3.0, 4.0); let x = f32x4(1.0, 2.0, 3.0, 4.0);

View file

@ -1,6 +1,6 @@
//@ build-fail //@ build-fail
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
@ -14,7 +14,7 @@ pub struct u32x4(pub u32, pub u32, pub u32, pub u32);
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub struct f32x4(pub f32, pub f32, pub f32, pub f32); pub struct f32x4(pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_add<T>(x: T, y: T) -> T; fn simd_add<T>(x: T, y: T) -> T;
fn simd_sub<T>(x: T, y: T) -> T; fn simd_sub<T>(x: T, y: T) -> T;
fn simd_mul<T>(x: T, y: T) -> T; fn simd_mul<T>(x: T, y: T) -> T;

View file

@ -1,7 +1,7 @@
//@ run-pass //@ run-pass
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
//@ ignore-emscripten FIXME(#45351) hits an LLVM assert //@ ignore-emscripten FIXME(#45351) hits an LLVM assert
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#[repr(simd)] #[repr(simd)]
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
@ -31,7 +31,7 @@ macro_rules! all_eq_ {
}}; }};
} }
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_add<T>(x: T, y: T) -> T; fn simd_add<T>(x: T, y: T) -> T;
fn simd_sub<T>(x: T, y: T) -> T; fn simd_sub<T>(x: T, y: T) -> T;
fn simd_mul<T>(x: T, y: T) -> T; fn simd_mul<T>(x: T, y: T) -> T;

View file

@ -1,6 +1,6 @@
//@ build-fail //@ build-fail
//@ ignore-emscripten //@ ignore-emscripten
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
@ -14,7 +14,7 @@ pub struct x4<T>(pub T, pub T, pub T, pub T);
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub struct f32x4(pub f32, pub f32, pub f32, pub f32); pub struct f32x4(pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_saturating_add<T>(x: T, y: T) -> T; fn simd_saturating_add<T>(x: T, y: T) -> T;
fn simd_saturating_sub<T>(x: T, y: T) -> T; fn simd_saturating_sub<T>(x: T, y: T) -> T;
} }

View file

@ -2,7 +2,7 @@
//@ ignore-emscripten //@ ignore-emscripten
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#[repr(simd)] #[repr(simd)]
#[derive(Copy, Clone, PartialEq, Debug)] #[derive(Copy, Clone, PartialEq, Debug)]
@ -12,7 +12,7 @@ struct u32x4(pub u32, pub u32, pub u32, pub u32);
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
struct I32<const N: usize>([i32; N]); struct I32<const N: usize>([i32; N]);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_saturating_add<T>(x: T, y: T) -> T; fn simd_saturating_add<T>(x: T, y: T) -> T;
fn simd_saturating_sub<T>(x: T, y: T) -> T; fn simd_saturating_sub<T>(x: T, y: T) -> T;
} }

View file

@ -1,8 +1,8 @@
//@ run-pass //@ run-pass
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_as<T, U>(x: T) -> U; fn simd_as<T, U>(x: T) -> U;
} }

View file

@ -6,7 +6,7 @@
// Test that the simd_bitmask intrinsic produces correct results. // Test that the simd_bitmask intrinsic produces correct results.
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -21,7 +21,7 @@ struct u8x4(pub u8, pub u8, pub u8, pub u8);
#[derive(Copy, Clone, PartialEq, Debug)] #[derive(Copy, Clone, PartialEq, Debug)]
struct Tx4<T>(pub T, pub T, pub T, pub T); struct Tx4<T>(pub T, pub T, pub T, pub T);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_bitmask<T, U>(x: T) -> U; fn simd_bitmask<T, U>(x: T) -> U;
} }

View file

@ -3,7 +3,7 @@
// Test that the simd_bitmask intrinsic produces ok-ish error // Test that the simd_bitmask intrinsic produces ok-ish error
// messages when misused. // messages when misused.
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -30,7 +30,7 @@ struct u8x32([u8; 32]);
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
struct u8x64([u8; 64]); struct u8x64([u8; 64]);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_bitmask<T, U>(x: T) -> U; fn simd_bitmask<T, U>(x: T) -> U;
} }

View file

@ -1,5 +1,5 @@
//@ run-pass //@ run-pass
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -10,7 +10,7 @@ struct i8x4([i8; 4]);
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
struct u8x4([u8; 4]); struct u8x4([u8; 4]);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_bswap<T>(x: T) -> T; fn simd_bswap<T>(x: T) -> T;
} }

View file

@ -1,9 +1,9 @@
//@ run-pass //@ run-pass
//@ ignore-emscripten FIXME(#45351) hits an LLVM assert //@ ignore-emscripten FIXME(#45351) hits an LLVM assert
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_cast<T, U>(x: T) -> U; fn simd_cast<T, U>(x: T) -> U;
} }

View file

@ -1,7 +1,7 @@
//@ run-pass //@ run-pass
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_cast<T, U>(x: T) -> U; fn simd_cast<T, U>(x: T) -> U;
} }

View file

@ -1,6 +1,6 @@
//@ build-fail //@ build-fail
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#[repr(simd)] #[repr(simd)]
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
@ -23,7 +23,7 @@ struct f32x8(f32, f32, f32, f32,
f32, f32, f32, f32); f32, f32, f32, f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_cast<T, U>(x: T) -> U; fn simd_cast<T, U>(x: T) -> U;
} }

View file

@ -1,7 +1,7 @@
//@ run-pass //@ run-pass
//@ ignore-emscripten FIXME(#45351) hits an LLVM assert //@ ignore-emscripten FIXME(#45351) hits an LLVM assert
#![feature(repr_simd, platform_intrinsics, concat_idents)] #![feature(repr_simd, intrinsics, concat_idents)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -14,7 +14,7 @@ struct u32x4(pub u32, pub u32, pub u32, pub u32);
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
struct f32x4(pub f32, pub f32, pub f32, pub f32); struct f32x4(pub f32, pub f32, pub f32, pub f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_eq<T, U>(x: T, y: T) -> U; fn simd_eq<T, U>(x: T, y: T) -> U;
fn simd_ne<T, U>(x: T, y: T) -> U; fn simd_ne<T, U>(x: T, y: T) -> U;
fn simd_lt<T, U>(x: T, y: T) -> U; fn simd_lt<T, U>(x: T, y: T) -> U;

View file

@ -1,6 +1,6 @@
//@ build-fail //@ build-fail
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#[repr(simd)] #[repr(simd)]
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
@ -12,7 +12,7 @@ struct i32x4(i32, i32, i32, i32);
struct i16x8(i16, i16, i16, i16, struct i16x8(i16, i16, i16, i16,
i16, i16, i16, i16); i16, i16, i16, i16);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_eq<T, U>(x: T, y: T) -> U; fn simd_eq<T, U>(x: T, y: T) -> U;
fn simd_ne<T, U>(x: T, y: T) -> U; fn simd_ne<T, U>(x: T, y: T) -> U;
fn simd_lt<T, U>(x: T, y: T) -> U; fn simd_lt<T, U>(x: T, y: T) -> U;

View file

@ -1,7 +1,7 @@
//@ run-pass //@ run-pass
//@ ignore-emscripten FIXME(#45351) hits an LLVM assert //@ ignore-emscripten FIXME(#45351) hits an LLVM assert
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![feature(inline_const)] #![feature(inline_const)]
#[repr(simd)] #[repr(simd)]
@ -18,7 +18,7 @@ struct i32x4(i32, i32, i32, i32);
struct i32x8(i32, i32, i32, i32, struct i32x8(i32, i32, i32, i32,
i32, i32, i32, i32); i32, i32, i32, i32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_insert<T, E>(x: T, idx: u32, y: E) -> T; fn simd_insert<T, E>(x: T, idx: u32, y: E) -> T;
fn simd_extract<T, E>(x: T, idx: u32) -> E; fn simd_extract<T, E>(x: T, idx: u32) -> E;

View file

@ -1,6 +1,6 @@
//@ build-fail //@ build-fail
#![feature(repr_simd, platform_intrinsics, rustc_attrs, adt_const_params)] #![feature(repr_simd, intrinsics, rustc_attrs, adt_const_params)]
#![allow(incomplete_features)] #![allow(incomplete_features)]
#[repr(simd)] #[repr(simd)]
@ -31,7 +31,7 @@ struct f32x4(f32, f32, f32, f32);
struct f32x8(f32, f32, f32, f32, struct f32x8(f32, f32, f32, f32,
f32, f32, f32, f32); f32, f32, f32, f32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_insert<T, E>(x: T, idx: u32, y: E) -> T; fn simd_insert<T, E>(x: T, idx: u32, y: E) -> T;
fn simd_extract<T, E>(x: T, idx: u32) -> E; fn simd_extract<T, E>(x: T, idx: u32) -> E;

View file

@ -3,14 +3,14 @@
// Test that the simd_{gather,scatter} intrinsics produce the correct results. // Test that the simd_{gather,scatter} intrinsics produce the correct results.
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
#[derive(Copy, Clone, PartialEq, Debug)] #[derive(Copy, Clone, PartialEq, Debug)]
struct x4<T>(pub T, pub T, pub T, pub T); struct x4<T>(pub T, pub T, pub T, pub T);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_gather<T, U, V>(x: T, y: U, z: V) -> T; fn simd_gather<T, U, V>(x: T, y: U, z: V) -> T;
fn simd_scatter<T, U, V>(x: T, y: U, z: V) -> (); fn simd_scatter<T, U, V>(x: T, y: U, z: V) -> ();
} }

View file

@ -5,7 +5,7 @@
// Test that the simd_reduce_{op} intrinsics produce the correct results. // Test that the simd_reduce_{op} intrinsics produce the correct results.
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -24,7 +24,7 @@ struct f32x4(pub f32, pub f32, pub f32, pub f32);
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
struct b8x4(pub i8, pub i8, pub i8, pub i8); struct b8x4(pub i8, pub i8, pub i8, pub i8);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_reduce_add_unordered<T, U>(x: T) -> U; fn simd_reduce_add_unordered<T, U>(x: T) -> U;
fn simd_reduce_mul_unordered<T, U>(x: T) -> U; fn simd_reduce_mul_unordered<T, U>(x: T) -> U;
fn simd_reduce_add_ordered<T, U>(x: T, acc: U) -> U; fn simd_reduce_add_ordered<T, U>(x: T, acc: U) -> U;

View file

@ -4,7 +4,7 @@
// Test that the simd_reduce_{op} intrinsics produce ok-ish error // Test that the simd_reduce_{op} intrinsics produce ok-ish error
// messages when misused. // messages when misused.
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -16,7 +16,7 @@ pub struct f32x4(pub f32, pub f32, pub f32, pub f32);
pub struct u32x4(pub u32, pub u32, pub u32, pub u32); pub struct u32x4(pub u32, pub u32, pub u32, pub u32);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_reduce_add_ordered<T, U>(x: T, y: U) -> U; fn simd_reduce_add_ordered<T, U>(x: T, y: U) -> U;
fn simd_reduce_mul_ordered<T, U>(x: T, y: U) -> U; fn simd_reduce_mul_ordered<T, U>(x: T, y: U) -> U;
fn simd_reduce_and<T, U>(x: T) -> U; fn simd_reduce_and<T, U>(x: T) -> U;

View file

@ -6,7 +6,7 @@
// Test that the simd_select intrinsics produces correct results. // Test that the simd_select intrinsics produces correct results.
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -29,7 +29,7 @@ struct f32x4(pub f32, pub f32, pub f32, pub f32);
#[derive(Copy, Clone, PartialEq, Debug)] #[derive(Copy, Clone, PartialEq, Debug)]
struct b8x4(pub i8, pub i8, pub i8, pub i8); struct b8x4(pub i8, pub i8, pub i8, pub i8);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_select<T, U>(x: T, a: U, b: U) -> U; fn simd_select<T, U>(x: T, a: U, b: U) -> U;
fn simd_select_bitmask<T, U>(x: T, a: U, b: U) -> U; fn simd_select_bitmask<T, U>(x: T, a: U, b: U) -> U;
} }

View file

@ -3,7 +3,7 @@
// Test that the simd_select intrinsic produces ok-ish error // Test that the simd_select intrinsic produces ok-ish error
// messages when misused. // messages when misused.
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#[repr(simd)] #[repr(simd)]
@ -22,7 +22,7 @@ struct b8x4(pub i8, pub i8, pub i8, pub i8);
#[derive(Copy, Clone, PartialEq)] #[derive(Copy, Clone, PartialEq)]
struct b8x8(pub i8, pub i8, pub i8, pub i8, pub i8, pub i8, pub i8, pub i8); struct b8x8(pub i8, pub i8, pub i8, pub i8, pub i8, pub i8, pub i8, pub i8);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_select<T, U>(x: T, a: U, b: U) -> U; fn simd_select<T, U>(x: T, a: U, b: U) -> U;
fn simd_select_bitmask<T, U>(x: T, a: U, b: U) -> U; fn simd_select_bitmask<T, U>(x: T, a: U, b: U) -> U;
} }

View file

@ -3,13 +3,13 @@
// Test that the simd_shuffle intrinsic produces ok-ish error // Test that the simd_shuffle intrinsic produces ok-ish error
// messages when misused. // messages when misused.
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
#[repr(simd)] #[repr(simd)]
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub struct Simd<T, const N: usize>([T; N]); pub struct Simd<T, const N: usize>([T; N]);
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_shuffle<T, I, U>(a: T, b: T, i: I) -> U; fn simd_shuffle<T, I, U>(a: T, b: T, i: I) -> U;
} }

View file

@ -3,9 +3,9 @@
// //
//@ run-pass //@ run-pass
//@ compile-flags: -Zmir-opt-level=4 //@ compile-flags: -Zmir-opt-level=4
#![feature(platform_intrinsics, repr_simd)] #![feature(intrinsics, repr_simd)]
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_shuffle<T, I, U>(x: T, y: T, idx: I) -> U; fn simd_shuffle<T, I, U>(x: T, y: T, idx: I) -> U;
} }

View file

@ -3,9 +3,9 @@
// //
//@ run-pass //@ run-pass
//@ compile-flags: -Zmir-opt-level=4 //@ compile-flags: -Zmir-opt-level=4
#![feature(platform_intrinsics, repr_simd)] #![feature(intrinsics, repr_simd)]
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_shuffle<T, I, U>(x: T, y: T, idx: I) -> U; fn simd_shuffle<T, I, U>(x: T, y: T, idx: I) -> U;
} }

View file

@ -2,10 +2,10 @@
// with the wrong number of generic lifetime/type/const parameters, and // with the wrong number of generic lifetime/type/const parameters, and
// that no ICE occurs in these cases. // that no ICE occurs in these cases.
#![feature(platform_intrinsics)] #![feature(intrinsics)]
#![crate_type="lib"] #![crate_type="lib"]
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_saturating_add<'a, T: 'a>(x: T, y: T); fn simd_saturating_add<'a, T: 'a>(x: T, y: T);
//~^ ERROR: intrinsic has wrong number of lifetime parameters //~^ ERROR: intrinsic has wrong number of lifetime parameters

View file

@ -1,8 +1,8 @@
//@ run-pass //@ run-pass
#![feature(repr_simd, platform_intrinsics)] #![feature(repr_simd, intrinsics)]
extern "platform-intrinsic" { extern "rust-intrinsic" {
fn simd_cast_ptr<T, U>(x: T) -> U; fn simd_cast_ptr<T, U>(x: T) -> U;
fn simd_expose_addr<T, U>(x: T) -> U; fn simd_expose_addr<T, U>(x: T) -> U;
fn simd_from_exposed_addr<T, U>(x: T) -> U; fn simd_from_exposed_addr<T, U>(x: T) -> U;

View file

@ -2,14 +2,14 @@
//@ compile-flags: -O -Zverify-llvm-ir //@ compile-flags: -O -Zverify-llvm-ir
#![feature(repr_simd)] #![feature(repr_simd)]
#![feature(platform_intrinsics)] #![feature(intrinsics)]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
#[repr(simd)] #[repr(simd)]
struct i32x4([i32; 4]); struct i32x4([i32; 4]);
extern "platform-intrinsic" { extern "rust-intrinsic" {
pub(crate) fn simd_add<T>(x: T, y: T) -> T; pub(crate) fn simd_add<T>(x: T, y: T) -> T;
} }

Some files were not shown because too many files have changed in this diff Show more