Crypto++  7.0
Free C++ class library of cryptographic schemes
Typedefs | Functions
ppc_simd.h File Reference

Support functions for PowerPC and vector operations. More...

Go to the source code of this file.

Typedefs

typedef __vector unsigned char uint8x16_p
 Vector of 8-bit elements. More...
 
typedef __vector unsigned short uint16x8_p
 Vector of 16-bit elements. More...
 
typedef __vector unsigned int uint32x4_p
 Vector of 32-bit elements. More...
 
typedef __vector unsigned long long uint64x2_p
 Vector of 64-bit elements. More...
 

Functions

uint32x4_p VecZero ()
 The 0 vector. More...
 
uint32x4_p VecOne ()
 The 1 vector. More...
 
template<class T >
VecReverse (const T data)
 Reverse bytes in a vector. More...
 
uint32x4_p VecLoad_ALTIVEC (const byte src[16])
 Loads a vector from a byte array. More...
 
uint32x4_p VecLoad_ALTIVEC (int off, const byte src[16])
 Loads a vector from a byte array. More...
 
uint32x4_p VecLoad (const byte src[16])
 Loads a vector from a byte array. More...
 
uint32x4_p VecLoad (int off, const byte src[16])
 Loads a vector from a byte array. More...
 
uint32x4_p VecLoad (const word32 src[4])
 Loads a vector from a word array. More...
 
uint32x4_p VecLoad (int off, const word32 src[4])
 Loads a vector from a word array. More...
 
uint64x2_p VecLoad (const word64 src[2])
 Loads a vector from a word array. More...
 
uint64x2_p VecLoad (int off, const word64 src[2])
 Loads a vector from a word array. More...
 
uint32x4_p VecLoadAligned (const byte src[16])
 Loads a vector from an aligned byte array. More...
 
uint32x4_p VecLoadAligned (int off, const byte src[16])
 Loads a vector from an aligned byte array. More...
 
uint32x4_p VecLoadBE (const byte src[16])
 Loads a vector from a byte array. More...
 
uint32x4_p VecLoadBE (int off, const byte src[16])
 Loads a vector from a byte array. More...
 
template<class T >
void VecStore_ALTIVEC (const T data, byte dest[16])
 Stores a vector to a byte array. More...
 
template<class T >
void VecStore_ALTIVEC (const T data, int off, byte dest[16])
 Stores a vector to a byte array. More...
 
template<class T >
void VecStore (const T data, byte dest[16])
 Stores a vector to a byte array. More...
 
template<class T >
void VecStore (const T data, int off, byte dest[16])
 Stores a vector to a byte array. More...
 
template<class T >
void VecStore (const T data, word32 dest[4])
 Stores a vector to a word array. More...
 
template<class T >
void VecStore (const T data, int off, word32 dest[4])
 Stores a vector to a word array. More...
 
template<class T >
void VecStore (const T data, word64 dest[2])
 Stores a vector to a word array. More...
 
template<class T >
void VecStore (const T data, int off, word64 dest[2])
 Stores a vector to a word array. More...
 
template<class T >
void VecStoreBE (const T data, byte dest[16])
 Stores a vector to a byte array. More...
 
template<class T >
void VecStoreBE (const T data, int off, byte dest[16])
 Stores a vector to a byte array. More...
 
template<class T >
void VecStoreBE (const T data, word32 dest[4])
 Stores a vector to a word array. More...
 
template<class T >
void VecStoreBE (const T data, int off, word32 dest[4])
 Stores a vector to a word array. More...
 
template<class T1 , class T2 >
T1 VecPermute (const T1 vec, const T2 mask)
 Permutes a vector. More...
 
template<class T1 , class T2 >
T1 VecPermute (const T1 vec1, const T1 vec2, const T2 mask)
 Permutes two vectors. More...
 
template<class T1 , class T2 >
T1 VecAnd (const T1 vec1, const T2 vec2)
 AND two vectors. More...
 
template<class T1 , class T2 >
T1 VecOr (const T1 vec1, const T2 vec2)
 OR two vectors. More...
 
template<class T1 , class T2 >
T1 VecXor (const T1 vec1, const T2 vec2)
 XOR two vectors. More...
 
template<class T1 , class T2 >
T1 VecAdd (const T1 vec1, const T2 vec2)
 Add two vectors. More...
 
template<class T1 , class T2 >
T1 VecSub (const T1 vec1, const T2 vec2)
 Subtract two vectors. More...
 
uint32x4_p VecAdd64 (const uint32x4_p &vec1, const uint32x4_p &vec2)
 Add two vectors. More...
 
template<unsigned int C, class T >
VecShiftLeftOctet (const T vec)
 Shift a vector left. More...
 
template<unsigned int C, class T >
VecShiftRightOctet (const T vec)
 Shift a vector right. More...
 
template<unsigned int C, class T >
VecRotateLeftOctet (const T vec)
 Rotate a vector left. More...
 
template<unsigned int C, class T >
VecRotateRightOctet (const T vec)
 Rotate a vector right. More...
 
template<unsigned int C>
uint32x4_p VecRotateLeft (const uint32x4_p vec)
 Rotate a packed vector left. More...
 
template<unsigned int C>
uint64x2_p VecRotateLeft (const uint64x2_p vec)
 Rotate a packed vector left. More...
 
template<unsigned int C>
uint32x4_p VecRotateRight (const uint32x4_p vec)
 Rotate a packed vector right. More...
 
template<unsigned int C>
uint64x2_p VecRotateRight (const uint64x2_p vec)
 Rotate a packed vector right. More...
 
