* 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.
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);
}
/* 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);
}