diff options
author | lloyd <[email protected]> | 2008-03-09 18:33:28 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2008-03-09 18:33:28 +0000 |
commit | f2bd1be860136bebd63f487b996f77f148c0aae3 (patch) | |
tree | 07bf594c693646de44e4bf7ca0a9f7a8945cc6ad /modules | |
parent | 17cc4459d1e0227fc7c26836fb142da1b8e9900a (diff) |
Add a version of bit_ops.h with bswapl/bswapq statements. The xor_buf
takes advantage of unaligned reads/writes being legal for some extra performance,
but should be rewritten to use SSE2 and non-termporal writes.
Most of the functions in bit_ops.cpp are implemented by x86-64, just not
easily accessible from C++
Diffstat (limited to 'modules')
-rw-r--r-- | modules/mp_amd64/bit_ops.h | 90 | ||||
-rw-r--r-- | modules/mp_amd64/modinfo.txt | 1 |
2 files changed, 91 insertions, 0 deletions
diff --git a/modules/mp_amd64/bit_ops.h b/modules/mp_amd64/bit_ops.h new file mode 100644 index 000000000..dd7b33f32 --- /dev/null +++ b/modules/mp_amd64/bit_ops.h @@ -0,0 +1,90 @@ +/************************************************* +* Bit/Word Operations Header File * +* (C) 1999-2008 The Botan Project * +*************************************************/ + +#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/modinfo.txt b/modules/mp_amd64/modinfo.txt index 527d9a2c6..4353ec71e 100644 --- a/modules/mp_amd64/modinfo.txt +++ b/modules/mp_amd64/modinfo.txt @@ -5,6 +5,7 @@ mp_bits 64 load_on asm_ok <replace> +bit_ops.h mp_asm.h mp_asmi.h </replace> |