9 #ifndef BOTAN_BYTE_SWAP_H__ 10 #define BOTAN_BYTE_SWAP_H__ 12 #include <botan/types.h> 13 #include <botan/rotate.h> 15 #if defined(BOTAN_TARGET_CPU_HAS_SSE2) && !defined(BOTAN_NO_SSE_INTRINSICS) 16 #include <emmintrin.h> 34 #if BOTAN_GCC_VERSION >= 430 && !defined(BOTAN_TARGET_CPU_IS_ARM_FAMILY) 42 return __builtin_bswap32(val);
44 #elif BOTAN_USE_GCC_INLINE_ASM && defined(BOTAN_TARGET_CPU_IS_X86_FAMILY) 47 asm(
"bswapl %0" :
"=r" (val) :
"0" (val));
50 #elif BOTAN_USE_GCC_INLINE_ASM && defined(BOTAN_TARGET_CPU_IS_ARM_FAMILY) 52 asm (
"eor r3, %1, %1, ror #16\n\t" 53 "bic r3, r3, #0x00FF0000\n\t" 54 "mov %0, %1, ror #8\n\t" 55 "eor %0, %0, r3, lsr #8" 62 #elif defined(_MSC_VER) && defined(BOTAN_TARGET_ARCH_IS_X86_32) 82 #if BOTAN_GCC_VERSION >= 430 85 return __builtin_bswap64(val);
87 #elif BOTAN_USE_GCC_INLINE_ASM && defined(BOTAN_TARGET_ARCH_IS_X86_64) 89 asm(
"bswapq %0" :
"=r" (val) :
"0" (val));
104 return (static_cast<u64bit>(lo) << 32) | hi;
120 #if defined(BOTAN_TARGET_CPU_HAS_SSE2) && !defined(BOTAN_NO_SSE_INTRINSICS) 128 __m128i T = _mm_loadu_si128(reinterpret_cast<const __m128i*>(x));
130 T = _mm_shufflehi_epi16(T, _MM_SHUFFLE(2, 3, 0, 1));
131 T = _mm_shufflelo_epi16(T, _MM_SHUFFLE(2, 3, 0, 1));
133 T = _mm_or_si128(_mm_srli_epi16(T, 8), _mm_slli_epi16(T, 8));
135 _mm_storeu_si128(reinterpret_cast<__m128i*>(x), T);
T rotate_left(T input, size_t rot)
unsigned long long u64bit
T rotate_right(T input, size_t rot)
u16bit reverse_bytes(u16bit val)