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