aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLaytan Laats <laytanlaats@hotmail.com>2024-07-27 04:20:03 +0200
committerLaytan Laats <laytanlaats@hotmail.com>2024-08-14 01:44:35 +0200
commitefe68c2e24e0a38e591f146822ed93904e4193d7 (patch)
treec2ac0ed3d08746495aa6adcd7a1c1ab052a7ee76 /src
parentac68a9d52c3a9edc587e1ccab747613baf6f89de (diff)
posix: add package
Diffstat (limited to 'src')
-rw-r--r--src/big_int.cpp4
-rw-r--r--src/check_builtin.cpp17
-rw-r--r--src/check_decl.cpp20
-rw-r--r--src/checker_builtin_procs.hpp4
4 files changed, 43 insertions, 2 deletions
diff --git a/src/big_int.cpp b/src/big_int.cpp
index e350687b4..83235483c 100644
--- a/src/big_int.cpp
+++ b/src/big_int.cpp
@@ -621,3 +621,7 @@ gb_internal String big_int_to_string(gbAllocator allocator, BigInt const *x, u64
}
return make_string(cast(u8 *)buf.data, buf.count);
}
+
+gb_internal int big_int_log2(BigInt const *x) {
+ return mp_count_bits(x) - 1;
+}
diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp
index bde102a8d..e5282f63e 100644
--- a/src/check_builtin.cpp
+++ b/src/check_builtin.cpp
@@ -3979,6 +3979,23 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As
break;
}
+ case BuiltinProc_constant_log2: {
+ Operand o = {};
+ check_expr(c, &o, ce->args[0]);
+
+ if (!is_type_integer(o.type) && (o.mode != Addressing_Constant)) {
+ error(ce->args[0], "Expected a constant integer for '%.*s'", LIT(builtin_name));
+ return false;
+ }
+
+ int log2 = big_int_log2(&o.value.value_integer);
+
+ operand->mode = Addressing_Constant;
+ operand->value = exact_value_i64(cast(i64)log2);
+ operand->type = t_untyped_integer;
+ break;
+ }
+
case BuiltinProc_soa_struct: {
Operand x = {};
Operand y = {};
diff --git a/src/check_decl.cpp b/src/check_decl.cpp
index 1425aafa8..0d4b47037 100644
--- a/src/check_decl.cpp
+++ b/src/check_decl.cpp
@@ -756,13 +756,29 @@ gb_internal bool are_signatures_similar_enough(Type *a_, Type *b_) {
for (isize i = 0; i < a->param_count; i++) {
Type *x = core_type(a->params->Tuple.variables[i]->type);
Type *y = core_type(b->params->Tuple.variables[i]->type);
+
+ if (x->kind == Type_BitSet && x->BitSet.underlying) {
+ x = core_type(x->BitSet.underlying);
+ }
+ if (y->kind == Type_BitSet && y->BitSet.underlying) {
+ y = core_type(y->BitSet.underlying);
+ }
+
if (!signature_parameter_similar_enough(x, y)) {
return false;
}
}
for (isize i = 0; i < a->result_count; i++) {
- Type *x = base_type(a->results->Tuple.variables[i]->type);
- Type *y = base_type(b->results->Tuple.variables[i]->type);
+ Type *x = core_type(a->results->Tuple.variables[i]->type);
+ Type *y = core_type(b->results->Tuple.variables[i]->type);
+
+ if (x->kind == Type_BitSet && x->BitSet.underlying) {
+ x = core_type(x->BitSet.underlying);
+ }
+ if (y->kind == Type_BitSet && y->BitSet.underlying) {
+ y = core_type(y->BitSet.underlying);
+ }
+
if (!signature_parameter_similar_enough(x, y)) {
return false;
}
diff --git a/src/checker_builtin_procs.hpp b/src/checker_builtin_procs.hpp
index 6245dadaf..ef07938c7 100644
--- a/src/checker_builtin_procs.hpp
+++ b/src/checker_builtin_procs.hpp
@@ -46,6 +46,8 @@ enum BuiltinProcId {
BuiltinProc_has_target_feature,
+ BuiltinProc_constant_log2,
+
BuiltinProc_transpose,
BuiltinProc_outer_product,
BuiltinProc_hadamard_product,
@@ -380,6 +382,8 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = {
{STR_LIT("has_target_feature"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
+ {STR_LIT("constant_log2"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
+
{STR_LIT("transpose"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
{STR_LIT("outer_product"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics},
{STR_LIT("hadamard_product"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics},