@@ -222,6 +222,20 @@ extern "C" {
222
222
223
223
#[ link_name = "llvm.ppc.altivec.vcmpgefp" ]
224
224
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 ;
225
239
}
226
240
227
241
macro_rules! s_t_l {
@@ -378,6 +392,35 @@ mod sealed {
378
392
}
379
393
}
380
394
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
+
381
424
test_impl ! { vec_vcmpgefp( a: vector_float, b: vector_float) -> vector_bool_int [ vcmpgefp, vcmpgefp ] }
382
425
383
426
test_impl ! { vec_vcmpequb( a: vector_unsigned_char, b: vector_unsigned_char) -> vector_bool_char [ vcmpequb, vcmpequb ] }
@@ -389,17 +432,6 @@ mod sealed {
389
432
unsafe fn vec_cmpeq ( self , b : Other ) -> Self :: Result ;
390
433
}
391
434
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
-
403
435
impl_vec_cmp ! { [ VectorCmpEq vec_cmpeq] ( vec_vcmpequb, vec_vcmpequh, vec_vcmpequw) }
404
436
405
437
test_impl ! { vec_vcmpbfp( a: vector_float, b: vector_float) -> vector_signed_int [ vcmpbfp, vcmpbfp] }
@@ -1323,6 +1355,16 @@ mod sealed {
1323
1355
vector_mladd ! { vector_signed_short, vector_signed_short, vector_signed_short }
1324
1356
}
1325
1357
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
+
1326
1368
/// Vector cmpge.
1327
1369
#[ inline]
1328
1370
#[ target_feature( enable = "altivec" ) ]
@@ -1691,6 +1733,42 @@ mod tests {
1691
1733
}
1692
1734
}
1693
1735
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
+
1694
1772
test_vec_2 ! { test_vec_cmpge, vec_cmpge, f32x4 -> m32x4,
1695
1773
[ 0.1 , -0.1 , 0.0 , 0.99 ] ,
1696
1774
[ 0.1 , 0.0 , 0.1 , 1.0 ] ,
0 commit comments