Skip to content

Commit eaf303c

Browse files
committed
add vec_meadd, vec_moadd, vec_mhadd and vec_mladd
1 parent fb94384 commit eaf303c

File tree

1 file changed

+237
-0
lines changed

1 file changed

+237
-0
lines changed

crates/core_arch/src/s390x/vector.rs

Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,38 @@ unsafe extern "unadjusted" {
217217
#[link_name = "llvm.s390.vmlhh"] fn vmlhh(a: vector_unsigned_short, b: vector_unsigned_short) -> vector_unsigned_short;
218218
#[link_name = "llvm.s390.vmlhf"] fn vmlhf(a: vector_unsigned_int, b: vector_unsigned_int) -> vector_unsigned_int;
219219

220+
#[link_name = "llvm.s390.vmaeb"] fn vmaeb(a: vector_signed_char, b: vector_signed_char, c: vector_signed_short) -> vector_signed_short;
221+
#[link_name = "llvm.s390.vmaeh"] fn vmaeh(a: vector_signed_short, b: vector_signed_short, c: vector_signed_int) -> vector_signed_int;
222+
#[link_name = "llvm.s390.vmaef"] fn vmaef(a: vector_signed_int, b: vector_signed_int, c: vector_signed_long_long) -> vector_signed_long_long;
223+
224+
#[link_name = "llvm.s390.vmaleb"] fn vmaleb(a: vector_unsigned_char, b: vector_unsigned_char, c: vector_unsigned_short) -> vector_unsigned_short;
225+
#[link_name = "llvm.s390.vmaleh"] fn vmaleh(a: vector_unsigned_short, b: vector_unsigned_short, c: vector_unsigned_int) -> vector_unsigned_int;
226+
#[link_name = "llvm.s390.vmalef"] fn vmalef(a: vector_unsigned_int, b: vector_unsigned_int, c: vector_unsigned_long_long) -> vector_unsigned_long_long;
227+
228+
#[link_name = "llvm.s390.vmaob"] fn vmaob(a: vector_signed_char, b: vector_signed_char, c: vector_signed_short) -> vector_signed_short;
229+
#[link_name = "llvm.s390.vmaoh"] fn vmaoh(a: vector_signed_short, b: vector_signed_short, c: vector_signed_int) -> vector_signed_int;
230+
#[link_name = "llvm.s390.vmaof"] fn vmaof(a: vector_signed_int, b: vector_signed_int, c: vector_signed_long_long) -> vector_signed_long_long;
231+
232+
#[link_name = "llvm.s390.vmalob"] fn vmalob(a: vector_unsigned_char, b: vector_unsigned_char, c: vector_unsigned_short) -> vector_unsigned_short;
233+
#[link_name = "llvm.s390.vmaloh"] fn vmaloh(a: vector_unsigned_short, b: vector_unsigned_short, c: vector_unsigned_int) -> vector_unsigned_int;
234+
#[link_name = "llvm.s390.vmalof"] fn vmalof(a: vector_unsigned_int, b: vector_unsigned_int, c: vector_unsigned_long_long) -> vector_unsigned_long_long;
235+
236+
#[link_name = "llvm.s390.vmahb"] fn vmahb(a: vector_signed_char, b: vector_signed_char, c: vector_signed_char) -> vector_signed_char;
237+
#[link_name = "llvm.s390.vmahh"] fn vmahh(a: vector_signed_short, b: vector_signed_short, c: vector_signed_short) -> vector_signed_short;
238+
#[link_name = "llvm.s390.vmahf"] fn vmahf(a: vector_signed_int, b: vector_signed_int, c: vector_signed_int) -> vector_signed_int;
239+
240+
#[link_name = "llvm.s390.vmalhb"] fn vmalhb(a: vector_unsigned_char, b: vector_unsigned_char, c: vector_unsigned_char) -> vector_unsigned_char;
241+
#[link_name = "llvm.s390.vmalhh"] fn vmalhh(a: vector_unsigned_short, b: vector_unsigned_short, c: vector_unsigned_short) -> vector_unsigned_short;
242+
#[link_name = "llvm.s390.vmalhf"] fn vmalhf(a: vector_unsigned_int, b: vector_unsigned_int, c: vector_unsigned_int) -> vector_unsigned_int;
243+
244+
#[link_name = "llvm.s390.vmalb"] fn vmalb(a: vector_signed_char, b: vector_signed_char, c: vector_signed_char) -> vector_signed_char;
245+
#[link_name = "llvm.s390.vmalh"] fn vmalh(a: vector_signed_short, b: vector_signed_short, c: vector_signed_short) -> vector_signed_short;
246+
#[link_name = "llvm.s390.vmalf"] fn vmalf(a: vector_signed_int, b: vector_signed_int, c: vector_signed_int) -> vector_signed_int;
247+
248+
#[link_name = "llvm.s390.vmallb"] fn vmallb(a: vector_unsigned_char, b: vector_unsigned_char, c: vector_unsigned_char) -> vector_unsigned_char;
249+
#[link_name = "llvm.s390.vmallh"] fn vmallh(a: vector_unsigned_short, b: vector_unsigned_short, c: vector_unsigned_short) -> vector_unsigned_short;
250+
#[link_name = "llvm.s390.vmallf"] fn vmallf(a: vector_unsigned_int, b: vector_unsigned_int, c: vector_unsigned_int) -> vector_unsigned_int;
251+
220252
#[link_name = "llvm.s390.vgfmb"] fn vgfmb(a: vector_unsigned_char, b: vector_unsigned_char) -> vector_unsigned_short;
221253
#[link_name = "llvm.s390.vgfmh"] fn vgfmh(a: vector_unsigned_short, b: vector_unsigned_short) -> vector_unsigned_int;
222254
#[link_name = "llvm.s390.vgfmf"] fn vgfmf(a: vector_unsigned_int, b: vector_unsigned_int) -> vector_unsigned_long_long;
@@ -2594,6 +2626,17 @@ mod sealed {
25942626
}
25952627
}
25962628
};
2629+
([$Trait:ident $m:ident] $fun:ident ($a:ty, $b:ty, $c:ty) -> $r:ty) => {
2630+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
2631+
impl $Trait for $a {
2632+
type Result = $r;
2633+
#[inline]
2634+
#[target_feature(enable = "vector")]
2635+
unsafe fn $m(self, b: $b, c: $c) -> $r {
2636+
$fun(self, b, c)
2637+
}
2638+
}
2639+
};
25972640
}
25982641