template<class T >
VecSwapWords (const T vec)
 Exchange high and low double words. More...
 
template<class T >
VecGetLow (const T val)
 Extract a dword from a vector. More...
 
template<class T >
VecGetHigh (const T val)
 Extract a dword from a vector. More...
 
template<class T1 , class T2 >
bool VecEqual (const T1 vec1, const T2 vec2)
 Compare two vectors. More...
 
template<class T1 , class T2 >
bool VecNotEqual (const T1 vec1, const T2 vec2)
 Compare two vectors. More...
 
template<class T1 , class T2 >
T1 VecEncrypt (const T1 state, const T2 key)
 One round of AES encryption. More...
 
template<class T1 , class T2 >
T1 VecEncryptLast (const T1 state, const T2 key)
 Final round of AES encryption. More...
 
template<class T1 , class T2 >
T1 VecDecrypt (const T1 state, const T2 key)
 One round of AES decryption. More...
 
template<class T1 , class T2 >
T1 VecDecryptLast (const T1 state, const T2 key)
 Final round of AES decryption. More...
 
template<int func, int fmask, class T >
VecSHA256 (const T vec)
 SHA256 Sigma functions. More...
 
template<int func, int fmask, class T >
VecSHA512 (const T vec)
 SHA512 Sigma functions. More...
 

Detailed Description

Support functions for PowerPC and vector operations.

This header provides an agnostic interface into Clang, GCC and IBM XL C/C++ compilers modulo their different built-in functions for accessing vector intructions.

The abstractions are necesssary to support back to GCC 4.8 and XLC 11 and 12. GCC 4.8 and 4.9 are still popular, and they are the default compiler for GCC112, GCC118 and others on the compile farm. Older IBM XL C/C++ compilers also experience it due to lack of vec_xl and vec_xst support on some platforms. Modern compilers provide best support and don't need many of the hacks below.

The library is tested with the following PowerPC machines and compilers. GCC110, GCC111, GCC112, GCC119 and GCC135 are provided by the GCC Compile Farm

12 machines are used for testing because the three compilers form five profiles. The profiles are listed below.

The LLVM front-end makes it tricky to write portable code because LLVM pretends to be other compilers but cannot consume other compiler's builtins. When using XLC with -qxlcompatmacros the compiler pretends to be GCC, Clang and XLC all at once but it can only consume it's variety of builtins.

At Crypto++ 8.0 the various VectorFunc{Name} were renamed to VecFunc{Name}. For example, VectorAnd was changed to VecAnd. The name change helped consolidate two slightly different implementations.

Since
Crypto++ 6.0, LLVM Clang compiler support since Crypto++ 8.0

Definition in file ppc_simd.h.

Typedef Documentation

◆ uint8x16_p

typedef __vector unsigned char uint8x16_p

Vector of 8-bit elements.

Wraps
__vector unsigned char
Since
Crypto++ 6.0

Definition at line 118 of file ppc_simd.h.

◆ uint16x8_p

typedef __vector unsigned short uint16x8_p

Vector of 16-bit elements.

Wraps
__vector unsigned short
Since
Crypto++ 6.0

Definition at line 123 of file ppc_simd.h.

◆ uint32x4_p

typedef __vector unsigned int uint32x4_p

Vector of 32-bit elements.

Wraps
__vector unsigned int
Since
Crypto++ 6.0

Definition at line 128 of file ppc_simd.h.

◆ uint64x2_p

typedef __vector unsigned long long uint64x2_p

Vector of 64-bit elements.

uint64x2_p is available on POWER7 and above. Some supporting functions, like 64-bit vec_add (vaddudm), did not arrive until POWER8.

Wraps
__vector unsigned long long
Since
Crypto++ 6.0

Definition at line 138 of file ppc_simd.h.

Function Documentation

◆ VecZero()

uint32x4_p VecZero ( )
inline

The 0 vector.

Returns
a 32-bit vector of 0's
Since
Crypto++ 8.0

Definition at line 144 of file ppc_simd.h.

◆ VecOne()

uint32x4_p VecOne ( )
inline

The 1 vector.

Returns
a 32-bit vector of 1's
Since
Crypto++ 8.0

Definition at line 153 of file ppc_simd.h.

◆ VecReverse()

template<class T >
T VecReverse ( const T  data)
inline

Reverse bytes in a vector.

Template Parameters
Tvector type
Parameters
datathe vector
Returns
vector

VecReverse() reverses the bytes in a vector

Wraps
vec_perm
Since
Crypto++ 6.0

Definition at line 168 of file ppc_simd.h.

◆ VecLoad_ALTIVEC() [1/2]

uint32x4_p VecLoad_ALTIVEC ( const byte  src[16])
inline

Loads a vector from a byte array.

Parameters
srcthe byte array

Loads a vector in native endian format from a byte array.

VecLoad_ALTIVEC() uses vec_ld if the effective address of src is aligned. If unaligned it uses vec_lvsl, vec_ld, vec_perm and src. The fixups using vec_lvsl and vec_perm are relatively expensive so you should provide aligned memory adresses.

Wraps
vec_ld, vec_lvsl, vec_perm
Since
Crypto++ 6.0

Definition at line 191 of file ppc_simd.h.

◆ VecLoad_ALTIVEC() [2/2]

uint32x4_p VecLoad_ALTIVEC ( int  off,
const byte  src[16] 
)
inline

Loads a vector from a byte array.

Parameters
srcthe byte array
offoffset into the src byte array

Loads a vector in native endian format from a byte array.

