Add 16-bit rev16 and rbit
parent
623059f28c
commit
a2e7c26f6c
14
misc.h
14
misc.h
|
|
@ -2005,7 +2005,11 @@ inline byte ByteReverse(byte value)
|
||||||
/// performs a 8-bit rotate on the word16.
|
/// performs a 8-bit rotate on the word16.
|
||||||
inline word16 ByteReverse(word16 value)
|
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);
|
return bswap_16(value);
|
||||||
#elif (_MSC_VER >= 1400) || (defined(_MSC_VER) && !defined(_DLL))
|
#elif (_MSC_VER >= 1400) || (defined(_MSC_VER) && !defined(_DLL))
|
||||||
return _byteswap_ushort(value);
|
return _byteswap_ushort(value);
|
||||||
|
|
@ -2081,10 +2085,12 @@ inline byte BitReverse(byte value)
|
||||||
inline word16 BitReverse(word16 value)
|
inline word16 BitReverse(word16 value)
|
||||||
{
|
{
|
||||||
#if defined(CRYPTOPP_ARM_BITREV_AVAILABLE)
|
#if defined(CRYPTOPP_ARM_BITREV_AVAILABLE)
|
||||||
|
// 4 instructions on ARM.
|
||||||
word32 rvalue;
|
word32 rvalue;
|
||||||
__asm__ ("rbit %0, %1" : "=r" (rvalue) : "r" (word32(value)));
|
__asm__ ("rbit %0, %1" : "=r" (rvalue) : "r" (value));
|
||||||
return word16(rvalue >> 16);
|
return word16(rvalue >> 16);
|
||||||
#else
|
#else
|
||||||
|
// 15 instructions on ARM.
|
||||||
value = word16((value & 0xAAAA) >> 1) | word16((value & 0x5555) << 1);
|
value = word16((value & 0xAAAA) >> 1) | word16((value & 0x5555) << 1);
|
||||||
value = word16((value & 0xCCCC) >> 2) | word16((value & 0x3333) << 2);
|
value = word16((value & 0xCCCC) >> 2) | word16((value & 0x3333) << 2);
|
||||||
value = word16((value & 0xF0F0) >> 4) | word16((value & 0x0F0F) << 4);
|
value = word16((value & 0xF0F0) >> 4) | word16((value & 0x0F0F) << 4);
|
||||||
|
|
@ -2098,10 +2104,12 @@ inline word16 BitReverse(word16 value)
|
||||||
inline word32 BitReverse(word32 value)
|
inline word32 BitReverse(word32 value)
|
||||||
{
|
{
|
||||||
#if defined(CRYPTOPP_ARM_BITREV_AVAILABLE)
|
#if defined(CRYPTOPP_ARM_BITREV_AVAILABLE)
|
||||||
|
// 2 instructions on ARM.
|
||||||
word32 rvalue;
|
word32 rvalue;
|
||||||
__asm__ ("rbit %0, %1" : "=r" (rvalue) : "r" (value));
|
__asm__ ("rbit %0, %1" : "=r" (rvalue) : "r" (value));
|
||||||
return rvalue;
|
return rvalue;
|
||||||
#else
|
#else
|
||||||
|
// 19 instructions on ARM.
|
||||||
value = word32((value & 0xAAAAAAAA) >> 1) | word32((value & 0x55555555) << 1);
|
value = word32((value & 0xAAAAAAAA) >> 1) | word32((value & 0x55555555) << 1);
|
||||||
value = word32((value & 0xCCCCCCCC) >> 2) | word32((value & 0x33333333) << 2);
|
value = word32((value & 0xCCCCCCCC) >> 2) | word32((value & 0x33333333) << 2);
|
||||||
value = word32((value & 0xF0F0F0F0) >> 4) | word32((value & 0x0F0F0F0F) << 4);
|
value = word32((value & 0xF0F0F0F0) >> 4) | word32((value & 0x0F0F0F0F) << 4);
|
||||||
|
|
@ -2144,7 +2152,7 @@ inline T BitReverse(T value)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CRYPTOPP_ASSERT(0);
|
CRYPTOPP_ASSERT(0);
|
||||||
return 0;
|
return (T)BitReverse((word64)value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue