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