From 5dfa9086b7d2c4e292449c5d5b873c16d0c59b8f Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Sat, 27 Oct 2018 06:25:05 -0400 Subject: [PATCH] Add VectorStore(byte*, vector) overload --- ppc-simd.h | 47 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/ppc-simd.h b/ppc-simd.h index f6d133b9..b8213f89 100644 --- a/ppc-simd.h +++ b/ppc-simd.h @@ -75,6 +75,21 @@ inline T Reverse(const T& src) return (T)vec_perm(src, src, mask); } +/// \brief Permutes a vector +/// \tparam T vector type +/// \param vec the vector +/// \param mask vector mask +/// \returns vector +/// \details VectorPermute returns a new vector from vec based on +/// mask. mask is an uint8x16_p type vector. The return +/// vector is the same type as vec. +/// \since Crypto++ 6.0 +template +inline T1 VectorPermute(const T1& vec, const T2& mask) +{ + return (T1)vec_perm(vec, vec, (uint8x16_p)mask); +} + /// \brief Permutes two vectors /// \tparam T1 vector type /// \tparam T2 vector type @@ -92,21 +107,6 @@ inline T1 VectorPermute(const T1& vec1, const T1& vec2, const T2& mask) return (T1)vec_perm(vec1, vec2, (uint8x16_p)mask); } -/// \brief Permutes a vector -/// \tparam T vector type -/// \param vec the vector -/// \param mask vector mask -/// \returns vector -/// \details VectorPermute returns a new vector from vec based on -/// mask. mask is an uint8x16_p type vector. The return -/// vector is the same type as vec. -/// \since Crypto++ 6.0 -template -inline T1 VectorPermute(const T1& vec, const T2& mask) -{ - return (T1)vec_perm(vec, vec, (uint8x16_p)mask); -} - /// \brief AND two vectors /// \tparam T1 vector type /// \tparam T2 vector type @@ -546,6 +546,23 @@ inline void VectorStore(const T& src, byte dest[16]) #endif } +/// \brief Stores a vector to a byte array +/// \tparam T vector type +/// \param src the vector +/// \param dest the byte array +/// \details Stores a vector in native endian format to a byte array. +/// \note VectorStore does not require an aligned array. +/// \since Crypto++ 6.0 +template +inline void VectorStore(byte dest[16], const T& src) +{ +#if defined(CRYPTOPP_XLC_VERSION) + vec_xst((uint8x16_p)src, 0, (byte*)dest); +#else + vec_vsx_st((uint8x16_p)src, 0, (byte*)dest); +#endif +} + /// \brief Stores a vector to a byte array /// \tparam T vector type /// \param src the vector