idk
This commit is contained in:
2
.dir-locals.el
Normal file
2
.dir-locals.el
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
((c-mode . ((tab-width . 4)
|
||||||
|
(indent-tabs-mode . t))))
|
||||||
1
all.h
1
all.h
@@ -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) \
|
||||||
|
|||||||
8
parse.c
8
parse.c
@@ -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,9 @@ parseline(PState ps)
|
|||||||
curb->jmp.arg = r;
|
curb->jmp.arg = r;
|
||||||
}
|
}
|
||||||
goto Close;
|
goto Close;
|
||||||
|
case Ttail:
|
||||||
|
curb->jmp.type = Jtail;
|
||||||
|
goto Close;
|
||||||
case Tjmp:
|
case Tjmp:
|
||||||
curb->jmp.type = Jjmp;
|
curb->jmp.type = Jjmp;
|
||||||
goto Jump;
|
goto Jump;
|
||||||
@@ -1434,6 +1439,9 @@ 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\n");
|
||||||
|
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) {
|
||||||
|
|||||||
8
test/tail.ssa
Normal file
8
test/tail.ssa
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
function w $factorial (w %n, w %acc) {
|
||||||
|
@start
|
||||||
|
jnz %n, @z, @nz
|
||||||
|
@z
|
||||||
|
ret %acc
|
||||||
|
@nz
|
||||||
|
tail
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user