diff options
author | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2006-08-19 03:12:28 +0000 |
---|---|---|
committer | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2006-08-19 03:12:28 +0000 |
commit | 1fd361a1ea06e44286c213ca1f814f49306fdc43 (patch) | |
tree | 64c8c96cf54d8718847339a403e5e67b922e8c3f /lib/util/wordaccess_64_le.h | |
download | netpbm-mirror-1fd361a1ea06e44286c213ca1f814f49306fdc43.tar.gz netpbm-mirror-1fd361a1ea06e44286c213ca1f814f49306fdc43.tar.xz netpbm-mirror-1fd361a1ea06e44286c213ca1f814f49306fdc43.zip |
Create Subversion repository
git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@1 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'lib/util/wordaccess_64_le.h')
-rw-r--r-- | lib/util/wordaccess_64_le.h | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/lib/util/wordaccess_64_le.h b/lib/util/wordaccess_64_le.h new file mode 100644 index 00000000..2343b6d4 --- /dev/null +++ b/lib/util/wordaccess_64_le.h @@ -0,0 +1,52 @@ +/*============================================================================= + This file is the part of wordaccess.h for use under these + conditions: + + * GCC (>=3.4), GLIBC + * 64 bit Little-Endian machines (IA64, X86-64, AMD64) +=============================================================================*/ + +/* + 64 bit hton and ntoh do not exist. Here we use bswap_64. + + While bswap_64 works on 64 bit data, __builtin_clzl works on "long" which + may or may not be 64 bits. Code provided to find the right data type and + file off any extra when necessary. +*/ + +#include <byteswap.h> /* See note above on bswap_64 */ + +typedef uint64_t wordint; +typedef unsigned char wordintBytes[sizeof(wordint)]; + +static __inline__ wordint +bytesToWordint(wordintBytes bytes) { + return ((wordint) bswap_64(*(wordint *)bytes)); +} + + + +static __inline__ void +wordintToBytes(wordintBytes * const bytesP, + wordint const wordInt) { + *(wordint *)bytesP = bswap_64(wordInt); +} + + + +static __inline__ unsigned int +wordintClz(wordint const x){ + + unsigned int s; + + if (x == 0) + return sizeof(wordint) * 8; + + /* Find the data type closest to 64 bits, and file off any extra. */ + else if ((s=sizeof(long int)) >= 8) + return (__builtin_clzl((int)x << (s - 8) * 8)); + else if ((s=sizeof(long long int)) >= 8) + return (__builtin_clzll((long long int)x << (s - 8) * 8)); + else + pm_error("Long long int is less than 64 bits on this machine"); +} |