1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* fix for MSVC ...evil! */
2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef _MSC_VER
3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #define CONST64(n) n ## ui64
4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   typedef unsigned __int64 ulong64;
5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #define CONST64(n) n ## ULL
7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   typedef unsigned long long ulong64;
8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* this is the "32-bit at least" data type
11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Re-define it to suit your platform but it must be at least 32-bits
12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if defined(__x86_64__) || (defined(__sparc__) && defined(__arch64__))
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   typedef unsigned ulong32;
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   typedef unsigned long ulong32;
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* ---- HELPER MACROS ---- */
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ENDIAN_NEUTRAL
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define STORE32L(x, y)                                                                     \
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255);   \
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LOAD32L(x, y)                            \
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { x = ((unsigned long)((y)[3] & 255)<<24) | \
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           ((unsigned long)((y)[2] & 255)<<16) | \
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           ((unsigned long)((y)[1] & 255)<<8)  | \
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           ((unsigned long)((y)[0] & 255)); }
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define STORE64L(x, y)                                                                     \
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255);   \
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255);   \
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255);   \
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LOAD64L(x, y)                                                       \
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define STORE32H(x, y)                                                                     \
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255);   \
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); }
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LOAD32H(x, y)                            \
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { x = ((unsigned long)((y)[0] & 255)<<24) | \
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           ((unsigned long)((y)[1] & 255)<<16) | \
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           ((unsigned long)((y)[2] & 255)<<8)  | \
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           ((unsigned long)((y)[3] & 255)); }
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define STORE64H(x, y)                                                                     \
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255);     \
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255);     \
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255);     \
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LOAD64H(x, y)                                                      \
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* ENDIAN_NEUTRAL */
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ENDIAN_LITTLE
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if !defined(LTC_NO_BSWAP) && (defined(INTEL_CC) || (defined(__GNUC__) && (defined(__DJGPP__) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__i386__) || defined(__x86_64__))))
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define STORE32H(x, y)           \
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectasm __volatile__ (               \
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   "bswapl %0     \n\t"          \
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   "movl   %0,(%1)\n\t"          \
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   "bswapl %0     \n\t"          \
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      ::"r"(x), "r"(y));
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LOAD32H(x, y)          \
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectasm __volatile__ (             \
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   "movl (%1),%0\n\t"          \
82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   "bswapl %0\n\t"             \
83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   :"=r"(x): "r"(y));
84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define STORE32H(x, y)                                                                     \
88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255);   \
89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); }
90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LOAD32H(x, y)                            \
92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { x = ((unsigned long)((y)[0] & 255)<<24) | \
93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           ((unsigned long)((y)[1] & 255)<<16) | \
94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           ((unsigned long)((y)[2] & 255)<<8)  | \
95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           ((unsigned long)((y)[3] & 255)); }
96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* x86_64 processor */
101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if !defined(LTC_NO_BSWAP) && (defined(__GNUC__) && defined(__x86_64__))
102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define STORE64H(x, y)           \
104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectasm __volatile__ (               \
105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   "bswapq %0     \n\t"          \
106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   "movq   %0,(%1)\n\t"          \
107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   "bswapq %0     \n\t"          \
108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      ::"r"(x), "r"(y));
109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LOAD64H(x, y)          \
111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectasm __volatile__ (             \
112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   "movq (%1),%0\n\t"          \
113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   "bswapq %0\n\t"             \
114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   :"=r"(x): "r"(y));
115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define STORE64H(x, y)                                                                     \
119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255);     \
120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255);     \
121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255);     \
122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LOAD64H(x, y)                                                      \
125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }
129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ENDIAN_32BITWORD
133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define STORE32L(x, y)        \
135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { ulong32  __t = (x); XMEMCPY(y, &__t, 4); }
136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LOAD32L(x, y)         \
138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     XMEMCPY(&(x), y, 4);
139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define STORE64L(x, y)                                                                     \
141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255);   \
142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255);   \
143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255);   \
144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LOAD64L(x, y)                                                       \
147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else /* 64-bit words then  */
153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define STORE32L(x, y)        \
155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { ulong32 __t = (x); XMEMCPY(y, &__t, 4); }
156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LOAD32L(x, y)         \
158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { XMEMCPY(&(x), y, 4); x &= 0xFFFFFFFF; }
159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define STORE64L(x, y)        \
161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { ulong64 __t = (x); XMEMCPY(y, &__t, 8); }
162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LOAD64L(x, y)         \
164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    { XMEMCPY(&(x), y, 8); }
165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* ENDIAN_64BITWORD */
167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* ENDIAN_LITTLE */
169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
170f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ENDIAN_BIG
171f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define STORE32L(x, y)                                                                     \
172f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255);   \
173f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
174f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
175f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LOAD32L(x, y)                            \
176f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { x = ((unsigned long)((y)[3] & 255)<<24) | \
177f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           ((unsigned long)((y)[2] & 255)<<16) | \
178f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           ((unsigned long)((y)[1] & 255)<<8)  | \
179f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           ((unsigned long)((y)[0] & 255)); }
180f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
181f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define STORE64L(x, y)                                                                     \
182f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255);     \
183f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255);     \
184f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255);     \
185f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
186f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
187f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LOAD64L(x, y)                                                      \
188f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48) | \
189f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32) | \
190f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16) | \
191f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
192f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
193f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ENDIAN_32BITWORD
194f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
195f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define STORE32H(x, y)        \
196f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { ulong32 __t = (x); XMEMCPY(y, &__t, 4); }
197f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
198f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LOAD32H(x, y)         \
199f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     XMEMCPY(&(x), y, 4);
200f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
201f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define STORE64H(x, y)                                                                     \
202f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255);   \
203f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255);   \
204f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255);   \
205f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       (y)[6] = (unsigned char)(((x)>>8)&255);  (y)[7] = (unsigned char)((x)&255); }
206f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
207f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LOAD64H(x, y)                                                       \
208f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48)| \
209f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32)| \
210f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16)| \
211f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           (((ulong64)((y)[6] & 255))<<8)| (((ulong64)((y)[7] & 255))); }
212f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
213f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else /* 64-bit words then  */
214f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
215f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define STORE32H(x, y)        \
216f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { ulong32 __t = (x); XMEMCPY(y, &__t, 4); }
217f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
218f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LOAD32H(x, y)         \
219f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { XMEMCPY(&(x), y, 4); x &= 0xFFFFFFFF; }
220f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
221f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define STORE64H(x, y)        \
222f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { ulong64 __t = (x); XMEMCPY(y, &__t, 8); }
223f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
224f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LOAD64H(x, y)         \
225f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    { XMEMCPY(&(x), y, 8); }
226f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
227f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* ENDIAN_64BITWORD */
228f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* ENDIAN_BIG */
229f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
230f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define BSWAP(x)  ( ((x>>24)&0x000000FFUL) | ((x<<24)&0xFF000000UL)  | \
231f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                    ((x>>8)&0x0000FF00UL)  | ((x<<8)&0x00FF0000UL) )
232f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
233f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
234f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* 32-bit Rotates */
235f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if defined(_MSC_VER)
236f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
237f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* instrinsic rotate */
238f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <stdlib.h>
239f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#pragma intrinsic(_lrotr,_lrotl)
240f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define ROR(x,n) _lrotr(x,n)
241f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define ROL(x,n) _lrotl(x,n)
242f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define RORc(x,n) _lrotr(x,n)
243f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define ROLc(x,n) _lrotl(x,n)
244f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
245f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#elif !defined(__STRICT_ANSI__) && defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) && !defined(INTEL_CC) && !defined(LTC_NO_ASM)
246f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
247f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic inline unsigned ROL(unsigned word, int i)
248f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
249f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   asm ("roll %%cl,%0"
250f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"=r" (word)
251f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"0" (word),"c" (i));
252f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return word;
253f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
254f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
255f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic inline unsigned ROR(unsigned word, int i)
256f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
257f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   asm ("rorl %%cl,%0"
258f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"=r" (word)
259f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"0" (word),"c" (i));
260f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return word;
261f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
262f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
263f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef LTC_NO_ROLC
264f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
265f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic inline unsigned ROLc(unsigned word, const int i)
266f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
267f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   asm ("roll %2,%0"
268f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"=r" (word)
269f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"0" (word),"I" (i));
270f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return word;
271f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
272f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
273f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic inline unsigned RORc(unsigned word, const int i)
274f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
275f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   asm ("rorl %2,%0"
276f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"=r" (word)
277f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"0" (word),"I" (i));
278f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return word;
279f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
280f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
281f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
282f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
283f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define ROLc ROL
284f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define RORc ROR
285f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
286f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
287f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
288f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#elif !defined(__STRICT_ANSI__) && defined(LTC_PPC32)
289f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
290f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic inline unsigned ROL(unsigned word, int i)
291f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
292f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   asm ("rotlw %0,%0,%2"
293f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"=r" (word)
294f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"0" (word),"r" (i));
295f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return word;
296f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
297f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
298f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic inline unsigned ROR(unsigned word, int i)
299f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
300f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   asm ("rotlw %0,%0,%2"
301f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"=r" (word)
302f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"0" (word),"r" (32-i));
303f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return word;
304f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
305f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
306f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef LTC_NO_ROLC
307f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
308f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic inline unsigned ROLc(unsigned word, const int i)
309f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
310f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   asm ("rotlwi %0,%0,%2"
311f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"=r" (word)
312f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"0" (word),"I" (i));
313f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return word;
314f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
315f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
316f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic inline unsigned RORc(unsigned word, const int i)
317f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
318f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   asm ("rotrwi %0,%0,%2"
319f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"=r" (word)
320f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"0" (word),"I" (i));
321f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return word;
322f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
323f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
324f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
325f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
326f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define ROLc ROL
327f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define RORc ROR
328f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
329f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
330f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
331f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
332f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
333f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
334f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* rotates the hard way */
335f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define ROL(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
336f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define ROR(x, y) ( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | ((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
337f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define ROLc(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
338f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define RORc(x, y) ( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | ((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
339f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
340f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
341f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
342f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
343f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* 64-bit Rotates */
344f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if !defined(__STRICT_ANSI__) && defined(__GNUC__) && defined(__x86_64__) && !defined(LTC_NO_ASM)
345f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
346f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic inline unsigned long ROL64(unsigned long word, int i)
347f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
348f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   asm("rolq %%cl,%0"
349f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"=r" (word)
350f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"0" (word),"c" (i));
351f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return word;
352f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
353f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
354f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic inline unsigned long ROR64(unsigned long word, int i)
355f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
356f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   asm("rorq %%cl,%0"
357f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"=r" (word)
358f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"0" (word),"c" (i));
359f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return word;
360f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
361f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
362f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef LTC_NO_ROLC
363f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
364f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic inline unsigned long ROL64c(unsigned long word, const int i)
365f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
366f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   asm("rolq %2,%0"
367f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"=r" (word)
368f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"0" (word),"J" (i));
369f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return word;
370f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
371f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
372f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic inline unsigned long ROR64c(unsigned long word, const int i)
373f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
374f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   asm("rorq %2,%0"
375f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"=r" (word)
376f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      :"0" (word),"J" (i));
377f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return word;
378f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
379f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
380f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else /* LTC_NO_ROLC */
381f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
382f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define ROL64c ROL64
383f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define ROR64c ROR64
384f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
385f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
386f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
387f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else /* Not x86_64  */
388f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
389f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define ROL64(x, y) \
390f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    ( (((x)<<((ulong64)(y)&63)) | \
391f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)64-((y)&63)))) & CONST64(0xFFFFFFFFFFFFFFFF))
392f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
393f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define ROR64(x, y) \
394f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \
395f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      ((x)<<((ulong64)(64-((y)&CONST64(63)))))) & CONST64(0xFFFFFFFFFFFFFFFF))
396f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
397f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define ROL64c(x, y) \
398f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    ( (((x)<<((ulong64)(y)&63)) | \
399f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)64-((y)&63)))) & CONST64(0xFFFFFFFFFFFFFFFF))
400f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
401f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define ROR64c(x, y) \
402f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \
403f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      ((x)<<((ulong64)(64-((y)&CONST64(63)))))) & CONST64(0xFFFFFFFFFFFFFFFF))
404f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
405f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
406f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
407f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef MAX
408f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #define MAX(x, y) ( ((x)>(y))?(x):(y) )
409f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
410f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
411f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef MIN
412f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #define MIN(x, y) ( ((x)<(y))?(x):(y) )
413f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
414f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
415f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* extract a byte portably */
416f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef _MSC_VER
417f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #define byte(x, n) ((unsigned char)((x) >> (8 * (n))))
418f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
419f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #define byte(x, n) (((x) >> (8 * (n))) & 255)
420f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
421f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
422f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_macros.h,v $ */
423f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.15 $ */
424f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/11/29 23:43:57 $ */
425