diff options
| author | gingerBill <bill@gingerbill.org> | 2023-07-17 23:16:50 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2023-07-17 23:16:50 +0100 |
| commit | 55733171c19aa53aebbe343d7541c3c5a1597c46 (patch) | |
| tree | 896b6b8f7368b9aaa3134f0908b800598a25da2f /src/tilde_stmt.cpp | |
| parent | 988926b59d84aced0f5c4e5bf68d82f105f5d0da (diff) | |
Planning for multi-valued expressions in the tilde backend
Diffstat (limited to 'src/tilde_stmt.cpp')
| -rw-r--r-- | src/tilde_stmt.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/tilde_stmt.cpp b/src/tilde_stmt.cpp index afc915115..6680277ed 100644 --- a/src/tilde_stmt.cpp +++ b/src/tilde_stmt.cpp @@ -10,6 +10,9 @@ gb_internal cgValue cg_emit_load(cgProcedure *p, cgValue const &ptr, bool is_vol case cgValue_Addr: GB_PANIC("NOT POSSIBLE - Cannot load an lvalue to begin with"); break; + case cgValue_Multi: + GB_PANIC("NOT POSSIBLE - Cannot load multiple values at once"); + break; case cgValue_Symbol: return cg_lvalue_addr(tb_inst_get_symbol_address(p->func, ptr.symbol), type); } @@ -27,6 +30,9 @@ gb_internal cgValue cg_emit_load(cgProcedure *p, cgValue const &ptr, bool is_vol case cgValue_Addr: the_ptr = tb_inst_load(p->func, TB_TYPE_PTR, ptr.node, alignment, is_volatile); break; + case cgValue_Multi: + GB_PANIC("NOT POSSIBLE - Cannot load multiple values at once"); + break; case cgValue_Symbol: the_ptr = tb_inst_get_symbol_address(p->func, ptr.symbol); break; @@ -35,6 +41,8 @@ gb_internal cgValue cg_emit_load(cgProcedure *p, cgValue const &ptr, bool is_vol } gb_internal void cg_emit_store(cgProcedure *p, cgValue dst, cgValue const &src, bool is_volatile) { + GB_ASSERT_MSG(dst.kind != cgValue_Multi, "cannot store to multiple values at once"); + if (dst.kind == cgValue_Addr) { dst = cg_emit_load(p, dst, is_volatile); } else if (dst.kind == cgValue_Symbol) { @@ -130,6 +138,9 @@ gb_internal cgValue cg_address_from_load(cgProcedure *p, cgValue value) { case cgValue_Symbol: GB_PANIC("Symbol is an invalid use case for cg_address_from_load"); return {}; + case cgValue_Multi: + GB_PANIC("Multi is an invalid use case for cg_address_from_load"); + break; } GB_PANIC("Invalid cgValue for cg_address_from_load"); return {}; @@ -143,6 +154,8 @@ gb_internal bool cg_addr_is_empty(cgAddr const &addr) { return addr.addr.node == nullptr; case cgValue_Symbol: return addr.addr.symbol == nullptr; + case cgValue_Multi: + return addr.addr.multi_nodes == nullptr; } return true; } @@ -670,6 +683,8 @@ gb_internal cgValue cg_address_from_load_or_generate_local(cgProcedure *p, cgVal break; case cgValue_Addr: return cg_value(value.node, alloc_type_pointer(value.type)); + case cgValue_Multi: + GB_PANIC("cgValue_Multi not allowed"); } cgAddr res = cg_add_local(p, value.type, nullptr, false); |