@@ -254,6 +254,22 @@ extern "C" {
254
254
255
255
#[ link_name = "llvm.ppc.altivec.vcmpeqfp.p" ]
256
256
fn vcmpeqfp_p ( cr : i32 , a : vector_float , b : vector_float ) -> i32 ;
257
+
258
+ #[ link_name = "llvm.ppc.altivec.vcmpgtub.p" ]
259
+ fn vcmpgtub_p ( cr : i32 , a : vector_unsigned_char , b : vector_unsigned_char ) -> i32 ;
260
+ #[ link_name = "llvm.ppc.altivec.vcmpgtuh.p" ]
261
+ fn vcmpgtuh_p ( cr : i32 , a : vector_unsigned_short , b : vector_unsigned_short ) -> i32 ;
262
+ #[ link_name = "llvm.ppc.altivec.vcmpgtuw.p" ]
263
+ fn vcmpgtuw_p ( cr : i32 , a : vector_unsigned_int , b : vector_unsigned_int ) -> i32 ;
264
+ #[ link_name = "llvm.ppc.altivec.vcmpgtsb.p" ]
265
+ fn vcmpgtsb_p ( cr : i32 , a : vector_signed_char , b : vector_signed_char ) -> i32 ;
266
+ #[ link_name = "llvm.ppc.altivec.vcmpgtsh.p" ]
267
+ fn vcmpgtsh_p ( cr : i32 , a : vector_signed_short , b : vector_signed_short ) -> i32 ;
268
+ #[ link_name = "llvm.ppc.altivec.vcmpgtsw.p" ]
269
+ fn vcmpgtsw_p ( cr : i32 , a : vector_signed_int , b : vector_signed_int ) -> i32 ;
270
+
271
+ #[ link_name = "llvm.ppc.altivec.vcmpgefp.p" ]
272
+ fn vcmpgefp_p ( cr : i32 , a : vector_float , b : vector_float ) -> i32 ;
257
273
}
258
274
259
275
macro_rules! s_t_l {
@@ -541,6 +557,143 @@ mod sealed {
541
557
}
542
558
}
543
559
560
+ #[ inline]
561
+ #[ target_feature( enable = "altivec" ) ]
562
+ #[ cfg_attr( test, assert_instr( vcmpgtsb. ) ) ]
563
+ unsafe fn vcmpgesb_all ( a : vector_signed_char , b : vector_signed_char ) -> bool {
564
+ vcmpgtsb_p ( 0 , b, a) != 0
565
+ }
566
+
567
+ #[ inline]
568
+ #[ target_feature( enable = "altivec" ) ]
569
+ #[ cfg_attr( test, assert_instr( vcmpgtsb. ) ) ]
570
+ unsafe fn vcmpgesb_any ( a : vector_signed_char , b : vector_signed_char ) -> bool {
571
+ vcmpgtsb_p ( 3 , b, a) != 0
572
+ }
573
+
574
+ #[ inline]
575
+ #[ target_feature( enable = "altivec" ) ]
576
+ #[ cfg_attr( test, assert_instr( vcmpgtsh. ) ) ]
577
+ unsafe fn vcmpgesh_all ( a : vector_signed_short , b : vector_signed_short ) -> bool {
578
+ vcmpgtsh_p ( 0 , b, a) != 0
579
+ }
580
+
581
+ #[ inline]
582
+ #[ target_feature( enable = "altivec" ) ]
583
+ #[ cfg_attr( test, assert_instr( vcmpgtsh. ) ) ]
584
+ unsafe fn vcmpgesh_any ( a : vector_signed_short , b : vector_signed_short ) -> bool {
585
+ vcmpgtsh_p ( 3 , b, a) != 0
586
+ }
587
+
588
+ #[ inline]
589
+ #[ target_feature( enable = "altivec" ) ]
590
+ #[ cfg_attr( test, assert_instr( vcmpgtsw. ) ) ]
591
+ unsafe fn vcmpgesw_all ( a : vector_signed_int , b : vector_signed_int ) -> bool {
592
+ vcmpgtsw_p ( 0 , b, a) != 0
593
+ }
594
+
595
+ #[ inline]
596
+ #[ target_feature( enable = "altivec" ) ]
597
+ #[ cfg_attr( test, assert_instr( vcmpgtsw. ) ) ]
598
+ unsafe fn vcmpgesw_any ( a : vector_signed_int , b : vector_signed_int ) -> bool {
599
+ vcmpgtsw_p ( 3 , b, a) != 0
600
+ }
601
+
602
+ #[ inline]
603
+ #[ target_feature( enable = "altivec" ) ]
604
+ #[ cfg_attr( test, assert_instr( vcmpgtub. ) ) ]
605
+ unsafe fn vcmpgeub_all ( a : vector_unsigned_char , b : vector_unsigned_char ) -> bool {
606
+ vcmpgtub_p ( 0 , b, a) != 0
607
+ }
608
+
609
+ #[ inline]
610
+ #[ target_feature( enable = "altivec" ) ]
611
+ #[ cfg_attr( test, assert_instr( vcmpgtub. ) ) ]
612
+ unsafe fn vcmpgeub_any ( a : vector_unsigned_char , b : vector_unsigned_char ) -> bool {
613
+ vcmpgtub_p ( 3 , b, a) != 0
614
+ }
615
+
616
+ #[ inline]
617
+ #[ target_feature( enable = "altivec" ) ]
618
+ #[ cfg_attr( test, assert_instr( vcmpgtuh. ) ) ]
619
+ unsafe fn vcmpgeuh_all ( a : vector_unsigned_short , b : vector_unsigned_short ) -> bool {
620
+ vcmpgtuh_p ( 0 , b, a) != 0
621
+ }
622
+
623
+ #[ inline]
624
+ #[ target_feature( enable = "altivec" ) ]
625
+ #[ cfg_attr( test, assert_instr( vcmpgtuh. ) ) ]
626
+ unsafe fn vcmpgeuh_any ( a : vector_unsigned_short , b : vector_unsigned_short ) -> bool {
627
+ vcmpgtuh_p ( 3 , b, a) != 0
628
+ }
629
+
630
+ #[ inline]
631
+ #[ target_feature( enable = "altivec" ) ]
632
+ #[ cfg_attr( test, assert_instr( vcmpgtuw. ) ) ]
633
+ unsafe fn vcmpgeuw_all ( a : vector_unsigned_int , b : vector_unsigned_int ) -> bool {
634
+ vcmpgtuw_p ( 0 , b, a) != 0
635
+ }
636
+
637
+ #[ inline]
638
+ #[ target_feature( enable = "altivec" ) ]
639
+ #[ cfg_attr( test, assert_instr( vcmpgtuw. ) ) ]
640
+ unsafe fn vcmpgeuw_any ( a : vector_unsigned_int , b : vector_unsigned_int ) -> bool {
641
+ vcmpgtuw_p ( 3 , b, a) != 0
642
+ }
643
+
644
+ pub trait VectorAllGe < Other > {
645
+ type Result ;
646
+ unsafe fn vec_all_ge ( self , b : Other ) -> Self :: Result ;
647
+ }
648
+
649
+ impl_vec_any_all ! { [ VectorAllGe vec_all_ge] (
650
+ vcmpgeub_all, vcmpgesb_all,
651
+ vcmpgeuh_all, vcmpgesh_all,
652
+ vcmpgeuw_all, vcmpgesw_all
653
+ ) }
654
+
655
+ // TODO: vsx encoding
656
+ #[ inline]
657
+ #[ target_feature( enable = "altivec" ) ]
658
+ #[ cfg_attr( test, assert_instr( vcmpgefp. ) ) ]
659
+ unsafe fn vcmpgefp_all ( a : vector_float , b : vector_float ) -> bool {
660
+ vcmpgefp_p ( 2 , a, b) != 0
661
+ }
662
+
663
+ impl VectorAllGe < vector_float > for vector_float {
664
+ type Result = bool ;
665
+ #[ inline]
666
+ unsafe fn vec_all_ge ( self , b : vector_float ) -> Self :: Result {
667
+ vcmpgefp_all ( self , b)
668
+ }
669
+ }
670
+
671
+ pub trait VectorAnyGe < Other > {
672
+ type Result ;
673
+ unsafe fn vec_any_ge ( self , b : Other ) -> Self :: Result ;
674
+ }
675
+
676
+ impl_vec_any_all ! { [ VectorAnyGe vec_any_ge] (
677
+ vcmpgeub_any, vcmpgesb_any,
678
+ vcmpgeuh_any, vcmpgesh_any,
679
+ vcmpgeuw_any, vcmpgesw_any
680
+ ) }
681
+
682
+ #[ inline]
683
+ #[ target_feature( enable = "altivec" ) ]
684
+ #[ cfg_attr( test, assert_instr( vcmpgefp. ) ) ]
685
+ unsafe fn vcmpgefp_any ( a : vector_float , b : vector_float ) -> bool {
686
+ vcmpgefp_p ( 1 , a, b) != 0
687
+ }
688
+
689
+ impl VectorAnyGe < vector_float > for vector_float {
690
+ type Result = bool ;
691
+ #[ inline]
692
+ unsafe fn vec_any_ge ( self , b : vector_float ) -> Self :: Result {
693
+ vcmpgefp_any ( self , b)
694
+ }
695
+ }
696
+
544
697
test_impl ! { vec_vceil( a: vector_float) -> vector_float [ vceil, vrfip / xvrspip ] }
545
698
546
699
test_impl ! { vec_vavgsb( a: vector_signed_char, b: vector_signed_char) -> vector_signed_char [ vavgsb, vavgsb ] }
@@ -1846,6 +1999,26 @@ where
1846
1999
a. vec_any_eq ( b)
1847
2000
}
1848
2001
2002
+ /// Vector All Elements Greater or Equal
2003
+ #[ inline]
2004
+ #[ target_feature( enable = "altivec" ) ]
2005
+ pub unsafe fn vec_all_ge < T , U > ( a : T , b : U ) -> <T as sealed:: VectorAllGe < U > >:: Result
2006
+ where
2007
+ T : sealed:: VectorAllGe < U > ,
2008
+ {
2009
+ a. vec_all_ge ( b)
2010
+ }
2011
+
2012
+ /// Vector Any Element Greater or Equal
2013
+ #[ inline]
2014
+ #[ target_feature( enable = "altivec" ) ]
2015
+ pub unsafe fn vec_any_ge < T , U > ( a : T , b : U ) -> <T as sealed:: VectorAnyGe < U > >:: Result
2016
+ where
2017
+ T : sealed:: VectorAnyGe < U > ,
2018
+ {
2019
+ a. vec_any_ge ( b)
2020
+ }
2021
+
1849
2022
#[ cfg( target_endian = "big" ) ]
1850
2023
mod endian {
1851
2024
use super :: * ;
@@ -2212,6 +2385,150 @@ mod tests {
2212
2385
true
2213
2386
}
2214
2387
2388
+ test_vec_2 ! { test_vec_all_ge_i8_false, vec_all_ge, i8x16 -> bool ,
2389
+ [ 1 , -1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
2390
+ [ 0 , 0 , -1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
2391
+ false
2392
+ }
2393
+
2394
+ test_vec_2 ! { test_vec_all_ge_u8_false, vec_all_ge, u8x16 -> bool ,
2395
+ [ 1 , 255 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
2396
+ [ 0 , 0 , 255 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
2397
+ false
2398
+ }
2399
+
2400
+ test_vec_2 ! { test_vec_all_ge_i16_false, vec_all_ge, i16x8 -> bool ,
2401
+ [ 1 , -1 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
2402
+ [ 0 , 0 , -1 , 1 , 0 , 0 , 0 , 0 ] ,
2403
+ false
2404
+ }
2405
+
2406
+ test_vec_2 ! { test_vec_all_ge_u16_false, vec_all_ge, u16x8 -> bool ,
2407
+ [ 1 , 255 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
2408
+ [ 0 , 0 , 255 , 1 , 0 , 0 , 0 , 0 ] ,
2409
+ false
2410
+ }
2411
+
2412
+ test_vec_2 ! { test_vec_all_ge_i32_false, vec_all_ge, i32x4 -> bool ,
2413
+ [ 1 , -1 , 0 , 0 ] ,
2414
+ [ 0 , -1 , 0 , 1 ] ,
2415
+ false
2416
+ }
2417
+
2418
+ test_vec_2 ! { test_vec_all_ge_u32_false, vec_all_ge, u32x4 -> bool ,
2419
+ [ 1 , 255 , 0 , 0 ] ,
2420
+ [ 0 , 255 , 1 , 1 ] ,
2421
+ false
2422
+ }
2423
+
2424
+ test_vec_2 ! { test_vec_all_ge_i8_true, vec_all_ge, i8x16 -> bool ,
2425
+ [ 0 , 0 , -1 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
2426
+ [ 0 , 0 , -1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
2427
+ true
2428
+ }
2429
+
2430
+ test_vec_2 ! { test_vec_all_ge_u8_true, vec_all_ge, u8x16 -> bool ,
2431
+ [ 1 , 255 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
2432
+ [ 1 , 255 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
2433
+ true
2434
+ }
2435
+
2436
+ test_vec_2 ! { test_vec_all_ge_i16_true, vec_all_ge, i16x8 -> bool ,
2437
+ [ 1 , -1 , 42 , 0 , 0 , 0 , 0 , 0 ] ,
2438
+ [ 1 , -5 , 2 , 0 , 0 , 0 , 0 , 0 ] ,
2439
+ true
2440
+ }
2441
+
2442
+ test_vec_2 ! { test_vec_all_ge_u16_true, vec_all_ge, u16x8 -> bool ,
2443
+ [ 42 , 255 , 1 , 0 , 0 , 0 , 0 , 0 ] ,
2444
+ [ 2 , 255 , 1 , 0 , 0 , 0 , 0 , 0 ] ,
2445
+ true
2446
+ }
2447
+
2448
+ test_vec_2 ! { test_vec_all_ge_i32_true, vec_all_ge, i32x4 -> bool ,
2449
+ [ 1 , -1 , 0 , 1 ] ,
2450
+ [ 0 , -1 , 0 , 1 ] ,
2451
+ true
2452
+ }
2453
+
2454
+ test_vec_2 ! { test_vec_all_ge_u32_true, vec_all_ge, u32x4 -> bool ,
2455
+ [ 1 , 255 , 0 , 1 ] ,
2456
+ [ 1 , 254 , 0 , 0 ] ,
2457
+ true
2458
+ }
2459
+
2460
+ test_vec_2 ! { test_vec_any_ge_i8_false, vec_any_ge, i8x16 -> bool ,
2461
+ [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
2462
+ [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ,
2463
+ false
2464
+ }
2465
+
2466
+ test_vec_2 ! { test_vec_any_ge_u8_false, vec_any_ge, u8x16 -> bool ,
2467
+ [ 1 , 254 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
2468
+ [ 42 , 255 , 255 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ,
2469
+ false
2470
+ }
2471
+
2472
+ test_vec_2 ! { test_vec_any_ge_i16_false, vec_any_ge, i16x8 -> bool ,
2473
+ [ 1 , -1 , -2 , 0 , 0 , 0 , 0 , 0 ] ,
2474
+ [ 2 , 0 , -1 , 1 , 1 , 1 , 1 , 1 ] ,
2475
+ false
2476
+ }
2477
+
2478
+ test_vec_2 ! { test_vec_any_ge_u16_false, vec_any_ge, u16x8 -> bool ,
2479
+ [ 1 , 2 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
2480
+ [ 2 , 42 , 255 , 1 , 1 , 1 , 1 , 1 ] ,
2481
+ false
2482
+ }
2483
+
2484
+ test_vec_2 ! { test_vec_any_ge_i32_false, vec_any_ge, i32x4 -> bool ,
2485
+ [ 1 , -1 , 0 , 0 ] ,
2486
+ [ 2 , 0 , 1 , 1 ] ,
2487
+ false
2488
+ }
2489
+
2490
+ test_vec_2 ! { test_vec_any_ge_u32_false, vec_any_ge, u32x4 -> bool ,
2491
+ [ 1 , 2 , 1 , 0 ] ,
2492
+ [ 4 , 255 , 4 , 1 ] ,
2493
+ false
2494
+ }
2495
+
2496
+ test_vec_2 ! { test_vec_any_ge_i8_true, vec_any_ge, i8x16 -> bool ,
2497
+ [ 1 , 0 , -1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
2498
+ [ 0 , 0 , -1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
2499
+ true
2500
+ }
2501
+
2502
+ test_vec_2 ! { test_vec_any_ge_u8_true, vec_any_ge, u8x16 -> bool ,
2503
+ [ 0 , 255 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
2504
+ [ 1 , 255 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
2505
+ true
2506
+ }
2507
+
2508
+ test_vec_2 ! { test_vec_any_ge_i16_true, vec_any_ge, i16x8 -> bool ,
2509
+ [ 0 , -1 , 1 , 0 , 0 , 0 , 0 , 0 ] ,
2510
+ [ 1 , -1 , 1 , 0 , 0 , 0 , 0 , 0 ] ,
2511
+ true
2512
+ }
2513
+
2514
+ test_vec_2 ! { test_vec_any_ge_u16_true, vec_any_ge, u16x8 -> bool ,
2515
+ [ 0 , 255 , 1 , 0 , 0 , 0 , 0 , 0 ] ,
2516
+ [ 1 , 255 , 1 , 0 , 0 , 0 , 0 , 0 ] ,
2517
+ true
2518
+ }
2519
+
2520
+ test_vec_2 ! { test_vec_any_ge_i32_true, vec_any_ge, i32x4 -> bool ,
2521
+ [ 0 , -1 , 0 , 1 ] ,
2522
+ [ 1 , -1 , 0 , 1 ] ,
2523
+ true
2524
+ }
2525
+
2526
+ test_vec_2 ! { test_vec_any_ge_u32_true, vec_any_ge, u32x4 -> bool ,
2527
+ [ 0 , 255 , 0 , 1 ] ,
2528
+ [ 1 , 255 , 0 , 1 ] ,
2529
+ true
2530
+ }
2531
+
2215
2532
#[ simd_test( enable = "altivec" ) ]
2216
2533
unsafe fn test_vec_cmpb ( ) {
2217
2534
let a: vector_float = transmute ( f32x4:: new ( 0.1 , 0.5 , 0.6 , 0.9 ) ) ;
0 commit comments