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 >
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 >
T | VecShiftLeftOctet (const T vec)
| Shift a vector left. More...
template<unsigned int C, class T >
T | VecShiftRightOctet (const T vec)
| Shift a vector right. More...
template<unsigned int C, class T >
T | VecRotateLeftOctet (const T vec)
| Rotate a vector left. More...
template<unsigned int C, class T >
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 >
T | VecSwapWords (const T vec)
| Exchange high and low double words. More...
template<class T >
T | VecGetLow (const T val)
| Extract a dword from a vector. More...
template<class T >
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 >
T | VecSHA256 (const T vec)
| SHA256 Sigma functions. More...
template<int func, int fmask, class T >
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

- PowerMac G5, OSX 10.5, POWER4, Apple GCC 4.0
- PowerMac G5, OSX 10.5, POWER4, Macports GCC 5.0
- GCC110, Linux, POWER7, GCC 4.8.5
- GCC110, Linux, POWER7, XLC 12.01
- GCC111, AIX, POWER7, GCC 4.8.1
- GCC111, AIX, POWER7, XLC 12.01
- GCC112, Linux, POWER8, GCC 4.8.5
- GCC112, Linux, POWER8, XLC 13.01
- GCC112, Linux, POWER8, Clang 7.0
- GCC119, AIX, POWER8, GCC 7.2.0
- GCC119, AIX, POWER8, XLC 13.01
- GCC135, Linux, POWER9, GCC 7.0

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

- GCC (Linux GCC, Macports GCC, etc. Consistent across machines)
- XLC 13.0 and earlier (all IBM components)
- XLC 13.1 and later on Linux (LLVM front-end, no compatibility macros)
- XLC 13.1 and later on Linux (LLVM front-end, -qxlcompatmacros option)
- LLVM Clang (traditional Clang compiler)

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

  T | vector type

Parameters

  data | the 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

  src | the 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

  src | the byte array
  off | offset 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

  src | 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 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

  src | the byte array
  off | offset 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

  src | 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 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

  src | the word array
  off | offset 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

  src | 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 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

  src | the word array
  off | offset 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

  src | 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 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

  src | the byte array
  off | offset 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

  src | the 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

  src | the byte array
  off | offset 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

  T | vector type

Parameters

  data | the vector
  dest | the 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

  T | vector type

Parameters

  data | the vector
  off | the byte offset into the array
  dest | the 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

  T | vector type

Parameters

  data | the vector
  dest | the 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

  T | vector type

Parameters

  data | the vector
  off | the byte offset into the array
  dest | the 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

  T | vector type

Parameters

  data | the vector
  dest | the 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

  T | vector type

Parameters

  data | the vector
  off | the byte offset into the array
  dest | the 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

  T | vector type

Parameters

  data | the vector
  dest | the 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

  T | vector type

Parameters

  data | the vector
  off | the byte offset into the array
  dest | the 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

  T | vector type

Parameters

  data | the vector
  dest | the 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

  T | vector type

Parameters

  data | the vector
  off | offset into the dest byte array
  dest | the 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

  T | vector type

Parameters

  data | the vector
  dest | the 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

  T | vector type

Parameters

  data | the vector
  off | offset into the dest word array
  dest | the 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

  T1 | vector type
  T2 | vector type

Parameters

  vec | the vector
  mask | vector 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

  T1 | vector type
  T2 | vector type

Parameters

  vec1 | the first vector
  vec2 | the second vector
  mask | vector 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

  T1 | vector type
  T2 | vector type

Parameters

  vec1 | the first vector
  vec2 | the 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

  T1 | vector type
  T2 | vector type

Parameters

  vec1 | the first vector
  vec2 | the 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

  T1 | vector type
  T2 | vector type

Parameters

  vec1 | the first vector
  vec2 | the 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

  T1 | vector type
  T2 | vector type

Parameters

  vec1 | the first vector
  vec2 | the 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

  T1 | vector type
  T2 | vector type

Parameters

  vec1 | the first vector
  vec2 | the 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

  T1 | vector type
  T2 | vector type

Parameters

  vec1 | the first vector
  vec2 | the 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

  C | shift byte count
  T | vector type

Parameters

  vec | the 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

  C | shift byte count
  T | vector type

Parameters

  vec | the 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

  C | shift byte count
  T | vector type

Parameters

  vec | the 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

  C | shift byte count
  T | vector type

Parameters

  vec | the 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

  C | shift bit count

Parameters

  vec | the 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

  C | shift bit count

Parameters

  vec | the 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

  C | shift bit count

Parameters

  vec | the 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

  C | shift bit count

Parameters

  vec | the 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

  T | vector type

Parameters

  vec | the 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

  T | vector type

Parameters

  val | the 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

  T | vector type

Parameters

  val | the 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

  T1 | vector type
  T2 | vector type

Parameters

  vec1 | the first vector
  vec2 | the 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

  T1 | vector type
  T2 | vector type

Parameters

  vec1 | the first vector
  vec2 | the 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

  T1 | vector type
  T2 | vector type

Parameters

  state | the state vector
  key | the 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

  T1 | vector type
  T2 | vector type

Parameters

  state | the state vector
  key | the 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

  T1 | vector type
  T2 | vector type

Parameters

  state | the state vector
  key | the 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

  T1 | vector type
  T2 | vector type

Parameters

  state | the state vector
  key | the 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

  func | function
  fmask | function mask
  T | vector type

Parameters

  vec | the 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

  func | function
  fmask | function mask
  T | vector type

Parameters

  vec | the 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.