@@ -290,6 +290,11 @@ extern "C" {
290
290
fn vcfsx ( a : vector_signed_int , b : i32 ) -> vector_float ;
291
291
#[ link_name = "llvm.ppc.altivec.vcfux" ]
292
292
fn vcfux ( a : vector_unsigned_int , b : i32 ) -> vector_float ;
293
+
294
+ #[ link_name = "llvm.ppc.altivec.vctsxs" ]
295
+ fn vctsxs ( a : vector_float , b : i32 ) -> vector_signed_int ;
296
+ #[ link_name = "llvm.ppc.altivec.vctuxs" ]
297
+ fn vctuxs ( a : vector_float , b : i32 ) -> vector_unsigned_int ;
293
298
}
294
299
295
300
macro_rules! s_t_l {
@@ -2268,6 +2273,26 @@ where
2268
2273
a. vec_ctf :: < IMM5 > ( )
2269
2274
}
2270
2275
2276
+ /// Vector Convert to Signed Integer
2277
+ #[ inline]
2278
+ #[ target_feature( enable = "altivec" ) ]
2279
+ #[ cfg_attr( test, assert_instr( vctsxs, IMM5 = 1 ) ) ]
2280
+ pub unsafe fn vec_cts < const IMM5 : i32 > ( a : vector_float ) -> vector_signed_int {
2281
+ static_assert_uimm_bits ! ( IMM5 , 5 ) ;
2282
+
2283
+ vctsxs ( a, IMM5 )
2284
+ }
2285
+
2286
+ /// Vector Convert to Signed Integer
2287
+ #[ inline]
2288
+ #[ target_feature( enable = "altivec" ) ]
2289
+ #[ cfg_attr( test, assert_instr( vctuxs, IMM5 = 1 ) ) ]
2290
+ pub unsafe fn vec_ctu < const IMM5 : i32 > ( a : vector_float ) -> vector_unsigned_int {
2291
+ static_assert_uimm_bits ! ( IMM5 , 5 ) ;
2292
+
2293
+ vctuxs ( a, IMM5 )
2294
+ }
2295
+
2271
2296
/// Endian-biased intrinsics
2272
2297
#[ cfg( target_endian = "little" ) ]
2273
2298
mod endian {
@@ -4560,7 +4585,7 @@ mod tests {
4560
4585
4561
4586
#[ simd_test( enable = "altivec" ) ]
4562
4587
unsafe fn vec_ctf_u32 ( ) {
4563
- let v: vector_unsigned_int = transmute ( u32x4:: new ( 0 , u32:: MAX , u32:: MAX - 42 , 42 ) ) ;
4588
+ let v: vector_unsigned_int = transmute ( u32x4:: new ( u32 :: MIN , u32:: MAX , u32:: MAX , 42 ) ) ;
4564
4589
let v2 = vec_ctf :: < 1 , _ > ( v) ;
4565
4590
let r2: vector_float = transmute ( f32x4:: new ( 0.0 , 2147483600.0 , 2147483600.0 , 21.0 ) ) ;
4566
4591
let v4 = vec_ctf :: < 2 , _ > ( v) ;
@@ -4581,4 +4606,84 @@ mod tests {
4581
4606
check ( v4, r4) ;
4582
4607
check ( v8, r8) ;
4583
4608
}
4609
+
4610
+ #[ simd_test( enable = "altivec" ) ]
4611
+ unsafe fn test_vec_ctu ( ) {
4612
+ let v = u32x4:: new ( u32:: MIN , u32:: MAX , u32:: MAX , 42 ) ;
4613
+ let v2: u32x4 = transmute ( vec_ctu :: < 1 > ( transmute ( f32x4:: new (
4614
+ 0.0 ,
4615
+ 2147483600.0 ,
4616
+ 2147483600.0 ,
4617
+ 21.0 ,
4618
+ ) ) ) ) ;
4619
+ let v4: u32x4 = transmute ( vec_ctu :: < 2 > ( transmute ( f32x4:: new (
4620
+ 0.0 ,
4621
+ 1073741800.0 ,
4622
+ 1073741800.0 ,
4623
+ 10.5 ,
4624
+ ) ) ) ) ;
4625
+ let v8: u32x4 = transmute ( vec_ctu :: < 3 > ( transmute ( f32x4:: new (
4626
+ 0.0 ,
4627
+ 536870900.0 ,
4628
+ 536870900.0 ,
4629
+ 5.25 ,
4630
+ ) ) ) ) ;
4631
+
4632
+ assert_eq ! ( v2, v) ;
4633
+ assert_eq ! ( v4, v) ;
4634
+ assert_eq ! ( v8, v) ;
4635
+ }
4636
+
4637
+ #[ simd_test( enable = "altivec" ) ]
4638
+ unsafe fn vec_ctf_i32 ( ) {
4639
+ let v: vector_signed_int = transmute ( i32x4:: new ( i32:: MIN , i32:: MAX , i32:: MAX - 42 , 42 ) ) ;
4640
+ let v2 = vec_ctf :: < 1 , _ > ( v) ;
4641
+ let r2: vector_float =
4642
+ transmute ( f32x4:: new ( -1073741800.0 , 1073741800.0 , 1073741800.0 , 21.0 ) ) ;
4643
+ let v4 = vec_ctf :: < 2 , _ > ( v) ;
4644
+ let r4: vector_float = transmute ( f32x4:: new ( -536870900.0 , 536870900.0 , 536870900.0 , 10.5 ) ) ;
4645
+ let v8 = vec_ctf :: < 3 , _ > ( v) ;
4646
+ let r8: vector_float = transmute ( f32x4:: new ( -268435460.0 , 268435460.0 , 268435460.0 , 5.25 ) ) ;
4647
+
4648
+ let check = |a, b| {
4649
+ let r = transmute ( vec_cmple (
4650
+ vec_abs ( vec_sub ( a, b) ) ,
4651
+ vec_splats ( std:: f32:: EPSILON ) ,
4652
+ ) ) ;
4653
+ println ! ( "{:?} {:?}" , a, b) ;
4654
+ let e = m32x4:: new ( true , true , true , true ) ;
4655
+ assert_eq ! ( e, r) ;
4656
+ } ;
4657
+
4658
+ check ( v2, r2) ;
4659
+ check ( v4, r4) ;
4660
+ check ( v8, r8) ;
4661
+ }
4662
+
4663
+ #[ simd_test( enable = "altivec" ) ]
4664
+ unsafe fn test_vec_cts ( ) {
4665
+ let v = i32x4:: new ( i32:: MIN , i32:: MAX , i32:: MAX , 42 ) ;
4666
+ let v2: i32x4 = transmute ( vec_cts :: < 1 > ( transmute ( f32x4:: new (
4667
+ -1073741800.0 ,
4668
+ 1073741800.0 ,
4669
+ 1073741800.0 ,
4670
+ 21.0 ,
4671
+ ) ) ) ) ;
4672
+ let v4: i32x4 = transmute ( vec_cts :: < 2 > ( transmute ( f32x4:: new (
4673
+ -536870900.0 ,
4674
+ 536870900.0 ,
4675
+ 536870900.0 ,
4676
+ 10.5 ,
4677
+ ) ) ) ) ;
4678
+ let v8: i32x4 = transmute ( vec_cts :: < 3 > ( transmute ( f32x4:: new (
4679
+ -268435460.0 ,
4680
+ 268435460.0 ,
4681
+ 268435460.0 ,
4682
+ 5.25 ,
4683
+ ) ) ) ) ;
4684
+
4685
+ assert_eq ! ( v2, v) ;
4686
+ assert_eq ! ( v4, v) ;
4687
+ assert_eq ! ( v8, v) ;
4688
+ }
4584
4689
}
0 commit comments