aboutsummaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
authorlloyd <[email protected]>2008-03-09 18:33:28 +0000
committerlloyd <[email protected]>2008-03-09 18:33:28 +0000
commitf2bd1be860136bebd63f487b996f77f148c0aae3 (patch)
tree07bf594c693646de44e4bf7ca0a9f7a8945cc6ad /modules
parent17cc4459d1e0227fc7c26836fb142da1b8e9900a (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.h90
-rw-r--r--modules/mp_amd64/modinfo.txt1
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>