Skip to content

Commit f6313e8

Browse files
committed
add a fallback implementation
1 parent be8e67c commit f6313e8

File tree

2 files changed

+47
-6
lines changed

2 files changed

+47
-6
lines changed

library/core/src/intrinsics/simd.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,12 @@ pub unsafe fn simd_insert<T, U>(_x: T, _idx: u32, _val: U) -> T {
2626
///
2727
/// `idx` must be in-bounds of the vector.
2828
#[rustc_intrinsic]
29-
#[rustc_intrinsic_must_be_overridden]
3029
#[rustc_nounwind]
3130
#[cfg(not(bootstrap))]
32-
pub unsafe fn simd_insert_dyn<T, U>(_x: T, _idx: u32, _val: U) -> T {
33-
unreachable!()
31+
pub unsafe fn simd_insert_dyn<T, U>(mut x: T, idx: u32, val: U) -> T {
32+
// SAFETY: `idx` must be in-bounds
33+
unsafe { (&mut x as *mut T as *mut U).add(idx as usize).write(val) }
34+
x
3435
}
3536

3637
/// Extracts an element from a vector.
@@ -57,11 +58,11 @@ pub unsafe fn simd_extract<T, U>(_x: T, _idx: u32) -> U {
5758
///
5859
/// `idx` must be in-bounds of the vector.
5960
#[rustc_intrinsic]
60-
#[rustc_intrinsic_must_be_overridden]
6161
#[rustc_nounwind]
6262
#[cfg(not(bootstrap))]
63-
pub unsafe fn simd_extract_dyn<T, U>(_x: T, _idx: u32) -> U {
64-
unreachable!()
63+
pub unsafe fn simd_extract_dyn<T, U>(x: T, idx: u32) -> U {
64+
// SAFETY: `idx` must be in-bounds
65+
unsafe { (&x as *const T as *const U).add(idx as usize).read() }
6566
}
6667

6768
/// Adds two simd vectors elementwise.

tests/ui/simd/intrinsic/generic-elements-pass.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,14 @@ struct i32x8([i32; 8]);
1919
#[rustc_intrinsic]
2020
unsafe fn simd_insert<T, E>(x: T, idx: u32, y: E) -> T;
2121

22+
#[rustc_intrinsic]
23+
unsafe fn simd_insert_dyn<T, E>(x: T, idx: u32, y: E) -> T;
24+
2225
#[rustc_intrinsic]
2326
unsafe fn simd_extract<T, E>(x: T, idx: u32) -> E;
2427

28+
#[rustc_intrinsic]
29+
unsafe fn simd_extract_dyn<T, E>(x: T, idx: u32) -> E;
2530

2631
#[rustc_intrinsic]
2732
unsafe fn simd_shuffle<T, I, U>(x: T, y: T, idx: I) -> U;
@@ -79,6 +84,41 @@ fn main() {
7984
all_eq!(simd_extract(x8, 6), 86);
8085
all_eq!(simd_extract(x8, 7), 87);
8186
}
87+
unsafe {
88+
all_eq!(simd_insert_dyn(x2, 0, 100), i32x2([100, 21]));
89+
all_eq!(simd_insert_dyn(x2, 1, 100), i32x2([20, 100]));
90+
91+
all_eq!(simd_insert_dyn(x4, 0, 100), i32x4([100, 41, 42, 43]));
92+
all_eq!(simd_insert_dyn(x4, 1, 100), i32x4([40, 100, 42, 43]));
93+
all_eq!(simd_insert_dyn(x4, 2, 100), i32x4([40, 41, 100, 43]));
94+
all_eq!(simd_insert_dyn(x4, 3, 100), i32x4([40, 41, 42, 100]));
95+
96+
all_eq!(simd_insert_dyn(x8, 0, 100), i32x8([100, 81, 82, 83, 84, 85, 86, 87]));
97+
all_eq!(simd_insert_dyn(x8, 1, 100), i32x8([80, 100, 82, 83, 84, 85, 86, 87]));
98+
all_eq!(simd_insert_dyn(x8, 2, 100), i32x8([80, 81, 100, 83, 84, 85, 86, 87]));
99+
all_eq!(simd_insert_dyn(x8, 3, 100), i32x8([80, 81, 82, 100, 84, 85, 86, 87]));
100+
all_eq!(simd_insert_dyn(x8, 4, 100), i32x8([80, 81, 82, 83, 100, 85, 86, 87]));
101+
all_eq!(simd_insert_dyn(x8, 5, 100), i32x8([80, 81, 82, 83, 84, 100, 86, 87]));
102+
all_eq!(simd_insert_dyn(x8, 6, 100), i32x8([80, 81, 82, 83, 84, 85, 100, 87]));
103+
all_eq!(simd_insert_dyn(x8, 7, 100), i32x8([80, 81, 82, 83, 84, 85, 86, 100]));
104+
105+
all_eq!(simd_extract_dyn(x2, 0), 20);
106+
all_eq!(simd_extract_dyn(x2, 1), 21);
107+
108+
all_eq!(simd_extract_dyn(x4, 0), 40);
109+
all_eq!(simd_extract_dyn(x4, 1), 41);
110+
all_eq!(simd_extract_dyn(x4, 2), 42);
111+
all_eq!(simd_extract_dyn(x4, 3), 43);
112+
113+
all_eq!(simd_extract_dyn(x8, 0), 80);
114+
all_eq!(simd_extract_dyn(x8, 1), 81);
115+
all_eq!(simd_extract_dyn(x8, 2), 82);
116+
all_eq!(simd_extract_dyn(x8, 3), 83);
117+
all_eq!(simd_extract_dyn(x8, 4), 84);
118+
all_eq!(simd_extract_dyn(x8, 5), 85);
119+
all_eq!(simd_extract_dyn(x8, 6), 86);
120+
all_eq!(simd_extract_dyn(x8, 7), 87);
121+
}
82122

83123
let y2 = i32x2([120, 121]);
84124
let y4 = i32x4([140, 141, 142, 143]);

0 commit comments

Comments
 (0)