8 #ifndef BOTAN_SIMD_ALTIVEC_H__     9 #define BOTAN_SIMD_ALTIVEC_H__    11 #if defined(BOTAN_TARGET_CPU_HAS_ALTIVEC)    13 #include <botan/loadstor.h>    14 #include <botan/cpuid.h>    27       SIMD_Altivec(
const u32bit B[4])
    29          reg = (__vector 
unsigned int){B[0], B[1], B[2], B[3]};
    34          reg = (__vector 
unsigned int){B0, B1, B2, B3};
    39          reg = (__vector 
unsigned int){B, B, B, B};
    42       static SIMD_Altivec 
load_le(
const void* in)
    46          __vector 
unsigned int R0 = vec_ld(0, in_32);
    47          __vector 
unsigned int R1 = vec_ld(12, in_32);
    49          __vector 
unsigned char perm = vec_lvsl(0, in_32);
    51          perm = vec_xor(perm, vec_splat_u8(3));
    53          R0 = vec_perm(R0, R1, perm);
    55          return SIMD_Altivec(R0);
    58       static SIMD_Altivec 
load_be(
const void* in)
    62          __vector 
unsigned int R0 = vec_ld(0, in_32);
    63          __vector 
unsigned int R1 = vec_ld(12, in_32);
    65          __vector 
unsigned char perm = vec_lvsl(0, in_32);
    67          R0 = vec_perm(R0, R1, perm);
    69          return SIMD_Altivec(R0);
    74          __vector 
unsigned char perm = vec_lvsl(0, (
u32bit*)0);
    76          perm = vec_xor(perm, vec_splat_u8(3));
    79             __vector 
unsigned int V;
    83          vec.V = vec_perm(reg, reg, perm);
    91             __vector 
unsigned int V;
   102          __vector 
unsigned int rot_vec =
   103             (__vector 
unsigned int){rot, rot, rot, rot};
   105          reg = vec_rl(reg, rot_vec);
   115          reg = vec_add(reg, other.reg);
   118       SIMD_Altivec 
operator+(
const SIMD_Altivec& other)
 const   120          return vec_add(reg, other.reg);
   123       void operator-=(
const SIMD_Altivec& other)
   125          reg = vec_sub(reg, other.reg);
   128       SIMD_Altivec 
operator-(
const SIMD_Altivec& other)
 const   130          return vec_sub(reg, other.reg);
   133       void operator^=(
const SIMD_Altivec& other)
   135          reg = vec_xor(reg, other.reg);
   138       SIMD_Altivec 
operator^(
const SIMD_Altivec& other)
 const   140          return vec_xor(reg, other.reg);
   143       void operator|=(
const SIMD_Altivec& other)
   145          reg = vec_or(reg, other.reg);
   148       SIMD_Altivec operator&(
const SIMD_Altivec& other)
   150          return vec_and(reg, other.reg);
   153       void operator&=(
const SIMD_Altivec& other)
   155          reg = vec_and(reg, other.reg);
   160          __vector 
unsigned int shift_vec =
   161             (__vector 
unsigned int){shift, shift, shift, shift};
   163          return vec_sl(reg, shift_vec);
   168          __vector 
unsigned int shift_vec =
   169             (__vector 
unsigned int){shift, shift, shift, shift};
   171          return vec_sr(reg, shift_vec);
   174       SIMD_Altivec operator~()
 const   176          return vec_nor(reg, reg);
   179       SIMD_Altivec andc(
const SIMD_Altivec& other)
   182          return vec_andc(other.reg, reg);
   185       SIMD_Altivec bswap()
 const   187          __vector 
unsigned char perm = vec_lvsl(0, (
u32bit*)0);
   189          perm = vec_xor(perm, vec_splat_u8(3));
   191          return SIMD_Altivec(vec_perm(reg, reg, perm));
   194       static void transpose(SIMD_Altivec& B0, SIMD_Altivec& B1,
   195                             SIMD_Altivec& B2, SIMD_Altivec& B3)
   197          __vector 
unsigned int T0 = vec_mergeh(B0.reg, B2.reg);
   198          __vector 
unsigned int T1 = vec_mergel(B0.reg, B2.reg);
   199          __vector 
unsigned int T2 = vec_mergeh(B1.reg, B3.reg);
   200          __vector 
unsigned int T3 = vec_mergel(B1.reg, B3.reg);
   202          B0.reg = vec_mergeh(T0, T2);
   203          B1.reg = vec_mergel(T0, T2);
   204          B2.reg = vec_mergeh(T1, T3);
   205          B3.reg = vec_mergel(T1, T3);
   209       SIMD_Altivec(__vector 
unsigned int input) { reg = input; }
   211       __vector 
unsigned int reg;
 T load_be(const byte in[], size_t off)
T load_le(const byte in[], size_t off)
void store_le(u16bit in, byte out[2])
T rotate_left(T input, size_t rot)
int operator>>(int fd, Pipe &pipe)
static bool has_altivec()
OctetString operator^(const OctetString &k1, const OctetString &k2)
int operator<<(int fd, Pipe &pipe)
OctetString operator+(const OctetString &k1, const OctetString &k2)
T rotate_right(T input, size_t rot)
MemoryRegion< T > & operator+=(MemoryRegion< T > &out, const MemoryRegion< T > &in)
void store_be(u16bit in, byte out[2])
BigInt operator-(const BigInt &x, const BigInt &y)