18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef _TOOLS_LINUX_ASM_X86_RMWcc 38c2ecf20Sopenharmony_ci#define _TOOLS_LINUX_ASM_X86_RMWcc 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#ifdef CONFIG_CC_HAS_ASM_GOTO 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#define __GEN_RMWcc(fullop, var, cc, ...) \ 88c2ecf20Sopenharmony_cido { \ 98c2ecf20Sopenharmony_ci asm_volatile_goto (fullop "; j" cc " %l[cc_label]" \ 108c2ecf20Sopenharmony_ci : : "m" (var), ## __VA_ARGS__ \ 118c2ecf20Sopenharmony_ci : "memory" : cc_label); \ 128c2ecf20Sopenharmony_ci return 0; \ 138c2ecf20Sopenharmony_cicc_label: \ 148c2ecf20Sopenharmony_ci return 1; \ 158c2ecf20Sopenharmony_ci} while (0) 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#define GEN_UNARY_RMWcc(op, var, arg0, cc) \ 188c2ecf20Sopenharmony_ci __GEN_RMWcc(op " " arg0, var, cc) 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#define GEN_BINARY_RMWcc(op, var, vcon, val, arg0, cc) \ 218c2ecf20Sopenharmony_ci __GEN_RMWcc(op " %1, " arg0, var, cc, vcon (val)) 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci#else /* !CONFIG_CC_HAS_ASM_GOTO */ 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci#define __GEN_RMWcc(fullop, var, cc, ...) \ 268c2ecf20Sopenharmony_cido { \ 278c2ecf20Sopenharmony_ci char c; \ 288c2ecf20Sopenharmony_ci asm volatile (fullop "; set" cc " %1" \ 298c2ecf20Sopenharmony_ci : "+m" (var), "=qm" (c) \ 308c2ecf20Sopenharmony_ci : __VA_ARGS__ : "memory"); \ 318c2ecf20Sopenharmony_ci return c != 0; \ 328c2ecf20Sopenharmony_ci} while (0) 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci#define GEN_UNARY_RMWcc(op, var, arg0, cc) \ 358c2ecf20Sopenharmony_ci __GEN_RMWcc(op " " arg0, var, cc) 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci#define GEN_BINARY_RMWcc(op, var, vcon, val, arg0, cc) \ 388c2ecf20Sopenharmony_ci __GEN_RMWcc(op " %2, " arg0, var, cc, vcon (val)) 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci#endif /* CONFIG_CC_HAS_ASM_GOTO */ 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci#endif /* _TOOLS_LINUX_ASM_X86_RMWcc */ 43