Skip to content

Commit 22d579c

Browse files
lu-zerognzlbg
authored andcommitted
Add Altivec vec_cmpgt
1 parent c2aa225 commit 22d579c

File tree

1 file changed

+89
-11
lines changed

1 file changed

+89
-11
lines changed

crates/core_arch/src/powerpc/altivec.rs

Lines changed: 89 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,20 @@ extern "C" {
222222

223223
#[link_name = "llvm.ppc.altivec.vcmpgefp"]
224224
fn vcmpgefp(a: vector_float, b: vector_float) -> vector_bool_int;
225+
226+
#[link_name = "llvm.ppc.altivec.vcmpgtub"]
227+
fn vcmpgtub(a: vector_unsigned_char, b: vector_unsigned_char) -> vector_bool_char;
228+
#[link_name = "llvm.ppc.altivec.vcmpgtuh"]
229+
fn vcmpgtuh(a: vector_unsigned_short, b: vector_unsigned_short) -> vector_bool_short;
230+
#[link_name = "llvm.ppc.altivec.vcmpgtuw"]
231+
fn vcmpgtuw(a: vector_unsigned_int, b: vector_unsigned_int) -> vector_bool_int;
232+
233+
#[link_name = "llvm.ppc.altivec.vcmpgtsb"]
234+
fn vcmpgtsb(a: vector_signed_char, b: vector_signed_char) -> vector_bool_char;
235+
#[link_name = "llvm.ppc.altivec.vcmpgtsh"]
236+
fn vcmpgtsh(a: vector_signed_short, b: vector_signed_short) -> vector_bool_short;
237+
#[link_name = "llvm.ppc.altivec.vcmpgtsw"]
238+
fn vcmpgtsw(a: vector_signed_int, b: vector_signed_int) -> vector_bool_int;
225239
}
226240

227241
macro_rules! s_t_l {
@@ -378,6 +392,35 @@ mod sealed {
378392
}
379393
}
380394

395+
macro_rules! impl_vec_cmp {
396+
([$Trait:ident $m:ident] ($b:ident, $h:ident, $w:ident)) => {
397+
impl_vec_cmp! { [$Trait $m] ($b, $b, $h, $h, $w, $w) }
398+
};
399+
([$Trait:ident $m:ident] ($ub:ident, $sb:ident, $uh:ident, $sh:ident, $uw:ident, $sw:ident)) => {
400+
impl_vec_trait!{ [$Trait $m] $ub (vector_unsigned_char, vector_unsigned_char) -> vector_bool_char }
401+
impl_vec_trait!{ [$Trait $m] $sb (vector_signed_char, vector_signed_char) -> vector_bool_char }
402+
impl_vec_trait!{ [$Trait $m] $uh (vector_unsigned_short, vector_unsigned_short) -> vector_bool_short }
403+
impl_vec_trait!{ [$Trait $m] $sh (vector_signed_short, vector_signed_short) -> vector_bool_short }
404+
impl_vec_trait!{ [$Trait $m] $uw (vector_unsigned_int, vector_unsigned_int) -> vector_bool_int }
405+
impl_vec_trait!{ [$Trait $m] $sw (vector_signed_int, vector_signed_int) -> vector_bool_int }
406+
}
407+
}
408+
409+
test_impl! { vec_vcmpgtub(a: vector_unsigned_char, b: vector_unsigned_char) -> vector_bool_char [ vcmpgtub, vcmpgtub ] }
410+
test_impl! { vec_vcmpgtuh(a: vector_unsigned_short, b: vector_unsigned_short) -> vector_bool_short [ vcmpgtuh, vcmpgtuh ] }
411+
test_impl! { vec_vcmpgtuw(a: vector_unsigned_int, b: vector_unsigned_int) -> vector_bool_int [ vcmpgtuw, vcmpgtuw ] }
412+
413+
test_impl! { vec_vcmpgtsb(a: vector_signed_char, b: vector_signed_char) -> vector_bool_char [ vcmpgtsb, vcmpgtsb ] }
414+
test_impl! { vec_vcmpgtsh(a: vector_signed_short, b: vector_signed_short) -> vector_bool_short [ vcmpgtsh, vcmpgtsh ] }
415+
test_impl! { vec_vcmpgtsw(a: vector_signed_int, b: vector_signed_int) -> vector_bool_int [ vcmpgtsw, vcmpgtsw ] }
416+
417+
pub trait VectorCmpGt<Other> {
418+
type Result;
419+
unsafe fn vec_cmpgt(self, b: Other) -> Self::Result;
420+
}
421+
422+
impl_vec_cmp! { [VectorCmpGt vec_cmpgt] ( vec_vcmpgtub, vec_vcmpgtsb, vec_vcmpgtuh, vec_vcmpgtsh, vec_vcmpgtuw, vec_vcmpgtsw ) }
423+
381424
test_impl! { vec_vcmpgefp(a: vector_float, b: vector_float) -> vector_bool_int [ vcmpgefp, vcmpgefp ] }
382425

