X-Git-Url: https://ginac.de/CLN/cln.git//cln.git?a=blobdiff_plain;f=include%2Fcln%2Fobject.h;h=61a614eb5239d969f3ccdad231fe26e062863280;hb=HEAD;hp=c7763af4a8f9a3b45f4ffd5df4eb6212ba8fc38d;hpb=1fdea8ecf018323dcca4425fce6a57546f34c29b;p=cln.git diff --git a/include/cln/object.h b/include/cln/object.h index c7763af..61a614e 100644 --- a/include/cln/object.h +++ b/include/cln/object.h @@ -13,25 +13,8 @@ namespace cln { // is sufficient. Is also has the advantage of being mostly non-interrupting. -// An object is either a pointer to heap allocated data -// or immediate data. - +// An object is either a pointer to heap allocated data or immediate data. // It is possible to distinguish these because pointers are aligned. -// cl_word_alignment is the guaranteed alignment of a `void*' or `long' -// in memory. Must be > 1. -#if defined(__m68k__) - #define cl_word_alignment 2 -#endif -#if defined(__i386__) || (defined(__mips__) && !defined(__LP64__)) || (defined(__sparc__) && !defined(__arch64__)) || defined(__hppa__) || defined(__arm__) || defined(__rs6000__) || defined(__m88k__) || defined(__convex__) || (defined(__s390__) && !defined(__s390x__)) || defined(__sh__) || (defined(__x86_64__) && defined(__ILP32__)) - #define cl_word_alignment 4 -#endif -#if defined(__alpha__) || defined(__ia64__) || defined(__mips64__) || defined(__powerpc64__) || (defined(__sparc__) && defined(__arch64__)) || (defined(__x86_64__) && !defined(__ILP32__)) || defined(__s390x__) || defined(__aarch64__) || (defined(__riscv) && __riscv_xlen == 64) || defined(__e2k__) - #define cl_word_alignment 8 -#endif -#if !defined(cl_word_alignment) - #error "Define cl_word_alignment for your CPU!" -#endif - // Four basic classes are introduced: // @@ -94,8 +77,8 @@ inline bool cl_immediate_p (cl_uint word) #define cl_tag_shift 0 #define cl_value_shift (cl_tag_len+cl_tag_shift) #define cl_value_len (cl_pointer_size - cl_value_shift) -#define cl_tag_mask (((1UL << cl_tag_len) - 1) << cl_tag_shift) -#define cl_value_mask (((1UL << cl_value_len) - 1) << cl_value_shift) +#define cl_tag_mask ((((cl_uint)1 << cl_tag_len) - 1) << cl_tag_shift) +#define cl_value_mask ((((cl_uint)1 << cl_value_len) - 1) << cl_value_shift) // Return the tag of a word. inline cl_uint cl_tag (cl_uint word) @@ -111,26 +94,27 @@ inline cl_uint cl_value (cl_uint word) } // Return a word, combining a value and a tag. -inline cl_uint cl_combine (cl_uint tag, cl_uint value) +inline cl_uint cl_combine_impl (cl_uint tag, cl_uint value) { return (value << cl_value_shift) + (tag << cl_tag_shift); } -inline cl_uint cl_combine (cl_uint tag, cl_sint value) +inline cl_uint cl_combine_impl (cl_uint tag, cl_sint value) { // This assumes cl_value_shift + cl_value_len == cl_pointer_size. return (value << cl_value_shift) + (tag << cl_tag_shift); } -// Keep the compiler happy. inline cl_uint cl_combine (cl_uint tag, unsigned int value) -{ return cl_combine(tag, (cl_uint)value); } +{ return cl_combine_impl(tag, (cl_uint)value); } inline cl_uint cl_combine (cl_uint tag, int value) -{ return cl_combine(tag, (cl_sint)value); } -#ifdef HAVE_LONGLONG +{ return cl_combine_impl(tag, (cl_sint)value); } +inline cl_uint cl_combine (cl_uint tag, unsigned long value) +{ return cl_combine_impl(tag, (cl_uint)value); } +inline cl_uint cl_combine (cl_uint tag, long value) +{ return cl_combine_impl(tag, (cl_sint)value); } inline cl_uint cl_combine (cl_uint tag, unsigned long long value) -{ return cl_combine(tag, (cl_uint)value); } +{ return cl_combine_impl(tag, (cl_uint)value); } inline cl_uint cl_combine (cl_uint tag, long long value) -{ return cl_combine(tag, (cl_uint)value); } -#endif +{ return cl_combine_impl(tag, (cl_uint)value); } // Definition of the tags. #if !defined(CL_WIDE_POINTERS)