diff options
author | lloyd <[email protected]> | 2008-09-02 06:03:04 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2008-09-02 06:03:04 +0000 |
commit | ae3b9535e41b884d5cc7f039504a66b6e7a25183 (patch) | |
tree | 5807c29e225f07a4b8f078626feae0ceed56969e | |
parent | 1bc7708bd51ea8bb56013b0f9aa4b2dbfe86cf9b (diff) |
Split byte swap code and word rotation code off into bswap.h and rotate.h
-rw-r--r-- | include/bswap.h | 39 | ||||
-rw-r--r-- | include/loadstor.h | 4 | ||||
-rw-r--r-- | include/rotate.h | 28 | ||||
-rw-r--r-- | modules/mp_amd64/bit_ops.h | 91 | ||||
-rw-r--r-- | modules/mp_amd64/bswap.h | 36 | ||||
-rw-r--r-- | modules/mp_amd64/modinfo.txt | 2 |
6 files changed, 106 insertions, 94 deletions
diff --git a/include/bswap.h b/include/bswap.h new file mode 100644 index 000000000..e38d3c6fa --- /dev/null +++ b/include/bswap.h @@ -0,0 +1,39 @@ +/************************************************* +* Byte Swapping Operations Header File * +* (C) 1999-2008 Jack Lloyd * +*************************************************/ + +#ifndef BOTAN_BSWAP_H__ +#define BOTAN_BSWAP_H__ + +#include <botan/types.h> +#include <botan/rotate.h> + +namespace Botan { + +/************************************************* +* Byte Swapping Functions * +*************************************************/ +inline u16bit reverse_bytes(u16bit input) + { + return rotate_left(input, 8); + } + +inline u32bit reverse_bytes(u32bit input) + { + input = ((input & 0xFF00FF00) >> 8) | ((input & 0x00FF00FF) << 8); + return rotate_left(input, 16); + } + +inline u64bit reverse_bytes(u64bit input) + { + u32bit hi = ((input >> 40) & 0x00FF00FF) | ((input >> 24) & 0xFF00FF00); + u32bit lo = ((input & 0xFF00FF00) >> 8) | ((input & 0x00FF00FF) << 8); + hi = (hi << 16) | (hi >> 16); + lo = (lo << 16) | (lo >> 16); + return (static_cast<u64bit>(lo) << 32) | hi; + } + +} + +#endif diff --git a/include/loadstor.h b/include/loadstor.h index 5b5746cdb..0bcafe411 100644 --- a/include/loadstor.h +++ b/include/loadstor.h @@ -8,11 +8,11 @@ #define BOTAN_LOAD_STORE_H__ #include <botan/types.h> +#include <botan/bswap.h> +#include <botan/rotate.h> #if BOTAN_TARGET_UNALIGNED_LOADSTOR_OK -#include <botan/bit_ops.h> - #if defined(BOTAN_TARGET_CPU_IS_BIG_ENDIAN) #define BOTAN_ENDIAN_N2B(x) (x) diff --git a/include/rotate.h b/include/rotate.h new file mode 100644 index 000000000..d90e207b5 --- /dev/null +++ b/include/rotate.h @@ -0,0 +1,28 @@ +/************************************************* +* Word Rotation Operations Header File * +* (C) 1999-2008 Jack Lloyd * +*************************************************/ + +#ifndef BOTAN_WORD_ROTATE_H__ +#define BOTAN_WORD_ROTATE_H__ + +#include <botan/types.h> + +namespace Botan { + +/************************************************* +* Word Rotation Functions * +*************************************************/ +template<typename T> inline T rotate_left(T input, u32bit rot) + { + return static_cast<T>((input << rot) | (input >> (8*sizeof(T)-rot)));; + } + +template<typename T> inline T rotate_right(T input, u32bit rot) + { + return static_cast<T>((input >> rot) | (input << (8*sizeof(T)-rot))); + } + +} + +#endif diff --git a/modules/mp_amd64/bit_ops.h b/modules/mp_amd64/bit_ops.h deleted file mode 100644 index 1a829af96..000000000 --- a/modules/mp_amd64/bit_ops.h +++ /dev/null @@ -1,91 +0,0 @@ -/************************************************* -* Bit/Word Operations Header File * -* (C) 1999-2008 Jack Lloyd * -*************************************************/ - -#ifndef BOTAN_BIT_OPS_H__ -#define BOTAN_BIT_OPS_H__ - -#include <botan/types.h> - -namespace Botan { - -/************************************************* -* Word Rotation Functions * -*************************************************/ -template<typename T> inline T rotate_left(T input, u32bit rot) - { - return static_cast<T>((input << rot) | (input >> (8*sizeof(T)-rot)));; - } - -template<typename T> inline T rotate_right(T input, u32bit rot) - { - return static_cast<T>((input >> rot) | (input << (8*sizeof(T)-rot))); - } - -/************************************************* -* Byte Swapping Functions * -*************************************************/ -inline u16bit reverse_bytes(u16bit input) - { - return rotate_left(input, 8); - } - -inline u32bit reverse_bytes(u32bit input) - { - asm("bswapl %0" : "=r" (input) : "0" (input)); - return input; - } - -inline u64bit reverse_bytes(u64bit input) - { - asm("bswapq %0" : "=r" (input) : "0" (input)); - return input; - } - -/************************************************* -* XOR Arrays * -*************************************************/ -inline void xor_buf(byte out[], const byte in[], u32bit length) - { - while(length >= 8) - { - *reinterpret_cast<u64bit*>(out) ^= *reinterpret_cast<const u64bit*>(in); - in += 8; out += 8; length -= 8; - } - - for(u32bit j = 0; j != length; ++j) - out[j] ^= in[j]; - } - -/************************************************* -* XOR Arrays * -*************************************************/ -inline void xor_buf(byte out[], const byte in[], - const byte in2[], u32bit length) - { - while(length >= 8) - { - *reinterpret_cast<u64bit*>(out) = - *reinterpret_cast<const u64bit*>(in) ^ - *reinterpret_cast<const u64bit*>(in2); - - in += 8; in2 += 8; out += 8; length -= 8; - } - - for(u32bit j = 0; j != length; ++j) - out[j] = in[j] ^ in2[j]; - } - -/************************************************* -* Simple Bit Manipulation * -*************************************************/ -bool power_of_2(u64bit); -u32bit high_bit(u64bit); -u32bit low_bit(u64bit); -u32bit significant_bytes(u64bit); -u32bit hamming_weight(u64bit); - -} - -#endif diff --git a/modules/mp_amd64/bswap.h b/modules/mp_amd64/bswap.h new file mode 100644 index 000000000..3c77b460c --- /dev/null +++ b/modules/mp_amd64/bswap.h @@ -0,0 +1,36 @@ +/************************************************* +* Byte Swapping Operations Header File * +* (C) 1999-2008 Jack Lloyd * +*************************************************/ + +#ifndef BOTAN_BSWAP_H__ +#define BOTAN_BSWAP_H__ + +#include <botan/types.h> +#include <botan/rotate.h> + +namespace Botan { + +/************************************************* +* Byte Swapping Functions * +*************************************************/ +inline u16bit reverse_bytes(u16bit input) + { + return rotate_left(input, 8); + } + +inline u32bit reverse_bytes(u32bit input) + { + asm("bswapl %0" : "=r" (input) : "0" (input)); + return input; + } + +inline u64bit reverse_bytes(u64bit input) + { + asm("bswapq %0" : "=r" (input) : "0" (input)); + return input; + } + +} + +#endif diff --git a/modules/mp_amd64/modinfo.txt b/modules/mp_amd64/modinfo.txt index 4353ec71e..8e6b72d20 100644 --- a/modules/mp_amd64/modinfo.txt +++ b/modules/mp_amd64/modinfo.txt @@ -5,7 +5,7 @@ mp_bits 64 load_on asm_ok <replace> -bit_ops.h +bswap.h mp_asm.h mp_asmi.h </replace> |