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)