|
1 | 1 | //@compile-flags: -Zmiri-strict-provenance
|
2 |
| -#![feature(portable_simd, adt_const_params, core_intrinsics)] |
| 2 | +#![feature(portable_simd, adt_const_params, core_intrinsics, repr_simd)] |
3 | 3 | #![allow(incomplete_features, internal_features)]
|
4 | 4 | use std::intrinsics::simd as intrinsics;
|
5 | 5 | use std::ptr;
|
@@ -581,11 +581,32 @@ fn simd_masked_loadstore() {
|
581 | 581 | assert_eq!(buf, [2, 3, 4]);
|
582 | 582 | }
|
583 | 583 |
|
| 584 | +fn simd_ops_non_pow2() { |
| 585 | + // Just a little smoke test for operations on non-power-of-two vectors. |
| 586 | + #[repr(simd, packed)] |
| 587 | + #[derive(Copy, Clone)] |
| 588 | + pub struct SimdPacked<T, const N: usize>([T; N]); |
| 589 | + #[repr(simd)] |
| 590 | + #[derive(Copy, Clone)] |
| 591 | + pub struct SimdPadded<T, const N: usize>([T; N]); |
| 592 | + |
| 593 | + let x = SimdPacked([1u32; 3]); |
| 594 | + let y = SimdPacked([2u32; 3]); |
| 595 | + let z = unsafe { intrinsics::simd_add(x, y) }; |
| 596 | + assert_eq!({ z.0 }, [3u32; 3]); |
| 597 | + |
| 598 | + let x = SimdPadded([1u32; 3]); |
| 599 | + let y = SimdPadded([2u32; 3]); |
| 600 | + let z = unsafe { intrinsics::simd_add(x, y) }; |
| 601 | + assert_eq!(z.0, [3u32; 3]); |
| 602 | +} |
| 603 | + |
584 | 604 | fn main() {
|
585 | 605 | simd_mask();
|
586 | 606 | simd_ops_f32();
|
587 | 607 | simd_ops_f64();
|
588 | 608 | simd_ops_i32();
|
| 609 | + simd_ops_non_pow2(); |
589 | 610 | simd_cast();
|
590 | 611 | simd_swizzle();
|
591 | 612 | simd_gather_scatter();
|
|
0 commit comments