github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/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  
  1023  	0
  1024  };
  1025  
  1026  void
  1027  cinit(void)
  1028  {
  1029  	Sym *s;
  1030  	int i;
  1031  
  1032  	nullgen.sym = S;
  1033  	nullgen.offset = 0;
  1034  	if(FPCHIP)
  1035  		nullgen.dval = 0;
  1036  	for(i=0; i<sizeof(nullgen.sval); i++)
  1037  		nullgen.sval[i] = 0;
  1038  	nullgen.type = D_NONE;
  1039  	nullgen.index = D_NONE;
  1040  	nullgen.scale = 0;
  1041  
  1042  	nerrors = 0;
  1043  	iostack = I;
  1044  	iofree = I;
  1045  	peekc = IGN;
  1046  	nhunk = 0;
  1047  	for(i=0; i<NHASH; i++)
  1048  		hash[i] = S;
  1049  	for(i=0; itab[i].name; i++) {
  1050  		s = slookup(itab[i].name);
  1051  		if(s->type != LNAME)
  1052  			yyerror("double initialization %s", itab[i].name);
  1053  		s->type = itab[i].type;
  1054  		s->value = itab[i].value;
  1055  	}
  1056  
  1057  	pathname = allocn(pathname, 0, 100);
  1058  	if(getwd(pathname, 99) == 0) {
  1059  		pathname = allocn(pathname, 100, 900);
  1060  		if(getwd(pathname, 999) == 0)
  1061  			strcpy(pathname, "/???");
  1062  	}
  1063  }
  1064  
  1065  void
  1066  checkscale(int scale)
  1067  {
  1068  
  1069  	switch(scale) {
  1070  	case 1:
  1071  	case 2:
  1072  	case 4:
  1073  	case 8:
  1074  		return;
  1075  	}
  1076  	yyerror("scale must be 1248: %d", scale);
  1077  }
  1078  
  1079  void
  1080  syminit(Sym *s)
  1081  {
  1082  
  1083  	s->type = LNAME;
  1084  	s->value = 0;
  1085  }
  1086  
  1087  void
  1088  cclean(void)
  1089  {
  1090  	Gen2 g2;
  1091  
  1092  	g2.from = nullgen;
  1093  	g2.to = nullgen;
  1094  	outcode(AEND, &g2);
  1095  	Bflush(&obuf);
  1096  }
  1097  
  1098  void
  1099  zname(char *n, int t, int s)
  1100  {
  1101  
  1102  	Bputc(&obuf, ANAME);		/* as(2) */
  1103  	Bputc(&obuf, ANAME>>8);
  1104  	Bputc(&obuf, t);		/* type */
  1105  	Bputc(&obuf, s);		/* sym */
  1106  	while(*n) {
  1107  		Bputc(&obuf, *n);
  1108  		n++;
  1109  	}
  1110  	Bputc(&obuf, 0);
  1111  }
  1112  
  1113  void
  1114  zaddr(Gen *a, int s)
  1115  {
  1116  	int32 l;
  1117  	int i, t;
  1118  	char *n;
  1119  	Ieee e;
  1120  
  1121  	t = 0;
  1122  	if(a->index != D_NONE || a->scale != 0)
  1123  		t |= T_INDEX;
  1124  	if(a->offset != 0) {
  1125  		t |= T_OFFSET;
  1126  		l = a->offset;
  1127  		if((vlong)l != a->offset)
  1128  			t |= T_64;
  1129  	}
  1130  	if(s != 0)
  1131  		t |= T_SYM;
  1132  
  1133  	switch(a->type) {
  1134  	default:
  1135  		t |= T_TYPE;
  1136  		break;
  1137  	case D_FCONST:
  1138  		t |= T_FCONST;
  1139  		break;
  1140  	case D_SCONST:
  1141  		t |= T_SCONST;
  1142  		break;
  1143  	case D_NONE:
  1144  		break;
  1145  	}
  1146  	Bputc(&obuf, t);
  1147  
  1148  	if(t & T_INDEX) {	/* implies index, scale */
  1149  		Bputc(&obuf, a->index);
  1150  		Bputc(&obuf, a->scale);
  1151  	}
  1152  	if(t & T_OFFSET) {	/* implies offset */
  1153  		l = a->offset;
  1154  		Bputc(&obuf, l);
  1155  		Bputc(&obuf, l>>8);
  1156  		Bputc(&obuf, l>>16);
  1157  		Bputc(&obuf, l>>24);
  1158  		if(t & T_64) {
  1159  			l = a->offset>>32;
  1160  			Bputc(&obuf, l);
  1161  			Bputc(&obuf, l>>8);
  1162  			Bputc(&obuf, l>>16);
  1163  			Bputc(&obuf, l>>24);
  1164  		}
  1165  	}
  1166  	if(t & T_SYM)		/* implies sym */
  1167  		Bputc(&obuf, s);
  1168  	if(t & T_FCONST) {
  1169  		ieeedtod(&e, a->dval);
  1170  		l = e.l;
  1171  		Bputc(&obuf, l);
  1172  		Bputc(&obuf, l>>8);
  1173  		Bputc(&obuf, l>>16);
  1174  		Bputc(&obuf, l>>24);
  1175  		l = e.h;
  1176  		Bputc(&obuf, l);
  1177  		Bputc(&obuf, l>>8);
  1178  		Bputc(&obuf, l>>16);
  1179  		Bputc(&obuf, l>>24);
  1180  		return;
  1181  	}
  1182  	if(t & T_SCONST) {
  1183  		n = a->sval;
  1184  		for(i=0; i<NSNAME; i++) {
  1185  			Bputc(&obuf, *n);
  1186  			n++;
  1187  		}
  1188  		return;
  1189  	}
  1190  	if(t & T_TYPE)
  1191  		Bputc(&obuf, a->type);
  1192  }
  1193  
  1194  void
  1195  outcode(int a, Gen2 *g2)
  1196  {
  1197  	int sf, st, t;
  1198  	Sym *s;
  1199  
  1200  	if(pass == 1)
  1201  		goto out;
  1202  
  1203  jackpot:
  1204  	sf = 0;
  1205  	s = g2->from.sym;
  1206  	while(s != S) {
  1207  		sf = s->sym;
  1208  		if(sf < 0 || sf >= NSYM)
  1209  			sf = 0;
  1210  		t = g2->from.type;
  1211  		if(t == D_ADDR)
  1212  			t = g2->from.index;
  1213  		if(h[sf].type == t)
  1214  		if(h[sf].sym == s)
  1215  			break;
  1216  		zname(s->name, t, sym);
  1217  		s->sym = sym;
  1218  		h[sym].sym = s;
  1219  		h[sym].type = t;
  1220  		sf = sym;
  1221  		sym++;
  1222  		if(sym >= NSYM)
  1223  			sym = 1;
  1224  		break;
  1225  	}
  1226  	st = 0;
  1227  	s = g2->to.sym;
  1228  	while(s != S) {
  1229  		st = s->sym;
  1230  		if(st < 0 || st >= NSYM)
  1231  			st = 0;
  1232  		t = g2->to.type;
  1233  		if(t == D_ADDR)
  1234  			t = g2->to.index;
  1235  		if(h[st].type == t)
  1236  		if(h[st].sym == s)
  1237  			break;
  1238  		zname(s->name, t, sym);
  1239  		s->sym = sym;
  1240  		h[sym].sym = s;
  1241  		h[sym].type = t;
  1242  		st = sym;
  1243  		sym++;
  1244  		if(sym >= NSYM)
  1245  			sym = 1;
  1246  		if(st == sf)
  1247  			goto jackpot;
  1248  		break;
  1249  	}
  1250  	Bputc(&obuf, a);
  1251  	Bputc(&obuf, a>>8);
  1252  	Bputc(&obuf, stmtline);
  1253  	Bputc(&obuf, stmtline>>8);
  1254  	Bputc(&obuf, stmtline>>16);
  1255  	Bputc(&obuf, stmtline>>24);
  1256  	zaddr(&g2->from, sf);
  1257  	zaddr(&g2->to, st);
  1258  
  1259  out:
  1260  	if(a != AGLOBL && a != ADATA)
  1261  		pc++;
  1262  }
  1263  
  1264  void
  1265  outhist(void)
  1266  {
  1267  	Gen g;
  1268  	Hist *h;
  1269  	char *p, *q, *op, c;
  1270  	int n;
  1271  	char *tofree;
  1272  	static int first = 1;
  1273  	static char *goroot, *goroot_final;
  1274  
  1275  	if(first) {
  1276  		// Decide whether we need to rewrite paths from $GOROOT to $GOROOT_FINAL.
  1277  		first = 0;
  1278  		goroot = getenv("GOROOT");
  1279  		goroot_final = getenv("GOROOT_FINAL");
  1280  		if(goroot == nil)
  1281  			goroot = "";
  1282  		if(goroot_final == nil)
  1283  			goroot_final = goroot;
  1284  		if(strcmp(goroot, goroot_final) == 0) {
  1285  			goroot = nil;
  1286  			goroot_final = nil;
  1287  		}
  1288  	}
  1289  
  1290  	tofree = nil;
  1291  
  1292  	g = nullgen;
  1293  	c = pathchar();
  1294  	for(h = hist; h != H; h = h->link) {
  1295  		p = h->name;
  1296  		if(p != nil && goroot != nil) {
  1297  			n = strlen(goroot);
  1298  			if(strncmp(p, goroot, strlen(goroot)) == 0 && p[n] == '/') {
  1299  				tofree = smprint("%s%s", goroot_final, p+n);
  1300  				p = tofree;
  1301  			}
  1302  		}
  1303  		op = 0;
  1304  		if(systemtype(Windows) && p && p[1] == ':'){
  1305  			c = p[2];
  1306  		} else if(p && p[0] != c && h->offset == 0 && pathname){
  1307  			if(systemtype(Windows) && pathname[1] == ':') {
  1308  				op = p;
  1309  				p = pathname;
  1310  				c = p[2];
  1311  			} else if(pathname[0] == c){
  1312  				op = p;
  1313  				p = pathname;
  1314  			}
  1315  		}
  1316  		while(p) {
  1317  			q = strchr(p, c);
  1318  			if(q) {
  1319  				n = q-p;
  1320  				if(n == 0){
  1321  					n = 1;	/* leading "/" */
  1322  					*p = '/';	/* don't emit "\" on windows */
  1323  				}
  1324  				q++;
  1325  			} else {
  1326  				n = strlen(p);
  1327  				q = 0;
  1328  			}
  1329  			if(n) {
  1330  				Bputc(&obuf, ANAME);
  1331  				Bputc(&obuf, ANAME>>8);
  1332  				Bputc(&obuf, D_FILE);	/* type */
  1333  				Bputc(&obuf, 1);	/* sym */
  1334  				Bputc(&obuf, '<');
  1335  				Bwrite(&obuf, p, n);
  1336  				Bputc(&obuf, 0);
  1337  			}
  1338  			p = q;
  1339  			if(p == 0 && op) {
  1340  				p = op;
  1341  				op = 0;
  1342  			}
  1343  		}
  1344  		g.offset = h->offset;
  1345  
  1346  		Bputc(&obuf, AHISTORY);
  1347  		Bputc(&obuf, AHISTORY>>8);
  1348  		Bputc(&obuf, h->line);
  1349  		Bputc(&obuf, h->line>>8);
  1350  		Bputc(&obuf, h->line>>16);
  1351  		Bputc(&obuf, h->line>>24);
  1352  		zaddr(&nullgen, 0);
  1353  		zaddr(&g, 0);
  1354  
  1355  		if(tofree) {
  1356  			free(tofree);
  1357  			tofree = nil;
  1358  		}
  1359  	}
  1360  }
  1361  
  1362  #include "../cc/lexbody"
  1363  #include "../cc/macbody"