Optimize AO_spin manually to minimize compiler influence on its duration
authorIvan Maidanski <ivmai@mail.ru>
Wed, 3 Oct 2012 09:02:13 +0000 (13:02 +0400)
committerIvan Maidanski <ivmai@mail.ru>
Wed, 3 Oct 2012 09:02:13 +0000 (13:02 +0400)
* src/atomic_ops.c (dummy, AO_spin): Use AO_t instead of deprecated
AO_T.
* src/atomic_ops_stack.c (AO_spin): Likewise.
* src/atomic_ops.c (AO_spin): Define as static (since not needed
outside).
* src/atomic_ops.c (AO_spin): Optimize code manually to minimize
speed dependency on compiler optimization level; add comment.
* src/atomic_ops_stack.c (AO_spin): Likewise.

src/atomic_ops.c
src/atomic_ops_stack.c

index da45eb5..e0f7ae2 100644 (file)
@@ -101,19 +101,17 @@ AO_TS_t AO_locks[AO_HASH_SIZE] = {
   AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER,
 };
 
-static AO_T dummy = 1;
+static AO_t dummy = 1;
 
 /* Spin for 2**n units. */
-void AO_spin(int n)
+static void AO_spin(int n)
 {
-  int i;
-  AO_T j = AO_load(&dummy);
+  AO_t j = AO_load(&dummy);
+  int i = 2 << n;
 
-  for (i = 0; i < (2 << n); ++i)
-    {
-       j *= 5;
-       j -= 4;
-    }
+  while (i-- > 0)
+    j += (j - 1) << 2;
+  /* Given 'dummy' is initialized to 1, j is 1 after the loop.  */
   AO_store(&dummy, j);
 }
 
index 13125ea..2f6a640 100644 (file)
@@ -32,14 +32,12 @@ static AO_t dummy = 1;
 /* Spin for 2**n units. */
 static void AO_spin(int n)
 {
-  int i;
-  AO_T j = AO_load(&dummy);
+  AO_t j = AO_load(&dummy);
+  int i = 2 << n;
 
-  for (i = 0; i < (2 << n); ++i)
-    {
-       j *= 5;
-       j -= 4;
-    }
+  while (i-- > 0)
+    j += (j - 1) << 2;
+  /* Given 'dummy' is initialized to 1, j is 1 after the loop.  */
   AO_store(&dummy, j);
 }