]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/6a/lex.c
webfs(4): document -d and -D flags
[plan9front.git] / sys / src / cmd / 6a / lex.c
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         "MOVQL",        LTYPE3, AMOVQL,
479         "MOVWLSX",      LTYPE3, AMOVWLSX,
480         "MOVWLZX",      LTYPE3, AMOVWLZX,
481         "MOVWQSX",      LTYPE3, AMOVWQSX,
482         "MOVWQZX",      LTYPE3, AMOVWQZX,
483         "MOVSB",        LTYPE0, AMOVSB,
484         "MOVSL",        LTYPE0, AMOVSL,
485         "MOVSQ",        LTYPE0, AMOVSQ,
486         "MOVSW",        LTYPE0, AMOVSW,
487         "MULB",         LTYPE2, AMULB,
488         "MULL",         LTYPE2, AMULL,
489         "MULQ",         LTYPE2, AMULQ,
490         "MULW",         LTYPE2, AMULW,
491         "NEGB",         LTYPE1, ANEGB,
492         "NEGL",         LTYPE1, ANEGL,
493         "NEGQ",         LTYPE1, ANEGQ,
494         "NEGW",         LTYPE1, ANEGW,
495         "NOP",          LTYPEN, ANOP,
496         "NOTB",         LTYPE1, ANOTB,
497         "NOTL",         LTYPE1, ANOTL,
498         "NOTQ",         LTYPE1, ANOTQ,
499         "NOTW",         LTYPE1, ANOTW,
500         "ORB",          LTYPE3, AORB,
501         "ORL",          LTYPE3, AORL,
502         "ORQ",          LTYPE3, AORQ,
503         "ORW",          LTYPE3, AORW,
504         "OUTB",         LTYPE0, AOUTB,
505         "OUTL",         LTYPE0, AOUTL,
506         "OUTW",         LTYPE0, AOUTW,
507         "OUTSB",        LTYPE0, AOUTSB,
508         "OUTSL",        LTYPE0, AOUTSL,
509         "OUTSW",        LTYPE0, AOUTSW,
510         "POPAL",        LTYPE0, APOPAL,
511         "POPAW",        LTYPE0, APOPAW,
512         "POPFL",        LTYPE0, APOPFL,
513         "POPFQ",        LTYPE0, APOPFQ,
514         "POPFW",        LTYPE0, APOPFW,
515         "POPL",         LTYPE1, APOPL,
516         "POPQ",         LTYPE1, APOPQ,
517         "POPW",         LTYPE1, APOPW,
518         "PUSHAL",       LTYPE0, APUSHAL,
519         "PUSHAW",       LTYPE0, APUSHAW,
520         "PUSHFL",       LTYPE0, APUSHFL,
521         "PUSHFQ",       LTYPE0, APUSHFQ,
522         "PUSHFW",       LTYPE0, APUSHFW,
523         "PUSHL",        LTYPE2, APUSHL,
524         "PUSHQ",        LTYPE2, APUSHQ,
525         "PUSHW",        LTYPE2, APUSHW,
526         "RCLB",         LTYPE3, ARCLB,
527         "RCLL",         LTYPE3, ARCLL,
528         "RCLQ",         LTYPE3, ARCLQ,
529         "RCLW",         LTYPE3, ARCLW,
530         "RCRB",         LTYPE3, ARCRB,
531         "RCRL",         LTYPE3, ARCRL,
532         "RCRQ",         LTYPE3, ARCRQ,
533         "RCRW",         LTYPE3, ARCRW,
534         "RDMSR",        LTYPE0, ARDMSR,
535         "RDPMC",        LTYPE0, ARDPMC,
536         "RDTSC",        LTYPE0, ARDTSC,
537         "REP",          LTYPE0, AREP,
538         "REPN",         LTYPE0, AREPN,
539         "RET",          LTYPE0, ARET,
540         "RETFL",        LTYPERT,ARETFL,
541         "RETFW",        LTYPERT,ARETFW,
542         "RETFQ",        LTYPERT,ARETFQ,
543         "ROLB",         LTYPE3, AROLB,
544         "ROLL",         LTYPE3, AROLL,
545         "ROLQ",         LTYPE3, AROLQ,
546         "ROLW",         LTYPE3, AROLW,
547         "RORB",         LTYPE3, ARORB,
548         "RORL",         LTYPE3, ARORL,
549         "RORQ",         LTYPE3, ARORQ,
550         "RORW",         LTYPE3, ARORW,
551         "RSM",          LTYPE0, ARSM,
552         "SAHF",         LTYPE0, ASAHF,
553         "SALB",         LTYPE3, ASALB,
554         "SALL",         LTYPE3, ASALL,
555         "SALQ",         LTYPE3, ASALQ,
556         "SALW",         LTYPE3, ASALW,
557         "SARB",         LTYPE3, ASARB,
558         "SARL",         LTYPE3, ASARL,
559         "SARQ",         LTYPE3, ASARQ,
560         "SARW",         LTYPE3, ASARW,
561         "SBBB",         LTYPE3, ASBBB,
562         "SBBL",         LTYPE3, ASBBL,
563         "SBBQ",         LTYPE3, ASBBQ,
564         "SBBW",         LTYPE3, ASBBW,
565         "SCASB",        LTYPE0, ASCASB,
566         "SCASL",        LTYPE0, ASCASL,
567         "SCASQ",        LTYPE0, ASCASQ,
568         "SCASW",        LTYPE0, ASCASW,
569         "SETCC",        LTYPE1, ASETCC,
570         "SETCS",        LTYPE1, ASETCS,
571         "SETEQ",        LTYPE1, ASETEQ,
572         "SETGE",        LTYPE1, ASETGE,
573         "SETGT",        LTYPE1, ASETGT,
574         "SETHI",        LTYPE1, ASETHI,
575         "SETLE",        LTYPE1, ASETLE,
576         "SETLS",        LTYPE1, ASETLS,
577         "SETLT",        LTYPE1, ASETLT,
578         "SETMI",        LTYPE1, ASETMI,
579         "SETNE",        LTYPE1, ASETNE,
580         "SETOC",        LTYPE1, ASETOC,
581         "SETOS",        LTYPE1, ASETOS,
582         "SETPC",        LTYPE1, ASETPC,
583         "SETPL",        LTYPE1, ASETPL,
584         "SETPS",        LTYPE1, ASETPS,
585         "SFENCE",       LTYPE0, ASFENCE,
586         "CDQ",          LTYPE0, ACDQ,
587         "CWD",          LTYPE0, ACWD,
588         "CQO",          LTYPE0, ACQO,
589         "SHLB",         LTYPE3, ASHLB,
590         "SHLL",         LTYPES, ASHLL,
591         "SHLQ",         LTYPES, ASHLQ,
592         "SHLW",         LTYPES, ASHLW,
593         "SHRB",         LTYPE3, ASHRB,
594         "SHRL",         LTYPES, ASHRL,
595         "SHRQ",         LTYPES, ASHRQ,
596         "SHRW",         LTYPES, ASHRW,
597         "STC",          LTYPE0, ASTC,
598         "STD",          LTYPE0, ASTD,
599         "STI",          LTYPE0, ASTI,
600         "STOSB",        LTYPE0, ASTOSB,
601         "STOSL",        LTYPE0, ASTOSL,
602         "STOSQ",        LTYPE0, ASTOSQ,
603         "STOSW",        LTYPE0, ASTOSW,
604         "SUBB",         LTYPE3, ASUBB,
605         "SUBL",         LTYPE3, ASUBL,
606         "SUBQ",         LTYPE3, ASUBQ,
607         "SUBW",         LTYPE3, ASUBW,
608         "SYSCALL",      LTYPE0, ASYSCALL,
609         "SYSRET",       LTYPE0, ASYSRET,
610         "SWAPGS",       LTYPE0, ASWAPGS,
611         "TESTB",        LTYPE3, ATESTB,
612         "TESTL",        LTYPE3, ATESTL,
613         "TESTQ",        LTYPE3, ATESTQ,
614         "TESTW",        LTYPE3, ATESTW,
615         "TEXT",         LTYPET, ATEXT,
616         "VERR",         LTYPE2, AVERR,
617         "VERW",         LTYPE2, AVERW,
618         "QUAD",         LTYPE2, AQUAD,
619         "WAIT",         LTYPE0, AWAIT,
620         "WBINVD",       LTYPE0, AWBINVD,
621         "WRMSR",        LTYPE0, AWRMSR,
622         "WORD",         LTYPE2, AWORD,
623         "XADDB",        LTYPE3, AXADDB,
624         "XADDL",        LTYPE3, AXADDL,
625         "XADDQ",        LTYPE3, AXADDQ,
626         "XADDW",        LTYPE3, AXADDW,
627         "XCHGB",        LTYPE3, AXCHGB,
628         "XCHGL",        LTYPE3, AXCHGL,
629         "XCHGQ",        LTYPE3, AXCHGQ,
630         "XCHGW",        LTYPE3, AXCHGW,
631         "XLAT",         LTYPE2, AXLAT,
632         "XORB",         LTYPE3, AXORB,
633         "XORL",         LTYPE3, AXORL,
634         "XORQ",         LTYPE3, AXORQ,
635         "XORW",         LTYPE3, AXORW,
636
637         "CMOVLCC",      LTYPE3, ACMOVLCC,
638         "CMOVLCS",      LTYPE3, ACMOVLCS,
639         "CMOVLEQ",      LTYPE3, ACMOVLEQ,
640         "CMOVLGE",      LTYPE3, ACMOVLGE,
641         "CMOVLGT",      LTYPE3, ACMOVLGT,
642         "CMOVLHI",      LTYPE3, ACMOVLHI,
643         "CMOVLLE",      LTYPE3, ACMOVLLE,
644         "CMOVLLS",      LTYPE3, ACMOVLLS,
645         "CMOVLLT",      LTYPE3, ACMOVLLT,
646         "CMOVLMI",      LTYPE3, ACMOVLMI,
647         "CMOVLNE",      LTYPE3, ACMOVLNE,
648         "CMOVLOC",      LTYPE3, ACMOVLOC,
649         "CMOVLOS",      LTYPE3, ACMOVLOS,
650         "CMOVLPC",      LTYPE3, ACMOVLPC,
651         "CMOVLPL",      LTYPE3, ACMOVLPL,
652         "CMOVLPS",      LTYPE3, ACMOVLPS,
653         "CMOVQCC",      LTYPE3, ACMOVQCC,
654         "CMOVQCS",      LTYPE3, ACMOVQCS,
655         "CMOVQEQ",      LTYPE3, ACMOVQEQ,
656         "CMOVQGE",      LTYPE3, ACMOVQGE,
657         "CMOVQGT",      LTYPE3, ACMOVQGT,
658         "CMOVQHI",      LTYPE3, ACMOVQHI,
659         "CMOVQLE",      LTYPE3, ACMOVQLE,
660         "CMOVQLS",      LTYPE3, ACMOVQLS,
661         "CMOVQLT",      LTYPE3, ACMOVQLT,
662         "CMOVQMI",      LTYPE3, ACMOVQMI,
663         "CMOVQNE",      LTYPE3, ACMOVQNE,
664         "CMOVQOC",      LTYPE3, ACMOVQOC,
665         "CMOVQOS",      LTYPE3, ACMOVQOS,
666         "CMOVQPC",      LTYPE3, ACMOVQPC,
667         "CMOVQPL",      LTYPE3, ACMOVQPL,
668         "CMOVQPS",      LTYPE3, ACMOVQPS,
669         "CMOVWCC",      LTYPE3, ACMOVWCC,
670         "CMOVWCS",      LTYPE3, ACMOVWCS,
671         "CMOVWEQ",      LTYPE3, ACMOVWEQ,
672         "CMOVWGE",      LTYPE3, ACMOVWGE,
673         "CMOVWGT",      LTYPE3, ACMOVWGT,
674         "CMOVWHI",      LTYPE3, ACMOVWHI,
675         "CMOVWLE",      LTYPE3, ACMOVWLE,
676         "CMOVWLS",      LTYPE3, ACMOVWLS,
677         "CMOVWLT",      LTYPE3, ACMOVWLT,
678         "CMOVWMI",      LTYPE3, ACMOVWMI,
679         "CMOVWNE",      LTYPE3, ACMOVWNE,
680         "CMOVWOC",      LTYPE3, ACMOVWOC,
681         "CMOVWOS",      LTYPE3, ACMOVWOS,
682         "CMOVWPC",      LTYPE3, ACMOVWPC,
683         "CMOVWPL",      LTYPE3, ACMOVWPL,
684         "CMOVWPS",      LTYPE3, ACMOVWPS,
685
686         "FMOVB",        LTYPE3, AFMOVB,
687         "FMOVBP",       LTYPE3, AFMOVBP,
688         "FMOVD",        LTYPE3, AFMOVD,
689         "FMOVDP",       LTYPE3, AFMOVDP,
690         "FMOVF",        LTYPE3, AFMOVF,
691         "FMOVFP",       LTYPE3, AFMOVFP,
692         "FMOVL",        LTYPE3, AFMOVL,
693         "FMOVLP",       LTYPE3, AFMOVLP,
694         "FMOVV",        LTYPE3, AFMOVV,
695         "FMOVVP",       LTYPE3, AFMOVVP,
696         "FMOVW",        LTYPE3, AFMOVW,
697         "FMOVWP",       LTYPE3, AFMOVWP,
698         "FMOVX",        LTYPE3, AFMOVX,
699         "FMOVXP",       LTYPE3, AFMOVXP,
700         "FCOMB",        LTYPE3, AFCOMB,
701         "FCOMBP",       LTYPE3, AFCOMBP,
702         "FCOMD",        LTYPE3, AFCOMD,
703         "FCOMDP",       LTYPE3, AFCOMDP,
704         "FCOMDPP",      LTYPE3, AFCOMDPP,
705         "FCOMF",        LTYPE3, AFCOMF,
706         "FCOMFP",       LTYPE3, AFCOMFP,
707         "FCOML",        LTYPE3, AFCOML,
708         "FCOMLP",       LTYPE3, AFCOMLP,
709         "FCOMW",        LTYPE3, AFCOMW,
710         "FCOMWP",       LTYPE3, AFCOMWP,
711         "FUCOM",        LTYPE3, AFUCOM,
712         "FUCOMP",       LTYPE3, AFUCOMP,
713         "FUCOMPP",      LTYPE3, AFUCOMPP,
714         "FADDW",        LTYPE3, AFADDW,
715         "FADDL",        LTYPE3, AFADDL,
716         "FADDF",        LTYPE3, AFADDF,
717         "FADDD",        LTYPE3, AFADDD,
718         "FADDDP",       LTYPE3, AFADDDP,
719         "FSUBDP",       LTYPE3, AFSUBDP,
720         "FSUBW",        LTYPE3, AFSUBW,
721         "FSUBL",        LTYPE3, AFSUBL,
722         "FSUBF",        LTYPE3, AFSUBF,
723         "FSUBD",        LTYPE3, AFSUBD,
724         "FSUBRDP",      LTYPE3, AFSUBRDP,
725         "FSUBRW",       LTYPE3, AFSUBRW,
726         "FSUBRL",       LTYPE3, AFSUBRL,
727         "FSUBRF",       LTYPE3, AFSUBRF,
728         "FSUBRD",       LTYPE3, AFSUBRD,
729         "FMULDP",       LTYPE3, AFMULDP,
730         "FMULW",        LTYPE3, AFMULW,
731         "FMULL",        LTYPE3, AFMULL,
732         "FMULF",        LTYPE3, AFMULF,
733         "FMULD",        LTYPE3, AFMULD,
734         "FDIVDP",       LTYPE3, AFDIVDP,
735         "FDIVW",        LTYPE3, AFDIVW,
736         "FDIVL",        LTYPE3, AFDIVL,
737         "FDIVF",        LTYPE3, AFDIVF,
738         "FDIVD",        LTYPE3, AFDIVD,
739         "FDIVRDP",      LTYPE3, AFDIVRDP,
740         "FDIVRW",       LTYPE3, AFDIVRW,
741         "FDIVRL",       LTYPE3, AFDIVRL,
742         "FDIVRF",       LTYPE3, AFDIVRF,
743         "FDIVRD",       LTYPE3, AFDIVRD,
744         "FXCHD",        LTYPE3, AFXCHD,
745         "FFREE",        LTYPE1, AFFREE,
746         "FLDCW",        LTYPE2, AFLDCW,
747         "FLDENV",       LTYPE1, AFLDENV,
748         "FRSTOR",       LTYPE2, AFRSTOR,
749         "FSAVE",        LTYPE1, AFSAVE,
750         "FSTCW",        LTYPE1, AFSTCW,
751         "FSTENV",       LTYPE1, AFSTENV,
752         "FSTSW",        LTYPE1, AFSTSW,
753         "F2XM1",        LTYPE0, AF2XM1,
754         "FABS",         LTYPE0, AFABS,
755         "FCHS",         LTYPE0, AFCHS,
756         "FCLEX",        LTYPE0, AFCLEX,
757         "FCOS",         LTYPE0, AFCOS,
758         "FDECSTP",      LTYPE0, AFDECSTP,
759         "FINCSTP",      LTYPE0, AFINCSTP,
760         "FINIT",        LTYPE0, AFINIT,
761         "FLD1",         LTYPE0, AFLD1,
762         "FLDL2E",       LTYPE0, AFLDL2E,
763         "FLDL2T",       LTYPE0, AFLDL2T,
764         "FLDLG2",       LTYPE0, AFLDLG2,
765         "FLDLN2",       LTYPE0, AFLDLN2,
766         "FLDPI",        LTYPE0, AFLDPI,
767         "FLDZ",         LTYPE0, AFLDZ,
768         "FNOP",         LTYPE0, AFNOP,
769         "FPATAN",       LTYPE0, AFPATAN,
770         "FPREM",        LTYPE0, AFPREM,
771         "FPREM1",       LTYPE0, AFPREM1,
772         "FPTAN",        LTYPE0, AFPTAN,
773         "FRNDINT",      LTYPE0, AFRNDINT,
774         "FSCALE",       LTYPE0, AFSCALE,
775         "FSIN",         LTYPE0, AFSIN,
776         "FSINCOS",      LTYPE0, AFSINCOS,
777         "FSQRT",        LTYPE0, AFSQRT,
778         "FTST",         LTYPE0, AFTST,
779         "FXAM",         LTYPE0, AFXAM,
780         "FXTRACT",      LTYPE0, AFXTRACT,
781         "FYL2X",        LTYPE0, AFYL2X,
782         "FYL2XP1",      LTYPE0, AFYL2XP1,
783
784         "ADDPD",        LTYPE3, AADDPD,
785         "ADDPS",        LTYPE3, AADDPS,
786         "ADDSD",        LTYPE3, AADDSD,
787         "ADDSS",        LTYPE3, AADDSS,
788         "ANDNPD",       LTYPE3, AANDNPD,
789         "ANDNPS",       LTYPE3, AANDNPS,
790         "ANDPD",        LTYPE3, AANDPD,
791         "ANDPS",        LTYPE3, AANDPS,
792         "CMPPD",        LTYPEXC,ACMPPD,
793         "CMPPS",        LTYPEXC,ACMPPS,
794         "CMPSD",        LTYPEXC,ACMPSD,
795         "CMPSS",        LTYPEXC,ACMPSS,
796         "COMISD",       LTYPE3, ACOMISD,
797         "COMISS",       LTYPE3, ACOMISS,
798         "CVTPL2PD",     LTYPE3, ACVTPL2PD,
799         "CVTPL2PS",     LTYPE3, ACVTPL2PS,
800         "CVTPD2PL",     LTYPE3, ACVTPD2PL,
801         "CVTPD2PS",     LTYPE3, ACVTPD2PS,
802         "CVTPS2PL",     LTYPE3, ACVTPS2PL,
803         "PF2IW",        LTYPE3, APF2IW,
804         "PF2IL",        LTYPE3, APF2IL,
805         "PF2ID",        LTYPE3, APF2IL, /* syn */
806         "PI2FL",        LTYPE3, API2FL,
807         "PI2FD",        LTYPE3, API2FL, /* syn */
808         "PI2FW",        LTYPE3, API2FW,
809         "CVTPS2PD",     LTYPE3, ACVTPS2PD,
810         "CVTSD2SL",     LTYPE3, ACVTSD2SL,
811         "CVTSD2SQ",     LTYPE3, ACVTSD2SQ,
812         "CVTSD2SS",     LTYPE3, ACVTSD2SS,
813         "CVTSL2SD",     LTYPE3, ACVTSL2SD,
814         "CVTSQ2SD",     LTYPE3, ACVTSQ2SD,
815         "CVTSL2SS",     LTYPE3, ACVTSL2SS,
816         "CVTSQ2SS",     LTYPE3, ACVTSQ2SS,
817         "CVTSS2SD",     LTYPE3, ACVTSS2SD,
818         "CVTSS2SL",     LTYPE3, ACVTSS2SL,
819         "CVTSS2SQ",     LTYPE3, ACVTSS2SQ,
820         "CVTTPD2PL",    LTYPE3, ACVTTPD2PL,
821         "CVTTPS2PL",    LTYPE3, ACVTTPS2PL,
822         "CVTTSD2SL",    LTYPE3, ACVTTSD2SL,
823         "CVTTSD2SQ",    LTYPE3, ACVTTSD2SQ,
824         "CVTTSS2SL",    LTYPE3, ACVTTSS2SL,
825         "CVTTSS2SQ",    LTYPE3, ACVTTSS2SQ,
826         "DIVPD",        LTYPE3, ADIVPD,
827         "DIVPS",        LTYPE3, ADIVPS,
828         "DIVSD",        LTYPE3, ADIVSD,
829         "DIVSS",        LTYPE3, ADIVSS,
830         "FXRSTOR",      LTYPE2, AFXRSTOR,
831         "FXRSTOR64",    LTYPE2, AFXRSTOR64,
832         "FXSAVE",       LTYPE1, AFXSAVE,
833         "FXSAVE64",     LTYPE1, AFXSAVE64,
834         "LDMXCSR",      LTYPE2, ALDMXCSR,
835         "MASKMOVOU",    LTYPE3, AMASKMOVOU,
836         "MASKMOVDQU",   LTYPE3, AMASKMOVOU,     /* syn */
837         "MASKMOVQ",     LTYPE3, AMASKMOVQ,
838         "MAXPD",        LTYPE3, AMAXPD,
839         "MAXPS",        LTYPE3, AMAXPS,
840         "MAXSD",        LTYPE3, AMAXSD,
841         "MAXSS",        LTYPE3, AMAXSS,
842         "MINPD",        LTYPE3, AMINPD,
843         "MINPS",        LTYPE3, AMINPS,
844         "MINSD",        LTYPE3, AMINSD,
845         "MINSS",        LTYPE3, AMINSS,
846         "MOVAPD",       LTYPE3, AMOVAPD,
847         "MOVAPS",       LTYPE3, AMOVAPS,
848         "MOVD",         LTYPE3, AMOVQ,  /* syn */
849         "MOVDQ2Q",      LTYPE3, AMOVQ,  /* syn */
850         "MOVO",         LTYPE3, AMOVO,
851         "MOVOA",        LTYPE3, AMOVO,  /* syn */
852         "MOVOU",        LTYPE3, AMOVOU,
853         "MOVHLPS",      LTYPE3, AMOVHLPS,
854         "MOVHPD",       LTYPE3, AMOVHPD,
855         "MOVHPS",       LTYPE3, AMOVHPS,
856         "MOVLHPS",      LTYPE3, AMOVLHPS,
857         "MOVLPD",       LTYPE3, AMOVLPD,
858         "MOVLPS",       LTYPE3, AMOVLPS,
859         "MOVMSKPD",     LTYPE3, AMOVMSKPD,
860         "MOVMSKPS",     LTYPE3, AMOVMSKPS,
861         "MOVNTO",       LTYPE3, AMOVNTO,
862         "MOVNTDQ",      LTYPE3, AMOVNTO,        /* syn */
863         "MOVNTPD",      LTYPE3, AMOVNTPD,
864         "MOVNTPS",      LTYPE3, AMOVNTPS,
865         "MOVNTQ",       LTYPE3, AMOVNTQ,
866         "MOVQOZX",      LTYPE3, AMOVQOZX,
867         "MOVSD",        LTYPE3, AMOVSD,
868         "MOVSS",        LTYPE3, AMOVSS,
869         "MOVUPD",       LTYPE3, AMOVUPD,
870         "MOVUPS",       LTYPE3, AMOVUPS,
871         "MULPD",        LTYPE3, AMULPD,
872         "MULPS",        LTYPE3, AMULPS,
873         "MULSD",        LTYPE3, AMULSD,
874         "MULSS",        LTYPE3, AMULSS,
875         "ORPD",         LTYPE3, AORPD,
876         "ORPS",         LTYPE3, AORPS,
877         "PACKSSLW",     LTYPE3, APACKSSLW,
878         "PACKSSWB",     LTYPE3, APACKSSWB,
879         "PACKUSWB",     LTYPE3, APACKUSWB,
880         "PADDB",        LTYPE3, APADDB,
881         "PADDL",        LTYPE3, APADDL,
882         "PADDQ",        LTYPE3, APADDQ,
883         "PADDSB",       LTYPE3, APADDSB,
884         "PADDSW",       LTYPE3, APADDSW,
885         "PADDUSB",      LTYPE3, APADDUSB,
886         "PADDUSW",      LTYPE3, APADDUSW,
887         "PADDW",        LTYPE3, APADDW,
888         "PAND",         LTYPE3, APAND,
889         "PANDB",        LTYPE3, APANDB,
890         "PANDL",        LTYPE3, APANDL,
891         "PANDSB",       LTYPE3, APANDSB,
892         "PANDSW",       LTYPE3, APANDSW,
893         "PANDUSB",      LTYPE3, APANDUSB,
894         "PANDUSW",      LTYPE3, APANDUSW,
895         "PANDW",        LTYPE3, APANDW,
896         "PANDN",        LTYPE3, APANDN,
897         "PAVGB",        LTYPE3, APAVGB,
898         "PAVGW",        LTYPE3, APAVGW,
899         "PCMPEQB",      LTYPE3, APCMPEQB,
900         "PCMPEQL",      LTYPE3, APCMPEQL,
901         "PCMPEQW",      LTYPE3, APCMPEQW,
902         "PCMPGTB",      LTYPE3, APCMPGTB,
903         "PCMPGTL",      LTYPE3, APCMPGTL,       
904         "PCMPGTW",      LTYPE3, APCMPGTW,
905         "PEXTRW",       LTYPEX, APEXTRW,
906         "PINSRW",       LTYPEX, APINSRW,
907         "PMADDWL",      LTYPE3, APMADDWL,
908         "PMAXSW",       LTYPE3, APMAXSW,
909         "PMAXUB",       LTYPE3, APMAXUB,
910         "PMINSW",       LTYPE3, APMINSW,
911         "PMINUB",       LTYPE3, APMINUB,
912         "PMOVMSKB",     LTYPE3, APMOVMSKB,
913         "PMULHRW",      LTYPE3, APMULHRW,
914         "PMULHUW",      LTYPE3, APMULHUW,
915         "PMULHW",       LTYPE3, APMULHW,
916         "PMULLW",       LTYPE3, APMULLW,
917         "PMULULQ",      LTYPE3, APMULULQ,
918         "POR",          LTYPE3, APOR,
919         "PSADBW",       LTYPE3, APSADBW,
920         "PSHUFHW",      LTYPEX, APSHUFHW,
921         "PSHUFL",       LTYPEX, APSHUFL,
922         "PSHUFLW",      LTYPEX, APSHUFLW,
923         "PSHUFW",       LTYPEX, APSHUFW,
924         "PSLLO",        LTYPE3, APSLLO,
925         "PSLLDQ",       LTYPE3, APSLLO, /* syn */
926         "PSLLL",        LTYPE3, APSLLL,
927         "PSLLQ",        LTYPE3, APSLLQ,
928         "PSLLW",        LTYPE3, APSLLW,
929         "PSRAL",        LTYPE3, APSRAL,
930         "PSRAW",        LTYPE3, APSRAW,
931         "PSRLO",        LTYPE3, APSRLO,
932         "PSRLDQ",       LTYPE3, APSRLO, /* syn */
933         "PSRLL",        LTYPE3, APSRLL,
934         "PSRLQ",        LTYPE3, APSRLQ,
935         "PSRLW",        LTYPE3, APSRLW,
936         "PSUBB",        LTYPE3, APSUBB,
937         "PSUBL",        LTYPE3, APSUBL,
938         "PSUBQ",        LTYPE3, APSUBQ,
939         "PSUBSB",       LTYPE3, APSUBSB,
940         "PSUBSW",       LTYPE3, APSUBSW,
941         "PSUBUSB",      LTYPE3, APSUBUSB,
942         "PSUBUSW",      LTYPE3, APSUBUSW,
943         "PSUBW",        LTYPE3, APSUBW,
944         "PUNPCKHBW",    LTYPE3, APUNPCKHBW,
945         "PUNPCKHLQ",    LTYPE3, APUNPCKHLQ,
946         "PUNPCKHQDQ",   LTYPE3, APUNPCKHQDQ,
947         "PUNPCKHWL",    LTYPE3, APUNPCKHWL,
948         "PUNPCKLBW",    LTYPE3, APUNPCKLBW,
949         "PUNPCKLLQ",    LTYPE3, APUNPCKLLQ,
950         "PUNPCKLQDQ",   LTYPE3, APUNPCKLQDQ,
951         "PUNPCKLWL",    LTYPE3, APUNPCKLWL,
952         "PXOR",         LTYPE3, APXOR,
953         "RCPPS",        LTYPE3, ARCPPS,
954         "RCPSS",        LTYPE3, ARCPSS,
955         "RSQRTPS",      LTYPE3, ARSQRTPS,
956         "RSQRTSS",      LTYPE3, ARSQRTSS,
957         "SHUFPD",       LTYPEX, ASHUFPD,
958         "SHUFPS",       LTYPEX, ASHUFPS,
959         "SQRTPD",       LTYPE3, ASQRTPD,
960         "SQRTPS",       LTYPE3, ASQRTPS,
961         "SQRTSD",       LTYPE3, ASQRTSD,
962         "SQRTSS",       LTYPE3, ASQRTSS,
963         "STMXCSR",      LTYPE1, ASTMXCSR,
964         "SUBPD",        LTYPE3, ASUBPD,
965         "SUBPS",        LTYPE3, ASUBPS,
966         "SUBSD",        LTYPE3, ASUBSD,
967         "SUBSS",        LTYPE3, ASUBSS,
968         "UCOMISD",      LTYPE3, AUCOMISD,
969         "UCOMISS",      LTYPE3, AUCOMISS,
970         "UNPCKHPD",     LTYPE3, AUNPCKHPD,
971         "UNPCKHPS",     LTYPE3, AUNPCKHPS,
972         "UNPCKLPD",     LTYPE3, AUNPCKLPD,
973         "UNPCKLPS",     LTYPE3, AUNPCKLPS,
974         "XORPD",        LTYPE3, AXORPD,
975         "XORPS",        LTYPE3, AXORPS,
976
977         0
978 };
979
980 void
981 cinit(void)
982 {
983         Sym *s;
984         int i;
985
986         nullgen.sym = S;
987         nullgen.offset = 0;
988         if(FPCHIP)
989                 nullgen.dval = 0;
990         for(i=0; i<sizeof(nullgen.sval); i++)
991                 nullgen.sval[i] = 0;
992         nullgen.type = D_NONE;
993         nullgen.index = D_NONE;
994         nullgen.scale = 0;
995
996         nerrors = 0;
997         iostack = I;
998         iofree = I;
999         peekc = IGN;
1000         nhunk = 0;
1001         for(i=0; i<NHASH; i++)
1002                 hash[i] = S;
1003         for(i=0; itab[i].name; i++) {
1004                 s = slookup(itab[i].name);
1005                 if(s->type != LNAME)
1006                         yyerror("double initialization %s", itab[i].name);
1007                 s->type = itab[i].type;
1008                 s->value = itab[i].value;
1009         }
1010
1011         pathname = allocn(pathname, 0, 100);
1012         if(mygetwd(pathname, 99) == 0) {
1013                 pathname = allocn(pathname, 100, 900);
1014                 if(mygetwd(pathname, 999) == 0)
1015                         strcpy(pathname, "/???");
1016         }
1017 }
1018
1019 void
1020 checkscale(int scale)
1021 {
1022
1023         switch(scale) {
1024         case 1:
1025         case 2:
1026         case 4:
1027         case 8:
1028                 return;
1029         }
1030         yyerror("scale must be 1248: %d", scale);
1031 }
1032
1033 void
1034 syminit(Sym *s)
1035 {
1036
1037         s->type = LNAME;
1038         s->value = 0;
1039 }
1040
1041 void
1042 cclean(void)
1043 {
1044         Gen2 g2;
1045
1046         g2.from = nullgen;
1047         g2.to = nullgen;
1048         outcode(AEND, &g2);
1049         Bflush(&obuf);
1050 }
1051
1052 void
1053 zname(char *n, int t, int s)
1054 {
1055
1056         Bputc(&obuf, ANAME);            /* as(2) */
1057         Bputc(&obuf, ANAME>>8);
1058         Bputc(&obuf, t);                /* type */
1059         Bputc(&obuf, s);                /* sym */
1060         while(*n) {
1061                 Bputc(&obuf, *n);
1062                 n++;
1063         }
1064         Bputc(&obuf, 0);
1065 }
1066
1067 void
1068 zaddr(Gen *a, int s)
1069 {
1070         long l;
1071         int i, t;
1072         char *n;
1073         Ieee e;
1074
1075         t = 0;
1076         if(a->index != D_NONE || a->scale != 0)
1077                 t |= T_INDEX;
1078         if(a->offset != 0) {
1079                 t |= T_OFFSET;
1080                 l = a->offset;
1081                 if((vlong)l != a->offset)
1082                         t |= T_64;
1083         }
1084         if(s != 0)
1085                 t |= T_SYM;
1086
1087         switch(a->type) {
1088         default:
1089                 t |= T_TYPE;
1090                 break;
1091         case D_FCONST:
1092                 t |= T_FCONST;
1093                 break;
1094         case D_SCONST:
1095                 t |= T_SCONST;
1096                 break;
1097         case D_NONE:
1098                 break;
1099         }
1100         Bputc(&obuf, t);
1101
1102         if(t & T_INDEX) {       /* implies index, scale */
1103                 Bputc(&obuf, a->index);
1104                 Bputc(&obuf, a->scale);
1105         }
1106         if(t & T_OFFSET) {      /* implies offset */
1107                 l = a->offset;
1108                 Bputc(&obuf, l);
1109                 Bputc(&obuf, l>>8);
1110                 Bputc(&obuf, l>>16);
1111                 Bputc(&obuf, l>>24);
1112                 if(t & T_64) {
1113                         l = a->offset>>32;
1114                         Bputc(&obuf, l);
1115                         Bputc(&obuf, l>>8);
1116                         Bputc(&obuf, l>>16);
1117                         Bputc(&obuf, l>>24);
1118                 }
1119         }
1120         if(t & T_SYM)           /* implies sym */
1121                 Bputc(&obuf, s);
1122         if(t & T_FCONST) {
1123                 ieeedtod(&e, a->dval);
1124                 l = e.l;
1125                 Bputc(&obuf, l);
1126                 Bputc(&obuf, l>>8);
1127                 Bputc(&obuf, l>>16);
1128                 Bputc(&obuf, l>>24);
1129                 l = e.h;
1130                 Bputc(&obuf, l);
1131                 Bputc(&obuf, l>>8);
1132                 Bputc(&obuf, l>>16);
1133                 Bputc(&obuf, l>>24);
1134                 return;
1135         }
1136         if(t & T_SCONST) {
1137                 n = a->sval;
1138                 for(i=0; i<NSNAME; i++) {
1139                         Bputc(&obuf, *n);
1140                         n++;
1141                 }
1142                 return;
1143         }
1144         if(t & T_TYPE)
1145                 Bputc(&obuf, a->type);
1146 }
1147
1148 void
1149 outcode(int a, Gen2 *g2)
1150 {
1151         int sf, st, t;
1152         Sym *s;
1153
1154         if(pass == 1)
1155                 goto out;
1156
1157 jackpot:
1158         sf = 0;
1159         s = g2->from.sym;
1160         while(s != S) {
1161                 sf = s->sym;
1162                 if(sf < 0 || sf >= NSYM)
1163                         sf = 0;
1164                 t = g2->from.type;
1165                 if(t == D_ADDR)
1166                         t = g2->from.index;
1167                 if(h[sf].type == t)
1168                 if(h[sf].sym == s)
1169                         break;
1170                 zname(s->name, t, sym);
1171                 s->sym = sym;
1172                 h[sym].sym = s;
1173                 h[sym].type = t;
1174                 sf = sym;
1175                 sym++;
1176                 if(sym >= NSYM)
1177                         sym = 1;
1178                 break;
1179         }
1180         st = 0;
1181         s = g2->to.sym;
1182         while(s != S) {
1183                 st = s->sym;
1184                 if(st < 0 || st >= NSYM)
1185                         st = 0;
1186                 t = g2->to.type;
1187                 if(t == D_ADDR)
1188                         t = g2->to.index;
1189                 if(h[st].type == t)
1190                 if(h[st].sym == s)
1191                         break;
1192                 zname(s->name, t, sym);
1193                 s->sym = sym;
1194                 h[sym].sym = s;
1195                 h[sym].type = t;
1196                 st = sym;
1197                 sym++;
1198                 if(sym >= NSYM)
1199                         sym = 1;
1200                 if(st == sf)
1201                         goto jackpot;
1202                 break;
1203         }
1204         Bputc(&obuf, a);
1205         Bputc(&obuf, a>>8);
1206         Bputc(&obuf, lineno);
1207         Bputc(&obuf, lineno>>8);
1208         Bputc(&obuf, lineno>>16);
1209         Bputc(&obuf, lineno>>24);
1210         zaddr(&g2->from, sf);
1211         zaddr(&g2->to, st);
1212
1213 out:
1214         if(a != AGLOBL && a != ADATA && a != AMODE)
1215                 pc++;
1216 }
1217
1218 void
1219 outhist(void)
1220 {
1221         Gen g;
1222         Hist *h;
1223         char *p, *q, *op, c;
1224         int n;
1225
1226         g = nullgen;
1227         c = pathchar();
1228         for(h = hist; h != H; h = h->link) {
1229                 p = h->name;
1230                 op = 0;
1231                 /* on windows skip drive specifier in pathname */
1232                 if(systemtype(Windows) && p && p[1] == ':'){
1233                         p += 2;
1234                         c = *p;
1235                 }
1236                 if(p && p[0] != c && h->offset == 0 && pathname){
1237                         /* on windows skip drive specifier in pathname */
1238                         if(systemtype(Windows) && pathname[1] == ':') {
1239                                 op = p;
1240                                 p = pathname+2;
1241                                 c = *p;
1242                         } else if(pathname[0] == c){
1243                                 op = p;
1244                                 p = pathname;
1245                         }
1246                 }
1247                 while(p) {
1248                         q = strchr(p, c);
1249                         if(q) {
1250                                 n = q-p;
1251                                 if(n == 0){
1252                                         n = 1;  /* leading "/" */
1253                                         *p = '/';       /* don't emit "\" on windows */
1254                                 }
1255                                 q++;
1256                         } else {
1257                                 n = strlen(p);
1258                                 q = 0;
1259                         }
1260                         if(n) {
1261                                 Bputc(&obuf, ANAME);
1262                                 Bputc(&obuf, ANAME>>8);
1263                                 Bputc(&obuf, D_FILE);   /* type */
1264                                 Bputc(&obuf, 1);        /* sym */
1265                                 Bputc(&obuf, '<');
1266                                 Bwrite(&obuf, p, n);
1267                                 Bputc(&obuf, 0);
1268                         }
1269                         p = q;
1270                         if(p == 0 && op) {
1271                                 p = op;
1272                                 op = 0;
1273                         }
1274                 }
1275                 g.offset = h->offset;
1276
1277                 Bputc(&obuf, AHISTORY);
1278                 Bputc(&obuf, AHISTORY>>8);
1279                 Bputc(&obuf, h->line);
1280                 Bputc(&obuf, h->line>>8);
1281                 Bputc(&obuf, h->line>>16);
1282                 Bputc(&obuf, h->line>>24);
1283                 zaddr(&nullgen, 0);
1284                 zaddr(&g, 0);
1285         }
1286 }
1287
1288 #include "../cc/lexbody"
1289 #include "../cc/macbody"
1290 #include "../cc/compat"