VecLoad_ALTIVEC() uses vec_ld if the effective address of src is aligned. If unaligned it uses vec_lvsl, vec_ld, vec_perm and src.

The fixups using vec_lvsl and vec_perm are relatively expensive so you should provide aligned memory adresses.

Wraps
vec_ld, vec_lvsl, vec_perm
Since
Crypto++ 6.0

Definition at line 221 of file ppc_simd.h.

◆ VecLoad() [1/6]

uint32x4_p VecLoad ( const byte  src[16])
inline

Loads a vector from a byte array.

Parameters
srcthe byte array

VecLoad() loads a vector in from a byte array.

VecLoad() uses POWER7's vec_xl or vec_vsx_ld if available. The instructions do not require aligned effective memory addresses. VecLoad_ALTIVEC() is used if POWER7 is not available. VecLoad_ALTIVEC() can be relatively expensive if extra instructions are required to fix up unaligned memory addresses.

Wraps
vec_xlw4, vec_xld2, vec_xl, vec_vsx_ld (and Altivec load)
Since
Crypto++ 6.0

Definition at line 251 of file ppc_simd.h.

◆ VecLoad() [2/6]

uint32x4_p VecLoad ( int  off,
const byte  src[16] 
)
inline

Loads a vector from a byte array.

Parameters
srcthe byte array
offoffset into the byte array

VecLoad() loads a vector in from a byte array.

VecLoad() uses POWER7's vec_xl or vec_vsx_ld if available. The instructions do not require aligned effective memory addresses. VecLoad_ALTIVEC() is used if POWER7 is not available. VecLoad_ALTIVEC() can be relatively expensive if extra instructions are required to fix up unaligned memory addresses.

Wraps
vec_xlw4, vec_xld2, vec_xl, vec_vsx_ld (and Altivec load)
Since
Crypto++ 6.0

Definition at line 279 of file ppc_simd.h.

◆ VecLoad() [3/6]

uint32x4_p VecLoad ( const word32  src[4])
inline

Loads a vector from a word array.

Parameters
srcthe word array

VecLoad() loads a vector in from a word array.

VecLoad() uses POWER7's vec_xl or vec_vsx_ld if available. The instructions do not require aligned effective memory addresses. VecLoad_ALTIVEC() is used if POWER7 is not available. VecLoad_ALTIVEC() can be relatively expensive if extra instructions are required to fix up unaligned memory addresses.

Wraps
vec_xlw4, vec_xld2, vec_xl, vec_vsx_ld (and Altivec load)
Since
Crypto++ 8.0

Definition at line 306 of file ppc_simd.h.

◆ VecLoad() [4/6]

uint32x4_p VecLoad ( int  off,
const word32  src[4] 
)
inline

Loads a vector from a word array.

Parameters
srcthe word array
offoffset into the word array

VecLoad() loads a vector in from a word array.

VecLoad() uses POWER7's vec_xl or vec_vsx_ld if available. The instructions do not require aligned effective memory addresses. VecLoad_ALTIVEC() is used if POWER7 is not available. VecLoad_ALTIVEC() can be relatively expensive if extra instructions are required to fix up unaligned memory addresses.

Wraps
vec_xlw4, vec_xld2, vec_xl, vec_vsx_ld (and Altivec load)
Since
Crypto++ 8.0

Definition at line 324 of file ppc_simd.h.

◆ VecLoad() [5/6]

uint64x2_p VecLoad ( const word64  src[2])
inline

Loads a vector from a word array.

Parameters
srcthe word array

VecLoad() loads a vector in from a word array.

VecLoad() uses POWER7's vec_xl or vec_vsx_ld if available. The instructions do not require aligned effective memory addresses. VecLoad_ALTIVEC() is used if POWER7 is not available. VecLoad_ALTIVEC() can be relatively expensive if extra instructions are required to fix up unaligned memory addresses.

VecLoad() with 64-bit elements is available on POWER7 and above.

Wraps
vec_xlw4, vec_xld2, vec_xl, vec_vsx_ld (and Altivec load)
Since
Crypto++ 8.0

Definition at line 344 of file ppc_simd.h.

◆ VecLoad() [6/6]

uint64x2_p VecLoad ( int  off,
const word64  src[2] 
)
inline

Loads a vector from a word array.

Parameters
srcthe word array
offoffset into the word array

VecLoad() loads a vector in from a word array.

VecLoad() uses POWER7's vec_xl or vec_vsx_ld if available. The instructions do not require aligned effective memory addresses. VecLoad_ALTIVEC() is used if POWER7 is not available. VecLoad_ALTIVEC() can be relatively expensive if extra instructions are required to fix up unaligned memory addresses.

VecLoad() with 64-bit elements is available on POWER8 and above.

Wraps
vec_xlw4, vec_xld2, vec_xl, vec_vsx_ld (and Altivec load)
Since
Crypto++ 8.0

Definition at line 363 of file ppc_simd.h.

◆ VecLoadAligned() [1/2]

uint32x4_p VecLoadAligned ( const byte  src[16])
inline

Loads a vector from an aligned byte array.

Parameters
srcthe byte array

VecLoadAligned() loads a vector in from an aligned byte array.

VecLoadAligned() uses POWER7's vec_xl or vec_vsx_ld if available. The instructions do not require aligned effective memory addresses. Altivec's vec_ld is used if POWER7 is not available. The effective address of src must be aligned.

Wraps
vec_ld, vec_xlw4, vec_xld2, vec_xl, vec_vsx_ld
Since
Crypto++ 8.0

Definition at line 381 of file ppc_simd.h.

◆ VecLoadAligned() [2/2]

