Skip to content

Commit 461aad2

Browse files
lu-zeroAmanieu
authored andcommitted
Add vec_cts and vec_ctu
1 parent b5d2d36 commit 461aad2

File tree

1 file changed

+106
-1
lines changed

1 file changed

+106
-1
lines changed

crates/core_arch/src/powerpc/altivec.rs

Lines changed: 106 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,11 @@ extern "C" {
290290
fn vcfsx(a: vector_signed_int, b: i32) -> vector_float;
291291
#[link_name = "llvm.ppc.altivec.vcfux"]
292292
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;
293298
}
294299

295300
macro_rules! s_t_l {
@@ -2268,6 +2273,26 @@ where
22682273
a.vec_ctf::<IMM5>()
22692274
}
22702275

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+
22712296
/// Endian-biased intrinsics
22722297
#[cfg(target_endian = "little")]
22732298
mod endian {
@@ -4560,7 +4585,7 @@ mod tests {
45604585

45614586
#[simd_test(enable = "altivec")]
45624587
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));
45644589
let v2 = vec_ctf::<1, _>(v);
45654590
let r2: vector_float = transmute(f32x4::new(0.0, 2147483600.0, 2147483600.0, 21.0));
45664591
let v4 = vec_ctf::<2, _>(v);
@@ -4581,4 +4606,84 @@ mod tests {
45814606
check(v4, r4);
45824607
check(v8, r8);
45834608
}
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+
}
45844689
}

0 commit comments

Comments
 (0)