]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/8a/lex.c
Libflac: Tell it that we have stdint.h so it finds SIZE_MAX
[plan9front.git] / sys / src / cmd / 8a / lex.c
1 #include <ctype.h>
2 #define EXTERN
3 #include "a.h"
4 #include "y.tab.h"
5
6 void
7 main(int argc, char *argv[])
8 {
9         char *p;
10         int nout, nproc, status, i, c;
11
12         thechar = '8';
13         thestring = "386";
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         "AH",           LBREG,  D_AH,
173         "CH",           LBREG,  D_CH,
174         "DH",           LBREG,  D_DH,
175         "BH",           LBREG,  D_BH,
176
177         "AX",           LLREG,  D_AX,
178         "CX",           LLREG,  D_CX,
179         "DX",           LLREG,  D_DX,
180         "BX",           LLREG,  D_BX,
181 /*      "SP",           LLREG,  D_SP,   */
182         "BP",           LLREG,  D_BP,
183         "SI",           LLREG,  D_SI,
184         "DI",           LLREG,  D_DI,
185
186         "F0",           LFREG,  D_F0+0,
187         "F1",           LFREG,  D_F0+1,
188         "F2",           LFREG,  D_F0+2,
189         "F3",           LFREG,  D_F0+3,
190         "F4",           LFREG,  D_F0+4,
191         "F5",           LFREG,  D_F0+5,
192         "F6",           LFREG,  D_F0+6,
193         "F7",           LFREG,  D_F0+7,
194
195         "M0",           LMREG,  D_M0+0,
196         "M1",           LMREG,  D_M0+1,
197         "M2",           LMREG,  D_M0+2,
198         "M3",           LMREG,  D_M0+3,
199         "M4",           LMREG,  D_M0+4,
200         "M5",           LMREG,  D_M0+5,
201         "M6",           LMREG,  D_M0+6,
202         "M7",           LMREG,  D_M0+7,
203
204         "X0",           LXREG,  D_X0+0,
205         "X1",           LXREG,  D_X0+1,
206         "X2",           LXREG,  D_X0+2,
207         "X3",           LXREG,  D_X0+3,
208         "X4",           LXREG,  D_X0+4,
209         "X5",           LXREG,  D_X0+5,
210         "X6",           LXREG,  D_X0+6,
211         "X7",           LXREG,  D_X0+7,
212
213         "CS",           LSREG,  D_CS,
214         "SS",           LSREG,  D_SS,
215         "DS",           LSREG,  D_DS,
216         "ES",           LSREG,  D_ES,
217         "FS",           LSREG,  D_FS,
218         "GS",           LSREG,  D_GS,
219
220         "GDTR",         LBREG,  D_GDTR,
221         "IDTR",         LBREG,  D_IDTR,
222         "LDTR",         LBREG,  D_LDTR,
223         "MSW",          LBREG,  D_MSW,
224         "TASK",         LBREG,  D_TASK,
225
226         "CR0",          LBREG,  D_CR+0,
227         "CR1",          LBREG,  D_CR+1,
228         "CR2",          LBREG,  D_CR+2,
229         "CR3",          LBREG,  D_CR+3,
230         "CR4",          LBREG,  D_CR+4,
231         "CR5",          LBREG,  D_CR+5,
232         "CR6",          LBREG,  D_CR+6,
233         "CR7",          LBREG,  D_CR+7,
234
235         "DR0",          LBREG,  D_DR+0,
236         "DR1",          LBREG,  D_DR+1,
237         "DR2",          LBREG,  D_DR+2,
238         "DR3",          LBREG,  D_DR+3,
239         "DR4",          LBREG,  D_DR+4,
240         "DR5",          LBREG,  D_DR+5,
241         "DR6",          LBREG,  D_DR+6,
242         "DR7",          LBREG,  D_DR+7,
243
244         "TR0",          LBREG,  D_TR+0,
245         "TR1",          LBREG,  D_TR+1,
246         "TR2",          LBREG,  D_TR+2,
247         "TR3",          LBREG,  D_TR+3,
248         "TR4",          LBREG,  D_TR+4,
249         "TR5",          LBREG,  D_TR+5,
250         "TR6",          LBREG,  D_TR+6,
251         "TR7",          LBREG,  D_TR+7,
252
253         "AAA",          LTYPE0, AAAA,
254         "AAD",          LTYPE0, AAAD,
255         "AAM",          LTYPE0, AAAM,
256         "AAS",          LTYPE0, AAAS,
257         "ADCB",         LTYPE3, AADCB,
258         "ADCL",         LTYPE3, AADCL,
259         "ADCW",         LTYPE3, AADCW,
260         "ADDB",         LTYPE3, AADDB,
261         "ADDL",         LTYPE3, AADDL,
262         "ADDW",         LTYPE3, AADDW,
263         "ADJSP",        LTYPE2, AADJSP,
264         "ANDB",         LTYPE3, AANDB,
265         "ANDL",         LTYPE3, AANDL,
266         "ANDW",         LTYPE3, AANDW,
267         "ARPL",         LTYPE3, AARPL,
268         "BOUNDL",       LTYPE3, ABOUNDL,
269         "BOUNDW",       LTYPE3, ABOUNDW,
270         "BSFL",         LTYPE3, ABSFL,
271         "BSFW",         LTYPE3, ABSFW,
272         "BSRL",         LTYPE3, ABSRL,
273         "BSRW",         LTYPE3, ABSRW,
274         "BTCL",         LTYPE3, ABTCL,
275         "BTCW",         LTYPE3, ABTCW,
276         "BTL",          LTYPE3, ABTL,
277         "BTRL",         LTYPE3, ABTRL,
278         "BTRW",         LTYPE3, ABTRW,
279         "BTSL",         LTYPE3, ABTSL,
280         "BTSW",         LTYPE3, ABTSW,
281         "BTW",          LTYPE3, ABTW,
282         "BYTE",         LTYPE2, ABYTE,
283         "CALL",         LTYPEC, ACALL,
284         "CLC",          LTYPE0, ACLC,
285         "CLD",          LTYPE0, ACLD,
286         "CLI",          LTYPE0, ACLI,
287         "CLTS",         LTYPE0, ACLTS,
288         "CMC",          LTYPE0, ACMC,
289         "CMPB",         LTYPE4, ACMPB,
290         "CMPL",         LTYPE4, ACMPL,
291         "CMPW",         LTYPE4, ACMPW,
292         "CMPSB",        LTYPE0, ACMPSB,
293         "CMPSL",        LTYPE0, ACMPSL,
294         "CMPSW",        LTYPE0, ACMPSW,
295         "CMPXCHGB",     LTYPE3, ACMPXCHGB,
296         "CMPXCHGL",     LTYPE3, ACMPXCHGL,
297         "CMPXCHGW",     LTYPE3, ACMPXCHGW,
298         "CPUID",        LTYPE0, ACPUID,
299         "DAA",          LTYPE0, ADAA,
300         "DAS",          LTYPE0, ADAS,
301         "DATA",         LTYPED, ADATA,
302         "DECB",         LTYPE1, ADECB,
303         "DECL",         LTYPE1, ADECL,
304         "DECW",         LTYPE1, ADECW,
305         "DIVB",         LTYPE2, ADIVB,
306         "DIVL",         LTYPE2, ADIVL,
307         "DIVW",         LTYPE2, ADIVW,
308         "END",          LTYPE0, AEND,
309         "ENTER",        LTYPE2, AENTER,
310         "GLOBL",        LTYPEG, AGLOBL,
311         "HLT",          LTYPE0, AHLT,
312         "IDIVB",        LTYPE2, AIDIVB,
313         "IDIVL",        LTYPE2, AIDIVL,
314         "IDIVW",        LTYPE2, AIDIVW,
315         "IMULB",        LTYPEI, AIMULB,
316         "IMULL",        LTYPEI, AIMULL,
317         "IMULW",        LTYPEI, AIMULW,
318         "INB",          LTYPE0, AINB,
319         "INL",          LTYPE0, AINL,
320         "INW",          LTYPE0, AINW,
321         "INCB",         LTYPE1, AINCB,
322         "INCL",         LTYPE1, AINCL,
323         "INCW",         LTYPE1, AINCW,
324         "INSB",         LTYPE0, AINSB,
325         "INSL",         LTYPE0, AINSL,
326         "INSW",         LTYPE0, AINSW,
327         "INT",          LTYPE2, AINT,
328         "INTO",         LTYPE0, AINTO,
329         "IRETL",        LTYPE0, AIRETL,
330         "IRETW",        LTYPE0, AIRETW,
331
332         "JOS",          LTYPER, AJOS,
333         "JO",           LTYPER, AJOS,   /* alternate */
334         "JOC",          LTYPER, AJOC,
335         "JNO",          LTYPER, AJOC,   /* alternate */
336         "JCS",          LTYPER, AJCS,
337         "JB",           LTYPER, AJCS,   /* alternate */
338         "JC",           LTYPER, AJCS,   /* alternate */
339         "JNAE",         LTYPER, AJCS,   /* alternate */
340         "JLO",          LTYPER, AJCS,   /* alternate */
341         "JCC",          LTYPER, AJCC,
342         "JAE",          LTYPER, AJCC,   /* alternate */
343         "JNB",          LTYPER, AJCC,   /* alternate */
344         "JNC",          LTYPER, AJCC,   /* alternate */
345         "JHS",          LTYPER, AJCC,   /* alternate */
346         "JEQ",          LTYPER, AJEQ,
347         "JE",           LTYPER, AJEQ,   /* alternate */
348         "JZ",           LTYPER, AJEQ,   /* alternate */
349         "JNE",          LTYPER, AJNE,
350         "JNZ",          LTYPER, AJNE,   /* alternate */
351         "JLS",          LTYPER, AJLS,
352         "JBE",          LTYPER, AJLS,   /* alternate */
353         "JNA",          LTYPER, AJLS,   /* alternate */
354         "JHI",          LTYPER, AJHI,
355         "JA",           LTYPER, AJHI,   /* alternate */
356         "JNBE",         LTYPER, AJHI,   /* alternate */
357         "JMI",          LTYPER, AJMI,
358         "JS",           LTYPER, AJMI,   /* alternate */
359         "JPL",          LTYPER, AJPL,
360         "JNS",          LTYPER, AJPL,   /* alternate */
361         "JPS",          LTYPER, AJPS,
362         "JP",           LTYPER, AJPS,   /* alternate */
363         "JPE",          LTYPER, AJPS,   /* alternate */
364         "JPC",          LTYPER, AJPC,
365         "JNP",          LTYPER, AJPC,   /* alternate */
366         "JPO",          LTYPER, AJPC,   /* alternate */
367         "JLT",          LTYPER, AJLT,
368         "JL",           LTYPER, AJLT,   /* alternate */
369         "JNGE",         LTYPER, AJLT,   /* alternate */
370         "JGE",          LTYPER, AJGE,
371         "JNL",          LTYPER, AJGE,   /* alternate */
372         "JLE",          LTYPER, AJLE,
373         "JNG",          LTYPER, AJLE,   /* alternate */
374         "JGT",          LTYPER, AJGT,
375         "JG",           LTYPER, AJGT,   /* alternate */
376         "JNLE",         LTYPER, AJGT,   /* alternate */
377
378         "JCXZ",         LTYPER, AJCXZ,
379         "JMP",          LTYPEC, AJMP,
380         "LAHF",         LTYPE0, ALAHF,
381         "LARL",         LTYPE3, ALARL,
382         "LARW",         LTYPE3, ALARW,
383         "LEAL",         LTYPE3, ALEAL,
384         "LEAW",         LTYPE3, ALEAW,
385         "LEAVEL",       LTYPE0, ALEAVEL,
386         "LEAVEW",       LTYPE0, ALEAVEW,
387         "LOCK",         LTYPE0, ALOCK,
388         "LODSB",        LTYPE0, ALODSB,
389         "LODSL",        LTYPE0, ALODSL,
390         "LODSW",        LTYPE0, ALODSW,
391         "LONG",         LTYPE2, ALONG,
392         "LOOP",         LTYPER, ALOOP,
393         "LOOPEQ",       LTYPER, ALOOPEQ,
394         "LOOPNE",       LTYPER, ALOOPNE,
395         "LSLL",         LTYPE3, ALSLL,
396         "LSLW",         LTYPE3, ALSLW,
397         "MOVB",         LTYPE3, AMOVB,
398         "MOVL",         LTYPEM, AMOVL,
399         "MOVW",         LTYPEM, AMOVW,
400         "MOVBLSX",      LTYPE3, AMOVBLSX,
401         "MOVBLZX",      LTYPE3, AMOVBLZX,
402         "MOVBWSX",      LTYPE3, AMOVBWSX,
403         "MOVBWZX",      LTYPE3, AMOVBWZX,
404         "MOVWLSX",      LTYPE3, AMOVWLSX,
405         "MOVWLZX",      LTYPE3, AMOVWLZX,
406         "MOVSB",        LTYPE0, AMOVSB,
407         "MOVSL",        LTYPE0, AMOVSL,
408         "MOVSW",        LTYPE0, AMOVSW,
409         "MULB",         LTYPE2, AMULB,
410         "MULL",         LTYPE2, AMULL,
411         "MULW",         LTYPE2, AMULW,
412         "NEGB",         LTYPE1, ANEGB,
413         "NEGL",         LTYPE1, ANEGL,
414         "NEGW",         LTYPE1, ANEGW,
415         "NOP",          LTYPEN, ANOP,
416         "NOTB",         LTYPE1, ANOTB,
417         "NOTL",         LTYPE1, ANOTL,
418         "NOTW",         LTYPE1, ANOTW,
419         "ORB",          LTYPE3, AORB,
420         "ORL",          LTYPE3, AORL,
421         "ORW",          LTYPE3, AORW,
422         "OUTB",         LTYPE0, AOUTB,
423         "OUTL",         LTYPE0, AOUTL,
424         "OUTW",         LTYPE0, AOUTW,
425         "OUTSB",        LTYPE0, AOUTSB,
426         "OUTSL",        LTYPE0, AOUTSL,
427         "OUTSW",        LTYPE0, AOUTSW,
428         "POPAL",        LTYPE0, APOPAL,
429         "POPAW",        LTYPE0, APOPAW,
430         "POPFL",        LTYPE0, APOPFL,
431         "POPFW",        LTYPE0, APOPFW,
432         "POPL",         LTYPE1, APOPL,
433         "POPW",         LTYPE1, APOPW,
434         "PUSHAL",       LTYPE0, APUSHAL,
435         "PUSHAW",       LTYPE0, APUSHAW,
436         "PUSHFL",       LTYPE0, APUSHFL,
437         "PUSHFW",       LTYPE0, APUSHFW,
438         "PUSHL",        LTYPE2, APUSHL,
439         "PUSHW",        LTYPE2, APUSHW,
440         "RCLB",         LTYPE3, ARCLB,
441         "RCLL",         LTYPE3, ARCLL,
442         "RCLW",         LTYPE3, ARCLW,
443         "RCRB",         LTYPE3, ARCRB,
444         "RCRL",         LTYPE3, ARCRL,
445         "RCRW",         LTYPE3, ARCRW,
446         "REP",          LTYPE0, AREP,
447         "REPN",         LTYPE0, AREPN,
448         "RET",          LTYPE0, ARET,
449         "ROLB",         LTYPE3, AROLB,
450         "ROLL",         LTYPE3, AROLL,
451         "ROLW",         LTYPE3, AROLW,
452         "RORB",         LTYPE3, ARORB,
453         "RORL",         LTYPE3, ARORL,
454         "RORW",         LTYPE3, ARORW,
455         "SAHF",         LTYPE0, ASAHF,
456         "SALB",         LTYPE3, ASALB,
457         "SALL",         LTYPE3, ASALL,
458         "SALW",         LTYPE3, ASALW,
459         "SARB",         LTYPE3, ASARB,
460         "SARL",         LTYPE3, ASARL,
461         "SARW",         LTYPE3, ASARW,
462         "SBBB",         LTYPE3, ASBBB,
463         "SBBL",         LTYPE3, ASBBL,
464         "SBBW",         LTYPE3, ASBBW,
465         "SCASB",        LTYPE0, ASCASB,
466         "SCASL",        LTYPE0, ASCASL,
467         "SCASW",        LTYPE0, ASCASW,
468         "SETCC",        LTYPE1, ASETCC,
469         "SETCS",        LTYPE1, ASETCS,
470         "SETEQ",        LTYPE1, ASETEQ,
471         "SETGE",        LTYPE1, ASETGE,
472         "SETGT",        LTYPE1, ASETGT,
473         "SETHI",        LTYPE1, ASETHI,
474         "SETLE",        LTYPE1, ASETLE,
475         "SETLS",        LTYPE1, ASETLS,
476         "SETLT",        LTYPE1, ASETLT,
477         "SETMI",        LTYPE1, ASETMI,
478         "SETNE",        LTYPE1, ASETNE,
479         "SETOC",        LTYPE1, ASETOC,
480         "SETOS",        LTYPE1, ASETOS,
481         "SETPC",        LTYPE1, ASETPC,
482         "SETPL",        LTYPE1, ASETPL,
483         "SETPS",        LTYPE1, ASETPS,
484         "CDQ",          LTYPE0, ACDQ,
485         "CWD",          LTYPE0, ACWD,
486         "SHLB",         LTYPE3, ASHLB,
487         "SHLL",         LTYPES, ASHLL,
488         "SHLW",         LTYPES, ASHLW,
489         "SHRB",         LTYPE3, ASHRB,
490         "SHRL",         LTYPES, ASHRL,
491         "SHRW",         LTYPES, ASHRW,
492         "STC",          LTYPE0, ASTC,
493         "STD",          LTYPE0, ASTD,
494         "STI",          LTYPE0, ASTI,
495         "STOSB",        LTYPE0, ASTOSB,
496         "STOSL",        LTYPE0, ASTOSL,
497         "STOSW",        LTYPE0, ASTOSW,
498         "SUBB",         LTYPE3, ASUBB,
499         "SUBL",         LTYPE3, ASUBL,
500         "SUBW",         LTYPE3, ASUBW,
501         "SYSCALL",      LTYPE0, ASYSCALL,
502         "TESTB",        LTYPE3, ATESTB,
503         "TESTL",        LTYPE3, ATESTL,
504         "TESTW",        LTYPE3, ATESTW,
505         "TEXT",         LTYPET, ATEXT,
506         "VERR",         LTYPE2, AVERR,
507         "VERW",         LTYPE2, AVERW,
508         "WAIT",         LTYPE0, AWAIT,
509         "WORD",         LTYPE2, AWORD,
510         "XCHGB",        LTYPE3, AXCHGB,
511         "XCHGL",        LTYPE3, AXCHGL,
512         "XCHGW",        LTYPE3, AXCHGW,
513         "XLAT",         LTYPE2, AXLAT,
514         "XORB",         LTYPE3, AXORB,
515         "XORL",         LTYPE3, AXORL,
516         "XORW",         LTYPE3, AXORW,
517
518         "CMOVLCC",      LTYPE3, ACMOVLCC,
519         "CMOVLCS",      LTYPE3, ACMOVLCS,
520         "CMOVLEQ",      LTYPE3, ACMOVLEQ,
521         "CMOVLGE",      LTYPE3, ACMOVLGE,
522         "CMOVLGT",      LTYPE3, ACMOVLGT,
523         "CMOVLHI",      LTYPE3, ACMOVLHI,
524         "CMOVLLE",      LTYPE3, ACMOVLLE,
525         "CMOVLLS",      LTYPE3, ACMOVLLS,
526         "CMOVLLT",      LTYPE3, ACMOVLLT,
527         "CMOVLMI",      LTYPE3, ACMOVLMI,
528         "CMOVLNE",      LTYPE3, ACMOVLNE,
529         "CMOVLOC",      LTYPE3, ACMOVLOC,
530         "CMOVLOS",      LTYPE3, ACMOVLOS,
531         "CMOVLPC",      LTYPE3, ACMOVLPC,
532         "CMOVLPL",      LTYPE3, ACMOVLPL,
533         "CMOVLPS",      LTYPE3, ACMOVLPS,
534         "CMOVWCC",      LTYPE3, ACMOVWCC,
535         "CMOVWCS",      LTYPE3, ACMOVWCS,
536         "CMOVWEQ",      LTYPE3, ACMOVWEQ,
537         "CMOVWGE",      LTYPE3, ACMOVWGE,
538         "CMOVWGT",      LTYPE3, ACMOVWGT,
539         "CMOVWHI",      LTYPE3, ACMOVWHI,
540         "CMOVWLE",      LTYPE3, ACMOVWLE,
541         "CMOVWLS",      LTYPE3, ACMOVWLS,
542         "CMOVWLT",      LTYPE3, ACMOVWLT,
543         "CMOVWMI",      LTYPE3, ACMOVWMI,
544         "CMOVWNE",      LTYPE3, ACMOVWNE,
545         "CMOVWOC",      LTYPE3, ACMOVWOC,
546         "CMOVWOS",      LTYPE3, ACMOVWOS,
547         "CMOVWPC",      LTYPE3, ACMOVWPC,
548         "CMOVWPL",      LTYPE3, ACMOVWPL,
549         "CMOVWPS",      LTYPE3, ACMOVWPS,
550
551         "FMOVB",        LTYPE3, AFMOVB,
552         "FMOVBP",       LTYPE3, AFMOVBP,
553         "FMOVD",        LTYPE3, AFMOVD,
554         "FMOVDP",       LTYPE3, AFMOVDP,
555         "FMOVF",        LTYPE3, AFMOVF,
556         "FMOVFP",       LTYPE3, AFMOVFP,
557         "FMOVL",        LTYPE3, AFMOVL,
558         "FMOVLP",       LTYPE3, AFMOVLP,
559         "FMOVV",        LTYPE3, AFMOVV,
560         "FMOVVP",       LTYPE3, AFMOVVP,
561         "FMOVW",        LTYPE3, AFMOVW,
562         "FMOVWP",       LTYPE3, AFMOVWP,
563         "FMOVX",        LTYPE3, AFMOVX,
564         "FMOVXP",       LTYPE3, AFMOVXP,
565         "FCMOVCC",      LTYPE3, AFCMOVCC,
566         "FCMOVCS",      LTYPE3, AFCMOVCS,
567         "FCMOVEQ",      LTYPE3, AFCMOVEQ,
568         "FCMOVHI",      LTYPE3, AFCMOVHI,
569         "FCMOVLS",      LTYPE3, AFCMOVLS,
570         "FCMOVNE",      LTYPE3, AFCMOVNE,
571         "FCMOVNU",      LTYPE3, AFCMOVNU,
572         "FCMOVUN",      LTYPE3, AFCMOVUN,
573         "FCOMB",        LTYPE3, AFCOMB,
574         "FCOMBP",       LTYPE3, AFCOMBP,
575         "FCOMD",        LTYPE3, AFCOMD,
576         "FCOMDP",       LTYPE3, AFCOMDP,
577         "FCOMDPP",      LTYPE3, AFCOMDPP,
578         "FCOMF",        LTYPE3, AFCOMF,
579         "FCOMFP",       LTYPE3, AFCOMFP,
580         "FCOMI",        LTYPE3, AFCOMI,
581         "FCOMIP",       LTYPE3, AFCOMIP,
582         "FCOML",        LTYPE3, AFCOML,
583         "FCOMLP",       LTYPE3, AFCOMLP,
584         "FCOMW",        LTYPE3, AFCOMW,
585         "FCOMWP",       LTYPE3, AFCOMWP,
586         "FUCOM",        LTYPE3, AFUCOM,
587         "FUCOMI",       LTYPE3, AFUCOMI,
588         "FUCOMIP",      LTYPE3, AFUCOMIP,
589         "FUCOMP",       LTYPE3, AFUCOMP,
590         "FUCOMPP",      LTYPE3, AFUCOMPP,
591         "FADDW",        LTYPE3, AFADDW,
592         "FADDL",        LTYPE3, AFADDL,
593         "FADDF",        LTYPE3, AFADDF,
594         "FADDD",        LTYPE3, AFADDD,
595         "FADDDP",       LTYPE3, AFADDDP,
596         "FSUBDP",       LTYPE3, AFSUBDP,
597         "FSUBW",        LTYPE3, AFSUBW,
598         "FSUBL",        LTYPE3, AFSUBL,
599         "FSUBF",        LTYPE3, AFSUBF,
600         "FSUBD",        LTYPE3, AFSUBD,
601         "FSUBRDP",      LTYPE3, AFSUBRDP,
602         "FSUBRW",       LTYPE3, AFSUBRW,
603         "FSUBRL",       LTYPE3, AFSUBRL,
604         "FSUBRF",       LTYPE3, AFSUBRF,
605         "FSUBRD",       LTYPE3, AFSUBRD,
606         "FMULDP",       LTYPE3, AFMULDP,
607         "FMULW",        LTYPE3, AFMULW,
608         "FMULL",        LTYPE3, AFMULL,
609         "FMULF",        LTYPE3, AFMULF,
610         "FMULD",        LTYPE3, AFMULD,
611         "FDIVDP",       LTYPE3, AFDIVDP,
612         "FDIVW",        LTYPE3, AFDIVW,
613         "FDIVL",        LTYPE3, AFDIVL,
614         "FDIVF",        LTYPE3, AFDIVF,
615         "FDIVD",        LTYPE3, AFDIVD,
616         "FDIVRDP",      LTYPE3, AFDIVRDP,
617         "FDIVRW",       LTYPE3, AFDIVRW,
618         "FDIVRL",       LTYPE3, AFDIVRL,
619         "FDIVRF",       LTYPE3, AFDIVRF,
620         "FDIVRD",       LTYPE3, AFDIVRD,
621         "FXCHD",        LTYPE3, AFXCHD,
622         "FFREE",        LTYPE1, AFFREE,
623         "FLDCW",        LTYPE2, AFLDCW,
624         "FLDENV",       LTYPE1, AFLDENV,
625         "FRSTOR",       LTYPE2, AFRSTOR,
626         "FSAVE",        LTYPE1, AFSAVE,
627         "FSTCW",        LTYPE1, AFSTCW,
628         "FSTENV",       LTYPE1, AFSTENV,
629         "FSTSW",        LTYPE1, AFSTSW,
630         "F2XM1",        LTYPE0, AF2XM1,
631         "FABS",         LTYPE0, AFABS,
632         "FCHS",         LTYPE0, AFCHS,
633         "FCLEX",        LTYPE0, AFCLEX,
634         "FCOS",         LTYPE0, AFCOS,
635         "FDECSTP",      LTYPE0, AFDECSTP,
636         "FINCSTP",      LTYPE0, AFINCSTP,
637         "FINIT",        LTYPE0, AFINIT,
638         "FLD1",         LTYPE0, AFLD1,
639         "FLDL2E",       LTYPE0, AFLDL2E,
640         "FLDL2T",       LTYPE0, AFLDL2T,
641         "FLDLG2",       LTYPE0, AFLDLG2,
642         "FLDLN2",       LTYPE0, AFLDLN2,
643         "FLDPI",        LTYPE0, AFLDPI,
644         "FLDZ",         LTYPE0, AFLDZ,
645         "FNOP",         LTYPE0, AFNOP,
646         "FPATAN",       LTYPE0, AFPATAN,
647         "FPREM",        LTYPE0, AFPREM,
648         "FPREM1",       LTYPE0, AFPREM1,
649         "FPTAN",        LTYPE0, AFPTAN,
650         "FRNDINT",      LTYPE0, AFRNDINT,
651         "FSCALE",       LTYPE0, AFSCALE,
652         "FSIN",         LTYPE0, AFSIN,
653         "FSINCOS",      LTYPE0, AFSINCOS,
654         "FSQRT",        LTYPE0, AFSQRT,
655         "FTST",         LTYPE0, AFTST,
656         "FXAM",         LTYPE0, AFXAM,
657         "FXTRACT",      LTYPE0, AFXTRACT,
658         "FYL2X",        LTYPE0, AFYL2X,
659         "FYL2XP1",      LTYPE0, AFYL2XP1,
660
661         "ADDPD",        LTYPE3, AADDPD,
662         "ADDPS",        LTYPE3, AADDPS,
663         "ADDSD",        LTYPE3, AADDSD,
664         "ADDSS",        LTYPE3, AADDSS,
665         "ANDNPD",       LTYPE3, AANDNPD,
666         "ANDNPS",       LTYPE3, AANDNPS,
667         "ANDPD",        LTYPE3, AANDPD,
668         "ANDPS",        LTYPE3, AANDPS,
669         "CMPPD",        LTYPEXC,ACMPPD,
670         "CMPPS",        LTYPEXC,ACMPPS,
671         "CMPSD",        LTYPEXC,ACMPSD,
672         "CMPSS",        LTYPEXC,ACMPSS,
673         "COMISD",       LTYPE3, ACOMISD,
674         "COMISS",       LTYPE3, ACOMISS,
675         "CVTPL2PD",     LTYPE3, ACVTPL2PD,
676         "CVTPL2PS",     LTYPE3, ACVTPL2PS,
677         "CVTPD2PL",     LTYPE3, ACVTPD2PL,
678         "CVTPD2PS",     LTYPE3, ACVTPD2PS,
679         "CVTPS2PL",     LTYPE3, ACVTPS2PL,
680         "PF2IW",        LTYPE3, APF2IW,
681         "PF2IL",        LTYPE3, APF2IL,
682         "PF2ID",        LTYPE3, APF2IL, /* syn */
683         "PI2FL",        LTYPE3, API2FL,
684         "PI2FD",        LTYPE3, API2FL, /* syn */
685         "PI2FW",        LTYPE3, API2FW,
686         "CVTPS2PD",     LTYPE3, ACVTPS2PD,
687         "CVTSD2SL",     LTYPE3, ACVTSD2SL,
688         "CVTSD2SS",     LTYPE3, ACVTSD2SS,
689         "CVTSL2SD",     LTYPE3, ACVTSL2SD,
690         "CVTSL2SS",     LTYPE3, ACVTSL2SS,
691         "CVTSS2SD",     LTYPE3, ACVTSS2SD,
692         "CVTSS2SL",     LTYPE3, ACVTSS2SL,
693         "CVTTPD2PL",    LTYPE3, ACVTTPD2PL,
694         "CVTTPS2PL",    LTYPE3, ACVTTPS2PL,
695         "CVTTSD2SL",    LTYPE3, ACVTTSD2SL,
696         "CVTTSS2SL",    LTYPE3, ACVTTSS2SL,
697         "DIVPD",        LTYPE3, ADIVPD,
698         "DIVPS",        LTYPE3, ADIVPS,
699         "DIVSD",        LTYPE3, ADIVSD,
700         "DIVSS",        LTYPE3, ADIVSS,
701         "FXRSTOR",      LTYPE2, AFXRSTOR,
702         "FXSAVE",       LTYPE1, AFXSAVE,
703         "LDMXCSR",      LTYPE2, ALDMXCSR,
704         "MASKMOVOU",    LTYPE3, AMASKMOVOU,
705         "MASKMOVDQU",   LTYPE3, AMASKMOVOU,     /* syn */
706         "MAXPD",        LTYPE3, AMAXPD,
707         "MAXPS",        LTYPE3, AMAXPS,
708         "MAXSD",        LTYPE3, AMAXSD,
709         "MAXSS",        LTYPE3, AMAXSS,
710         "MINPD",        LTYPE3, AMINPD,
711         "MINPS",        LTYPE3, AMINPS,
712         "MINSD",        LTYPE3, AMINSD,
713         "MINSS",        LTYPE3, AMINSS,
714         "MOVAPD",       LTYPE3, AMOVAPD,
715         "MOVAPS",       LTYPE3, AMOVAPS,
716         "MOVO",         LTYPE3, AMOVO,
717         "MOVOA",        LTYPE3, AMOVO,  /* syn */
718         "MOVOU",        LTYPE3, AMOVOU,
719         "MOVHLPS",      LTYPE3, AMOVHLPS,
720         "MOVHPD",       LTYPE3, AMOVHPD,
721         "MOVHPS",       LTYPE3, AMOVHPS,
722         "MOVLHPS",      LTYPE3, AMOVLHPS,
723         "MOVLPD",       LTYPE3, AMOVLPD,
724         "MOVLPS",       LTYPE3, AMOVLPS,
725         "MOVMSKPD",     LTYPE3, AMOVMSKPD,
726         "MOVMSKPS",     LTYPE3, AMOVMSKPS,
727         "MOVNTO",       LTYPE3, AMOVNTO,
728         "MOVNTDQ",      LTYPE3, AMOVNTO,        /* syn */
729         "MOVNTPD",      LTYPE3, AMOVNTPD,
730         "MOVNTPS",      LTYPE3, AMOVNTPS,
731         "MOVNTQ",       LTYPE3, AMOVNTQ,
732         "MOVQOZX",      LTYPE3, AMOVQOZX,
733         "MOVSD",        LTYPE3, AMOVSD,
734         "MOVSS",        LTYPE3, AMOVSS,
735         "MOVUPD",       LTYPE3, AMOVUPD,
736         "MOVUPS",       LTYPE3, AMOVUPS,
737         "MULPD",        LTYPE3, AMULPD,
738         "MULPS",        LTYPE3, AMULPS,
739         "MULSD",        LTYPE3, AMULSD,
740         "MULSS",        LTYPE3, AMULSS,
741         "ORPD",         LTYPE3, AORPD,
742         "ORPS",         LTYPE3, AORPS,
743         "PACKSSLW",     LTYPE3, APACKSSLW,
744         "PACKSSWB",     LTYPE3, APACKSSWB,
745         "PACKUSWB",     LTYPE3, APACKUSWB,
746         "PADDB",        LTYPE3, APADDB,
747         "PADDL",        LTYPE3, APADDL,
748         "PADDQ",        LTYPE3, APADDQ,
749         "PADDSB",       LTYPE3, APADDSB,
750         "PADDSW",       LTYPE3, APADDSW,
751         "PADDUSB",      LTYPE3, APADDUSB,
752         "PADDUSW",      LTYPE3, APADDUSW,
753         "PADDW",        LTYPE3, APADDW,
754         "PAND",         LTYPE3, APAND,
755         "PANDB",        LTYPE3, APANDB,
756         "PANDL",        LTYPE3, APANDL,
757         "PANDSB",       LTYPE3, APANDSB,
758         "PANDSW",       LTYPE3, APANDSW,
759         "PANDUSB",      LTYPE3, APANDUSB,
760         "PANDUSW",      LTYPE3, APANDUSW,
761         "PANDW",        LTYPE3, APANDW,
762         "PANDN",        LTYPE3, APANDN,
763         "PAVGB",        LTYPE3, APAVGB,
764         "PAVGW",        LTYPE3, APAVGW,
765         "PCMPEQB",      LTYPE3, APCMPEQB,
766         "PCMPEQL",      LTYPE3, APCMPEQL,
767         "PCMPEQW",      LTYPE3, APCMPEQW,
768         "PCMPGTB",      LTYPE3, APCMPGTB,
769         "PCMPGTL",      LTYPE3, APCMPGTL,       
770         "PCMPGTW",      LTYPE3, APCMPGTW,
771         "PEXTRW",       LTYPEX, APEXTRW,
772         "PINSRW",       LTYPEX, APINSRW,
773         "PMADDWL",      LTYPE3, APMADDWL,
774         "PMAXSW",       LTYPE3, APMAXSW,
775         "PMAXUB",       LTYPE3, APMAXUB,
776         "PMINSW",       LTYPE3, APMINSW,
777         "PMINUB",       LTYPE3, APMINUB,
778         "PMOVMSKB",     LTYPE3, APMOVMSKB,
779         "PMULHRW",      LTYPE3, APMULHRW,
780         "PMULHUW",      LTYPE3, APMULHUW,
781         "PMULHW",       LTYPE3, APMULHW,
782         "PMULLW",       LTYPE3, APMULLW,
783         "PMULULQ",      LTYPE3, APMULULQ,
784         "POR",          LTYPE3, APOR,
785         "PSADBW",       LTYPE3, APSADBW,
786         "PSHUFHW",      LTYPEX, APSHUFHW,
787         "PSHUFL",       LTYPEX, APSHUFL,
788         "PSHUFLW",      LTYPEX, APSHUFLW,
789         "PSHUFW",       LTYPEX, APSHUFW,
790         "PSLLO",        LTYPE3, APSLLO,
791         "PSLLDQ",       LTYPE3, APSLLO, /* syn */
792         "PSLLL",        LTYPE3, APSLLL,
793         "PSLLQ",        LTYPE3, APSLLQ,
794         "PSLLW",        LTYPE3, APSLLW,
795         "PSRAL",        LTYPE3, APSRAL,
796         "PSRAW",        LTYPE3, APSRAW,
797         "PSRLO",        LTYPE3, APSRLO,
798         "PSRLDQ",       LTYPE3, APSRLO, /* syn */
799         "PSRLL",        LTYPE3, APSRLL,
800         "PSRLQ",        LTYPE3, APSRLQ,
801         "PSRLW",        LTYPE3, APSRLW,
802         "PSUBB",        LTYPE3, APSUBB,
803         "PSUBL",        LTYPE3, APSUBL,
804         "PSUBQ",        LTYPE3, APSUBQ,
805         "PSUBSB",       LTYPE3, APSUBSB,
806         "PSUBSW",       LTYPE3, APSUBSW,
807         "PSUBUSB",      LTYPE3, APSUBUSB,
808         "PSUBUSW",      LTYPE3, APSUBUSW,
809         "PSUBW",        LTYPE3, APSUBW,
810         "PUNPCKHBW",    LTYPE3, APUNPCKHBW,
811         "PUNPCKHLQ",    LTYPE3, APUNPCKHLQ,
812         "PUNPCKHQDQ",   LTYPE3, APUNPCKHQDQ,
813         "PUNPCKHWL",    LTYPE3, APUNPCKHWL,
814         "PUNPCKLBW",    LTYPE3, APUNPCKLBW,
815         "PUNPCKLLQ",    LTYPE3, APUNPCKLLQ,
816         "PUNPCKLQDQ",   LTYPE3, APUNPCKLQDQ,
817         "PUNPCKLWL",    LTYPE3, APUNPCKLWL,
818         "PXOR",         LTYPE3, APXOR,
819         "RCPPS",        LTYPE3, ARCPPS,
820         "RCPSS",        LTYPE3, ARCPSS,
821         "RSQRTPS",      LTYPE3, ARSQRTPS,
822         "RSQRTSS",      LTYPE3, ARSQRTSS,
823         "SHUFPD",       LTYPEX, ASHUFPD,
824         "SHUFPS",       LTYPEX, ASHUFPS,
825         "SQRTPD",       LTYPE3, ASQRTPD,
826         "SQRTPS",       LTYPE3, ASQRTPS,
827         "SQRTSD",       LTYPE3, ASQRTSD,
828         "SQRTSS",       LTYPE3, ASQRTSS,
829         "STMXCSR",      LTYPE1, ASTMXCSR,
830         "SUBPD",        LTYPE3, ASUBPD,
831         "SUBPS",        LTYPE3, ASUBPS,
832         "SUBSD",        LTYPE3, ASUBSD,
833         "SUBSS",        LTYPE3, ASUBSS,
834         "UCOMISD",      LTYPE3, AUCOMISD,
835         "UCOMISS",      LTYPE3, AUCOMISS,
836         "UNPCKHPD",     LTYPE3, AUNPCKHPD,
837         "UNPCKHPS",     LTYPE3, AUNPCKHPS,
838         "UNPCKLPD",     LTYPE3, AUNPCKLPD,
839         "UNPCKLPS",     LTYPE3, AUNPCKLPS,
840         "XORPD",        LTYPE3, AXORPD,
841         "XORPS",        LTYPE3, AXORPS,
842
843         0
844 };
845
846 void
847 cinit(void)
848 {
849         Sym *s;
850         int i;
851
852         nullgen.sym = S;
853         nullgen.offset = 0;
854         if(FPCHIP)
855                 nullgen.dval = 0;
856         for(i=0; i<sizeof(nullgen.sval); i++)
857                 nullgen.sval[i] = 0;
858         nullgen.type = D_NONE;
859         nullgen.index = D_NONE;
860         nullgen.scale = 0;
861
862         nerrors = 0;
863         iostack = I;
864         iofree = I;
865         peekc = IGN;
866         nhunk = 0;
867         for(i=0; i<NHASH; i++)
868                 hash[i] = S;
869         for(i=0; itab[i].name; i++) {
870                 s = slookup(itab[i].name);
871                 if(s->type != LNAME)
872                         yyerror("double initialization %s", itab[i].name);
873                 s->type = itab[i].type;
874                 s->value = itab[i].value;
875         }
876
877         pathname = allocn(pathname, 0, 100);
878         if(mygetwd(pathname, 99) == 0) {
879                 pathname = allocn(pathname, 100, 900);
880                 if(mygetwd(pathname, 999) == 0)
881                         strcpy(pathname, "/???");
882         }
883 }
884
885 void
886 checkscale(int scale)
887 {
888
889         switch(scale) {
890         case 1:
891         case 2:
892         case 4:
893         case 8:
894                 return;
895         }
896         yyerror("scale must be 1248: %d", scale);
897 }
898
899 void
900 syminit(Sym *s)
901 {
902
903         s->type = LNAME;
904         s->value = 0;
905 }
906
907 void
908 cclean(void)
909 {
910         Gen2 g2;
911
912         g2.from = nullgen;
913         g2.to = nullgen;
914         outcode(AEND, &g2);
915         Bflush(&obuf);
916 }
917
918 void
919 zname(char *n, int t, int s)
920 {
921
922         Bputc(&obuf, ANAME);            /* as(2) */
923         Bputc(&obuf, ANAME>>8);
924         Bputc(&obuf, t);                /* type */
925         Bputc(&obuf, s);                /* sym */
926         while(*n) {
927                 Bputc(&obuf, *n);
928                 n++;
929         }
930         Bputc(&obuf, 0);
931 }
932
933 void
934 zaddr(Gen *a, int s)
935 {
936         long l;
937         int i, t;
938         char *n;
939         Ieee e;
940
941         t = 0;
942         if(a->index != D_NONE || a->scale != 0)
943                 t |= T_INDEX;
944         if(a->offset != 0)
945                 t |= T_OFFSET;
946         if(s != 0)
947                 t |= T_SYM;
948
949         switch(a->type) {
950         default:
951                 t |= T_TYPE;
952                 break;
953         case D_FCONST:
954                 t |= T_FCONST;
955                 break;
956         case D_CONST2:
957                 t |= T_OFFSET|T_OFFSET2;
958                 break;
959         case D_SCONST:
960                 t |= T_SCONST;
961                 break;
962         case D_NONE:
963                 break;
964         }
965         Bputc(&obuf, t);
966
967         if(t & T_INDEX) {       /* implies index, scale */
968                 Bputc(&obuf, a->index);
969                 Bputc(&obuf, a->scale);
970         }
971         if(t & T_OFFSET) {      /* implies offset */
972                 l = a->offset;
973                 Bputc(&obuf, l);
974                 Bputc(&obuf, l>>8);
975                 Bputc(&obuf, l>>16);
976                 Bputc(&obuf, l>>24);
977         }
978         if(t & T_OFFSET2) {
979                 l = a->offset2;
980                 Bputc(&obuf, l);
981                 Bputc(&obuf, l>>8);
982                 Bputc(&obuf, l>>16);
983                 Bputc(&obuf, l>>24);
984         }
985         if(t & T_SYM)           /* implies sym */
986                 Bputc(&obuf, s);
987         if(t & T_FCONST) {
988                 ieeedtod(&e, a->dval);
989                 l = e.l;
990                 Bputc(&obuf, l);
991                 Bputc(&obuf, l>>8);
992                 Bputc(&obuf, l>>16);
993                 Bputc(&obuf, l>>24);
994                 l = e.h;
995                 Bputc(&obuf, l);
996                 Bputc(&obuf, l>>8);
997                 Bputc(&obuf, l>>16);
998                 Bputc(&obuf, l>>24);
999                 return;
1000         }
1001         if(t & T_SCONST) {
1002                 n = a->sval;
1003                 for(i=0; i<NSNAME; i++) {
1004                         Bputc(&obuf, *n);
1005                         n++;
1006                 }
1007                 return;
1008         }
1009         if(t & T_TYPE)
1010                 Bputc(&obuf, a->type);
1011 }
1012
1013 void
1014 outcode(int a, Gen2 *g2)
1015 {
1016         int sf, st, t;
1017         Sym *s;
1018
1019         if(pass == 1)
1020                 goto out;
1021
1022 jackpot:
1023         sf = 0;
1024         s = g2->from.sym;
1025         while(s != S) {
1026                 sf = s->sym;
1027                 if(sf < 0 || sf >= NSYM)
1028                         sf = 0;
1029                 t = g2->from.type;
1030                 if(t == D_ADDR)
1031                         t = g2->from.index;
1032                 if(h[sf].type == t)
1033                 if(h[sf].sym == s)
1034                         break;
1035                 zname(s->name, t, sym);
1036                 s->sym = sym;
1037                 h[sym].sym = s;
1038                 h[sym].type = t;
1039                 sf = sym;
1040                 sym++;
1041                 if(sym >= NSYM)
1042                         sym = 1;
1043                 break;
1044         }
1045         st = 0;
1046         s = g2->to.sym;
1047         while(s != S) {
1048                 st = s->sym;
1049                 if(st < 0 || st >= NSYM)
1050                         st = 0;
1051                 t = g2->to.type;
1052                 if(t == D_ADDR)
1053                         t = g2->to.index;
1054                 if(h[st].type == t)
1055                 if(h[st].sym == s)
1056                         break;
1057                 zname(s->name, t, sym);
1058                 s->sym = sym;
1059                 h[sym].sym = s;
1060                 h[sym].type = t;
1061                 st = sym;
1062                 sym++;
1063                 if(sym >= NSYM)
1064                         sym = 1;
1065                 if(st == sf)
1066                         goto jackpot;
1067                 break;
1068         }
1069         Bputc(&obuf, a);
1070         Bputc(&obuf, a>>8);
1071         Bputc(&obuf, lineno);
1072         Bputc(&obuf, lineno>>8);
1073         Bputc(&obuf, lineno>>16);
1074         Bputc(&obuf, lineno>>24);
1075         zaddr(&g2->from, sf);
1076         zaddr(&g2->to, st);
1077
1078 out:
1079         if(a != AGLOBL && a != ADATA)
1080                 pc++;
1081 }
1082
1083 void
1084 outhist(void)
1085 {
1086         Gen g;
1087         Hist *h;
1088         char *p, *q, *op, c;
1089         int n;
1090
1091         g = nullgen;
1092         c = pathchar();
1093         for(h = hist; h != H; h = h->link) {
1094                 p = h->name;
1095                 op = 0;
1096                 /* on windows skip drive specifier in pathname */
1097                 if(systemtype(Windows) && p && p[1] == ':'){
1098                         p += 2;
1099                         c = *p;
1100                 }
1101                 if(p && p[0] != c && h->offset == 0 && pathname){
1102                         /* on windows skip drive specifier in pathname */
1103                         if(systemtype(Windows) && pathname[1] == ':') {
1104                                 op = p;
1105                                 p = pathname+2;
1106                                 c = *p;
1107                         } else if(pathname[0] == c){
1108                                 op = p;
1109                                 p = pathname;
1110                         }
1111                 }
1112                 while(p) {
1113                         q = strchr(p, c);
1114                         if(q) {
1115                                 n = q-p;
1116                                 if(n == 0){
1117                                         n = 1;  /* leading "/" */
1118                                         *p = '/';       /* don't emit "\" on windows */
1119                                 }
1120                                 q++;
1121                         } else {
1122                                 n = strlen(p);
1123                                 q = 0;
1124                         }
1125                         if(n) {
1126                                 Bputc(&obuf, ANAME);
1127                                 Bputc(&obuf, ANAME>>8);
1128                                 Bputc(&obuf, D_FILE);   /* type */
1129                                 Bputc(&obuf, 1);        /* sym */
1130                                 Bputc(&obuf, '<');
1131                                 Bwrite(&obuf, p, n);
1132                                 Bputc(&obuf, 0);
1133                         }
1134                         p = q;
1135                         if(p == 0 && op) {
1136                                 p = op;
1137                                 op = 0;
1138                         }
1139                 }
1140                 g.offset = h->offset;
1141
1142                 Bputc(&obuf, AHISTORY);
1143                 Bputc(&obuf, AHISTORY>>8);
1144                 Bputc(&obuf, h->line);
1145                 Bputc(&obuf, h->line>>8);
1146                 Bputc(&obuf, h->line>>16);
1147                 Bputc(&obuf, h->line>>24);
1148                 zaddr(&nullgen, 0);
1149                 zaddr(&g, 0);
1150         }
1151 }
1152
1153 #include "../cc/lexbody"
1154 #include "../cc/macbody"
1155 #include "../cc/compat"