uint32x4_p VecLoadAligned ( int  off,
const byte  src[16] 
)
inline

Loads a vector from an aligned byte array.

Parameters
srcthe byte array
offoffset into the byte array

VecLoadAligned() loads a vector in from an aligned byte array.

VecLoadAligned() uses POWER7's vec_xl or vec_vsx_ld if available. The instructions do not require aligned effective memory addresses. Altivec's vec_ld is used if POWER7 is not available. The effective address of src must be aligned.

Wraps
vec_ld, vec_xlw4, vec_xld2, vec_xl, vec_vsx_ld
Since
Crypto++ 8.0

Definition at line 409 of file ppc_simd.h.

◆ VecLoadBE() [1/2]

uint32x4_p VecLoadBE ( const byte  src[16])
inline

Loads a vector from a byte array.

Parameters
srcthe byte array

VecLoadBE() loads a vector in from a byte array. VecLoadBE will reverse all bytes in the array on a little endian system.

VecLoadBE() uses POWER7's vec_xl or vec_vsx_ld if available. The instructions do not require aligned effective memory addresses. VecLoad_ALTIVEC() is used if POWER7 is not available. VecLoad_ALTIVEC() can be relatively expensive if extra instructions are required to fix up unaligned memory addresses.

Wraps
vec_xlw4, vec_xld2, vec_xl, vec_vsx_ld (and Altivec load)
Since
Crypto++ 6.0

Definition at line 438 of file ppc_simd.h.

◆ VecLoadBE() [2/2]

uint32x4_p VecLoadBE ( int  off,
const byte  src[16] 
)
inline

Loads a vector from a byte array.

Parameters
srcthe byte array
offoffset into the src byte array

VecLoadBE() loads a vector in from a byte array. VecLoadBE will reverse all bytes in the array on a little endian system.

VecLoadBE() uses POWER7's vec_xl or vec_vsx_ld if available. The instructions do not require aligned effective memory addresses. VecLoad_ALTIVEC() is used if POWER7 is not available. VecLoad_ALTIVEC() can be relatively expensive if extra instructions are required to fix up unaligned memory addresses.

Wraps
vec_xlw4, vec_xld2, vec_xl, vec_vsx_ld (and Altivec load)
Since
Crypto++ 6.0

Definition at line 479 of file ppc_simd.h.

◆ VecStore_ALTIVEC() [1/2]

template<class T >
void VecStore_ALTIVEC ( const T  data,
byte  dest[16] 
)
inline

Stores a vector to a byte array.

Template Parameters
Tvector type
Parameters
datathe vector
destthe byte array

VecStore_ALTIVEC() stores a vector to a byte array.

VecStore_ALTIVEC() uses vec_st if the effective address of dest is aligned, and uses vec_ste otherwise. vec_ste is relatively expensive so you should provide aligned memory adresses.

VecStore_ALTIVEC() is used automatically when POWER7 or above and unaligned loads is not available.

Wraps
vec_st, vec_ste, vec_lvsr, vec_perm
Since
Crypto++ 8.0

Definition at line 523 of file ppc_simd.h.

◆ VecStore_ALTIVEC() [2/2]

template<class T >
void VecStore_ALTIVEC ( const T  data,
int  off,
byte  dest[16] 
)
inline

Stores a vector to a byte array.

Template Parameters
Tvector type
Parameters
datathe vector
offthe byte offset into the array
destthe byte array

VecStore_ALTIVEC() stores a vector to a byte array.

VecStore_ALTIVEC() uses vec_st if the effective address of dest is aligned, and uses vec_ste otherwise. vec_ste is relatively expensive so you should provide aligned memory adresses.

VecStore_ALTIVEC() is used automatically when POWER7 or above and unaligned loads is not available.

Wraps
vec_st, vec_ste, vec_lvsr, vec_perm
Since
Crypto++ 8.0

Definition at line 562 of file ppc_simd.h.

◆ VecStore() [1/6]

template<class T >
void VecStore ( const T  data,
byte  dest[16] 
)
inline

Stores a vector to a byte array.

Template Parameters
Tvector type
Parameters
datathe vector
destthe byte array

VecStore() stores a vector to a byte array.

VecStore() uses POWER7's vec_xst or vec_vsx_st if available. The instructions do not require aligned effective memory addresses. VecStore_ALTIVEC() is used if POWER7 is not available. VecStore_ALTIVEC() can be relatively expensive if extra instructions are required to fix up unaligned memory addresses.

Wraps
vec_xstw4, vec_xstld2, vec_xst, vec_vsx_st (and Altivec store)
Since
Crypto++ 6.0

Definition at line 600 of file ppc_simd.h.

◆ VecStore() [2/6]

template<class T >
void VecStore ( const T  data,
int  off,
byte  dest[16] 
)
inline

Stores a vector to a byte array.

Template Parameters
Tvector type
Parameters
datathe vector
offthe byte offset into the array
destthe byte array

VecStore() stores a vector to a byte array.

VecStore() uses POWER7's vec_xst or vec_vsx_st if available. The instructions do not require aligned effective memory addresses. VecStore_ALTIVEC() is used if POWER7 is not available. VecStore_ALTIVEC() can be relatively expensive if extra instructions are required to fix up unaligned memory addresses.

Wraps
vec_xstw4, vec_xstld2, vec_xst, vec_vsx_st (and Altivec store)
Since
Crypto++ 6.0

Definition at line 631 of file ppc_simd.h.

◆ VecStore() [3/6]

template<class T >
void VecStore ( const T  data,
word32  dest[4] 
)
inline

