commit f2b2256ebee7e402aa6a8f02b4bf885b217c6494
parent ebcc123e4dc0d5497e816fe824c1849685e295af
Author: Quentin Carbonneaux <quentin.carbonneaux@yale.edu>
Date: Thu, 7 Apr 2016 14:20:12 -0400
add a canfold field to opdesc
Diffstat:
| M | all.h | | | 1 | + |
| M | parse.c | | | 124 | ++++++++++++++++++++++++++++++++++++++++---------------------------------------- |
2 files changed, 63 insertions(+), 62 deletions(-)
diff --git a/all.h b/all.h
@@ -306,6 +306,7 @@ struct OpDesc {
char argcls[2][4];
uint sflag:1; /* sets the zero flag */
uint lflag:1; /* leaves flags */
+ uint cfold:1; /* can fold */
};
struct Ins {
diff --git a/parse.c b/parse.c
@@ -10,72 +10,72 @@ enum {
OpDesc opdesc[NOp] = {
#define A(a,b,c,d) {[Kw]=K##a, [Kl]=K##b, [Ks]=K##c, [Kd]=K##d}
- /* NAME NM ARGCLS0 ARGCLS1 SF LF */
- [OAdd] = { "add", 2, {A(w,l,s,d), A(w,l,s,d)}, 1, 0 },
- [OSub] = { "sub", 2, {A(w,l,s,d), A(w,l,s,d)}, 1, 0 },
- [ODiv] = { "div", 2, {A(w,l,s,d), A(w,l,s,d)}, 0, 0 },
- [ORem] = { "rem", 2, {A(w,l,x,x), A(w,l,x,x)}, 0, 0 },
- [OUDiv] = { "udiv", 2, {A(w,l,s,d), A(w,l,s,d)}, 0, 0 },
- [OURem] = { "urem", 2, {A(w,l,x,x), A(w,l,x,x)}, 0, 0 },
- [OMul] = { "mul", 2, {A(w,l,s,d), A(w,l,s,d)}, 0, 0 },
- [OAnd] = { "and", 2, {A(w,l,s,d), A(w,l,s,d)}, 1, 0 },
- [OOr] = { "or", 2, {A(w,l,s,d), A(w,l,s,d)}, 1, 0 },
- [OXor] = { "xor", 2, {A(w,l,s,d), A(w,l,s,d)}, 1, 0 },
- [OSar] = { "sar", 1, {A(w,l,x,x), A(w,w,x,x)}, 1, 0 },
- [OShr] = { "shr", 1, {A(w,l,x,x), A(w,w,x,x)}, 1, 0 },
- [OShl] = { "shl", 1, {A(w,l,x,x), A(w,w,x,x)}, 1, 0 },
- [OStored] = { "stored", 0, {A(d,d,d,d), A(m,m,m,m)}, 0, 1 },
- [OStores] = { "stores", 0, {A(s,s,s,s), A(m,m,m,m)}, 0, 1 },
- [OStorel] = { "storel", 0, {A(l,l,l,l), A(m,m,m,m)}, 0, 1 },
- [OStorew] = { "storew", 0, {A(w,w,w,w), A(m,m,m,m)}, 0, 1 },
- [OStoreh] = { "storeh", 0, {A(w,w,w,w), A(m,m,m,m)}, 0, 1 },
- [OStoreb] = { "storeb", 0, {A(w,w,w,w), A(m,m,m,m)}, 0, 1 },
- [OLoad] = { "load", 0, {A(m,m,m,m), A(x,x,x,x)}, 0, 1 },
- [OLoadsw] = { "loadsw", 0, {A(m,m,x,x), A(x,x,x,x)}, 0, 1 },
- [OLoaduw] = { "loaduw", 0, {A(m,m,x,x), A(x,x,x,x)}, 0, 1 },
- [OLoadsh] = { "loadsh", 0, {A(m,m,x,x), A(x,x,x,x)}, 0, 1 },
- [OLoaduh] = { "loaduh", 0, {A(m,m,x,x), A(x,x,x,x)}, 0, 1 },
- [OLoadsb] = { "loadsb", 0, {A(m,m,x,x), A(x,x,x,x)}, 0, 1 },
- [OLoadub] = { "loadub", 0, {A(m,m,x,x), A(x,x,x,x)}, 0, 1 },
- [OExtsw] = { "extsw", 0, {A(w,w,w,w), A(x,x,x,x)}, 0, 1 },
- [OExtuw] = { "extuw", 0, {A(w,w,w,w), A(x,x,x,x)}, 0, 1 },
- [OExtsh] = { "extsh", 0, {A(w,w,w,w), A(x,x,x,x)}, 0, 1 },
- [OExtuh] = { "extuh", 0, {A(w,w,w,w), A(x,x,x,x)}, 0, 1 },
- [OExtsb] = { "extsb", 0, {A(w,w,w,w), A(x,x,x,x)}, 0, 1 },
- [OExtub] = { "extub", 0, {A(w,w,w,w), A(x,x,x,x)}, 0, 1 },
- [OExts] = { "exts", 0, {A(w,w,w,w), A(x,x,x,x)}, 0, 1 },
- [OTruncd] = { "truncd", 0, {A(d,d,d,d), A(x,x,x,x)}, 0, 1 },
- [OFtosi] = { "ftosi", 0, {A(s,d,x,x), A(x,x,x,x)}, 0, 1 },
- [OSitof] = { "sitof", 0, {A(x,x,w,l), A(x,x,x,x)}, 0, 1 },
- [OCast] = { "cast", 0, {A(s,d,w,l), A(x,x,x,x)}, 0, 1 },
- [OCopy] = { "copy", 1, {A(w,l,s,d), A(x,x,x,x)}, 0, 1 },
- [ONop] = { "nop", 0, {A(x,x,x,x), A(x,x,x,x)}, 0, 1 },
- [OSwap] = { "swap", 2, {A(w,l,s,d), A(w,l,s,d)}, 0, 0 },
- [OSign] = { "sign", 0, {A(w,l,x,x), A(x,x,x,x)}, 0, 0 },
- [OSAlloc] = { "salloc", 0, {A(x,l,x,x), A(x,x,x,x)}, 0, 0 },
- [OXDiv] = { "xdiv", 1, {A(w,l,x,x), A(x,x,x,x)}, 0, 0 },
- [OXCmp] = { "xcmp", 1, {A(w,l,s,d), A(w,l,s,d)}, 1, 0 },
- [OXTest] = { "xtest", 1, {A(w,l,x,x), A(w,l,x,x)}, 1, 0 },
- [OAddr] = { "addr", 0, {A(m,m,x,x), A(x,x,x,x)}, 0, 1 },
- [OPar] = { "parn", 0, {A(x,x,x,x), A(x,x,x,x)}, 0, 0 },
- [OParc] = { "parc", 0, {A(x,x,x,x), A(x,x,x,x)}, 0, 0 },
- [OArg] = { "arg", 0, {A(x,x,x,x), A(x,x,x,x)}, 0, 0 },
- [OArgc] = { "argc", 0, {A(x,x,x,x), A(x,x,x,x)}, 0, 0 },
- [OCall] = { "call", 0, {A(m,m,m,m), A(x,x,x,x)}, 0, 0 },
- [OXSetnp] = { "xsetnp", 0, {A(x,x,x,x), A(x,x,x,x)}, 0, 0 },
- [OXSetp] = { "xsetp", 0, {A(x,x,x,x), A(x,x,x,x)}, 0, 0 },
- [OAlloc] = { "alloc4", 1, {A(l,l,l,l), A(x,x,x,x)}, 0, 0 },
- [OAlloc+1] = { "alloc8", 1, {A(l,l,l,l), A(x,x,x,x)}, 0, 0 },
- [OAlloc+2] = { "alloc16", 1, {A(l,l,l,l), A(x,x,x,x)}, 0, 0 },
+ /* NAME NM ARGCLS0 ARGCLS1 SF LF FLD*/
+ [OAdd] = { "add", 2, {A(w,l,s,d), A(w,l,s,d)}, 1, 0, 1 },
+ [OSub] = { "sub", 2, {A(w,l,s,d), A(w,l,s,d)}, 1, 0, 1 },
+ [ODiv] = { "div", 2, {A(w,l,s,d), A(w,l,s,d)}, 0, 0, 1 },
+ [ORem] = { "rem", 2, {A(w,l,x,x), A(w,l,x,x)}, 0, 0, 1 },
+ [OUDiv] = { "udiv", 2, {A(w,l,s,d), A(w,l,s,d)}, 0, 0, 1 },
+ [OURem] = { "urem", 2, {A(w,l,x,x), A(w,l,x,x)}, 0, 0, 1 },
+ [OMul] = { "mul", 2, {A(w,l,s,d), A(w,l,s,d)}, 0, 0, 1 },
+ [OAnd] = { "and", 2, {A(w,l,s,d), A(w,l,s,d)}, 1, 0, 1 },
+ [OOr] = { "or", 2, {A(w,l,s,d), A(w,l,s,d)}, 1, 0, 1 },
+ [OXor] = { "xor", 2, {A(w,l,s,d), A(w,l,s,d)}, 1, 0, 1 },
+ [OSar] = { "sar", 1, {A(w,l,x,x), A(w,w,x,x)}, 1, 0, 1 },
+ [OShr] = { "shr", 1, {A(w,l,x,x), A(w,w,x,x)}, 1, 0, 1 },
+ [OShl] = { "shl", 1, {A(w,l,x,x), A(w,w,x,x)}, 1, 0, 1 },
+ [OStored] = { "stored", 0, {A(d,d,d,d), A(m,m,m,m)}, 0, 1, 0 },
+ [OStores] = { "stores", 0, {A(s,s,s,s), A(m,m,m,m)}, 0, 1, 0 },
+ [OStorel] = { "storel", 0, {A(l,l,l,l), A(m,m,m,m)}, 0, 1, 0 },
+ [OStorew] = { "storew", 0, {A(w,w,w,w), A(m,m,m,m)}, 0, 1, 0 },
+ [OStoreh] = { "storeh", 0, {A(w,w,w,w), A(m,m,m,m)}, 0, 1, 0 },
+ [OStoreb] = { "storeb", 0, {A(w,w,w,w), A(m,m,m,m)}, 0, 1, 0 },
+ [OLoad] = { "load", 0, {A(m,m,m,m), A(x,x,x,x)}, 0, 1, 0 },
+ [OLoadsw] = { "loadsw", 0, {A(m,m,x,x), A(x,x,x,x)}, 0, 1, 0 },
+ [OLoaduw] = { "loaduw", 0, {A(m,m,x,x), A(x,x,x,x)}, 0, 1, 0 },
+ [OLoadsh] = { "loadsh", 0, {A(m,m,x,x), A(x,x,x,x)}, 0, 1, 0 },
+ [OLoaduh] = { "loaduh", 0, {A(m,m,x,x), A(x,x,x,x)}, 0, 1, 0 },
+ [OLoadsb] = { "loadsb", 0, {A(m,m,x,x), A(x,x,x,x)}, 0, 1, 0 },
+ [OLoadub] = { "loadub", 0, {A(m,m,x,x), A(x,x,x,x)}, 0, 1, 0 },
+ [OExtsw] = { "extsw", 0, {A(w,w,w,w), A(x,x,x,x)}, 0, 1, 1 },
+ [OExtuw] = { "extuw", 0, {A(w,w,w,w), A(x,x,x,x)}, 0, 1, 1 },
+ [OExtsh] = { "extsh", 0, {A(w,w,w,w), A(x,x,x,x)}, 0, 1, 1 },
+ [OExtuh] = { "extuh", 0, {A(w,w,w,w), A(x,x,x,x)}, 0, 1, 1 },
+ [OExtsb] = { "extsb", 0, {A(w,w,w,w), A(x,x,x,x)}, 0, 1, 1 },
+ [OExtub] = { "extub", 0, {A(w,w,w,w), A(x,x,x,x)}, 0, 1, 1 },
+ [OExts] = { "exts", 0, {A(w,w,w,w), A(x,x,x,x)}, 0, 1, 1 },
+ [OTruncd] = { "truncd", 0, {A(d,d,d,d), A(x,x,x,x)}, 0, 1, 1 },
+ [OFtosi] = { "ftosi", 0, {A(s,d,x,x), A(x,x,x,x)}, 0, 1, 1 },
+ [OSitof] = { "sitof", 0, {A(x,x,w,l), A(x,x,x,x)}, 0, 1, 1 },
+ [OCast] = { "cast", 0, {A(s,d,w,l), A(x,x,x,x)}, 0, 1, 1 },
+ [OCopy] = { "copy", 1, {A(w,l,s,d), A(x,x,x,x)}, 0, 1, 0 },
+ [ONop] = { "nop", 0, {A(x,x,x,x), A(x,x,x,x)}, 0, 1, 0 },
+ [OSwap] = { "swap", 2, {A(w,l,s,d), A(w,l,s,d)}, 0, 0, 0 },
+ [OSign] = { "sign", 0, {A(w,l,x,x), A(x,x,x,x)}, 0, 0, 0 },
+ [OSAlloc] = { "salloc", 0, {A(x,l,x,x), A(x,x,x,x)}, 0, 0, 0 },
+ [OXDiv] = { "xdiv", 1, {A(w,l,x,x), A(x,x,x,x)}, 0, 0, 0 },
+ [OXCmp] = { "xcmp", 1, {A(w,l,s,d), A(w,l,s,d)}, 1, 0, 0 },
+ [OXTest] = { "xtest", 1, {A(w,l,x,x), A(w,l,x,x)}, 1, 0, 0 },
+ [OAddr] = { "addr", 0, {A(m,m,x,x), A(x,x,x,x)}, 0, 1, 0 },
+ [OPar] = { "parn", 0, {A(x,x,x,x), A(x,x,x,x)}, 0, 0, 0 },
+ [OParc] = { "parc", 0, {A(x,x,x,x), A(x,x,x,x)}, 0, 0, 0 },
+ [OArg] = { "arg", 0, {A(x,x,x,x), A(x,x,x,x)}, 0, 0, 0 },
+ [OArgc] = { "argc", 0, {A(x,x,x,x), A(x,x,x,x)}, 0, 0, 0 },
+ [OCall] = { "call", 0, {A(m,m,m,m), A(x,x,x,x)}, 0, 0, 0 },
+ [OXSetnp] = { "xsetnp", 0, {A(x,x,x,x), A(x,x,x,x)}, 0, 0, 0 },
+ [OXSetp] = { "xsetp", 0, {A(x,x,x,x), A(x,x,x,x)}, 0, 0, 0 },
+ [OAlloc] = { "alloc4", 1, {A(l,l,l,l), A(x,x,x,x)}, 0, 0, 0 },
+ [OAlloc+1] = { "alloc8", 1, {A(l,l,l,l), A(x,x,x,x)}, 0, 0, 0 },
+ [OAlloc+2] = { "alloc16", 1, {A(l,l,l,l), A(x,x,x,x)}, 0, 0, 0 },
#define X(c) \
- [OCmpw+IC##c] = { "c" #c "w", 0, {A(w,w,x,x), A(w,w,x,x)}, 1, 0 }, \
- [OCmpl+IC##c] = { "c" #c "l", 0, {A(l,l,x,x), A(l,l,x,x)}, 1, 0 }, \
- [OXSet+IC##c] = { "xset" #c, 0, {A(x,x,x,x), A(x,x,x,x)}, 0, 1 },
+ [OCmpw+IC##c] = { "c" #c "w", 0, {A(w,w,x,x), A(w,w,x,x)}, 1, 0, 1 }, \
+ [OCmpl+IC##c] = { "c" #c "l", 0, {A(l,l,x,x), A(l,l,x,x)}, 1, 0, 1 }, \
+ [OXSet+IC##c] = { "xset" #c, 0, {A(x,x,x,x), A(x,x,x,x)}, 0, 1, 0 },
ICMPS(X)
#undef X
#define X(c) \
- [OCmps+FC##c] = { "c" #c "s", 0, {A(s,s,x,x), A(s,s,x,x)}, 1, 0 }, \
- [OCmpd+FC##c] = { "c" #c "d", 0, {A(d,d,x,x), A(d,d,x,x)}, 1, 0 },
+ [OCmps+FC##c] = { "c" #c "s", 0, {A(s,s,x,x), A(s,s,x,x)}, 1, 0, 1 }, \
+ [OCmpd+FC##c] = { "c" #c "d", 0, {A(d,d,x,x), A(d,d,x,x)}, 1, 0, 1 },
FCMPS(X)
#undef X