25992642
#[unstable(feature = "stdarch_s390x", issue = "135681")]
@@ -2678,6 +2721,100 @@ mod sealed {
26782721
impl_mul!([VectorMulh vec_mulh] vec_vmlhh (vector_unsigned_short, vector_unsigned_short) -> vector_unsigned_short);
26792722
impl_mul!([VectorMulh vec_mulh] vec_vmlhf (vector_unsigned_int, vector_unsigned_int) -> vector_unsigned_int);
26802723

2724+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
2725+
pub trait VectorMeadd {
2726+
type Result;
2727+
unsafe fn vec_meadd(self, b: Self, c: Self::Result) -> Self::Result;
2728+
}
2729+
2730+
test_impl! { vec_vmaeb(a: vector_signed_char, b: vector_signed_char, c: vector_signed_short) -> vector_signed_short [ vmaeb, vmaeb ] }
2731+
test_impl! { vec_vmaeh(a: vector_signed_short, b: vector_signed_short, c: vector_signed_int) -> vector_signed_int[ vmaeh, vmaeh ] }
2732+
test_impl! { vec_vmaef(a: vector_signed_int, b: vector_signed_int, c: vector_signed_long_long) -> vector_signed_long_long [ vmaef, vmaef ] }
2733+
2734+
test_impl! { vec_vmaleb(a: vector_unsigned_char, b: vector_unsigned_char, c: vector_unsigned_short) -> vector_unsigned_short [ vmaleb, vmaleb ] }
2735+
test_impl! { vec_vmaleh(a: vector_unsigned_short, b: vector_unsigned_short, c: vector_unsigned_int) -> vector_unsigned_int[ vmaleh, vmaleh ] }
2736+
test_impl! { vec_vmalef(a: vector_unsigned_int, b: vector_unsigned_int, c: vector_unsigned_long_long) -> vector_unsigned_long_long [ vmalef, vmalef ] }
2737+
2738+
impl_mul!([VectorMeadd vec_meadd] vec_vmaeb (vector_signed_char, vector_signed_char, vector_signed_short) -> vector_signed_short );
2739+
impl_mul!([VectorMeadd vec_meadd] vec_vmaeh (vector_signed_short, vector_signed_short, vector_signed_int) -> vector_signed_int);
2740+
impl_mul!([VectorMeadd vec_meadd] vec_vmaef (vector_signed_int, vector_signed_int, vector_signed_long_long) -> vector_signed_long_long );
2741+
2742+
impl_mul!([VectorMeadd vec_meadd] vec_vmaleb (vector_unsigned_char, vector_unsigned_char, vector_unsigned_short) -> vector_unsigned_short );
2743+
impl_mul!([VectorMeadd vec_meadd] vec_vmaleh (vector_unsigned_short, vector_unsigned_short, vector_unsigned_int) -> vector_unsigned_int);
2744+
impl_mul!([VectorMeadd vec_meadd] vec_vmalef (vector_unsigned_int, vector_unsigned_int, vector_unsigned_long_long) -> vector_unsigned_long_long );
2745+
2746+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
2747+
pub trait VectorMoadd {
2748+
type Result;
2749+
unsafe fn vec_moadd(self, b: Self, c: Self::Result) -> Self::Result;
2750+
}
2751+
2752+
test_impl! { vec_vmaob(a: vector_signed_char, b: vector_signed_char, c: vector_signed_short) -> vector_signed_short [ vmaob, vmaob ] }
2753+
test_impl! { vec_vmaoh(a: vector_signed_short, b: vector_signed_short, c: vector_signed_int) -> vector_signed_int[ vmaoh, vmaoh ] }
2754+
test_impl! { vec_vmaof(a: vector_signed_int, b: vector_signed_int, c: vector_signed_long_long) -> vector_signed_long_long [ vmaof, vmaof ] }
2755+
2756+
test_impl! { vec_vmalob(a: vector_unsigned_char, b: vector_unsigned_char, c: vector_unsigned_short) -> vector_unsigned_short [ vmalob, vmalob ] }
2757+
test_impl! { vec_vmaloh(a: vector_unsigned_short, b: vector_unsigned_short, c: vector_unsigned_int) -> vector_unsigned_int[ vmaloh, vmaloh ] }
2758+
test_impl! { vec_vmalof(a: vector_unsigned_int, b: vector_unsigned_int, c: vector_unsigned_long_long) -> vector_unsigned_long_long [ vmalof, vmalof ] }
2759+
2760+
impl_mul!([VectorMoadd vec_moadd] vec_vmaob (vector_signed_char, vector_signed_char, vector_signed_short) -> vector_signed_short );
2761+
impl_mul!([VectorMoadd vec_moadd] vec_vmaoh (vector_signed_short, vector_signed_short, vector_signed_int) -> vector_signed_int);
2762+
impl_mul!([VectorMoadd vec_moadd] vec_vmaof (vector_signed_int, vector_signed_int, vector_signed_long_long) -> vector_signed_long_long );
2763+
2764+
impl_mul!([VectorMoadd vec_moadd] vec_vmalob (vector_unsigned_char, vector_unsigned_char, vector_unsigned_short) -> vector_unsigned_short );
2765+
impl_mul!([VectorMoadd vec_moadd] vec_vmaloh (vector_unsigned_short, vector_unsigned_short, vector_unsigned_int) -> vector_unsigned_int);
2766+
impl_mul!([VectorMoadd vec_moadd] vec_vmalof (vector_unsigned_int, vector_unsigned_int, vector_unsigned_long_long) -> vector_unsigned_long_long );
2767+
2768+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
2769+
pub trait VectorMhadd {
2770+
type Result;
2771+
unsafe fn vec_mhadd(self, b: Self, c: Self::Result) -> Self::Result;
2772+
}
2773+
2774+
test_impl! { vec_vmahb(a: vector_signed_char, b: vector_signed_char, c: vector_signed_char) -> vector_signed_char [ vmahb, vmahb ] }
2775+
test_impl! { vec_vmahh(a: vector_signed_short, b: vector_signed_short, c: vector_signed_short) -> vector_signed_short[ vmahh, vmahh ] }
2776+
test_impl! { vec_vmahf(a: vector_signed_int, b: vector_signed_int, c: vector_signed_int) -> vector_signed_int [ vmahf, vmahf ] }
2777+
2778+
test_impl! { vec_vmalhb(a: vector_unsigned_char, b: vector_unsigned_char, c: vector_unsigned_char) -> vector_unsigned_char [ vmalhb, vmalhb ] }
2779+
test_impl! { vec_vmalhh(a: vector_unsigned_short, b: vector_unsigned_short, c: vector_unsigned_short) -> vector_unsigned_short[ vmalhh, vmalhh ] }
2780+
test_impl! { vec_vmalhf(a: vector_unsigned_int, b: vector_unsigned_int, c: vector_unsigned_int) -> vector_unsigned_int [ vmalhf, vmalhf ] }
2781+
2782+
impl_mul!([VectorMhadd vec_mhadd] vec_vmahb (vector_signed_char, vector_signed_char, vector_signed_char) -> vector_signed_char );
2783+
impl_mul!([VectorMhadd vec_mhadd] vec_vmahh (vector_signed_short, vector_signed_short, vector_signed_short) -> vector_signed_short);
2784+
impl_mul!([VectorMhadd vec_mhadd] vec_vmahf (vector_signed_int, vector_signed_int, vector_signed_int) -> vector_signed_int );
2785+
2786+
impl_mul!([VectorMhadd vec_mhadd] vec_vmalhb (vector_unsigned_char, vector_unsigned_char, vector_unsigned_char) -> vector_unsigned_char );
2787+
impl_mul!([VectorMhadd vec_mhadd] vec_vmalhh (vector_unsigned_short, vector_unsigned_short, vector_unsigned_short) -> vector_unsigned_short);
2788+
impl_mul!([VectorMhadd vec_mhadd] vec_vmalhf (vector_unsigned_int, vector_unsigned_int, vector_unsigned_int) -> vector_unsigned_int );
2789+
2790+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
2791+
pub trait VectorMladd {
2792+
type Result;
2793+
unsafe fn vec_mladd(self, b: Self, c: Self::Result) -> Self::Result;
2794+
}
2795+
2796+
#[inline]
2797+
#[target_feature(enable = "vector")]
2798+
unsafe fn simd_mladd<T>(a: T, b: T, c: T) -> T {
2799+
simd_add(simd_mul(a, b), c)
2800+
}
2801+
2802+
test_impl! { vec_vmal_ib(a: vector_signed_char, b: vector_signed_char, c: vector_signed_char) -> vector_signed_char [simd_mladd, vmalb ] }
2803+
test_impl! { vec_vmal_ih(a: vector_signed_short, b: vector_signed_short, c: vector_signed_short) -> vector_signed_short[simd_mladd, vmalh ] }
2804+
test_impl! { vec_vmal_if(a: vector_signed_int, b: vector_signed_int, c: vector_signed_int) -> vector_signed_int [simd_mladd, vmalf ] }
2805+
2806+
test_impl! { vec_vmal_ub(a: vector_unsigned_char, b: vector_unsigned_char, c: vector_unsigned_char) -> vector_unsigned_char [simd_mladd, vmalb ] }
2807+
test_impl! { vec_vmal_uh(a: vector_unsigned_short, b: vector_unsigned_short, c: vector_unsigned_short) -> vector_unsigned_short[simd_mladd, vmalh ] }
2808+
test_impl! { vec_vmal_uf(a: vector_unsigned_int, b: vector_unsigned_int, c: vector_unsigned_int) -> vector_unsigned_int [simd_mladd, vmalf ] }
2809+
2810+
impl_mul!([VectorMladd vec_mladd] vec_vmal_ib (vector_signed_char, vector_signed_char, vector_signed_char) -> vector_signed_char );
2811+
impl_mul!([VectorMladd vec_mladd] vec_vmal_ih (vector_signed_short, vector_signed_short, vector_signed_short) -> vector_signed_short);
2812+
impl_mul!([VectorMladd vec_mladd] vec_vmal_if (vector_signed_int, vector_signed_int, vector_signed_int) -> vector_signed_int );
2813+
2814+
impl_mul!([VectorMladd vec_mladd] vec_vmal_ub (vector_unsigned_char, vector_unsigned_char, vector_unsigned_char) -> vector_unsigned_char );
2815+
impl_mul!([VectorMladd vec_mladd] vec_vmal_uh (vector_unsigned_short, vector_unsigned_short, vector_unsigned_short) -> vector_unsigned_short);
2816+
impl_mul!([VectorMladd vec_mladd] vec_vmal_uf (vector_unsigned_int, vector_unsigned_int, vector_unsigned_int) -> vector_unsigned_int );
2817+
26812818
#[unstable(feature = "stdarch_s390x", issue = "135681")]
26822819
pub trait VectorGfmsum<Result> {
26832820
unsafe fn vec_gfmsum(self, b: Self) -> Result;
@@ -4769,6 +4906,38 @@ pub unsafe fn vec_msub<T: sealed::VectorMadd>(a: T, b: T, c: T) -> T {
47694906
a.vec_msub(b, c)
47704907
}
47714908

4909+
/// Vector Multiply and Add Even
4910+
#[inline]
4911+
#[target_feature(enable = "vector-packed-decimal")]
4912+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
4913+
pub unsafe fn vec_meadd<T: sealed::VectorMeadd>(a: T, b: T, c: T::Result) -> T::Result {
4914+
a.vec_meadd(b, c)
4915+
}
4916+
4917+
/// Vector Multiply and Add Odd
4918+
#[inline]
4919+
#[target_feature(enable = "vector-packed-decimal")]
4920+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
4921+
pub unsafe fn vec_moadd<T: sealed::VectorMoadd>(a: T, b: T, c: T::Result) -> T::Result {
4922+
a.vec_moadd(b, c)
4923+
}
4924+
4925+
/// Vector Multiply and Add High
4926+
#[inline]
4927+
#[target_feature(enable = "vector-packed-decimal")]
4928+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
4929+
pub unsafe fn vec_mhadd<T: sealed::VectorMhadd>(a: T, b: T, c: T::Result) -> T::Result {
4930+
a.vec_mhadd(b, c)
4931+
}
4932+
4933+
/// Vector Multiply and Add Low
4934+
#[inline]
4935+
#[target_feature(enable = "vector-packed-decimal")]
4936+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
4937+
pub unsafe fn vec_mladd<T: sealed::VectorMladd>(a: T, b: T, c: T::Result) -> T::Result {
4938+
a.vec_mladd(b, c)
4939+
}
4940+
47724941
/// Vector Checksum
47734942
#[inline]
47744943
#[target_feature(enable = "vector")]
@@ -7032,4 +7201,72 @@ mod tests {
70327201
[1.0, f32::NAN, 5.0, 3.14],
70337202
[0, !0, !0, !0]
70347203
}
7204+
7205+
#[simd_test(enable = "vector")]
7206+
fn test_vec_meadd() {
7207+
let a = vector_unsigned_short([1, 0, 2, 0, 3, 0, 4, 0]);
7208+
let b = vector_unsigned_short([5, 0, 6, 0, 7, 0, 8, 0]);
7209+
let c = vector_unsigned_int([2, 2, 2, 2]);
7210+
7211+
let d = unsafe { vec_meadd(a, b, c) };
7212+
assert_eq!(d.as_array(), &[7, 14, 23, 34]);
7213+
7214+
let a = vector_signed_short([1, 0, 2, 0, 3, 0, 4, 0]);
7215+
let b = vector_signed_short([5, 0, 6, 0, 7, 0, 8, 0]);
7216+
let c = vector_signed_int([2, -2, 2, -2]);
7217+
7218+
let d = unsafe { vec_meadd(a, b, c) };
7219+
assert_eq!(d.as_array(), &[7, 10, 23, 30]);
7220+
}
7221+
7222+
#[simd_test(enable = "vector")]
7223+
fn test_vec_moadd() {
7224+
let a = vector_unsigned_short([0, 1, 0, 2, 0, 3, 0, 4]);
7225+
let b = vector_unsigned_short([0, 5, 0, 6, 0, 7, 0, 8]);
7226+
let c = vector_unsigned_int([2, 2, 2, 2]);
7227+
7228+
let d = unsafe { vec_moadd(a, b, c) };
7229+
assert_eq!(d.as_array(), &[7, 14, 23, 34]);
7230+
7231+
let a = vector_signed_short([0, 1, 0, 2, 0, 3, 0, 4]);
7232+
let b = vector_signed_short([0, 5, 0, 6, 0, 7, 0, 8]);
7233+
let c = vector_signed_int([2, -2, 2, -2]);
7234+
7235+
let d = unsafe { vec_moadd(a, b, c) };
7236+
assert_eq!(d.as_array(), &[7, 10, 23, 30]);
7237+
}
7238+
7239+
#[simd_test(enable = "vector")]
7240+
fn test_vec_mhadd() {
7241+
let a = vector_unsigned_int([1, 2, 3, 4]);
7242+
let b = vector_unsigned_int([5, 6, 7, 8]);
7243+
let c = vector_unsigned_int([u32::MAX; 4]);
7244+
7245+
let d = unsafe { vec_mhadd(a, b, c) };
7246+
assert_eq!(d.as_array(), &[1, 1, 1, 1]);
7247+
7248+
let a = vector_signed_int([-1, -2, -3, -4]);
7249+
let b = vector_signed_int([5, 6, 7, 8]);
7250+
let c = vector_signed_int([i32::MIN; 4]);
7251+
7252+
let d = unsafe { vec_mhadd(a, b, c) };
7253+
assert_eq!(d.as_array(), &[-1, -1, -1, -1]);
7254+
}
7255+
7256+
#[simd_test(enable = "vector")]
7257+
fn test_vec_mladd() {
7258+
let a = vector_unsigned_int([1, 2, 3, 4]);
7259+
let b = vector_unsigned_int([5, 6, 7, 8]);
7260+
let c = vector_unsigned_int([2, 2, 2, 2]);
7261+
7262+
let d = unsafe { vec_mladd(a, b, c) };
7263+
assert_eq!(d.as_array(), &[7, 14, 23, 34]);
7264+
7265+
let a = vector_signed_int([-1, -2, -3, -4]);
7266+
let b = vector_signed_int([5, 6, 7, 8]);
7267+
let c = vector_signed_int([2, 2, 2, 2]);
7268+
7269+
let d = unsafe { vec_mladd(a, b, c) };
7270+
assert_eq!(d.as_array(), &[-3, -10, -19, -30]);
7271+
}
70357272
}

0 commit comments

Comments
 (0)