summaryrefslogtreecommitdiffstats
path: root/library/stdarch/crates/core_arch/src/simd.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:02:58 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:02:58 +0000
commit698f8c2f01ea549d77d7dc3338a12e04c11057b9 (patch)
tree173a775858bd501c378080a10dca74132f05bc50 /library/stdarch/crates/core_arch/src/simd.rs
parentInitial commit. (diff)
downloadrustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.tar.xz
rustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.zip
Adding upstream version 1.64.0+dfsg1.upstream/1.64.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'library/stdarch/crates/core_arch/src/simd.rs')
-rw-r--r--library/stdarch/crates/core_arch/src/simd.rs1105
1 files changed, 1105 insertions, 0 deletions
diff --git a/library/stdarch/crates/core_arch/src/simd.rs b/library/stdarch/crates/core_arch/src/simd.rs
new file mode 100644
index 000000000..281fefba4
--- /dev/null
+++ b/library/stdarch/crates/core_arch/src/simd.rs
@@ -0,0 +1,1105 @@
+//! Internal `#[repr(simd)]` types
+
+#![allow(non_camel_case_types)]
+
+macro_rules! simd_ty {
+ ($id:ident [$ety:ident]: $($elem_ty:ident),* | $($elem_name:ident),*) => {
+ #[repr(simd)]
+ #[derive(Copy, Clone, Debug, PartialEq)]
+ pub(crate) struct $id($(pub $elem_ty),*);
+
+ #[allow(clippy::use_self)]
+ impl $id {
+ #[inline(always)]
+ pub(crate) const fn new($($elem_name: $elem_ty),*) -> Self {
+ $id($($elem_name),*)
+ }
+ // FIXME: Workaround rust@60637
+ #[inline(always)]
+ pub(crate) const fn splat(value: $ety) -> Self {
+ $id($({
+ #[allow(non_camel_case_types, dead_code)]
+ struct $elem_name;
+ value
+ }),*)
+ }
+
+ // FIXME: Workaround rust@60637
+ #[inline(always)]
+ pub(crate) fn extract(self, index: usize) -> $ety {
+ unsafe {
+ crate::core_arch::simd_llvm::simd_extract(self, index as u32)
+ }
+ }
+ }
+ }
+}
+
+macro_rules! simd_m_ty {
+ ($id:ident [$ety:ident]: $($elem_ty:ident),* | $($elem_name:ident),*) => {
+ #[repr(simd)]
+ #[derive(Copy, Clone, Debug, PartialEq)]
+ pub(crate) struct $id($(pub $elem_ty),*);
+
+ #[allow(clippy::use_self)]
+ impl $id {
+ #[inline(always)]
+ const fn bool_to_internal(x: bool) -> $ety {
+ [0 as $ety, !(0 as $ety)][x as usize]
+ }
+
+ #[inline(always)]
+ pub(crate) const fn new($($elem_name: bool),*) -> Self {
+ $id($(Self::bool_to_internal($elem_name)),*)
+ }
+
+ // FIXME: Workaround rust@60637
+ #[inline(always)]
+ pub(crate) const fn splat(value: bool) -> Self {
+ $id($({
+ #[allow(non_camel_case_types, dead_code)]
+ struct $elem_name;
+ Self::bool_to_internal(value)
+ }),*)
+ }
+
+ // FIXME: Workaround rust@60637
+ #[inline(always)]
+ pub(crate) fn extract(self, index: usize) -> bool {
+ let r: $ety = unsafe {
+ crate::core_arch::simd_llvm::simd_extract(self, index as u32)
+ };
+ r != 0
+ }
+ }
+ }
+}
+
+// 16-bit wide types:
+
+simd_ty!(u8x2[u8]: u8, u8 | x0, x1);
+simd_ty!(i8x2[i8]: i8, i8 | x0, x1);
+
+// 32-bit wide types:
+
+simd_ty!(u8x4[u8]: u8, u8, u8, u8 | x0, x1, x2, x3);
+simd_ty!(u16x2[u16]: u16, u16 | x0, x1);
+
+simd_ty!(i8x4[i8]: i8, i8, i8, i8 | x0, x1, x2, x3);
+simd_ty!(i16x2[i16]: i16, i16 | x0, x1);
+
+// 64-bit wide types:
+
+simd_ty!(
+ u8x8[u8]: u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7
+);
+simd_ty!(u16x4[u16]: u16, u16, u16, u16 | x0, x1, x2, x3);
+simd_ty!(u32x2[u32]: u32, u32 | x0, x1);
+simd_ty!(u64x1[u64]: u64 | x1);
+
+simd_ty!(
+ i8x8[i8]: i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7
+);
+simd_ty!(i16x4[i16]: i16, i16, i16, i16 | x0, x1, x2, x3);
+simd_ty!(i32x2[i32]: i32, i32 | x0, x1);
+simd_ty!(i64x1[i64]: i64 | x1);
+
+simd_ty!(f32x2[f32]: f32, f32 | x0, x1);
+simd_ty!(f64x1[f64]: f64 | x1);
+
+// 128-bit wide types:
+
+simd_ty!(
+ u8x16[u8]: u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7,
+ x8,
+ x9,
+ x10,
+ x11,
+ x12,
+ x13,
+ x14,
+ x15
+);
+simd_ty!(
+ u16x8[u16]: u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7
+);
+simd_ty!(u32x4[u32]: u32, u32, u32, u32 | x0, x1, x2, x3);
+simd_ty!(u64x2[u64]: u64, u64 | x0, x1);
+
+simd_ty!(
+ i8x16[i8]: i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7,
+ x8,
+ x9,
+ x10,
+ x11,
+ x12,
+ x13,
+ x14,
+ x15
+);
+simd_ty!(
+ i16x8[i16]: i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7
+);
+simd_ty!(i32x4[i32]: i32, i32, i32, i32 | x0, x1, x2, x3);
+simd_ty!(i64x2[i64]: i64, i64 | x0, x1);
+
+simd_ty!(f32x4[f32]: f32, f32, f32, f32 | x0, x1, x2, x3);
+simd_ty!(f64x2[f64]: f64, f64 | x0, x1);
+simd_ty!(f64x4[f64]: f64, f64, f64, f64 | x0, x1, x2, x3);
+
+simd_m_ty!(
+ m8x16[i8]: i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7,
+ x8,
+ x9,
+ x10,
+ x11,
+ x12,
+ x13,
+ x14,
+ x15
+);
+simd_m_ty!(
+ m16x8[i16]: i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7
+);
+simd_m_ty!(m32x4[i32]: i32, i32, i32, i32 | x0, x1, x2, x3);
+simd_m_ty!(m64x2[i64]: i64, i64 | x0, x1);
+
+// 256-bit wide types:
+
+simd_ty!(
+ u8x32[u8]: u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7,
+ x8,
+ x9,
+ x10,
+ x11,
+ x12,
+ x13,
+ x14,
+ x15,
+ x16,
+ x17,
+ x18,
+ x19,
+ x20,
+ x21,
+ x22,
+ x23,
+ x24,
+ x25,
+ x26,
+ x27,
+ x28,
+ x29,
+ x30,
+ x31
+);
+simd_ty!(
+ u16x16[u16]: u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7,
+ x8,
+ x9,
+ x10,
+ x11,
+ x12,
+ x13,
+ x14,
+ x15
+);
+simd_ty!(
+ u32x8[u32]: u32,
+ u32,
+ u32,
+ u32,
+ u32,
+ u32,
+ u32,
+ u32 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7
+);
+simd_ty!(u64x4[u64]: u64, u64, u64, u64 | x0, x1, x2, x3);
+
+simd_ty!(
+ i8x32[i8]: i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7,
+ x8,
+ x9,
+ x10,
+ x11,
+ x12,
+ x13,
+ x14,
+ x15,
+ x16,
+ x17,
+ x18,
+ x19,
+ x20,
+ x21,
+ x22,
+ x23,
+ x24,
+ x25,
+ x26,
+ x27,
+ x28,
+ x29,
+ x30,
+ x31
+);
+simd_ty!(
+ i16x16[i16]: i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7,
+ x8,
+ x9,
+ x10,
+ x11,
+ x12,
+ x13,
+ x14,
+ x15
+);
+simd_ty!(
+ i32x8[i32]: i32,
+ i32,
+ i32,
+ i32,
+ i32,
+ i32,
+ i32,
+ i32 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7
+);
+simd_ty!(i64x4[i64]: i64, i64, i64, i64 | x0, x1, x2, x3);
+
+simd_ty!(
+ f32x8[f32]: f32,
+ f32,
+ f32,
+ f32,
+ f32,
+ f32,
+ f32,
+ f32 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7
+);
+
+// 512-bit wide types:
+
+simd_ty!(
+ i8x64[i8]: i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8,
+ i8 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7,
+ x8,
+ x9,
+ x10,
+ x11,
+ x12,
+ x13,
+ x14,
+ x15,
+ x16,
+ x17,
+ x18,
+ x19,
+ x20,
+ x21,
+ x22,
+ x23,
+ x24,
+ x25,
+ x26,
+ x27,
+ x28,
+ x29,
+ x30,
+ x31,
+ x32,
+ x33,
+ x34,
+ x35,
+ x36,
+ x37,
+ x38,
+ x39,
+ x40,
+ x41,
+ x42,
+ x43,
+ x44,
+ x45,
+ x46,
+ x47,
+ x48,
+ x49,
+ x50,
+ x51,
+ x52,
+ x53,
+ x54,
+ x55,
+ x56,
+ x57,
+ x58,
+ x59,
+ x60,
+ x61,
+ x62,
+ x63
+);
+
+simd_ty!(
+ u8x64[u8]: u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8,
+ u8 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7,
+ x8,
+ x9,
+ x10,
+ x11,
+ x12,
+ x13,
+ x14,
+ x15,
+ x16,
+ x17,
+ x18,
+ x19,
+ x20,
+ x21,
+ x22,
+ x23,
+ x24,
+ x25,
+ x26,
+ x27,
+ x28,
+ x29,
+ x30,
+ x31,
+ x32,
+ x33,
+ x34,
+ x35,
+ x36,
+ x37,
+ x38,
+ x39,
+ x40,
+ x41,
+ x42,
+ x43,
+ x44,
+ x45,
+ x46,
+ x47,
+ x48,
+ x49,
+ x50,
+ x51,
+ x52,
+ x53,
+ x54,
+ x55,
+ x56,
+ x57,
+ x58,
+ x59,
+ x60,
+ x61,
+ x62,
+ x63
+);
+
+simd_ty!(
+ i16x32[i16]: i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16,
+ i16 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7,
+ x8,
+ x9,
+ x10,
+ x11,
+ x12,
+ x13,
+ x14,
+ x15,
+ x16,
+ x17,
+ x18,
+ x19,
+ x20,
+ x21,
+ x22,
+ x23,
+ x24,
+ x25,
+ x26,
+ x27,
+ x28,
+ x29,
+ x30,
+ x31
+);
+
+simd_ty!(
+ u16x32[u16]: u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16,
+ u16 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7,
+ x8,
+ x9,
+ x10,
+ x11,
+ x12,
+ x13,
+ x14,
+ x15,
+ x16,
+ x17,
+ x18,
+ x19,
+ x20,
+ x21,
+ x22,
+ x23,
+ x24,
+ x25,
+ x26,
+ x27,
+ x28,
+ x29,
+ x30,
+ x31
+);
+
+simd_ty!(
+ i32x16[i32]: i32,
+ i32,
+ i32,
+ i32,
+ i32,
+ i32,
+ i32,
+ i32,
+ i32,
+ i32,
+ i32,
+ i32,
+ i32,
+ i32,
+ i32,
+ i32 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7,
+ x8,
+ x9,
+ x10,
+ x11,
+ x12,
+ x13,
+ x14,
+ x15
+);
+
+simd_ty!(
+ u32x16[u32]: u32,
+ u32,
+ u32,
+ u32,
+ u32,
+ u32,
+ u32,
+ u32,
+ u32,
+ u32,
+ u32,
+ u32,
+ u32,
+ u32,
+ u32,
+ u32 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7,
+ x8,
+ x9,
+ x10,
+ x11,
+ x12,
+ x13,
+ x14,
+ x15
+);
+
+simd_ty!(
+ f32x16[f32]: f32,
+ f32,
+ f32,
+ f32,
+ f32,
+ f32,
+ f32,
+ f32,
+ f32,
+ f32,
+ f32,
+ f32,
+ f32,
+ f32,
+ f32,
+ f32 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7,
+ x8,
+ x9,
+ x10,
+ x11,
+ x12,
+ x13,
+ x14,
+ x15
+);
+
+simd_ty!(
+ i64x8[i64]: i64,
+ i64,
+ i64,
+ i64,
+ i64,
+ i64,
+ i64,
+ i64 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7
+);
+
+simd_ty!(
+ u64x8[u64]: u64,
+ u64,
+ u64,
+ u64,
+ u64,
+ u64,
+ u64,
+ u64 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7
+);
+
+simd_ty!(
+ f64x8[f64]: f64,
+ f64,
+ f64,
+ f64,
+ f64,
+ f64,
+ f64,
+ f64 | x0,
+ x1,
+ x2,
+ x3,
+ x4,
+ x5,
+ x6,
+ x7
+);