383426
test_impl! { vec_vcmpequb(a: vector_unsigned_char, b: vector_unsigned_char) -> vector_bool_char [ vcmpequb, vcmpequb ] }
@@ -389,17 +432,6 @@ mod sealed {
389432
unsafe fn vec_cmpeq(self, b: Other) -> Self::Result;
390433
}
391434

392-
macro_rules! impl_vec_cmp {
393-
([$Trait:ident $m:ident] ($b:ident, $h:ident, $w:ident)) => {
394-
impl_vec_trait!{ [$Trait $m] $b (vector_unsigned_char, vector_unsigned_char) -> vector_bool_char }
395-
impl_vec_trait!{ [$Trait $m] $b (vector_signed_char, vector_signed_char) -> vector_bool_char }
396-
impl_vec_trait!{ [$Trait $m] $h (vector_unsigned_short, vector_unsigned_short) -> vector_bool_short }
397-
impl_vec_trait!{ [$Trait $m] $h (vector_signed_short, vector_signed_short) -> vector_bool_short }
398-
impl_vec_trait!{ [$Trait $m] $w (vector_unsigned_int, vector_unsigned_int) -> vector_bool_int }
399-
impl_vec_trait!{ [$Trait $m] $w (vector_signed_int, vector_signed_int) -> vector_bool_int }
400-
}
401-
}
402-
403435
impl_vec_cmp! { [VectorCmpEq vec_cmpeq] (vec_vcmpequb, vec_vcmpequh, vec_vcmpequw) }
404436

405437
test_impl! { vec_vcmpbfp(a: vector_float, b: vector_float) -> vector_signed_int [vcmpbfp, vcmpbfp] }
@@ -1323,6 +1355,16 @@ mod sealed {
13231355
vector_mladd! { vector_signed_short, vector_signed_short, vector_signed_short }
13241356
}
13251357

1358+
/// Vector cmpgt.
1359+
#[inline]
1360+
#[target_feature(enable = "altivec")]
1361+
pub unsafe fn vec_cmpgt<T, U>(a: T, b: U) -> <T as sealed::VectorCmpGt<U>>::Result
1362+
where
1363+
T: sealed::VectorCmpGt<U>,
1364+
{
1365+
a.vec_cmpgt(b)
1366+
}
1367+
13261368
/// Vector cmpge.
13271369
#[inline]
13281370
#[target_feature(enable = "altivec")]
@@ -1691,6 +1733,42 @@ mod tests {
16911733
}
16921734
}
16931735

1736+
test_vec_2! { test_vec_cmpgt_i8, vec_cmpgt, i8x16 -> m8x16,
1737+
[1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
1738+
[0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
1739+
[true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false]
1740+
}
1741+
1742+
test_vec_2! { test_vec_cmpgt_u8, vec_cmpgt, u8x16 -> m8x16,
1743+
[1, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
1744+
[0, 0, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
1745+
[true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
1746+
}
1747+
1748+
test_vec_2! { test_vec_cmpgt_i16, vec_cmpgt, i16x8 -> m16x8,
1749+
[1, -1, 0, 0, 0, 0, 0, 0],
1750+
[0, 0, -1, 1, 0, 0, 0, 0],
1751+
[true, false, true, false, false, false, false, false]
1752+
}
1753+
1754+
test_vec_2! { test_vec_cmpgt_u16, vec_cmpgt, u16x8 -> m16x8,
1755+
[1, 255, 0, 0, 0, 0, 0, 0],
1756+
[0, 0, 255, 1, 0, 0, 0, 0],
1757+
[true, true, false, false, false, false, false, false]
1758+
}
1759+
1760+
test_vec_2! { test_vec_cmpgt_i32, vec_cmpgt, i32x4 -> m32x4,
1761+
[1, -1, 0, 0],
1762+
[0, -1, 0, 1],
1763+
[true, false, false, false]
1764+
}
1765+
1766+
test_vec_2! { test_vec_cmpgt_u32, vec_cmpgt, u32x4 -> m32x4,
1767+
[1, 255, 0, 0],
1768+
[0, 255, 0, 1],
1769+
[true, false, false, false]
1770+
}
1771+
16941772
test_vec_2! { test_vec_cmpge, vec_cmpge, f32x4 -> m32x4,
16951773
[0.1, -0.1, 0.0, 0.99],
16961774
[0.1, 0.0, 0.1, 1.0],

0 commit comments

Comments
 (0)