rmwcc.h 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _TOOLS_LINUX_ASM_X86_RMWcc
  3. #define _TOOLS_LINUX_ASM_X86_RMWcc
  4. #ifdef CC_HAVE_ASM_GOTO
  5. #define __GEN_RMWcc(fullop, var, cc, ...) \
  6. do { \
  7. asm_volatile_goto (fullop "; j" cc " %l[cc_label]" \
  8. : : "m" (var), ## __VA_ARGS__ \
  9. : "memory" : cc_label); \
  10. return 0; \
  11. cc_label: \
  12. return 1; \
  13. } while (0)
  14. #define GEN_UNARY_RMWcc(op, var, arg0, cc) \
  15. __GEN_RMWcc(op " " arg0, var, cc)
  16. #define GEN_BINARY_RMWcc(op, var, vcon, val, arg0, cc) \
  17. __GEN_RMWcc(op " %1, " arg0, var, cc, vcon (val))
  18. #else /* !CC_HAVE_ASM_GOTO */
  19. #define __GEN_RMWcc(fullop, var, cc, ...) \
  20. do { \
  21. char c; \
  22. asm volatile (fullop "; set" cc " %1" \
  23. : "+m" (var), "=qm" (c) \
  24. : __VA_ARGS__ : "memory"); \
  25. return c != 0; \
  26. } while (0)
  27. #define GEN_UNARY_RMWcc(op, var, arg0, cc) \
  28. __GEN_RMWcc(op " " arg0, var, cc)
  29. #define GEN_BINARY_RMWcc(op, var, vcon, val, arg0, cc) \
  30. __GEN_RMWcc(op " %2, " arg0, var, cc, vcon (val))
  31. #endif /* CC_HAVE_ASM_GOTO */
  32. #endif /* _TOOLS_LINUX_ASM_X86_RMWcc */