github.com/ader1990/go@v0.0.0-20140630135419-8c24447fa791/src/cmd/8a/lex.c (about)

     1  // Inferno utils/8a/lex.c
     2  // http://code.google.com/p/inferno-os/source/browse/utils/8a/lex.c
     3  //
     4  //	Copyright © 1994-1999 Lucent Technologies Inc.	All rights reserved.
     5  //	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
     6  //	Portions Copyright © 1997-1999 Vita Nuova Limited
     7  //	Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
     8  //	Portions Copyright © 2004,2006 Bruce Ellis
     9  //	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
    10  //	Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
    11  //	Portions Copyright © 2009 The Go Authors.  All rights reserved.
    12  //
    13  // Permission is hereby granted, free of charge, to any person obtaining a copy
    14  // of this software and associated documentation files (the "Software"), to deal
    15  // in the Software without restriction, including without limitation the rights
    16  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    17  // copies of the Software, and to permit persons to whom the Software is
    18  // furnished to do so, subject to the following conditions:
    19  //
    20  // The above copyright notice and this permission notice shall be included in
    21  // all copies or substantial portions of the Software.
    22  //
    23  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    24  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    25  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
    26  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    27  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    28  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    29  // THE SOFTWARE.
    30  
    31  #define	EXTERN
    32  #include <u.h>
    33  #include <libc.h>
    34  #include "a.h"
    35  #include "y.tab.h"
    36  
    37  enum
    38  {
    39  	Plan9	= 1<<0,
    40  	Unix	= 1<<1,
    41  	Windows	= 1<<2,
    42  };
    43  
    44  int
    45  systemtype(int sys)
    46  {
    47  #ifdef _WIN32
    48  	return sys&Windows;
    49  #else
    50  	return sys&Plan9;
    51  #endif
    52  }
    53  
    54  int
    55  pathchar(void)
    56  {
    57  	return '/';
    58  }
    59  
    60  int
    61  Lconv(Fmt *fp)
    62  {
    63  	return linklinefmt(ctxt, fp);
    64  }
    65  
    66  void
    67  dodef(char *p)
    68  {
    69  	if(nDlist%8 == 0)
    70  		Dlist = allocn(Dlist, nDlist*sizeof(char *),
    71  			8*sizeof(char *));
    72  	Dlist[nDlist++] = p;
    73  }
    74  
    75  void
    76  usage(void)
    77  {
    78  	print("usage: %ca [options] file.c...\n", thechar);
    79  	flagprint(1);
    80  	errorexit();
    81  }
    82  void
    83  main(int argc, char *argv[])
    84  {
    85  	char *p;
    86  
    87  	thechar = '8';
    88  	thestring = "386";
    89  
    90  	ctxt = linknew(&link386);
    91  	ctxt->diag = yyerror;
    92  	ctxt->bso = &bstdout;
    93  	Binit(&bstdout, 1, OWRITE);
    94  	listinit8();
    95  	fmtinstall('L', Lconv);
    96  
    97  	// Allow GOARCH=thestring or GOARCH=thestringsuffix,
    98  	// but not other values.	
    99  	p = getgoarch();
   100  	if(strncmp(p, thestring, strlen(thestring)) != 0)
   101  		sysfatal("cannot use %cc with GOARCH=%s", thechar, p);
   102  
   103  	ensuresymb(NSYMB);
   104  	memset(debug, 0, sizeof(debug));
   105  	cinit();
   106  	outfile = 0;
   107  	setinclude(".");
   108  	
   109  	flagfn1("D", "name[=value]: add #define", dodef);
   110  	flagfn1("I", "dir: add dir to include path", setinclude);
   111  	flagcount("S", "print assembly and machine code", &debug['S']);
   112  	flagcount("m", "debug preprocessor macros", &debug['m']);
   113  	flagstr("o", "file: set output file", &outfile);
   114  	flagstr("trimpath", "prefix: remove prefix from recorded source file paths", &ctxt->trimpath);
   115  
   116  	flagparse(&argc, &argv, usage);
   117  	ctxt->debugasm = debug['S'];
   118  
   119  	if(argc < 1)
   120  		usage();
   121  	if(argc > 1){
   122  		print("can't assemble multiple files\n");
   123  		errorexit();
   124  	}
   125  
   126  	if(assemble(argv[0]))
   127  		errorexit();
   128  	Bflush(&bstdout);
   129  	exits(0);
   130  }
   131  
   132  int
   133  assemble(char *file)
   134  {
   135  	char *ofile, *p;
   136  	int i, of;
   137  
   138  	ofile = alloc(strlen(file)+3); // +3 for .x\0 (x=thechar)
   139  	strcpy(ofile, file);
   140  	p = utfrrune(ofile, pathchar());
   141  	if(p) {
   142  		include[0] = ofile;
   143  		*p++ = 0;
   144  	} else
   145  		p = ofile;
   146  	if(outfile == 0) {
   147  		outfile = p;
   148  		if(outfile){
   149  			p = utfrrune(outfile, '.');
   150  			if(p)
   151  				if(p[1] == 's' && p[2] == 0)
   152  					p[0] = 0;
   153  			p = utfrune(outfile, 0);
   154  			p[0] = '.';
   155  			p[1] = thechar;
   156  			p[2] = 0;
   157  		} else
   158  			outfile = "/dev/null";
   159  	}
   160  
   161  	of = create(outfile, OWRITE, 0664);
   162  	if(of < 0) {
   163  		yyerror("%ca: cannot create %s", thechar, outfile);
   164  		errorexit();
   165  	}
   166  	Binit(&obuf, of, OWRITE);
   167  	Bprint(&obuf, "go object %s %s %s\n", getgoos(), getgoarch(), getgoversion());
   168  	Bprint(&obuf, "!\n");
   169  
   170  	for(pass = 1; pass <= 2; pass++) {
   171  		pinit(file);
   172  		for(i=0; i<nDlist; i++)
   173  			dodefine(Dlist[i]);
   174  		yyparse();
   175  		cclean();
   176  		if(nerrors)
   177  			return nerrors;
   178  	}
   179  
   180  	writeobj(ctxt, &obuf);
   181  	Bflush(&obuf);
   182  	return 0;
   183  }
   184  
   185  struct
   186  {
   187  	char	*name;
   188  	ushort	type;
   189  	ushort	value;
   190  } itab[] =
   191  {
   192  	"SP",		LSP,	D_AUTO,
   193  	"SB",		LSB,	D_EXTERN,
   194  	"FP",		LFP,	D_PARAM,
   195  	"PC",		LPC,	D_BRANCH,
   196  
   197  	"AL",		LBREG,	D_AL,
   198  	"CL",		LBREG,	D_CL,
   199  	"DL",		LBREG,	D_DL,
   200  	"BL",		LBREG,	D_BL,
   201  	"AH",		LBREG,	D_AH,
   202  	"CH",		LBREG,	D_CH,
   203  	"DH",		LBREG,	D_DH,
   204  	"BH",		LBREG,	D_BH,
   205  
   206  	"AX",		LLREG,	D_AX,
   207  	"CX",		LLREG,	D_CX,
   208  	"DX",		LLREG,	D_DX,
   209  	"BX",		LLREG,	D_BX,
   210  /*	"SP",		LLREG,	D_SP,	*/
   211  	"BP",		LLREG,	D_BP,
   212  	"SI",		LLREG,	D_SI,
   213  	"DI",		LLREG,	D_DI,
   214  
   215  	"F0",		LFREG,	D_F0+0,
   216  	"F1",		LFREG,	D_F0+1,
   217  	"F2",		LFREG,	D_F0+2,
   218  	"F3",		LFREG,	D_F0+3,
   219  	"F4",		LFREG,	D_F0+4,
   220  	"F5",		LFREG,	D_F0+5,
   221  	"F6",		LFREG,	D_F0+6,
   222  	"F7",		LFREG,	D_F0+7,
   223  
   224  	"X0",		LXREG,	D_X0+0,
   225  	"X1",		LXREG,	D_X0+1,
   226  	"X2",		LXREG,	D_X0+2,
   227  	"X3",		LXREG,	D_X0+3,
   228  	"X4",		LXREG,	D_X0+4,
   229  	"X5",		LXREG,	D_X0+5,
   230  	"X6",		LXREG,	D_X0+6,
   231  	"X7",		LXREG,	D_X0+7,
   232  
   233  	"CS",		LSREG,	D_CS,
   234  	"SS",		LSREG,	D_SS,
   235  	"DS",		LSREG,	D_DS,
   236  	"ES",		LSREG,	D_ES,
   237  	"FS",		LSREG,	D_FS,
   238  	"GS",		LSREG,	D_GS,
   239  	"TLS",		LSREG,	D_TLS,
   240  
   241  	"GDTR",		LBREG,	D_GDTR,
   242  	"IDTR",		LBREG,	D_IDTR,
   243  	"LDTR",		LBREG,	D_LDTR,
   244  	"MSW",		LBREG,	D_MSW,
   245  	"TASK",		LBREG,	D_TASK,
   246  
   247  	"CR0",		LBREG,	D_CR+0,
   248  	"CR1",		LBREG,	D_CR+1,
   249  	"CR2",		LBREG,	D_CR+2,
   250  	"CR3",		LBREG,	D_CR+3,
   251  	"CR4",		LBREG,	D_CR+4,
   252  	"CR5",		LBREG,	D_CR+5,
   253  	"CR6",		LBREG,	D_CR+6,
   254  	"CR7",		LBREG,	D_CR+7,
   255  
   256  	"DR0",		LBREG,	D_DR+0,
   257  	"DR1",		LBREG,	D_DR+1,
   258  	"DR2",		LBREG,	D_DR+2,
   259  	"DR3",		LBREG,	D_DR+3,
   260  	"DR4",		LBREG,	D_DR+4,
   261  	"DR5",		LBREG,	D_DR+5,
   262  	"DR6",		LBREG,	D_DR+6,
   263  	"DR7",		LBREG,	D_DR+7,
   264  
   265  	"TR0",		LBREG,	D_TR+0,
   266  	"TR1",		LBREG,	D_TR+1,
   267  	"TR2",		LBREG,	D_TR+2,
   268  	"TR3",		LBREG,	D_TR+3,
   269  	"TR4",		LBREG,	D_TR+4,
   270  	"TR5",		LBREG,	D_TR+5,
   271  	"TR6",		LBREG,	D_TR+6,
   272  	"TR7",		LBREG,	D_TR+7,
   273  
   274  	"AAA",		LTYPE0,	AAAA,
   275  	"AAD",		LTYPE0,	AAAD,
   276  	"AAM",		LTYPE0,	AAAM,
   277  	"AAS",		LTYPE0,	AAAS,
   278  	"ADCB",		LTYPE3,	AADCB,
   279  	"ADCL",		LTYPE3,	AADCL,
   280  	"ADCW",		LTYPE3,	AADCW,
   281  	"ADDB",		LTYPE3,	AADDB,
   282  	"ADDL",		LTYPE3,	AADDL,
   283  	"ADDW",		LTYPE3,	AADDW,
   284  	"ADJSP",	LTYPE2,	AADJSP,
   285  	"ANDB",		LTYPE3,	AANDB,
   286  	"ANDL",		LTYPE3,	AANDL,
   287  	"ANDW",		LTYPE3,	AANDW,
   288  	"ARPL",		LTYPE3,	AARPL,
   289  	"BOUNDL",	LTYPE3,	ABOUNDL,
   290  	"BOUNDW",	LTYPE3,	ABOUNDW,
   291  	"BSFL",		LTYPE3,	ABSFL,
   292  	"BSFW",		LTYPE3,	ABSFW,
   293  	"BSRL",		LTYPE3,	ABSRL,
   294  	"BSRW",		LTYPE3,	ABSRW,
   295  	"BSWAPL",	LTYPE1,	ABSWAPL,
   296  	"BTCL",		LTYPE3,	ABTCL,
   297  	"BTCW",		LTYPE3,	ABTCW,
   298  	"BTL",		LTYPE3,	ABTL,
   299  	"BTRL",		LTYPE3,	ABTRL,
   300  	"BTRW",		LTYPE3,	ABTRW,
   301  	"BTSL",		LTYPE3,	ABTSL,
   302  	"BTSW",		LTYPE3,	ABTSW,
   303  	"BTW",		LTYPE3,	ABTW,
   304  	"BYTE",		LTYPE2,	ABYTE,
   305  	"CALL",		LTYPEC,	ACALL,
   306  	"CLC",		LTYPE0,	ACLC,
   307  	"CLD",		LTYPE0,	ACLD,
   308  	"CLI",		LTYPE0,	ACLI,
   309  	"CLTS",		LTYPE0,	ACLTS,
   310  	"CMC",		LTYPE0,	ACMC,
   311  	"CMPB",		LTYPE4,	ACMPB,
   312  	"CMPL",		LTYPE4,	ACMPL,
   313  	"CMPW",		LTYPE4,	ACMPW,
   314  	"CMPSB",	LTYPE0,	ACMPSB,
   315  	"CMPSL",	LTYPE0,	ACMPSL,
   316  	"CMPSW",	LTYPE0,	ACMPSW,
   317  	"CMPXCHG8B",	LTYPE1,	ACMPXCHG8B,
   318  	"CMPXCHGB",	LTYPE3,	ACMPXCHGB,
   319  	"CMPXCHGL",	LTYPE3,	ACMPXCHGL,
   320  	"CMPXCHGW",	LTYPE3,	ACMPXCHGW,
   321  	"CPUID",	LTYPE0,	ACPUID,
   322  	"DAA",		LTYPE0,	ADAA,
   323  	"DAS",		LTYPE0,	ADAS,
   324  	"DATA",		LTYPED,	ADATA,
   325  	"DECB",		LTYPE1,	ADECB,
   326  	"DECL",		LTYPE1,	ADECL,
   327  	"DECW",		LTYPE1,	ADECW,
   328  	"DIVB",		LTYPE2,	ADIVB,
   329  	"DIVL",		LTYPE2,	ADIVL,
   330  	"DIVW",		LTYPE2,	ADIVW,
   331  	"END",		LTYPE0,	AEND,
   332  	"ENTER",	LTYPE2,	AENTER,
   333  	"GLOBL",	LTYPEG,	AGLOBL,
   334  	"HLT",		LTYPE0,	AHLT,
   335  	"IDIVB",	LTYPE2,	AIDIVB,
   336  	"IDIVL",	LTYPE2,	AIDIVL,
   337  	"IDIVW",	LTYPE2,	AIDIVW,
   338  	"IMULB",	LTYPE2,	AIMULB,
   339  	"IMULL",	LTYPEI,	AIMULL,
   340  	"IMULW",	LTYPEI,	AIMULW,
   341  	"INB",		LTYPE0,	AINB,
   342  	"INL",		LTYPE0,	AINL,
   343  	"INW",		LTYPE0,	AINW,
   344  	"INCB",		LTYPE1,	AINCB,
   345  	"INCL",		LTYPE1,	AINCL,
   346  	"INCW",		LTYPE1,	AINCW,
   347  	"INSB",		LTYPE0,	AINSB,
   348  	"INSL",		LTYPE0,	AINSL,
   349  	"INSW",		LTYPE0,	AINSW,
   350  	"INT",		LTYPE2,	AINT,
   351  	"INTO",		LTYPE0,	AINTO,
   352  	"IRETL",	LTYPE0,	AIRETL,
   353  	"IRETW",	LTYPE0,	AIRETW,
   354  
   355  	"JOS",		LTYPER,	AJOS,
   356  	"JO",		LTYPER,	AJOS,	/* alternate */
   357  	"JOC",		LTYPER,	AJOC,
   358  	"JNO",		LTYPER,	AJOC,	/* alternate */
   359  	"JCS",		LTYPER,	AJCS,
   360  	"JB",		LTYPER,	AJCS,	/* alternate */
   361  	"JC",		LTYPER,	AJCS,	/* alternate */
   362  	"JNAE",		LTYPER,	AJCS,	/* alternate */
   363  	"JLO",		LTYPER,	AJCS,	/* alternate */
   364  	"JCC",		LTYPER,	AJCC,
   365  	"JAE",		LTYPER,	AJCC,	/* alternate */
   366  	"JNB",		LTYPER,	AJCC,	/* alternate */
   367  	"JNC",		LTYPER,	AJCC,	/* alternate */
   368  	"JHS",		LTYPER,	AJCC,	/* alternate */
   369  	"JEQ",		LTYPER,	AJEQ,
   370  	"JE",		LTYPER,	AJEQ,	/* alternate */
   371  	"JZ",		LTYPER,	AJEQ,	/* alternate */
   372  	"JNE",		LTYPER,	AJNE,
   373  	"JNZ",		LTYPER,	AJNE,	/* alternate */
   374  	"JLS",		LTYPER,	AJLS,
   375  	"JBE",		LTYPER,	AJLS,	/* alternate */
   376  	"JNA",		LTYPER,	AJLS,	/* alternate */
   377  	"JHI",		LTYPER,	AJHI,
   378  	"JA",		LTYPER,	AJHI,	/* alternate */
   379  	"JNBE",		LTYPER,	AJHI,	/* alternate */
   380  	"JMI",		LTYPER,	AJMI,
   381  	"JS",		LTYPER,	AJMI,	/* alternate */
   382  	"JPL",		LTYPER,	AJPL,
   383  	"JNS",		LTYPER,	AJPL,	/* alternate */
   384  	"JPS",		LTYPER,	AJPS,
   385  	"JP",		LTYPER,	AJPS,	/* alternate */
   386  	"JPE",		LTYPER,	AJPS,	/* alternate */
   387  	"JPC",		LTYPER,	AJPC,
   388  	"JNP",		LTYPER,	AJPC,	/* alternate */
   389  	"JPO",		LTYPER,	AJPC,	/* alternate */
   390  	"JLT",		LTYPER,	AJLT,
   391  	"JL",		LTYPER,	AJLT,	/* alternate */
   392  	"JNGE",		LTYPER,	AJLT,	/* alternate */
   393  	"JGE",		LTYPER,	AJGE,
   394  	"JNL",		LTYPER,	AJGE,	/* alternate */
   395  	"JLE",		LTYPER,	AJLE,
   396  	"JNG",		LTYPER,	AJLE,	/* alternate */
   397  	"JGT",		LTYPER,	AJGT,
   398  	"JG",		LTYPER,	AJGT,	/* alternate */
   399  	"JNLE",		LTYPER,	AJGT,	/* alternate */
   400  
   401  	"JCXZL",	LTYPER,	AJCXZL,
   402  	"JCXZW",	LTYPER,	AJCXZW,
   403  	"JMP",		LTYPEC,	AJMP,
   404  	"LAHF",		LTYPE0,	ALAHF,
   405  	"LARL",		LTYPE3,	ALARL,
   406  	"LARW",		LTYPE3,	ALARW,
   407  	"LEAL",		LTYPE3,	ALEAL,
   408  	"LEAW",		LTYPE3,	ALEAW,
   409  	"LEAVEL",	LTYPE0,	ALEAVEL,
   410  	"LEAVEW",	LTYPE0,	ALEAVEW,
   411  	"LOCK",		LTYPE0,	ALOCK,
   412  	"LODSB",	LTYPE0,	ALODSB,
   413  	"LODSL",	LTYPE0,	ALODSL,
   414  	"LODSW",	LTYPE0,	ALODSW,
   415  	"LONG",		LTYPE2,	ALONG,
   416  	"LOOP",		LTYPER,	ALOOP,
   417  	"LOOPEQ",	LTYPER,	ALOOPEQ,
   418  	"LOOPNE",	LTYPER,	ALOOPNE,
   419  	"LSLL",		LTYPE3,	ALSLL,
   420  	"LSLW",		LTYPE3,	ALSLW,
   421  	"MOVB",		LTYPE3,	AMOVB,
   422  	"MOVL",		LTYPEM,	AMOVL,
   423  	"MOVW",		LTYPEM,	AMOVW,
   424  	"MOVQ",		LTYPEM, AMOVQ,
   425  	"MOVBLSX",	LTYPE3, AMOVBLSX,
   426  	"MOVBLZX",	LTYPE3, AMOVBLZX,
   427  	"MOVBWSX",	LTYPE3, AMOVBWSX,
   428  	"MOVBWZX",	LTYPE3, AMOVBWZX,
   429  	"MOVWLSX",	LTYPE3, AMOVWLSX,
   430  	"MOVWLZX",	LTYPE3, AMOVWLZX,
   431  	"MOVSB",	LTYPE0,	AMOVSB,
   432  	"MOVSL",	LTYPE0,	AMOVSL,
   433  	"MOVSW",	LTYPE0,	AMOVSW,
   434  	"MULB",		LTYPE2,	AMULB,
   435  	"MULL",		LTYPE2,	AMULL,
   436  	"MULW",		LTYPE2,	AMULW,
   437  	"NEGB",		LTYPE1,	ANEGB,
   438  	"NEGL",		LTYPE1,	ANEGL,
   439  	"NEGW",		LTYPE1,	ANEGW,
   440  	"NOP",		LTYPEN,	ANOP,
   441  	"NOTB",		LTYPE1,	ANOTB,
   442  	"NOTL",		LTYPE1,	ANOTL,
   443  	"NOTW",		LTYPE1,	ANOTW,
   444  	"ORB",		LTYPE3,	AORB,
   445  	"ORL",		LTYPE3,	AORL,
   446  	"ORW",		LTYPE3,	AORW,
   447  	"OUTB",		LTYPE0,	AOUTB,
   448  	"OUTL",		LTYPE0,	AOUTL,
   449  	"OUTW",		LTYPE0,	AOUTW,
   450  	"OUTSB",	LTYPE0,	AOUTSB,
   451  	"OUTSL",	LTYPE0,	AOUTSL,
   452  	"OUTSW",	LTYPE0,	AOUTSW,
   453  	"PAUSE",	LTYPEN,	APAUSE,
   454  	"PINSRD",	LTYPEX,	APINSRD,
   455  	"POPAL",	LTYPE0,	APOPAL,
   456  	"POPAW",	LTYPE0,	APOPAW,
   457  	"POPFL",	LTYPE0,	APOPFL,
   458  	"POPFW",	LTYPE0,	APOPFW,
   459  	"POPL",		LTYPE1,	APOPL,
   460  	"POPW",		LTYPE1,	APOPW,
   461  	"PUSHAL",	LTYPE0,	APUSHAL,
   462  	"PUSHAW",	LTYPE0,	APUSHAW,
   463  	"PUSHFL",	LTYPE0,	APUSHFL,
   464  	"PUSHFW",	LTYPE0,	APUSHFW,
   465  	"PUSHL",	LTYPE2,	APUSHL,
   466  	"PUSHW",	LTYPE2,	APUSHW,
   467  	"RCLB",		LTYPE3,	ARCLB,
   468  	"RCLL",		LTYPE3,	ARCLL,
   469  	"RCLW",		LTYPE3,	ARCLW,
   470  	"RCRB",		LTYPE3,	ARCRB,
   471  	"RCRL",		LTYPE3,	ARCRL,
   472  	"RCRW",		LTYPE3,	ARCRW,
   473  	"RDTSC",	LTYPE0,	ARDTSC,
   474  	"REP",		LTYPE0,	AREP,
   475  	"REPN",		LTYPE0,	AREPN,
   476  	"RET",		LTYPE0,	ARET,
   477  	"ROLB",		LTYPE3,	AROLB,
   478  	"ROLL",		LTYPE3,	AROLL,
   479  	"ROLW",		LTYPE3,	AROLW,
   480  	"RORB",		LTYPE3,	ARORB,
   481  	"RORL",		LTYPE3,	ARORL,
   482  	"RORW",		LTYPE3,	ARORW,
   483  	"SAHF",		LTYPE0,	ASAHF,
   484  	"SALB",		LTYPE3,	ASALB,
   485  	"SALL",		LTYPE3,	ASALL,
   486  	"SALW",		LTYPE3,	ASALW,
   487  	"SARB",		LTYPE3,	ASARB,
   488  	"SARL",		LTYPE3,	ASARL,
   489  	"SARW",		LTYPE3,	ASARW,
   490  	"SBBB",		LTYPE3,	ASBBB,
   491  	"SBBL",		LTYPE3,	ASBBL,
   492  	"SBBW",		LTYPE3,	ASBBW,
   493  	"SCASB",	LTYPE0,	ASCASB,
   494  	"SCASL",	LTYPE0,	ASCASL,
   495  	"SCASW",	LTYPE0,	ASCASW,
   496  	"SETCC",	LTYPE1,	ASETCC,
   497  	"SETCS",	LTYPE1,	ASETCS,
   498  	"SETEQ",	LTYPE1,	ASETEQ,
   499  	"SETGE",	LTYPE1,	ASETGE,
   500  	"SETGT",	LTYPE1,	ASETGT,
   501  	"SETHI",	LTYPE1,	ASETHI,
   502  	"SETLE",	LTYPE1,	ASETLE,
   503  	"SETLS",	LTYPE1,	ASETLS,
   504  	"SETLT",	LTYPE1,	ASETLT,
   505  	"SETMI",	LTYPE1,	ASETMI,
   506  	"SETNE",	LTYPE1,	ASETNE,
   507  	"SETOC",	LTYPE1,	ASETOC,
   508  	"SETOS",	LTYPE1,	ASETOS,
   509  	"SETPC",	LTYPE1,	ASETPC,
   510  	"SETPL",	LTYPE1,	ASETPL,
   511  	"SETPS",	LTYPE1,	ASETPS,
   512  	"CDQ",		LTYPE0,	ACDQ,
   513  	"CWD",		LTYPE0,	ACWD,
   514  	"SHLB",		LTYPE3,	ASHLB,
   515  	"SHLL",		LTYPES,	ASHLL,
   516  	"SHLW",		LTYPES,	ASHLW,
   517  	"SHRB",		LTYPE3,	ASHRB,
   518  	"SHRL",		LTYPES,	ASHRL,
   519  	"SHRW",		LTYPES,	ASHRW,
   520  	"STC",		LTYPE0,	ASTC,
   521  	"STD",		LTYPE0,	ASTD,
   522  	"STI",		LTYPE0,	ASTI,
   523  	"STOSB",	LTYPE0,	ASTOSB,
   524  	"STOSL",	LTYPE0,	ASTOSL,
   525  	"STOSW",	LTYPE0,	ASTOSW,
   526  	"SUBB",		LTYPE3,	ASUBB,
   527  	"SUBL",		LTYPE3,	ASUBL,
   528  	"SUBW",		LTYPE3,	ASUBW,
   529  	"SYSCALL",	LTYPE0,	ASYSCALL,
   530  	"TESTB",	LTYPE3,	ATESTB,
   531  	"TESTL",	LTYPE3,	ATESTL,
   532  	"TESTW",	LTYPE3,	ATESTW,
   533  	"TEXT",		LTYPET,	ATEXT,
   534  	"VERR",		LTYPE2,	AVERR,
   535  	"VERW",		LTYPE2,	AVERW,
   536  	"WAIT",		LTYPE0,	AWAIT,
   537  	"WORD",		LTYPE2,	AWORD,
   538  	"XADDB",	LTYPE3,	AXADDB,
   539  	"XADDL",	LTYPE3,	AXADDL,
   540  	"XADDW",	LTYPE3,	AXADDW,
   541  	"XCHGB",	LTYPE3,	AXCHGB,
   542  	"XCHGL",	LTYPE3,	AXCHGL,
   543  	"XCHGW",	LTYPE3,	AXCHGW,
   544  	"XLAT",		LTYPE2,	AXLAT,
   545  	"XORB",		LTYPE3,	AXORB,
   546  	"XORL",		LTYPE3,	AXORL,
   547  	"XORW",		LTYPE3,	AXORW,
   548  
   549  	"CMOVLCC",	LTYPE3,	ACMOVLCC,
   550  	"CMOVLCS",	LTYPE3,	ACMOVLCS,
   551  	"CMOVLEQ",	LTYPE3,	ACMOVLEQ,
   552  	"CMOVLGE",	LTYPE3,	ACMOVLGE,
   553  	"CMOVLGT",	LTYPE3,	ACMOVLGT,
   554  	"CMOVLHI",	LTYPE3,	ACMOVLHI,
   555  	"CMOVLLE",	LTYPE3,	ACMOVLLE,
   556  	"CMOVLLS",	LTYPE3,	ACMOVLLS,
   557  	"CMOVLLT",	LTYPE3,	ACMOVLLT,
   558  	"CMOVLMI",	LTYPE3,	ACMOVLMI,
   559  	"CMOVLNE",	LTYPE3,	ACMOVLNE,
   560  	"CMOVLOC",	LTYPE3,	ACMOVLOC,
   561  	"CMOVLOS",	LTYPE3,	ACMOVLOS,
   562  	"CMOVLPC",	LTYPE3,	ACMOVLPC,
   563  	"CMOVLPL",	LTYPE3,	ACMOVLPL,
   564  	"CMOVLPS",	LTYPE3,	ACMOVLPS,
   565  	"CMOVWCC",	LTYPE3,	ACMOVWCC,
   566  	"CMOVWCS",	LTYPE3,	ACMOVWCS,
   567  	"CMOVWEQ",	LTYPE3,	ACMOVWEQ,
   568  	"CMOVWGE",	LTYPE3,	ACMOVWGE,
   569  	"CMOVWGT",	LTYPE3,	ACMOVWGT,
   570  	"CMOVWHI",	LTYPE3,	ACMOVWHI,
   571  	"CMOVWLE",	LTYPE3,	ACMOVWLE,
   572  	"CMOVWLS",	LTYPE3,	ACMOVWLS,
   573  	"CMOVWLT",	LTYPE3,	ACMOVWLT,
   574  	"CMOVWMI",	LTYPE3,	ACMOVWMI,
   575  	"CMOVWNE",	LTYPE3,	ACMOVWNE,
   576  	"CMOVWOC",	LTYPE3,	ACMOVWOC,
   577  	"CMOVWOS",	LTYPE3,	ACMOVWOS,
   578  	"CMOVWPC",	LTYPE3,	ACMOVWPC,
   579  	"CMOVWPL",	LTYPE3,	ACMOVWPL,
   580  	"CMOVWPS",	LTYPE3,	ACMOVWPS,
   581  
   582  	"FMOVB",	LTYPE3, AFMOVB,
   583  	"FMOVBP",	LTYPE3, AFMOVBP,
   584  	"FMOVD",	LTYPE3, AFMOVD,
   585  	"FMOVDP",	LTYPE3, AFMOVDP,
   586  	"FMOVF",	LTYPE3, AFMOVF,
   587  	"FMOVFP",	LTYPE3, AFMOVFP,
   588  	"FMOVL",	LTYPE3, AFMOVL,
   589  	"FMOVLP",	LTYPE3, AFMOVLP,
   590  	"FMOVV",	LTYPE3, AFMOVV,
   591  	"FMOVVP",	LTYPE3, AFMOVVP,
   592  	"FMOVW",	LTYPE3, AFMOVW,
   593  	"FMOVWP",	LTYPE3, AFMOVWP,
   594  	"FMOVX",	LTYPE3, AFMOVX,
   595  	"FMOVXP",	LTYPE3, AFMOVXP,
   596  	"FCMOVCC",	LTYPE3, AFCMOVCC,
   597  	"FCMOVCS",	LTYPE3, AFCMOVCS,
   598  	"FCMOVEQ",	LTYPE3, AFCMOVEQ,
   599  	"FCMOVHI",	LTYPE3, AFCMOVHI,
   600  	"FCMOVLS",	LTYPE3, AFCMOVLS,
   601  	"FCMOVNE",	LTYPE3, AFCMOVNE,
   602  	"FCMOVNU",	LTYPE3, AFCMOVNU,
   603  	"FCMOVUN",	LTYPE3, AFCMOVUN,
   604  	"FCOMB",	LTYPE3, AFCOMB,
   605  	"FCOMBP",	LTYPE3, AFCOMBP,
   606  	"FCOMD",	LTYPE3, AFCOMD,
   607  	"FCOMDP",	LTYPE3, AFCOMDP,
   608  	"FCOMDPP",	LTYPE3, AFCOMDPP,
   609  	"FCOMF",	LTYPE3, AFCOMF,
   610  	"FCOMFP",	LTYPE3, AFCOMFP,
   611  	"FCOMI",	LTYPE3, AFCOMI,
   612  	"FCOMIP",	LTYPE3, AFCOMIP,
   613  	"FCOML",	LTYPE3, AFCOML,
   614  	"FCOMLP",	LTYPE3, AFCOMLP,
   615  	"FCOMW",	LTYPE3, AFCOMW,
   616  	"FCOMWP",	LTYPE3, AFCOMWP,
   617  	"FUCOM",	LTYPE3, AFUCOM,
   618  	"FUCOMI",	LTYPE3, AFUCOMI,
   619  	"FUCOMIP",	LTYPE3, AFUCOMIP,
   620  	"FUCOMP",	LTYPE3, AFUCOMP,
   621  	"FUCOMPP",	LTYPE3, AFUCOMPP,
   622  	"FADDW",	LTYPE3, AFADDW,
   623  	"FADDL",	LTYPE3, AFADDL,
   624  	"FADDF",	LTYPE3, AFADDF,
   625  	"FADDD",	LTYPE3, AFADDD,
   626  	"FADDDP",	LTYPE3, AFADDDP,
   627  	"FSUBDP",	LTYPE3, AFSUBDP,
   628  	"FSUBW",	LTYPE3, AFSUBW,
   629  	"FSUBL",	LTYPE3, AFSUBL,
   630  	"FSUBF",	LTYPE3, AFSUBF,
   631  	"FSUBD",	LTYPE3, AFSUBD,
   632  	"FSUBRDP",	LTYPE3, AFSUBRDP,
   633  	"FSUBRW",	LTYPE3, AFSUBRW,
   634  	"FSUBRL",	LTYPE3, AFSUBRL,
   635  	"FSUBRF",	LTYPE3, AFSUBRF,
   636  	"FSUBRD",	LTYPE3, AFSUBRD,
   637  	"FMULDP",	LTYPE3, AFMULDP,
   638  	"FMULW",	LTYPE3, AFMULW,
   639  	"FMULL",	LTYPE3, AFMULL,
   640  	"FMULF",	LTYPE3, AFMULF,
   641  	"FMULD",	LTYPE3, AFMULD,
   642  	"FDIVDP",	LTYPE3, AFDIVDP,
   643  	"FDIVW",	LTYPE3, AFDIVW,
   644  	"FDIVL",	LTYPE3, AFDIVL,
   645  	"FDIVF",	LTYPE3, AFDIVF,
   646  	"FDIVD",	LTYPE3, AFDIVD,
   647  	"FDIVRDP",	LTYPE3, AFDIVRDP,
   648  	"FDIVRW",	LTYPE3, AFDIVRW,
   649  	"FDIVRL",	LTYPE3, AFDIVRL,
   650  	"FDIVRF",	LTYPE3, AFDIVRF,
   651  	"FDIVRD",	LTYPE3, AFDIVRD,
   652  	"FXCHD",	LTYPE3, AFXCHD,
   653  	"FFREE",	LTYPE1, AFFREE,
   654  	"FLDCW",	LTYPE2, AFLDCW,
   655  	"FLDENV",	LTYPE1, AFLDENV,
   656  	"FRSTOR",	LTYPE2, AFRSTOR,
   657  	"FSAVE",	LTYPE1, AFSAVE,
   658  	"FSTCW",	LTYPE1, AFSTCW,
   659  	"FSTENV",	LTYPE1, AFSTENV,
   660  	"FSTSW",	LTYPE1, AFSTSW,
   661  	"F2XM1",	LTYPE0, AF2XM1,
   662  	"FABS",		LTYPE0, AFABS,
   663  	"FCHS",		LTYPE0, AFCHS,
   664  	"FCLEX",	LTYPE0, AFCLEX,
   665  	"FCOS",		LTYPE0, AFCOS,
   666  	"FDECSTP",	LTYPE0, AFDECSTP,
   667  	"FINCSTP",	LTYPE0, AFINCSTP,
   668  	"FINIT",	LTYPE0, AFINIT,
   669  	"FLD1",		LTYPE0, AFLD1,
   670  	"FLDL2E",	LTYPE0, AFLDL2E,
   671  	"FLDL2T",	LTYPE0, AFLDL2T,
   672  	"FLDLG2",	LTYPE0, AFLDLG2,
   673  	"FLDLN2",	LTYPE0, AFLDLN2,
   674  	"FLDPI",	LTYPE0, AFLDPI,
   675  	"FLDZ",		LTYPE0, AFLDZ,
   676  	"FNOP",		LTYPE0, AFNOP,
   677  	"FPATAN",	LTYPE0, AFPATAN,
   678  	"FPREM",	LTYPE0, AFPREM,
   679  	"FPREM1",	LTYPE0, AFPREM1,
   680  	"FPTAN",	LTYPE0, AFPTAN,
   681  	"FRNDINT",	LTYPE0, AFRNDINT,
   682  	"FSCALE",	LTYPE0, AFSCALE,
   683  	"FSIN",		LTYPE0, AFSIN,
   684  	"FSINCOS",	LTYPE0, AFSINCOS,
   685  	"FSQRT",	LTYPE0, AFSQRT,
   686  	"FTST",		LTYPE0, AFTST,
   687  	"FXAM",		LTYPE0, AFXAM,
   688  	"FXTRACT",	LTYPE0, AFXTRACT,
   689  	"FYL2X",	LTYPE0, AFYL2X,
   690  	"FYL2XP1",	LTYPE0, AFYL2XP1,
   691  	"LFENCE",	LTYPE0, ALFENCE,
   692  	"MFENCE",	LTYPE0, AMFENCE,
   693  	"SFENCE",	LTYPE0, ASFENCE,
   694  	"EMMS",		LTYPE0, AEMMS,
   695  	"PREFETCHT0",		LTYPE2,	APREFETCHT0,
   696  	"PREFETCHT1",		LTYPE2,	APREFETCHT1,
   697  	"PREFETCHT2",		LTYPE2,	APREFETCHT2,
   698  	"PREFETCHNTA",		LTYPE2,	APREFETCHNTA,
   699  	"UNDEF",	LTYPE0,	AUNDEF,
   700  
   701  	"ADDPD",	LTYPE3,	AADDPD,
   702  	"ADDPS",	LTYPE3,	AADDPS,
   703  	"ADDSD",	LTYPE3,	AADDSD,
   704  	"ADDSS",	LTYPE3,	AADDSS,
   705  	"AESENC",	LTYPE3,	AAESENC,
   706  	"ANDNPD",	LTYPE3,	AANDNPD,
   707  	"ANDNPS",	LTYPE3,	AANDNPS,
   708  	"ANDPD",	LTYPE3,	AANDPD,
   709  	"ANDPS",	LTYPE3,	AANDPS,
   710  	"CMPPD",	LTYPEXC,ACMPPD,
   711  	"CMPPS",	LTYPEXC,ACMPPS,
   712  	"CMPSD",	LTYPEXC,ACMPSD,
   713  	"CMPSS",	LTYPEXC,ACMPSS,
   714  	"COMISD",	LTYPE3,	ACOMISD,
   715  	"COMISS",	LTYPE3,	ACOMISS,
   716  	"CVTPL2PD",	LTYPE3,	ACVTPL2PD,
   717  	"CVTPL2PS",	LTYPE3,	ACVTPL2PS,
   718  	"CVTPD2PL",	LTYPE3,	ACVTPD2PL,
   719  	"CVTPD2PS",	LTYPE3,	ACVTPD2PS,
   720  	"CVTPS2PL",	LTYPE3,	ACVTPS2PL,
   721  	"CVTPS2PD",	LTYPE3,	ACVTPS2PD,
   722  	"CVTSD2SL",	LTYPE3,	ACVTSD2SL,
   723  	"CVTSD2SS",	LTYPE3,	ACVTSD2SS,
   724  	"CVTSL2SD",	LTYPE3,	ACVTSL2SD,
   725  	"CVTSL2SS",	LTYPE3,	ACVTSL2SS,
   726  	"CVTSS2SD",	LTYPE3,	ACVTSS2SD,
   727  	"CVTSS2SL",	LTYPE3,	ACVTSS2SL,
   728  	"CVTTPD2PL",	LTYPE3,	ACVTTPD2PL,
   729  	"CVTTPS2PL",	LTYPE3,	ACVTTPS2PL,
   730  	"CVTTSD2SL",	LTYPE3,	ACVTTSD2SL,
   731  	"CVTTSS2SL",	LTYPE3,	ACVTTSS2SL,
   732  	"DIVPD",	LTYPE3,	ADIVPD,
   733  	"DIVPS",	LTYPE3,	ADIVPS,
   734  	"DIVSD",	LTYPE3,	ADIVSD,
   735  	"DIVSS",	LTYPE3,	ADIVSS,
   736  	"MASKMOVOU",	LTYPE3,	AMASKMOVOU,
   737  	"MASKMOVDQU",	LTYPE3,	AMASKMOVOU,	/* syn */
   738  	"MAXPD",	LTYPE3,	AMAXPD,
   739  	"MAXPS",	LTYPE3,	AMAXPS,
   740  	"MAXSD",	LTYPE3,	AMAXSD,
   741  	"MAXSS",	LTYPE3,	AMAXSS,
   742  	"MINPD",	LTYPE3,	AMINPD,
   743  	"MINPS",	LTYPE3,	AMINPS,
   744  	"MINSD",	LTYPE3,	AMINSD,
   745  	"MINSS",	LTYPE3,	AMINSS,
   746  	"MOVAPD",	LTYPE3,	AMOVAPD,
   747  	"MOVAPS",	LTYPE3,	AMOVAPS,
   748  	"MOVO",		LTYPE3,	AMOVO,
   749  	"MOVOA",	LTYPE3,	AMOVO,	/* syn */
   750  	"MOVOU",	LTYPE3,	AMOVOU,
   751  	"MOVHLPS",	LTYPE3,	AMOVHLPS,
   752  	"MOVHPD",	LTYPE3,	AMOVHPD,
   753  	"MOVHPS",	LTYPE3,	AMOVHPS,
   754  	"MOVLHPS",	LTYPE3,	AMOVLHPS,
   755  	"MOVLPD",	LTYPE3,	AMOVLPD,
   756  	"MOVLPS",	LTYPE3,	AMOVLPS,
   757  	"MOVMSKPD",	LTYPE3,	AMOVMSKPD,
   758  	"MOVMSKPS",	LTYPE3,	AMOVMSKPS,
   759  	"MOVNTO",	LTYPE3,	AMOVNTO,
   760  	"MOVNTDQ",	LTYPE3,	AMOVNTO,	/* syn */
   761  	"MOVNTPD",	LTYPE3,	AMOVNTPD,
   762  	"MOVNTPS",	LTYPE3,	AMOVNTPS,
   763  	"MOVSD",	LTYPE3,	AMOVSD,
   764  	"MOVSS",	LTYPE3,	AMOVSS,
   765  	"MOVUPD",	LTYPE3,	AMOVUPD,
   766  	"MOVUPS",	LTYPE3,	AMOVUPS,
   767  	"MULPD",	LTYPE3,	AMULPD,
   768  	"MULPS",	LTYPE3,	AMULPS,
   769  	"MULSD",	LTYPE3,	AMULSD,
   770  	"MULSS",	LTYPE3,	AMULSS,
   771  	"ORPD",		LTYPE3,	AORPD,
   772  	"ORPS",		LTYPE3,	AORPS,
   773  	"PADDQ",	LTYPE3,	APADDQ,
   774  	"PAND",		LTYPE3,	APAND,
   775  	"PCMPEQB",	LTYPE3,	APCMPEQB,
   776  	"PMAXSW",	LTYPE3,	APMAXSW,
   777  	"PMAXUB",	LTYPE3,	APMAXUB,
   778  	"PMINSW",	LTYPE3,	APMINSW,
   779  	"PMINUB",	LTYPE3,	APMINUB,
   780  	"PMOVMSKB",	LTYPE3,	APMOVMSKB,
   781  	"PSADBW",	LTYPE3,	APSADBW,
   782  	"PSHUFB",	LTYPE3, APSHUFB,
   783  	"PSUBB",	LTYPE3,	APSUBB,
   784  	"PSUBL",	LTYPE3,	APSUBL,
   785  	"PSUBQ",	LTYPE3,	APSUBQ,
   786  	"PSUBSB",	LTYPE3,	APSUBSB,
   787  	"PSUBSW",	LTYPE3,	APSUBSW,
   788  	"PSUBUSB",	LTYPE3,	APSUBUSB,
   789  	"PSUBUSW",	LTYPE3,	APSUBUSW,
   790  	"PSUBW",	LTYPE3,	APSUBW,
   791  	"PUNPCKHQDQ",	LTYPE3,	APUNPCKHQDQ,
   792  	"PUNPCKLQDQ",	LTYPE3,	APUNPCKLQDQ,
   793  	"PXOR",		LTYPE3, APXOR,
   794  	"RCPPS",	LTYPE3,	ARCPPS,
   795  	"RCPSS",	LTYPE3,	ARCPSS,
   796  	"RSQRTPS",	LTYPE3,	ARSQRTPS,
   797  	"RSQRTSS",	LTYPE3,	ARSQRTSS,
   798  	"SQRTPD",	LTYPE3,	ASQRTPD,
   799  	"SQRTPS",	LTYPE3,	ASQRTPS,
   800  	"SQRTSD",	LTYPE3,	ASQRTSD,
   801  	"SQRTSS",	LTYPE3,	ASQRTSS,
   802  	"SUBPD",	LTYPE3,	ASUBPD,
   803  	"SUBPS",	LTYPE3,	ASUBPS,
   804  	"SUBSD",	LTYPE3,	ASUBSD,
   805  	"SUBSS",	LTYPE3,	ASUBSS,
   806  	"UCOMISD",	LTYPE3,	AUCOMISD,
   807  	"UCOMISS",	LTYPE3,	AUCOMISS,
   808  	"UNPCKHPD",	LTYPE3,	AUNPCKHPD,
   809  	"UNPCKHPS",	LTYPE3,	AUNPCKHPS,
   810  	"UNPCKLPD",	LTYPE3,	AUNPCKLPD,
   811  	"UNPCKLPS",	LTYPE3,	AUNPCKLPS,
   812  	"XORPD",	LTYPE3,	AXORPD,
   813  	"XORPS",	LTYPE3,	AXORPS,
   814  	"USEFIELD",	LTYPEN, AUSEFIELD,
   815  	"PCDATA",	LTYPEPC,	APCDATA,
   816  	"FUNCDATA",	LTYPEF,	AFUNCDATA,
   817  	0
   818  };
   819  
   820  void
   821  cinit(void)
   822  {
   823  	Sym *s;
   824  	int i;
   825  
   826  	nullgen.type = D_NONE;
   827  	nullgen.index = D_NONE;
   828  
   829  	nerrors = 0;
   830  	iostack = I;
   831  	iofree = I;
   832  	peekc = IGN;
   833  	nhunk = 0;
   834  	for(i=0; i<NHASH; i++)
   835  		hash[i] = S;
   836  	for(i=0; itab[i].name; i++) {
   837  		s = slookup(itab[i].name);
   838  		if(s->type != LNAME)
   839  			yyerror("double initialization %s", itab[i].name);
   840  		s->type = itab[i].type;
   841  		s->value = itab[i].value;
   842  	}
   843  }
   844  
   845  void
   846  checkscale(int scale)
   847  {
   848  
   849  	switch(scale) {
   850  	case 1:
   851  	case 2:
   852  	case 4:
   853  	case 8:
   854  		return;
   855  	}
   856  	yyerror("scale must be 1248: %d", scale);
   857  }
   858  
   859  void
   860  syminit(Sym *s)
   861  {
   862  
   863  	s->type = LNAME;
   864  	s->value = 0;
   865  }
   866  
   867  void
   868  cclean(void)
   869  {
   870  	Addr2 g2;
   871  
   872  	g2.from = nullgen;
   873  	g2.to = nullgen;
   874  	outcode(AEND, &g2);
   875  }
   876  
   877  static Prog *lastpc;
   878  
   879  void
   880  outcode(int a, Addr2 *g2)
   881  {
   882  	Prog *p;
   883  	Plist *pl;
   884  	
   885  	if(pass == 1)
   886  		goto out;
   887  
   888  	p = malloc(sizeof *p);
   889  	memset(p, 0, sizeof *p);
   890  	p->as = a;
   891  	p->lineno = stmtline;
   892  	p->from = g2->from;
   893  	p->to = g2->to;
   894  	p->pc = pc;
   895  
   896  	if(lastpc == nil) {
   897  		pl = linknewplist(ctxt);
   898  		pl->firstpc = p;
   899  	} else
   900  		lastpc->link = p;
   901  	lastpc = p;	
   902  
   903  out:
   904  	if(a != AGLOBL && a != ADATA)
   905  		pc++;
   906  }
   907  
   908  #include "../cc/lexbody"
   909  #include "../cc/macbody"