|
2 | 2 | #![feature(portable_simd, platform_intrinsics)]
|
3 | 3 | use std::simd::*;
|
4 | 4 |
|
| 5 | +extern "platform-intrinsic" { |
| 6 | + pub(crate) fn simd_bitmask<T, U>(x: T) -> U; |
| 7 | +} |
| 8 | + |
5 | 9 | fn simd_ops_f32() {
|
6 | 10 | let a = f32x4::splat(10.0);
|
7 | 11 | let b = f32x4::from_array([1.0, 2.0, 3.0, -4.0]);
|
@@ -208,11 +212,38 @@ fn simd_mask() {
|
208 | 212 | assert_eq!(bitmask, 0b1010001101001001);
|
209 | 213 | assert_eq!(Mask::<i64, 16>::from_bitmask(bitmask), mask);
|
210 | 214 |
|
| 215 | + // Also directly call intrinsic, to test both kinds of return types. |
| 216 | + unsafe { |
| 217 | + let bitmask1: u16 = simd_bitmask(mask.to_int()); |
| 218 | + let bitmask2: [u8; 2] = simd_bitmask(mask.to_int()); |
| 219 | + if cfg!(target_endian = "little") { |
| 220 | + assert_eq!(bitmask1, 0b1010001101001001); |
| 221 | + assert_eq!(bitmask2, [0b01001001, 0b10100011]); |
| 222 | + } else { |
| 223 | + assert_eq!(bitmask1, 0b1001001011000101); |
| 224 | + assert_eq!(bitmask2, [0b10010010, 0b11000101]); |
| 225 | + } |
| 226 | + } |
| 227 | + |
| 228 | + // Mask less than 8 bits long, which is a special case (padding with 0s). |
211 | 229 | let values = [false, false, false, true];
|
212 | 230 | let mask = Mask::<i64, 4>::from_array(values);
|
213 | 231 | let bitmask = mask.to_bitmask();
|
214 | 232 | assert_eq!(bitmask, 0b1000);
|
215 | 233 | assert_eq!(Mask::<i64, 4>::from_bitmask(bitmask), mask);
|
| 234 | + |
| 235 | + // Also directly call intrinsic, to test both kinds of return types. |
| 236 | + unsafe { |
| 237 | + let bitmask1: u8 = simd_bitmask(mask.to_int()); |
| 238 | + let bitmask2: [u8; 1] = simd_bitmask(mask.to_int()); |
| 239 | + if cfg!(target_endian = "little") { |
| 240 | + assert_eq!(bitmask1, 0b1000); |
| 241 | + assert_eq!(bitmask2, [0b1000]); |
| 242 | + } else { |
| 243 | + assert_eq!(bitmask1, 0b0001); |
| 244 | + assert_eq!(bitmask2, [0b0001]); |
| 245 | + } |
| 246 | + } |
216 | 247 | }
|
217 | 248 |
|
218 | 249 | fn simd_cast() {
|
|
0 commit comments