| @@ -5727,20 +5727,24 @@ static void parse_builtin_params(int nc, const char *args) · 5726 unmodified lines |
| 5727 | 5727 | nocode_wanted--; |
| 5728 | 5728 | } |
| 5729 | 5729 | |
| 5730 | | −static void parse_memory_model(int mtok) |
| 5731 | | −{ |
| 5732 | | − next(); |
| 5733 | | − |
| 5734 | | − switch (mtok) { |
| 5735 | | − case TOK___ATOMIC_RELAXED: vpushs(0); break; |
| 5736 | | − case TOK___ATOMIC_CONSUME: vpushs(1); break; |
| 5737 | | − case TOK___ATOMIC_ACQUIRE: vpushs(2); break; |
| 5738 | | − case TOK___ATOMIC_RELEASE: vpushs(3); break; |
| 5739 | | − case TOK___ATOMIC_ACQ_REL: vpushs(4); break; |
| 5740 | | − case TOK___ATOMIC_SEQ_CST: vpushs(5); break; |
| 5741 | | − } |
| 5742 | | − |
| 5743 | | − vtop->type.t |= (VT_UNSIGNED | VT_MEMMODEL); |
| 5730 | +static inline int is_memory_model(const SValue *sv) |
| 5731 | +{ |
| 5732 | + /* |
| 5733 | + * FIXME |
| 5734 | + * The memory models should better be backed by an enumeration. |
| 5735 | + * |
| 5736 | + * const int t = sv->type.t; |
| 5737 | + * |
| 5738 | + * if (!IS_ENUM_VAL(t)) |
| 5739 | + * return 0; |
| 5740 | + * |
| 5741 | + * if (!(t & VT_STATIC)) |
| 5742 | + * return 0; |
| 5743 | + * |
| 5744 | + * Ideally we should check whether the model matches 1:1. |
| 5745 | + * If it is possible, we should check by the name of the value. |
| 5746 | + */ |
| 5747 | + return (((t & VT_BTYPE) == VT_INT) && (sv->c.i < 6)); |
| 5744 | 5748 | } |
| 5745 | 5749 | |
| 5746 | 5750 | static void parse_atomic(int atok) |
| @@ -5762,17 +5766,17 @@ static void parse_atomic(int atok) · 15 unmodified lines |
| 5762 | 5766 | * v -- value |
| 5763 | 5767 | * m -- memory model |
| 5764 | 5768 | */ |
| 5765 | | − {TOK___atomic_init, "-a"}, |
| 5766 | | − {TOK___atomic_store, "-avm"}, |
| 5767 | | − {TOK___atomic_load, "am"}, |
| 5768 | | − {TOK___atomic_exchange, "avm"}, |
| 5769 | | − {TOK___atomic_compare_exchange_strong, "apvmm"}, |
| 5770 | | − {TOK___atomic_compare_exchange_weak, "apvmm"}, |
| 5771 | | − {TOK___atomic_fetch_add, "avm"}, |
| 5772 | | − {TOK___atomic_fetch_sub, "avm"}, |
| 5773 | | − {TOK___atomic_fetch_or, "avm"}, |
| 5774 | | − {TOK___atomic_fetch_xor, "avm"}, |
| 5775 | | − {TOK___atomic_fetch_and, "avm"}, |
| 5769 | + {TOK___c11_atomic_init, "-a"}, |
| 5770 | + {TOK___c11_atomic_store, "-avm"}, |
| 5771 | + {TOK___c11_atomic_load, "am"}, |
| 5772 | + {TOK___c11_atomic_exchange, "avm"}, |
| 5773 | + {TOK___c11_atomic_compare_exchange_strong, "apvmm"}, |
| 5774 | + {TOK___c11_atomic_compare_exchange_weak, "apvmm"}, |
| 5775 | + {TOK___c11_atomic_fetch_add, "avm"}, |
| 5776 | + {TOK___c11_atomic_fetch_sub, "avm"}, |
| 5777 | + {TOK___c11_atomic_fetch_or, "avm"}, |
| 5778 | + {TOK___c11_atomic_fetch_xor, "avm"}, |
| 5779 | + {TOK___c11_atomic_fetch_and, "avm"}, |
| 5776 | 5780 | }; |
| 5777 | 5781 | |
| 5778 | 5782 | next(); |
| @@ -5837,8 +5841,8 @@ static void parse_atomic(int atok) · 58 unmodified lines |
| 5837 | 5841 | break; |
| 5838 | 5842 | |
| 5839 | 5843 | case 'm': |
| 5840 | | − if ((vtop->type.t & VT_MEMMODEL) != VT_MEMMODEL) |
| 5841 | | − expect_arg("memory model constant", arg); |
| 5844 | + if (!is_memory_model(vtop)) |
| 5845 | + expect_arg("memory model", arg); |
| 5842 | 5846 | vtop->type.t &= ~VT_MEMMODEL; |
| 5843 | 5847 | break; |
| 5844 | 5848 | |
| @@ -6234,28 +6238,18 @@ ST_FUNC void unary(void) · 389 unmodified lines |
| 6234 | 6238 | } |
| 6235 | 6239 | #endif |
| 6236 | 6240 | |
| 6237 | | − /* memory models */ |
| 6238 | | − case TOK___ATOMIC_RELAXED: |
| 6239 | | − case TOK___ATOMIC_CONSUME: |
| 6240 | | − case TOK___ATOMIC_ACQUIRE: |
| 6241 | | − case TOK___ATOMIC_RELEASE: |
| 6242 | | − case TOK___ATOMIC_ACQ_REL: |
| 6243 | | − case TOK___ATOMIC_SEQ_CST: |
| 6244 | | − parse_memory_model(tok); |
| 6245 | | − break; |
| 6246 | | − |
| 6247 | 6241 | /* atomic operations */ |
| 6248 | | − case TOK___atomic_init: |
| 6249 | | − case TOK___atomic_store: |
| 6250 | | − case TOK___atomic_load: |
| 6251 | | − case TOK___atomic_exchange: |
| 6252 | | − case TOK___atomic_compare_exchange_strong: |
| 6253 | | − case TOK___atomic_compare_exchange_weak: |
| 6254 | | − case TOK___atomic_fetch_add: |
| 6255 | | − case TOK___atomic_fetch_sub: |
| 6256 | | − case TOK___atomic_fetch_or: |
| 6257 | | − case TOK___atomic_fetch_xor: |
| 6258 | | − case TOK___atomic_fetch_and: |
| 6242 | + case TOK___c11_atomic_init: |
| 6243 | + case TOK___c11_atomic_store: |
| 6244 | + case TOK___c11_atomic_load: |
| 6245 | + case TOK___c11_atomic_exchange: |
| 6246 | + case TOK___c11_atomic_compare_exchange_strong: |
| 6247 | + case TOK___c11_atomic_compare_exchange_weak: |
| 6248 | + case TOK___c11_atomic_fetch_add: |
| 6249 | + case TOK___c11_atomic_fetch_sub: |
| 6250 | + case TOK___c11_atomic_fetch_or: |
| 6251 | + case TOK___c11_atomic_fetch_xor: |
| 6252 | + case TOK___c11_atomic_fetch_and: |
| 6259 | 6253 | parse_atomic(tok); |
| 6260 | 6254 | break; |
| 6261 | 6255 | |