Skip to content

Commit df2e755

Browse files
Daniel SmithAmanieu
authored andcommitted
Add gt and eq unsigned variants
1 parent dfbbdde commit df2e755

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

crates/core_arch/src/x86/avx512f.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,48 @@ pub unsafe fn _mm512_mask_cmplt_epu64_mask(m: __mmask8, a: __m512i, b: __m512i)
115115
_mm512_cmplt_epu64_mask(a, b) & m
116116
}
117117

118+
/// Compare packed unsigned 64-bit integers in a and b for less-than, and store the results in a mask vector.
119+
///
120+
/// [Intel's documentation](https://software.intel.com/sites/landingpage/IntrinsicsGuide/#expand=727,1063,4909,1062,1062&text=_mm512_cmpgt_epu64)
121+
#[inline]
122+
#[target_feature(enable = "avx512f")]
123+
#[cfg_attr(test, assert_instr(vpcmp))]
124+
pub unsafe fn _mm512_cmpgt_epu64_mask(a: __m512i, b: __m512i) -> __mmask8 {
125+
simd_bitmask::<__m512i, _>(simd_gt(a.as_u64x8(), b.as_u64x8()))
126+
}
127+
128+
///Compare packed unsigned 64-bit integers in a and b for less-than, and store the results in a mask vector k
129+
/// using zeromask m (elements are zeroed out when the corresponding mask bit is not set).
130+
///
131+
/// [Intel's documentation](https://software.intel.com/sites/landingpage/IntrinsicsGuide/#expand=727,1063,4909,1062,1062,1063&text=_mm512_mask_cmpgt_epu64)
132+
#[inline]
133+
#[target_feature(enable = "avx512f")]
134+
#[cfg_attr(test, assert_instr(vpcmp))]
135+
pub unsafe fn _mm512_mask_cmpgt_epu64_mask(m: __mmask8, a: __m512i, b: __m512i) -> __mmask8 {
136+
_mm512_cmpgt_epu64_mask(a, b) & m
137+
}
138+
139+
/// Compare packed unsigned 64-bit integers in a and b for less-than, and store the results in a mask vector.
140+
///
141+
/// [Intel's documentation](https://software.intel.com/sites/landingpage/IntrinsicsGuide/#expand=727,1063,4909,1062,1062&text=_mm512_cmpeq_epu64)
142+
#[inline]
143+
#[target_feature(enable = "avx512f")]
144+
#[cfg_attr(test, assert_instr(vpcmp))]
145+
pub unsafe fn _mm512_cmpeq_epu64_mask(a: __m512i, b: __m512i) -> __mmask8 {
146+
simd_bitmask::<__m512i, _>(simd_eq(a.as_u64x8(), b.as_u64x8()))
147+
}
148+
149+
///Compare packed unsigned 64-bit integers in a and b for less-than, and store the results in a mask vector k
150+
/// using zeromask m (elements are zeroed out when the corresponding mask bit is not set).
151+
///
152+
/// [Intel's documentation](https://software.intel.com/sites/landingpage/IntrinsicsGuide/#expand=727,1063,4909,1062,1062,1063&text=_mm512_mask_cmpeq_epu64)
153+
#[inline]
154+
#[target_feature(enable = "avx512f")]
155+
#[cfg_attr(test, assert_instr(vpcmp))]
156+
pub unsafe fn _mm512_mask_cmpeq_epu64_mask(m: __mmask8, a: __m512i, b: __m512i) -> __mmask8 {
157+
_mm512_cmpeq_epu64_mask(a, b) & m
158+
}
159+
118160
#[cfg(test)]
119161
mod tests {
120162
use std;

crates/core_arch/src/x86_64/avx512f.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,40 @@ mod tests {
6666
assert_eq!(r, 0b01001010);
6767
}
6868

69+
#[simd_test(enable = "avx512f")]
70+
unsafe fn test_mm512_cmpgt_epu64_mask() {
71+
let a = _mm512_set_epi64(0, 1, -1, u64::MAX as i64, i64::MAX, i64::MIN, 100, -100);
72+
let b = _mm512_set1_epi64(-1);
73+
let m = _mm512_cmpgt_epu64_mask(b, a);
74+
assert_eq!(m, 0b11001111);
75+
}
76+
77+
#[simd_test(enable = "avx512f")]
78+
unsafe fn test_mm512_mask_cmpgt_epu64_mask() {
79+
let a = _mm512_set_epi64(0, 1, -1, u64::MAX as i64, i64::MAX, i64::MIN, 100, -100);
80+
let b = _mm512_set1_epi64(-1);
81+
let mask = 0b01111010;
82+
let r = _mm512_mask_cmpgt_epu64_mask(mask, b, a);
83+
assert_eq!(r, 0b01001010);
84+
}
85+
86+
#[simd_test(enable = "avx512f")]
87+
unsafe fn test_mm512_cmpeq_epu64_mask() {
88+
let a = _mm512_set_epi64(0, 1, -1, u64::MAX as i64, i64::MAX, i64::MIN, 100, -100);
89+
let b = _mm512_set_epi64(0, 1, 13, 42, i64::MAX, i64::MIN, 100, -100);
90+
let m = _mm512_cmpeq_epu64_mask(b, a);
91+
assert_eq!(m, 0b11001111);
92+
}
93+
94+
#[simd_test(enable = "avx512f")]
95+
unsafe fn test_mm512_mask_cmpeq_epu64_mask() {
96+
let a = _mm512_set_epi64(0, 1, -1, u64::MAX as i64, i64::MAX, i64::MIN, 100, -100);
97+
let b = _mm512_set_epi64(0, 1, 13, 42, i64::MAX, i64::MIN, 100, -100);
98+
let mask = 0b01111010;
99+
let r = _mm512_mask_cmpeq_epu64_mask(mask, b, a);
100+
assert_eq!(r, 0b01001010);
101+
}
102+
69103
#[simd_test(enable = "avx512f")]
70104
unsafe fn test_mm512_set_epi64() {
71105
let r = _mm512_setr_epi64(0, 1, 2, 3, 4, 5, 6, 7);

0 commit comments

Comments
 (0)