summaryrefslogtreecommitdiff
path: root/misc.h
diff options
context:
space:
mode:
authorJeffrey Walton <noloader@gmail.com>2019-05-28 02:50:58 -0400
committerJeffrey Walton <noloader@gmail.com>2019-05-28 02:50:58 -0400
commita2e7c26f6cd1f6f3fb02b5d15b0803cfcd28a4a8 (patch)
treedbb06bdcf3ed31d58ab44e9f758989f5516fa9ee /misc.h
parent623059f28c67f64ca009b16a55d0437d142977f0 (diff)
downloadcryptopp-git-a2e7c26f6cd1f6f3fb02b5d15b0803cfcd28a4a8.tar.gz
Add 16-bit rev16 and rbit
Diffstat (limited to 'misc.h')
-rw-r--r--misc.h14
1 files changed, 11 insertions, 3 deletions
diff --git a/misc.h b/misc.h
index 3d16a3dd..a8f8383b 100644
--- a/misc.h
+++ b/misc.h
@@ -2005,7 +2005,11 @@ inline byte ByteReverse(byte value)
/// performs a 8-bit rotate on the word16.
inline word16 ByteReverse(word16 value)
{
-#if defined(CRYPTOPP_BYTESWAP_AVAILABLE)
+#if defined(CRYPTOPP_ARM_BYTEREV_AVAILABLE)
+ word16 rvalue;
+ __asm__ ("rev16 %0, %1" : "=r" (rvalue) : "r" (value));
+ return rvalue;
+#elif defined(CRYPTOPP_BYTESWAP_AVAILABLE)
return bswap_16(value);
#elif (_MSC_VER >= 1400) || (defined(_MSC_VER) && !defined(_DLL))
return _byteswap_ushort(value);
@@ -2081,10 +2085,12 @@ inline byte BitReverse(byte value)
inline word16 BitReverse(word16 value)
{
#if defined(CRYPTOPP_ARM_BITREV_AVAILABLE)
+ // 4 instructions on ARM.
word32 rvalue;
- __asm__ ("rbit %0, %1" : "=r" (rvalue) : "r" (word32(value)));
+ __asm__ ("rbit %0, %1" : "=r" (rvalue) : "r" (value));
return word16(rvalue >> 16);
#else
+ // 15 instructions on ARM.
value = word16((value & 0xAAAA) >> 1) | word16((value & 0x5555) << 1);
value = word16((value & 0xCCCC) >> 2) | word16((value & 0x3333) << 2);
value = word16((value & 0xF0F0) >> 4) | word16((value & 0x0F0F) << 4);
@@ -2098,10 +2104,12 @@ inline word16 BitReverse(word16 value)
inline word32 BitReverse(word32 value)
{
#if defined(CRYPTOPP_ARM_BITREV_AVAILABLE)
+ // 2 instructions on ARM.
word32 rvalue;
__asm__ ("rbit %0, %1" : "=r" (rvalue) : "r" (value));
return rvalue;
#else
+ // 19 instructions on ARM.
value = word32((value & 0xAAAAAAAA) >> 1) | word32((value & 0x55555555) << 1);
value = word32((value & 0xCCCCCCCC) >> 2) | word32((value & 0x33333333) << 2);
value = word32((value & 0xF0F0F0F0) >> 4) | word32((value & 0x0F0F0F0F) << 4);
@@ -2144,7 +2152,7 @@ inline T BitReverse(T value)
else
{
CRYPTOPP_ASSERT(0);
- return 0;
+ return (T)BitReverse((word64)value);
}
}