Compare commits

..

3 Commits

Author SHA1 Message Date
c86672e9dc idk 2026-06-12 11:21:23 -06:00
ab0e88ede2 idk 2026-06-12 11:21:23 -06:00
1ed9eba90a idk 2026-06-12 11:21:23 -06:00
6 changed files with 28 additions and 1 deletions

2
.dir-locals.el Normal file
View File

@@ -0,0 +1,2 @@
((c-mode . ((tab-width . 4)
(indent-tabs-mode . t))))

1
all.h
View File

@@ -160,6 +160,7 @@ enum J {
X(retw) X(retl) X(rets) X(retd) \ X(retw) X(retl) X(rets) X(retd) \
X(retsb) X(retub) X(retsh) X(retuh) \ X(retsb) X(retub) X(retsh) X(retuh) \
X(retc) X(ret0) X(jmp) X(jnz) \ X(retc) X(ret0) X(jmp) X(jnz) \
X(tail) \
X(jfieq) X(jfine) X(jfisge) X(jfisgt) \ X(jfieq) X(jfine) X(jfisge) X(jfisgt) \
X(jfisle) X(jfislt) X(jfiuge) X(jfiugt) \ X(jfisle) X(jfislt) X(jfiuge) X(jfiugt) \
X(jfiule) X(jfiult) X(jffeq) X(jffge) \ X(jfiule) X(jfiult) X(jffeq) X(jffge) \

1
main.c
View File

@@ -60,6 +60,7 @@ func(Fn *fn)
if (debug['P']) { if (debug['P']) {
fprintf(stderr, "\n> After parsing:\n"); fprintf(stderr, "\n> After parsing:\n");
printfn(fn, stderr); printfn(fn, stderr);
exit (1);
} }
T.abi0(fn); T.abi0(fn);
fillcfg(fn); fillcfg(fn);

14
parse.c
View File

@@ -53,6 +53,7 @@ enum Token {
Tphi, Tphi,
Tjmp, Tjmp,
Tjnz, Tjnz,
Ttail,
Tret, Tret,
Thlt, Thlt,
Texport, Texport,
@@ -113,6 +114,7 @@ static char *kwmap[Ntok] = {
[Tphi] = "phi", [Tphi] = "phi",
[Tjmp] = "jmp", [Tjmp] = "jmp",
[Tjnz] = "jnz", [Tjnz] = "jnz",
[Ttail] = "tail",
[Tret] = "ret", [Tret] = "ret",
[Thlt] = "hlt", [Thlt] = "hlt",
[Texport] = "export", [Texport] = "export",
@@ -664,6 +666,13 @@ parseline(PState ps)
curb->jmp.arg = r; curb->jmp.arg = r;
} }
goto Close; goto Close;
case Ttail:
curb->jmp.type = Jtail;
curb->jmp.arg = parseref ();
/* Ins *restore = curi; */
parserefl(1);
/* curi = restore; */
goto Close;
case Tjmp: case Tjmp:
curb->jmp.type = Jjmp; curb->jmp.type = Jjmp;
goto Jump; goto Jump;
@@ -1434,6 +1443,11 @@ printfn(Fn *fn, FILE *f)
if (b->s1 != b->link) if (b->s1 != b->link)
fprintf(f, "\tjmp @%s\n", b->s1->name); fprintf(f, "\tjmp @%s\n", b->s1->name);
break; break;
case Jtail:
fprintf (f, "\ttail ");
printref (b->jmp.arg, fn, f);
fprintf (f, "%d (%d)", i->op, Oarg);
break;
default: default:
fprintf(f, "\t%s ", jtoa[b->jmp.type]); fprintf(f, "\t%s ", jtoa[b->jmp.type]);
if (b->jmp.type == Jjnz) { if (b->jmp.type == Jjnz) {

1
result
View File

@@ -1 +0,0 @@
/nix/store/662p38x2aqlrk0hnx0nskcj4100as900-qbe-git

10
test/tail.ssa Normal file
View File

@@ -0,0 +1,10 @@
function w $factorial (w %n, w %acc) {
@start
jnz %n, @z, @nz
@z
ret %acc
@nz
%n_next =w sub %n, 1
%acc_next =w mul %n, %acc
tail $factorial (w %n_next, w %acc)
}