aboutsummaryrefslogtreecommitdiff
path: root/src/tilde_expr.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-08-07 15:11:15 +0100
committergingerBill <bill@gingerbill.org>2023-08-07 15:11:15 +0100
commit0230b8807851de2b1e9975a1c292a0a4471936f9 (patch)
treefb802f3a02d552fe6206bdc461309010df3afb06 /src/tilde_expr.cpp
parent55c9fb7c5c416ff0b94d0a9a531c41662a4eeb54 (diff)
Tilde: #soa pointers
Diffstat (limited to 'src/tilde_expr.cpp')
-rw-r--r--src/tilde_expr.cpp25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/tilde_expr.cpp b/src/tilde_expr.cpp
index ece8e0816..dfb04774e 100644
--- a/src/tilde_expr.cpp
+++ b/src/tilde_expr.cpp
@@ -2796,6 +2796,16 @@ cgAddr cg_build_addr_compound_lit(cgProcedure *p, Ast *expr) {
return v;
}
+gb_internal cgValue cg_make_soa_pointer(cgProcedure *p, Type *type, cgValue const &addr, cgValue const &index) {
+ cgAddr v = cg_add_local(p, type, nullptr, true);
+ cgValue ptr = cg_emit_struct_ep(p, v.addr, 0);
+ cgValue idx = cg_emit_struct_ep(p, v.addr, 1);
+ cg_emit_store(p, ptr, addr);
+ cg_emit_store(p, idx, cg_emit_conv(p, index, t_int));
+
+ return cg_addr_load(p, v);
+}
+
gb_internal cgValue cg_build_unary_and(cgProcedure *p, Ast *expr) {
ast_node(ue, UnaryExpr, expr);
auto tv = type_and_value_of_expr(expr);
@@ -2835,16 +2845,15 @@ gb_internal cgValue cg_build_unary_and(cgProcedure *p, Ast *expr) {
// return lb_addr_load(p, res);
} else if (is_type_soa_pointer(tv.type)) {
- GB_PANIC("TODO(bill): &soa[i]");
- // ast_node(ie, IndexExpr, ue_expr);
- // lbValue addr = lb_build_addr_ptr(p, ie->expr);
- // lbValue index = lb_build_expr(p, ie->index);
+ ast_node(ie, IndexExpr, ue_expr);
+ cgValue addr = cg_build_addr_ptr(p, ie->expr);
+ cgValue index = cg_build_expr(p, ie->index);
- // if (!build_context.no_bounds_check) {
- // // TODO(bill): soa bounds checking
- // }
+ if (!build_context.no_bounds_check) {
+ // TODO(bill): soa bounds checking
+ }
- // return lb_make_soa_pointer(p, tv.type, addr, index);
+ return cg_make_soa_pointer(p, tv.type, addr, index);
} else if (ue_expr->kind == Ast_CompoundLit) {
cgAddr addr = cg_build_addr_compound_lit(p, expr);
return addr.addr;