Stores a vector to a word array.

Template Parameters
Tvector type
Parameters
datathe vector
destthe word array

VecStore() stores a vector to a word array.

VecStore() uses POWER7's vec_xst or vec_vsx_st if available. The instructions do not require aligned effective memory addresses. VecStore_ALTIVEC() is used if POWER7 is not available. VecStore_ALTIVEC() can be relatively expensive if extra instructions are required to fix up unaligned memory addresses.

Wraps
vec_xstw4, vec_xstld2, vec_xst, vec_vsx_st (and Altivec store)
Since
Crypto++ 8.0

Definition at line 661 of file ppc_simd.h.

◆ VecStore() [4/6]

template<class T >
void VecStore ( const T  data,
int  off,
word32  dest[4] 
)
inline

Stores a vector to a word array.

Template Parameters
Tvector type
Parameters
datathe vector
offthe byte offset into the array
destthe word array

VecStore() stores a vector to a word array.

VecStore() uses POWER7's vec_xst or vec_vsx_st if available. The instructions do not require aligned effective memory addresses. VecStore_ALTIVEC() is used if POWER7 is not available. VecStore_ALTIVEC() can be relatively expensive if extra instructions are required to fix up unaligned memory addresses.

Wraps
vec_xstw4, vec_xstld2, vec_xst, vec_vsx_st (and Altivec store)
Since
Crypto++ 8.0

Definition at line 682 of file ppc_simd.h.

◆ VecStore() [5/6]

template<class T >
void VecStore ( const T  data,
word64  dest[2] 
)
inline

Stores a vector to a word array.

Template Parameters
Tvector type
Parameters
datathe vector
destthe word array

VecStore() stores a vector to a word array.

VecStore() uses POWER7's vec_xst or vec_vsx_st if available. The instructions do not require aligned effective memory addresses. VecStore_ALTIVEC() is used if POWER7 is not available. VecStore_ALTIVEC() can be relatively expensive if extra instructions are required to fix up unaligned memory addresses.

VecStore() with 64-bit elements is available on POWER8 and above.

Wraps
vec_xstw4, vec_xstld2, vec_xst, vec_vsx_st (and Altivec store)
Since
Crypto++ 8.0

Definition at line 703 of file ppc_simd.h.

◆ VecStore() [6/6]

template<class T >
void VecStore ( const T  data,
int  off,
word64  dest[2] 
)
inline

Stores a vector to a word array.

Template Parameters
Tvector type
Parameters
datathe vector
offthe byte offset into the array
destthe word array

VecStore() stores a vector to a word array.

VecStore() uses POWER7's vec_xst or vec_vsx_st if available. The instructions do not require aligned effective memory addresses. VecStore_ALTIVEC() is used if POWER7 is not available. VecStore_ALTIVEC() can be relatively expensive if extra instructions are required to fix up unaligned memory addresses.

VecStore() with 64-bit elements is available on POWER8 and above.

Wraps
vec_xstw4, vec_xstld2, vec_xst, vec_vsx_st (and Altivec store)
Since
Crypto++ 8.0

Definition at line 725 of file ppc_simd.h.

◆ VecStoreBE() [1/4]

template<class T >
void VecStoreBE ( const T  data,
byte  dest[16] 
)
inline

Stores a vector to a byte array.

Template Parameters
Tvector type
Parameters
datathe vector
destthe byte array

VecStoreBE() stores a vector to a byte array. VecStoreBE will reverse all bytes in the array on a little endian system.

VecStoreBE() uses POWER7's vec_xst or vec_vsx_st if available. The instructions do not require aligned effective memory addresses. VecStore_ALTIVEC() is used if POWER7 is not available. VecStore_ALTIVEC() can be relatively expensive if extra instructions are required to fix up unaligned memory addresses.

Wraps
vec_xstw4, vec_xstld2, vec_xst, vec_vsx_st (and Altivec store)
Since
Crypto++ 6.0

Definition at line 746 of file ppc_simd.h.

◆ VecStoreBE() [2/4]

template<class T >
void VecStoreBE ( const T  data,
int  off,
byte  dest[16] 
)
inline

Stores a vector to a byte array.

Template Parameters
Tvector type
Parameters
datathe vector
offoffset into the dest byte array
destthe byte array

VecStoreBE() stores a vector to a byte array. VecStoreBE will reverse all bytes in the array on a little endian system.

VecStoreBE() uses POWER7's vec_xst or vec_vsx_st if available. The instructions do not require aligned effective memory addresses. VecStore_ALTIVEC() is used if POWER7 is not available. VecStore_ALTIVEC() can be relatively expensive if extra instructions are required to fix up unaligned memory addresses.

Wraps
vec_xstw4, vec_xstld2, vec_xst, vec_vsx_st (and Altivec store)
Since
Crypto++ 6.0

Definition at line 790 of file ppc_simd.h.

◆ VecStoreBE() [3/4]

template<class T >
void VecStoreBE ( const T  data,
word32  dest[4] 
)
inline

Stores a vector to a word array.

Template Parameters
Tvector type
Parameters
datathe vector
destthe word array

VecStoreBE() stores a vector to a word array. VecStoreBE will reverse all bytes in the array on a little endian system.

VecStoreBE() uses POWER7's vec_xst or vec_vsx_st if available. The instructions do not require aligned effective memory addresses. VecStore_ALTIVEC() is used if POWER7 is not available. VecStore_ALTIVEC() can be relatively expensive if extra instructions are required to fix up unaligned memory addresses.

Wraps
vec_xstw4, vec_xstld2, vec_xst, vec_vsx_st (and Altivec store)
Since
Crypto++ 8.0

