aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2010-12-11 21:20:12 +0100
committerMike Pall <mike>2010-12-11 21:20:12 +0100
commit476259e87ee2e7502f92a26e673ba5929226573c (patch)
treec9a89ea837cc8a83559fe9142e1aea8f55ff4c09
parent5f7e9173db0497f2037c31081379cf3b8890830c (diff)
downloadluajit-476259e87ee2e7502f92a26e673ba5929226573c.tar.gz
luajit-476259e87ee2e7502f92a26e673ba5929226573c.tar.bz2
luajit-476259e87ee2e7502f92a26e673ba5929226573c.zip
Add 64 bit bswap and rotates.
-rw-r--r--src/lj_def.h22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/lj_def.h b/src/lj_def.h
index e72a8ef9..5574524f 100644
--- a/src/lj_def.h
+++ b/src/lj_def.h
@@ -94,8 +94,8 @@ typedef unsigned __int32 uintptr_t;
94#define checkptr32(x) ((uintptr_t)(x) == (uint32_t)(uintptr_t)(x)) 94#define checkptr32(x) ((uintptr_t)(x) == (uint32_t)(uintptr_t)(x))
95 95
96/* Every half-decent C compiler transforms this into a rotate instruction. */ 96/* Every half-decent C compiler transforms this into a rotate instruction. */
97#define lj_rol(x, n) (((x)<<(n)) | ((x)>>(32-(n)))) 97#define lj_rol(x, n) (((x)<<(n)) | ((x)>>(8*sizeof(x)-(n))))
98#define lj_ror(x, n) (((x)<<(32-(n))) | ((x)>>(n))) 98#define lj_ror(x, n) (((x)<<(8*sizeof(x)-(n))) | ((x)>>(n)))
99 99
100/* A really naive Bloom filter. But sufficient for our needs. */ 100/* A really naive Bloom filter. But sufficient for our needs. */
101typedef uintptr_t BloomFilter; 101typedef uintptr_t BloomFilter;
@@ -143,11 +143,28 @@ static LJ_AINLINE uint32_t lj_bswap(uint32_t x)
143{ 143{
144 return (uint32_t)__builtin_bswap32((int32_t)x); 144 return (uint32_t)__builtin_bswap32((int32_t)x);
145} 145}
146
147static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)
148{
149 return (uint64_t)__builtin_bswap64((int64_t)x);
150}
146#elif defined(__i386__) || defined(__x86_64__) 151#elif defined(__i386__) || defined(__x86_64__)
147static LJ_AINLINE uint32_t lj_bswap(uint32_t x) 152static LJ_AINLINE uint32_t lj_bswap(uint32_t x)
148{ 153{
149 uint32_t r; __asm__("bswap %0" : "=r" (r) : "0" (x)); return r; 154 uint32_t r; __asm__("bswap %0" : "=r" (r) : "0" (x)); return r;
150} 155}
156
157#if defined(__i386__)
158static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)
159{
160 return ((uint64_t)lj_bswap((uint32_t)x)<<32) | lj_bswap((uint32_t)(x>>32));
161}
162#else
163static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)
164{
165 uint64_t r; __asm__("bswap %0" : "=r" (r) : "0" (x)); return r;
166}
167#endif
151#else 168#else
152#error "missing define for lj_bswap()" 169#error "missing define for lj_bswap()"
153#endif 170#endif
@@ -174,6 +191,7 @@ static LJ_AINLINE uint32_t lj_fls(uint32_t x)
174} 191}
175 192
176#define lj_bswap(x) (_byteswap_ulong((x))) 193#define lj_bswap(x) (_byteswap_ulong((x)))
194#define lj_bswap64(x) (_byteswap_uint64((x)))
177 195
178#else 196#else
179#error "missing defines for your compiler" 197#error "missing defines for your compiler"