github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/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  
   803  	0
   804  };
   805  
   806  void
   807  cinit(void)
   808  {
   809  	Sym *s;
   810  	int i;
   811  
   812  	nullgen.sym = S;
   813  	nullgen.offset = 0;
   814  	if(FPCHIP)
   815  		nullgen.dval = 0;
   816  	for(i=0; i<sizeof(nullgen.sval); i++)
   817  		nullgen.sval[i] = 0;
   818  	nullgen.type = D_NONE;
   819  	nullgen.index = D_NONE;
   820  	nullgen.scale = 0;
   821  
   822  	nerrors = 0;
   823  	iostack = I;
   824  	iofree = I;
   825  	peekc = IGN;
   826  	nhunk = 0;
   827  	for(i=0; i<NHASH; i++)
   828  		hash[i] = S;
   829  	for(i=0; itab[i].name; i++) {
   830  		s = slookup(itab[i].name);
   831  		if(s->type != LNAME)
   832  			yyerror("double initialization %s", itab[i].name);
   833  		s->type = itab[i].type;
   834  		s->value = itab[i].value;
   835  	}
   836  
   837  	pathname = allocn(pathname, 0, 100);
   838  	if(getwd(pathname, 99) == 0) {
   839  		pathname = allocn(pathname, 100, 900);
   840  		if(getwd(pathname, 999) == 0)
   841  			strcpy(pathname, "/???");
   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  	Gen2 g2;
   871  
   872  	g2.from = nullgen;
   873  	g2.to = nullgen;
   874  	outcode(AEND, &g2);
   875  	Bflush(&obuf);
   876  }
   877  
   878  void
   879  zname(char *n, int t, int s)
   880  {
   881  
   882  	Bputc(&obuf, ANAME);		/* as(2) */
   883  	Bputc(&obuf, ANAME>>8);
   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  		Bputc(&obuf, l);
   934  		Bputc(&obuf, l>>8);
   935  		Bputc(&obuf, l>>16);
   936  		Bputc(&obuf, l>>24);
   937  	}
   938  	if(t & T_OFFSET2) {
   939  		l = a->offset2;
   940  		Bputc(&obuf, l);
   941  		Bputc(&obuf, l>>8);
   942  		Bputc(&obuf, l>>16);
   943  		Bputc(&obuf, l>>24);
   944  	}
   945  	if(t & T_SYM)		/* implies sym */
   946  		Bputc(&obuf, s);
   947  	if(t & T_FCONST) {
   948  		ieeedtod(&e, a->dval);
   949  		l = e.l;
   950  		Bputc(&obuf, l);
   951  		Bputc(&obuf, l>>8);
   952  		Bputc(&obuf, l>>16);
   953  		Bputc(&obuf, l>>24);
   954  		l = e.h;
   955  		Bputc(&obuf, l);
   956  		Bputc(&obuf, l>>8);
   957  		Bputc(&obuf, l>>16);
   958  		Bputc(&obuf, l>>24);
   959  		return;
   960  	}
   961  	if(t & T_SCONST) {
   962  		n = a->sval;
   963  		for(i=0; i<NSNAME; i++) {
   964  			Bputc(&obuf, *n);
   965  			n++;
   966  		}
   967  		return;
   968  	}
   969  	if(t & T_TYPE)
   970  		Bputc(&obuf, a->type);
   971  }
   972  
   973  void
   974  outcode(int a, Gen2 *g2)
   975  {
   976  	int sf, st, t;
   977  	Sym *s;
   978  
   979  	if(pass == 1)
   980  		goto out;
   981  
   982  jackpot:
   983  	sf = 0;
   984  	s = g2->from.sym;
   985  	while(s != S) {
   986  		sf = s->sym;
   987  		if(sf < 0 || sf >= NSYM)
   988  			sf = 0;
   989  		t = g2->from.type;
   990  		if(t == D_ADDR)
   991  			t = g2->from.index;
   992  		if(h[sf].type == t)
   993  		if(h[sf].sym == s)
   994  			break;
   995  		zname(s->name, t, sym);
   996  		s->sym = sym;
   997  		h[sym].sym = s;
   998  		h[sym].type = t;
   999  		sf = sym;
  1000  		sym++;
  1001  		if(sym >= NSYM)
  1002  			sym = 1;
  1003  		break;
  1004  	}
  1005  	st = 0;
  1006  	s = g2->to.sym;
  1007  	while(s != S) {
  1008  		st = s->sym;
  1009  		if(st < 0 || st >= NSYM)
  1010  			st = 0;
  1011  		t = g2->to.type;
  1012  		if(t == D_ADDR)
  1013  			t = g2->to.index;
  1014  		if(h[st].type == t)
  1015  		if(h[st].sym == s)
  1016  			break;
  1017  		zname(s->name, t, sym);
  1018  		s->sym = sym;
  1019  		h[sym].sym = s;
  1020  		h[sym].type = t;
  1021  		st = sym;
  1022  		sym++;
  1023  		if(sym >= NSYM)
  1024  			sym = 1;
  1025  		if(st == sf)
  1026  			goto jackpot;
  1027  		break;
  1028  	}
  1029  	Bputc(&obuf, a);
  1030  	Bputc(&obuf, a>>8);
  1031  	Bputc(&obuf, stmtline);
  1032  	Bputc(&obuf, stmtline>>8);
  1033  	Bputc(&obuf, stmtline>>16);
  1034  	Bputc(&obuf, stmtline>>24);
  1035  	zaddr(&g2->from, sf);
  1036  	zaddr(&g2->to, st);
  1037  
  1038  out:
  1039  	if(a != AGLOBL && a != ADATA)
  1040  		pc++;
  1041  }
  1042  
  1043  void
  1044  outhist(void)
  1045  {
  1046  	Gen g;
  1047  	Hist *h;
  1048  	char *p, *q, *op, c;
  1049  	int n;
  1050  	char *tofree;
  1051  	static int first = 1;
  1052  	static char *goroot, *goroot_final;
  1053  
  1054  	if(first) {
  1055  		// Decide whether we need to rewrite paths from $GOROOT to $GOROOT_FINAL.
  1056  		first = 0;
  1057  		goroot = getenv("GOROOT");
  1058  		goroot_final = getenv("GOROOT_FINAL");
  1059  		if(goroot == nil)
  1060  			goroot = "";
  1061  		if(goroot_final == nil)
  1062  			goroot_final = goroot;
  1063  		if(strcmp(goroot, goroot_final) == 0) {
  1064  			goroot = nil;
  1065  			goroot_final = nil;
  1066  		}
  1067  	}
  1068  
  1069  	tofree = nil;
  1070  
  1071  	g = nullgen;
  1072  	c = pathchar();
  1073  	for(h = hist; h != H; h = h->link) {
  1074  		p = h->name;
  1075  		if(p != nil && goroot != nil) {
  1076  			n = strlen(goroot);
  1077  			if(strncmp(p, goroot, strlen(goroot)) == 0 && p[n] == '/') {
  1078  				tofree = smprint("%s%s", goroot_final, p+n);
  1079  				p = tofree;
  1080  			}
  1081  		}
  1082  		op = 0;
  1083  		if(systemtype(Windows) && p && p[1] == ':'){
  1084  			c = p[2];
  1085  		} else if(p && p[0] != c && h->offset == 0 && pathname){
  1086  			if(systemtype(Windows) && pathname[1] == ':') {
  1087  				op = p;
  1088  				p = pathname;
  1089  				c = p[2];
  1090  			} else if(pathname[0] == c){
  1091  				op = p;
  1092  				p = pathname;
  1093  			}
  1094  		}
  1095  		while(p) {
  1096  			q = strchr(p, c);
  1097  			if(q) {
  1098  				n = q-p;
  1099  				if(n == 0){
  1100  					n = 1;	/* leading "/" */
  1101  					*p = '/';	/* don't emit "\" on windows */
  1102  				}
  1103  				q++;
  1104  			} else {
  1105  				n = strlen(p);
  1106  				q = 0;
  1107  			}
  1108  			if(n) {
  1109  				Bputc(&obuf, ANAME);
  1110  				Bputc(&obuf, ANAME>>8);
  1111  				Bputc(&obuf, D_FILE);	/* type */
  1112  				Bputc(&obuf, 1);	/* sym */
  1113  				Bputc(&obuf, '<');
  1114  				Bwrite(&obuf, p, n);
  1115  				Bputc(&obuf, 0);
  1116  			}
  1117  			p = q;
  1118  			if(p == 0 && op) {
  1119  				p = op;
  1120  				op = 0;
  1121  			}
  1122  		}
  1123  		g.offset = h->offset;
  1124  
  1125  		Bputc(&obuf, AHISTORY);
  1126  		Bputc(&obuf, AHISTORY>>8);
  1127  		Bputc(&obuf, h->line);
  1128  		Bputc(&obuf, h->line>>8);
  1129  		Bputc(&obuf, h->line>>16);
  1130  		Bputc(&obuf, h->line>>24);
  1131  		zaddr(&nullgen, 0);
  1132  		zaddr(&g, 0);
  1133  
  1134  		if(tofree) {
  1135  			free(tofree);
  1136  			tofree = nil;
  1137  		}
  1138  	}
  1139  }
  1140  
  1141  #include "../cc/lexbody"
  1142  #include "../cc/macbody"