rmwcc.h 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #ifndef _ASM_X86_RMWcc
  2. #define _ASM_X86_RMWcc
  3. #if !defined(__GCC_ASM_FLAG_OUTPUTS__) && defined(CC_HAVE_ASM_GOTO)
  4. /* Use 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 /* defined(__GCC_ASM_FLAG_OUTPUTS__) || !defined(CC_HAVE_ASM_GOTO) */
  19. /* Use flags output or a set instruction */
  20. #define __GEN_RMWcc(fullop, var, cc, ...) \
  21. do { \
  22. bool c; \
  23. asm volatile (fullop ";" CC_SET(cc) \
  24. : "+m" (var), CC_OUT(cc) (c) \
  25. : __VA_ARGS__ : "memory"); \
  26. return c; \
  27. } while (0)
  28. #define GEN_UNARY_RMWcc(op, var, arg0, cc) \
  29. __GEN_RMWcc(op " " arg0, var, cc)
  30. #define GEN_BINARY_RMWcc(op, var, vcon, val, arg0, cc) \
  31. __GEN_RMWcc(op " %2, " arg0, var, cc, vcon (val))
  32. #endif /* defined(__GCC_ASM_FLAG_OUTPUTS__) || !defined(CC_HAVE_ASM_GOTO) */
  33. #endif /* _ASM_X86_RMWcc */