aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlloyd <[email protected]>2008-09-02 06:04:26 +0000
committerlloyd <[email protected]>2008-09-02 06:04:26 +0000
commitfb20917798aae57c46f95746dd75e923f3104f1a (patch)
tree566a8f33efc82af98045990fc47f228fa85ab096
parentae3b9535e41b884d5cc7f039504a66b6e7a25183 (diff)
Remove code moved to bswap.h and rotate.h, also split xor_buf into
xor_buf.h. The optimization using reinterpret_cast previously used in the amd64 module is now used directly in the stock header, as long as BOTAN_TARGET_UNALIGNED_LOADSTOR_OK is set.
-rw-r--r--include/bit_ops.h71
-rw-r--r--include/xor_buf.h65
2 files changed, 65 insertions, 71 deletions
diff --git a/include/bit_ops.h b/include/bit_ops.h
index 0b2e85db5..41c401028 100644
--- a/include/bit_ops.h
+++ b/include/bit_ops.h
@@ -11,77 +11,6 @@
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)
- {
- 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;
- }
-
-/*************************************************
-* XOR Arrays *
-*************************************************/
-inline void xor_buf(byte data[], const byte mask[], u32bit length)
- {
- while(length >= 8)
- {
- data[0] ^= mask[0]; data[1] ^= mask[1];
- data[2] ^= mask[2]; data[3] ^= mask[3];
- data[4] ^= mask[4]; data[5] ^= mask[5];
- data[6] ^= mask[6]; data[7] ^= mask[7];
- data += 8; mask += 8; length -= 8;
- }
- for(u32bit j = 0; j != length; ++j)
- data[j] ^= mask[j];
- }
-
-/*************************************************
-* XOR Arrays *
-*************************************************/
-inline void xor_buf(byte out[], const byte in[],
- const byte mask[], u32bit length)
- {
- while(length >= 8)
- {
- out[0] = in[0] ^ mask[0]; out[1] = in[1] ^ mask[1];
- out[2] = in[2] ^ mask[2]; out[3] = in[3] ^ mask[3];
- out[4] = in[4] ^ mask[4]; out[5] = in[5] ^ mask[5];
- out[6] = in[6] ^ mask[6]; out[7] = in[7] ^ mask[7];
- in += 8; out += 8; mask += 8; length -= 8;
- }
- for(u32bit j = 0; j != length; ++j)
- out[j] = in[j] ^ mask[j];
- }
-
-/*************************************************
* Simple Bit Manipulation *
*************************************************/
bool power_of_2(u64bit);
diff --git a/include/xor_buf.h b/include/xor_buf.h
new file mode 100644
index 000000000..0a71aef3e
--- /dev/null
+++ b/include/xor_buf.h
@@ -0,0 +1,65 @@
+/*************************************************
+* Xor Operations Header File *
+* (C) 1999-2008 Jack Lloyd *
+*************************************************/
+
+#ifndef BOTAN_XOR_BUF_H__
+#define BOTAN_XOR_BUF_H__
+
+#include <botan/types.h>
+
+namespace Botan {
+
+/*************************************************
+* XOR Arrays *
+*************************************************/
+inline void xor_buf(byte out[], const byte in[], u32bit length)
+ {
+ while(length >= 8)
+ {
+#if BOTAN_UNALIGNED_LOADSTOR_OK
+ *reinterpret_cast<u64bit*>(out) ^= *reinterpret_cast<const u64bit*>(in);
+#else
+ out[0] ^= in[0]; out[1] ^= in[1];
+ out[2] ^= in[2]; out[3] ^= in[3];
+ out[4] ^= in[4]; out[5] ^= in[5];
+ out[6] ^= in[6]; out[7] ^= in[7];
+#endif
+
+ out += 8; in += 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)
+ {
+#if BOTAN_UNALIGNED_LOADSTOR_OK
+ *reinterpret_cast<u64bit*>(out) =
+ *reinterpret_cast<const u64bit*>(in) ^
+ *reinterpret_cast<const u64bit*>(in2);
+#else
+ out[0] = in[0] ^ in2[0]; out[1] = in[1] ^ in2[1];
+ out[2] = in[2] ^ in2[2]; out[3] = in[3] ^ in2[3];
+ out[4] = in[4] ^ in2[4]; out[5] = in[5] ^ in2[5];
+ out[6] = in[6] ^ in2[6]; out[7] = in[7] ^ in2[7];
+#endif
+
+ in += 8; in2 += 8; out += 8; length -= 8;
+ }
+
+ for(u32bit j = 0; j != length; ++j)
+ out[j] = in[j] ^ in2[j];
+ }
+
+}
+
+#endif