Commit | Line | Data |
---|---|---|
0c44c2d0 PZ |
1 | #ifndef _ASM_X86_RMWcc |
2 | #define _ASM_X86_RMWcc | |
3 | ||
4 | #ifdef CC_HAVE_ASM_GOTO | |
5 | ||
6 | #define __GEN_RMWcc(fullop, var, cc, ...) \ | |
7 | do { \ | |
88f182dd | 8 | asm_volatile_goto (fullop "; j" cc " %l[cc_label]" \ |
0c44c2d0 PZ |
9 | : : "m" (var), ## __VA_ARGS__ \ |
10 | : "memory" : cc_label); \ | |
11 | return 0; \ | |
12 | cc_label: \ | |
13 | return 1; \ | |
14 | } while (0) | |
15 | ||
16 | #define GEN_UNARY_RMWcc(op, var, arg0, cc) \ | |
17 | __GEN_RMWcc(op " " arg0, var, cc) | |
18 | ||
e0f6dec3 PA |
19 | #define GEN_BINARY_RMWcc(op, var, vcon, val, arg0, cc) \ |
20 | __GEN_RMWcc(op " %1, " arg0, var, cc, vcon (val)) | |
0c44c2d0 PZ |
21 | |
22 | #else /* !CC_HAVE_ASM_GOTO */ | |
23 | ||
24 | #define __GEN_RMWcc(fullop, var, cc, ...) \ | |
25 | do { \ | |
26 | char c; \ | |
27 | asm volatile (fullop "; set" cc " %1" \ | |
28 | : "+m" (var), "=qm" (c) \ | |
29 | : __VA_ARGS__ : "memory"); \ | |
30 | return c != 0; \ | |
31 | } while (0) | |
32 | ||
33 | #define GEN_UNARY_RMWcc(op, var, arg0, cc) \ | |
34 | __GEN_RMWcc(op " " arg0, var, cc) | |
35 | ||
e0f6dec3 PA |
36 | #define GEN_BINARY_RMWcc(op, var, vcon, val, arg0, cc) \ |
37 | __GEN_RMWcc(op " %2, " arg0, var, cc, vcon (val)) | |
0c44c2d0 PZ |
38 | |
39 | #endif /* CC_HAVE_ASM_GOTO */ | |
40 | ||
41 | #endif /* _ASM_X86_RMWcc */ |