summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle Gunger <kgunger12@gmail.com>2024-02-24 01:27:27 -0500
committerKyle Gunger <kgunger12@gmail.com>2024-02-24 01:27:27 -0500
commitad3c3ba2b42ec6190faa7549a00e92d42fcbad9a (patch)
treef0c170b1031dc471c72b7809ea12f02ffd9a7e14
parentbb5f0f1d0906adae57f9673cb48c0fcedf1d11d4 (diff)
reg avail bitmask query
-rw-r--r--compiler.c63
1 files changed, 60 insertions, 3 deletions
diff --git a/compiler.c b/compiler.c
index 068c65f..04fce43 100644
--- a/compiler.c
+++ b/compiler.c
@@ -754,7 +754,7 @@ char *_op_get_location(Variable *var) {
out = int_to_str(var->offset);
} else if(var->location == LOC_STCK) {
// Invert because stack grows down (and stack index starts at 1)
- out = _gen_address("", "rsp", "", 0, var->offset, false);
+ out = _gen_address("", "rbp", "", 0, -var->offset, false);
} else if (var->location == LOC_DATA) {
// Stored in data sec
char *name = _var_get_datalabel(var);
@@ -1097,7 +1097,7 @@ char *_var_get_store(CompData *out, Variable *store) {
return _gen_address(PREFIXES[_var_size(store) - 1], name, "", 0, 0, true);
free(name);
} else if (store->location < 0) {
- return _gen_address(PREFIXES[_var_size(store) - 1], "rsp", "", 0, -(store->location + 1), false);
+ return _gen_address(PREFIXES[_var_size(store) - 1], "rbp", "", 0, -store->offset, false);
} else {
return _op_get_location(store);
}
@@ -1155,7 +1155,7 @@ char *_var_get_from(CompData *out, Variable *store, Variable *from) {
free(name);
} else {
// from on stack
- mov_from = _gen_address(PREFIXES[_var_size(from) - 1], "rsp", "", 0, -(from->location + 1), false);
+ mov_from = _gen_address(PREFIXES[_var_size(from) - 1], "rbp", "", 0, -from->offset, false);
}
// Match sign of data if required.
@@ -3494,6 +3494,63 @@ Scope scope_subscope(Scope *s, char *name) {
// Scope variable creation and management
+int _scope_next_stack_loc(Scope *s) {
+ int sum = 0;
+
+ if (s->parent != NULL)
+ sum += _scope_next_stack_loc(s->parent);
+ else
+ sum += 56;
+
+ for (size_t i = 0; i < s->stack_vars.count; i++) {
+ Variable *v = vect_get(&s->stack_vars, i);
+ if (_var_ptr_type(v) > 1) {
+ // TODO: Multi dimensional arrays
+ sum += 8;
+ sum += v->type->size * _var_ptr_type(v);
+ } else {
+ sum += _var_pure_size(v);
+ }
+ }
+
+ return sum;
+}
+
+// Tmp reg masks
+#define RMSK_B 0b001
+#define RMSK_8 0b010
+#define RMSK_9 0b100
+
+// Main reg masks
+#define RMSK_10 0b000001000
+#define RMSK_11 0b000010000
+#define RMSK_12 0b000100000
+#define RMSK_13 0b001000000
+#define RMSK_14 0b010000000
+#define RMSK_15 0b100000000
+
+int _scope_avail_reg(Scope *s) {
+ int mask = 0b111111111;
+ if (s->parent != NULL) {
+ mask = _scope_avail_reg(s->parent);
+ }
+
+ for (size_t i = 0; i < s->reg_vars.count; i++) {
+ Variable *v = vect_get(&s->reg_vars, i);
+ int vmask = 0;
+
+ if (v->location == 2) {
+ vmask = RMSK_B;
+ } else if (v->location > 8) {
+ vmask = 0b1 << (v->location - 8);
+ }
+
+ mask = mask & !(vmask);
+ }
+
+ return mask;
+}
+
// Creates a new tmp variable from an existing variable
Variable scope_mk_tmp(Variable *v) {
return *v;