[sgen] Improve fix for BXC#14834 to avoid redundant code
authorAndrés G. Aragoneses <knocte@gmail.com>
Fri, 20 Sep 2013 20:15:42 +0000 (22:15 +0200)
committerAndrés G. Aragoneses <knocte@gmail.com>
Fri, 20 Sep 2013 20:15:42 +0000 (22:15 +0200)
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

index 3a0058947df41420304f4cfe2a3c967a8496686f..573f3c6486e02cd3c3d3c180577156dc104d11a7 100644 (file)
@@ -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));            \