From f55996d3b418535374fbc5c0e79a6a48ba655c37 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Andr=C3=A9s=20G=2E=20Aragoneses?= Date: Fri, 20 Sep 2013 22:15:42 +0200 Subject: [PATCH] [sgen] Improve fix for BXC#14834 to avoid redundant code Improve https://github.com/mono/mono/commit/d2cc22580898df5d4a15e0f99ab513e1570a6082 by making OBJ_BITMAP_FOREACH be less redundant thanks to new macro GNUC_BUILTIN_CTZ --- mono/metadata/sgen-descriptor.h | 34 +++++++++------------------------ 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/mono/metadata/sgen-descriptor.h b/mono/metadata/sgen-descriptor.h index 3a0058947df..573f3c6486e 100644 --- a/mono/metadata/sgen-descriptor.h +++ b/mono/metadata/sgen-descriptor.h @@ -153,6 +153,12 @@ sgen_gc_descr_has_references (mword desc) #define PREFETCH(addr) #endif +#if defined(__GNUC__) && SIZEOF_VOID_P==4 +#define GNUC_BUILTIN_CTZ(bmap) __builtin_ctz(bmap) +#elif defined(__GNUC__) && SIZEOF_VOID_P==8 +#define GNUC_BUILTIN_CTZ(bmap) __builtin_ctzl(bmap) +#endif + /* code using these macros must define a HANDLE_PTR(ptr) macro that does the work */ #define OBJ_RUN_LEN_FOREACH_PTR(desc,obj) do { \ if ((desc) & 0xffff0000) { \ @@ -170,43 +176,21 @@ sgen_gc_descr_has_references (mword desc) } \ } while (0) -#if defined(__GNUC__) && SIZEOF_VOID_P==4 -#define OBJ_BITMAP_FOREACH_PTR(desc,obj) do { \ - /* there are pointers */ \ - void **_objptr = (void**)(obj); \ - gsize _bmap = (desc) >> 16; \ - _objptr += OBJECT_HEADER_WORDS; \ - { \ - int _index = __builtin_ctz (_bmap); \ - _objptr += _index; \ - _bmap >>= (_index + 1); \ - HANDLE_PTR (_objptr, (obj)); \ - _objptr ++; \ - } \ - while (_bmap) { \ - int _index = __builtin_ctz (_bmap); \ - _objptr += _index; \ - _bmap >>= (_index + 1); \ - HANDLE_PTR (_objptr, (obj)); \ - _objptr ++; \ - } \ - } while (0) -#elif defined(__GNUC__) && SIZEOF_VOID_P==8 -/* Same as above, but use _builtin_ctzl () */ +#if defined(__GNUC__) #define OBJ_BITMAP_FOREACH_PTR(desc,obj) do { \ /* there are pointers */ \ void **_objptr = (void**)(obj); \ gsize _bmap = (desc) >> 16; \ _objptr += OBJECT_HEADER_WORDS; \ { \ - int _index = __builtin_ctzl (_bmap); \ + int _index = GNUC_BUILTIN_CTZ (_bmap); \ _objptr += _index; \ _bmap >>= (_index + 1); \ HANDLE_PTR (_objptr, (obj)); \ _objptr ++; \ } \ while (_bmap) { \ - int _index = __builtin_ctzl (_bmap); \ + int _index = GNUC_BUILTIN_CTZ (_bmap); \ _objptr += _index; \ _bmap >>= (_index + 1); \ HANDLE_PTR (_objptr, (obj)); \ -- 2.25.1