Skip to content

Commit 135c302

Browse files
Added i64x2 bitmask and some tests
1 parent ee78c44 commit 135c302

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed

crates/core_arch/src/wasm32/simd128.rs

+49
Original file line numberDiff line numberDiff line change
@@ -2125,6 +2125,15 @@ pub unsafe fn i64x2_mul(a: v128, b: v128) -> v128 {
21252125
transmute(simd_mul(a.as_i64x2(), b.as_i64x2()))
21262126
}
21272127

2128+
/// Extracts the high bit for each lane in `a` and produce a scalar mask with
2129+
/// all bits concatenated.
2130+
#[inline]
2131+
#[cfg_attr(test, assert_instr(i64x2.bitmask))]
2132+
#[target_feature(enable = "simd128")]
2133+
pub unsafe fn i64x2_bitmask(a: v128) -> i32 {
2134+
llvm_bitmask_i64x2(transmute(a))
2135+
}
2136+
21282137
/// Calculates the absolute value of each lane of a 128-bit vector interpreted
21292138
/// as four 32-bit floating point numbers.
21302139
#[inline]
@@ -2806,6 +2815,46 @@ pub mod tests {
28062815
}
28072816
}
28082817

2818+
#[test]
2819+
fn test_bitmask_ops() {
2820+
unsafe {
2821+
let a: [u32; 4] = [u32::MAX, 0, u32::MAX, 0];
2822+
let b: [u32; 4] = [u32::MAX; 4];
2823+
let c: [u32; 4] = [0; 4];
2824+
2825+
let vec_a: v128 = transmute(a);
2826+
let vec_b: v128 = transmute(b);
2827+
let vec_c: v128 = transmute(c);
2828+
2829+
let r: i32 = i8x16_bitmask(vec_a);
2830+
assert_eq!(r, 0b1111000011110000);
2831+
let r: i32 = i16x8_bitmask(vec_a);
2832+
assert_eq!(r, 0b11001100);
2833+
let r: i32 = i32x4_bitmask(vec_a);
2834+
assert_eq!(r, 0b1010);
2835+
let r: i32 = i64x2_bitmask(vec_a);
2836+
assert_eq!(r, 0b11);
2837+
2838+
let r: i32 = i8x16_bitmask(vec_b);
2839+
assert_eq!(r, 0xFFFF);
2840+
let r: i32 = i16x8_bitmask(vec_b);
2841+
assert_eq!(r, 0xFF);
2842+
let r: i32 = i32x4_bitmask(vec_b);
2843+
assert_eq!(r, 0xF);
2844+
let r: i32 = i64x2_bitmask(vec_b);
2845+
assert_eq!(r, 0b11);
2846+
2847+
let r: i32 = i8x16_bitmask(vec_c);
2848+
assert_eq!(r, 0);
2849+
let r: i32 = i16x8_bitmask(vec_c);
2850+
assert_eq!(r, 0);
2851+
let r: i32 = i32x4_bitmask(vec_c);
2852+
assert_eq!(r, 0);
2853+
let r: i32 = i64x2_bitmask(vec_c);
2854+
assert_eq!(r, 0);
2855+
}
2856+
}
2857+
28092858
macro_rules! test_bool_red {
28102859
([$test_id:ident, $any:ident, $all:ident] | [$($true:expr),*] | [$($false:expr),*] | [$($alt:expr),*]) => {
28112860
#[test]

0 commit comments

Comments
 (0)