patch return, might not work

This commit is contained in:
Quentin Carbonneaux 2016-02-23 10:54:56 -05:00
parent b75c211dbf
commit 82d5bbc0bc
3 changed files with 34 additions and 22 deletions

View file

@ -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:;
} }

View file

@ -281,6 +281,8 @@ enum Jmp {
JRet0, JRet0,
JRetw, JRetw,
JRetl, JRetl,
JRets,
JRetd,
JRetc, JRetc,
JJmp, JJmp,
JJnz, JJnz,

View file

@ -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);