]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/7a/lex.c
ip/cifsd: dont return garbage in upper 32 bit of unix extension stat fields
[plan9front.git] / sys / src / cmd / 7a / 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 = '7';
13         thestring = "arm64";
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         ulong   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         "R",            LR,     0,
169         "R0",           LREG,   0,
170         "R1",           LREG,   1,
171         "R2",           LREG,   2,
172         "R3",           LREG,   3,
173         "R4",           LREG,   4,
174         "R5",           LREG,   5,
175         "R6",           LREG,   6,
176         "R7",           LREG,   7,
177         "R8",           LREG,   8,
178         "R9",           LREG,   9,
179         "R10",          LREG,   10,
180         "R11",          LREG,   11,
181         "R12",          LREG,   12,
182         "R13",          LREG,   13,
183         "R14",          LREG,   14,
184         "R15",          LREG,   15,
185         "R16",          LREG,   16,
186         "R17",          LREG,   17,
187         "R18",          LREG,   18,
188         "R19",          LREG,   19,
189         "R20",          LREG,   20,
190         "R21",          LREG,   21,
191         "R22",          LREG,   22,
192         "R23",          LREG,   23,
193         "R24",          LREG,   24,
194         "R25",          LREG,   25,
195         "R26",          LREG,   26,
196         "R27",          LREG,   27,
197         "R28",          LREG,   28,
198         "R29",          LREG,   29,
199         "R30",          LREG,   30,
200         "LR",                   LREG,   30,
201         "ZR",                   LREG,   31,
202
203         "RARG",         LREG,   REGARG,
204         "RARG0",        LREG,   REGARG,
205         "RSP",  LREG,   31,
206
207         "F",            LF,     0,
208
209         "F0",           LFREG,  0,
210         "F1",           LFREG,  1,
211         "F2",           LFREG,  2,
212         "F3",           LFREG,  3,
213         "F4",           LFREG,  4,
214         "F5",           LFREG,  5,
215         "F6",           LFREG,  6,
216         "F7",           LFREG,  7,
217         "F8",           LFREG,  8,
218         "F9",           LFREG,  9,
219         "F10",  LFREG,  10,
220         "F11",  LFREG,  11,
221         "F12",  LFREG,  12,
222         "F13",  LFREG,  13,
223         "F14",  LFREG,  14,
224         "F15",  LFREG,  15,
225         "F16",  LFREG,  16,
226         "F17",  LFREG,  17,
227         "F18",  LFREG,  18,
228         "F19",  LFREG,  19,
229         "F20",  LFREG,  20,
230         "F21",  LFREG,  21,
231         "F22",  LFREG,  22,
232         "F23",  LFREG,  23,
233         "F24",  LFREG,  24,
234         "F25",  LFREG,  25,
235         "F26",  LFREG,  26,
236         "F27",  LFREG,  27,
237         "F28",  LFREG,  28,
238         "F29",  LFREG,  29,
239         "F30",  LFREG,  30,
240         "F31",  LFREG,  31,
241
242         "V",            LV,     0,
243
244         "V0",           LVREG,  0,
245         "V1",           LVREG,  1,
246         "V2",           LVREG,  2,
247         "V3",           LVREG,  3,
248         "V4",           LVREG,  4,
249         "V5",           LVREG,  5,
250         "V6",           LVREG,  6,
251         "V7",           LVREG,  7,
252         "V8",           LVREG,  8,
253         "V9",           LVREG,  9,
254         "V10",  LVREG,  10,
255         "V11",  LVREG,  11,
256         "V12",  LVREG,  12,
257         "V13",  LVREG,  13,
258         "V14",  LVREG,  14,
259         "V15",  LVREG,  15,
260         "V16",  LVREG,  16,
261         "V17",  LVREG,  17,
262         "V18",  LVREG,  18,
263         "V19",  LVREG,  19,
264         "V20",  LVREG,  20,
265         "V21",  LVREG,  21,
266         "V22",  LVREG,  22,
267         "V23",  LVREG,  23,
268         "V24",  LVREG,  24,
269         "V25",  LVREG,  25,
270         "V26",  LVREG,  26,
271         "V27",  LVREG,  27,
272         "V28",  LVREG,  28,
273         "V29",  LVREG,  29,
274         "V30",  LVREG,  30,
275         "V31",  LVREG,  31,
276
277         "FPSR",         LFCR,   D_FPSR,
278         "FPCR",         LFCR,   D_FPCR,
279
280         "SPR",          LSPR,   D_SPR,
281         "NZCV",         LSPREG, D_NZCV,
282         "ELR_EL1",      LSPREG, D_ELR_EL1,
283         "ELR_EL2",      LSPREG, D_ELR_EL2,
284 //      "ELR_EL3",      LSPREG, D_ELR_EL3,
285 //      "LR_EL0",       LSPREG, D_LR_EL0,
286         "DAIF", LSPREG, D_DAIF,
287         "CurrentEL",    LSPREG, D_CurrentEL,
288         "SP_EL0",       LSPREG, D_SP_EL0,
289 //      "SP_EL1",       LSPREG, D_SP_EL1,
290 //      "SP_EL2",       LSPREG, D_SP_EL2,
291         "SPSel",        LSPREG, D_SPSel,
292 //      "SPSR_abt",     LSPREG, D_SPSR_abt,     
293         "SPSR_EL1",     LSPREG, D_SPSR_EL1,
294         "SPSR_EL2",     LSPREG, D_SPSR_EL2,
295 //      "SPSR_EL3",     LSPREG, D_SPSR_EL3,
296 //      "SPSR_fiq",     LSPREG, D_SPSR_fiq,
297 //      "SPSR_ieq",     LSPREG, D_SPSR_ieq,
298 //      "SPSR_und",     LSPREG, D_SPSR_und,
299         "DAIFSet",      LSPREG, D_DAIFSet,
300         "DAIFClr",      LSPREG, D_DAIFClr,
301
302         "EQ",           LCOND,  0,
303         "NE",           LCOND,  1,
304         "CS",           LCOND,  2,
305         "HS",           LCOND,  2,
306         "CC",   LCOND,  3,
307         "LO",           LCOND,  3,
308         "MI",           LCOND,  4,
309         "PL",           LCOND,  5,
310         "VS",           LCOND,  6,
311         "VC",   LCOND,  7,
312         "HI",           LCOND,  8,
313         "LS",           LCOND,  9,
314         "GE",           LCOND,  10,
315         "LT",           LCOND,  11,
316         "GT",           LCOND,  12,
317         "LE",           LCOND,  13,
318         "AL",           LCOND,  14,
319
320         ".UXTB",        LEXT,   0,
321         ".UXTH",        LEXT,   1,
322         ".UXTW",        LEXT,   2,
323         ".UXTX",        LEXT,   3,
324         ".SXTB",        LEXT,   4,
325         ".SXTH",        LEXT,   5,
326         ".SXTW",        LEXT,   6,
327         ".SXTX",        LEXT,   7,
328
329         ".UB",  LEXT,   0,
330         ".UH",  LEXT,   1,
331         ".UW",  LEXT,   2,
332         ".UX",  LEXT,   3,
333         ".SB",  LEXT,   4,
334         ".SH",  LEXT,   5,
335         ".SW",  LEXT,   6,
336         ".SX",  LEXT,   7,
337
338         "@",            LAT,    0,
339
340         "ADC",  LTYPE1, AADC,
341         "ADCS", LTYPE1, AADCS,
342         "ADCSW",        LTYPE1, AADCSW,
343         "ADCW", LTYPE1, AADCW,
344         "ADD",  LTYPE1, AADD,
345         "ADDS", LTYPE1, AADDS,
346         "ADDSW",        LTYPE1, AADDSW,
347         "ADDW", LTYPE1, AADDW,
348         "ADR",  LTYPEV, AADR,
349         "ADRP", LTYPEV, AADRP,
350         "AND",  LTYPE1, AAND,
351         "ANDS", LTYPE1, AANDS,
352         "ANDSW",        LTYPE1, AANDSW,
353         "ANDW", LTYPE1, AANDW,
354         "ASR",  LTYPE1, AASR,
355         "ASRW", LTYPE1, AASRW,
356         "AT",   LTYPEN, AAT,
357         "BFI",  LTYPEY, ABFI,
358         "BFIW", LTYPEY, ABFIW,
359         "BFM",  LTYPEY, ABFM,
360         "BFMW", LTYPEY, ABFMW,
361         "BFXIL",        LTYPEY, ABFXIL,
362         "BFXILW",       LTYPEY, ABFXILW,
363         "BIC",  LTYPE1, ABIC,
364         "BICS", LTYPE1, ABICS,
365         "BICSW",        LTYPE1, ABICSW,
366         "BICW", LTYPE1, ABICW,
367         "BRK",  LTYPE6, ABRK,
368         "CBNZ", LTYPE8, ACBNZ,
369         "CBNZW",        LTYPE8, ACBNZW,
370         "CBZ",  LTYPE8, ACBZ,
371         "CBZW", LTYPE8, ACBZW,
372         "CCMN", LTYPEU, ACCMN,
373         "CCMNW",        LTYPEU, ACCMNW,
374         "CCMP", LTYPEU, ACCMP,
375         "CCMPW",        LTYPEU, ACCMPW,
376         "CINC", LTYPES, ACINC,
377         "CINCW",        LTYPES, ACINCW,
378         "CINV", LTYPES, ACINV,
379         "CINVW",        LTYPES, ACINVW,
380         "CLREX",        LTYPE6, ACLREX,
381         "CLS",  LTYPE2, ACLS,
382         "CLSW", LTYPE2, ACLSW,
383         "CLZ",  LTYPE2, ACLZ,
384         "CLZW", LTYPE2, ACLZW,
385         "CMN",  LTYPE7, ACMN,
386         "CMNW", LTYPE7, ACMNW,
387         "CMP",  LTYPE7, ACMP,
388         "CMPW", LTYPE7, ACMPW,
389         "CNEG", LTYPES, ACNEG,
390         "CNEGW",        LTYPES, ACNEGW,
391         "CRC32B",       LTYPE1, ACRC32B,
392         "CRC32CB",      LTYPE1, ACRC32CB,
393         "CRC32CH",      LTYPE1, ACRC32CH,
394         "CRC32CW",      LTYPE1, ACRC32CW,
395         "CRC32CX",      LTYPE1, ACRC32CX,
396         "CRC32H",       LTYPE1, ACRC32H,
397         "CRC32W",       LTYPE1, ACRC32W,
398         "CRC32X",       LTYPE1, ACRC32X,
399         "CSEL", LTYPES, ACSEL,
400         "CSELW",        LTYPES, ACSELW,
401         "CSET", LTYPER, ACSET,
402         "CSETM",        LTYPER, ACSETM,
403         "CSETMW",       LTYPER, ACSETMW,
404         "CSETW",        LTYPER, ACSETW,
405         "CSINC",        LTYPES, ACSINC,
406         "CSINCW",       LTYPES, ACSINCW,
407         "CSINV",        LTYPES, ACSINV,
408         "CSINVW",       LTYPES, ACSINVW,
409         "CSNEG",        LTYPES, ACSNEG,
410         "CSNEGW",       LTYPES, ACSNEGW,
411         "DC",   LTYPEN, ADC,
412         "DCPS1",        LTYPE6, ADCPS1,
413         "DCPS2",        LTYPE6, ADCPS2,
414         "DCPS3",        LTYPE6, ADCPS3,
415         "DMB",  LDMB,   ADMB,
416         "DRPS", LTYPE6, ADRPS,
417         "DSB",  LDMB,   ADSB,
418         "EON",  LTYPE1, AEON,
419         "EONW", LTYPE1, AEONW,
420         "EOR",  LTYPE1, AEOR,
421         "EORW", LTYPE1, AEORW,
422         "ERET", LTYPE0, AERET,
423         "EXTR", LTYPEP, AEXTR,
424         "EXTRW",        LTYPEP, AEXTRW,
425         "HINT", LDMB,   AHINT,
426         "HLT",  LTYPE6, AHLT,
427         "HVC",  LTYPE6, AHVC,
428         "IC",   LTYPEN, AIC,
429         "ISB",  LDMB,   AISB,
430         "LSL",  LTYPE1, ALSL,
431         "LSLW", LTYPE1, ALSLW,
432         "LSR",  LTYPE1, ALSR,
433         "LSRW", LTYPE1, ALSRW,
434         "MADD", LTYPEM, AMADD,
435         "MADDW",        LTYPEM, AMADDW,
436         "MNEG", LTYPE1, AMNEG,
437         "MNEGW",        LTYPE1, AMNEGW,
438         "MRS",  LTYPE3, AMRS,
439         "MSR",  LTYPE3, AMSR,
440         "MSUB", LTYPEM, AMSUB,
441         "MSUBW",        LTYPEM, AMSUBW,
442         "MUL",  LTYPE1, AMUL,
443         "MULW", LTYPE1, AMULW,
444         "MVN",  LTYPE1, AMVN,
445         "MVNW", LTYPE1, AMVNW,
446         "NEG",  LTYPE1, ANEG,
447         "NEGS", LTYPE1, ANEGS,
448         "NEGSW",        LTYPE1, ANEGSW,
449         "NEGW", LTYPE1, ANEGW,
450         "NGC",  LTYPE2, ANGC,
451         "NGCS", LTYPE2, ANGCS,
452         "NGCSW",        LTYPE2, ANGCSW,
453         "NGCW", LTYPE2, ANGCW,
454         "ORN",  LTYPE1, AORN,
455         "ORNW", LTYPE1, AORNW,
456         "ORR",  LTYPE1, AORR,
457         "ORRW", LTYPE1, AORRW,
458         "PRFM", LTYPE1, APRFM,
459         "PRFUM",        LTYPE1, APRFUM,
460         "RBIT", LTYPE2, ARBIT,
461         "RBITW",        LTYPE2, ARBITW,
462         "REM",  LTYPE1, AREM,
463         "REMW", LTYPE1, AREMW,
464         "RET",  LTYPEA, ARET,
465         "REV",  LTYPE2, AREV,
466         "REV16",        LTYPE2, AREV16,
467         "REV16W",       LTYPE2, AREV16W,
468         "REV32",        LTYPE2, AREV32,
469         "REVW", LTYPE2, AREVW,
470         "ROR",  LTYPE1, AROR,
471         "RORW", LTYPE1, ARORW,
472         "SBC",  LTYPE1, ASBC,
473         "SBCS", LTYPE1, ASBCS,
474         "SBCSW",        LTYPE1, ASBCSW,
475         "SBCW", LTYPE1, ASBCW,
476         "SBFIZ",        LTYPEY, ASBFIZ,
477         "SBFIZW",       LTYPEY, ASBFIZW,
478         "SBFM", LTYPEY, ASBFM,
479         "SBFMW",        LTYPEY, ASBFMW,
480         "SBFX", LTYPEY, ASBFX,
481         "SBFXW",        LTYPEY, ASBFXW,
482         "SDIV", LTYPE1, ASDIV,
483         "SDIVW",        LTYPE1, ASDIVW,
484         "SEV",  LTYPE0, ASEV,
485         "SEVL", LTYPE0, ASEVL,
486         "SMADDL",       LTYPEM, ASMADDL,
487         "SMC",  LTYPE6, ASMC,
488         "SMNEGL",       LTYPE1, ASMNEGL,
489         "SMSUBL",       LTYPEM, ASMSUBL,
490         "SMULH",        LTYPE1, ASMULH,
491         "SMULL",        LTYPE1, ASMULL,
492         "STLR", LSTXR,  ASTLR,
493         "STLRB",        LSTXR,  ASTLRB,
494         "STLRH",        LSTXR,  ASTLRH,
495         "STLRW",        LSTXR,  ASTLRW,
496         "STLXP",        LSTXR,  ASTLXP,
497         "STLXR",        LSTXR,  ASTLXR,
498         "STLXRB",       LSTXR,  ASTLXRB,
499         "STLXRH",       LSTXR,  ASTLXRH,
500         "STLXRW",       LSTXR,  ASTLXRW,
501         "STXR", LSTXR,  ASTXR,
502         "STXRB",        LSTXR,  ASTXRB,
503         "STXRH",        LSTXR,  ASTXRH,
504         "STXP", LSTXR,  ASTXP,
505         "STXPW",        LSTXR,  ASTXPW,
506         "STXRW",        LSTXR,  ASTXRW,
507         "SUB",  LTYPE1, ASUB,
508         "SUBS", LTYPE1, ASUBS,
509         "SUBSW",        LTYPE1, ASUBSW,
510         "SUBW", LTYPE1, ASUBW,
511         "SVC",  LTYPE6, ASVC,
512         "SXTB", LTYPE2, ASXTB,
513         "SXTBW",        LTYPE2, ASXTBW,
514         "SXTH", LTYPE2, ASXTH,
515         "SXTHW",        LTYPE2, ASXTHW,
516         "SXTW", LTYPE2, ASXTW,
517         "SYS",  LTYPEN, ASYS,
518         "SYSL", LTYPEO, ASYSL,
519         "TBNZ", LTYPET, ATBNZ,
520         "TBZ",  LTYPET, ATBZ,
521         "TLBI", LTYPEN, ATLBI,
522         "TST",  LTYPE7, ATST,
523         "TSTW", LTYPE7, ATSTW,
524         "UBFIZ",        LTYPEY, AUBFIZ,
525         "UBFIZW",       LTYPEY, AUBFIZW,
526         "UBFM", LTYPEY, AUBFM,
527         "UBFMW",        LTYPEY, AUBFMW,
528         "UBFX", LTYPEY, AUBFX,
529         "UBFXW",        LTYPEY, AUBFXW,
530         "UDIV", LTYPE1, AUDIV,
531         "UDIVW",        LTYPE1, AUDIVW,
532         "UMADDL",       LTYPEM, AUMADDL,
533         "UMNEGL",       LTYPE1, AUMNEGL,
534         "UMSUBL",       LTYPEM, AUMSUBL,
535         "UMULH",        LTYPE1, AUMULH,
536         "UMULL",        LTYPE1, AUMULL,
537         "UREM",         LTYPE1, AUREM,
538         "UREMW",        LTYPE1, AUREMW,
539         "UXTB", LTYPE2, AUXTB,
540         "UXTH", LTYPE2, AUXTH,
541         "UXTBW",        LTYPE2, AUXTBW,
542         "UXTHW",        LTYPE2, AUXTHW,
543         "UXTW",         LTYPE2, AUXTW,
544         "WFE",  LTYPE0, AWFE,
545         "WFI",  LTYPE0, AWFI,
546         "YIELD",        LTYPE0, AYIELD,
547
548         "LDXR", LTYPE3, ALDXR,
549         "LDXRB",        LTYPE3, ALDXRB,
550         "LDXRH",        LTYPE3, ALDXRH,
551         "LDXRW",        LTYPE3, ALDXRW,
552
553         "LDAR", LTYPE3, ALDAR,
554         "LDARB",        LTYPE3, ALDARB,
555         "LDARH",        LTYPE3, ALDARH,
556         "LDARW",        LTYPE3, ALDARW,
557
558         "LDXP", LTYPE3, ALDXP,
559         "LDXPW",        LTYPE3, ALDXPW,
560         "LDAXP",        LTYPE3, ALDAXP,
561         "LDAXPW",       LTYPE3, ALDAXPW,
562
563         "LDAXR",        LTYPE3, ALDAXR,
564         "LDAXRB",       LTYPE3, ALDAXRB,
565         "LDAXRH",       LTYPE3, ALDAXRH,
566         "LDAXRW",       LTYPE3, ALDAXRW,
567
568         "MOVK", LMOVK,  AMOVK,
569         "MOVKW",        LMOVK,  AMOVKW,
570         "MOVN", LMOVK,  AMOVN,
571         "MOVNW",        LMOVK,  AMOVNW,
572         "MOVZ", LMOVK,  AMOVZ,
573         "MOVZW",        LMOVK,  AMOVZW,
574
575         "MOVB",         LTYPE3, AMOVB,
576         "MOVBU",        LTYPE3, AMOVBU,
577         "MOVH",         LTYPE3, AMOVH,
578         "MOVHU",        LTYPE3, AMOVHU,
579         "MOVW",         LTYPE3, AMOVW,
580         "MOVWU",                LTYPE3, AMOVWU,
581         "MOV",          LTYPE3, AMOV,
582
583         "MOVP", LTYPEJ, AMOVP,
584         "MOVPD",        LTYPEJ, AMOVPD,
585         "MOVPQ",        LTYPEJ, AMOVPQ,
586         "MOVPS",        LTYPEJ, AMOVPS,
587         "MOVPSW",       LTYPEJ, AMOVPSW,
588         "MOVPW",        LTYPEJ, AMOVPW,
589
590         "MOVNP",        LTYPEJ, AMOVNP,
591         "MOVNPW",       LTYPEJ, AMOVNPW,
592
593         "FMOVD",                LTYPE3, AFMOVD,
594         "FMOVS",                LTYPE3, AFMOVS,
595
596         "SCVTFD",       LTYPE3, ASCVTFD,
597         "SCVTFS",       LTYPE3, ASCVTFS,
598         "SCVTFWD",      LTYPE3, ASCVTFWD,
599         "SCVTFWS",      LTYPE3, ASCVTFWS,
600         "UCVTFD",       LTYPE3, AUCVTFD,
601         "UCVTFS",       LTYPE3, AUCVTFS,
602         "UCVTFWD",      LTYPE3, AUCVTFWD,
603         "UCVTFWS",      LTYPE3, AUCVTFWS,
604
605         "FCVTSD",       LTYPE3, AFCVTSD,
606         "FCVTDS",       LTYPE3, AFCVTDS,
607         "FCVTZSD",      LTYPE3, AFCVTZSD,
608         "FCVTZSDW",     LTYPE3, AFCVTZSDW,
609         "FCVTZSS",      LTYPE3, AFCVTZSS,
610         "FCVTZSSW",     LTYPE3, AFCVTZSSW,
611         "FCVTZUD",      LTYPE3, AFCVTZUD,
612         "FCVTZUDW",     LTYPE3, AFCVTZUDW,
613         "FCVTZUS",      LTYPE3, AFCVTZUS,
614         "FCVTZUSW",     LTYPE3, AFCVTZUSW,
615
616         "FCMPS",                LTYPEL, AFCMPS,
617         "FCMPD",                LTYPEL, AFCMPD,
618         "FCMPES",               LTYPEL, AFCMPES,
619         "FCMPED",       LTYPEL, AFCMPED,
620         "FCCMPS",       LTYPEF, AFCCMPS,
621         "FCCMPD",       LTYPEF, AFCCMPD,
622         "FCCMPES",      LTYPEF, AFCCMPES,
623         "FCCMPED",      LTYPEF, AFCCMPED,
624         "FADDS",                LTYPEK, AFADDS,
625         "FADDD",                LTYPEK, AFADDD,
626         "FSUBS",                LTYPEK, AFSUBS,
627         "FSUBD",                LTYPEK, AFSUBD,
628         "FMULS",                LTYPEK, AFMULS,
629         "FMULD",                LTYPEK, AFMULD,
630         "FDIVS",                LTYPEK, AFDIVS,
631         "FDIVD",                LTYPEK, AFDIVD,
632
633         "FCSELS",       LFCSEL, AFCSELS,
634         "FCSELD",       LFCSEL, AFCSELD,
635         "FMAXS",        LTYPEK, AFMAXS,
636         "FMINS",        LTYPEK, AFMINS,
637         "FMAXD",        LTYPEK, AFMAXD,
638         "FMIND",        LTYPEK, AFMIND,
639         "FMAXNMS",      LTYPEK, AFMAXNMS,
640         "FMAXNMD",      LTYPEK, AFMAXNMD,
641         "FMINNMS",      LTYPEK, AFMINNMS,
642         "FMINNMD",      LTYPEK, AFMINNMD,
643         "FNMULS",       LTYPEK, AFNMULS,
644         "FNMULD",       LTYPEK, AFNMULD,
645         "FRINTNS",      LTYPE3, AFRINTNS,
646         "FRINTND",      LTYPE3, AFRINTND,
647         "FRINTPS",      LTYPE3, AFRINTPS,
648         "FRINTPD",      LTYPE3, AFRINTPD,
649         "FRINTMS",      LTYPE3, AFRINTMS,
650         "FRINTMD",      LTYPE3, AFRINTMD,
651         "FRINTZS",      LTYPE3, AFRINTZS,
652         "FRINTZD",      LTYPE3, AFRINTZD,
653         "FRINTAS",      LTYPE3, AFRINTAS,
654         "FRINTAD",      LTYPE3, AFRINTAD,
655         "FRINTXS",      LTYPE3, AFRINTXS,
656         "FRINTXD",      LTYPE3, AFRINTXD,
657         "FRINTIS",      LTYPE3, AFRINTIS,
658         "FRINTID",      LTYPE3, AFRINTID,
659         "FMADDS",       LTYPEM, AFMADDS,
660         "FMADDD",       LTYPEM, AFMADDD,
661         "FMSUBS",       LTYPEM, AFMSUBS,
662         "FMSUBD",       LTYPEM, AFMSUBD,
663         "FNMADDS",      LTYPEM, AFNMADDS,
664         "FNMADDD",      LTYPEM, AFNMADDD,
665         "FNMSUBS",      LTYPEM, AFNMSUBS,
666         "FNMSUBD",      LTYPEM, AFNMSUBD,
667
668         "FABSS",        LTYPE3,         AFABSS,
669         "FABSD",        LTYPE3, AFABSD,
670         "FNEGS",        LTYPE3, AFNEGS,
671         "FNEGD",        LTYPE3, AFNEGD,
672         "FSQRTS",       LTYPE3, AFSQRTS,
673         "FSQRTD",       LTYPE3, AFSQRTD,
674         "FCVTDH",       LTYPE3, AFCVTDH,
675         "FCVTHS",       LTYPE3, AFCVTHS,
676         "FCVTHD",       LTYPE3, AFCVTHD,
677         "FCVTSH",       LTYPE3, AFCVTSH,
678
679         "AESD", LTYPEW, AAESD,
680         "AESE", LTYPEW, AAESE,
681         "AESIMC",       LTYPEW, AAESIMC,
682         "AESMC",        LTYPEW, AAESMC,
683         "SHA1C",        LTYPEW, ASHA1C,
684         "SHA1H",        LTYPEW, ASHA1H,
685         "SHA1M",        LTYPEW, ASHA1M,
686         "SHA1P",        LTYPEW, ASHA1P,
687         "SHA1SU0",      LTYPEW, ASHA1SU0,
688         "SHA1SU1",      LTYPEW, ASHA1SU1,
689         "SHA256H",      LTYPEW, ASHA256H,
690         "SHA256H2",     LTYPEW, ASHA256H2,
691         "SHA256SU0",    LTYPEW, ASHA256SU0,
692         "SHA256SU1",    LTYPEW, ASHA256SU1,
693
694         "B",            LTYPE4, AB,
695         "BL",           LTYPE4, ABL,
696
697         "BEQ",          LTYPE5, ABEQ,
698         "BNE",          LTYPE5, ABNE,
699         "BCS",          LTYPE5, ABCS,
700         "BHS",          LTYPE5, ABHS,
701         "BCC",          LTYPE5, ABCC,
702         "BLO",          LTYPE5, ABLO,
703         "BMI",          LTYPE5, ABMI,
704         "BPL",          LTYPE5, ABPL,
705         "BVS",          LTYPE5, ABVS,
706         "BVC",          LTYPE5, ABVC,
707         "BHI",          LTYPE5, ABHI,
708         "BLS",          LTYPE5, ABLS,
709         "BGE",          LTYPE5, ABGE,
710         "BLT",          LTYPE5, ABLT,
711         "BGT",          LTYPE5, ABGT,
712         "BLE",          LTYPE5, ABLE,
713         "BCASE",        LTYPE5, ABCASE,
714
715         "TEXT",         LTYPEB, ATEXT,
716         "GLOBL",        LTYPEB, AGLOBL,
717         "DATA",         LTYPEC, ADATA,
718         "CASE",         LTYPED, ACASE,
719         "END",          LTYPEE, AEND,
720         "WORD",         LTYPEH, AWORD,
721         "DWORD",                LTYPEH, ADWORD,
722         "NOP",          LTYPEQ, ANOP,
723         "RETURN",       LTYPEA, ARETURN,
724         0
725 };
726
727 void
728 cinit(void)
729 {
730         Sym *s;
731         int i;
732
733         nullgen.sym = S;
734         nullgen.offset = 0;
735         nullgen.type = D_NONE;
736         nullgen.name = D_NONE;
737         nullgen.reg = NREG;
738         nullgen.xreg = NREG;
739         if(FPCHIP)
740                 nullgen.dval = 0;
741         for(i=0; i<sizeof(nullgen.sval); i++)
742                 nullgen.sval[i] = 0;
743
744         nerrors = 0;
745         iostack = I;
746         iofree = I;
747         peekc = IGN;
748         nhunk = 0;
749         for(i=0; i<NHASH; i++)
750                 hash[i] = S;
751         for(i=0; itab[i].name; i++) {
752                 s = slookup(itab[i].name);
753                 if(s->value != 0)
754                         yyerror("internal: duplicate %s", s->name);
755                 s->type = itab[i].type;
756                 s->value = itab[i].value;
757         }
758
759         pathname = allocn(pathname, 0, 100);
760         if(getwd(pathname, 99) == 0) {
761                 pathname = allocn(pathname, 100, 900);
762                 if(getwd(pathname, 999) == 0)
763                         strcpy(pathname, "/???");
764         }
765 }
766
767 void
768 syminit(Sym *s)
769 {
770
771         s->type = LNAME;
772         s->value = 0;
773 }
774
775 void
776 cclean(void)
777 {
778
779         outcode(AEND, &nullgen, NREG, &nullgen);
780         Bflush(&obuf);
781 }
782
783 void
784 zname(char *n, int t, int s)
785 {
786
787         Bputc(&obuf, ANAME);
788         Bputc(&obuf, ANAME>>8);
789         Bputc(&obuf, t);        /* type */
790         Bputc(&obuf, s);        /* sym */
791         while(*n) {
792                 Bputc(&obuf, *n);
793                 n++;
794         }
795         Bputc(&obuf, 0);
796 }
797
798 void
799 zaddr(Gen *a, int s)
800 {
801         long l;
802         int i;
803         char *n;
804         Ieee e;
805
806         if(a->type == D_CONST){
807                 l = a->offset;
808                 if((vlong)l != a->offset)
809                         a->type = D_DCONST;
810         }
811         Bputc(&obuf, a->type);
812         Bputc(&obuf, a->reg);
813         Bputc(&obuf, s);
814         Bputc(&obuf, a->name);
815         switch(a->type) {
816         default:
817                 print("unknown type %d\n", a->type);
818                 exits("arg");
819
820         case D_NONE:
821         case D_REG:
822         case D_SP:
823         case D_FREG:
824         case D_VREG:
825         case D_COND:
826                 break;
827
828         case D_DCONST:
829                 l = a->offset;
830                 Bputc(&obuf, l);
831                 Bputc(&obuf, l>>8);
832                 Bputc(&obuf, l>>16);
833                 Bputc(&obuf, l>>24);
834                 l = a->offset>>32;
835                 Bputc(&obuf, l);
836                 Bputc(&obuf, l>>8);
837                 Bputc(&obuf, l>>16);
838                 Bputc(&obuf, l>>24);
839                 break;
840
841         case D_OREG:
842         case D_XPRE:
843         case D_XPOST:
844         case D_CONST:
845         case D_BRANCH:
846         case D_SHIFT:
847         case D_EXTREG:
848         case D_ROFF:
849         case D_SPR:
850                 l = a->offset;
851                 Bputc(&obuf, l);
852                 Bputc(&obuf, l>>8);
853                 Bputc(&obuf, l>>16);
854                 Bputc(&obuf, l>>24);
855                 break;
856
857         case D_SCONST:
858                 n = a->sval;
859                 for(i=0; i<NSNAME; i++) {
860                         Bputc(&obuf, *n);
861                         n++;
862                 }
863                 break;
864
865         case D_FCONST:
866                 ieeedtod(&e, a->dval);
867                 Bputc(&obuf, e.l);
868                 Bputc(&obuf, e.l>>8);
869                 Bputc(&obuf, e.l>>16);
870                 Bputc(&obuf, e.l>>24);
871                 Bputc(&obuf, e.h);
872                 Bputc(&obuf, e.h>>8);
873                 Bputc(&obuf, e.h>>16);
874                 Bputc(&obuf, e.h>>24);
875                 break;
876         }
877 }
878
879 static int
880 outsim(Gen *g)
881 {
882         Sym *s;
883         int sno, t;
884
885         s = g->sym;
886         if(s == S)
887                 return 0;
888         sno = s->sym;
889         if(sno < 0 || sno >= NSYM)
890                 sno = 0;
891         t = g->name;
892         if(h[sno].type == t && h[sno].sym == s)
893                 return sno;
894         zname(s->name, t, sym);
895         s->sym = sym;
896         h[sym].sym = s;
897         h[sym].type = t;
898         sno = sym;
899         sym++;
900         if(sym >= NSYM)
901                 sym = 1;
902         return sno;
903 }
904
905 void
906 outcode(int a, Gen *g1, int reg, Gen *g2)
907 {
908         int sf, st;
909
910         if(a != AGLOBL && a != ADATA)
911                 pc++;
912         if(pass == 1)
913                 return;
914         do{
915                 sf = outsim(g1);
916                 st = outsim(g2);
917         } while(sf != 0 && st == sf);
918         Bputc(&obuf, a);
919         Bputc(&obuf, a>>8);
920         Bputc(&obuf, reg);
921         Bputc(&obuf, lineno);
922         Bputc(&obuf, lineno>>8);
923         Bputc(&obuf, lineno>>16);
924         Bputc(&obuf, lineno>>24);
925         zaddr(g1, sf);
926         zaddr(g2, st);
927 }
928
929 void
930 outcode4(int a, Gen *g1, int reg, Gen *g2, Gen *g3)
931 {
932         int s1, s2, s3, flag;
933
934         if(a != AGLOBL && a != ADATA)
935                 pc++;
936         if(pass == 1)
937                 return;
938         do{
939                 s1 = outsim(g1);
940                 s2 = outsim(g2);
941                 s3 = outsim(g3);
942         } while(s1 && (s2 && s1 == s2 || s3 && s1 == s3) || s2 && (s3 && s2 == s3));
943         flag = 0;
944         if(g2->type != D_NONE)
945                 flag = 0x40;    /* flags extra operand */
946         Bputc(&obuf, a);
947         Bputc(&obuf, a>>8);
948         Bputc(&obuf, reg | flag);
949         Bputc(&obuf, lineno);
950         Bputc(&obuf, lineno>>8);
951         Bputc(&obuf, lineno>>16);
952         Bputc(&obuf, lineno>>24);
953         zaddr(g1, s1);
954         if(flag)
955                 zaddr(g2, s2);
956         zaddr(g3, s3);
957 }
958
959 void
960 outhist(void)
961 {
962         Gen g;
963         Hist *h;
964         char *p, *q, *op, c;
965         int n;
966
967         g = nullgen;
968         c = pathchar();
969         for(h = hist; h != H; h = h->link) {
970                 p = h->name;
971                 op = 0;
972                 /* on windows skip drive specifier in pathname */
973                 if(systemtype(Windows) && p && p[1] == ':'){
974                         p += 2;
975                         c = *p;
976                 }
977                 if(p && p[0] != c && h->offset == 0 && pathname){
978                         /* on windows skip drive specifier in pathname */
979                         if(systemtype(Windows) && pathname[1] == ':') {
980                                 op = p;
981                                 p = pathname+2;
982                                 c = *p;
983                         } else if(pathname[0] == c){
984                                 op = p;
985                                 p = pathname;
986                         }
987                 }
988                 while(p) {
989                         q = strchr(p, c);
990                         if(q) {
991                                 n = q-p;
992                                 if(n == 0){
993                                         n = 1;  /* leading "/" */
994                                         *p = '/';       /* don't emit "\" on windows */
995                                 }
996                                 q++;
997                         } else {
998                                 n = strlen(p);
999                                 q = 0;
1000                         }
1001                         if(n) {
1002                                 Bputc(&obuf, ANAME);
1003                                 Bputc(&obuf, ANAME>>8);
1004                                 Bputc(&obuf, D_FILE);   /* type */
1005                                 Bputc(&obuf, 1);        /* sym */
1006                                 Bputc(&obuf, '<');
1007                                 Bwrite(&obuf, p, n);
1008                                 Bputc(&obuf, 0);
1009                         }
1010                         p = q;
1011                         if(p == 0 && op) {
1012                                 p = op;
1013                                 op = 0;
1014                         }
1015                 }
1016                 g.offset = h->offset;
1017
1018                 Bputc(&obuf, AHISTORY);
1019                 Bputc(&obuf, AHISTORY>>8);
1020                 Bputc(&obuf, 0);
1021                 Bputc(&obuf, h->line);
1022                 Bputc(&obuf, h->line>>8);
1023                 Bputc(&obuf, h->line>>16);
1024                 Bputc(&obuf, h->line>>24);
1025                 zaddr(&nullgen, 0);
1026                 zaddr(&g, 0);
1027         }
1028 }
1029
1030 #include "../cc/lexbody"
1031 #include "../cc/macbody"
1032 #include "../cc/compat"