Optimize OBJ_BITMAP_FOREACH_PTR () using __builtin_ctz ().
authorZoltan Varga <vargaz@gmail.com>
Tue, 20 Nov 2012 06:32:59 +0000 (07:32 +0100)
committerZoltan Varga <vargaz@gmail.com>
Tue, 20 Nov 2012 06:32:59 +0000 (07:32 +0100)
mono/metadata/sgen-descriptor.h

index 4924b74a91eacd9349450344bd6b387e541b14ff..8c33b708a43beda152090e34fe71dcfbc981d6e2 100644 (file)
@@ -177,13 +177,20 @@ sgen_gc_descr_has_references (mword desc)
                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) { \
-                       if ((_bmap & 1)) {      \
-                               HANDLE_PTR (_objptr, (obj));    \
-                       }       \
-                       _bmap >>= 1;    \
-                       ++_objptr;      \
-                       }       \
+                       int _index = __builtin_ctz (_bmap); \
+                       _objptr += _index; \
+                       _bmap >>= (_index + 1);                         \
+                       HANDLE_PTR (_objptr, (obj));            \
+                       _objptr ++;                                                     \
+               }                                                                               \
        } while (0)
 
 /* a bitmap desc means that there are pointer references or we'd have