diff options
Diffstat (limited to 'src/lib/utils')
-rw-r--r-- | src/lib/utils/rotate.h | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/src/lib/utils/rotate.h b/src/lib/utils/rotate.h index cb92daf96..6aeb631b3 100644 --- a/src/lib/utils/rotate.h +++ b/src/lib/utils/rotate.h @@ -18,7 +18,7 @@ namespace Botan { * @param rot the number of bits to rotate * @return input rotated left by rot bits */ -template<typename T> inline T rotate_left(T input, size_t rot) +template<typename T> inline T rotate_left(T input, uint8_t rot) { rot %= 8 * sizeof(T); return (rot == 0) ? input : static_cast<T>((input << rot) | (input >> (8*sizeof(T)-rot)));; @@ -30,12 +30,34 @@ template<typename T> inline T rotate_left(T input, size_t rot) * @param rot the number of bits to rotate * @return input rotated right by rot bits */ -template<typename T> inline T rotate_right(T input, size_t rot) +template<typename T> inline T rotate_right(T input, uint8_t rot) { rot %= 8 * sizeof(T); return (rot == 0) ? input : static_cast<T>((input >> rot) | (input << (8*sizeof(T)-rot))); } +#if BOTAN_USE_GCC_INLINE_ASM + +#if defined(BOTAN_TARGET_ARCH_IS_X86_64) || defined(BOTAN_TARGET_ARCH_IS_X86_32) + +template<> +inline uint32_t rotate_left(uint32_t input, uint8_t rot) + { + asm("roll %1,%0" : "+r" (input) : "c" (rot)); + return input; + } + +template<> +inline uint32_t rotate_right(uint32_t input, uint8_t rot) + { + asm("rorl %1,%0" : "+r" (input) : "c" (rot)); + return input; + } + +#endif + +#endif + } #endif |