#include "limbo.h" #define bzero bbzero /* bsd name space pollution *//* (r, s) := f(); => r, s have def on same pc s = g(); => this def kills previous r def (and s def) solution: r has def pc, s has def pc+1 and next instruction has pc pc+2*/ #define BLEN (8*sizeof(ulong))#define BSHIFT 5 /* assumes ulong 4 */#define BMASK (BLEN-1) #define SIGN(n) (1<<(n-1))#define MSK(n) (SIGN(n)|(SIGN(n)-1))#define MASK(a, b) (MSK((b)-(a)+1)<<(a)) #define isnilsrc(s) ((s)->start.line == 0 && (s)->stop.line == 0 && (s)->start.pos == 0 && (s)->stop.pos == 0) #define limbovar(d) ((d)->sym->name[0] != '.')#define structure(t) ((t)->kind == Tadt || (t)->kind == Ttuple) enum{ Bclr, Band, Bandinv, Bstore, Bandrev, Bnoop, Bxor, Bor, Bnor, Bequiv, Binv, Bimpby, Brev, Bimp, Bnand, Bset,}; enum{ Suse = 1, Muse = 2, Duse = 4, Sdef = 8, Mdef = 16, Ddef = 32, Tuse1 = 64, /* fixed point temporary */ Tuse2 = 128, /* fixed point temporary */ Mduse = 256, /* D used if M nil */ None = 0, Unop = Suse|Ddef, Cunop = Muse|Ddef, Threop = Suse|Muse|Ddef, Binop = Suse|Muse|Ddef|Mduse, Mbinop = Suse|Mdef|Duse, /* strange */ Abinop=Suse|Duse|Ddef, Mabinop = Suse|Muse|Duse|Ddef, Use1 = Suse, Use2 = Suse|Duse, Use3 = Suse|Muse|Duse,}; enum{ Sshift = 10, Mshift = 5, Dshift = 0,}; #define S(x) ((x)<<Sshift)#define M(x) ((x)<<Mshift)#define D(x) ((x)<<Dshift) #define SS(x) (((x)>>Sshift)&0x1f)#define SM(x) (((x)>>Mshift)&0x1f)#define SD(x) (((x)>>Dshift)&0x1f) enum{ I = 0, /* ignore */ B = 1, /* byte */ W = 4, /* int */ P = 4, /* pointer */ A = 4, /* array */ C = 4, /* string */ X = 4, /* fixed */ R = 4, /* float */ L = 8, /* big */ F = 8, /* real */ Sh = 2, /* short */ Pc = 4, /* pc */ Mp = 16, /* memory */ Bop2 = S(B)|D(B), Bop = S(B)|M(B)|D(B), Bopb = S(B)|M(B)|D(Pc), Wop2 = S(W)|D(W), Wop = S(W)|M(W)|D(W), Wopb = S(W)|M(W)|D(Pc), Lop2 = S(L)|D(L), Lop = S(L)|M(L)|D(L), Lopb = S(L)|M(L)|D(Pc), Cop2 = Wop2, Cop = Wop, Copb = Wopb, Fop2 = Lop2, Fop = Lop, Fopb = Lopb, Xop = Wop,}; typedef struct Array Array;typedef struct Bits Bits;typedef struct Blist Blist;typedef struct Block Block;typedef struct Idlist Idlist;typedef struct Optab Optab; struct Array{ int n; int m; Block **a;}; struct Bits{ int n; ulong *b;}; struct Blist{ Block *block; Blist *next;}; struct Block{ int dfn; int flags; Inst *first; Inst *last; Block *prev; Block *next; Blist *pred; Blist *succ; Bits kill; Bits gen; Bits in; Bits out;}; struct Idlist{ int id; Idlist *next;}; struct Optab{ short flags; short size;}; Block zblock;Decl *regdecls;Idlist *frelist;Idlist *deflist;Idlist *uselist; static voidaddlist(Idlist **hd, int id){ Idlist *il; if(frelist == nil) il = (Idlist*)malloc(sizeof(Idlist)); else{ il = frelist; frelist = frelist->next; } il->id = id; il->next = *hd; *hd = il;} static voidfreelist(Idlist **hd){ Idlist *il; for(il = *hd; il != nil && il->next != nil; il = il->next) ; if(il != nil){ il->next = frelist; frelist = *hd; *hd = nil; }} Optab opflags[] = { /* INOP */ None, 0, /* IALT */ Unop, S(Mp)|D(W), /* INBALT */ Unop, S(Mp)|D(W), /* IGOTO */ Use2, S(W)|D(I), /* ICALL */ Use2, S(P)|D(Pc), /* IFRAME */ Unop, S(W)|D(P), /* ISPAWN */ Use2, S(P)|D(Pc), /* IRUNT */ None, 0, /* ILOAD */ Threop, S(C)|M(P)|D(P), /* IMCALL */ Use3, S(P)|M(W)|D(P), /* IMSPAWN */ Use3, S(P)|M(W)|D(P), /* IMFRAME */ Threop, S(P)|M(W)|D(P), /* IRET */ None, 0, /* IJMP */ Duse, D(Pc), /* ICASE */ Use2, S(W)|D(I), /* IEXIT */ None, 0, /* INEW */ Unop, S(W)|D(P), /* INEWA */ Threop, S(W)|M(W)|D(P), /* INEWCB */ Cunop, M(W)|D(P), /* INEWCW */ Cunop, M(W)|D(P), /* INEWCF */ Cunop, M(W)|D(P), /* INEWCP */ Cunop, M(W)|D(P), /* INEWCM */ Threop, S(W)|M(W)|D(P), /* INEWCMP */ Threop, S(W)|M(W)|D(P), /* ISEND */ Use2, S(Mp)|D(P), /* IRECV */ Unop, S(P)|D(Mp), /* ICONSB */ Abinop, S(B)|D(P), /* ICONSW */ Abinop, S(W)|D(P), /* ICONSP */ Abinop, S(P)|D(P), /* ICONSF */ Abinop, S(F)|D(P), /* ICONSM */ Mabinop, S(Mp)|M(W)|D(P), /* ICONSMP */ Mabinop, S(Mp)|M(W)|D(P), /* IHEADB */ Unop, S(P)|D(B), /* IHEADW */ Unop, S(P)|D(W), /* IHEADP */ Unop, S(P)|D(P), /* IHEADF */ Unop, S(P)|D(F), /* IHEADM */ Threop, S(P)|M(W)|D(Mp), /* IHEADMP */ Threop, S(P)|M(W)|D(Mp), /* ITAIL */ Unop, S(P)|D(P), /* ILEA */ Ddef, S(Mp)|D(P), /* S done specially cos of ALT */ /* IINDX */ Mbinop, S(P)|M(P)|D(W), /* IMOVP */ Unop, S(P)|D(P), /* IMOVM */ Threop, S(Mp)|M(W)|D(Mp), /* IMOVMP */ Threop, S(Mp)|M(W)|D(Mp), /* IMOVB */ Unop, Bop2, /* IMOVW */ Unop, Wop2, /* IMOVF */ Unop, Fop2, /* ICVTBW */ Unop, S(B)|D(W), /* ICVTWB */ Unop, S(W)|D(B), /* ICVTFW */ Unop, S(F)|D(W), /* ICVTWF */ Unop, S(W)|D(F), /* ICVTCA */ Unop, S(C)|D(A), /* ICVTAC */ Unop, S(A)|D(C), /* ICVTWC */ Unop, S(W)|D(C), /* ICVTCW */ Unop, S(C)|D(W), /* ICVTFC */ Unop, S(F)|D(C), /* ICVTCF */ Unop, S(C)|D(F), /* IADDB */ Binop, Bop, /* IADDW */ Binop, Wop, /* IADDF */ Binop, Fop, /* ISUBB */ Binop, Bop, /* ISUBW */ Binop, Wop, /* ISUBF */ Binop, Fop, /* IMULB */ Binop, Bop, /* IMULW */ Binop, Wop, /* IMULF */ Binop, Fop, /* IDIVB */ Binop, Bop, /* IDIVW */ Binop, Wop, /* IDIVF */ Binop, Fop, /* IMODW */ Binop, Wop, /* IMODB */ Binop, Bop, /* IANDB */ Binop, Bop, /* IANDW */ Binop, Wop, /* IORB */ Binop, Bop, /* IORW */ Binop, Wop, /* IXORB */ Binop, Bop, /* IXORW */ Binop, Wop, /* ISHLB */ Binop, S(W)|M(B)|D(B), /* ISHLW */ Binop, Wop, /* ISHRB */ Binop, S(W)|M(B)|D(B), /* ISHRW */ Binop, Wop, /* IINSC */ Mabinop, S(W)|M(W)|D(C), /* IINDC */ Threop, S(C)|M(W)|D(W), /* IADDC */ Binop, Cop, /* ILENC */ Unop, S(C)|D(W), /* ILENA */ Unop, S(A)|D(W), /* ILENL */ Unop, S(P)|D(W), /* IBEQB */ Use3, Bopb, /* IBNEB */ Use3, Bopb, /* IBLTB */ Use3, Bopb, /* IBLEB */ Use3, Bopb, /* IBGTB */ Use3, Bopb, /* IBGEB */ Use3, Bopb, /* IBEQW */ Use3, Wopb, /* IBNEW */ Use3, Wopb, /* IBLTW */ Use3, Wopb, /* IBLEW */ Use3, Wopb, /* IBGTW */ Use3, Wopb, /* IBGEW */ Use3, Wopb, /* IBEQF */ Use3, Fopb, /* IBNEF */ Use3, Fopb, /* IBLTF */ Use3, Fopb, /* IBLEF */ Use3, Fopb, /* IBGTF */ Use3, Fopb, /* IBGEF */ Use3, Fopb, /* IBEQC */ Use3, Copb, /* IBNEC */ Use3, Copb, /* IBLTC */ Use3, Copb, /* IBLEC */ Use3, Copb, /* IBGTC */ Use3, Copb, /* IBGEC */ Use3, Copb, /* ISLICEA */ Mabinop, S(W)|M(W)|D(P), /* ISLICELA */ Use3, S(P)|M(W)|D(P), /* ISLICEC */ Mabinop, S(W)|M(W)|D(C), /* IINDW */ Mbinop, S(P)|M(P)|D(W), /* IINDF */ Mbinop, S(P)|M(P)|D(W), /* IINDB */ Mbinop, S(P)|M(P)|D(W), /* INEGF */ Unop, Fop2, /* IMOVL */ Unop, Lop2, /* IADDL */ Binop, Lop, /* ISUBL */ Binop, Lop, /* IDIVL */ Binop, Lop, /* IMODL */ Binop, Lop, /* IMULL */ Binop, Lop, /* IANDL */ Binop, Lop, /* IORL */ Binop, Lop, /* IXORL */ Binop, Lop, /* ISHLL */ Binop, S(W)|M(L)|D(L), /* ISHRL */ Binop, S(W)|M(L)|D(L), /* IBNEL */ Use3, Lopb, /* IBLTL */ Use3, Lopb, /* IBLEL */ Use3, Lopb, /* IBGTL */ Use3, Lopb, /* IBGEL */ Use3, Lopb, /* IBEQL */ Use3, Lopb, /* ICVTLF */ Unop, S(L)|D(F), /* ICVTFL */ Unop, S(F)|D(L), /* ICVTLW */ Unop, S(L)|D(W), /* ICVTWL */ Unop, S(W)|D(L), /* ICVTLC */ Unop, S(L)|D(C), /* ICVTCL */ Unop, S(C)|D(L), /* IHEADL */ Unop, S(P)|D(L), /* ICONSL */ Abinop, S(L)|D(P), /* INEWCL */ Cunop, M(W)|D(P), /* ICASEC */ Use2, S(C)|D(I), /* IINDL */ Mbinop, S(P)|M(P)|D(W), /* IMOVPC */ Unop, S(W)|D(P), /* ITCMP */ Use2, S(P)|D(P), /* IMNEWZ */ Threop, S(P)|M(W)|D(P), /* ICVTRF */ Unop, S(R)|D(F), /* ICVTFR */ Unop, S(F)|D(R), /* ICVTWS */ Unop, S(W)|D(Sh), /* ICVTSW */ Unop, S(Sh)|D(W), /* ILSRW */ Binop, Wop, /* ILSRL */ Binop, S(W)|M(L)|D(L), /* IECLR */ None, 0, /* INEWZ */ Unop, S(W)|D(P), /* INEWAZ */ Threop, S(W)|M(W)|D(P), /* IRAISE */ Use1, S(P), /* ICASEL */ Use2, S(L)|D(I), /* IMULX */ Binop|Tuse2, Xop, /* IDIVX */ Binop|Tuse2, Xop, /* ICVTXX */ Threop, Xop, /* IMULX0 */ Binop|Tuse1|Tuse2, Xop, /* IDIVX0 */ Binop|Tuse1|Tuse2, Xop, /* ICVTXX0 */ Threop|Tuse1, Xop, /* IMULX1 */ Binop|Tuse1|Tuse2, Xop, /* IDIVX1 */ Binop|Tuse1|Tuse2, Xop, /* ICVTXX1 */ Threop|Tuse1, Xop, /* ICVTFX */ Threop, S(F)|M(F)|D(X), /* ICVTXF */ Threop, S(X)|M(F)|D(F), /* IEXPW */ Binop, S(W)|M(W)|D(W), /* IEXPL */ Binop, S(W)|M(L)|D(L), /* IEXPF */ Binop, S(W)|M(F)|D(F), /* ISELF */ Ddef, D(P), /* IEXC */ None, 0, /* IEXC0 */ None, 0, /* INOOP */ None, 0,}; /*static intpop(int i){ i = (i & 0x55555555) + ((i>>1) & 0x55555555); i = (i & 0x33333333) + ((i>>2) & 0x33333333); i = (i & 0x0F0F0F0F) + ((i>>4) & 0x0F0F0F0F); i = (i & 0x00FF00FF) + ((i>>8) & 0x00FF00FF); i = (i & 0x0000FFFF) + ((i>>16) & 0x0000FFFF); return i;}*/ static intbitc(uint x){ uint n; n = (x>>1)&0x77777777; x -= n; n = (n>>1)&0x77777777; x -= n; n = (n>>1)&0x77777777; x -= n; x = (x+(x>>4))&0x0f0f0f0f; x *= 0x01010101; return x>>24;} /*static inttop(uint x){ int i; for(i = -1; x; i++) x >>= 1; return i;}*/ static inttopb(uint x){ int i; if(x == 0) return -1; i = 0; if(x&0xffff0000){ i |= 16; x >>= 16; } if(x&0xff00){ i |= 8; x >>= 8; } if(x&0xf0){ i |= 4; x >>= 4; } if(x&0xc){ i |= 2; x >>= 2; } if(x&0x2) i |= 1; return i;} /*static intlowb(uint x){ int i; if(x == 0) return -1; for(i = BLEN; x; i--) x <<= 1; return i;}*/ static intlowb(uint x){ int i; if(x == 0) return -1; i = 0; if((x&0xffff) == 0){ i |= 16; x >>= 16; } if((x&0xff) == 0){ i |= 8; x >>= 8; } if((x&0xf) == 0){ i |= 4; x >>= 4; } if((x&0x3) == 0){ i |= 2; x >>= 2; } return i+1-(x&1);} static voidpbit(int x, int n)Lines 1–500 of 1803. Load more
#include "limbo.h" #define bzero bbzero /* bsd name space pollution */ /* (r, s) := f(); => r, s have def on same pc s = g(); => this def kills previous r def (and s def) solution: r has def pc, s has def pc+1 and next instruction has pc pc+2 */ #define BLEN (8*sizeof(ulong)) #define BSHIFT 5 /* assumes ulong 4 */ #define BMASK (BLEN-1) #define SIGN(n) (1<<(n-1)) #define MSK(n) (SIGN(n)|(SIGN(n)-1)) #define MASK(a, b) (MSK((b)-(a)+1)<<(a)) #define isnilsrc(s) ((s)->start.line == 0 && (s)->stop.line == 0 && (s)->start.pos == 0 && (s)->stop.pos == 0) #define limbovar(d) ((d)->sym->name[0] != '.') #define structure(t) ((t)->kind == Tadt || (t)->kind == Ttuple) enum { Bclr, Band, Bandinv, Bstore, Bandrev, Bnoop, Bxor, Bor, Bnor, Bequiv, Binv, Bimpby, Brev, Bimp, Bnand, Bset, }; enum { Suse = 1, Muse = 2, Duse = 4, Sdef = 8, Mdef = 16, Ddef = 32, Tuse1 = 64, /* fixed point temporary */ Tuse2 = 128, /* fixed point temporary */ Mduse = 256, /* D used if M nil */ None = 0, Unop = Suse|Ddef, Cunop = Muse|Ddef, Threop = Suse|Muse|Ddef, Binop = Suse|Muse|Ddef|Mduse, Mbinop = Suse|Mdef|Duse, /* strange */ Abinop=Suse|Duse|Ddef, Mabinop = Suse|Muse|Duse|Ddef, Use1 = Suse, Use2 = Suse|Duse, Use3 = Suse|Muse|Duse, }; enum { Sshift = 10, Mshift = 5, Dshift = 0, }; #define S(x) ((x)<<Sshift) #define M(x) ((x)<<Mshift) #define D(x) ((x)<<Dshift) #define SS(x) (((x)>>Sshift)&0x1f) #define SM(x) (((x)>>Mshift)&0x1f) #define SD(x) (((x)>>Dshift)&0x1f) enum { I = 0, /* ignore */ B = 1, /* byte */ W = 4, /* int */ P = 4, /* pointer */ A = 4, /* array */ C = 4, /* string */ X = 4, /* fixed */ R = 4, /* float */ L = 8, /* big */ F = 8, /* real */ Sh = 2, /* short */ Pc = 4, /* pc */ Mp = 16, /* memory */ Bop2 = S(B)|D(B), Bop = S(B)|M(B)|D(B), Bopb = S(B)|M(B)|D(Pc), Wop2 = S(W)|D(W), Wop = S(W)|M(W)|D(W), Wopb = S(W)|M(W)|D(Pc), Lop2 = S(L)|D(L), Lop = S(L)|M(L)|D(L), Lopb = S(L)|M(L)|D(Pc), Cop2 = Wop2, Cop = Wop, Copb = Wopb, Fop2 = Lop2, Fop = Lop, Fopb = Lopb, Xop = Wop, }; typedef struct Array Array; typedef struct Bits Bits; typedef struct Blist Blist; typedef struct Block Block; typedef struct Idlist Idlist; typedef struct Optab Optab; struct Array { int n; int m; Block **a; }; struct Bits { int n; ulong *b; }; struct Blist { Block *block; Blist *next; }; struct Block { int dfn; int flags; Inst *first; Inst *last; Block *prev; Block *next; Blist *pred; Blist *succ; Bits kill; Bits gen; Bits in; Bits out; }; struct Idlist { int id; Idlist *next; }; struct Optab { short flags; short size; }; Block zblock; Decl *regdecls; Idlist *frelist; Idlist *deflist; Idlist *uselist; static void addlist(Idlist **hd, int id) { Idlist *il; if(frelist == nil) il = (Idlist*)malloc(sizeof(Idlist)); else{ il = frelist; frelist = frelist->next; } il->id = id; il->next = *hd; *hd = il; } static void freelist(Idlist **hd) { Idlist *il; for(il = *hd; il != nil && il->next != nil; il = il->next) ; if(il != nil){ il->next = frelist; frelist = *hd; *hd = nil; } } Optab opflags[] = { /* INOP */ None, 0, /* IALT */ Unop, S(Mp)|D(W), /* INBALT */ Unop, S(Mp)|D(W), /* IGOTO */ Use2, S(W)|D(I), /* ICALL */ Use2, S(P)|D(Pc), /* IFRAME */ Unop, S(W)|D(P), /* ISPAWN */ Use2, S(P)|D(Pc), /* IRUNT */ None, 0, /* ILOAD */ Threop, S(C)|M(P)|D(P), /* IMCALL */ Use3, S(P)|M(W)|D(P), /* IMSPAWN */ Use3, S(P)|M(W)|D(P), /* IMFRAME */ Threop, S(P)|M(W)|D(P), /* IRET */ None, 0, /* IJMP */ Duse, D(Pc), /* ICASE */ Use2, S(W)|D(I), /* IEXIT */ None, 0, /* INEW */ Unop, S(W)|D(P), /* INEWA */ Threop, S(W)|M(W)|D(P), /* INEWCB */ Cunop, M(W)|D(P), /* INEWCW */ Cunop, M(W)|D(P), /* INEWCF */ Cunop, M(W)|D(P), /* INEWCP */ Cunop, M(W)|D(P), /* INEWCM */ Threop, S(W)|M(W)|D(P), /* INEWCMP */ Threop, S(W)|M(W)|D(P), /* ISEND */ Use2, S(Mp)|D(P), /* IRECV */ Unop, S(P)|D(Mp), /* ICONSB */ Abinop, S(B)|D(P), /* ICONSW */ Abinop, S(W)|D(P), /* ICONSP */ Abinop, S(P)|D(P), /* ICONSF */ Abinop, S(F)|D(P), /* ICONSM */ Mabinop, S(Mp)|M(W)|D(P), /* ICONSMP */ Mabinop, S(Mp)|M(W)|D(P), /* IHEADB */ Unop, S(P)|D(B), /* IHEADW */ Unop, S(P)|D(W), /* IHEADP */ Unop, S(P)|D(P), /* IHEADF */ Unop, S(P)|D(F), /* IHEADM */ Threop, S(P)|M(W)|D(Mp), /* IHEADMP */ Threop, S(P)|M(W)|D(Mp), /* ITAIL */ Unop, S(P)|D(P), /* ILEA */ Ddef, S(Mp)|D(P), /* S done specially cos of ALT */ /* IINDX */ Mbinop, S(P)|M(P)|D(W), /* IMOVP */ Unop, S(P)|D(P), /* IMOVM */ Threop, S(Mp)|M(W)|D(Mp), /* IMOVMP */ Threop, S(Mp)|M(W)|D(Mp), /* IMOVB */ Unop, Bop2, /* IMOVW */ Unop, Wop2, /* IMOVF */ Unop, Fop2, /* ICVTBW */ Unop, S(B)|D(W), /* ICVTWB */ Unop, S(W)|D(B), /* ICVTFW */ Unop, S(F)|D(W), /* ICVTWF */ Unop, S(W)|D(F), /* ICVTCA */ Unop, S(C)|D(A), /* ICVTAC */ Unop, S(A)|D(C), /* ICVTWC */ Unop, S(W)|D(C), /* ICVTCW */ Unop, S(C)|D(W), /* ICVTFC */ Unop, S(F)|D(C), /* ICVTCF */ Unop, S(C)|D(F), /* IADDB */ Binop, Bop, /* IADDW */ Binop, Wop, /* IADDF */ Binop, Fop, /* ISUBB */ Binop, Bop, /* ISUBW */ Binop, Wop, /* ISUBF */ Binop, Fop, /* IMULB */ Binop, Bop, /* IMULW */ Binop, Wop, /* IMULF */ Binop, Fop, /* IDIVB */ Binop, Bop, /* IDIVW */ Binop, Wop, /* IDIVF */ Binop, Fop, /* IMODW */ Binop, Wop, /* IMODB */ Binop, Bop, /* IANDB */ Binop, Bop, /* IANDW */ Binop, Wop, /* IORB */ Binop, Bop, /* IORW */ Binop, Wop, /* IXORB */ Binop, Bop, /* IXORW */ Binop, Wop, /* ISHLB */ Binop, S(W)|M(B)|D(B), /* ISHLW */ Binop, Wop, /* ISHRB */ Binop, S(W)|M(B)|D(B), /* ISHRW */ Binop, Wop, /* IINSC */ Mabinop, S(W)|M(W)|D(C), /* IINDC */ Threop, S(C)|M(W)|D(W), /* IADDC */ Binop, Cop, /* ILENC */ Unop, S(C)|D(W), /* ILENA */ Unop, S(A)|D(W), /* ILENL */ Unop, S(P)|D(W), /* IBEQB */ Use3, Bopb, /* IBNEB */ Use3, Bopb, /* IBLTB */ Use3, Bopb, /* IBLEB */ Use3, Bopb, /* IBGTB */ Use3, Bopb, /* IBGEB */ Use3, Bopb, /* IBEQW */ Use3, Wopb, /* IBNEW */ Use3, Wopb, /* IBLTW */ Use3, Wopb, /* IBLEW */ Use3, Wopb, /* IBGTW */ Use3, Wopb, /* IBGEW */ Use3, Wopb, /* IBEQF */ Use3, Fopb, /* IBNEF */ Use3, Fopb, /* IBLTF */ Use3, Fopb, /* IBLEF */ Use3, Fopb, /* IBGTF */ Use3, Fopb, /* IBGEF */ Use3, Fopb, /* IBEQC */ Use3, Copb, /* IBNEC */ Use3, Copb, /* IBLTC */ Use3, Copb, /* IBLEC */ Use3, Copb, /* IBGTC */ Use3, Copb, /* IBGEC */ Use3, Copb, /* ISLICEA */ Mabinop, S(W)|M(W)|D(P), /* ISLICELA */ Use3, S(P)|M(W)|D(P), /* ISLICEC */ Mabinop, S(W)|M(W)|D(C), /* IINDW */ Mbinop, S(P)|M(P)|D(W), /* IINDF */ Mbinop, S(P)|M(P)|D(W), /* IINDB */ Mbinop, S(P)|M(P)|D(W), /* INEGF */ Unop, Fop2, /* IMOVL */ Unop, Lop2, /* IADDL */ Binop, Lop, /* ISUBL */ Binop, Lop, /* IDIVL */ Binop, Lop, /* IMODL */ Binop, Lop, /* IMULL */ Binop, Lop, /* IANDL */ Binop, Lop, /* IORL */ Binop, Lop, /* IXORL */ Binop, Lop, /* ISHLL */ Binop, S(W)|M(L)|D(L), /* ISHRL */ Binop, S(W)|M(L)|D(L), /* IBNEL */ Use3, Lopb, /* IBLTL */ Use3, Lopb, /* IBLEL */ Use3, Lopb, /* IBGTL */ Use3, Lopb, /* IBGEL */ Use3, Lopb, /* IBEQL */ Use3, Lopb, /* ICVTLF */ Unop, S(L)|D(F), /* ICVTFL */ Unop, S(F)|D(L), /* ICVTLW */ Unop, S(L)|D(W), /* ICVTWL */ Unop, S(W)|D(L), /* ICVTLC */ Unop, S(L)|D(C), /* ICVTCL */ Unop, S(C)|D(L), /* IHEADL */ Unop, S(P)|D(L), /* ICONSL */ Abinop, S(L)|D(P), /* INEWCL */ Cunop, M(W)|D(P), /* ICASEC */ Use2, S(C)|D(I), /* IINDL */ Mbinop, S(P)|M(P)|D(W), /* IMOVPC */ Unop, S(W)|D(P), /* ITCMP */ Use2, S(P)|D(P), /* IMNEWZ */ Threop, S(P)|M(W)|D(P), /* ICVTRF */ Unop, S(R)|D(F), /* ICVTFR */ Unop, S(F)|D(R), /* ICVTWS */ Unop, S(W)|D(Sh), /* ICVTSW */ Unop, S(Sh)|D(W), /* ILSRW */ Binop, Wop, /* ILSRL */ Binop, S(W)|M(L)|D(L), /* IECLR */ None, 0, /* INEWZ */ Unop, S(W)|D(P), /* INEWAZ */ Threop, S(W)|M(W)|D(P), /* IRAISE */ Use1, S(P), /* ICASEL */ Use2, S(L)|D(I), /* IMULX */ Binop|Tuse2, Xop, /* IDIVX */ Binop|Tuse2, Xop, /* ICVTXX */ Threop, Xop, /* IMULX0 */ Binop|Tuse1|Tuse2, Xop, /* IDIVX0 */ Binop|Tuse1|Tuse2, Xop, /* ICVTXX0 */ Threop|Tuse1, Xop, /* IMULX1 */ Binop|Tuse1|Tuse2, Xop, /* IDIVX1 */ Binop|Tuse1|Tuse2, Xop, /* ICVTXX1 */ Threop|Tuse1, Xop, /* ICVTFX */ Threop, S(F)|M(F)|D(X), /* ICVTXF */ Threop, S(X)|M(F)|D(F), /* IEXPW */ Binop, S(W)|M(W)|D(W), /* IEXPL */ Binop, S(W)|M(L)|D(L), /* IEXPF */ Binop, S(W)|M(F)|D(F), /* ISELF */ Ddef, D(P), /* IEXC */ None, 0, /* IEXC0 */ None, 0, /* INOOP */ None, 0, }; /* static int pop(int i) { i = (i & 0x55555555) + ((i>>1) & 0x55555555); i = (i & 0x33333333) + ((i>>2) & 0x33333333); i = (i & 0x0F0F0F0F) + ((i>>4) & 0x0F0F0F0F); i = (i & 0x00FF00FF) + ((i>>8) & 0x00FF00FF); i = (i & 0x0000FFFF) + ((i>>16) & 0x0000FFFF); return i; } */ static int bitc(uint x) { uint n; n = (x>>1)&0x77777777; x -= n; n = (n>>1)&0x77777777; x -= n; n = (n>>1)&0x77777777; x -= n; x = (x+(x>>4))&0x0f0f0f0f; x *= 0x01010101; return x>>24; } /* static int top(uint x) { int i; for(i = -1; x; i++) x >>= 1; return i; } */ static int topb(uint x) { int i; if(x == 0) return -1; i = 0; if(x&0xffff0000){ i |= 16; x >>= 16; } if(x&0xff00){ i |= 8; x >>= 8; } if(x&0xf0){ i |= 4; x >>= 4; } if(x&0xc){ i |= 2; x >>= 2; } if(x&0x2) i |= 1; return i; } /* static int lowb(uint x) { int i; if(x == 0) return -1; for(i = BLEN; x; i--) x <<= 1; return i; } */ static int lowb(uint x) { int i; if(x == 0) return -1; i = 0; if((x&0xffff) == 0){ i |= 16; x >>= 16; } if((x&0xff) == 0){ i |= 8; x >>= 8; } if((x&0xf) == 0){ i |= 4; x >>= 4; } if((x&0x3) == 0){ i |= 2; x >>= 2; } return i+1-(x&1); } static void pbit(int x, int n)