Definition at line 833 of file ppc_simd.h.

◆ VecStoreBE() [4/4]

template<class T >
void VecStoreBE ( const T  data,
int  off,
word32  dest[4] 
)
inline

Stores a vector to a word array.

Template Parameters
Tvector type
Parameters
datathe vector
offoffset into the dest word array
destthe word array

VecStoreBE() stores a vector to a word array. VecStoreBE will reverse all words in the array on a little endian system.

VecStoreBE() uses POWER7's vec_xst or vec_vsx_st if available. The instructions do not require aligned effective memory addresses. VecStore_ALTIVEC() is used if POWER7 is not available. VecStore_ALTIVEC() can be relatively expensive if extra instructions are required to fix up unaligned memory addresses.

Wraps
vec_xstw4, vec_xstld2, vec_xst, vec_vsx_st (and Altivec store)
Since
Crypto++ 8.0

Definition at line 855 of file ppc_simd.h.

◆ VecPermute() [1/2]

template<class T1 , class T2 >
T1 VecPermute ( const T1  vec,
const T2  mask 
)
inline

Permutes a vector.

Template Parameters
T1vector type
T2vector type
Parameters
vecthe vector
maskvector mask
Returns
vector

VecPermute() 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.

Wraps
vec_perm
Since
Crypto++ 6.0

Definition at line 875 of file ppc_simd.h.

◆ VecPermute() [2/2]

template<class T1 , class T2 >
T1 VecPermute ( const T1  vec1,
const T1  vec2,
const T2  mask 
)
inline

Permutes two vectors.

Template Parameters
T1vector type
T2vector type
Parameters
vec1the first vector
vec2the second vector
maskvector mask
Returns
vector

VecPermute() returns a new vector from vec1 and vec2 based on mask. mask is an uint8x16_p type vector. The return vector is the same type as vec1.

Wraps
vec_perm
Since
Crypto++ 6.0

Definition at line 894 of file ppc_simd.h.

◆ VecAnd()

template<class T1 , class T2 >
T1 VecAnd ( const T1  vec1,
const T2  vec2 
)
inline

AND two vectors.

Template Parameters
T1vector type
T2vector type
Parameters
vec1the first vector
vec2the second vector
Returns
vector

VecAnd() returns a new vector from vec1 and vec2. The return vector is the same type as vec1.

Wraps
vec_and
Since
Crypto++ 6.0

Definition at line 911 of file ppc_simd.h.

◆ VecOr()

template<class T1 , class T2 >
T1 VecOr ( const T1  vec1,
const T2  vec2 
)
inline

OR two vectors.

Template Parameters
T1vector type
T2vector type
Parameters
vec1the first vector
vec2the second vector
Returns
vector

VecOr() returns a new vector from vec1 and vec2. The return vector is the same type as vec1.

Wraps
vec_or
Since
Crypto++ 6.0

Definition at line 928 of file ppc_simd.h.

◆ VecXor()

template<class T1 , class T2 >
T1 VecXor ( const T1  vec1,
const T2  vec2 
)
inline

XOR two vectors.

Template Parameters
T1vector type
T2vector type
Parameters
vec1the first vector
vec2the second vector
Returns
vector

VecXor() returns a new vector from vec1 and vec2. The return vector is the same type as vec1.

Wraps
vec_xor
Since
Crypto++ 6.0

Definition at line 945 of file ppc_simd.h.

◆ VecAdd()

template<class T1 , class T2 >
T1 VecAdd ( const T1  vec1,
const T2  vec2 
)
inline

Add two vectors.

Template Parameters
T1vector type
T2vector type
Parameters
vec1the first vector
vec2the second vector
Returns
vector

VecAdd() returns a new vector from vec1 and vec2. vec2 is cast to the same type as vec1. The return vector is the same type as vec1.

Wraps
vec_add
Since
Crypto++ 6.0

Definition at line 963 of file ppc_simd.h.

◆ VecSub()

template<class T1 , class T2 >
T1 VecSub ( const T1  vec1,
const T2  vec2 
)
inline

Subtract two vectors.

Template Parameters
T1vector type
T2vector type
Parameters
vec1the first vector
vec2the second vector

VecSub() returns a new vector from vec1 and vec2. vec2 is cast to the same type as vec1. The return vector is the same type as vec1.

Wraps
vec_sub
Since
Crypto++ 6.0

Definition at line 980 of file ppc_simd.h.

◆ VecAdd64()

uint32x4_p VecAdd64 ( const uint32x4_p vec1,
const uint32x4_p vec2 
)
inline

Add two vectors.

Template Parameters
T1vector type
T2vector type
Parameters
vec1the first vector
vec2the second vector
Returns
vector

VecAdd64() returns a new vector from vec1 and vec2. vec1 and vec2 are added as if uint64x2_p vectors. On POWER7 and below VecAdd64() manages the carries from two elements in a uint32x4_p vector.

Wraps
vec_add for POWER8, vec_addc, vec_perm, vec_add for Altivec
Since
Crypto++ 8.0

Definition at line 998 of file ppc_simd.h.

◆ VecShiftLeftOctet()

template<unsigned int C, class T >
T VecShiftLeftOctet ( const T  vec)
inline

Shift a vector left.

Template Parameters
Cshift byte count
Tvector type
Parameters
vecthe vector
Returns
vector

VecShiftLeftOctet() returns a new vector after shifting the concatenation of the zero vector and the source vector by the specified number of bytes. The return vector is the same type as vec.

