]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/8a/lex.c
fix typo
[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         "CS",           LSREG,  D_CS,
196         "SS",           LSREG,  D_SS,
197         "DS",           LSREG,  D_DS,
198         "ES",           LSREG,  D_ES,
199         "FS",           LSREG,  D_FS,
200         "GS",           LSREG,  D_GS,
201
202         "GDTR",         LBREG,  D_GDTR,
203         "IDTR",         LBREG,  D_IDTR,
204         "LDTR",         LBREG,  D_LDTR,
205         "MSW",          LBREG,  D_MSW,
206         "TASK",         LBREG,  D_TASK,
207
208         "CR0",          LBREG,  D_CR+0,
209         "CR1",          LBREG,  D_CR+1,
210         "CR2",          LBREG,  D_CR+2,
211         "CR3",          LBREG,  D_CR+3,
212         "CR4",          LBREG,  D_CR+4,
213         "CR5",          LBREG,  D_CR+5,
214         "CR6",          LBREG,  D_CR+6,
215         "CR7",          LBREG,  D_CR+7,
216
217         "DR0",          LBREG,  D_DR+0,
218         "DR1",          LBREG,  D_DR+1,
219         "DR2",          LBREG,  D_DR+2,
220         "DR3",          LBREG,  D_DR+3,
221         "DR4",          LBREG,  D_DR+4,
222         "DR5",          LBREG,  D_DR+5,
223         "DR6",          LBREG,  D_DR+6,
224         "DR7",          LBREG,  D_DR+7,
225
226         "TR0",          LBREG,  D_TR+0,
227         "TR1",          LBREG,  D_TR+1,
228         "TR2",          LBREG,  D_TR+2,
229         "TR3",          LBREG,  D_TR+3,
230         "TR4",          LBREG,  D_TR+4,
231         "TR5",          LBREG,  D_TR+5,
232         "TR6",          LBREG,  D_TR+6,
233         "TR7",          LBREG,  D_TR+7,
234
235         "AAA",          LTYPE0, AAAA,
236         "AAD",          LTYPE0, AAAD,
237         "AAM",          LTYPE0, AAAM,
238         "AAS",          LTYPE0, AAAS,
239         "ADCB",         LTYPE3, AADCB,
240         "ADCL",         LTYPE3, AADCL,
241         "ADCW",         LTYPE3, AADCW,
242         "ADDB",         LTYPE3, AADDB,
243         "ADDL",         LTYPE3, AADDL,
244         "ADDW",         LTYPE3, AADDW,
245         "ADJSP",        LTYPE2, AADJSP,
246         "ANDB",         LTYPE3, AANDB,
247         "ANDL",         LTYPE3, AANDL,
248         "ANDW",         LTYPE3, AANDW,
249         "ARPL",         LTYPE3, AARPL,
250         "BOUNDL",       LTYPE3, ABOUNDL,
251         "BOUNDW",       LTYPE3, ABOUNDW,
252         "BSFL",         LTYPE3, ABSFL,
253         "BSFW",         LTYPE3, ABSFW,
254         "BSRL",         LTYPE3, ABSRL,
255         "BSRW",         LTYPE3, ABSRW,
256         "BTCL",         LTYPE3, ABTCL,
257         "BTCW",         LTYPE3, ABTCW,
258         "BTL",          LTYPE3, ABTL,
259         "BTRL",         LTYPE3, ABTRL,
260         "BTRW",         LTYPE3, ABTRW,
261         "BTSL",         LTYPE3, ABTSL,
262         "BTSW",         LTYPE3, ABTSW,
263         "BTW",          LTYPE3, ABTW,
264         "BYTE",         LTYPE2, ABYTE,
265         "CALL",         LTYPEC, ACALL,
266         "CLC",          LTYPE0, ACLC,
267         "CLD",          LTYPE0, ACLD,
268         "CLI",          LTYPE0, ACLI,
269         "CLTS",         LTYPE0, ACLTS,
270         "CMC",          LTYPE0, ACMC,
271         "CMPB",         LTYPE4, ACMPB,
272         "CMPL",         LTYPE4, ACMPL,
273         "CMPW",         LTYPE4, ACMPW,
274         "CMPSB",        LTYPE0, ACMPSB,
275         "CMPSL",        LTYPE0, ACMPSL,
276         "CMPSW",        LTYPE0, ACMPSW,
277         "CMPXCHGB",     LTYPE3, ACMPXCHGB,
278         "CMPXCHGL",     LTYPE3, ACMPXCHGL,
279         "CMPXCHGW",     LTYPE3, ACMPXCHGW,
280         "DAA",          LTYPE0, ADAA,
281         "DAS",          LTYPE0, ADAS,
282         "DATA",         LTYPED, ADATA,
283         "DECB",         LTYPE1, ADECB,
284         "DECL",         LTYPE1, ADECL,
285         "DECW",         LTYPE1, ADECW,
286         "DIVB",         LTYPE2, ADIVB,
287         "DIVL",         LTYPE2, ADIVL,
288         "DIVW",         LTYPE2, ADIVW,
289         "END",          LTYPE0, AEND,
290         "ENTER",        LTYPE2, AENTER,
291         "GLOBL",        LTYPEG, AGLOBL,
292         "HLT",          LTYPE0, AHLT,
293         "IDIVB",        LTYPE2, AIDIVB,
294         "IDIVL",        LTYPE2, AIDIVL,
295         "IDIVW",        LTYPE2, AIDIVW,
296         "IMULB",        LTYPEI, AIMULB,
297         "IMULL",        LTYPEI, AIMULL,
298         "IMULW",        LTYPEI, AIMULW,
299         "INB",          LTYPE0, AINB,
300         "INL",          LTYPE0, AINL,
301         "INW",          LTYPE0, AINW,
302         "INCB",         LTYPE1, AINCB,
303         "INCL",         LTYPE1, AINCL,
304         "INCW",         LTYPE1, AINCW,
305         "INSB",         LTYPE0, AINSB,
306         "INSL",         LTYPE0, AINSL,
307         "INSW",         LTYPE0, AINSW,
308         "INT",          LTYPE2, AINT,
309         "INTO",         LTYPE0, AINTO,
310         "IRETL",        LTYPE0, AIRETL,
311         "IRETW",        LTYPE0, AIRETW,
312
313         "JOS",          LTYPER, AJOS,
314         "JO",           LTYPER, AJOS,   /* alternate */
315         "JOC",          LTYPER, AJOC,
316         "JNO",          LTYPER, AJOC,   /* alternate */
317         "JCS",          LTYPER, AJCS,
318         "JB",           LTYPER, AJCS,   /* alternate */
319         "JC",           LTYPER, AJCS,   /* alternate */
320         "JNAE",         LTYPER, AJCS,   /* alternate */
321         "JLO",          LTYPER, AJCS,   /* alternate */
322         "JCC",          LTYPER, AJCC,
323         "JAE",          LTYPER, AJCC,   /* alternate */
324         "JNB",          LTYPER, AJCC,   /* alternate */
325         "JNC",          LTYPER, AJCC,   /* alternate */
326         "JHS",          LTYPER, AJCC,   /* alternate */
327         "JEQ",          LTYPER, AJEQ,
328         "JE",           LTYPER, AJEQ,   /* alternate */
329         "JZ",           LTYPER, AJEQ,   /* alternate */
330         "JNE",          LTYPER, AJNE,
331         "JNZ",          LTYPER, AJNE,   /* alternate */
332         "JLS",          LTYPER, AJLS,
333         "JBE",          LTYPER, AJLS,   /* alternate */
334         "JNA",          LTYPER, AJLS,   /* alternate */
335         "JHI",          LTYPER, AJHI,
336         "JA",           LTYPER, AJHI,   /* alternate */
337         "JNBE",         LTYPER, AJHI,   /* alternate */
338         "JMI",          LTYPER, AJMI,
339         "JS",           LTYPER, AJMI,   /* alternate */
340         "JPL",          LTYPER, AJPL,
341         "JNS",          LTYPER, AJPL,   /* alternate */
342         "JPS",          LTYPER, AJPS,
343         "JP",           LTYPER, AJPS,   /* alternate */
344         "JPE",          LTYPER, AJPS,   /* alternate */
345         "JPC",          LTYPER, AJPC,
346         "JNP",          LTYPER, AJPC,   /* alternate */
347         "JPO",          LTYPER, AJPC,   /* alternate */
348         "JLT",          LTYPER, AJLT,
349         "JL",           LTYPER, AJLT,   /* alternate */
350         "JNGE",         LTYPER, AJLT,   /* alternate */
351         "JGE",          LTYPER, AJGE,
352         "JNL",          LTYPER, AJGE,   /* alternate */
353         "JLE",          LTYPER, AJLE,
354         "JNG",          LTYPER, AJLE,   /* alternate */
355         "JGT",          LTYPER, AJGT,
356         "JG",           LTYPER, AJGT,   /* alternate */
357         "JNLE",         LTYPER, AJGT,   /* alternate */
358
359         "JCXZ",         LTYPER, AJCXZ,
360         "JMP",          LTYPEC, AJMP,
361         "LAHF",         LTYPE0, ALAHF,
362         "LARL",         LTYPE3, ALARL,
363         "LARW",         LTYPE3, ALARW,
364         "LEAL",         LTYPE3, ALEAL,
365         "LEAW",         LTYPE3, ALEAW,
366         "LEAVEL",       LTYPE0, ALEAVEL,
367         "LEAVEW",       LTYPE0, ALEAVEW,
368         "LOCK",         LTYPE0, ALOCK,
369         "LODSB",        LTYPE0, ALODSB,
370         "LODSL",        LTYPE0, ALODSL,
371         "LODSW",        LTYPE0, ALODSW,
372         "LONG",         LTYPE2, ALONG,
373         "LOOP",         LTYPER, ALOOP,
374         "LOOPEQ",       LTYPER, ALOOPEQ,
375         "LOOPNE",       LTYPER, ALOOPNE,
376         "LSLL",         LTYPE3, ALSLL,
377         "LSLW",         LTYPE3, ALSLW,
378         "MOVB",         LTYPE3, AMOVB,
379         "MOVL",         LTYPEM, AMOVL,
380         "MOVW",         LTYPEM, AMOVW,
381         "MOVBLSX",      LTYPE3, AMOVBLSX,
382         "MOVBLZX",      LTYPE3, AMOVBLZX,
383         "MOVBWSX",      LTYPE3, AMOVBWSX,
384         "MOVBWZX",      LTYPE3, AMOVBWZX,
385         "MOVWLSX",      LTYPE3, AMOVWLSX,
386         "MOVWLZX",      LTYPE3, AMOVWLZX,
387         "MOVSB",        LTYPE0, AMOVSB,
388         "MOVSL",        LTYPE0, AMOVSL,
389         "MOVSW",        LTYPE0, AMOVSW,
390         "MULB",         LTYPE2, AMULB,
391         "MULL",         LTYPE2, AMULL,
392         "MULW",         LTYPE2, AMULW,
393         "NEGB",         LTYPE1, ANEGB,
394         "NEGL",         LTYPE1, ANEGL,
395         "NEGW",         LTYPE1, ANEGW,
396         "NOP",          LTYPEN, ANOP,
397         "NOTB",         LTYPE1, ANOTB,
398         "NOTL",         LTYPE1, ANOTL,
399         "NOTW",         LTYPE1, ANOTW,
400         "ORB",          LTYPE3, AORB,
401         "ORL",          LTYPE3, AORL,
402         "ORW",          LTYPE3, AORW,
403         "OUTB",         LTYPE0, AOUTB,
404         "OUTL",         LTYPE0, AOUTL,
405         "OUTW",         LTYPE0, AOUTW,
406         "OUTSB",        LTYPE0, AOUTSB,
407         "OUTSL",        LTYPE0, AOUTSL,
408         "OUTSW",        LTYPE0, AOUTSW,
409         "POPAL",        LTYPE0, APOPAL,
410         "POPAW",        LTYPE0, APOPAW,
411         "POPFL",        LTYPE0, APOPFL,
412         "POPFW",        LTYPE0, APOPFW,
413         "POPL",         LTYPE1, APOPL,
414         "POPW",         LTYPE1, APOPW,
415         "PUSHAL",       LTYPE0, APUSHAL,
416         "PUSHAW",       LTYPE0, APUSHAW,
417         "PUSHFL",       LTYPE0, APUSHFL,
418         "PUSHFW",       LTYPE0, APUSHFW,
419         "PUSHL",        LTYPE2, APUSHL,
420         "PUSHW",        LTYPE2, APUSHW,
421         "RCLB",         LTYPE3, ARCLB,
422         "RCLL",         LTYPE3, ARCLL,
423         "RCLW",         LTYPE3, ARCLW,
424         "RCRB",         LTYPE3, ARCRB,
425         "RCRL",         LTYPE3, ARCRL,
426         "RCRW",         LTYPE3, ARCRW,
427         "REP",          LTYPE0, AREP,
428         "REPN",         LTYPE0, AREPN,
429         "RET",          LTYPE0, ARET,
430         "ROLB",         LTYPE3, AROLB,
431         "ROLL",         LTYPE3, AROLL,
432         "ROLW",         LTYPE3, AROLW,
433         "RORB",         LTYPE3, ARORB,
434         "RORL",         LTYPE3, ARORL,
435         "RORW",         LTYPE3, ARORW,
436         "SAHF",         LTYPE0, ASAHF,
437         "SALB",         LTYPE3, ASALB,
438         "SALL",         LTYPE3, ASALL,
439         "SALW",         LTYPE3, ASALW,
440         "SARB",         LTYPE3, ASARB,
441         "SARL",         LTYPE3, ASARL,
442         "SARW",         LTYPE3, ASARW,
443         "SBBB",         LTYPE3, ASBBB,
444         "SBBL",         LTYPE3, ASBBL,
445         "SBBW",         LTYPE3, ASBBW,
446         "SCASB",        LTYPE0, ASCASB,
447         "SCASL",        LTYPE0, ASCASL,
448         "SCASW",        LTYPE0, ASCASW,
449         "SETCC",        LTYPE1, ASETCC,
450         "SETCS",        LTYPE1, ASETCS,
451         "SETEQ",        LTYPE1, ASETEQ,
452         "SETGE",        LTYPE1, ASETGE,
453         "SETGT",        LTYPE1, ASETGT,
454         "SETHI",        LTYPE1, ASETHI,
455         "SETLE",        LTYPE1, ASETLE,
456         "SETLS",        LTYPE1, ASETLS,
457         "SETLT",        LTYPE1, ASETLT,
458         "SETMI",        LTYPE1, ASETMI,
459         "SETNE",        LTYPE1, ASETNE,
460         "SETOC",        LTYPE1, ASETOC,
461         "SETOS",        LTYPE1, ASETOS,
462         "SETPC",        LTYPE1, ASETPC,
463         "SETPL",        LTYPE1, ASETPL,
464         "SETPS",        LTYPE1, ASETPS,
465         "CDQ",          LTYPE0, ACDQ,
466         "CWD",          LTYPE0, ACWD,
467         "SHLB",         LTYPE3, ASHLB,
468         "SHLL",         LTYPES, ASHLL,
469         "SHLW",         LTYPES, ASHLW,
470         "SHRB",         LTYPE3, ASHRB,
471         "SHRL",         LTYPES, ASHRL,
472         "SHRW",         LTYPES, ASHRW,
473         "STC",          LTYPE0, ASTC,
474         "STD",          LTYPE0, ASTD,
475         "STI",          LTYPE0, ASTI,
476         "STOSB",        LTYPE0, ASTOSB,
477         "STOSL",        LTYPE0, ASTOSL,
478         "STOSW",        LTYPE0, ASTOSW,
479         "SUBB",         LTYPE3, ASUBB,
480         "SUBL",         LTYPE3, ASUBL,
481         "SUBW",         LTYPE3, ASUBW,
482         "SYSCALL",      LTYPE0, ASYSCALL,
483         "TESTB",        LTYPE3, ATESTB,
484         "TESTL",        LTYPE3, ATESTL,
485         "TESTW",        LTYPE3, ATESTW,
486         "TEXT",         LTYPET, ATEXT,
487         "VERR",         LTYPE2, AVERR,
488         "VERW",         LTYPE2, AVERW,
489         "WAIT",         LTYPE0, AWAIT,
490         "WORD",         LTYPE2, AWORD,
491         "XCHGB",        LTYPE3, AXCHGB,
492         "XCHGL",        LTYPE3, AXCHGL,
493         "XCHGW",        LTYPE3, AXCHGW,
494         "XLAT",         LTYPE2, AXLAT,
495         "XORB",         LTYPE3, AXORB,
496         "XORL",         LTYPE3, AXORL,
497         "XORW",         LTYPE3, AXORW,
498
499         "CMOVLCC",      LTYPE3, ACMOVLCC,
500         "CMOVLCS",      LTYPE3, ACMOVLCS,
501         "CMOVLEQ",      LTYPE3, ACMOVLEQ,
502         "CMOVLGE",      LTYPE3, ACMOVLGE,
503         "CMOVLGT",      LTYPE3, ACMOVLGT,
504         "CMOVLHI",      LTYPE3, ACMOVLHI,
505         "CMOVLLE",      LTYPE3, ACMOVLLE,
506         "CMOVLLS",      LTYPE3, ACMOVLLS,
507         "CMOVLLT",      LTYPE3, ACMOVLLT,
508         "CMOVLMI",      LTYPE3, ACMOVLMI,
509         "CMOVLNE",      LTYPE3, ACMOVLNE,
510         "CMOVLOC",      LTYPE3, ACMOVLOC,
511         "CMOVLOS",      LTYPE3, ACMOVLOS,
512         "CMOVLPC",      LTYPE3, ACMOVLPC,
513         "CMOVLPL",      LTYPE3, ACMOVLPL,
514         "CMOVLPS",      LTYPE3, ACMOVLPS,
515         "CMOVWCC",      LTYPE3, ACMOVWCC,
516         "CMOVWCS",      LTYPE3, ACMOVWCS,
517         "CMOVWEQ",      LTYPE3, ACMOVWEQ,
518         "CMOVWGE",      LTYPE3, ACMOVWGE,
519         "CMOVWGT",      LTYPE3, ACMOVWGT,
520         "CMOVWHI",      LTYPE3, ACMOVWHI,
521         "CMOVWLE",      LTYPE3, ACMOVWLE,
522         "CMOVWLS",      LTYPE3, ACMOVWLS,
523         "CMOVWLT",      LTYPE3, ACMOVWLT,
524         "CMOVWMI",      LTYPE3, ACMOVWMI,
525         "CMOVWNE",      LTYPE3, ACMOVWNE,
526         "CMOVWOC",      LTYPE3, ACMOVWOC,
527         "CMOVWOS",      LTYPE3, ACMOVWOS,
528         "CMOVWPC",      LTYPE3, ACMOVWPC,
529         "CMOVWPL",      LTYPE3, ACMOVWPL,
530         "CMOVWPS",      LTYPE3, ACMOVWPS,
531
532         "FMOVB",        LTYPE3, AFMOVB,
533         "FMOVBP",       LTYPE3, AFMOVBP,
534         "FMOVD",        LTYPE3, AFMOVD,
535         "FMOVDP",       LTYPE3, AFMOVDP,
536         "FMOVF",        LTYPE3, AFMOVF,
537         "FMOVFP",       LTYPE3, AFMOVFP,
538         "FMOVL",        LTYPE3, AFMOVL,
539         "FMOVLP",       LTYPE3, AFMOVLP,
540         "FMOVV",        LTYPE3, AFMOVV,
541         "FMOVVP",       LTYPE3, AFMOVVP,
542         "FMOVW",        LTYPE3, AFMOVW,
543         "FMOVWP",       LTYPE3, AFMOVWP,
544         "FMOVX",        LTYPE3, AFMOVX,
545         "FMOVXP",       LTYPE3, AFMOVXP,
546         "FCMOVCC",      LTYPE3, AFCMOVCC,
547         "FCMOVCS",      LTYPE3, AFCMOVCS,
548         "FCMOVEQ",      LTYPE3, AFCMOVEQ,
549         "FCMOVHI",      LTYPE3, AFCMOVHI,
550         "FCMOVLS",      LTYPE3, AFCMOVLS,
551         "FCMOVNE",      LTYPE3, AFCMOVNE,
552         "FCMOVNU",      LTYPE3, AFCMOVNU,
553         "FCMOVUN",      LTYPE3, AFCMOVUN,
554         "FCOMB",        LTYPE3, AFCOMB,
555         "FCOMBP",       LTYPE3, AFCOMBP,
556         "FCOMD",        LTYPE3, AFCOMD,
557         "FCOMDP",       LTYPE3, AFCOMDP,
558         "FCOMDPP",      LTYPE3, AFCOMDPP,
559         "FCOMF",        LTYPE3, AFCOMF,
560         "FCOMFP",       LTYPE3, AFCOMFP,
561         "FCOMI",        LTYPE3, AFCOMI,
562         "FCOMIP",       LTYPE3, AFCOMIP,
563         "FCOML",        LTYPE3, AFCOML,
564         "FCOMLP",       LTYPE3, AFCOMLP,
565         "FCOMW",        LTYPE3, AFCOMW,
566         "FCOMWP",       LTYPE3, AFCOMWP,
567         "FUCOM",        LTYPE3, AFUCOM,
568         "FUCOMI",       LTYPE3, AFUCOMI,
569         "FUCOMIP",      LTYPE3, AFUCOMIP,
570         "FUCOMP",       LTYPE3, AFUCOMP,
571         "FUCOMPP",      LTYPE3, AFUCOMPP,
572         "FADDW",        LTYPE3, AFADDW,
573         "FADDL",        LTYPE3, AFADDL,
574         "FADDF",        LTYPE3, AFADDF,
575         "FADDD",        LTYPE3, AFADDD,
576         "FADDDP",       LTYPE3, AFADDDP,
577         "FSUBDP",       LTYPE3, AFSUBDP,
578         "FSUBW",        LTYPE3, AFSUBW,
579         "FSUBL",        LTYPE3, AFSUBL,
580         "FSUBF",        LTYPE3, AFSUBF,
581         "FSUBD",        LTYPE3, AFSUBD,
582         "FSUBRDP",      LTYPE3, AFSUBRDP,
583         "FSUBRW",       LTYPE3, AFSUBRW,
584         "FSUBRL",       LTYPE3, AFSUBRL,
585         "FSUBRF",       LTYPE3, AFSUBRF,
586         "FSUBRD",       LTYPE3, AFSUBRD,
587         "FMULDP",       LTYPE3, AFMULDP,
588         "FMULW",        LTYPE3, AFMULW,
589         "FMULL",        LTYPE3, AFMULL,
590         "FMULF",        LTYPE3, AFMULF,
591         "FMULD",        LTYPE3, AFMULD,
592         "FDIVDP",       LTYPE3, AFDIVDP,
593         "FDIVW",        LTYPE3, AFDIVW,
594         "FDIVL",        LTYPE3, AFDIVL,
595         "FDIVF",        LTYPE3, AFDIVF,
596         "FDIVD",        LTYPE3, AFDIVD,
597         "FDIVRDP",      LTYPE3, AFDIVRDP,
598         "FDIVRW",       LTYPE3, AFDIVRW,
599         "FDIVRL",       LTYPE3, AFDIVRL,
600         "FDIVRF",       LTYPE3, AFDIVRF,
601         "FDIVRD",       LTYPE3, AFDIVRD,
602         "FXCHD",        LTYPE3, AFXCHD,
603         "FFREE",        LTYPE1, AFFREE,
604         "FLDCW",        LTYPE2, AFLDCW,
605         "FLDENV",       LTYPE1, AFLDENV,
606         "FRSTOR",       LTYPE2, AFRSTOR,
607         "FSAVE",        LTYPE1, AFSAVE,
608         "FSTCW",        LTYPE1, AFSTCW,
609         "FSTENV",       LTYPE1, AFSTENV,
610         "FSTSW",        LTYPE1, AFSTSW,
611         "F2XM1",        LTYPE0, AF2XM1,
612         "FABS",         LTYPE0, AFABS,
613         "FCHS",         LTYPE0, AFCHS,
614         "FCLEX",        LTYPE0, AFCLEX,
615         "FCOS",         LTYPE0, AFCOS,
616         "FDECSTP",      LTYPE0, AFDECSTP,
617         "FINCSTP",      LTYPE0, AFINCSTP,
618         "FINIT",        LTYPE0, AFINIT,
619         "FLD1",         LTYPE0, AFLD1,
620         "FLDL2E",       LTYPE0, AFLDL2E,
621         "FLDL2T",       LTYPE0, AFLDL2T,
622         "FLDLG2",       LTYPE0, AFLDLG2,
623         "FLDLN2",       LTYPE0, AFLDLN2,
624         "FLDPI",        LTYPE0, AFLDPI,
625         "FLDZ",         LTYPE0, AFLDZ,
626         "FNOP",         LTYPE0, AFNOP,
627         "FPATAN",       LTYPE0, AFPATAN,
628         "FPREM",        LTYPE0, AFPREM,
629         "FPREM1",       LTYPE0, AFPREM1,
630         "FPTAN",        LTYPE0, AFPTAN,
631         "FRNDINT",      LTYPE0, AFRNDINT,
632         "FSCALE",       LTYPE0, AFSCALE,
633         "FSIN",         LTYPE0, AFSIN,
634         "FSINCOS",      LTYPE0, AFSINCOS,
635         "FSQRT",        LTYPE0, AFSQRT,
636         "FTST",         LTYPE0, AFTST,
637         "FXAM",         LTYPE0, AFXAM,
638         "FXTRACT",      LTYPE0, AFXTRACT,
639         "FYL2X",        LTYPE0, AFYL2X,
640         "FYL2XP1",      LTYPE0, AFYL2XP1,
641
642         0
643 };
644
645 void
646 cinit(void)
647 {
648         Sym *s;
649         int i;
650
651         nullgen.sym = S;
652         nullgen.offset = 0;
653         if(FPCHIP)
654                 nullgen.dval = 0;
655         for(i=0; i<sizeof(nullgen.sval); i++)
656                 nullgen.sval[i] = 0;
657         nullgen.type = D_NONE;
658         nullgen.index = D_NONE;
659         nullgen.scale = 0;
660
661         nerrors = 0;
662         iostack = I;
663         iofree = I;
664         peekc = IGN;
665         nhunk = 0;
666         for(i=0; i<NHASH; i++)
667                 hash[i] = S;
668         for(i=0; itab[i].name; i++) {
669                 s = slookup(itab[i].name);
670                 if(s->type != LNAME)
671                         yyerror("double initialization %s", itab[i].name);
672                 s->type = itab[i].type;
673                 s->value = itab[i].value;
674         }
675
676         pathname = allocn(pathname, 0, 100);
677         if(mygetwd(pathname, 99) == 0) {
678                 pathname = allocn(pathname, 100, 900);
679                 if(mygetwd(pathname, 999) == 0)
680                         strcpy(pathname, "/???");
681         }
682 }
683
684 void
685 checkscale(int scale)
686 {
687
688         switch(scale) {
689         case 1:
690         case 2:
691         case 4:
692         case 8:
693                 return;
694         }
695         yyerror("scale must be 1248: %d", scale);
696 }
697
698 void
699 syminit(Sym *s)
700 {
701
702         s->type = LNAME;
703         s->value = 0;
704 }
705
706 void
707 cclean(void)
708 {
709         Gen2 g2;
710
711         g2.from = nullgen;
712         g2.to = nullgen;
713         outcode(AEND, &g2);
714         Bflush(&obuf);
715 }
716
717 void
718 zname(char *n, int t, int s)
719 {
720
721         Bputc(&obuf, ANAME);            /* as(2) */
722         Bputc(&obuf, ANAME>>8);
723         Bputc(&obuf, t);                /* type */
724         Bputc(&obuf, s);                /* sym */
725         while(*n) {
726                 Bputc(&obuf, *n);
727                 n++;
728         }
729         Bputc(&obuf, 0);
730 }
731
732 void
733 zaddr(Gen *a, int s)
734 {
735         long l;
736         int i, t;
737         char *n;
738         Ieee e;
739
740         t = 0;
741         if(a->index != D_NONE || a->scale != 0)
742                 t |= T_INDEX;
743         if(a->offset != 0)
744                 t |= T_OFFSET;
745         if(s != 0)
746                 t |= T_SYM;
747
748         switch(a->type) {
749         default:
750                 t |= T_TYPE;
751                 break;
752         case D_FCONST:
753                 t |= T_FCONST;
754                 break;
755         case D_CONST2:
756                 t |= T_OFFSET|T_OFFSET2;
757                 break;
758         case D_SCONST:
759                 t |= T_SCONST;
760                 break;
761         case D_NONE:
762                 break;
763         }
764         Bputc(&obuf, t);
765
766         if(t & T_INDEX) {       /* implies index, scale */
767                 Bputc(&obuf, a->index);
768                 Bputc(&obuf, a->scale);
769         }
770         if(t & T_OFFSET) {      /* implies offset */
771                 l = a->offset;
772                 Bputc(&obuf, l);
773                 Bputc(&obuf, l>>8);
774                 Bputc(&obuf, l>>16);
775                 Bputc(&obuf, l>>24);
776         }
777         if(t & T_OFFSET2) {
778                 l = a->offset2;
779                 Bputc(&obuf, l);
780                 Bputc(&obuf, l>>8);
781                 Bputc(&obuf, l>>16);
782                 Bputc(&obuf, l>>24);
783         }
784         if(t & T_SYM)           /* implies sym */
785                 Bputc(&obuf, s);
786         if(t & T_FCONST) {
787                 ieeedtod(&e, a->dval);
788                 l = e.l;
789                 Bputc(&obuf, l);
790                 Bputc(&obuf, l>>8);
791                 Bputc(&obuf, l>>16);
792                 Bputc(&obuf, l>>24);
793                 l = e.h;
794                 Bputc(&obuf, l);
795                 Bputc(&obuf, l>>8);
796                 Bputc(&obuf, l>>16);
797                 Bputc(&obuf, l>>24);
798                 return;
799         }
800         if(t & T_SCONST) {
801                 n = a->sval;
802                 for(i=0; i<NSNAME; i++) {
803                         Bputc(&obuf, *n);
804                         n++;
805                 }
806                 return;
807         }
808         if(t & T_TYPE)
809                 Bputc(&obuf, a->type);
810 }
811
812 void
813 outcode(int a, Gen2 *g2)
814 {
815         int sf, st, t;
816         Sym *s;
817
818         if(pass == 1)
819                 goto out;
820
821 jackpot:
822         sf = 0;
823         s = g2->from.sym;
824         while(s != S) {
825                 sf = s->sym;
826                 if(sf < 0 || sf >= NSYM)
827                         sf = 0;
828                 t = g2->from.type;
829                 if(t == D_ADDR)
830                         t = g2->from.index;
831                 if(h[sf].type == t)
832                 if(h[sf].sym == s)
833                         break;
834                 zname(s->name, t, sym);
835                 s->sym = sym;
836                 h[sym].sym = s;
837                 h[sym].type = t;
838                 sf = sym;
839                 sym++;
840                 if(sym >= NSYM)
841                         sym = 1;
842                 break;
843         }
844         st = 0;
845         s = g2->to.sym;
846         while(s != S) {
847                 st = s->sym;
848                 if(st < 0 || st >= NSYM)
849                         st = 0;
850                 t = g2->to.type;
851                 if(t == D_ADDR)
852                         t = g2->to.index;
853                 if(h[st].type == t)
854                 if(h[st].sym == s)
855                         break;
856                 zname(s->name, t, sym);
857                 s->sym = sym;
858                 h[sym].sym = s;
859                 h[sym].type = t;
860                 st = sym;
861                 sym++;
862                 if(sym >= NSYM)
863                         sym = 1;
864                 if(st == sf)
865                         goto jackpot;
866                 break;
867         }
868         Bputc(&obuf, a);
869         Bputc(&obuf, a>>8);
870         Bputc(&obuf, lineno);
871         Bputc(&obuf, lineno>>8);
872         Bputc(&obuf, lineno>>16);
873         Bputc(&obuf, lineno>>24);
874         zaddr(&g2->from, sf);
875         zaddr(&g2->to, st);
876
877 out:
878         if(a != AGLOBL && a != ADATA)
879                 pc++;
880 }
881
882 void
883 outhist(void)
884 {
885         Gen g;
886         Hist *h;
887         char *p, *q, *op, c;
888         int n;
889
890         g = nullgen;
891         c = pathchar();
892         for(h = hist; h != H; h = h->link) {
893                 p = h->name;
894                 op = 0;
895                 /* on windows skip drive specifier in pathname */
896                 if(systemtype(Windows) && p && p[1] == ':'){
897                         p += 2;
898                         c = *p;
899                 }
900                 if(p && p[0] != c && h->offset == 0 && pathname){
901                         /* on windows skip drive specifier in pathname */
902                         if(systemtype(Windows) && pathname[1] == ':') {
903                                 op = p;
904                                 p = pathname+2;
905                                 c = *p;
906                         } else if(pathname[0] == c){
907                                 op = p;
908                                 p = pathname;
909                         }
910                 }
911                 while(p) {
912                         q = strchr(p, c);
913                         if(q) {
914                                 n = q-p;
915                                 if(n == 0){
916                                         n = 1;  /* leading "/" */
917                                         *p = '/';       /* don't emit "\" on windows */
918                                 }
919                                 q++;
920                         } else {
921                                 n = strlen(p);
922                                 q = 0;
923                         }
924                         if(n) {
925                                 Bputc(&obuf, ANAME);
926                                 Bputc(&obuf, ANAME>>8);
927                                 Bputc(&obuf, D_FILE);   /* type */
928                                 Bputc(&obuf, 1);        /* sym */
929                                 Bputc(&obuf, '<');
930                                 Bwrite(&obuf, p, n);
931                                 Bputc(&obuf, 0);
932                         }
933                         p = q;
934                         if(p == 0 && op) {
935                                 p = op;
936                                 op = 0;
937                         }
938                 }
939                 g.offset = h->offset;
940
941                 Bputc(&obuf, AHISTORY);
942                 Bputc(&obuf, AHISTORY>>8);
943                 Bputc(&obuf, h->line);
944                 Bputc(&obuf, h->line>>8);
945                 Bputc(&obuf, h->line>>16);
946                 Bputc(&obuf, h->line>>24);
947                 zaddr(&nullgen, 0);
948                 zaddr(&g, 0);
949         }
950 }
951
952 #include "../cc/lexbody"
953 #include "../cc/macbody"
954 #include "../cc/compat"