aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlloyd <[email protected]>2008-09-02 06:03:04 +0000
committerlloyd <[email protected]>2008-09-02 06:03:04 +0000
commitae3b9535e41b884d5cc7f039504a66b6e7a25183 (patch)
tree5807c29e225f07a4b8f078626feae0ceed56969e
parent1bc7708bd51ea8bb56013b0f9aa4b2dbfe86cf9b (diff)
Split byte swap code and word rotation code off into bswap.h and rotate.h
-rw-r--r--include/bswap.h39
-rw-r--r--include/loadstor.h4
-rw-r--r--include/rotate.h28
-rw-r--r--modules/mp_amd64/bit_ops.h91
-rw-r--r--modules/mp_amd64/bswap.h36
-rw-r--r--modules/mp_amd64/modinfo.txt2
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>