On big endian machines VecShiftLeftOctet() is vec_sld(a, z, c). On little endian machines VecShiftLeftOctet() is translated to vec_sld(z, a, 16-c). You should always call the function as if on a big endian machine as shown below.

   uint8x16_p x = VecLoad(ptr);
   uint8x16_p y = VecShiftLeftOctet<12>(x);
Wraps
vec_sld
See also
Is vec_sld endian sensitive? on Stack Overflow
Since
Crypto++ 6.0

Definition at line 1038 of file ppc_simd.h.

◆ VecShiftRightOctet()

template<unsigned int C, class T >
T VecShiftRightOctet ( const T  vec)
inline

Shift a vector right.

Template Parameters
Cshift byte count
Tvector type
Parameters
vecthe vector
Returns
vector

VecShiftRightOctet() returns a new vector after shifting the concatenation of the zero vector and the source vector by the specified number of bytes. The return vector is the same type as vec.

On big endian machines VecShiftRightOctet() is vec_sld(a, z, c). On little endian machines VecShiftRightOctet() is translated to vec_sld(z, a, 16-c). You should always call the function as if on a big endian machine as shown below.

   uint8x16_p x = VecLoad(ptr);
   uint8x16_p y = VecShiftRightOctet<12>(y);
Wraps
vec_sld
See also
Is vec_sld endian sensitive? on Stack Overflow
Since
Crypto++ 6.0

Definition at line 1085 of file ppc_simd.h.

◆ VecRotateLeftOctet()

template<unsigned int C, class T >
T VecRotateLeftOctet ( const T  vec)
inline

Rotate a vector left.

Template Parameters
Cshift byte count
Tvector type
Parameters
vecthe vector
Returns
vector

VecRotateLeftOctet() returns a new vector after rotating the concatenation of the source vector with itself by the specified number of bytes. The return vector is the same type as vec.

Wraps
vec_sld
See also
Is vec_sld endian sensitive? on Stack Overflow
Since
Crypto++ 6.0

Definition at line 1124 of file ppc_simd.h.

◆ VecRotateRightOctet()

template<unsigned int C, class T >
T VecRotateRightOctet ( const T  vec)
inline

Rotate a vector right.

Template Parameters
Cshift byte count
Tvector type
Parameters
vecthe vector
Returns
vector

VecRotateRightOctet() returns a new vector after rotating the concatenation of the source vector with itself by the specified number of bytes. The return vector is the same type as vec.

Wraps
vec_sld
See also
Is vec_sld endian sensitive? on Stack Overflow
Since
Crypto++ 6.0

Definition at line 1149 of file ppc_simd.h.

◆ VecRotateLeft() [1/2]

template<unsigned int C>
uint32x4_p VecRotateLeft ( const uint32x4_p  vec)
inline

Rotate a packed vector left.

Template Parameters
Cshift bit count
Parameters
vecthe vector
Returns
vector

VecRotateLeft() rotates each element in a packed vector by bit count.

Wraps
vec_rl
Since
Crypto++ 7.0

Definition at line 1169 of file ppc_simd.h.

◆ VecRotateLeft() [2/2]

template<unsigned int C>
uint64x2_p VecRotateLeft ( const uint64x2_p  vec)
inline

Rotate a packed vector left.

Template Parameters
Cshift bit count
Parameters
vecthe vector
Returns
vector

VecRotateLeft() rotates each element in a packed vector by bit count.

VecRotateLeft() with 64-bit elements is available on POWER8 and above.

Wraps
vec_rl
Since
Crypto++ 8.0

Definition at line 1187 of file ppc_simd.h.

◆ VecRotateRight() [1/2]

template<unsigned int C>
uint32x4_p VecRotateRight ( const uint32x4_p  vec)
inline

Rotate a packed vector right.

Template Parameters
Cshift bit count
Parameters
vecthe vector
Returns
vector

VecRotateRight() rotates each element in a packed vector by bit count.

Wraps
vec_rl
Since
Crypto++ 7.0

Definition at line 1204 of file ppc_simd.h.

◆ VecRotateRight() [2/2]

template<unsigned int C>
uint64x2_p VecRotateRight ( const uint64x2_p  vec)
inline

Rotate a packed vector right.

Template Parameters
Cshift bit count
Parameters
vecthe vector
Returns
vector

VecRotateRight() rotates each element in a packed vector by bit count.

VecRotateRight() with 64-bit elements is available on POWER8 and above.

Wraps
vec_rl
Since
Crypto++ 8.0

Definition at line 1222 of file ppc_simd.h.

◆ VecSwapWords()

template<class T >
T VecSwapWords ( const T  vec)
inline

Exchange high and low double words.

Template Parameters
Tvector type
Parameters
vecthe vector
Returns
vector
Wraps
vec_sld
Since
Crypto++ 7.0

Definition at line 1238 of file ppc_simd.h.

◆ VecGetLow()

template<class T >
T VecGetLow ( const T  val)
inline

Extract a dword from a vector.

Template Parameters
Tvector type
Parameters
valthe vector
Returns
vector created from low dword

VecGetLow() extracts the low dword from a vector. The low dword is composed of the least significant bits and occupies bytes 8 through 15 when viewed as a big endian array. The return vector is the same type as the original vector and padded with 0's in the most significant bit positions.

Wraps
vec_sld
Since
Crypto++ 7.0

Definition at line 1255 of file ppc_simd.h.

◆ VecGetHigh()

template<class T >
T VecGetHigh ( const T  val)
inline

Extract a dword from a vector.

Template Parameters
Tvector type
Parameters
valthe vector
Returns
vector created from high dword

