diff options
author | Quentin Carbonneaux <quentin.carbonneaux@yale.edu> | 2015-08-06 16:35:17 -0400 |
---|---|---|
committer | Quentin Carbonneaux <quentin.carbonneaux@yale.edu> | 2015-09-15 23:01:30 -0400 |
commit | 7dc3e5dcf60d1995857c85773cd15c9904ec9abd (patch) | |
tree | 80fdc629c43569d868705622b8139f1628efd03f | |
parent | 27f32f26b32d9dd4138f30a23baaea237984c58c (diff) | |
download | roux-7dc3e5dcf60d1995857c85773cd15c9904ec9abd.tar.gz |
split cmp in two sizes
-rw-r--r-- | lisc/emit.c | 7 | ||||
-rw-r--r-- | lisc/isel.c | 11 | ||||
-rw-r--r-- | lisc/lisc.h | 3 | ||||
-rw-r--r-- | lisc/parse.c | 3 | ||||
-rw-r--r-- | lisc/test/cup.ssa | 4 |
5 files changed, 20 insertions, 8 deletions
diff --git a/lisc/emit.c b/lisc/emit.c index 665a418..c1fd49a 100644 --- a/lisc/emit.c +++ b/lisc/emit.c @@ -43,7 +43,6 @@ static char *rtoa[] = { static char *rbtoa[] = { [RXX] = "OH GOD!", - [RAX] = "al", [RCX] = "cl", [RDX] = "dl", @@ -166,8 +165,10 @@ eins(Ins i, Fn *fn, FILE *f) case OXDiv: eop("idiv", i.arg[0], R, fn, f); break; - case OXCmp: - eop("cmp", i.arg[0], i.arg[1], fn, f); + case OXCmpw: + case OXCmpl: + eop(i.op == OXCmpw ? "cmpl" : "cmpq", + i.arg[0], i.arg[1], fn, f); break; case ONop: break; diff --git a/lisc/isel.c b/lisc/isel.c index 8fe7535..31de291 100644 --- a/lisc/isel.c +++ b/lisc/isel.c @@ -39,6 +39,12 @@ newtmp(int type, Fn *fn) return t; } +static int +islong(Ref r, Fn *fn) +{ + return rtype(r) == RTmp && fn->tmp[r.val].type == TLong; +} + static void sel(Ins i, Fn *fn) { @@ -103,7 +109,10 @@ sel(Ins i, Fn *fn) } } emit(OXSet+c, i.to, R, R); - emit(OXCmp, R, i.arg[1], r0); + if (islong(r0, fn) || islong(i.arg[1], fn)) + emit(OXCmpl, R, i.arg[1], r0); + else + emit(OXCmpw, R, i.arg[1], r0); if (t != -1) emit(OCopy, r0, i.arg[0], R); break; diff --git a/lisc/lisc.h b/lisc/lisc.h index 2fe2614..8f77a54 100644 --- a/lisc/lisc.h +++ b/lisc/lisc.h @@ -134,7 +134,8 @@ enum { OSwap, OSign, OXDiv, - OXCmp, + OXCmpw, + OXCmpl, OXSet, OXSet1 = OXSet + NCmp-1, OLast diff --git a/lisc/parse.c b/lisc/parse.c index 0a03abb..6b7767e 100644 --- a/lisc/parse.c +++ b/lisc/parse.c @@ -23,7 +23,8 @@ OpDesc opdesc[OLast] = { [OSwap] = { "swap", 2, T }, [OSign] = { "sign", 1, U }, [OXDiv] = { "xdiv", 1, U }, - [OXCmp] = { "xcmp", 2, U }, + [OXCmpw] = { "xcmpw", 2, U }, + [OXCmpl] = { "xcmpl", 2, U }, #define X(c) \ [OCmp+C##c] = { "c" #c, 2, U }, \ diff --git a/lisc/test/cup.ssa b/lisc/test/cup.ssa index 4ffcf29..bd6501e 100644 --- a/lisc/test/cup.ssa +++ b/lisc/test/cup.ssa @@ -2,8 +2,8 @@ @start @loop - %n0 =w phi @start -1988, @loop %n1 - %n1 =w add 1, %n0 + %n0 =l phi @start -1988, @loop %n1 + %n1 =l add 1, %n0 %cmp =w csle 1991, %n1 jez %cmp, @loop, @end @end |