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