github.com/rohankumardubey/syslog-redirector-golang@v0.0.0-20140320174030-4859f03d829a/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  void
    61  main(int argc, char *argv[])
    62  {
    63  	char *p;
    64  	int c;
    65  
    66  	thechar = '8';
    67  	thestring = "386";
    68  
    69  	ensuresymb(NSYMB);
    70  	memset(debug, 0, sizeof(debug));
    71  	cinit();
    72  	outfile = 0;
    73  	setinclude(".");
    74  	ARGBEGIN {
    75  	default:
    76  		c = ARGC();
    77  		if(c >= 0 && c < sizeof(debug))
    78  			debug[c] = 1;
    79  		break;
    80  
    81  	case 'o':
    82  		outfile = ARGF();
    83  		break;
    84  
    85  	case 'D':
    86  		p = ARGF();
    87  		if(p) {
    88  			if (nDlist%8 == 0)
    89  				Dlist = allocn(Dlist, nDlist*sizeof(char *), 
    90  					8*sizeof(char *));
    91  			Dlist[nDlist++] = p;
    92  		}
    93  		break;
    94  
    95  	case 'I':
    96  		p = ARGF();
    97  		setinclude(p);
    98  		break;
    99  	} ARGEND
   100  	if(*argv == 0) {
   101  		print("usage: %ca [-options] file.s\n", thechar);
   102  		errorexit();
   103  	}
   104  	if(argc > 1){
   105  		print("can't assemble multiple files\n");
   106  		errorexit();
   107  	}
   108  	if(assemble(argv[0]))
   109  		errorexit();
   110  	exits(0);
   111  }
   112  
   113  int
   114  assemble(char *file)
   115  {
   116  	char *ofile, *p;
   117  	int i, of;
   118  
   119  	ofile = alloc(strlen(file)+3); // +3 for .x\0 (x=thechar)
   120  	strcpy(ofile, file);
   121  	p = utfrrune(ofile, pathchar());
   122  	if(p) {
   123  		include[0] = ofile;
   124  		*p++ = 0;
   125  	} else
   126  		p = ofile;
   127  	if(outfile == 0) {
   128  		outfile = p;
   129  		if(outfile){
   130  			p = utfrrune(outfile, '.');
   131  			if(p)
   132  				if(p[1] == 's' && p[2] == 0)
   133  					p[0] = 0;
   134  			p = utfrune(outfile, 0);
   135  			p[0] = '.';
   136  			p[1] = thechar;
   137  			p[2] = 0;
   138  		} else
   139  			outfile = "/dev/null";
   140  	}
   141  
   142  	of = create(outfile, OWRITE, 0664);
   143  	if(of < 0) {
   144  		yyerror("%ca: cannot create %s", thechar, outfile);
   145  		errorexit();
   146  	}
   147  	Binit(&obuf, of, OWRITE);
   148  
   149  	pass = 1;
   150  	pinit(file);
   151  
   152  	Bprint(&obuf, "go object %s %s %s\n", getgoos(), thestring, getgoversion());
   153  
   154  	for(i=0; i<nDlist; i++)
   155  		dodefine(Dlist[i]);
   156  	yyparse();
   157  	if(nerrors) {
   158  		cclean();
   159  		return nerrors;
   160  	}
   161  
   162  	Bprint(&obuf, "\n!\n");
   163  
   164  	pass = 2;
   165  	outhist();
   166  	pinit(file);
   167  	for(i=0; i<nDlist; i++)
   168  		dodefine(Dlist[i]);
   169  	yyparse();
   170  	cclean();
   171  	return nerrors;
   172  }
   173  
   174  struct
   175  {
   176  	char	*name;
   177  	ushort	type;
   178  	ushort	value;
   179  } itab[] =
   180  {
   181  	"SP",		LSP,	D_AUTO,
   182  	"SB",		LSB,	D_EXTERN,
   183  	"FP",		LFP,	D_PARAM,
   184  	"PC",		LPC,	D_BRANCH,
   185  
   186  	"AL",		LBREG,	D_AL,
   187  	"CL",		LBREG,	D_CL,
   188  	"DL",		LBREG,	D_DL,
   189  	"BL",		LBREG,	D_BL,
   190  	"AH",		LBREG,	D_AH,
   191  	"CH",		LBREG,	D_CH,
   192  	"DH",		LBREG,	D_DH,
   193  	"BH",		LBREG,	D_BH,
   194  
   195  	"AX",		LLREG,	D_AX,
   196  	"CX",		LLREG,	D_CX,
   197  	"DX",		LLREG,	D_DX,
   198  	"BX",		LLREG,	D_BX,
   199  /*	"SP",		LLREG,	D_SP,	*/
   200  	"BP",		LLREG,	D_BP,
   201  	"SI",		LLREG,	D_SI,
   202  	"DI",		LLREG,	D_DI,
   203  
   204  	"F0",		LFREG,	D_F0+0,
   205  	"F1",		LFREG,	D_F0+1,
   206  	"F2",		LFREG,	D_F0+2,
   207  	"F3",		LFREG,	D_F0+3,
   208  	"F4",		LFREG,	D_F0+4,
   209  	"F5",		LFREG,	D_F0+5,
   210  	"F6",		LFREG,	D_F0+6,
   211  	"F7",		LFREG,	D_F0+7,
   212  
   213  	"X0",		LXREG,	D_X0+0,
   214  	"X1",		LXREG,	D_X0+1,
   215  	"X2",		LXREG,	D_X0+2,
   216  	"X3",		LXREG,	D_X0+3,
   217  	"X4",		LXREG,	D_X0+4,
   218  	"X5",		LXREG,	D_X0+5,
   219  	"X6",		LXREG,	D_X0+6,
   220  	"X7",		LXREG,	D_X0+7,
   221  
   222  	"CS",		LSREG,	D_CS,
   223  	"SS",		LSREG,	D_SS,
   224  	"DS",		LSREG,	D_DS,
   225  	"ES",		LSREG,	D_ES,
   226  	"FS",		LSREG,	D_FS,
   227  	"GS",		LSREG,	D_GS,
   228  
   229  	"GDTR",		LBREG,	D_GDTR,
   230  	"IDTR",		LBREG,	D_IDTR,
   231  	"LDTR",		LBREG,	D_LDTR,
   232  	"MSW",		LBREG,	D_MSW,
   233  	"TASK",		LBREG,	D_TASK,
   234  
   235  	"CR0",		LBREG,	D_CR+0,
   236  	"CR1",		LBREG,	D_CR+1,
   237  	"CR2",		LBREG,	D_CR+2,
   238  	"CR3",		LBREG,	D_CR+3,
   239  	"CR4",		LBREG,	D_CR+4,
   240  	"CR5",		LBREG,	D_CR+5,
   241  	"CR6",		LBREG,	D_CR+6,
   242  	"CR7",		LBREG,	D_CR+7,
   243  
   244  	"DR0",		LBREG,	D_DR+0,
   245  	"DR1",		LBREG,	D_DR+1,
   246  	"DR2",		LBREG,	D_DR+2,
   247  	"DR3",		LBREG,	D_DR+3,
   248  	"DR4",		LBREG,	D_DR+4,
   249  	"DR5",		LBREG,	D_DR+5,
   250  	"DR6",		LBREG,	D_DR+6,
   251  	"DR7",		LBREG,	D_DR+7,
   252  
   253  	"TR0",		LBREG,	D_TR+0,
   254  	"TR1",		LBREG,	D_TR+1,
   255  	"TR2",		LBREG,	D_TR+2,
   256  	"TR3",		LBREG,	D_TR+3,
   257  	"TR4",		LBREG,	D_TR+4,
   258  	"TR5",		LBREG,	D_TR+5,
   259  	"TR6",		LBREG,	D_TR+6,
   260  	"TR7",		LBREG,	D_TR+7,
   261  
   262  	"AAA",		LTYPE0,	AAAA,
   263  	"AAD",		LTYPE0,	AAAD,
   264  	"AAM",		LTYPE0,	AAAM,
   265  	"AAS",		LTYPE0,	AAAS,
   266  	"ADCB",		LTYPE3,	AADCB,
   267  	"ADCL",		LTYPE3,	AADCL,
   268  	"ADCW",		LTYPE3,	AADCW,
   269  	"ADDB",		LTYPE3,	AADDB,
   270  	"ADDL",		LTYPE3,	AADDL,
   271  	"ADDW",		LTYPE3,	AADDW,
   272  	"ADJSP",	LTYPE2,	AADJSP,
   273  	"ANDB",		LTYPE3,	AANDB,
   274  	"ANDL",		LTYPE3,	AANDL,
   275  	"ANDW",		LTYPE3,	AANDW,
   276  	"ARPL",		LTYPE3,	AARPL,
   277  	"BOUNDL",	LTYPE3,	ABOUNDL,
   278  	"BOUNDW",	LTYPE3,	ABOUNDW,
   279  	"BSFL",		LTYPE3,	ABSFL,
   280  	"BSFW",		LTYPE3,	ABSFW,
   281  	"BSRL",		LTYPE3,	ABSRL,
   282  	"BSRW",		LTYPE3,	ABSRW,
   283  	"BSWAPL",	LTYPE1,	ABSWAPL,
   284  	"BTCL",		LTYPE3,	ABTCL,
   285  	"BTCW",		LTYPE3,	ABTCW,
   286  	"BTL",		LTYPE3,	ABTL,
   287  	"BTRL",		LTYPE3,	ABTRL,
   288  	"BTRW",		LTYPE3,	ABTRW,
   289  	"BTSL",		LTYPE3,	ABTSL,
   290  	"BTSW",		LTYPE3,	ABTSW,
   291  	"BTW",		LTYPE3,	ABTW,
   292  	"BYTE",		LTYPE2,	ABYTE,
   293  	"CALL",		LTYPEC,	ACALL,
   294  	"CLC",		LTYPE0,	ACLC,
   295  	"CLD",		LTYPE0,	ACLD,
   296  	"CLI",		LTYPE0,	ACLI,
   297  	"CLTS",		LTYPE0,	ACLTS,
   298  	"CMC",		LTYPE0,	ACMC,
   299  	"CMPB",		LTYPE4,	ACMPB,
   300  	"CMPL",		LTYPE4,	ACMPL,
   301  	"CMPW",		LTYPE4,	ACMPW,
   302  	"CMPSB",	LTYPE0,	ACMPSB,
   303  	"CMPSL",	LTYPE0,	ACMPSL,
   304  	"CMPSW",	LTYPE0,	ACMPSW,
   305  	"CMPXCHG8B",	LTYPE1,	ACMPXCHG8B,
   306  	"CMPXCHGB",	LTYPE3,	ACMPXCHGB,
   307  	"CMPXCHGL",	LTYPE3,	ACMPXCHGL,
   308  	"CMPXCHGW",	LTYPE3,	ACMPXCHGW,
   309  	"CPUID",	LTYPE0,	ACPUID,
   310  	"DAA",		LTYPE0,	ADAA,
   311  	"DAS",		LTYPE0,	ADAS,
   312  	"DATA",		LTYPED,	ADATA,
   313  	"DECB",		LTYPE1,	ADECB,
   314  	"DECL",		LTYPE1,	ADECL,
   315  	"DECW",		LTYPE1,	ADECW,
   316  	"DIVB",		LTYPE2,	ADIVB,
   317  	"DIVL",		LTYPE2,	ADIVL,
   318  	"DIVW",		LTYPE2,	ADIVW,
   319  	"END",		LTYPE0,	AEND,
   320  	"ENTER",	LTYPE2,	AENTER,
   321  	"GLOBL",	LTYPEG,	AGLOBL,
   322  	"HLT",		LTYPE0,	AHLT,
   323  	"IDIVB",	LTYPE2,	AIDIVB,
   324  	"IDIVL",	LTYPE2,	AIDIVL,
   325  	"IDIVW",	LTYPE2,	AIDIVW,
   326  	"IMULB",	LTYPE2,	AIMULB,
   327  	"IMULL",	LTYPEI,	AIMULL,
   328  	"IMULW",	LTYPEI,	AIMULW,
   329  	"INB",		LTYPE0,	AINB,
   330  	"INL",		LTYPE0,	AINL,
   331  	"INW",		LTYPE0,	AINW,
   332  	"INCB",		LTYPE1,	AINCB,
   333  	"INCL",		LTYPE1,	AINCL,
   334  	"INCW",		LTYPE1,	AINCW,
   335  	"INSB",		LTYPE0,	AINSB,
   336  	"INSL",		LTYPE0,	AINSL,
   337  	"INSW",		LTYPE0,	AINSW,
   338  	"INT",		LTYPE2,	AINT,
   339  	"INTO",		LTYPE0,	AINTO,
   340  	"IRETL",	LTYPE0,	AIRETL,
   341  	"IRETW",	LTYPE0,	AIRETW,
   342  
   343  	"JOS",		LTYPER,	AJOS,
   344  	"JO",		LTYPER,	AJOS,	/* alternate */
   345  	"JOC",		LTYPER,	AJOC,
   346  	"JNO",		LTYPER,	AJOC,	/* alternate */
   347  	"JCS",		LTYPER,	AJCS,
   348  	"JB",		LTYPER,	AJCS,	/* alternate */
   349  	"JC",		LTYPER,	AJCS,	/* alternate */
   350  	"JNAE",		LTYPER,	AJCS,	/* alternate */
   351  	"JLO",		LTYPER,	AJCS,	/* alternate */
   352  	"JCC",		LTYPER,	AJCC,
   353  	"JAE",		LTYPER,	AJCC,	/* alternate */
   354  	"JNB",		LTYPER,	AJCC,	/* alternate */
   355  	"JNC",		LTYPER,	AJCC,	/* alternate */
   356  	"JHS",		LTYPER,	AJCC,	/* alternate */
   357  	"JEQ",		LTYPER,	AJEQ,
   358  	"JE",		LTYPER,	AJEQ,	/* alternate */
   359  	"JZ",		LTYPER,	AJEQ,	/* alternate */
   360  	"JNE",		LTYPER,	AJNE,
   361  	"JNZ",		LTYPER,	AJNE,	/* alternate */
   362  	"JLS",		LTYPER,	AJLS,
   363  	"JBE",		LTYPER,	AJLS,	/* alternate */
   364  	"JNA",		LTYPER,	AJLS,	/* alternate */
   365  	"JHI",		LTYPER,	AJHI,
   366  	"JA",		LTYPER,	AJHI,	/* alternate */
   367  	"JNBE",		LTYPER,	AJHI,	/* alternate */
   368  	"JMI",		LTYPER,	AJMI,
   369  	"JS",		LTYPER,	AJMI,	/* alternate */
   370  	"JPL",		LTYPER,	AJPL,
   371  	"JNS",		LTYPER,	AJPL,	/* alternate */
   372  	"JPS",		LTYPER,	AJPS,
   373  	"JP",		LTYPER,	AJPS,	/* alternate */
   374  	"JPE",		LTYPER,	AJPS,	/* alternate */
   375  	"JPC",		LTYPER,	AJPC,
   376  	"JNP",		LTYPER,	AJPC,	/* alternate */
   377  	"JPO",		LTYPER,	AJPC,	/* alternate */
   378  	"JLT",		LTYPER,	AJLT,
   379  	"JL",		LTYPER,	AJLT,	/* alternate */
   380  	"JNGE",		LTYPER,	AJLT,	/* alternate */
   381  	"JGE",		LTYPER,	AJGE,
   382  	"JNL",		LTYPER,	AJGE,	/* alternate */
   383  	"JLE",		LTYPER,	AJLE,
   384  	"JNG",		LTYPER,	AJLE,	/* alternate */
   385  	"JGT",		LTYPER,	AJGT,
   386  	"JG",		LTYPER,	AJGT,	/* alternate */
   387  	"JNLE",		LTYPER,	AJGT,	/* alternate */
   388  
   389  	"JCXZL",	LTYPER,	AJCXZL,
   390  	"JCXZW",	LTYPER,	AJCXZW,
   391  	"JMP",		LTYPEC,	AJMP,
   392  	"LAHF",		LTYPE0,	ALAHF,
   393  	"LARL",		LTYPE3,	ALARL,
   394  	"LARW",		LTYPE3,	ALARW,
   395  	"LEAL",		LTYPE3,	ALEAL,
   396  	"LEAW",		LTYPE3,	ALEAW,
   397  	"LEAVEL",	LTYPE0,	ALEAVEL,
   398  	"LEAVEW",	LTYPE0,	ALEAVEW,
   399  	"LOCK",		LTYPE0,	ALOCK,
   400  	"LODSB",	LTYPE0,	ALODSB,
   401  	"LODSL",	LTYPE0,	ALODSL,
   402  	"LODSW",	LTYPE0,	ALODSW,
   403  	"LONG",		LTYPE2,	ALONG,
   404  	"LOOP",		LTYPER,	ALOOP,
   405  	"LOOPEQ",	LTYPER,	ALOOPEQ,
   406  	"LOOPNE",	LTYPER,	ALOOPNE,
   407  	"LSLL",		LTYPE3,	ALSLL,
   408  	"LSLW",		LTYPE3,	ALSLW,
   409  	"MOVB",		LTYPE3,	AMOVB,
   410  	"MOVL",		LTYPEM,	AMOVL,
   411  	"MOVW",		LTYPEM,	AMOVW,
   412  	"MOVQ",		LTYPEM, AMOVQ,
   413  	"MOVBLSX",	LTYPE3, AMOVBLSX,
   414  	"MOVBLZX",	LTYPE3, AMOVBLZX,
   415  	"MOVBWSX",	LTYPE3, AMOVBWSX,
   416  	"MOVBWZX",	LTYPE3, AMOVBWZX,
   417  	"MOVWLSX",	LTYPE3, AMOVWLSX,
   418  	"MOVWLZX",	LTYPE3, AMOVWLZX,
   419  	"MOVSB",	LTYPE0,	AMOVSB,
   420  	"MOVSL",	LTYPE0,	AMOVSL,
   421  	"MOVSW",	LTYPE0,	AMOVSW,
   422  	"MULB",		LTYPE2,	AMULB,
   423  	"MULL",		LTYPE2,	AMULL,
   424  	"MULW",		LTYPE2,	AMULW,
   425  	"NEGB",		LTYPE1,	ANEGB,
   426  	"NEGL",		LTYPE1,	ANEGL,
   427  	"NEGW",		LTYPE1,	ANEGW,
   428  	"NOP",		LTYPEN,	ANOP,
   429  	"NOTB",		LTYPE1,	ANOTB,
   430  	"NOTL",		LTYPE1,	ANOTL,
   431  	"NOTW",		LTYPE1,	ANOTW,
   432  	"ORB",		LTYPE3,	AORB,
   433  	"ORL",		LTYPE3,	AORL,
   434  	"ORW",		LTYPE3,	AORW,
   435  	"OUTB",		LTYPE0,	AOUTB,
   436  	"OUTL",		LTYPE0,	AOUTL,
   437  	"OUTW",		LTYPE0,	AOUTW,
   438  	"OUTSB",	LTYPE0,	AOUTSB,
   439  	"OUTSL",	LTYPE0,	AOUTSL,
   440  	"OUTSW",	LTYPE0,	AOUTSW,
   441  	"PAUSE",	LTYPEN,	APAUSE,
   442  	"PINSRD",	LTYPEX,	APINSRD,
   443  	"POPAL",	LTYPE0,	APOPAL,
   444  	"POPAW",	LTYPE0,	APOPAW,
   445  	"POPFL",	LTYPE0,	APOPFL,
   446  	"POPFW",	LTYPE0,	APOPFW,
   447  	"POPL",		LTYPE1,	APOPL,
   448  	"POPW",		LTYPE1,	APOPW,
   449  	"PUSHAL",	LTYPE0,	APUSHAL,
   450  	"PUSHAW",	LTYPE0,	APUSHAW,
   451  	"PUSHFL",	LTYPE0,	APUSHFL,
   452  	"PUSHFW",	LTYPE0,	APUSHFW,
   453  	"PUSHL",	LTYPE2,	APUSHL,
   454  	"PUSHW",	LTYPE2,	APUSHW,
   455  	"RCLB",		LTYPE3,	ARCLB,
   456  	"RCLL",		LTYPE3,	ARCLL,
   457  	"RCLW",		LTYPE3,	ARCLW,
   458  	"RCRB",		LTYPE3,	ARCRB,
   459  	"RCRL",		LTYPE3,	ARCRL,
   460  	"RCRW",		LTYPE3,	ARCRW,
   461  	"RDTSC",	LTYPE0,	ARDTSC,
   462  	"REP",		LTYPE0,	AREP,
   463  	"REPN",		LTYPE0,	AREPN,
   464  	"RET",		LTYPE0,	ARET,
   465  	"ROLB",		LTYPE3,	AROLB,
   466  	"ROLL",		LTYPE3,	AROLL,
   467  	"ROLW",		LTYPE3,	AROLW,
   468  	"RORB",		LTYPE3,	ARORB,
   469  	"RORL",		LTYPE3,	ARORL,
   470  	"RORW",		LTYPE3,	ARORW,
   471  	"SAHF",		LTYPE0,	ASAHF,
   472  	"SALB",		LTYPE3,	ASALB,
   473  	"SALL",		LTYPE3,	ASALL,
   474  	"SALW",		LTYPE3,	ASALW,
   475  	"SARB",		LTYPE3,	ASARB,
   476  	"SARL",		LTYPE3,	ASARL,
   477  	"SARW",		LTYPE3,	ASARW,
   478  	"SBBB",		LTYPE3,	ASBBB,
   479  	"SBBL",		LTYPE3,	ASBBL,
   480  	"SBBW",		LTYPE3,	ASBBW,
   481  	"SCASB",	LTYPE0,	ASCASB,
   482  	"SCASL",	LTYPE0,	ASCASL,
   483  	"SCASW",	LTYPE0,	ASCASW,
   484  	"SETCC",	LTYPE1,	ASETCC,
   485  	"SETCS",	LTYPE1,	ASETCS,
   486  	"SETEQ",	LTYPE1,	ASETEQ,
   487  	"SETGE",	LTYPE1,	ASETGE,
   488  	"SETGT",	LTYPE1,	ASETGT,
   489  	"SETHI",	LTYPE1,	ASETHI,
   490  	"SETLE",	LTYPE1,	ASETLE,
   491  	"SETLS",	LTYPE1,	ASETLS,
   492  	"SETLT",	LTYPE1,	ASETLT,
   493  	"SETMI",	LTYPE1,	ASETMI,
   494  	"SETNE",	LTYPE1,	ASETNE,
   495  	"SETOC",	LTYPE1,	ASETOC,
   496  	"SETOS",	LTYPE1,	ASETOS,
   497  	"SETPC",	LTYPE1,	ASETPC,
   498  	"SETPL",	LTYPE1,	ASETPL,
   499  	"SETPS",	LTYPE1,	ASETPS,
   500  	"CDQ",		LTYPE0,	ACDQ,
   501  	"CWD",		LTYPE0,	ACWD,
   502  	"SHLB",		LTYPE3,	ASHLB,
   503  	"SHLL",		LTYPES,	ASHLL,
   504  	"SHLW",		LTYPES,	ASHLW,
   505  	"SHRB",		LTYPE3,	ASHRB,
   506  	"SHRL",		LTYPES,	ASHRL,
   507  	"SHRW",		LTYPES,	ASHRW,
   508  	"STC",		LTYPE0,	ASTC,
   509  	"STD",		LTYPE0,	ASTD,
   510  	"STI",		LTYPE0,	ASTI,
   511  	"STOSB",	LTYPE0,	ASTOSB,
   512  	"STOSL",	LTYPE0,	ASTOSL,
   513  	"STOSW",	LTYPE0,	ASTOSW,
   514  	"SUBB",		LTYPE3,	ASUBB,
   515  	"SUBL",		LTYPE3,	ASUBL,
   516  	"SUBW",		LTYPE3,	ASUBW,
   517  	"SYSCALL",	LTYPE0,	ASYSCALL,
   518  	"TESTB",	LTYPE3,	ATESTB,
   519  	"TESTL",	LTYPE3,	ATESTL,
   520  	"TESTW",	LTYPE3,	ATESTW,
   521  	"TEXT",		LTYPET,	ATEXT,
   522  	"VERR",		LTYPE2,	AVERR,
   523  	"VERW",		LTYPE2,	AVERW,
   524  	"WAIT",		LTYPE0,	AWAIT,
   525  	"WORD",		LTYPE2,	AWORD,
   526  	"XADDB",	LTYPE3,	AXADDB,
   527  	"XADDL",	LTYPE3,	AXADDL,
   528  	"XADDW",	LTYPE3,	AXADDW,
   529  	"XCHGB",	LTYPE3,	AXCHGB,
   530  	"XCHGL",	LTYPE3,	AXCHGL,
   531  	"XCHGW",	LTYPE3,	AXCHGW,
   532  	"XLAT",		LTYPE2,	AXLAT,
   533  	"XORB",		LTYPE3,	AXORB,
   534  	"XORL",		LTYPE3,	AXORL,
   535  	"XORW",		LTYPE3,	AXORW,
   536  
   537  	"CMOVLCC",	LTYPE3,	ACMOVLCC,
   538  	"CMOVLCS",	LTYPE3,	ACMOVLCS,
   539  	"CMOVLEQ",	LTYPE3,	ACMOVLEQ,
   540  	"CMOVLGE",	LTYPE3,	ACMOVLGE,
   541  	"CMOVLGT",	LTYPE3,	ACMOVLGT,
   542  	"CMOVLHI",	LTYPE3,	ACMOVLHI,
   543  	"CMOVLLE",	LTYPE3,	ACMOVLLE,
   544  	"CMOVLLS",	LTYPE3,	ACMOVLLS,
   545  	"CMOVLLT",	LTYPE3,	ACMOVLLT,
   546  	"CMOVLMI",	LTYPE3,	ACMOVLMI,
   547  	"CMOVLNE",	LTYPE3,	ACMOVLNE,
   548  	"CMOVLOC",	LTYPE3,	ACMOVLOC,
   549  	"CMOVLOS",	LTYPE3,	ACMOVLOS,
   550  	"CMOVLPC",	LTYPE3,	ACMOVLPC,
   551  	"CMOVLPL",	LTYPE3,	ACMOVLPL,
   552  	"CMOVLPS",	LTYPE3,	ACMOVLPS,
   553  	"CMOVWCC",	LTYPE3,	ACMOVWCC,
   554  	"CMOVWCS",	LTYPE3,	ACMOVWCS,
   555  	"CMOVWEQ",	LTYPE3,	ACMOVWEQ,
   556  	"CMOVWGE",	LTYPE3,	ACMOVWGE,
   557  	"CMOVWGT",	LTYPE3,	ACMOVWGT,
   558  	"CMOVWHI",	LTYPE3,	ACMOVWHI,
   559  	"CMOVWLE",	LTYPE3,	ACMOVWLE,
   560  	"CMOVWLS",	LTYPE3,	ACMOVWLS,
   561  	"CMOVWLT",	LTYPE3,	ACMOVWLT,
   562  	"CMOVWMI",	LTYPE3,	ACMOVWMI,
   563  	"CMOVWNE",	LTYPE3,	ACMOVWNE,
   564  	"CMOVWOC",	LTYPE3,	ACMOVWOC,
   565  	"CMOVWOS",	LTYPE3,	ACMOVWOS,
   566  	"CMOVWPC",	LTYPE3,	ACMOVWPC,
   567  	"CMOVWPL",	LTYPE3,	ACMOVWPL,
   568  	"CMOVWPS",	LTYPE3,	ACMOVWPS,
   569  
   570  	"FMOVB",	LTYPE3, AFMOVB,
   571  	"FMOVBP",	LTYPE3, AFMOVBP,
   572  	"FMOVD",	LTYPE3, AFMOVD,
   573  	"FMOVDP",	LTYPE3, AFMOVDP,
   574  	"FMOVF",	LTYPE3, AFMOVF,
   575  	"FMOVFP",	LTYPE3, AFMOVFP,
   576  	"FMOVL",	LTYPE3, AFMOVL,
   577  	"FMOVLP",	LTYPE3, AFMOVLP,
   578  	"FMOVV",	LTYPE3, AFMOVV,
   579  	"FMOVVP",	LTYPE3, AFMOVVP,
   580  	"FMOVW",	LTYPE3, AFMOVW,
   581  	"FMOVWP",	LTYPE3, AFMOVWP,
   582  	"FMOVX",	LTYPE3, AFMOVX,
   583  	"FMOVXP",	LTYPE3, AFMOVXP,
   584  	"FCMOVCC",	LTYPE3, AFCMOVCC,
   585  	"FCMOVCS",	LTYPE3, AFCMOVCS,
   586  	"FCMOVEQ",	LTYPE3, AFCMOVEQ,
   587  	"FCMOVHI",	LTYPE3, AFCMOVHI,
   588  	"FCMOVLS",	LTYPE3, AFCMOVLS,
   589  	"FCMOVNE",	LTYPE3, AFCMOVNE,
   590  	"FCMOVNU",	LTYPE3, AFCMOVNU,
   591  	"FCMOVUN",	LTYPE3, AFCMOVUN,
   592  	"FCOMB",	LTYPE3, AFCOMB,
   593  	"FCOMBP",	LTYPE3, AFCOMBP,
   594  	"FCOMD",	LTYPE3, AFCOMD,
   595  	"FCOMDP",	LTYPE3, AFCOMDP,
   596  	"FCOMDPP",	LTYPE3, AFCOMDPP,
   597  	"FCOMF",	LTYPE3, AFCOMF,
   598  	"FCOMFP",	LTYPE3, AFCOMFP,
   599  	"FCOMI",	LTYPE3, AFCOMI,
   600  	"FCOMIP",	LTYPE3, AFCOMIP,
   601  	"FCOML",	LTYPE3, AFCOML,
   602  	"FCOMLP",	LTYPE3, AFCOMLP,
   603  	"FCOMW",	LTYPE3, AFCOMW,
   604  	"FCOMWP",	LTYPE3, AFCOMWP,
   605  	"FUCOM",	LTYPE3, AFUCOM,
   606  	"FUCOMI",	LTYPE3, AFUCOMI,
   607  	"FUCOMIP",	LTYPE3, AFUCOMIP,
   608  	"FUCOMP",	LTYPE3, AFUCOMP,
   609  	"FUCOMPP",	LTYPE3, AFUCOMPP,
   610  	"FADDW",	LTYPE3, AFADDW,
   611  	"FADDL",	LTYPE3, AFADDL,
   612  	"FADDF",	LTYPE3, AFADDF,
   613  	"FADDD",	LTYPE3, AFADDD,
   614  	"FADDDP",	LTYPE3, AFADDDP,
   615  	"FSUBDP",	LTYPE3, AFSUBDP,
   616  	"FSUBW",	LTYPE3, AFSUBW,
   617  	"FSUBL",	LTYPE3, AFSUBL,
   618  	"FSUBF",	LTYPE3, AFSUBF,
   619  	"FSUBD",	LTYPE3, AFSUBD,
   620  	"FSUBRDP",	LTYPE3, AFSUBRDP,
   621  	"FSUBRW",	LTYPE3, AFSUBRW,
   622  	"FSUBRL",	LTYPE3, AFSUBRL,
   623  	"FSUBRF",	LTYPE3, AFSUBRF,
   624  	"FSUBRD",	LTYPE3, AFSUBRD,
   625  	"FMULDP",	LTYPE3, AFMULDP,
   626  	"FMULW",	LTYPE3, AFMULW,
   627  	"FMULL",	LTYPE3, AFMULL,
   628  	"FMULF",	LTYPE3, AFMULF,
   629  	"FMULD",	LTYPE3, AFMULD,
   630  	"FDIVDP",	LTYPE3, AFDIVDP,
   631  	"FDIVW",	LTYPE3, AFDIVW,
   632  	"FDIVL",	LTYPE3, AFDIVL,
   633  	"FDIVF",	LTYPE3, AFDIVF,
   634  	"FDIVD",	LTYPE3, AFDIVD,
   635  	"FDIVRDP",	LTYPE3, AFDIVRDP,
   636  	"FDIVRW",	LTYPE3, AFDIVRW,
   637  	"FDIVRL",	LTYPE3, AFDIVRL,
   638  	"FDIVRF",	LTYPE3, AFDIVRF,
   639  	"FDIVRD",	LTYPE3, AFDIVRD,
   640  	"FXCHD",	LTYPE3, AFXCHD,
   641  	"FFREE",	LTYPE1, AFFREE,
   642  	"FLDCW",	LTYPE2, AFLDCW,
   643  	"FLDENV",	LTYPE1, AFLDENV,
   644  	"FRSTOR",	LTYPE2, AFRSTOR,
   645  	"FSAVE",	LTYPE1, AFSAVE,
   646  	"FSTCW",	LTYPE1, AFSTCW,
   647  	"FSTENV",	LTYPE1, AFSTENV,
   648  	"FSTSW",	LTYPE1, AFSTSW,
   649  	"F2XM1",	LTYPE0, AF2XM1,
   650  	"FABS",		LTYPE0, AFABS,
   651  	"FCHS",		LTYPE0, AFCHS,
   652  	"FCLEX",	LTYPE0, AFCLEX,
   653  	"FCOS",		LTYPE0, AFCOS,
   654  	"FDECSTP",	LTYPE0, AFDECSTP,
   655  	"FINCSTP",	LTYPE0, AFINCSTP,
   656  	"FINIT",	LTYPE0, AFINIT,
   657  	"FLD1",		LTYPE0, AFLD1,
   658  	"FLDL2E",	LTYPE0, AFLDL2E,
   659  	"FLDL2T",	LTYPE0, AFLDL2T,
   660  	"FLDLG2",	LTYPE0, AFLDLG2,
   661  	"FLDLN2",	LTYPE0, AFLDLN2,
   662  	"FLDPI",	LTYPE0, AFLDPI,
   663  	"FLDZ",		LTYPE0, AFLDZ,
   664  	"FNOP",		LTYPE0, AFNOP,
   665  	"FPATAN",	LTYPE0, AFPATAN,
   666  	"FPREM",	LTYPE0, AFPREM,
   667  	"FPREM1",	LTYPE0, AFPREM1,
   668  	"FPTAN",	LTYPE0, AFPTAN,
   669  	"FRNDINT",	LTYPE0, AFRNDINT,
   670  	"FSCALE",	LTYPE0, AFSCALE,
   671  	"FSIN",		LTYPE0, AFSIN,
   672  	"FSINCOS",	LTYPE0, AFSINCOS,
   673  	"FSQRT",	LTYPE0, AFSQRT,
   674  	"FTST",		LTYPE0, AFTST,
   675  	"FXAM",		LTYPE0, AFXAM,
   676  	"FXTRACT",	LTYPE0, AFXTRACT,
   677  	"FYL2X",	LTYPE0, AFYL2X,
   678  	"FYL2XP1",	LTYPE0, AFYL2XP1,
   679  	"LFENCE",	LTYPE0, ALFENCE,
   680  	"MFENCE",	LTYPE0, AMFENCE,
   681  	"SFENCE",	LTYPE0, ASFENCE,
   682  	"EMMS",		LTYPE0, AEMMS,
   683  	"PREFETCHT0",		LTYPE2,	APREFETCHT0,
   684  	"PREFETCHT1",		LTYPE2,	APREFETCHT1,
   685  	"PREFETCHT2",		LTYPE2,	APREFETCHT2,
   686  	"PREFETCHNTA",		LTYPE2,	APREFETCHNTA,
   687  	"UNDEF",	LTYPE0,	AUNDEF,
   688  
   689  	"ADDPD",	LTYPE3,	AADDPD,
   690  	"ADDPS",	LTYPE3,	AADDPS,
   691  	"ADDSD",	LTYPE3,	AADDSD,
   692  	"ADDSS",	LTYPE3,	AADDSS,
   693  	"AESENC",	LTYPE3,	AAESENC,
   694  	"ANDNPD",	LTYPE3,	AANDNPD,
   695  	"ANDNPS",	LTYPE3,	AANDNPS,
   696  	"ANDPD",	LTYPE3,	AANDPD,
   697  	"ANDPS",	LTYPE3,	AANDPS,
   698  	"CMPPD",	LTYPEXC,ACMPPD,
   699  	"CMPPS",	LTYPEXC,ACMPPS,
   700  	"CMPSD",	LTYPEXC,ACMPSD,
   701  	"CMPSS",	LTYPEXC,ACMPSS,
   702  	"COMISD",	LTYPE3,	ACOMISD,
   703  	"COMISS",	LTYPE3,	ACOMISS,
   704  	"CVTPL2PD",	LTYPE3,	ACVTPL2PD,
   705  	"CVTPL2PS",	LTYPE3,	ACVTPL2PS,
   706  	"CVTPD2PL",	LTYPE3,	ACVTPD2PL,
   707  	"CVTPD2PS",	LTYPE3,	ACVTPD2PS,
   708  	"CVTPS2PL",	LTYPE3,	ACVTPS2PL,
   709  	"CVTPS2PD",	LTYPE3,	ACVTPS2PD,
   710  	"CVTSD2SL",	LTYPE3,	ACVTSD2SL,
   711  	"CVTSD2SS",	LTYPE3,	ACVTSD2SS,
   712  	"CVTSL2SD",	LTYPE3,	ACVTSL2SD,
   713  	"CVTSL2SS",	LTYPE3,	ACVTSL2SS,
   714  	"CVTSS2SD",	LTYPE3,	ACVTSS2SD,
   715  	"CVTSS2SL",	LTYPE3,	ACVTSS2SL,
   716  	"CVTTPD2PL",	LTYPE3,	ACVTTPD2PL,
   717  	"CVTTPS2PL",	LTYPE3,	ACVTTPS2PL,
   718  	"CVTTSD2SL",	LTYPE3,	ACVTTSD2SL,
   719  	"CVTTSS2SL",	LTYPE3,	ACVTTSS2SL,
   720  	"DIVPD",	LTYPE3,	ADIVPD,
   721  	"DIVPS",	LTYPE3,	ADIVPS,
   722  	"DIVSD",	LTYPE3,	ADIVSD,
   723  	"DIVSS",	LTYPE3,	ADIVSS,
   724  	"MASKMOVOU",	LTYPE3,	AMASKMOVOU,
   725  	"MASKMOVDQU",	LTYPE3,	AMASKMOVOU,	/* syn */
   726  	"MAXPD",	LTYPE3,	AMAXPD,
   727  	"MAXPS",	LTYPE3,	AMAXPS,
   728  	"MAXSD",	LTYPE3,	AMAXSD,
   729  	"MAXSS",	LTYPE3,	AMAXSS,
   730  	"MINPD",	LTYPE3,	AMINPD,
   731  	"MINPS",	LTYPE3,	AMINPS,
   732  	"MINSD",	LTYPE3,	AMINSD,
   733  	"MINSS",	LTYPE3,	AMINSS,
   734  	"MOVAPD",	LTYPE3,	AMOVAPD,
   735  	"MOVAPS",	LTYPE3,	AMOVAPS,
   736  	"MOVO",		LTYPE3,	AMOVO,
   737  	"MOVOA",	LTYPE3,	AMOVO,	/* syn */
   738  	"MOVOU",	LTYPE3,	AMOVOU,
   739  	"MOVHLPS",	LTYPE3,	AMOVHLPS,
   740  	"MOVHPD",	LTYPE3,	AMOVHPD,
   741  	"MOVHPS",	LTYPE3,	AMOVHPS,
   742  	"MOVLHPS",	LTYPE3,	AMOVLHPS,
   743  	"MOVLPD",	LTYPE3,	AMOVLPD,
   744  	"MOVLPS",	LTYPE3,	AMOVLPS,
   745  	"MOVMSKPD",	LTYPE3,	AMOVMSKPD,
   746  	"MOVMSKPS",	LTYPE3,	AMOVMSKPS,
   747  	"MOVNTO",	LTYPE3,	AMOVNTO,
   748  	"MOVNTDQ",	LTYPE3,	AMOVNTO,	/* syn */
   749  	"MOVNTPD",	LTYPE3,	AMOVNTPD,
   750  	"MOVNTPS",	LTYPE3,	AMOVNTPS,
   751  	"MOVSD",	LTYPE3,	AMOVSD,
   752  	"MOVSS",	LTYPE3,	AMOVSS,
   753  	"MOVUPD",	LTYPE3,	AMOVUPD,
   754  	"MOVUPS",	LTYPE3,	AMOVUPS,
   755  	"MULPD",	LTYPE3,	AMULPD,
   756  	"MULPS",	LTYPE3,	AMULPS,
   757  	"MULSD",	LTYPE3,	AMULSD,
   758  	"MULSS",	LTYPE3,	AMULSS,
   759  	"ORPD",		LTYPE3,	AORPD,
   760  	"ORPS",		LTYPE3,	AORPS,
   761  	"PADDQ",	LTYPE3,	APADDQ,
   762  	"PAND",		LTYPE3,	APAND,
   763  	"PCMPEQB",	LTYPE3,	APCMPEQB,
   764  	"PMAXSW",	LTYPE3,	APMAXSW,
   765  	"PMAXUB",	LTYPE3,	APMAXUB,
   766  	"PMINSW",	LTYPE3,	APMINSW,
   767  	"PMINUB",	LTYPE3,	APMINUB,
   768  	"PMOVMSKB",	LTYPE3,	APMOVMSKB,
   769  	"PSADBW",	LTYPE3,	APSADBW,
   770  	"PSHUFB",	LTYPE3, APSHUFB,
   771  	"PSUBB",	LTYPE3,	APSUBB,
   772  	"PSUBL",	LTYPE3,	APSUBL,
   773  	"PSUBQ",	LTYPE3,	APSUBQ,
   774  	"PSUBSB",	LTYPE3,	APSUBSB,
   775  	"PSUBSW",	LTYPE3,	APSUBSW,
   776  	"PSUBUSB",	LTYPE3,	APSUBUSB,
   777  	"PSUBUSW",	LTYPE3,	APSUBUSW,
   778  	"PSUBW",	LTYPE3,	APSUBW,
   779  	"PUNPCKHQDQ",	LTYPE3,	APUNPCKHQDQ,
   780  	"PUNPCKLQDQ",	LTYPE3,	APUNPCKLQDQ,
   781  	"RCPPS",	LTYPE3,	ARCPPS,
   782  	"RCPSS",	LTYPE3,	ARCPSS,
   783  	"RSQRTPS",	LTYPE3,	ARSQRTPS,
   784  	"RSQRTSS",	LTYPE3,	ARSQRTSS,
   785  	"SQRTPD",	LTYPE3,	ASQRTPD,
   786  	"SQRTPS",	LTYPE3,	ASQRTPS,
   787  	"SQRTSD",	LTYPE3,	ASQRTSD,
   788  	"SQRTSS",	LTYPE3,	ASQRTSS,
   789  	"SUBPD",	LTYPE3,	ASUBPD,
   790  	"SUBPS",	LTYPE3,	ASUBPS,
   791  	"SUBSD",	LTYPE3,	ASUBSD,
   792  	"SUBSS",	LTYPE3,	ASUBSS,
   793  	"UCOMISD",	LTYPE3,	AUCOMISD,
   794  	"UCOMISS",	LTYPE3,	AUCOMISS,
   795  	"UNPCKHPD",	LTYPE3,	AUNPCKHPD,
   796  	"UNPCKHPS",	LTYPE3,	AUNPCKHPS,
   797  	"UNPCKLPD",	LTYPE3,	AUNPCKLPD,
   798  	"UNPCKLPS",	LTYPE3,	AUNPCKLPS,
   799  	"XORPD",	LTYPE3,	AXORPD,
   800  	"XORPS",	LTYPE3,	AXORPS,
   801  	"USEFIELD",	LTYPEN, AUSEFIELD,
   802  	"PCDATA",	LTYPEPC,	APCDATA,
   803  	"FUNCDATA",	LTYPEF,	AFUNCDATA,
   804  	0
   805  };
   806  
   807  void
   808  cinit(void)
   809  {
   810  	Sym *s;
   811  	int i;
   812  
   813  	nullgen.sym = S;
   814  	nullgen.offset = 0;
   815  	if(FPCHIP)
   816  		nullgen.dval = 0;
   817  	for(i=0; i<sizeof(nullgen.sval); i++)
   818  		nullgen.sval[i] = 0;
   819  	nullgen.type = D_NONE;
   820  	nullgen.index = D_NONE;
   821  	nullgen.scale = 0;
   822  
   823  	nerrors = 0;
   824  	iostack = I;
   825  	iofree = I;
   826  	peekc = IGN;
   827  	nhunk = 0;
   828  	for(i=0; i<NHASH; i++)
   829  		hash[i] = S;
   830  	for(i=0; itab[i].name; i++) {
   831  		s = slookup(itab[i].name);
   832  		if(s->type != LNAME)
   833  			yyerror("double initialization %s", itab[i].name);
   834  		s->type = itab[i].type;
   835  		s->value = itab[i].value;
   836  	}
   837  
   838  	pathname = allocn(pathname, 0, 100);
   839  	if(getwd(pathname, 99) == 0) {
   840  		pathname = allocn(pathname, 100, 900);
   841  		if(getwd(pathname, 999) == 0)
   842  			strcpy(pathname, "/???");
   843  	}
   844  }
   845  
   846  void
   847  checkscale(int scale)
   848  {
   849  
   850  	switch(scale) {
   851  	case 1:
   852  	case 2:
   853  	case 4:
   854  	case 8:
   855  		return;
   856  	}
   857  	yyerror("scale must be 1248: %d", scale);
   858  }
   859  
   860  void
   861  syminit(Sym *s)
   862  {
   863  
   864  	s->type = LNAME;
   865  	s->value = 0;
   866  }
   867  
   868  void
   869  cclean(void)
   870  {
   871  	Gen2 g2;
   872  
   873  	g2.from = nullgen;
   874  	g2.to = nullgen;
   875  	outcode(AEND, &g2);
   876  	Bflush(&obuf);
   877  }
   878  
   879  void
   880  zname(char *n, int t, int s)
   881  {
   882  
   883  	BPUTLE2(&obuf, ANAME);		/* as(2) */
   884  	BPUTC(&obuf, t);		/* type */
   885  	BPUTC(&obuf, s);		/* sym */
   886  	while(*n) {
   887  		BPUTC(&obuf, *n);
   888  		n++;
   889  	}
   890  	BPUTC(&obuf, 0);
   891  }
   892  
   893  void
   894  zaddr(Gen *a, int s)
   895  {
   896  	int32 l;
   897  	int i, t;
   898  	char *n;
   899  	Ieee e;
   900  
   901  	t = 0;
   902  	if(a->index != D_NONE || a->scale != 0)
   903  		t |= T_INDEX;
   904  	if(a->offset != 0)
   905  		t |= T_OFFSET;
   906  	if(s != 0)
   907  		t |= T_SYM;
   908  
   909  	switch(a->type) {
   910  	default:
   911  		t |= T_TYPE;
   912  		break;
   913  	case D_FCONST:
   914  		t |= T_FCONST;
   915  		break;
   916  	case D_CONST2:
   917  		t |= T_OFFSET|T_OFFSET2;
   918  		break;
   919  	case D_SCONST:
   920  		t |= T_SCONST;
   921  		break;
   922  	case D_NONE:
   923  		break;
   924  	}
   925  	BPUTC(&obuf, t);
   926  
   927  	if(t & T_INDEX) {	/* implies index, scale */
   928  		BPUTC(&obuf, a->index);
   929  		BPUTC(&obuf, a->scale);
   930  	}
   931  	if(t & T_OFFSET) {	/* implies offset */
   932  		l = a->offset;
   933  		BPUTLE4(&obuf, l);
   934  	}
   935  	if(t & T_OFFSET2) {
   936  		l = a->offset2;
   937  		BPUTLE4(&obuf, l);
   938  	}
   939  	if(t & T_SYM)		/* implies sym */
   940  		BPUTC(&obuf, s);
   941  	if(t & T_FCONST) {
   942  		ieeedtod(&e, a->dval);
   943  		BPUTLE4(&obuf, e.l);
   944  		BPUTLE4(&obuf, e.h);
   945  		return;
   946  	}
   947  	if(t & T_SCONST) {
   948  		n = a->sval;
   949  		for(i=0; i<NSNAME; i++) {
   950  			BPUTC(&obuf, *n);
   951  			n++;
   952  		}
   953  		return;
   954  	}
   955  	if(t & T_TYPE)
   956  		BPUTC(&obuf, a->type);
   957  }
   958  
   959  void
   960  outcode(int a, Gen2 *g2)
   961  {
   962  	int sf, st, t;
   963  	Sym *s;
   964  
   965  	if(pass == 1)
   966  		goto out;
   967  
   968  jackpot:
   969  	sf = 0;
   970  	s = g2->from.sym;
   971  	while(s != S) {
   972  		sf = s->sym;
   973  		if(sf < 0 || sf >= NSYM)
   974  			sf = 0;
   975  		t = g2->from.type;
   976  		if(t == D_ADDR)
   977  			t = g2->from.index;
   978  		if(h[sf].type == t)
   979  		if(h[sf].sym == s)
   980  			break;
   981  		zname(s->name, t, sym);
   982  		s->sym = sym;
   983  		h[sym].sym = s;
   984  		h[sym].type = t;
   985  		sf = sym;
   986  		sym++;
   987  		if(sym >= NSYM)
   988  			sym = 1;
   989  		break;
   990  	}
   991  	st = 0;
   992  	s = g2->to.sym;
   993  	while(s != S) {
   994  		st = s->sym;
   995  		if(st < 0 || st >= NSYM)
   996  			st = 0;
   997  		t = g2->to.type;
   998  		if(t == D_ADDR)
   999  			t = g2->to.index;
  1000  		if(h[st].type == t)
  1001  		if(h[st].sym == s)
  1002  			break;
  1003  		zname(s->name, t, sym);
  1004  		s->sym = sym;
  1005  		h[sym].sym = s;
  1006  		h[sym].type = t;
  1007  		st = sym;
  1008  		sym++;
  1009  		if(sym >= NSYM)
  1010  			sym = 1;
  1011  		if(st == sf)
  1012  			goto jackpot;
  1013  		break;
  1014  	}
  1015  	BPUTLE2(&obuf, a);
  1016  	BPUTLE4(&obuf, stmtline);
  1017  	zaddr(&g2->from, sf);
  1018  	zaddr(&g2->to, st);
  1019  
  1020  out:
  1021  	if(a != AGLOBL && a != ADATA)
  1022  		pc++;
  1023  }
  1024  
  1025  void
  1026  outhist(void)
  1027  {
  1028  	Gen g;
  1029  	Hist *h;
  1030  	char *p, *q, *op, c;
  1031  	int n;
  1032  	char *tofree;
  1033  	static int first = 1;
  1034  	static char *goroot, *goroot_final;
  1035  
  1036  	if(first) {
  1037  		// Decide whether we need to rewrite paths from $GOROOT to $GOROOT_FINAL.
  1038  		first = 0;
  1039  		goroot = getenv("GOROOT");
  1040  		goroot_final = getenv("GOROOT_FINAL");
  1041  		if(goroot == nil)
  1042  			goroot = "";
  1043  		if(goroot_final == nil)
  1044  			goroot_final = goroot;
  1045  		if(strcmp(goroot, goroot_final) == 0) {
  1046  			goroot = nil;
  1047  			goroot_final = nil;
  1048  		}
  1049  	}
  1050  
  1051  	tofree = nil;
  1052  
  1053  	g = nullgen;
  1054  	c = pathchar();
  1055  	for(h = hist; h != H; h = h->link) {
  1056  		p = h->name;
  1057  		if(p != nil && goroot != nil) {
  1058  			n = strlen(goroot);
  1059  			if(strncmp(p, goroot, strlen(goroot)) == 0 && p[n] == '/') {
  1060  				tofree = smprint("%s%s", goroot_final, p+n);
  1061  				p = tofree;
  1062  			}
  1063  		}
  1064  		op = 0;
  1065  		if(systemtype(Windows) && p && p[1] == ':'){
  1066  			c = p[2];
  1067  		} else if(p && p[0] != c && h->offset == 0 && pathname){
  1068  			if(systemtype(Windows) && pathname[1] == ':') {
  1069  				op = p;
  1070  				p = pathname;
  1071  				c = p[2];
  1072  			} else if(pathname[0] == c){
  1073  				op = p;
  1074  				p = pathname;
  1075  			}
  1076  		}
  1077  		while(p) {
  1078  			q = strchr(p, c);
  1079  			if(q) {
  1080  				n = q-p;
  1081  				if(n == 0){
  1082  					n = 1;	/* leading "/" */
  1083  					*p = '/';	/* don't emit "\" on windows */
  1084  				}
  1085  				q++;
  1086  			} else {
  1087  				n = strlen(p);
  1088  				q = 0;
  1089  			}
  1090  			if(n) {
  1091  				BPUTLE2(&obuf, ANAME);
  1092  				BPUTC(&obuf, D_FILE);	/* type */
  1093  				BPUTC(&obuf, 1);	/* sym */
  1094  				BPUTC(&obuf, '<');
  1095  				Bwrite(&obuf, p, n);
  1096  				BPUTC(&obuf, 0);
  1097  			}
  1098  			p = q;
  1099  			if(p == 0 && op) {
  1100  				p = op;
  1101  				op = 0;
  1102  			}
  1103  		}
  1104  		g.offset = h->offset;
  1105  
  1106  		BPUTLE2(&obuf, AHISTORY);
  1107  		BPUTLE4(&obuf, h->line);
  1108  		zaddr(&nullgen, 0);
  1109  		zaddr(&g, 0);
  1110  
  1111  		if(tofree) {
  1112  			free(tofree);
  1113  			tofree = nil;
  1114  		}
  1115  	}
  1116  }
  1117  
  1118  #include "../cc/lexbody"
  1119  #include "../cc/macbody"