Peter Zijlstra | 0c44c2d | 2013-09-11 15:19:24 +0200 | [diff] [blame] | 1 | #ifndef _ASM_X86_RMWcc |
| 2 | #define _ASM_X86_RMWcc |
| 3 | |
H. Peter Anvin | ba741e3 | 2016-06-08 12:38:41 -0700 | [diff] [blame] | 4 | #if !defined(__GCC_ASM_FLAG_OUTPUTS__) && defined(CC_HAVE_ASM_GOTO) |
| 5 | |
| 6 | /* Use asm goto */ |
Peter Zijlstra | 0c44c2d | 2013-09-11 15:19:24 +0200 | [diff] [blame] | 7 | |
| 8 | #define __GEN_RMWcc(fullop, var, cc, ...) \ |
| 9 | do { \ |
H. Peter Anvin | 18fe582 | 2016-06-08 12:38:39 -0700 | [diff] [blame] | 10 | asm_volatile_goto (fullop "; j" #cc " %l[cc_label]" \ |
Peter Zijlstra | 0c44c2d | 2013-09-11 15:19:24 +0200 | [diff] [blame] | 11 | : : "m" (var), ## __VA_ARGS__ \ |
| 12 | : "memory" : cc_label); \ |
| 13 | return 0; \ |
| 14 | cc_label: \ |
| 15 | return 1; \ |
| 16 | } while (0) |
| 17 | |
| 18 | #define GEN_UNARY_RMWcc(op, var, arg0, cc) \ |
| 19 | __GEN_RMWcc(op " " arg0, var, cc) |
| 20 | |
H. Peter Anvin | e0f6dec | 2013-12-04 14:31:28 -0800 | [diff] [blame] | 21 | #define GEN_BINARY_RMWcc(op, var, vcon, val, arg0, cc) \ |
| 22 | __GEN_RMWcc(op " %1, " arg0, var, cc, vcon (val)) |
Peter Zijlstra | 0c44c2d | 2013-09-11 15:19:24 +0200 | [diff] [blame] | 23 | |
H. Peter Anvin | ba741e3 | 2016-06-08 12:38:41 -0700 | [diff] [blame] | 24 | #else /* defined(__GCC_ASM_FLAG_OUTPUTS__) || !defined(CC_HAVE_ASM_GOTO) */ |
| 25 | |
| 26 | /* Use flags output or a set instruction */ |
Peter Zijlstra | 0c44c2d | 2013-09-11 15:19:24 +0200 | [diff] [blame] | 27 | |
| 28 | #define __GEN_RMWcc(fullop, var, cc, ...) \ |
| 29 | do { \ |
H. Peter Anvin | 117780e | 2016-06-08 12:38:38 -0700 | [diff] [blame] | 30 | bool c; \ |
H. Peter Anvin | ba741e3 | 2016-06-08 12:38:41 -0700 | [diff] [blame] | 31 | asm volatile (fullop ";" CC_SET(cc) \ |
| 32 | : "+m" (var), CC_OUT(cc) (c) \ |
Peter Zijlstra | 0c44c2d | 2013-09-11 15:19:24 +0200 | [diff] [blame] | 33 | : __VA_ARGS__ : "memory"); \ |
H. Peter Anvin | 117780e | 2016-06-08 12:38:38 -0700 | [diff] [blame] | 34 | return c; \ |
Peter Zijlstra | 0c44c2d | 2013-09-11 15:19:24 +0200 | [diff] [blame] | 35 | } while (0) |
| 36 | |
| 37 | #define GEN_UNARY_RMWcc(op, var, arg0, cc) \ |
| 38 | __GEN_RMWcc(op " " arg0, var, cc) |
| 39 | |
H. Peter Anvin | e0f6dec | 2013-12-04 14:31:28 -0800 | [diff] [blame] | 40 | #define GEN_BINARY_RMWcc(op, var, vcon, val, arg0, cc) \ |
| 41 | __GEN_RMWcc(op " %2, " arg0, var, cc, vcon (val)) |
Peter Zijlstra | 0c44c2d | 2013-09-11 15:19:24 +0200 | [diff] [blame] | 42 | |
H. Peter Anvin | ba741e3 | 2016-06-08 12:38:41 -0700 | [diff] [blame] | 43 | #endif /* defined(__GCC_ASM_FLAG_OUTPUTS__) || !defined(CC_HAVE_ASM_GOTO) */ |
Peter Zijlstra | 0c44c2d | 2013-09-11 15:19:24 +0200 | [diff] [blame] | 44 | |
| 45 | #endif /* _ASM_X86_RMWcc */ |