Charles.Forsyth20090616-2317ec9995a17 years agoHistory
1288 lines · 28.2 KB · C
RawDownload
#define	EXTERN#include "a.h"#include "y.tab.h"#include <ctype.h> voidmain(int argc, char *argv[]){	char *p;	int nout, nproc, status, i, c; 	thechar = '6';	thestring = "amd64";	memset(debug, 0, sizeof(debug));	cinit();	outfile = 0;	include[ninclude++] = ".";	ARGBEGIN {	default:		c = ARGC();		if(c >= 0 || c < sizeof(debug))			debug[c] = 1;		break; 	case 'o':		outfile = ARGF();		break; 	case 'D':		p = ARGF();		if(p)			Dlist[nDlist++] = p;		break; 	case 'I':		p = ARGF();		setinclude(p);		break;	} ARGEND	if(*argv == 0) {		print("usage: %ca [-options] file.s\n", thechar);		errorexit();	}	if(argc > 1 && systemtype(Windows)){		print("can't assemble multiple files on windows\n");		errorexit();	}	if(argc > 1 && !systemtype(Windows)) {		nproc = 1;		if(p = getenv("NPROC"))			nproc = atol(p);	/* */		c = 0;		nout = 0;		for(;;) {			while(nout < nproc && argc > 0) {				i = myfork();				if(i < 0) {					i = mywait(&status);					if(i < 0)						errorexit();					if(status)						c++;					nout--;					continue;				}				if(i == 0) {					print("%s:\n", *argv);					if(assemble(*argv))						errorexit();					exits(0);				}				nout++;				argc--;				argv++;			}			i = mywait(&status);			if(i < 0) {				if(c)					errorexit();				exits(0);			}			if(status)				c++;			nout--;		}	}	if(assemble(argv[0]))		errorexit();	exits(0);} intassemble(char *file){	char ofile[100], incfile[20], *p;	int i, of; 	strcpy(ofile, file);	p = utfrrune(ofile, pathchar());	if(p) {		include[0] = ofile;		*p++ = 0;	} else		p = ofile;	if(outfile == 0) {		outfile = p;		if(outfile){			p = utfrrune(outfile, '.');			if(p)				if(p[1] == 's' && p[2] == 0)					p[0] = 0;			p = utfrune(outfile, 0);			p[0] = '.';			p[1] = thechar;			p[2] = 0;		} else			outfile = "/dev/null";	}	p = getenv("INCLUDE");	if(p) {		setinclude(p);	} else {		if(systemtype(Plan9)) {			sprint(incfile,"/%s/include", thestring);			setinclude(strdup(incfile));		}	} 	of = mycreat(outfile, 0664);	if(of < 0) {		yyerror("%ca: cannot create %s", thechar, outfile);		errorexit();	}	Binit(&obuf, of, OWRITE); 	pass = 1;	pinit(file);	for(i=0; i<nDlist; i++)		dodefine(Dlist[i]);	yyparse();	if(nerrors) {		cclean();		return nerrors;	} 	pass = 2;	outhist();	pinit(file);	for(i=0; i<nDlist; i++)		dodefine(Dlist[i]);	yyparse();	cclean();	return nerrors;} struct{	char	*name;	ushort	type;	ushort	value;} itab[] ={	"SP",		LSP,	D_AUTO,	"SB",		LSB,	D_EXTERN,	"FP",		LFP,	D_PARAM,	"PC",		LPC,	D_BRANCH, 	"AL",		LBREG,	D_AL,	"CL",		LBREG,	D_CL,	"DL",		LBREG,	D_DL,	"BL",		LBREG,	D_BL,/*	"SPB",		LBREG,	D_SPB,	*/	"SIB",		LBREG,	D_SIB,	"DIB",		LBREG,	D_DIB,	"BPB",		LBREG,	D_BPB,	"R8B",		LBREG,	D_R8B,	"R9B",		LBREG,	D_R9B,	"R10B",		LBREG,	D_R10B,	"R11B",		LBREG,	D_R11B,	"R12B",		LBREG,	D_R12B,	"R13B",		LBREG,	D_R13B,	"R14B",		LBREG,	D_R14B,	"R15B",		LBREG,	D_R15B, 	"AH",		LBREG,	D_AH,	"CH",		LBREG,	D_CH,	"DH",		LBREG,	D_DH,	"BH",		LBREG,	D_BH, 	"AX",		LLREG,	D_AX,	"CX",		LLREG,	D_CX,	"DX",		LLREG,	D_DX,	"BX",		LLREG,	D_BX,/*	"SP",		LLREG,	D_SP,	*/	"BP",		LLREG,	D_BP,	"SI",		LLREG,	D_SI,	"DI",		LLREG,	D_DI,	"R8",		LLREG,	D_R8,	"R9",		LLREG,	D_R9,	"R10",		LLREG,	D_R10,	"R11",		LLREG,	D_R11,	"R12",		LLREG,	D_R12,	"R13",		LLREG,	D_R13,	"R14",		LLREG,	D_R14,	"R15",		LLREG,	D_R15, 	"RARG",		LLREG,	REGARG, 	"F0",		LFREG,	D_F0+0,	"F1",		LFREG,	D_F0+1,	"F2",		LFREG,	D_F0+2,	"F3",		LFREG,	D_F0+3,	"F4",		LFREG,	D_F0+4,	"F5",		LFREG,	D_F0+5,	"F6",		LFREG,	D_F0+6,	"F7",		LFREG,	D_F0+7, 	"M0",		LMREG,	D_M0+0,	"M1",		LMREG,	D_M0+1,	"M2",		LMREG,	D_M0+2,	"M3",		LMREG,	D_M0+3,	"M4",		LMREG,	D_M0+4,	"M5",		LMREG,	D_M0+5,	"M6",		LMREG,	D_M0+6,	"M7",		LMREG,	D_M0+7, 	"X0",		LXREG,	D_X0+0,	"X1",		LXREG,	D_X0+1,	"X2",		LXREG,	D_X0+2,	"X3",		LXREG,	D_X0+3,	"X4",		LXREG,	D_X0+4,	"X5",		LXREG,	D_X0+5,	"X6",		LXREG,	D_X0+6,	"X7",		LXREG,	D_X0+7,	"X8",		LXREG,	D_X0+8,	"X9",		LXREG,	D_X0+9,	"X10",		LXREG,	D_X0+10,	"X11",		LXREG,	D_X0+11,	"X12",		LXREG,	D_X0+12,	"X13",		LXREG,	D_X0+13,	"X14",		LXREG,	D_X0+14,	"X15",		LXREG,	D_X0+15, 	"CS",		LSREG,	D_CS,	"SS",		LSREG,	D_SS,	"DS",		LSREG,	D_DS,	"ES",		LSREG,	D_ES,	"FS",		LSREG,	D_FS,	"GS",		LSREG,	D_GS, 	"GDTR",		LBREG,	D_GDTR,	"IDTR",		LBREG,	D_IDTR,	"LDTR",		LBREG,	D_LDTR,	"MSW",		LBREG,	D_MSW,	"TASK",		LBREG,	D_TASK, 	"CR0",		LBREG,	D_CR+0,	"CR1",		LBREG,	D_CR+1,	"CR2",		LBREG,	D_CR+2,	"CR3",		LBREG,	D_CR+3,	"CR4",		LBREG,	D_CR+4,	"CR5",		LBREG,	D_CR+5,	"CR6",		LBREG,	D_CR+6,	"CR7",		LBREG,	D_CR+7,	"CR8",		LBREG,	D_CR+8,	"CR9",		LBREG,	D_CR+9,	"CR10",		LBREG,	D_CR+10,	"CR11",		LBREG,	D_CR+11,	"CR12",		LBREG,	D_CR+12,	"CR13",		LBREG,	D_CR+13,	"CR14",		LBREG,	D_CR+14,	"CR15",		LBREG,	D_CR+15, 	"DR0",		LBREG,	D_DR+0,	"DR1",		LBREG,	D_DR+1,	"DR2",		LBREG,	D_DR+2,	"DR3",		LBREG,	D_DR+3,	"DR4",		LBREG,	D_DR+4,	"DR5",		LBREG,	D_DR+5,	"DR6",		LBREG,	D_DR+6,	"DR7",		LBREG,	D_DR+7, 	"TR0",		LBREG,	D_TR+0,	"TR1",		LBREG,	D_TR+1,	"TR2",		LBREG,	D_TR+2,	"TR3",		LBREG,	D_TR+3,	"TR4",		LBREG,	D_TR+4,	"TR5",		LBREG,	D_TR+5,	"TR6",		LBREG,	D_TR+6,	"TR7",		LBREG,	D_TR+7, 	"AAA",		LTYPE0,	AAAA,	"AAD",		LTYPE0,	AAAD,	"AAM",		LTYPE0,	AAAM,	"AAS",		LTYPE0,	AAAS,	"ADCB",		LTYPE3,	AADCB,	"ADCL",		LTYPE3,	AADCL,	"ADCQ",		LTYPE3,	AADCQ,	"ADCW",		LTYPE3,	AADCW,	"ADDB",		LTYPE3,	AADDB,	"ADDL",		LTYPE3,	AADDL,	"ADDQ",		LTYPE3,	AADDQ,	"ADDW",		LTYPE3,	AADDW,	"ADJSP",	LTYPE2,	AADJSP,	"ANDB",		LTYPE3,	AANDB,	"ANDL",		LTYPE3,	AANDL,	"ANDQ",		LTYPE3,	AANDQ,	"ANDW",		LTYPE3,	AANDW,	"ARPL",		LTYPE3,	AARPL,	"BOUNDL",	LTYPE3,	ABOUNDL,	"BOUNDW",	LTYPE3,	ABOUNDW,	"BSFL",		LTYPE3,	ABSFL,	"BSFQ",		LTYPE3,	ABSFQ,	"BSFW",		LTYPE3,	ABSFW,	"BSRL",		LTYPE3,	ABSRL,	"BSRQ",		LTYPE3,	ABSRQ,	"BSRW",		LTYPE3,	ABSRW,	"BTCL",		LTYPE3,	ABTCL,	"BTCQ",		LTYPE3,	ABTCQ,	"BTCW",		LTYPE3,	ABTCW,	"BTL",		LTYPE3,	ABTL,	"BTQ",		LTYPE3,	ABTQ,	"BTRL",		LTYPE3,	ABTRL,	"BTRQ",		LTYPE3,	ABTRQ,	"BTRW",		LTYPE3,	ABTRW,	"BTSL",		LTYPE3,	ABTSL,	"BTSQ",		LTYPE3,	ABTSQ,	"BTSW",		LTYPE3,	ABTSW,	"BTW",		LTYPE3,	ABTW,	"BYTE",		LTYPE2,	ABYTE,	"CALL",		LTYPEC,	ACALL,	"CLC",		LTYPE0,	ACLC,	"CLD",		LTYPE0,	ACLD,	"CLI",		LTYPE0,	ACLI,	"CLTS",		LTYPE0,	ACLTS,	"CMC",		LTYPE0,	ACMC,	"CMPB",		LTYPE4,	ACMPB,	"CMPL",		LTYPE4,	ACMPL,	"CMPQ",		LTYPE4,	ACMPQ,	"CMPW",		LTYPE4,	ACMPW,	"CMPSB",	LTYPE0,	ACMPSB,	"CMPSL",	LTYPE0,	ACMPSL,	"CMPSQ",	LTYPE0,	ACMPSQ,	"CMPSW",	LTYPE0,	ACMPSW,	"CMPXCHG8B",	LTYPE1,	ACMPXCHG8B,	"CMPXCHGB",	LTYPE3,	ACMPXCHGB,	/* LTYPE3? */	"CMPXCHGL",	LTYPE3,	ACMPXCHGL,	"CMPXCHGQ",	LTYPE3,	ACMPXCHGQ,	"CMPXCHGW",	LTYPE3,	ACMPXCHGW,	"CPUID",	LTYPE0,	ACPUID,	"DAA",		LTYPE0,	ADAA,	"DAS",		LTYPE0,	ADAS,	"DATA",		LTYPED,	ADATA,	"DECB",		LTYPE1,	ADECB,	"DECL",		LTYPE1,	ADECL,	"DECQ",		LTYPE1,	ADECQ,	"DECW",		LTYPE1,	ADECW,	"DIVB",		LTYPE2,	ADIVB,	"DIVL",		LTYPE2,	ADIVL,	"DIVQ",		LTYPE2,	ADIVQ,	"DIVW",		LTYPE2,	ADIVW,	"EMMS",		LTYPE0,	AEMMS,	"END",		LTYPE0,	AEND,	"ENTER",	LTYPE2,	AENTER,	"GLOBL",	LTYPET,	AGLOBL,	"HLT",		LTYPE0,	AHLT,	"IDIVB",	LTYPE2,	AIDIVB,	"IDIVL",	LTYPE2,	AIDIVL,	"IDIVQ",	LTYPE2,	AIDIVQ,	"IDIVW",	LTYPE2,	AIDIVW,	"IMULB",	LTYPEI,	AIMULB,	"IMULL",	LTYPEI,	AIMULL,	"IMULQ",	LTYPEI,	AIMULQ,	"IMULW",	LTYPEI,	AIMULW,	"INB",		LTYPE0,	AINB,	"INL",		LTYPE0,	AINL,	"INW",		LTYPE0,	AINW,	"INCB",		LTYPE1,	AINCB,	"INCL",		LTYPE1,	AINCL,	"INCQ",		LTYPE1,	AINCQ,	"INCW",		LTYPE1,	AINCW,	"INSB",		LTYPE0,	AINSB,	"INSL",		LTYPE0,	AINSL,	"INSW",		LTYPE0,	AINSW,	"INT",		LTYPE2,	AINT,	"INTO",		LTYPE0,	AINTO,	"INVD",		LTYPE0,	AINVD,	"INVLPG",	LTYPE2,	AINVLPG,	"IRETL",	LTYPE0,	AIRETL,	"IRETQ",	LTYPE0,	AIRETQ,	"IRETW",	LTYPE0,	AIRETW, 	"JOS",		LTYPER,	AJOS,	"JO",		LTYPER,	AJOS,	/* alternate */	"JOC",		LTYPER,	AJOC,	"JNO",		LTYPER,	AJOC,	/* alternate */	"JCS",		LTYPER,	AJCS,	"JB",		LTYPER,	AJCS,	/* alternate */	"JC",		LTYPER,	AJCS,	/* alternate */	"JNAE",		LTYPER,	AJCS,	/* alternate */	"JLO",		LTYPER,	AJCS,	/* alternate */	"JCC",		LTYPER,	AJCC,	"JAE",		LTYPER,	AJCC,	/* alternate */	"JNB",		LTYPER,	AJCC,	/* alternate */	"JNC",		LTYPER,	AJCC,	/* alternate */	"JHS",		LTYPER,	AJCC,	/* alternate */	"JEQ",		LTYPER,	AJEQ,	"JE",		LTYPER,	AJEQ,	/* alternate */	"JZ",		LTYPER,	AJEQ,	/* alternate */	"JNE",		LTYPER,	AJNE,	"JNZ",		LTYPER,	AJNE,	/* alternate */	"JLS",		LTYPER,	AJLS,	"JBE",		LTYPER,	AJLS,	/* alternate */	"JNA",		LTYPER,	AJLS,	/* alternate */	"JHI",		LTYPER,	AJHI,	"JA",		LTYPER,	AJHI,	/* alternate */	"JNBE",		LTYPER,	AJHI,	/* alternate */	"JMI",		LTYPER,	AJMI,	"JS",		LTYPER,	AJMI,	/* alternate */	"JPL",		LTYPER,	AJPL,	"JNS",		LTYPER,	AJPL,	/* alternate */	"JPS",		LTYPER,	AJPS,	"JP",		LTYPER,	AJPS,	/* alternate */	"JPE",		LTYPER,	AJPS,	/* alternate */	"JPC",		LTYPER,	AJPC,	"JNP",		LTYPER,	AJPC,	/* alternate */	"JPO",		LTYPER,	AJPC,	/* alternate */	"JLT",		LTYPER,	AJLT,	"JL",		LTYPER,	AJLT,	/* alternate */	"JNGE",		LTYPER,	AJLT,	/* alternate */	"JGE",		LTYPER,	AJGE,	"JNL",		LTYPER,	AJGE,	/* alternate */	"JLE",		LTYPER,	AJLE,	"JNG",		LTYPER,	AJLE,	/* alternate */	"JGT",		LTYPER,	AJGT,	"JG",		LTYPER,	AJGT,	/* alternate */	"JNLE",		LTYPER,	AJGT,	/* alternate */ 	"JCXZ",		LTYPER,	AJCXZ,	"JMP",		LTYPEC,	AJMP,	"LAHF",		LTYPE0,	ALAHF,	"LARL",		LTYPE3,	ALARL,	"LARW",		LTYPE3,	ALARW,	"LEAL",		LTYPE3,	ALEAL,	"LEAQ",		LTYPE3,	ALEAQ,	"LEAW",		LTYPE3,	ALEAW,	"LEAVEL",	LTYPE0,	ALEAVEL,	"LEAVEQ",	LTYPE0,	ALEAVEQ,	"LEAVEW",	LTYPE0,	ALEAVEW,	"LFENCE",	LTYPE0,	ALFENCE,	"LOCK",		LTYPE0,	ALOCK,	"LODSB",	LTYPE0,	ALODSB,	"LODSL",	LTYPE0,	ALODSL,	"LODSQ",	LTYPE0,	ALODSQ,	"LODSW",	LTYPE0,	ALODSW,	"LONG",		LTYPE2,	ALONG,	"LOOP",		LTYPER,	ALOOP,	"LOOPEQ",	LTYPER,	ALOOPEQ,	"LOOPNE",	LTYPER,	ALOOPNE,	"LSLL",		LTYPE3,	ALSLL,	"LSLW",		LTYPE3,	ALSLW,	"MFENCE",	LTYPE0,	AMFENCE,	"MODE",		LTYPE2,	AMODE,	"MOVB",		LTYPE3,	AMOVB,	"MOVL",		LTYPEM,	AMOVL,	"MOVQ",		LTYPEM,	AMOVQ,	"MOVW",		LTYPEM,	AMOVW,	"MOVBLSX",	LTYPE3, AMOVBLSX,	"MOVBLZX",	LTYPE3, AMOVBLZX,	"MOVBQSX",	LTYPE3,	AMOVBQSX,	"MOVBQZX",	LTYPE3,	AMOVBQZX,	"MOVBWSX",	LTYPE3, AMOVBWSX,	"MOVBWZX",	LTYPE3, AMOVBWZX,	"MOVLQSX",	LTYPE3, AMOVLQSX,	"MOVLQZX",	LTYPE3, AMOVLQZX,	"MOVNTIL",	LTYPE3,	AMOVNTIL,	"MOVNTIQ",	LTYPE3,	AMOVNTIQ,	"MOVWLSX",	LTYPE3, AMOVWLSX,	"MOVWLZX",	LTYPE3, AMOVWLZX,	"MOVWQSX",	LTYPE3,	AMOVWQSX,	"MOVWQZX",	LTYPE3,	AMOVWQZX,	"MOVSB",	LTYPE0,	AMOVSB,	"MOVSL",	LTYPE0,	AMOVSL,	"MOVSQ",	LTYPE0,	AMOVSQ,	"MOVSW",	LTYPE0,	AMOVSW,	"MULB",		LTYPE2,	AMULB,	"MULL",		LTYPE2,	AMULL,	"MULQ",		LTYPE2,	AMULQ,	"MULW",		LTYPE2,	AMULW,	"NEGB",		LTYPE1,	ANEGB,	"NEGL",		LTYPE1,	ANEGL,	"NEGQ",		LTYPE1,	ANEGQ,	"NEGW",		LTYPE1,	ANEGW,	"NOP",		LTYPEN,	ANOP,	"NOTB",		LTYPE1,	ANOTB,	"NOTL",		LTYPE1,	ANOTL,	"NOTQ",		LTYPE1,	ANOTQ,	"NOTW",		LTYPE1,	ANOTW,	"ORB",		LTYPE3,	AORB,	"ORL",		LTYPE3,	AORL,

Lines 1–500 of 1288.