Skip to content

Commit

Permalink
Fix or equals integer comparisons (#872)
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniel Smith authored Jul 4, 2020
1 parent f46a47f commit a371069
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 50 deletions.
66 changes: 36 additions & 30 deletions crates/core_arch/src/x86/avx512f.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1014,7 +1014,7 @@ pub unsafe fn _mm512_mask_cmpgt_epu32_mask(m: __mmask16, a: __m512i, b: __m512i)
#[target_feature(enable = "avx512f")]
#[cfg_attr(test, assert_instr(vpcmp))]
pub unsafe fn _mm512_cmple_epu32_mask(a: __m512i, b: __m512i) -> __mmask16 {
_mm512_cmpgt_epu32_mask(b, a)
simd_bitmask::<u32x16, _>(simd_le(a.as_u32x16(), b.as_u32x16()))
}

/// Compare packed unsigned 32-bit integers in a and b for less-than-or-equal, and store the results in a mask vector k
Expand All @@ -1025,7 +1025,7 @@ pub unsafe fn _mm512_cmple_epu32_mask(a: __m512i, b: __m512i) -> __mmask16 {
#[target_feature(enable = "avx512f")]
#[cfg_attr(test, assert_instr(vpcmp))]
pub unsafe fn _mm512_mask_cmple_epu32_mask(m: __mmask16, a: __m512i, b: __m512i) -> __mmask16 {
_mm512_cmpgt_epu32_mask(b, a) & m
_mm512_cmple_epu32_mask(a, b) & m
}

/// Compare packed unsigned 32-bit integers in a and b for greater-than-or-equal, and store the results in a mask vector.
Expand All @@ -1035,7 +1035,7 @@ pub unsafe fn _mm512_mask_cmple_epu32_mask(m: __mmask16, a: __m512i, b: __m512i)
#[target_feature(enable = "avx512f")]
#[cfg_attr(test, assert_instr(vpcmp))]
pub unsafe fn _mm512_cmpge_epu32_mask(a: __m512i, b: __m512i) -> __mmask16 {
_mm512_cmplt_epu32_mask(b, a)
simd_bitmask::<u32x16, _>(simd_ge(a.as_u32x16(), b.as_u32x16()))
}

/// Compare packed unsigned 32-bit integers in a and b for greater-than-or-equal, and store the results in a mask vector k
Expand All @@ -1046,7 +1046,7 @@ pub unsafe fn _mm512_cmpge_epu32_mask(a: __m512i, b: __m512i) -> __mmask16 {
#[target_feature(enable = "avx512f")]
#[cfg_attr(test, assert_instr(vpcmp))]
pub unsafe fn _mm512_mask_cmpge_epu32_mask(m: __mmask16, a: __m512i, b: __m512i) -> __mmask16 {
_mm512_cmplt_epu32_mask(b, a) & m
_mm512_cmpge_epu32_mask(a, b) & m
}

/// Compare packed unsigned 32-bit integers in a and b for equality, and store the results in a mask vector.
Expand Down Expand Up @@ -1181,7 +1181,7 @@ pub unsafe fn _mm512_mask_cmpgt_epi32_mask(m: __mmask16, a: __m512i, b: __m512i)
#[target_feature(enable = "avx512f")]
#[cfg_attr(test, assert_instr(vpcmp))]
pub unsafe fn _mm512_cmple_epi32_mask(a: __m512i, b: __m512i) -> __mmask16 {
_mm512_cmpgt_epi32_mask(b, a)
simd_bitmask::<i32x16, _>(simd_le(a.as_i32x16(), b.as_i32x16()))
}

/// Compare packed signed 32-bit integers in a and b for less-than-or-equal, and store the results in a mask vector k
Expand All @@ -1192,7 +1192,7 @@ pub unsafe fn _mm512_cmple_epi32_mask(a: __m512i, b: __m512i) -> __mmask16 {
#[target_feature(enable = "avx512f")]
#[cfg_attr(test, assert_instr(vpcmp))]
pub unsafe fn _mm512_mask_cmple_epi32_mask(m: __mmask16, a: __m512i, b: __m512i) -> __mmask16 {
_mm512_cmpgt_epi32_mask(b, a) & m
_mm512_cmple_epi32_mask(a, b) & m
}

/// Compare packed signed 32-bit integers in a and b for greater-than-or-equal, and store the results in a mask vector.
Expand All @@ -1202,7 +1202,7 @@ pub unsafe fn _mm512_mask_cmple_epi32_mask(m: __mmask16, a: __m512i, b: __m512i)
#[target_feature(enable = "avx512f")]
#[cfg_attr(test, assert_instr(vpcmp))]
pub unsafe fn _mm512_cmpge_epi32_mask(a: __m512i, b: __m512i) -> __mmask16 {
_mm512_cmplt_epi32_mask(b, a)
simd_bitmask::<i32x16, _>(simd_ge(a.as_i32x16(), b.as_i32x16()))
}

/// Compare packed signed 32-bit integers in a and b for greater-than-or-equal, and store the results in a mask vector k
Expand All @@ -1213,7 +1213,7 @@ pub unsafe fn _mm512_cmpge_epi32_mask(a: __m512i, b: __m512i) -> __mmask16 {
#[target_feature(enable = "avx512f")]
#[cfg_attr(test, assert_instr(vpcmp))]
pub unsafe fn _mm512_mask_cmpge_epi32_mask(m: __mmask16, a: __m512i, b: __m512i) -> __mmask16 {
_mm512_cmplt_epi32_mask(b, a) & m
_mm512_cmpge_epi32_mask(a, b) & m
}

/// Compare packed signed 32-bit integers in a and b for equality, and store the results in a mask vector.
Expand Down Expand Up @@ -1348,7 +1348,7 @@ pub unsafe fn _mm512_mask_cmpgt_epu64_mask(m: __mmask8, a: __m512i, b: __m512i)
#[target_feature(enable = "avx512f")]
#[cfg_attr(test, assert_instr(vpcmp))]
pub unsafe fn _mm512_cmple_epu64_mask(a: __m512i, b: __m512i) -> __mmask8 {
_mm512_cmpgt_epu64_mask(b, a)
simd_bitmask::<__m512i, _>(simd_le(a.as_u64x8(), b.as_u64x8()))
}

/// Compare packed unsigned 64-bit integers in a and b for less-than-or-equal, and store the results in a mask vector k
Expand All @@ -1359,7 +1359,7 @@ pub unsafe fn _mm512_cmple_epu64_mask(a: __m512i, b: __m512i) -> __mmask8 {
#[target_feature(enable = "avx512f")]
#[cfg_attr(test, assert_instr(vpcmp))]
pub unsafe fn _mm512_mask_cmple_epu64_mask(m: __mmask8, a: __m512i, b: __m512i) -> __mmask8 {
_mm512_cmpgt_epu64_mask(b, a) & m
_mm512_cmple_epu64_mask(a, b) & m
}

/// Compare packed unsigned 64-bit integers in a and b for greater-than-or-equal, and store the results in a mask vector.
Expand All @@ -1369,7 +1369,7 @@ pub unsafe fn _mm512_mask_cmple_epu64_mask(m: __mmask8, a: __m512i, b: __m512i)
#[target_feature(enable = "avx512f")]
#[cfg_attr(test, assert_instr(vpcmp))]
pub unsafe fn _mm512_cmpge_epu64_mask(a: __m512i, b: __m512i) -> __mmask8 {
_mm512_cmplt_epu64_mask(b, a)
simd_bitmask::<__m512i, _>(simd_ge(a.as_u64x8(), b.as_u64x8()))
}

/// Compare packed unsigned 64-bit integers in a and b for greater-than-or-equal, and store the results in a mask vector k
Expand All @@ -1380,7 +1380,7 @@ pub unsafe fn _mm512_cmpge_epu64_mask(a: __m512i, b: __m512i) -> __mmask8 {
#[target_feature(enable = "avx512f")]
#[cfg_attr(test, assert_instr(vpcmp))]
pub unsafe fn _mm512_mask_cmpge_epu64_mask(m: __mmask8, a: __m512i, b: __m512i) -> __mmask8 {
_mm512_cmplt_epu64_mask(b, a) & m
_mm512_cmpge_epu64_mask(b, a) & m
}

/// Compare packed unsigned 64-bit integers in a and b for equality, and store the results in a mask vector.
Expand Down Expand Up @@ -1515,7 +1515,7 @@ pub unsafe fn _mm512_mask_cmpgt_epi64_mask(m: __mmask8, a: __m512i, b: __m512i)
#[target_feature(enable = "avx512f")]
#[cfg_attr(test, assert_instr(vpcmp))]
pub unsafe fn _mm512_cmple_epi64_mask(a: __m512i, b: __m512i) -> __mmask8 {
_mm512_cmpgt_epi64_mask(b, a)
simd_bitmask::<__m512i, _>(simd_le(a.as_i64x8(), b.as_i64x8()))
}

/// Compare packed signed 64-bit integers in a and b for less-than-or-equal, and store the results in a mask vector k
Expand All @@ -1526,7 +1526,7 @@ pub unsafe fn _mm512_cmple_epi64_mask(a: __m512i, b: __m512i) -> __mmask8 {
#[target_feature(enable = "avx512f")]
#[cfg_attr(test, assert_instr(vpcmp))]
pub unsafe fn _mm512_mask_cmple_epi64_mask(m: __mmask8, a: __m512i, b: __m512i) -> __mmask8 {
_mm512_cmpgt_epi64_mask(b, a) & m
_mm512_cmple_epi64_mask(a, b) & m
}

/// Compare packed signed 64-bit integers in a and b for greater-than-or-equal, and store the results in a mask vector.
Expand All @@ -1536,7 +1536,7 @@ pub unsafe fn _mm512_mask_cmple_epi64_mask(m: __mmask8, a: __m512i, b: __m512i)
#[target_feature(enable = "avx512f")]
#[cfg_attr(test, assert_instr(vpcmp))]
pub unsafe fn _mm512_cmpge_epi64_mask(a: __m512i, b: __m512i) -> __mmask8 {
_mm512_cmplt_epi64_mask(b, a)
simd_bitmask::<__m512i, _>(simd_ge(a.as_i64x8(), b.as_i64x8()))
}

/// Compare packed signed 64-bit integers in a and b for greater-than-or-equal, and store the results in a mask vector k
Expand All @@ -1547,7 +1547,7 @@ pub unsafe fn _mm512_cmpge_epi64_mask(a: __m512i, b: __m512i) -> __mmask8 {
#[target_feature(enable = "avx512f")]
#[cfg_attr(test, assert_instr(vpcmp))]
pub unsafe fn _mm512_mask_cmpge_epi64_mask(m: __mmask8, a: __m512i, b: __m512i) -> __mmask8 {
_mm512_cmplt_epi64_mask(b, a) & m
_mm512_cmpge_epi64_mask(b, a) & m
}

/// Compare packed signed 64-bit integers in a and b for equality, and store the results in a mask vector.
Expand Down Expand Up @@ -1987,7 +1987,10 @@ mod tests {
let a = _mm512_set_epi32(0, 1, -1, u32::MAX as i32, i32::MAX, i32::MIN, 100, -100,
0, 1, -1, u32::MAX as i32, i32::MAX, i32::MIN, 100, -100);
let b = _mm512_set1_epi32(-1);
assert_eq!(_mm512_cmple_epu32_mask(a, b), _mm512_cmpgt_epu32_mask(b, a))
assert_eq!(
_mm512_cmple_epu32_mask(a, b),
!_mm512_cmpgt_epu32_mask(a, b)
)
}

#[simd_test(enable = "avx512f")]
Expand All @@ -1999,7 +2002,7 @@ mod tests {
let mask = 0b01111010_01111010;
assert_eq!(
_mm512_mask_cmple_epu32_mask(mask, a, b),
_mm512_mask_cmpgt_epu32_mask(mask, b, a)
0b01111010_01111010
);
}

Expand All @@ -2009,7 +2012,10 @@ mod tests {
let a = _mm512_set_epi32(0, 1, -1, u32::MAX as i32, i32::MAX, i32::MIN, 100, -100,
0, 1, -1, u32::MAX as i32, i32::MAX, i32::MIN, 100, -100);
let b = _mm512_set1_epi32(-1);
assert_eq!(_mm512_cmpge_epu32_mask(a, b), _mm512_cmplt_epu32_mask(b, a))
assert_eq!(
_mm512_cmpge_epu32_mask(a, b),
!_mm512_cmplt_epu32_mask(a, b)
)
}

#[simd_test(enable = "avx512f")]
Expand All @@ -2019,10 +2025,7 @@ mod tests {
0, 1, -1, u32::MAX as i32, i32::MAX, i32::MIN, 100, -100);
let b = _mm512_set1_epi32(-1);
let mask = 0b01111010_01111010;
assert_eq!(
_mm512_mask_cmpge_epu32_mask(mask, a, b),
_mm512_mask_cmplt_epu32_mask(mask, b, a)
);
assert_eq!(_mm512_mask_cmpge_epu32_mask(mask, a, b), 0b01100000_0110000);
}

#[simd_test(enable = "avx512f")]
Expand Down Expand Up @@ -2144,7 +2147,10 @@ mod tests {
let a = _mm512_set_epi32(0, 1, -1, u32::MAX as i32, i32::MAX, i32::MIN, 100, -100,
0, 1, -1, u32::MAX as i32, i32::MAX, i32::MIN, 100, -100);
let b = _mm512_set1_epi32(-1);
assert_eq!(_mm512_cmple_epi32_mask(a, b), _mm512_cmpgt_epi32_mask(b, a))
assert_eq!(
_mm512_cmple_epi32_mask(a, b),
!_mm512_cmpgt_epi32_mask(a, b)
)
}

#[simd_test(enable = "avx512f")]
Expand All @@ -2154,10 +2160,7 @@ mod tests {
0, 1, -1, u32::MAX as i32, i32::MAX, i32::MIN, 100, -100);
let b = _mm512_set1_epi32(-1);
let mask = 0b01111010_01111010;
assert_eq!(
_mm512_mask_cmple_epi32_mask(mask, a, b),
_mm512_mask_cmpgt_epi32_mask(mask, b, a)
);
assert_eq!(_mm512_mask_cmple_epi32_mask(mask, a, b), 0b01100000_0110000);
}

#[simd_test(enable = "avx512f")]
Expand All @@ -2166,7 +2169,10 @@ mod tests {
let a = _mm512_set_epi32(0, 1, -1, u32::MAX as i32, i32::MAX, i32::MIN, 100, -100,
0, 1, -1, u32::MAX as i32, i32::MAX, i32::MIN, 100, -100);
let b = _mm512_set1_epi32(-1);
assert_eq!(_mm512_cmpge_epi32_mask(a, b), _mm512_cmplt_epi32_mask(b, a))
assert_eq!(
_mm512_cmpge_epi32_mask(a, b),
!_mm512_cmplt_epi32_mask(a, b)
)
}

#[simd_test(enable = "avx512f")]
Expand All @@ -2178,7 +2184,7 @@ mod tests {
let mask = 0b01111010_01111010;
assert_eq!(
_mm512_mask_cmpge_epi32_mask(mask, a, b),
_mm512_mask_cmplt_epi32_mask(mask, b, a)
0b01111010_01111010
);
}

Expand Down
40 changes: 20 additions & 20 deletions crates/core_arch/src/x86_64/avx512f.rs
Original file line number Diff line number Diff line change
Expand Up @@ -141,36 +141,36 @@ mod tests {
unsafe fn test_mm512_cmple_epu64_mask() {
let a = _mm512_set_epi64(0, 1, -1, u64::MAX as i64, i64::MAX, i64::MIN, 100, -100);
let b = _mm512_set1_epi64(-1);
assert_eq!(_mm512_cmple_epu64_mask(a, b), _mm512_cmpgt_epu64_mask(b, a))
assert_eq!(
_mm512_cmple_epu64_mask(a, b),
!_mm512_cmpgt_epu64_mask(a, b)
)
}

#[simd_test(enable = "avx512f")]
unsafe fn test_mm512_mask_cmple_epu64_mask() {
let a = _mm512_set_epi64(0, 1, -1, u64::MAX as i64, i64::MAX, i64::MIN, 100, -100);
let b = _mm512_set1_epi64(-1);
let mask = 0b01111010;
assert_eq!(
_mm512_mask_cmple_epu64_mask(mask, a, b),
_mm512_mask_cmpgt_epu64_mask(mask, b, a)
);
assert_eq!(_mm512_mask_cmple_epu64_mask(mask, a, b), 0b01111010);
}

#[simd_test(enable = "avx512f")]
unsafe fn test_mm512_cmpge_epu64_mask() {
let a = _mm512_set_epi64(0, 1, -1, u64::MAX as i64, i64::MAX, i64::MIN, 100, -100);
let b = _mm512_set1_epi64(-1);
assert_eq!(_mm512_cmpge_epu64_mask(a, b), _mm512_cmplt_epu64_mask(b, a))
assert_eq!(
_mm512_cmpge_epu64_mask(a, b),
!_mm512_cmplt_epu64_mask(a, b)
);
}

#[simd_test(enable = "avx512f")]
unsafe fn test_mm512_mask_cmpge_epu64_mask() {
let a = _mm512_set_epi64(0, 1, -1, u64::MAX as i64, i64::MAX, i64::MIN, 100, -100);
let b = _mm512_set1_epi64(-1);
let mask = 0b01111010;
assert_eq!(
_mm512_mask_cmpge_epu64_mask(mask, a, b),
_mm512_mask_cmplt_epu64_mask(mask, b, a)
);
assert_eq!(_mm512_mask_cmpge_epu64_mask(mask, a, b), 0b01111010);
}

#[simd_test(enable = "avx512f")]
Expand Down Expand Up @@ -262,36 +262,36 @@ mod tests {
unsafe fn test_mm512_cmple_epi64_mask() {
let a = _mm512_set_epi64(0, 1, -1, u64::MAX as i64, i64::MAX, i64::MIN, 100, -100);
let b = _mm512_set1_epi64(-1);
assert_eq!(_mm512_cmple_epi64_mask(a, b), _mm512_cmpgt_epi64_mask(b, a))
assert_eq!(
_mm512_cmple_epi64_mask(a, b),
!_mm512_cmpgt_epi64_mask(a, b)
)
}

#[simd_test(enable = "avx512f")]
unsafe fn test_mm512_mask_cmple_epi64_mask() {
let a = _mm512_set_epi64(0, 1, -1, u64::MAX as i64, i64::MAX, i64::MIN, 100, -100);
let b = _mm512_set1_epi64(-1);
let mask = 0b01111010;
assert_eq!(
_mm512_mask_cmple_epi64_mask(mask, a, b),
_mm512_mask_cmpgt_epi64_mask(mask, b, a)
);
assert_eq!(_mm512_mask_cmple_epi64_mask(mask, a, b), 0b00110000);
}

#[simd_test(enable = "avx512f")]
unsafe fn test_mm512_cmpge_epi64_mask() {
let a = _mm512_set_epi64(0, 1, -1, u64::MAX as i64, i64::MAX, i64::MIN, 100, -100);
let b = _mm512_set1_epi64(-1);
assert_eq!(_mm512_cmpge_epi64_mask(a, b), _mm512_cmplt_epi64_mask(b, a))
assert_eq!(
_mm512_cmpge_epi64_mask(a, b),
!_mm512_cmplt_epi64_mask(a, b)
)
}

#[simd_test(enable = "avx512f")]
unsafe fn test_mm512_mask_cmpge_epi64_mask() {
let a = _mm512_set_epi64(0, 1, -1, u64::MAX as i64, i64::MAX, i64::MIN, 100, -100);
let b = _mm512_set1_epi64(-1);
let mask = 0b01111010;
assert_eq!(
_mm512_mask_cmpge_epi64_mask(mask, a, b),
_mm512_mask_cmplt_epi64_mask(mask, b, a)
);
assert_eq!(_mm512_mask_cmpge_epi64_mask(mask, a, b), 0b0110000);
}

#[simd_test(enable = "avx512f")]
Expand Down

0 comments on commit a371069

Please sign in to comment.