forsyth20121205-174063a80cc13 years agoHistory
1803 lines · 30.4 KB · C
RawDownload
#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.