Merge remote-tracking branch 'offical/master'

This commit is contained in:
ed
2025-03-06 05:27:42 -05:00
158 changed files with 12536 additions and 4057 deletions
+36 -56
View File
@@ -5,8 +5,6 @@ gb_internal void lb_build_constant_value_decl(lbProcedure *p, AstValueDecl *vd)
auto *min_dep_set = &p->module->info->minimum_dependency_set;
static i32 global_guid = 0;
for (Ast *ident : vd->names) {
GB_ASSERT(ident->kind == Ast_Ident);
Entity *e = entity_of_node(ident);
@@ -32,7 +30,8 @@ gb_internal void lb_build_constant_value_decl(lbProcedure *p, AstValueDecl *vd)
continue;
}
lb_set_nested_type_name_ir_mangled_name(e, p, p->module);
String name = lb_get_entity_name(p->module, e);
gb_unused(name);
}
for_array(i, vd->names) {
@@ -1115,62 +1114,43 @@ gb_internal void lb_build_range_stmt(lbProcedure *p, AstRangeStmt *rs, Scope *sc
}
Type *elem = et->BitSet.elem;
if (is_type_enum(elem)) {
i64 enum_count = 0;
lbValue values = lb_enum_values_slice(p, elem, &enum_count);
lbValue values_data = lb_slice_elem(p, values);
lbValue max_count = lb_const_int(m, t_int, enum_count);
Type *mask = bit_set_to_int(et);
lbAddr offset_ = lb_add_local_generated(p, t_int, false);
lb_addr_store(p, offset_, lb_const_int(m, t_int, 0));
lbValue all_mask = lb_const_value(p->module, mask, exact_bit_set_all_set_mask(et));
lbValue initial_mask = lb_emit_arith(p, Token_And, the_set, all_mask, mask);
loop = lb_create_block(p, "for.bit_set.enum.loop");
lb_emit_jump(p, loop);
lb_start_block(p, loop);
lbBlock *body_check = lb_create_block(p, "for.bit_set.enum.body-check");
lbBlock *body = lb_create_block(p, "for.bit_set.enum.body");
done = lb_create_block(p, "for.bit_set.enum.done");
lbValue offset = lb_addr_load(p, offset_);
lbValue cond = lb_emit_comp(p, Token_Lt, offset, max_count);
lb_emit_if(p, cond, body_check, done);
lb_start_block(p, body_check);
lbValue val_ptr = lb_emit_ptr_offset(p, values_data, offset);
lb_emit_increment(p, offset_.addr);
val = lb_emit_load(p, val_ptr);
val = lb_emit_conv(p, val, elem);
lbValue check = lb_build_binary_in(p, val, the_set, Token_in);
lb_emit_if(p, check, body, loop);
lb_start_block(p, body);
} else {
lbAddr offset_ = lb_add_local_generated(p, t_int, false);
lb_addr_store(p, offset_, lb_const_int(m, t_int, et->BitSet.lower));
lbValue max_count = lb_const_int(m, t_int, et->BitSet.upper);
loop = lb_create_block(p, "for.bit_set.range.loop");
lb_emit_jump(p, loop);
lb_start_block(p, loop);
lbBlock *body_check = lb_create_block(p, "for.bit_set.range.body-check");
lbBlock *body = lb_create_block(p, "for.bit_set.range.body");
done = lb_create_block(p, "for.bit_set.range.done");
lbValue offset = lb_addr_load(p, offset_);
lbValue cond = lb_emit_comp(p, Token_LtEq, offset, max_count);
lb_emit_if(p, cond, body_check, done);
lb_start_block(p, body_check);
val = lb_emit_conv(p, offset, elem);
lb_emit_increment(p, offset_.addr);
lbValue check = lb_build_binary_in(p, val, the_set, Token_in);
lb_emit_if(p, check, body, loop);
lb_start_block(p, body);
if (rs->reverse) {
initial_mask = lb_emit_reverse_bits(p, initial_mask, mask);
}
lbAddr remaining = lb_add_local_generated(p, mask, false);
lb_addr_store(p, remaining, initial_mask);
loop = lb_create_block(p, "for.bit_set.loop");
lbBlock *body = lb_create_block(p, "for.bit_set.body");
done = lb_create_block(p, "for.bit_set.done");
lb_emit_jump(p, loop);
lb_start_block(p, loop);
lbValue remaining_val = lb_addr_load(p, remaining);
lbValue cond = lb_emit_comp(p, Token_NotEq, remaining_val, lb_zero(m, mask));
lb_emit_if(p, cond, body, done);
lb_start_block(p, body);
val = lb_emit_count_trailing_zeros(p, remaining_val, mask);
val = lb_emit_conv(p, val, elem);
if (rs->reverse) {
val = lb_emit_arith(p, Token_Sub, lb_const_int(m, elem, et->BitSet.lower + 8*type_size_of(mask) - 1), val, elem);
} else {
val = lb_emit_arith(p, Token_Add, val, lb_const_int(m, elem, et->BitSet.lower), elem);
}
lbValue reduce_val = lb_emit_arith(p, Token_Sub, remaining_val, lb_const_int(m, mask, 1), mask);
remaining_val = lb_emit_arith(p, Token_And, remaining_val, reduce_val, mask);
lb_addr_store(p, remaining, remaining_val);
break;
}
default: