Skip to content

Commit 5f94a7d

Browse files
lu-zeroAmanieu
authored andcommitted
Add vec_st, vec_stl, vec_ste
1 parent 0611a8c commit 5f94a7d

File tree

1 file changed

+175
-0
lines changed

1 file changed

+175
-0
lines changed

crates/core_arch/src/powerpc/altivec.rs

+175
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,19 @@ extern "C" {
7575
#[link_name = "llvm.ppc.altivec.lvxl"]
7676
fn lvxl(p: *const i8) -> vector_unsigned_int;
7777

78+
#[link_name = "llvm.ppc.altivec.stvx"]
79+
fn stvx(a: vector_signed_int, p: *const i8);
80+
81+
#[link_name = "llvm.ppc.altivec.stvebx"]
82+
fn stvebx(a: vector_signed_char, p: *const i8);
83+
#[link_name = "llvm.ppc.altivec.stvehx"]
84+
fn stvehx(a: vector_signed_short, p: *const i8);
85+
#[link_name = "llvm.ppc.altivec.stvewx"]
86+
fn stvewx(a: vector_signed_int, p: *const i8);
87+
88+
#[link_name = "llvm.ppc.altivec.stvxl"]
89+
fn stvxl(a: vector_signed_int, p: *const i8);
90+
7891
#[link_name = "llvm.ppc.altivec.vperm"]
7992
fn vperm(
8093
a: vector_signed_int,
@@ -606,6 +619,98 @@ mod sealed {
606619

607620
impl_vec_lde! { vec_lde_f32 lvewx f32 }
608621

622+
#[unstable(feature = "stdarch_powerpc", issue = "111145")]
623+
pub trait VectorSt {
624+
type Target;
625+
unsafe fn vec_st(self, off: isize, p: Self::Target);
626+
unsafe fn vec_stl(self, off: isize, p: Self::Target);
627+
}
628+
629+
macro_rules! impl_vec_st {
630+
($fun:ident $fun_lru:ident $ty:ident) => {
631+
#[inline]
632+
#[target_feature(enable = "altivec")]
633+
#[cfg_attr(test, assert_instr(stvx))]
634+
pub unsafe fn $fun(a: t_t_l!($ty), off: isize, p: *const $ty) {
635+
let addr = (p as *const i8).offset(off);
636+
stvx(transmute(a), addr)
637+
}
638+
639+
#[inline]
640+
#[target_feature(enable = "altivec")]
641+
#[cfg_attr(test, assert_instr(stvxl))]
642+
pub unsafe fn $fun_lru(a: t_t_l!($ty), off: isize, p: *const $ty) {
643+
let addr = (p as *const i8).offset(off as isize);
644+
stvxl(transmute(a), addr)
645+
}
646+
647+
#[unstable(feature = "stdarch_powerpc", issue = "111145")]
648+
impl VectorSt for t_t_l!($ty) {
649+
type Target = *const $ty;
650+
#[inline]
651+
#[target_feature(enable = "altivec")]
652+
unsafe fn vec_st(self, off: isize, p: Self::Target) {
653+
$fun(self, off, p)
654+
}
655+
#[inline]
656+
#[target_feature(enable = "altivec")]
657+
unsafe fn vec_stl(self, off: isize, p: Self::Target) {
658+
$fun(self, off, p)
659+
}
660+
}
661+
};
662+
}
663+
664+
impl_vec_st! { vec_st_u8 vec_stl_u8 u8 }
665+
impl_vec_st! { vec_st_i8 vec_stl_i8 i8 }
666+
667+
impl_vec_st! { vec_st_u16 vec_stl_u16 u16 }
668+
impl_vec_st! { vec_st_i16 vec_stl_i16 i16 }
669+
670+
impl_vec_st! { vec_st_u32 vec_stl_u32 u32 }
671+
impl_vec_st! { vec_st_i32 vec_stl_i32 i32 }
672+
673+
impl_vec_st! { vec_st_f32 vec_stl_f32 f32 }
674+
675+
#[unstable(feature = "stdarch_powerpc", issue = "111145")]
676+
pub trait VectorSte {
677+
type Target;
678+
unsafe fn vec_ste(self, off: isize, p: Self::Target);
679+
}
680+
681+
macro_rules! impl_vec_ste {
682+
($fun:ident $instr:ident $ty:ident) => {
683+
#[inline]
684+
#[target_feature(enable = "altivec")]
685+
#[cfg_attr(test, assert_instr($instr))]
686+
pub unsafe fn $fun(a: t_t_l!($ty), off: isize, p: *const $ty) {
687+
let addr = (p as *const i8).offset(off);
688+
$instr(transmute(a), addr)
689+
}
690+
691+
#[unstable(feature = "stdarch_powerpc", issue = "111145")]
692+
impl VectorSte for t_t_l!($ty) {
693+
type Target = *const $ty;
694+
#[inline]
695+
#[target_feature(enable = "altivec")]
696+
unsafe fn vec_ste(self, off: isize, p: Self::Target) {
697+
$fun(self, off, p)
698+
}
699+
}
700+
};
701+
}
702+
703+
impl_vec_ste! { vec_ste_u8 stvebx u8 }
704+
impl_vec_ste! { vec_ste_i8 stvebx i8 }
705+
706+
impl_vec_ste! { vec_ste_u16 stvehx u16 }
707+
impl_vec_ste! { vec_ste_i16 stvehx i16 }
708+
709+
impl_vec_ste! { vec_ste_u32 stvewx u32 }
710+
impl_vec_ste! { vec_ste_i32 stvewx i32 }
711+
712+
impl_vec_ste! { vec_ste_f32 stvewx f32 }
713+
609714
#[unstable(feature = "stdarch_powerpc", issue = "111145")]
610715
pub trait VectorXl {
611716
type Result;
@@ -3270,6 +3375,76 @@ where
32703375
p.vec_lde(off)
32713376
}
32723377

3378+
/// Vector Store Indexed
3379+
///
3380+
/// ## Purpose
3381+
/// Stores a 16-byte vector into memory at the address specified by a displacement and a
3382+
/// pointer, ignoring the four low-order bits of the calculated address.
3383+
///
3384+
/// ## Operation
3385+
/// A memory address is obtained by adding b and c, and masking off the four low-order
3386+
/// bits of the result. The 16-byte vector in a is stored to the resultant memory address.
3387+
#[inline]
3388+
#[target_feature(enable = "altivec")]
3389+
#[unstable(feature = "stdarch_powerpc", issue = "111145")]
3390+
pub unsafe fn vec_st<T>(a: T, off: isize, c: <T as sealed::VectorSt>::Target)
3391+
where
3392+
T: sealed::VectorSt,
3393+
{
3394+
a.vec_st(off, c)
3395+
}
3396+
3397+
/// Vector Store Indexed Least Recently Used
3398+
///
3399+
/// ## Purpose
3400+
/// Stores a 16-byte vector into memory at the address specified by a displacement and
3401+
/// a pointer, ignoring the four low-order bits of the calculated address, and marking the cache
3402+
/// line containing the address as least frequently used.
3403+
///
3404+
/// ## Operation
3405+
/// A memory address is obtained by adding b and c, and masking off the four
3406+
/// low-order bits of the result. The 16-byte vector in a is stored to the resultant memory
3407+
/// address, and the containing cache line is marked as least frequently used.
3408+
///
3409+
/// ## Notes
3410+
/// This intrinsic can be used to indicate the last access to a portion of memory, as a hint to the
3411+
/// data cache controller that the associated cache line can be replaced without performance loss.
3412+
#[inline]
3413+
#[target_feature(enable = "altivec")]
3414+
#[unstable(feature = "stdarch_powerpc", issue = "111145")]
3415+
pub unsafe fn vec_stl<T>(a: T, off: isize, c: <T as sealed::VectorSt>::Target)
3416+
where
3417+
T: sealed::VectorSt,
3418+
{
3419+
a.vec_stl(off, c)
3420+
}
3421+
3422+
/// Vector Store Element Indexed
3423+
///
3424+
/// ## Purpose
3425+
/// Stores a single element from a 16-byte vector into memory at the address specified by
3426+
/// a displacement and a pointer, aligned to the element size.
3427+
///
3428+
/// ## Operation
3429+
/// The integer value b is added to the pointer value c. The resulting address is
3430+
/// rounded down to the nearest address that is a multiple of es, where es is 1 for char pointers,
3431+
/// 2 for short pointers, and 4 for float or int pointers. An element offset eo is calculated by
3432+
/// taking the resultant address modulo 16. The vector element of a at offset eo is stored to the
3433+
/// resultant address.
3434+
///
3435+
/// ## Notes
3436+
/// Be careful to note that the address (b+c) is aligned to an element boundary. Do not attempt
3437+
/// to store unaligned data with this intrinsic.
3438+
#[inline]
3439+
#[target_feature(enable = "altivec")]
3440+
#[unstable(feature = "stdarch_powerpc", issue = "111145")]
3441+
pub unsafe fn vec_ste<T>(a: T, off: isize, c: <T as sealed::VectorSte>::Target)
3442+
where
3443+
T: sealed::VectorSte,
3444+
{
3445+
a.vec_ste(off, c)
3446+
}
3447+
32733448
/// VSX Unaligned Load
32743449
#[inline]
32753450
#[target_feature(enable = "altivec")]

0 commit comments

Comments
 (0)