7 main(int argc, char *argv[])
10 int nout, nproc, status, i, c;
14 memset(debug, 0, sizeof(debug));
17 include[ninclude++] = ".";
21 if(c >= 0 || c < sizeof(debug))
45 print("usage: %ca [-options] file.s\n", thechar);
48 if(argc > 1 && systemtype(Windows)){
49 print("can't assemble multiple files on windows\n");
52 if(argc > 1 && !systemtype(Windows)) {
54 if(p = getenv("NPROC"))
55 nproc = atol(p); /* */
59 while(nout < nproc && argc > 0) {
71 print("%s:\n", *argv);
99 char ofile[100], incfile[20], *p;
103 p = utfrrune(ofile, pathchar());
112 p = utfrrune(outfile, '.');
114 if(p[1] == 's' && p[2] == 0)
116 p = utfrune(outfile, 0);
121 outfile = "/dev/null";
123 p = getenv("INCLUDE");
127 if(systemtype(Plan9)) {
128 sprint(incfile,"/%s/include", thestring);
129 setinclude(strdup(incfile));
133 of = mycreat(outfile, 0664);
135 yyerror("%ca: cannot create %s", thechar, outfile);
138 Binit(&obuf, of, OWRITE);
142 for(i=0; i<nDlist; i++)
153 for(i=0; i<nDlist; i++)
250 ".AL", LCOND, Always,
256 ".PW", LS, C_WBIT|C_PBIT,
257 ".WP", LS, C_WBIT|C_PBIT,
261 ".IBW", LS, C_WBIT|C_PBIT|C_UBIT,
262 ".IAW", LS, C_WBIT|C_UBIT,
263 ".DBW", LS, C_WBIT|C_PBIT,
265 ".IB", LS, C_PBIT|C_UBIT,
289 "MULA", LTYPEN, AMULA,
293 "MULL", LTYPEM, AMULL,
294 "MULAL", LTYPEM, AMULAL,
295 "MULLU", LTYPEM, AMULLU,
296 "MULALU", LTYPEM, AMULALU,
298 "MVN", LTYPE2, AMVN, /* op2 ignored */
300 "MOVB", LTYPE3, AMOVB,
301 "MOVBU", LTYPE3, AMOVBU,
302 "MOVH", LTYPE3, AMOVH,
303 "MOVHU", LTYPE3, AMOVHU,
304 "MOVW", LTYPE3, AMOVW,
306 "MOVD", LTYPE3, AMOVD,
307 "MOVDF", LTYPE3, AMOVDF,
308 "MOVDW", LTYPE3, AMOVDW,
309 "MOVF", LTYPE3, AMOVF,
310 "MOVFD", LTYPE3, AMOVFD,
311 "MOVFW", LTYPE3, AMOVFW,
312 "MOVWD", LTYPE3, AMOVWD,
313 "MOVWF", LTYPE3, AMOVWF,
315 "LDREX", LTYPE3, ALDREX,
316 "LDREXD", LTYPE3, ALDREXD,
317 "STREX", LTYPE9, ASTREX,
318 "STREXD", LTYPE9, ASTREXD,
321 "ABSF", LTYPEI, AABSF,
322 "ABSD", LTYPEI, AABSD,
323 "NEGF", LTYPEI, ANEGF,
324 "NEGD", LTYPEI, ANEGD,
325 "SQTF", LTYPEI, ASQTF,
326 "SQTD", LTYPEI, ASQTD,
327 "RNDF", LTYPEI, ARNDF,
328 "RNDD", LTYPEI, ARNDD,
329 "URDF", LTYPEI, AURDF,
330 "URDD", LTYPEI, AURDD,
331 "NRMF", LTYPEI, ANRMF,
332 "NRMD", LTYPEI, ANRMD,
335 "SQRTF", LTYPEI, ASQRTF,
336 "SQRTD", LTYPEI, ASQRTD,
337 "CMPF", LTYPEL, ACMPF,
338 "CMPD", LTYPEL, ACMPD,
339 "ADDF", LTYPEK, AADDF,
340 "ADDD", LTYPEK, AADDD,
341 "SUBF", LTYPEK, ASUBF,
342 "SUBD", LTYPEK, ASUBD,
343 "MULF", LTYPEK, AMULF,
344 "MULD", LTYPEK, AMULD,
345 "DIVF", LTYPEK, ADIVF,
346 "DIVD", LTYPEK, ADIVD,
368 "BCASE", LTYPE5, ABCASE,
377 "MOVM", LTYPE8, AMOVM,
379 "SWPBU", LTYPE9, ASWPBU,
380 "SWPW", LTYPE9, ASWPW,
384 "CLREX", LTYPEA, ACLREX,
386 "TEXT", LTYPEB, ATEXT,
387 "GLOBL", LTYPEB, AGLOBL,
388 "DATA", LTYPEC, ADATA,
389 "CASE", LTYPED, ACASE,
391 "WORD", LTYPEH, AWORD,
407 nullgen.type = D_NONE;
408 nullgen.name = D_NONE;
412 for(i=0; i<sizeof(nullgen.sval); i++)
420 for(i=0; i<NHASH; i++)
422 for(i=0; itab[i].name; i++) {
423 s = slookup(itab[i].name);
424 s->type = itab[i].type;
425 s->value = itab[i].value;
428 pathname = allocn(pathname, 0, 100);
429 if(getwd(pathname, 99) == 0) {
430 pathname = allocn(pathname, 100, 900);
431 if(getwd(pathname, 999) == 0)
432 strcpy(pathname, "/???");
456 outcode(AEND, Always, &nullgen, NREG, &nullgen);
461 zname(char *n, int t, int s)
465 Bputc(&obuf, t); /* type */
466 Bputc(&obuf, s); /* sym */
482 Bputc(&obuf, a->type);
483 Bputc(&obuf, a->reg);
485 Bputc(&obuf, a->name);
488 print("unknown type %d\n", a->type);
499 Bputc(&obuf, a->offset);
515 for(i=0; i<NSNAME; i++) {
522 ieeedtod(&e, a->dval);
524 Bputc(&obuf, e.l>>8);
525 Bputc(&obuf, e.l>>16);
526 Bputc(&obuf, e.l>>24);
528 Bputc(&obuf, e.h>>8);
529 Bputc(&obuf, e.h>>16);
530 Bputc(&obuf, e.h>>24);
556 outcode(int a, int scond, Gen *g1, int reg, Gen *g2)
561 /* hack to make B.NE etc. work: turn it into the corresponding conditional */
563 a = bcode[scond&0xf];
564 scond = (scond & ~0xf) | Always;
574 if(sf < 0 || sf >= NSYM)
580 zname(s->name, t, sym);
594 if(st < 0 || st >= NSYM)
600 zname(s->name, t, sym);
615 Bputc(&obuf, lineno);
616 Bputc(&obuf, lineno>>8);
617 Bputc(&obuf, lineno>>16);
618 Bputc(&obuf, lineno>>24);
623 if(a != AGLOBL && a != ADATA)
637 for(h = hist; h != H; h = h->link) {
640 /* on windows skip drive specifier in pathname */
641 if(systemtype(Windows) && p && p[1] == ':'){
645 if(p && p[0] != c && h->offset == 0 && pathname){
646 /* on windows skip drive specifier in pathname */
647 if(systemtype(Windows) && pathname[1] == ':') {
651 } else if(pathname[0] == c){
661 n = 1; /* leading "/" */
662 *p = '/'; /* don't emit "\" on windows */
671 Bputc(&obuf, D_FILE); /* type */
672 Bputc(&obuf, 1); /* sym */
683 g.offset = h->offset;
685 Bputc(&obuf, AHISTORY);
686 Bputc(&obuf, Always);
688 Bputc(&obuf, h->line);
689 Bputc(&obuf, h->line>>8);
690 Bputc(&obuf, h->line>>16);
691 Bputc(&obuf, h->line>>24);
697 #include "../cc/lexbody"
698 #include "../cc/macbody"
699 #include "../cc/compat"