VecGetHigh() extracts the high dword from a vector. The high dword is composed of the most significant bits and occupies bytes 0 through 7 when viewed as a big endian array. The return vector is the same type as the original vector and padded with 0's in the most significant bit positions.

Wraps
vec_sld
Since
Crypto++ 7.0

Definition at line 1275 of file ppc_simd.h.

◆ VecEqual()

template<class T1 , class T2 >
bool VecEqual ( const T1  vec1,
const T2  vec2 
)
inline

Compare two vectors.

Template Parameters
T1vector type
T2vector type
Parameters
vec1the first vector
vec2the second vector
Returns
true if vec1 equals vec2, false otherwise

VecEqual() performs a bitwise compare. The vector element types do not matter.

Wraps
vec_all_eq
Since
Crypto++ 8.0

Definition at line 1295 of file ppc_simd.h.

◆ VecNotEqual()

template<class T1 , class T2 >
bool VecNotEqual ( const T1  vec1,
const T2  vec2 
)
inline

Compare two vectors.

Template Parameters
T1vector type
T2vector type
Parameters
vec1the first vector
vec2the second vector
Returns
true if vec1 does not equal vec2, false otherwise

VecNotEqual() performs a bitwise compare. The vector element types do not matter.

Wraps
vec_all_eq
Since
Crypto++ 8.0

Definition at line 1312 of file ppc_simd.h.

◆ VecEncrypt()

template<class T1 , class T2 >
T1 VecEncrypt ( const T1  state,
const T2  key 
)
inline

One round of AES encryption.

Template Parameters
T1vector type
T2vector type
Parameters
statethe state vector
keythe subkey vector

VecEncrypt() performs one round of AES encryption of state using subkey key. The return vector is the same type as vec1.

VecEncrypt() is available on POWER8 and above.

Wraps
__vcipher, __builtin_altivec_crypto_vcipher, __builtin_crypto_vcipher
Since
GCC and XLC since Crypto++ 6.0, LLVM Clang since Crypto++ 8.0

Definition at line 1333 of file ppc_simd.h.

◆ VecEncryptLast()

template<class T1 , class T2 >
T1 VecEncryptLast ( const T1  state,
const T2  key 
)
inline

Final round of AES encryption.

Template Parameters
T1vector type
T2vector type
Parameters
statethe state vector
keythe subkey vector

VecEncryptLast() performs the final round of AES encryption of state using subkey key. The return vector is the same type as vec1.

VecEncryptLast() is available on POWER8 and above.

Wraps
__vcipherlast, __builtin_altivec_crypto_vcipherlast, __builtin_crypto_vcipherlast
Since
GCC and XLC since Crypto++ 6.0, LLVM Clang since Crypto++ 8.0

Definition at line 1358 of file ppc_simd.h.

◆ VecDecrypt()

template<class T1 , class T2 >
T1 VecDecrypt ( const T1  state,
const T2  key 
)
inline

One round of AES decryption.

Template Parameters
T1vector type
T2vector type
Parameters
statethe state vector
keythe subkey vector

VecDecrypt() performs one round of AES decryption of state using subkey key. The return vector is the same type as vec1.

VecDecrypt() is available on POWER8 and above.

Wraps
__vncipher, __builtin_altivec_crypto_vncipher, __builtin_crypto_vncipher
Since
GCC and XLC since Crypto++ 6.0, LLVM Clang since Crypto++ 8.0

Definition at line 1383 of file ppc_simd.h.

◆ VecDecryptLast()

template<class T1 , class T2 >
T1 VecDecryptLast ( const T1  state,
const T2  key 
)
inline

Final round of AES decryption.

Template Parameters
T1vector type
T2vector type
Parameters
statethe state vector
keythe subkey vector

VecDecryptLast() performs the final round of AES decryption of state using subkey key. The return vector is the same type as vec1.

VecDecryptLast() is available on POWER8 and above.

Wraps
__vncipherlast, __builtin_altivec_crypto_vncipherlast, __builtin_crypto_vncipherlast
Since
GCC and XLC since Crypto++ 6.0, LLVM Clang since Crypto++ 8.0

Definition at line 1408 of file ppc_simd.h.

◆ VecSHA256()

template<int func, int fmask, class T >
T VecSHA256 ( const T  vec)
inline

SHA256 Sigma functions.

Template Parameters
funcfunction
fmaskfunction mask
Tvector type
Parameters
vecthe block to transform

VecSHA256() selects sigma0, sigma1, Sigma0, Sigma1 based on func and fmask. The return vector is the same type as vec.

VecSHA256() is available on POWER8 and above.

Wraps
__vshasigmaw, __builtin_altivec_crypto_vshasigmaw, __builtin_crypto_vshasigmaw
Since
GCC and XLC since Crypto++ 6.0, LLVM Clang since Crypto++ 8.0

Definition at line 1433 of file ppc_simd.h.

◆ VecSHA512()

template<int func, int fmask, class T >
T VecSHA512 ( const T  vec)
inline

SHA512 Sigma functions.

Template Parameters
funcfunction
fmaskfunction mask
Tvector type
Parameters
vecthe block to transform

VecSHA512() selects sigma0, sigma1, Sigma0, Sigma1 based on func and fmask. The return vector is the same type as vec.

VecSHA512() is available on POWER8 and above.

Wraps
__vshasigmad, __builtin_altivec_crypto_vshasigmad, __builtin_crypto_vshasigmad
Since
GCC and XLC since Crypto++ 6.0, LLVM Clang since Crypto++ 8.0

Definition at line 1458 of file ppc_simd.h.