<div dir="ltr">From 275d93c9ab0f533fa70d698726afc8adaaefb664 Mon Sep 17 00:00:00 2001<br>From: Adeniyi Mayokun <<a href="mailto:adeniyimayokun17@gmail.com">adeniyimayokun17@gmail.com</a>><br>Date: Wed, 14 Mar 2018 06:40:20 +0100<br>Subject: [PATCH] wine/list.h: linked list cache line prefetching<br><br>Signed-off-by: Adeniyi Mayokun <adeniyimayokun17@gmail.com@<a href="http://gmail.com">gmail.com</a>><br>---<br><br> include/wine/list.h | 36 ++++++++++++++++++++----------------<br> 1 file changed, 20 insertions(+), 16 deletions(-)<br><br>diff --git a/include/wine/list.h b/include/wine/list.h<br>index b4d681fe0f..49b1e23a39 100644<br>--- a/include/wine/list.h<br>+++ b/include/wine/list.h<br>@@ -105,7 +105,8 @@ static inline void list_remove( struct list *elem )<br> static inline struct list *list_next( const struct list *list, const struct list *elem )<br> {<br>     struct list *ret = elem->next;<br>-    if (elem->next == list) ret = NULL;<br>+    if (ret == list) return NULL;<br>+    __builtin_prefetch(ret->next, 0, 1);<br>     return ret;<br> }<br> <br>@@ -113,7 +114,8 @@ static inline struct list *list_next( const struct list *list, const struct list<br> static inline struct list *list_prev( const struct list *list, const struct list *elem )<br> {<br>     struct list *ret = elem->prev;<br>-    if (elem->prev == list) ret = NULL;<br>+    if (ret == list) return NULL;<br>+    __builtin_prefetch(ret->prev, 0, 1);<br>     return ret;<br> }<br> <br>@@ -176,51 +178,53 @@ static inline void list_move_head( struct list *dst, struct list *src )<br> <br> /* iterate through the list */<br> #define LIST_FOR_EACH(cursor,list) \<br>-    for ((cursor) = (list)->next; (cursor) != (list); (cursor) = (cursor)->next)<br>+    for ((cursor) = (list)->next, __builtin_prefetch((cursor)->next, 0, 1); \<br>+         (cursor) != (list); (cursor) = (cursor)->next, __builtin_prefetch((cursor)->next, 0, 1))<br> <br> /* iterate through the list, with safety against removal */<br> #define LIST_FOR_EACH_SAFE(cursor, cursor2, list) \<br>-    for ((cursor) = (list)->next, (cursor2) = (cursor)->next; \<br>+    for ((cursor) = (list)->next, (cursor2) = (cursor)->next, __builtin_prefetch((cursor2)->next, 0, 1); \<br>          (cursor) != (list); \<br>-         (cursor) = (cursor2), (cursor2) = (cursor)->next)<br>+         (cursor) = (cursor2), (cursor2) = (cursor)->next, __builtin_prefetch((cursor2)->next, 0, 1))<br> <br> /* iterate through the list using a list entry */<br> #define LIST_FOR_EACH_ENTRY(elem, list, type, field) \<br>-    for ((elem) = LIST_ENTRY((list)->next, type, field); \<br>+    for ((elem) = LIST_ENTRY((list)->next, type, field), __builtin_prefetch((elem)->field.next, 0, 1); \<br>          &(elem)->field != (list); \<br>-         (elem) = LIST_ENTRY((elem)->field.next, type, field))<br>+         (elem) = LIST_ENTRY((elem)->field.next, type, field), __builtin_prefetch((elem)->field.next, 0, 1))<br> <br> /* iterate through the list using a list entry, with safety against removal */<br> #define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field) \<br>     for ((cursor) = LIST_ENTRY((list)->next, type, field), \<br>-         (cursor2) = LIST_ENTRY((cursor)->field.next, type, field); \<br>+         (cursor2) = LIST_ENTRY((cursor)->field.next, type, field), __builtin_prefetch((cursor2)->field.next, 0, 1); \<br>          &(cursor)->field != (list); \<br>          (cursor) = (cursor2), \<br>-         (cursor2) = LIST_ENTRY((cursor)->field.next, type, field))<br>+         (cursor2) = LIST_ENTRY((cursor)->field.next, type, field), __builtin_prefetch((cursor2)->field.next, 0, 1))<br> <br> /* iterate through the list in reverse order */<br> #define LIST_FOR_EACH_REV(cursor,list) \<br>-    for ((cursor) = (list)->prev; (cursor) != (list); (cursor) = (cursor)->prev)<br>+    for ((cursor) = (list)->prev, __builtin_prefetch((cursor)->prev, 0, 1); \<br>+         (cursor) != (list); (cursor) = (cursor)->prev, __builtin_prefetch((cursor)->prev, 0, 1))<br> <br> /* iterate through the list in reverse order, with safety against removal */<br> #define LIST_FOR_EACH_SAFE_REV(cursor, cursor2, list) \<br>-    for ((cursor) = (list)->prev, (cursor2) = (cursor)->prev; \<br>+    for ((cursor) = (list)->prev, (cursor2) = (cursor)->prev, __builtin_prefetch((cursor2)->prev, 0, 1); \<br>          (cursor) != (list); \<br>-         (cursor) = (cursor2), (cursor2) = (cursor)->prev)<br>+         (cursor) = (cursor2), (cursor2) = (cursor)->prev, __builtin_prefetch((cursor2)->prev, 0, 1))<br> <br> /* iterate through the list in reverse order using a list entry */<br> #define LIST_FOR_EACH_ENTRY_REV(elem, list, type, field) \<br>-    for ((elem) = LIST_ENTRY((list)->prev, type, field); \<br>+    for ((elem) = LIST_ENTRY((list)->prev, type, field), __builtin_prefetch((elem)->field.prev, 0, 1); \<br>          &(elem)->field != (list); \<br>-         (elem) = LIST_ENTRY((elem)->field.prev, type, field))<br>+         (elem) = LIST_ENTRY((elem)->field.prev, type, field), __builtin_prefetch((elem)->field.prev, 0, 1))<br> <br> /* iterate through the list in reverse order using a list entry, with safety against removal */<br> #define LIST_FOR_EACH_ENTRY_SAFE_REV(cursor, cursor2, list, type, field) \<br>     for ((cursor) = LIST_ENTRY((list)->prev, type, field), \<br>-         (cursor2) = LIST_ENTRY((cursor)->field.prev, type, field); \<br>+         (cursor2) = LIST_ENTRY((cursor)->field.prev, type, field), __builtin_prefetch((cursor2)->field.prev, 0, 1); \<br>          &(cursor)->field != (list); \<br>          (cursor) = (cursor2), \<br>-         (cursor2) = LIST_ENTRY((cursor)->field.prev, type, field))<br>+         (cursor2) = LIST_ENTRY((cursor)->field.prev, type, field), __builtin_prefetch((cursor2)->field.prev, 0, 1))<br> <br> /* macros for statically initialized lists */<br> #undef LIST_INIT<br>-- <br>2.14.1<br><br><br></div>