1# name	meta	args...
2#
3# Where meta contains a string of variants to generate.
4# Upper-case implies _{acquire,release,relaxed} variants.
5# Valid meta values are:
6# * B/b	- bool: returns bool
7# * v	- void: returns void
8# * I/i	- int: returns base type
9# * R	- return: returns base type (has _return variants)
10# * F/f	- fetch: returns base type (has fetch_ variants)
11# * l	- load: returns base type (has _acquire order variant)
12# * s	- store: returns void (has _release order variant)
13#
14# Where args contains list of type[:name], where type is:
15# * cv	- const pointer to atomic base type (atomic_t/atomic64_t/atomic_long_t)
16# * v	- pointer to atomic base type (atomic_t/atomic64_t/atomic_long_t)
17# * i	- base type (int/s64/long)
18# * p	- pointer to base type (int/s64/long)
19#
20read			l	cv
21set			s	v	i
22add			vRF	i	v
23sub			vRF	i	v
24inc			vRF	v
25dec			vRF	v
26and			vF	i	v
27andnot			vF	i	v
28or			vF	i	v
29xor			vF	i	v
30xchg			I	v	i
31cmpxchg			I	v	i:old	i:new
32try_cmpxchg		B	v	p:old	i:new
33sub_and_test		b	i	v
34dec_and_test		b	v
35inc_and_test		b	v
36add_negative		b	i	v
37add_unless		fb	v	i:a	i:u
38inc_not_zero		b	v
39inc_unless_negative	b	v
40dec_unless_positive	b	v
41dec_if_positive		i	v
42