patch return, might not work
This commit is contained in:
parent
b75c211dbf
commit
82d5bbc0bc
3 changed files with 34 additions and 22 deletions
49
lisc/isel.c
49
lisc/isel.c
|
@ -47,29 +47,33 @@ fcmptoi(int fc)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
iscmp(int op, int *k, int *c)
|
iscmp(int op, int *pk, int *pc)
|
||||||
{
|
{
|
||||||
|
int k, c;
|
||||||
|
|
||||||
if (OCmpw <= op && op <= OCmpw1) {
|
if (OCmpw <= op && op <= OCmpw1) {
|
||||||
c && (*c = op - OCmpw);
|
c = op - OCmpw;
|
||||||
k && (*k = Kw);
|
k = Kw;
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
if (OCmpl <= op && op <= OCmpl1) {
|
else if (OCmpl <= op && op <= OCmpl1) {
|
||||||
c && (*c = op - OCmpl);
|
c = op - OCmpl;
|
||||||
k && (*k = Kl);
|
k = Kl;
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
if (OCmps <= op && op <= OCmps1) {
|
else if (OCmps <= op && op <= OCmps1) {
|
||||||
c && (*c = fcmptoi(op - OCmps));
|
c = fcmptoi(op - OCmps);
|
||||||
k && (*k = Ks);
|
k = Ks;
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
if (OCmpd <= op && op <= OCmpd1) {
|
else if (OCmpd <= op && op <= OCmpd1) {
|
||||||
c && (*c = fcmptoi(op - OCmpd));
|
c = fcmptoi(op - OCmpd);
|
||||||
k && (*k = Kd);
|
k = Kd;
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
return 0;
|
else
|
||||||
|
return 0;
|
||||||
|
if (pk)
|
||||||
|
*pk = k;
|
||||||
|
if (pc)
|
||||||
|
*pc = c;
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -360,7 +364,7 @@ static void
|
||||||
seljmp(Blk *b, Fn *fn)
|
seljmp(Blk *b, Fn *fn)
|
||||||
{
|
{
|
||||||
Ref r;
|
Ref r;
|
||||||
int c, w, k;
|
int c, k;
|
||||||
Ins *fi;
|
Ins *fi;
|
||||||
|
|
||||||
switch (b->jmp.type) {
|
switch (b->jmp.type) {
|
||||||
|
@ -370,11 +374,16 @@ seljmp(Blk *b, Fn *fn)
|
||||||
assert(!"retc todo");
|
assert(!"retc todo");
|
||||||
case JRetw:
|
case JRetw:
|
||||||
case JRetl:
|
case JRetl:
|
||||||
w = b->jmp.type == JRetl;
|
case JRets:
|
||||||
|
case JRetd:
|
||||||
|
k = b->jmp.type - JRetw;
|
||||||
b->jmp.type = JRet0;
|
b->jmp.type = JRet0;
|
||||||
r = b->jmp.arg;
|
r = b->jmp.arg;
|
||||||
b->jmp.arg = R;
|
b->jmp.arg = R;
|
||||||
emit(OCopy, w ? Kl : Kw, TMP(RAX), r, R);
|
if (KBASE(k) == 0)
|
||||||
|
emit(OCopy, k, TMP(RAX), r, R);
|
||||||
|
else
|
||||||
|
emit(OCopy, k, TMP(XMM0), r, R);
|
||||||
return;
|
return;
|
||||||
case JJnz:;
|
case JJnz:;
|
||||||
}
|
}
|
||||||
|
|
|
@ -281,6 +281,8 @@ enum Jmp {
|
||||||
JRet0,
|
JRet0,
|
||||||
JRetw,
|
JRetw,
|
||||||
JRetl,
|
JRetl,
|
||||||
|
JRets,
|
||||||
|
JRetd,
|
||||||
JRetc,
|
JRetc,
|
||||||
JJmp,
|
JJmp,
|
||||||
JJnz,
|
JJnz,
|
||||||
|
|
|
@ -507,9 +507,10 @@ parseline(PState ps)
|
||||||
case TRet:
|
case TRet:
|
||||||
curb->jmp.type = (int[]){
|
curb->jmp.type = (int[]){
|
||||||
JRetw, JRetl,
|
JRetw, JRetl,
|
||||||
|
JRets, JRetd,
|
||||||
JRetc, JRet0
|
JRetc, JRet0
|
||||||
}[rcls];
|
}[rcls];
|
||||||
if (rcls < 3) {
|
if (rcls < 5) {
|
||||||
r = parseref();
|
r = parseref();
|
||||||
if (req(r, R))
|
if (req(r, R))
|
||||||
err("return value expected");
|
err("return value expected");
|
||||||
|
@ -632,7 +633,7 @@ parsefn()
|
||||||
if (peek() != TGlo)
|
if (peek() != TGlo)
|
||||||
rcls = parsecls(&fn->retty);
|
rcls = parsecls(&fn->retty);
|
||||||
else
|
else
|
||||||
rcls = 3;
|
rcls = 5;
|
||||||
if (next() != TGlo)
|
if (next() != TGlo)
|
||||||
err("function name expected");
|
err("function name expected");
|
||||||
strcpy(fn->name, tokval.str);
|
strcpy(fn->name, tokval.str);
|
||||||
|
|
Loading…
Add table
Reference in a new issue