github.com/spotify/syslog-redirector-golang@v0.0.0-20140320174030-4859f03d829a/src/cmd/6a/lex.c (about)

     1  // Inferno utils/6a/lex.c
     2  // http://code.google.com/p/inferno-os/source/browse/utils/6a/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 = '6';
    67  	thestring = "amd64";
    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  	/*
   178  	 * type is the lexical type to return.  It dictates what kind of
   179  	 * operands 6a allows to follow it (in a.y) as the possible operand
   180  	 * types are handled by a grammar.  How do you know which LTYPE?
   181  	 * Either read a.y or think of an instruction that has the same
   182  	 * possible operands and look up what it takes.
   183  	 */
   184  	ushort	type;
   185  	ushort	value;
   186  } itab[] =
   187  {
   188  	"SP",		LSP,	D_AUTO,
   189  	"SB",		LSB,	D_EXTERN,
   190  	"FP",		LFP,	D_PARAM,
   191  	"PC",		LPC,	D_BRANCH,
   192  
   193  	"AL",		LBREG,	D_AL,
   194  	"CL",		LBREG,	D_CL,
   195  	"DL",		LBREG,	D_DL,
   196  	"BL",		LBREG,	D_BL,
   197  /*	"SPB",		LBREG,	D_SPB,	*/
   198  	"SIB",		LBREG,	D_SIB,
   199  	"DIB",		LBREG,	D_DIB,
   200  	"BPB",		LBREG,	D_BPB,
   201  	"R8B",		LBREG,	D_R8B,
   202  	"R9B",		LBREG,	D_R9B,
   203  	"R10B",		LBREG,	D_R10B,
   204  	"R11B",		LBREG,	D_R11B,
   205  	"R12B",		LBREG,	D_R12B,
   206  	"R13B",		LBREG,	D_R13B,
   207  	"R14B",		LBREG,	D_R14B,
   208  	"R15B",		LBREG,	D_R15B,
   209  
   210  	"AH",		LBREG,	D_AH,
   211  	"CH",		LBREG,	D_CH,
   212  	"DH",		LBREG,	D_DH,
   213  	"BH",		LBREG,	D_BH,
   214  
   215  	"AX",		LLREG,	D_AX,
   216  	"CX",		LLREG,	D_CX,
   217  	"DX",		LLREG,	D_DX,
   218  	"BX",		LLREG,	D_BX,
   219  /*	"SP",		LLREG,	D_SP,	*/
   220  	"BP",		LLREG,	D_BP,
   221  	"SI",		LLREG,	D_SI,
   222  	"DI",		LLREG,	D_DI,
   223  	"R8",		LLREG,	D_R8,
   224  	"R9",		LLREG,	D_R9,
   225  	"R10",		LLREG,	D_R10,
   226  	"R11",		LLREG,	D_R11,
   227  	"R12",		LLREG,	D_R12,
   228  	"R13",		LLREG,	D_R13,
   229  	"R14",		LLREG,	D_R14,
   230  	"R15",		LLREG,	D_R15,
   231  
   232  	"RARG",		LLREG,	REGARG,
   233  
   234  	"F0",		LFREG,	D_F0+0,
   235  	"F1",		LFREG,	D_F0+1,
   236  	"F2",		LFREG,	D_F0+2,
   237  	"F3",		LFREG,	D_F0+3,
   238  	"F4",		LFREG,	D_F0+4,
   239  	"F5",		LFREG,	D_F0+5,
   240  	"F6",		LFREG,	D_F0+6,
   241  	"F7",		LFREG,	D_F0+7,
   242  
   243  	"M0",		LMREG,	D_M0+0,
   244  	"M1",		LMREG,	D_M0+1,
   245  	"M2",		LMREG,	D_M0+2,
   246  	"M3",		LMREG,	D_M0+3,
   247  	"M4",		LMREG,	D_M0+4,
   248  	"M5",		LMREG,	D_M0+5,
   249  	"M6",		LMREG,	D_M0+6,
   250  	"M7",		LMREG,	D_M0+7,
   251  
   252  	"X0",		LXREG,	D_X0+0,
   253  	"X1",		LXREG,	D_X0+1,
   254  	"X2",		LXREG,	D_X0+2,
   255  	"X3",		LXREG,	D_X0+3,
   256  	"X4",		LXREG,	D_X0+4,
   257  	"X5",		LXREG,	D_X0+5,
   258  	"X6",		LXREG,	D_X0+6,
   259  	"X7",		LXREG,	D_X0+7,
   260  	"X8",		LXREG,	D_X0+8,
   261  	"X9",		LXREG,	D_X0+9,
   262  	"X10",		LXREG,	D_X0+10,
   263  	"X11",		LXREG,	D_X0+11,
   264  	"X12",		LXREG,	D_X0+12,
   265  	"X13",		LXREG,	D_X0+13,
   266  	"X14",		LXREG,	D_X0+14,
   267  	"X15",		LXREG,	D_X0+15,
   268  
   269  	"CS",		LSREG,	D_CS,
   270  	"SS",		LSREG,	D_SS,
   271  	"DS",		LSREG,	D_DS,
   272  	"ES",		LSREG,	D_ES,
   273  	"FS",		LSREG,	D_FS,
   274  	"GS",		LSREG,	D_GS,
   275  
   276  	"GDTR",		LBREG,	D_GDTR,
   277  	"IDTR",		LBREG,	D_IDTR,
   278  	"LDTR",		LBREG,	D_LDTR,
   279  	"MSW",		LBREG,	D_MSW,
   280  	"TASK",		LBREG,	D_TASK,
   281  
   282  	"CR0",		LBREG,	D_CR+0,
   283  	"CR1",		LBREG,	D_CR+1,
   284  	"CR2",		LBREG,	D_CR+2,
   285  	"CR3",		LBREG,	D_CR+3,
   286  	"CR4",		LBREG,	D_CR+4,
   287  	"CR5",		LBREG,	D_CR+5,
   288  	"CR6",		LBREG,	D_CR+6,
   289  	"CR7",		LBREG,	D_CR+7,
   290  	"CR8",		LBREG,	D_CR+8,
   291  	"CR9",		LBREG,	D_CR+9,
   292  	"CR10",		LBREG,	D_CR+10,
   293  	"CR11",		LBREG,	D_CR+11,
   294  	"CR12",		LBREG,	D_CR+12,
   295  	"CR13",		LBREG,	D_CR+13,
   296  	"CR14",		LBREG,	D_CR+14,
   297  	"CR15",		LBREG,	D_CR+15,
   298  
   299  	"DR0",		LBREG,	D_DR+0,
   300  	"DR1",		LBREG,	D_DR+1,
   301  	"DR2",		LBREG,	D_DR+2,
   302  	"DR3",		LBREG,	D_DR+3,
   303  	"DR4",		LBREG,	D_DR+4,
   304  	"DR5",		LBREG,	D_DR+5,
   305  	"DR6",		LBREG,	D_DR+6,
   306  	"DR7",		LBREG,	D_DR+7,
   307  
   308  	"TR0",		LBREG,	D_TR+0,
   309  	"TR1",		LBREG,	D_TR+1,
   310  	"TR2",		LBREG,	D_TR+2,
   311  	"TR3",		LBREG,	D_TR+3,
   312  	"TR4",		LBREG,	D_TR+4,
   313  	"TR5",		LBREG,	D_TR+5,
   314  	"TR6",		LBREG,	D_TR+6,
   315  	"TR7",		LBREG,	D_TR+7,
   316  
   317  	"AAA",		LTYPE0,	AAAA,
   318  	"AAD",		LTYPE0,	AAAD,
   319  	"AAM",		LTYPE0,	AAAM,
   320  	"AAS",		LTYPE0,	AAAS,
   321  	"ADCB",		LTYPE3,	AADCB,
   322  	"ADCL",		LTYPE3,	AADCL,
   323  	"ADCQ",		LTYPE3,	AADCQ,
   324  	"ADCW",		LTYPE3,	AADCW,
   325  	"ADDB",		LTYPE3,	AADDB,
   326  	"ADDL",		LTYPE3,	AADDL,
   327  	"ADDQ",		LTYPE3,	AADDQ,
   328  	"ADDW",		LTYPE3,	AADDW,
   329  	"ADJSP",	LTYPE2,	AADJSP,
   330  	"ANDB",		LTYPE3,	AANDB,
   331  	"ANDL",		LTYPE3,	AANDL,
   332  	"ANDQ",		LTYPE3,	AANDQ,
   333  	"ANDW",		LTYPE3,	AANDW,
   334  	"ARPL",		LTYPE3,	AARPL,
   335  	"BOUNDL",	LTYPE3,	ABOUNDL,
   336  	"BOUNDW",	LTYPE3,	ABOUNDW,
   337  	"BSFL",		LTYPE3,	ABSFL,
   338  	"BSFQ",		LTYPE3,	ABSFQ,
   339  	"BSFW",		LTYPE3,	ABSFW,
   340  	"BSRL",		LTYPE3,	ABSRL,
   341  	"BSRQ",		LTYPE3,	ABSRQ,
   342  	"BSRW",		LTYPE3,	ABSRW,
   343  	"BSWAPL",	LTYPE1,	ABSWAPL,
   344  	"BSWAPQ",	LTYPE1,	ABSWAPQ,
   345  	"BTCL",		LTYPE3,	ABTCL,
   346  	"BTCQ",		LTYPE3,	ABTCQ,
   347  	"BTCW",		LTYPE3,	ABTCW,
   348  	"BTL",		LTYPE3,	ABTL,
   349  	"BTQ",		LTYPE3,	ABTQ,
   350  	"BTRL",		LTYPE3,	ABTRL,
   351  	"BTRQ",		LTYPE3,	ABTRQ,
   352  	"BTRW",		LTYPE3,	ABTRW,
   353  	"BTSL",		LTYPE3,	ABTSL,
   354  	"BTSQ",		LTYPE3,	ABTSQ,
   355  	"BTSW",		LTYPE3,	ABTSW,
   356  	"BTW",		LTYPE3,	ABTW,
   357  	"BYTE",		LTYPE2,	ABYTE,
   358  	"CALL",		LTYPEC,	ACALL,
   359  	"CLC",		LTYPE0,	ACLC,
   360  	"CLD",		LTYPE0,	ACLD,
   361  	"CLI",		LTYPE0,	ACLI,
   362  	"CLTS",		LTYPE0,	ACLTS,
   363  	"CMC",		LTYPE0,	ACMC,
   364  	"CMPB",		LTYPE4,	ACMPB,
   365  	"CMPL",		LTYPE4,	ACMPL,
   366  	"CMPQ",		LTYPE4,	ACMPQ,
   367  	"CMPW",		LTYPE4,	ACMPW,
   368  	"CMPSB",	LTYPE0,	ACMPSB,
   369  	"CMPSL",	LTYPE0,	ACMPSL,
   370  	"CMPSQ",	LTYPE0,	ACMPSQ,
   371  	"CMPSW",	LTYPE0,	ACMPSW,
   372  	"CMPXCHG8B",	LTYPE1,	ACMPXCHG8B,
   373  	"CMPXCHGB",	LTYPE3,	ACMPXCHGB,	/* LTYPE3? */
   374  	"CMPXCHGL",	LTYPE3,	ACMPXCHGL,
   375  	"CMPXCHGQ",	LTYPE3,	ACMPXCHGQ,
   376  	"CMPXCHGW",	LTYPE3,	ACMPXCHGW,
   377  	"CPUID",	LTYPE0,	ACPUID,
   378  	"DAA",		LTYPE0,	ADAA,
   379  	"DAS",		LTYPE0,	ADAS,
   380  	"DATA",		LTYPED,	ADATA,
   381  	"DECB",		LTYPE1,	ADECB,
   382  	"DECL",		LTYPE1,	ADECL,
   383  	"DECQ",		LTYPE1,	ADECQ,
   384  	"DECW",		LTYPE1,	ADECW,
   385  	"DIVB",		LTYPE2,	ADIVB,
   386  	"DIVL",		LTYPE2,	ADIVL,
   387  	"DIVQ",		LTYPE2,	ADIVQ,
   388  	"DIVW",		LTYPE2,	ADIVW,
   389  	"EMMS",		LTYPE0,	AEMMS,
   390  	"END",		LTYPE0,	AEND,
   391  	"ENTER",	LTYPE2,	AENTER,
   392  	"GLOBL",	LTYPEG,	AGLOBL,
   393  	"HLT",		LTYPE0,	AHLT,
   394  	"IDIVB",	LTYPE2,	AIDIVB,
   395  	"IDIVL",	LTYPE2,	AIDIVL,
   396  	"IDIVQ",	LTYPE2,	AIDIVQ,
   397  	"IDIVW",	LTYPE2,	AIDIVW,
   398  	"IMULB",	LTYPEI,	AIMULB,
   399  	"IMULL",	LTYPEI,	AIMULL,
   400  	"IMULQ",	LTYPEI,	AIMULQ,
   401  	"IMUL3Q",	LTYPEX,	AIMUL3Q,
   402  	"IMULW",	LTYPEI,	AIMULW,
   403  	"INB",		LTYPE0,	AINB,
   404  	"INL",		LTYPE0,	AINL,
   405  	"INW",		LTYPE0,	AINW,
   406  	"INCB",		LTYPE1,	AINCB,
   407  	"INCL",		LTYPE1,	AINCL,
   408  	"INCQ",		LTYPE1,	AINCQ,
   409  	"INCW",		LTYPE1,	AINCW,
   410  	"INSB",		LTYPE0,	AINSB,
   411  	"INSL",		LTYPE0,	AINSL,
   412  	"INSW",		LTYPE0,	AINSW,
   413  	"INT",		LTYPE2,	AINT,
   414  	"INTO",		LTYPE0,	AINTO,
   415  	"INVD",		LTYPE0,	AINVD,
   416  	"INVLPG",	LTYPE2,	AINVLPG,
   417  	"IRETL",	LTYPE0,	AIRETL,
   418  	"IRETQ",	LTYPE0,	AIRETQ,
   419  	"IRETW",	LTYPE0,	AIRETW,
   420  
   421  	"JOS",		LTYPER,	AJOS,
   422  	"JO",		LTYPER,	AJOS,	/* alternate */
   423  	"JOC",		LTYPER,	AJOC,
   424  	"JNO",		LTYPER,	AJOC,	/* alternate */
   425  	"JCS",		LTYPER,	AJCS,
   426  	"JB",		LTYPER,	AJCS,	/* alternate */
   427  	"JC",		LTYPER,	AJCS,	/* alternate */
   428  	"JNAE",		LTYPER,	AJCS,	/* alternate */
   429  	"JLO",		LTYPER,	AJCS,	/* alternate */
   430  	"JCC",		LTYPER,	AJCC,
   431  	"JAE",		LTYPER,	AJCC,	/* alternate */
   432  	"JNB",		LTYPER,	AJCC,	/* alternate */
   433  	"JNC",		LTYPER,	AJCC,	/* alternate */
   434  	"JHS",		LTYPER,	AJCC,	/* alternate */
   435  	"JEQ",		LTYPER,	AJEQ,
   436  	"JE",		LTYPER,	AJEQ,	/* alternate */
   437  	"JZ",		LTYPER,	AJEQ,	/* alternate */
   438  	"JNE",		LTYPER,	AJNE,
   439  	"JNZ",		LTYPER,	AJNE,	/* alternate */
   440  	"JLS",		LTYPER,	AJLS,
   441  	"JBE",		LTYPER,	AJLS,	/* alternate */
   442  	"JNA",		LTYPER,	AJLS,	/* alternate */
   443  	"JHI",		LTYPER,	AJHI,
   444  	"JA",		LTYPER,	AJHI,	/* alternate */
   445  	"JNBE",		LTYPER,	AJHI,	/* alternate */
   446  	"JMI",		LTYPER,	AJMI,
   447  	"JS",		LTYPER,	AJMI,	/* alternate */
   448  	"JPL",		LTYPER,	AJPL,
   449  	"JNS",		LTYPER,	AJPL,	/* alternate */
   450  	"JPS",		LTYPER,	AJPS,
   451  	"JP",		LTYPER,	AJPS,	/* alternate */
   452  	"JPE",		LTYPER,	AJPS,	/* alternate */
   453  	"JPC",		LTYPER,	AJPC,
   454  	"JNP",		LTYPER,	AJPC,	/* alternate */
   455  	"JPO",		LTYPER,	AJPC,	/* alternate */
   456  	"JLT",		LTYPER,	AJLT,
   457  	"JL",		LTYPER,	AJLT,	/* alternate */
   458  	"JNGE",		LTYPER,	AJLT,	/* alternate */
   459  	"JGE",		LTYPER,	AJGE,
   460  	"JNL",		LTYPER,	AJGE,	/* alternate */
   461  	"JLE",		LTYPER,	AJLE,
   462  	"JNG",		LTYPER,	AJLE,	/* alternate */
   463  	"JGT",		LTYPER,	AJGT,
   464  	"JG",		LTYPER,	AJGT,	/* alternate */
   465  	"JNLE",		LTYPER,	AJGT,	/* alternate */
   466  	"JCXZL",	LTYPER,	AJCXZL,
   467  	"JCXZQ",	LTYPER,	AJCXZQ,
   468  	"JMP",		LTYPEC,	AJMP,
   469  	"LAHF",		LTYPE0,	ALAHF,
   470  	"LARL",		LTYPE3,	ALARL,
   471  	"LARW",		LTYPE3,	ALARW,
   472  	"LEAL",		LTYPE3,	ALEAL,
   473  	"LEAQ",		LTYPE3,	ALEAQ,
   474  	"LEAW",		LTYPE3,	ALEAW,
   475  	"LEAVEL",	LTYPE0,	ALEAVEL,
   476  	"LEAVEQ",	LTYPE0,	ALEAVEQ,
   477  	"LEAVEW",	LTYPE0,	ALEAVEW,
   478  	"LFENCE",	LTYPE0,	ALFENCE,
   479  	"LOCK",		LTYPE0,	ALOCK,
   480  	"LODSB",	LTYPE0,	ALODSB,
   481  	"LODSL",	LTYPE0,	ALODSL,
   482  	"LODSQ",	LTYPE0,	ALODSQ,
   483  	"LODSW",	LTYPE0,	ALODSW,
   484  	"LONG",		LTYPE2,	ALONG,
   485  	"LOOP",		LTYPER,	ALOOP,
   486  	"LOOPEQ",	LTYPER,	ALOOPEQ,
   487  	"LOOPNE",	LTYPER,	ALOOPNE,
   488  	"LSLL",		LTYPE3,	ALSLL,
   489  	"LSLW",		LTYPE3,	ALSLW,
   490  	"MFENCE",	LTYPE0,	AMFENCE,
   491  	"MODE",		LTYPE2,	AMODE,
   492  	"MOVB",		LTYPE3,	AMOVB,
   493  	"MOVL",		LTYPEM,	AMOVL,
   494  	"MOVQ",		LTYPEM,	AMOVQ,
   495  	"MOVW",		LTYPEM,	AMOVW,
   496  	"MOVBLSX",	LTYPE3, AMOVBLSX,
   497  	"MOVBLZX",	LTYPE3, AMOVBLZX,
   498  	"MOVBQSX",	LTYPE3,	AMOVBQSX,
   499  	"MOVBQZX",	LTYPE3,	AMOVBQZX,
   500  	"MOVBWSX",	LTYPE3, AMOVBWSX,
   501  	"MOVBWZX",	LTYPE3, AMOVBWZX,
   502  	"MOVLQSX",	LTYPE3, AMOVLQSX,
   503  	"MOVLQZX",	LTYPE3, AMOVLQZX,
   504  	"MOVNTIL",	LTYPE3,	AMOVNTIL,
   505  	"MOVNTIQ",	LTYPE3,	AMOVNTIQ,
   506  	"MOVWLSX",	LTYPE3, AMOVWLSX,
   507  	"MOVWLZX",	LTYPE3, AMOVWLZX,
   508  	"MOVWQSX",	LTYPE3,	AMOVWQSX,
   509  	"MOVWQZX",	LTYPE3,	AMOVWQZX,
   510  	"MOVSB",	LTYPE0,	AMOVSB,
   511  	"MOVSL",	LTYPE0,	AMOVSL,
   512  	"MOVSQ",	LTYPE0,	AMOVSQ,
   513  	"MOVSW",	LTYPE0,	AMOVSW,
   514  	"MULB",		LTYPE2,	AMULB,
   515  	"MULL",		LTYPE2,	AMULL,
   516  	"MULQ",		LTYPE2,	AMULQ,
   517  	"MULW",		LTYPE2,	AMULW,
   518  	"NEGB",		LTYPE1,	ANEGB,
   519  	"NEGL",		LTYPE1,	ANEGL,
   520  	"NEGQ",		LTYPE1,	ANEGQ,
   521  	"NEGW",		LTYPE1,	ANEGW,
   522  	"NOP",		LTYPEN,	ANOP,
   523  	"NOTB",		LTYPE1,	ANOTB,
   524  	"NOTL",		LTYPE1,	ANOTL,
   525  	"NOTQ",		LTYPE1,	ANOTQ,
   526  	"NOTW",		LTYPE1,	ANOTW,
   527  	"ORB",		LTYPE3,	AORB,
   528  	"ORL",		LTYPE3,	AORL,
   529  	"ORQ",		LTYPE3,	AORQ,
   530  	"ORW",		LTYPE3,	AORW,
   531  	"OUTB",		LTYPE0,	AOUTB,
   532  	"OUTL",		LTYPE0,	AOUTL,
   533  	"OUTW",		LTYPE0,	AOUTW,
   534  	"OUTSB",	LTYPE0,	AOUTSB,
   535  	"OUTSL",	LTYPE0,	AOUTSL,
   536  	"OUTSW",	LTYPE0,	AOUTSW,
   537  	"PAUSE",	LTYPEN,	APAUSE,
   538  	"POPAL",	LTYPE0,	APOPAL,
   539  	"POPAW",	LTYPE0,	APOPAW,
   540  	"POPFL",	LTYPE0,	APOPFL,
   541  	"POPFQ",	LTYPE0,	APOPFQ,
   542  	"POPFW",	LTYPE0,	APOPFW,
   543  	"POPL",		LTYPE1,	APOPL,
   544  	"POPQ",		LTYPE1,	APOPQ,
   545  	"POPW",		LTYPE1,	APOPW,
   546  	"PUSHAL",	LTYPE0,	APUSHAL,
   547  	"PUSHAW",	LTYPE0,	APUSHAW,
   548  	"PUSHFL",	LTYPE0,	APUSHFL,
   549  	"PUSHFQ",	LTYPE0,	APUSHFQ,
   550  	"PUSHFW",	LTYPE0,	APUSHFW,
   551  	"PUSHL",	LTYPE2,	APUSHL,
   552  	"PUSHQ",	LTYPE2,	APUSHQ,
   553  	"PUSHW",	LTYPE2,	APUSHW,
   554  	"RCLB",		LTYPE3,	ARCLB,
   555  	"RCLL",		LTYPE3,	ARCLL,
   556  	"RCLQ",		LTYPE3,	ARCLQ,
   557  	"RCLW",		LTYPE3,	ARCLW,
   558  	"RCRB",		LTYPE3,	ARCRB,
   559  	"RCRL",		LTYPE3,	ARCRL,
   560  	"RCRQ",		LTYPE3,	ARCRQ,
   561  	"RCRW",		LTYPE3,	ARCRW,
   562  	"RDMSR",	LTYPE0,	ARDMSR,
   563  	"RDPMC",	LTYPE0,	ARDPMC,
   564  	"RDTSC",	LTYPE0,	ARDTSC,
   565  	"REP",		LTYPE0,	AREP,
   566  	"REPN",		LTYPE0,	AREPN,
   567  	"RET",		LTYPE0,	ARET,
   568  	"RETFL",	LTYPERT,ARETFL,
   569  	"RETFW",	LTYPERT,ARETFW,
   570  	"RETFQ",	LTYPERT,ARETFQ,
   571  	"ROLB",		LTYPE3,	AROLB,
   572  	"ROLL",		LTYPE3,	AROLL,
   573  	"ROLQ",		LTYPE3,	AROLQ,
   574  	"ROLW",		LTYPE3,	AROLW,
   575  	"RORB",		LTYPE3,	ARORB,
   576  	"RORL",		LTYPE3,	ARORL,
   577  	"RORQ",		LTYPE3,	ARORQ,
   578  	"RORW",		LTYPE3,	ARORW,
   579  	"RSM",		LTYPE0,	ARSM,
   580  	"SAHF",		LTYPE0,	ASAHF,
   581  	"SALB",		LTYPE3,	ASALB,
   582  	"SALL",		LTYPE3,	ASALL,
   583  	"SALQ",		LTYPE3,	ASALQ,
   584  	"SALW",		LTYPE3,	ASALW,
   585  	"SARB",		LTYPE3,	ASARB,
   586  	"SARL",		LTYPE3,	ASARL,
   587  	"SARQ",		LTYPE3,	ASARQ,
   588  	"SARW",		LTYPE3,	ASARW,
   589  	"SBBB",		LTYPE3,	ASBBB,
   590  	"SBBL",		LTYPE3,	ASBBL,
   591  	"SBBQ",		LTYPE3,	ASBBQ,
   592  	"SBBW",		LTYPE3,	ASBBW,
   593  	"SCASB",	LTYPE0,	ASCASB,
   594  	"SCASL",	LTYPE0,	ASCASL,
   595  	"SCASQ",	LTYPE0,	ASCASQ,
   596  	"SCASW",	LTYPE0,	ASCASW,
   597  	"SETCC",	LTYPE1,	ASETCC,
   598  	"SETCS",	LTYPE1,	ASETCS,
   599  	"SETEQ",	LTYPE1,	ASETEQ,
   600  	"SETGE",	LTYPE1,	ASETGE,
   601  	"SETGT",	LTYPE1,	ASETGT,
   602  	"SETHI",	LTYPE1,	ASETHI,
   603  	"SETLE",	LTYPE1,	ASETLE,
   604  	"SETLS",	LTYPE1,	ASETLS,
   605  	"SETLT",	LTYPE1,	ASETLT,
   606  	"SETMI",	LTYPE1,	ASETMI,
   607  	"SETNE",	LTYPE1,	ASETNE,
   608  	"SETOC",	LTYPE1,	ASETOC,
   609  	"SETOS",	LTYPE1,	ASETOS,
   610  	"SETPC",	LTYPE1,	ASETPC,
   611  	"SETPL",	LTYPE1,	ASETPL,
   612  	"SETPS",	LTYPE1,	ASETPS,
   613  	"SFENCE",	LTYPE0,	ASFENCE,
   614  	"CDQ",		LTYPE0,	ACDQ,
   615  	"CWD",		LTYPE0,	ACWD,
   616  	"CQO",		LTYPE0,	ACQO,
   617  	"SHLB",		LTYPE3,	ASHLB,
   618  	"SHLL",		LTYPES,	ASHLL,
   619  	"SHLQ",		LTYPES,	ASHLQ,
   620  	"SHLW",		LTYPES,	ASHLW,
   621  	"SHRB",		LTYPE3,	ASHRB,
   622  	"SHRL",		LTYPES,	ASHRL,
   623  	"SHRQ",		LTYPES,	ASHRQ,
   624  	"SHRW",		LTYPES,	ASHRW,
   625  	"STC",		LTYPE0,	ASTC,
   626  	"STD",		LTYPE0,	ASTD,
   627  	"STI",		LTYPE0,	ASTI,
   628  	"STOSB",	LTYPE0,	ASTOSB,
   629  	"STOSL",	LTYPE0,	ASTOSL,
   630  	"STOSQ",	LTYPE0,	ASTOSQ,
   631  	"STOSW",	LTYPE0,	ASTOSW,
   632  	"SUBB",		LTYPE3,	ASUBB,
   633  	"SUBL",		LTYPE3,	ASUBL,
   634  	"SUBQ",		LTYPE3,	ASUBQ,
   635  	"SUBW",		LTYPE3,	ASUBW,
   636  	"SYSCALL",	LTYPE0,	ASYSCALL,
   637  	"SYSRET",	LTYPE0,	ASYSRET,
   638  	"SWAPGS",	LTYPE0,	ASWAPGS,
   639  	"TESTB",	LTYPE3,	ATESTB,
   640  	"TESTL",	LTYPE3,	ATESTL,
   641  	"TESTQ",	LTYPE3,	ATESTQ,
   642  	"TESTW",	LTYPE3,	ATESTW,
   643  	"TEXT",		LTYPET,	ATEXT,
   644  	"VERR",		LTYPE2,	AVERR,
   645  	"VERW",		LTYPE2,	AVERW,
   646  	"QUAD",		LTYPE2,	AQUAD,
   647  	"WAIT",		LTYPE0,	AWAIT,
   648  	"WBINVD",	LTYPE0,	AWBINVD,
   649  	"WRMSR",	LTYPE0,	AWRMSR,
   650  	"WORD",		LTYPE2,	AWORD,
   651  	"XADDB",	LTYPE3,	AXADDB,
   652  	"XADDL",	LTYPE3,	AXADDL,
   653  	"XADDQ",	LTYPE3,	AXADDQ,
   654  	"XADDW",	LTYPE3,	AXADDW,
   655  	"XCHGB",	LTYPE3,	AXCHGB,
   656  	"XCHGL",	LTYPE3,	AXCHGL,
   657  	"XCHGQ",	LTYPE3,	AXCHGQ,
   658  	"XCHGW",	LTYPE3,	AXCHGW,
   659  	"XLAT",		LTYPE2,	AXLAT,
   660  	"XORB",		LTYPE3,	AXORB,
   661  	"XORL",		LTYPE3,	AXORL,
   662  	"XORQ",		LTYPE3,	AXORQ,
   663  	"XORW",		LTYPE3,	AXORW,
   664  
   665  	"CMOVLCC",	LTYPE3,	ACMOVLCC,
   666  	"CMOVLCS",	LTYPE3,	ACMOVLCS,
   667  	"CMOVLEQ",	LTYPE3,	ACMOVLEQ,
   668  	"CMOVLGE",	LTYPE3,	ACMOVLGE,
   669  	"CMOVLGT",	LTYPE3,	ACMOVLGT,
   670  	"CMOVLHI",	LTYPE3,	ACMOVLHI,
   671  	"CMOVLLE",	LTYPE3,	ACMOVLLE,
   672  	"CMOVLLS",	LTYPE3,	ACMOVLLS,
   673  	"CMOVLLT",	LTYPE3,	ACMOVLLT,
   674  	"CMOVLMI",	LTYPE3,	ACMOVLMI,
   675  	"CMOVLNE",	LTYPE3,	ACMOVLNE,
   676  	"CMOVLOC",	LTYPE3,	ACMOVLOC,
   677  	"CMOVLOS",	LTYPE3,	ACMOVLOS,
   678  	"CMOVLPC",	LTYPE3,	ACMOVLPC,
   679  	"CMOVLPL",	LTYPE3,	ACMOVLPL,
   680  	"CMOVLPS",	LTYPE3,	ACMOVLPS,
   681  	"CMOVQCC",	LTYPE3,	ACMOVQCC,
   682  	"CMOVQCS",	LTYPE3,	ACMOVQCS,
   683  	"CMOVQEQ",	LTYPE3,	ACMOVQEQ,
   684  	"CMOVQGE",	LTYPE3,	ACMOVQGE,
   685  	"CMOVQGT",	LTYPE3,	ACMOVQGT,
   686  	"CMOVQHI",	LTYPE3,	ACMOVQHI,
   687  	"CMOVQLE",	LTYPE3,	ACMOVQLE,
   688  	"CMOVQLS",	LTYPE3,	ACMOVQLS,
   689  	"CMOVQLT",	LTYPE3,	ACMOVQLT,
   690  	"CMOVQMI",	LTYPE3,	ACMOVQMI,
   691  	"CMOVQNE",	LTYPE3,	ACMOVQNE,
   692  	"CMOVQOC",	LTYPE3,	ACMOVQOC,
   693  	"CMOVQOS",	LTYPE3,	ACMOVQOS,
   694  	"CMOVQPC",	LTYPE3,	ACMOVQPC,
   695  	"CMOVQPL",	LTYPE3,	ACMOVQPL,
   696  	"CMOVQPS",	LTYPE3,	ACMOVQPS,
   697  	"CMOVWCC",	LTYPE3,	ACMOVWCC,
   698  	"CMOVWCS",	LTYPE3,	ACMOVWCS,
   699  	"CMOVWEQ",	LTYPE3,	ACMOVWEQ,
   700  	"CMOVWGE",	LTYPE3,	ACMOVWGE,
   701  	"CMOVWGT",	LTYPE3,	ACMOVWGT,
   702  	"CMOVWHI",	LTYPE3,	ACMOVWHI,
   703  	"CMOVWLE",	LTYPE3,	ACMOVWLE,
   704  	"CMOVWLS",	LTYPE3,	ACMOVWLS,
   705  	"CMOVWLT",	LTYPE3,	ACMOVWLT,
   706  	"CMOVWMI",	LTYPE3,	ACMOVWMI,
   707  	"CMOVWNE",	LTYPE3,	ACMOVWNE,
   708  	"CMOVWOC",	LTYPE3,	ACMOVWOC,
   709  	"CMOVWOS",	LTYPE3,	ACMOVWOS,
   710  	"CMOVWPC",	LTYPE3,	ACMOVWPC,
   711  	"CMOVWPL",	LTYPE3,	ACMOVWPL,
   712  	"CMOVWPS",	LTYPE3,	ACMOVWPS,
   713  
   714  	"FMOVB",	LTYPE3, AFMOVB,
   715  	"FMOVBP",	LTYPE3, AFMOVBP,
   716  	"FMOVD",	LTYPE3, AFMOVD,
   717  	"FMOVDP",	LTYPE3, AFMOVDP,
   718  	"FMOVF",	LTYPE3, AFMOVF,
   719  	"FMOVFP",	LTYPE3, AFMOVFP,
   720  	"FMOVL",	LTYPE3, AFMOVL,
   721  	"FMOVLP",	LTYPE3, AFMOVLP,
   722  	"FMOVV",	LTYPE3, AFMOVV,
   723  	"FMOVVP",	LTYPE3, AFMOVVP,
   724  	"FMOVW",	LTYPE3, AFMOVW,
   725  	"FMOVWP",	LTYPE3, AFMOVWP,
   726  	"FMOVX",	LTYPE3, AFMOVX,
   727  	"FMOVXP",	LTYPE3, AFMOVXP,
   728  	"FCOMB",	LTYPE3, AFCOMB,
   729  	"FCOMBP",	LTYPE3, AFCOMBP,
   730  	"FCOMD",	LTYPE3, AFCOMD,
   731  	"FCOMDP",	LTYPE3, AFCOMDP,
   732  	"FCOMDPP",	LTYPE3, AFCOMDPP,
   733  	"FCOMF",	LTYPE3, AFCOMF,
   734  	"FCOMFP",	LTYPE3, AFCOMFP,
   735  	"FCOML",	LTYPE3, AFCOML,
   736  	"FCOMLP",	LTYPE3, AFCOMLP,
   737  	"FCOMW",	LTYPE3, AFCOMW,
   738  	"FCOMWP",	LTYPE3, AFCOMWP,
   739  	"FUCOM",	LTYPE3, AFUCOM,
   740  	"FUCOMP",	LTYPE3, AFUCOMP,
   741  	"FUCOMPP",	LTYPE3, AFUCOMPP,
   742  	"FADDW",	LTYPE3, AFADDW,
   743  	"FADDL",	LTYPE3, AFADDL,
   744  	"FADDF",	LTYPE3, AFADDF,
   745  	"FADDD",	LTYPE3, AFADDD,
   746  	"FADDDP",	LTYPE3, AFADDDP,
   747  	"FSUBDP",	LTYPE3, AFSUBDP,
   748  	"FSUBW",	LTYPE3, AFSUBW,
   749  	"FSUBL",	LTYPE3, AFSUBL,
   750  	"FSUBF",	LTYPE3, AFSUBF,
   751  	"FSUBD",	LTYPE3, AFSUBD,
   752  	"FSUBRDP",	LTYPE3, AFSUBRDP,
   753  	"FSUBRW",	LTYPE3, AFSUBRW,
   754  	"FSUBRL",	LTYPE3, AFSUBRL,
   755  	"FSUBRF",	LTYPE3, AFSUBRF,
   756  	"FSUBRD",	LTYPE3, AFSUBRD,
   757  	"FMULDP",	LTYPE3, AFMULDP,
   758  	"FMULW",	LTYPE3, AFMULW,
   759  	"FMULL",	LTYPE3, AFMULL,
   760  	"FMULF",	LTYPE3, AFMULF,
   761  	"FMULD",	LTYPE3, AFMULD,
   762  	"FDIVDP",	LTYPE3, AFDIVDP,
   763  	"FDIVW",	LTYPE3, AFDIVW,
   764  	"FDIVL",	LTYPE3, AFDIVL,
   765  	"FDIVF",	LTYPE3, AFDIVF,
   766  	"FDIVD",	LTYPE3, AFDIVD,
   767  	"FDIVRDP",	LTYPE3, AFDIVRDP,
   768  	"FDIVRW",	LTYPE3, AFDIVRW,
   769  	"FDIVRL",	LTYPE3, AFDIVRL,
   770  	"FDIVRF",	LTYPE3, AFDIVRF,
   771  	"FDIVRD",	LTYPE3, AFDIVRD,
   772  	"FXCHD",	LTYPE3, AFXCHD,
   773  	"FFREE",	LTYPE1, AFFREE,
   774  	"FLDCW",	LTYPE2, AFLDCW,
   775  	"FLDENV",	LTYPE1, AFLDENV,
   776  	"FRSTOR",	LTYPE2, AFRSTOR,
   777  	"FSAVE",	LTYPE1, AFSAVE,
   778  	"FSTCW",	LTYPE1, AFSTCW,
   779  	"FSTENV",	LTYPE1, AFSTENV,
   780  	"FSTSW",	LTYPE1, AFSTSW,
   781  	"F2XM1",	LTYPE0, AF2XM1,
   782  	"FABS",		LTYPE0, AFABS,
   783  	"FCHS",		LTYPE0, AFCHS,
   784  	"FCLEX",	LTYPE0, AFCLEX,
   785  	"FCOS",		LTYPE0, AFCOS,
   786  	"FDECSTP",	LTYPE0, AFDECSTP,
   787  	"FINCSTP",	LTYPE0, AFINCSTP,
   788  	"FINIT",	LTYPE0, AFINIT,
   789  	"FLD1",		LTYPE0, AFLD1,
   790  	"FLDL2E",	LTYPE0, AFLDL2E,
   791  	"FLDL2T",	LTYPE0, AFLDL2T,
   792  	"FLDLG2",	LTYPE0, AFLDLG2,
   793  	"FLDLN2",	LTYPE0, AFLDLN2,
   794  	"FLDPI",	LTYPE0, AFLDPI,
   795  	"FLDZ",		LTYPE0, AFLDZ,
   796  	"FNOP",		LTYPE0, AFNOP,
   797  	"FPATAN",	LTYPE0, AFPATAN,
   798  	"FPREM",	LTYPE0, AFPREM,
   799  	"FPREM1",	LTYPE0, AFPREM1,
   800  	"FPTAN",	LTYPE0, AFPTAN,
   801  	"FRNDINT",	LTYPE0, AFRNDINT,
   802  	"FSCALE",	LTYPE0, AFSCALE,
   803  	"FSIN",		LTYPE0, AFSIN,
   804  	"FSINCOS",	LTYPE0, AFSINCOS,
   805  	"FSQRT",	LTYPE0, AFSQRT,
   806  	"FTST",		LTYPE0, AFTST,
   807  	"FXAM",		LTYPE0, AFXAM,
   808  	"FXTRACT",	LTYPE0, AFXTRACT,
   809  	"FYL2X",	LTYPE0, AFYL2X,
   810  	"FYL2XP1",	LTYPE0, AFYL2XP1,
   811  
   812  	"ADDPD",	LTYPE3,	AADDPD,
   813  	"ADDPS",	LTYPE3,	AADDPS,
   814  	"ADDSD",	LTYPE3,	AADDSD,
   815  	"ADDSS",	LTYPE3,	AADDSS,
   816  	"ANDNPD",	LTYPE3,	AANDNPD,
   817  	"ANDNPS",	LTYPE3,	AANDNPS,
   818  	"ANDPD",	LTYPE3,	AANDPD,
   819  	"ANDPS",	LTYPE3,	AANDPS,
   820  	"CMPPD",	LTYPEXC,ACMPPD,
   821  	"CMPPS",	LTYPEXC,ACMPPS,
   822  	"CMPSD",	LTYPEXC,ACMPSD,
   823  	"CMPSS",	LTYPEXC,ACMPSS,
   824  	"COMISD",	LTYPE3,	ACOMISD,
   825  	"COMISS",	LTYPE3,	ACOMISS,
   826  	"CVTPL2PD",	LTYPE3,	ACVTPL2PD,
   827  	"CVTPL2PS",	LTYPE3,	ACVTPL2PS,
   828  	"CVTPD2PL",	LTYPE3,	ACVTPD2PL,
   829  	"CVTPD2PS",	LTYPE3,	ACVTPD2PS,
   830  	"CVTPS2PL",	LTYPE3,	ACVTPS2PL,
   831  	"PF2IW",	LTYPE3,	APF2IW,
   832  	"PF2IL",	LTYPE3,	APF2IL,
   833  	"PF2ID",	LTYPE3,	APF2IL,	/* syn */
   834  	"PI2FL",	LTYPE3,	API2FL,
   835  	"PI2FD",	LTYPE3,	API2FL,	/* syn */
   836  	"PI2FW",	LTYPE3,	API2FW,
   837  	"CVTPS2PD",	LTYPE3,	ACVTPS2PD,
   838  	"CVTSD2SL",	LTYPE3,	ACVTSD2SL,
   839  	"CVTSD2SQ",	LTYPE3,	ACVTSD2SQ,
   840  	"CVTSD2SS",	LTYPE3,	ACVTSD2SS,
   841  	"CVTSL2SD",	LTYPE3,	ACVTSL2SD,
   842  	"CVTSQ2SD",	LTYPE3,	ACVTSQ2SD,
   843  	"CVTSL2SS",	LTYPE3,	ACVTSL2SS,
   844  	"CVTSQ2SS",	LTYPE3,	ACVTSQ2SS,
   845  	"CVTSS2SD",	LTYPE3,	ACVTSS2SD,
   846  	"CVTSS2SL",	LTYPE3,	ACVTSS2SL,
   847  	"CVTSS2SQ",	LTYPE3,	ACVTSS2SQ,
   848  	"CVTTPD2PL",	LTYPE3,	ACVTTPD2PL,
   849  	"CVTTPS2PL",	LTYPE3,	ACVTTPS2PL,
   850  	"CVTTSD2SL",	LTYPE3,	ACVTTSD2SL,
   851  	"CVTTSD2SQ",	LTYPE3,	ACVTTSD2SQ,
   852  	"CVTTSS2SL",	LTYPE3,	ACVTTSS2SL,
   853  	"CVTTSS2SQ",	LTYPE3,	ACVTTSS2SQ,
   854  	"DIVPD",	LTYPE3,	ADIVPD,
   855  	"DIVPS",	LTYPE3,	ADIVPS,
   856  	"DIVSD",	LTYPE3,	ADIVSD,
   857  	"DIVSS",	LTYPE3,	ADIVSS,
   858  	"FXRSTOR",	LTYPE2,	AFXRSTOR,
   859  	"FXRSTOR64",	LTYPE2,	AFXRSTOR64,
   860  	"FXSAVE",	LTYPE1,	AFXSAVE,
   861  	"FXSAVE64",	LTYPE1,	AFXSAVE64,
   862  	"LDMXCSR",	LTYPE2,	ALDMXCSR,
   863  	"MASKMOVOU",	LTYPE3,	AMASKMOVOU,
   864  	"MASKMOVDQU",	LTYPE3,	AMASKMOVOU,	/* syn */
   865  	"MASKMOVQ",	LTYPE3,	AMASKMOVQ,
   866  	"MAXPD",	LTYPE3,	AMAXPD,
   867  	"MAXPS",	LTYPE3,	AMAXPS,
   868  	"MAXSD",	LTYPE3,	AMAXSD,
   869  	"MAXSS",	LTYPE3,	AMAXSS,
   870  	"MINPD",	LTYPE3,	AMINPD,
   871  	"MINPS",	LTYPE3,	AMINPS,
   872  	"MINSD",	LTYPE3,	AMINSD,
   873  	"MINSS",	LTYPE3,	AMINSS,
   874  	"MOVAPD",	LTYPE3,	AMOVAPD,
   875  	"MOVAPS",	LTYPE3,	AMOVAPS,
   876  	"MOVD",		LTYPE3,	AMOVQ,	/* syn */
   877  	"MOVDQ2Q",	LTYPE3,	AMOVQ,	/* syn */
   878  	"MOVO",		LTYPE3,	AMOVO,
   879  	"MOVOA",	LTYPE3,	AMOVO,	/* syn */
   880  	"MOVOU",	LTYPE3,	AMOVOU,
   881  	"MOVHLPS",	LTYPE3,	AMOVHLPS,
   882  	"MOVHPD",	LTYPE3,	AMOVHPD,
   883  	"MOVHPS",	LTYPE3,	AMOVHPS,
   884  	"MOVLHPS",	LTYPE3,	AMOVLHPS,
   885  	"MOVLPD",	LTYPE3,	AMOVLPD,
   886  	"MOVLPS",	LTYPE3,	AMOVLPS,
   887  	"MOVMSKPD",	LTYPE3,	AMOVMSKPD,
   888  	"MOVMSKPS",	LTYPE3,	AMOVMSKPS,
   889  	"MOVNTO",	LTYPE3,	AMOVNTO,
   890  	"MOVNTDQ",	LTYPE3,	AMOVNTO,	/* syn */
   891  	"MOVNTPD",	LTYPE3,	AMOVNTPD,
   892  	"MOVNTPS",	LTYPE3,	AMOVNTPS,
   893  	"MOVNTQ",	LTYPE3,	AMOVNTQ,
   894  	"MOVQOZX",	LTYPE3,	AMOVQOZX,
   895  	"MOVSD",	LTYPE3,	AMOVSD,
   896  	"MOVSS",	LTYPE3,	AMOVSS,
   897  	"MOVUPD",	LTYPE3,	AMOVUPD,
   898  	"MOVUPS",	LTYPE3,	AMOVUPS,
   899  	"MULPD",	LTYPE3,	AMULPD,
   900  	"MULPS",	LTYPE3,	AMULPS,
   901  	"MULSD",	LTYPE3,	AMULSD,
   902  	"MULSS",	LTYPE3,	AMULSS,
   903  	"ORPD",		LTYPE3,	AORPD,
   904  	"ORPS",		LTYPE3,	AORPS,
   905  	"PACKSSLW",	LTYPE3,	APACKSSLW,
   906  	"PACKSSWB",	LTYPE3,	APACKSSWB,
   907  	"PACKUSWB",	LTYPE3,	APACKUSWB,
   908  	"PADDB",	LTYPE3,	APADDB,
   909  	"PADDL",	LTYPE3,	APADDL,
   910  	"PADDQ",	LTYPE3,	APADDQ,
   911  	"PADDSB",	LTYPE3,	APADDSB,
   912  	"PADDSW",	LTYPE3,	APADDSW,
   913  	"PADDUSB",	LTYPE3,	APADDUSB,
   914  	"PADDUSW",	LTYPE3,	APADDUSW,
   915  	"PADDW",	LTYPE3,	APADDW,
   916  	"PAND",		LTYPE3, APAND,
   917  	"PANDB",	LTYPE3,	APANDB,
   918  	"PANDL",	LTYPE3,	APANDL,
   919  	"PANDSB",	LTYPE3,	APANDSB,
   920  	"PANDSW",	LTYPE3,	APANDSW,
   921  	"PANDUSB",	LTYPE3,	APANDUSB,
   922  	"PANDUSW",	LTYPE3,	APANDUSW,
   923  	"PANDW",	LTYPE3,	APANDW,
   924  	"PANDN",	LTYPE3, APANDN,
   925  	"PAVGB",	LTYPE3,	APAVGB,
   926  	"PAVGW",	LTYPE3,	APAVGW,
   927  	"PCMPEQB",	LTYPE3,	APCMPEQB,
   928  	"PCMPEQL",	LTYPE3,	APCMPEQL,
   929  	"PCMPEQW",	LTYPE3,	APCMPEQW,
   930  	"PCMPGTB",	LTYPE3,	APCMPGTB,
   931  	"PCMPGTL",	LTYPE3,	APCMPGTL,	
   932  	"PCMPGTW",	LTYPE3,	APCMPGTW,
   933  	"PEXTRW",	LTYPEX,	APEXTRW,
   934  	"PINSRW",	LTYPEX,	APINSRW,
   935  	"PINSRD",	LTYPEX,	APINSRD,
   936  	"PINSRQ",	LTYPEX,	APINSRQ,
   937  	"PMADDWL",	LTYPE3,	APMADDWL,
   938  	"PMAXSW",	LTYPE3,	APMAXSW,
   939  	"PMAXUB",	LTYPE3,	APMAXUB,
   940  	"PMINSW",	LTYPE3,	APMINSW,
   941  	"PMINUB",	LTYPE3,	APMINUB,
   942  	"PMOVMSKB",	LTYPE3,	APMOVMSKB,
   943  	"PMULHRW",	LTYPE3,	APMULHRW,
   944  	"PMULHUW",	LTYPE3,	APMULHUW,
   945  	"PMULHW",	LTYPE3,	APMULHW,
   946  	"PMULLW",	LTYPE3,	APMULLW,
   947  	"PMULULQ",	LTYPE3,	APMULULQ,
   948  	"POR",		LTYPE3,	APOR,
   949  	"PSADBW",	LTYPE3,	APSADBW,
   950  	"PSHUFHW",	LTYPEX,	APSHUFHW,
   951  	"PSHUFL",	LTYPEX,	APSHUFL,
   952  	"PSHUFLW",	LTYPEX,	APSHUFLW,
   953  	"PSHUFW",	LTYPEX, APSHUFW,
   954  	"PSHUFB",	LTYPEM, APSHUFB,
   955  	"PSLLO",	LTYPE3,	APSLLO,
   956  	"PSLLDQ",	LTYPE3,	APSLLO,	/* syn */
   957  	"PSLLL",	LTYPE3,	APSLLL,
   958  	"PSLLQ",	LTYPE3,	APSLLQ,
   959  	"PSLLW",	LTYPE3,	APSLLW,
   960  	"PSRAL",	LTYPE3,	APSRAL,
   961  	"PSRAW",	LTYPE3,	APSRAW,
   962  	"PSRLO",	LTYPE3,	APSRLO,
   963  	"PSRLDQ",	LTYPE3,	APSRLO,	/* syn */
   964  	"PSRLL",	LTYPE3,	APSRLL,
   965  	"PSRLQ",	LTYPE3,	APSRLQ,
   966  	"PSRLW",	LTYPE3,	APSRLW,
   967  	"PSUBB",	LTYPE3,	APSUBB,
   968  	"PSUBL",	LTYPE3,	APSUBL,
   969  	"PSUBQ",	LTYPE3,	APSUBQ,
   970  	"PSUBSB",	LTYPE3,	APSUBSB,
   971  	"PSUBSW",	LTYPE3,	APSUBSW,
   972  	"PSUBUSB",	LTYPE3,	APSUBUSB,
   973  	"PSUBUSW",	LTYPE3,	APSUBUSW,
   974  	"PSUBW",	LTYPE3,	APSUBW,
   975  	"PUNPCKHBW",	LTYPE3,	APUNPCKHBW,
   976  	"PUNPCKHLQ",	LTYPE3,	APUNPCKHLQ,
   977  	"PUNPCKHQDQ",	LTYPE3,	APUNPCKHQDQ,
   978  	"PUNPCKHWL",	LTYPE3,	APUNPCKHWL,
   979  	"PUNPCKLBW",	LTYPE3,	APUNPCKLBW,
   980  	"PUNPCKLLQ",	LTYPE3,	APUNPCKLLQ,
   981  	"PUNPCKLQDQ",	LTYPE3,	APUNPCKLQDQ,
   982  	"PUNPCKLWL",	LTYPE3,	APUNPCKLWL,
   983  	"PXOR",		LTYPE3,	APXOR,
   984  	"RCPPS",	LTYPE3,	ARCPPS,
   985  	"RCPSS",	LTYPE3,	ARCPSS,
   986  	"RSQRTPS",	LTYPE3,	ARSQRTPS,
   987  	"RSQRTSS",	LTYPE3,	ARSQRTSS,
   988  	"SHUFPD",	LTYPEX,	ASHUFPD,
   989  	"SHUFPS",	LTYPEX,	ASHUFPS,
   990  	"SQRTPD",	LTYPE3,	ASQRTPD,
   991  	"SQRTPS",	LTYPE3,	ASQRTPS,
   992  	"SQRTSD",	LTYPE3,	ASQRTSD,
   993  	"SQRTSS",	LTYPE3,	ASQRTSS,
   994  	"STMXCSR",	LTYPE1,	ASTMXCSR,
   995  	"SUBPD",	LTYPE3,	ASUBPD,
   996  	"SUBPS",	LTYPE3,	ASUBPS,
   997  	"SUBSD",	LTYPE3,	ASUBSD,
   998  	"SUBSS",	LTYPE3,	ASUBSS,
   999  	"UCOMISD",	LTYPE3,	AUCOMISD,
  1000  	"UCOMISS",	LTYPE3,	AUCOMISS,
  1001  	"UNPCKHPD",	LTYPE3,	AUNPCKHPD,
  1002  	"UNPCKHPS",	LTYPE3,	AUNPCKHPS,
  1003  	"UNPCKLPD",	LTYPE3,	AUNPCKLPD,
  1004  	"UNPCKLPS",	LTYPE3,	AUNPCKLPS,
  1005  	"XORPD",	LTYPE3,	AXORPD,
  1006  	"XORPS",	LTYPE3,	AXORPS,
  1007  	"CRC32B",	LTYPE4, ACRC32B,
  1008  	"CRC32Q",	LTYPE4, ACRC32Q,
  1009  	"PREFETCHT0",		LTYPE2,	APREFETCHT0,
  1010  	"PREFETCHT1",		LTYPE2,	APREFETCHT1,
  1011  	"PREFETCHT2",		LTYPE2,	APREFETCHT2,
  1012  	"PREFETCHNTA",		LTYPE2,	APREFETCHNTA,
  1013  	"UNDEF",	LTYPE0,	AUNDEF,
  1014  	"AESENC",	LTYPE3,	AAESENC,
  1015  	"AESENCLAST",	LTYPE3, AAESENCLAST,
  1016  	"AESDEC",	LTYPE3, AAESDEC,
  1017  	"AESDECLAST",	LTYPE3, AAESDECLAST,
  1018  	"AESIMC",	LTYPE3, AAESIMC,
  1019  	"AESKEYGENASSIST", LTYPEX, AAESKEYGENASSIST,
  1020  	"PSHUFD",	LTYPEX, APSHUFD,
  1021  	"USEFIELD",	LTYPEN, AUSEFIELD,
  1022  	"PCLMULQDQ",	LTYPEX, APCLMULQDQ,
  1023  	"PCDATA",	LTYPEPC,	APCDATA,
  1024  	"FUNCDATA",	LTYPEF,	AFUNCDATA,
  1025  	0
  1026  };
  1027  
  1028  void
  1029  cinit(void)
  1030  {
  1031  	Sym *s;
  1032  	int i;
  1033  
  1034  	nullgen.sym = S;
  1035  	nullgen.offset = 0;
  1036  	if(FPCHIP)
  1037  		nullgen.dval = 0;
  1038  	for(i=0; i<sizeof(nullgen.sval); i++)
  1039  		nullgen.sval[i] = 0;
  1040  	nullgen.type = D_NONE;
  1041  	nullgen.index = D_NONE;
  1042  	nullgen.scale = 0;
  1043  
  1044  	nerrors = 0;
  1045  	iostack = I;
  1046  	iofree = I;
  1047  	peekc = IGN;
  1048  	nhunk = 0;
  1049  	for(i=0; i<NHASH; i++)
  1050  		hash[i] = S;
  1051  	for(i=0; itab[i].name; i++) {
  1052  		s = slookup(itab[i].name);
  1053  		if(s->type != LNAME)
  1054  			yyerror("double initialization %s", itab[i].name);
  1055  		s->type = itab[i].type;
  1056  		s->value = itab[i].value;
  1057  	}
  1058  
  1059  	pathname = allocn(pathname, 0, 100);
  1060  	if(getwd(pathname, 99) == 0) {
  1061  		pathname = allocn(pathname, 100, 900);
  1062  		if(getwd(pathname, 999) == 0)
  1063  			strcpy(pathname, "/???");
  1064  	}
  1065  }
  1066  
  1067  void
  1068  checkscale(int scale)
  1069  {
  1070  
  1071  	switch(scale) {
  1072  	case 1:
  1073  	case 2:
  1074  	case 4:
  1075  	case 8:
  1076  		return;
  1077  	}
  1078  	yyerror("scale must be 1248: %d", scale);
  1079  }
  1080  
  1081  void
  1082  syminit(Sym *s)
  1083  {
  1084  
  1085  	s->type = LNAME;
  1086  	s->value = 0;
  1087  }
  1088  
  1089  void
  1090  cclean(void)
  1091  {
  1092  	Gen2 g2;
  1093  
  1094  	g2.from = nullgen;
  1095  	g2.to = nullgen;
  1096  	outcode(AEND, &g2);
  1097  	Bflush(&obuf);
  1098  }
  1099  
  1100  void
  1101  zname(char *n, int t, int s)
  1102  {
  1103  
  1104  	BPUTLE2(&obuf, ANAME);		/* as(2) */
  1105  	BPUTC(&obuf, t);		/* type */
  1106  	BPUTC(&obuf, s);		/* sym */
  1107  	while(*n) {
  1108  		BPUTC(&obuf, *n);
  1109  		n++;
  1110  	}
  1111  	BPUTC(&obuf, 0);
  1112  }
  1113  
  1114  void
  1115  zaddr(Gen *a, int s)
  1116  {
  1117  	int32 l;
  1118  	int i, t;
  1119  	char *n;
  1120  	Ieee e;
  1121  
  1122  	t = 0;
  1123  	if(a->index != D_NONE || a->scale != 0)
  1124  		t |= T_INDEX;
  1125  	if(a->offset != 0) {
  1126  		t |= T_OFFSET;
  1127  		l = a->offset;
  1128  		if((vlong)l != a->offset)
  1129  			t |= T_64;
  1130  	}
  1131  	if(s != 0)
  1132  		t |= T_SYM;
  1133  
  1134  	switch(a->type) {
  1135  	default:
  1136  		t |= T_TYPE;
  1137  		break;
  1138  	case D_FCONST:
  1139  		t |= T_FCONST;
  1140  		break;
  1141  	case D_SCONST:
  1142  		t |= T_SCONST;
  1143  		break;
  1144  	case D_NONE:
  1145  		break;
  1146  	}
  1147  	BPUTC(&obuf, t);
  1148  
  1149  	if(t & T_INDEX) {	/* implies index, scale */
  1150  		BPUTC(&obuf, a->index);
  1151  		BPUTC(&obuf, a->scale);
  1152  	}
  1153  	if(t & T_OFFSET) {	/* implies offset */
  1154  		l = a->offset;
  1155  		BPUTLE4(&obuf, l);
  1156  		if(t & T_64) {
  1157  			l = a->offset>>32;
  1158  			BPUTLE4(&obuf, l);
  1159  		}
  1160  	}
  1161  	if(t & T_SYM)		/* implies sym */
  1162  		BPUTC(&obuf, s);
  1163  	if(t & T_FCONST) {
  1164  		ieeedtod(&e, a->dval);
  1165  		l = e.l;
  1166  		BPUTLE4(&obuf, l);
  1167  		l = e.h;
  1168  		BPUTLE4(&obuf, l);
  1169  		return;
  1170  	}
  1171  	if(t & T_SCONST) {
  1172  		n = a->sval;
  1173  		for(i=0; i<NSNAME; i++) {
  1174  			BPUTC(&obuf, *n);
  1175  			n++;
  1176  		}
  1177  		return;
  1178  	}
  1179  	if(t & T_TYPE)
  1180  		BPUTC(&obuf, a->type);
  1181  }
  1182  
  1183  void
  1184  outcode(int a, Gen2 *g2)
  1185  {
  1186  	int sf, st, t;
  1187  	Sym *s;
  1188  
  1189  	if(pass == 1)
  1190  		goto out;
  1191  
  1192  jackpot:
  1193  	sf = 0;
  1194  	s = g2->from.sym;
  1195  	while(s != S) {
  1196  		sf = s->sym;
  1197  		if(sf < 0 || sf >= NSYM)
  1198  			sf = 0;
  1199  		t = g2->from.type;
  1200  		if(t == D_ADDR)
  1201  			t = g2->from.index;
  1202  		if(h[sf].type == t)
  1203  		if(h[sf].sym == s)
  1204  			break;
  1205  		zname(s->name, t, sym);
  1206  		s->sym = sym;
  1207  		h[sym].sym = s;
  1208  		h[sym].type = t;
  1209  		sf = sym;
  1210  		sym++;
  1211  		if(sym >= NSYM)
  1212  			sym = 1;
  1213  		break;
  1214  	}
  1215  	st = 0;
  1216  	s = g2->to.sym;
  1217  	while(s != S) {
  1218  		st = s->sym;
  1219  		if(st < 0 || st >= NSYM)
  1220  			st = 0;
  1221  		t = g2->to.type;
  1222  		if(t == D_ADDR)
  1223  			t = g2->to.index;
  1224  		if(h[st].type == t)
  1225  		if(h[st].sym == s)
  1226  			break;
  1227  		zname(s->name, t, sym);
  1228  		s->sym = sym;
  1229  		h[sym].sym = s;
  1230  		h[sym].type = t;
  1231  		st = sym;
  1232  		sym++;
  1233  		if(sym >= NSYM)
  1234  			sym = 1;
  1235  		if(st == sf)
  1236  			goto jackpot;
  1237  		break;
  1238  	}
  1239  	BPUTLE2(&obuf, a);
  1240  	BPUTLE4(&obuf, stmtline);
  1241  	zaddr(&g2->from, sf);
  1242  	zaddr(&g2->to, st);
  1243  
  1244  out:
  1245  	if(a != AGLOBL && a != ADATA)
  1246  		pc++;
  1247  }
  1248  
  1249  void
  1250  outhist(void)
  1251  {
  1252  	Gen g;
  1253  	Hist *h;
  1254  	char *p, *q, *op, c;
  1255  	int n;
  1256  	char *tofree;
  1257  	static int first = 1;
  1258  	static char *goroot, *goroot_final;
  1259  
  1260  	if(first) {
  1261  		// Decide whether we need to rewrite paths from $GOROOT to $GOROOT_FINAL.
  1262  		first = 0;
  1263  		goroot = getenv("GOROOT");
  1264  		goroot_final = getenv("GOROOT_FINAL");
  1265  		if(goroot == nil)
  1266  			goroot = "";
  1267  		if(goroot_final == nil)
  1268  			goroot_final = goroot;
  1269  		if(strcmp(goroot, goroot_final) == 0) {
  1270  			goroot = nil;
  1271  			goroot_final = nil;
  1272  		}
  1273  	}
  1274  
  1275  	tofree = nil;
  1276  
  1277  	g = nullgen;
  1278  	c = pathchar();
  1279  	for(h = hist; h != H; h = h->link) {
  1280  		p = h->name;
  1281  		if(p != nil && goroot != nil) {
  1282  			n = strlen(goroot);
  1283  			if(strncmp(p, goroot, strlen(goroot)) == 0 && p[n] == '/') {
  1284  				tofree = smprint("%s%s", goroot_final, p+n);
  1285  				p = tofree;
  1286  			}
  1287  		}
  1288  		op = 0;
  1289  		if(systemtype(Windows) && p && p[1] == ':'){
  1290  			c = p[2];
  1291  		} else if(p && p[0] != c && h->offset == 0 && pathname){
  1292  			if(systemtype(Windows) && pathname[1] == ':') {
  1293  				op = p;
  1294  				p = pathname;
  1295  				c = p[2];
  1296  			} else if(pathname[0] == c){
  1297  				op = p;
  1298  				p = pathname;
  1299  			}
  1300  		}
  1301  		while(p) {
  1302  			q = strchr(p, c);
  1303  			if(q) {
  1304  				n = q-p;
  1305  				if(n == 0){
  1306  					n = 1;	/* leading "/" */
  1307  					*p = '/';	/* don't emit "\" on windows */
  1308  				}
  1309  				q++;
  1310  			} else {
  1311  				n = strlen(p);
  1312  				q = 0;
  1313  			}
  1314  			if(n) {
  1315  				BPUTLE2(&obuf, ANAME);
  1316  				BPUTC(&obuf, D_FILE);	/* type */
  1317  				BPUTC(&obuf, 1);	/* sym */
  1318  				BPUTC(&obuf, '<');
  1319  				Bwrite(&obuf, p, n);
  1320  				BPUTC(&obuf, 0);
  1321  			}
  1322  			p = q;
  1323  			if(p == 0 && op) {
  1324  				p = op;
  1325  				op = 0;
  1326  			}
  1327  		}
  1328  		g.offset = h->offset;
  1329  
  1330  		BPUTLE2(&obuf, AHISTORY);
  1331  		BPUTLE4(&obuf, h->line);
  1332  		zaddr(&nullgen, 0);
  1333  		zaddr(&g, 0);
  1334  
  1335  		if(tofree) {
  1336  			free(tofree);
  1337  			tofree = nil;
  1338  		}
  1339  	}
  1340  }
  1341  
  1342  #include "../cc/lexbody"
  1343  #include "../cc/macbody"