From 1fd361a1ea06e44286c213ca1f814f49306fdc43 Mon Sep 17 00:00:00 2001 From: giraffedata Date: Sat, 19 Aug 2006 03:12:28 +0000 Subject: Create Subversion repository git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@1 9d0c8265-081b-0410-96cb-a4ca84ce46f8 --- lib/util/wordaccess_64_le.h | 52 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 lib/util/wordaccess_64_le.h (limited to 'lib/util/wordaccess_64_le.h') 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 /* 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"); +} -- cgit 1.4.1