18c2ecf20Sopenharmony_cicat << EOF
28c2ecf20Sopenharmony_ci/**
38c2ecf20Sopenharmony_ci * ${arch}${atomic}_fetch_add_unless - add unless the number is already a given value
48c2ecf20Sopenharmony_ci * @v: pointer of type ${atomic}_t
58c2ecf20Sopenharmony_ci * @a: the amount to add to v...
68c2ecf20Sopenharmony_ci * @u: ...unless v is equal to u.
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci * Atomically adds @a to @v, so long as @v was not already @u.
98c2ecf20Sopenharmony_ci * Returns original value of @v
108c2ecf20Sopenharmony_ci */
118c2ecf20Sopenharmony_cistatic __always_inline ${int}
128c2ecf20Sopenharmony_ci${arch}${atomic}_fetch_add_unless(${atomic}_t *v, ${int} a, ${int} u)
138c2ecf20Sopenharmony_ci{
148c2ecf20Sopenharmony_ci	${int} c = ${arch}${atomic}_read(v);
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci	do {
178c2ecf20Sopenharmony_ci		if (unlikely(c == u))
188c2ecf20Sopenharmony_ci			break;
198c2ecf20Sopenharmony_ci	} while (!${arch}${atomic}_try_cmpxchg(v, &c, c + a));
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci	return c;
228c2ecf20Sopenharmony_ci}
238c2ecf20Sopenharmony_ciEOF
24