aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/utils
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/utils')
-rw-r--r--src/lib/utils/rotate.h26
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