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