1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_X86_RMWcc
3#define _ASM_X86_RMWcc
4
5#include <linux/args.h>
6
7#define __CLOBBERS_MEM(clb...) "memory", ## clb
8
9#define __GEN_RMWcc(fullop, _var, cc, clobbers, ...) \
10({ \
11 bool c; \
12 asm_inline volatile (fullop \
13 : [var] "+m" (_var), "=@cc" #cc (c) \
14 : __VA_ARGS__ : clobbers); \
15 c; \
16})
17
18#define GEN_UNARY_RMWcc_4(op, var, cc, arg0) \
19 __GEN_RMWcc(op " " arg0, var, cc, __CLOBBERS_MEM())
20
21#define GEN_UNARY_RMWcc_3(op, var, cc) \
22 GEN_UNARY_RMWcc_4(op, var, cc, "%[var]")
23
24#define GEN_UNARY_RMWcc(X...) CONCATENATE(GEN_UNARY_RMWcc_, COUNT_ARGS(X))(X)
25
26#define GEN_BINARY_RMWcc_6(op, var, cc, vcon, _val, arg0) \
27 __GEN_RMWcc(op " %[val], " arg0, var, cc, \
28 __CLOBBERS_MEM(), [val] vcon (_val))
29
30#define GEN_BINARY_RMWcc_5(op, var, cc, vcon, val) \
31 GEN_BINARY_RMWcc_6(op, var, cc, vcon, val, "%[var]")
32
33#define GEN_BINARY_RMWcc(X...) CONCATENATE(GEN_BINARY_RMWcc_, COUNT_ARGS(X))(X)
34
35#define GEN_UNARY_SUFFIXED_RMWcc(op, suffix, var, cc, clobbers...) \
36 __GEN_RMWcc(op " %[var]\n\t" suffix, var, cc, \
37 __CLOBBERS_MEM(clobbers))
38
39#define GEN_BINARY_SUFFIXED_RMWcc(op, suffix, var, cc, vcon, _val, clobbers...)\
40 __GEN_RMWcc(op " %[val], %[var]\n\t" suffix, var, cc, \
41 __CLOBBERS_MEM(clobbers), [val] vcon (_val))
42
43#endif /* _ASM_X86_RMWcc */
44