aboutsummaryrefslogtreecommitdiff
path: root/src/ejit.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2025-05-17 13:42:33 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2025-05-17 13:42:33 +0300
commitb9372c7be73a7cad6d741f5323dc8b2b758198d4 (patch)
tree66b766bccad93abd2311b9215651bd94456b3728 /src/ejit.c
parent5c11915931ad43617ba6f62189bb11630b9624d4 (diff)
downloadejit-b9372c7be73a7cad6d741f5323dc8b2b758198d4.tar.gz
ejit-b9372c7be73a7cad6d741f5323dc8b2b758198d4.zip
take loops into account in register allocatorHEADmaster
Diffstat (limited to 'src/ejit.c')
-rw-r--r--src/ejit.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/ejit.c b/src/ejit.c
index 2341890..1bb272d 100644
--- a/src/ejit.c
+++ b/src/ejit.c
@@ -341,6 +341,7 @@ struct ejit_func *ejit_create_func(enum ejit_type rtype, size_t argc,
f->sign = types_create(0);
f->insns = insns_create(0);
f->labels = labels_create(0);
+ f->barriers = barriers_create(0);
f->gpr = gpr_stats_create(0);
f->fpr = fpr_stats_create(0);
f->arena = NULL;
@@ -434,6 +435,7 @@ void ejit_destroy_func(struct ejit_func *f)
types_destroy(&f->sign);
insns_destroy(&f->insns);
labels_destroy(&f->labels);
+ barriers_destroy(&f->barriers);
gpr_stats_destroy(&f->gpr);
fpr_stats_destroy(&f->fpr);
free(f);
@@ -452,6 +454,12 @@ void ejit_patch(struct ejit_func *f, struct ejit_reloc r, struct ejit_label l)
/** @todo some assert that checks the opcode? */
i.r0 = l.addr;
*insns_at(&f->insns, r.insn) = i;
+
+ struct barrier_tuple tuple = {
+ .start = r.insn > l.addr ? l.addr : r.insn,
+ .end = r.insn > l.addr ? r.insn : l.addr
+ };
+ barriers_append(&f->barriers, tuple);
}
void ejit_taili(struct ejit_func *s, struct ejit_func *f,