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,
288 "MULA", LTYPEN, AMULA,
292 "MULL", LTYPEM, AMULL,
293 "MULAL", LTYPEM, AMULAL,
294 "MULLU", LTYPEM, AMULLU,
295 "MULALU", LTYPEM, AMULALU,
297 "MVN", LTYPE2, AMVN, /* op2 ignored */
299 "MOVB", LTYPE3, AMOVB,
300 "MOVBU", LTYPE3, AMOVBU,
301 "MOVH", LTYPE3, AMOVH,
302 "MOVHU", LTYPE3, AMOVHU,
303 "MOVW", LTYPE3, AMOVW,
305 "MOVD", LTYPE3, AMOVD,
306 "MOVDF", LTYPE3, AMOVDF,
307 "MOVDW", LTYPE3, AMOVDW,
308 "MOVF", LTYPE3, AMOVF,
309 "MOVFD", LTYPE3, AMOVFD,
310 "MOVFW", LTYPE3, AMOVFW,
311 "MOVWD", LTYPE3, AMOVWD,
312 "MOVWF", LTYPE3, AMOVWF,
315 "ABSF", LTYPEI, AABSF,
316 "ABSD", LTYPEI, AABSD,
317 "NEGF", LTYPEI, ANEGF,
318 "NEGD", LTYPEI, ANEGD,
319 "SQTF", LTYPEI, ASQTF,
320 "SQTD", LTYPEI, ASQTD,
321 "RNDF", LTYPEI, ARNDF,
322 "RNDD", LTYPEI, ARNDD,
323 "URDF", LTYPEI, AURDF,
324 "URDD", LTYPEI, AURDD,
325 "NRMF", LTYPEI, ANRMF,
326 "NRMD", LTYPEI, ANRMD,
329 "CMPF", LTYPEL, ACMPF,
330 "CMPD", LTYPEL, ACMPD,
331 "ADDF", LTYPEK, AADDF,
332 "ADDD", LTYPEK, AADDD,
333 "SUBF", LTYPEK, ASUBF,
334 "SUBD", LTYPEK, ASUBD,
335 "MULF", LTYPEK, AMULF,
336 "MULD", LTYPEK, AMULD,
337 "DIVF", LTYPEK, ADIVF,
338 "DIVD", LTYPEK, ADIVD,
360 "BCASE", LTYPE5, ABCASE,
369 "MOVM", LTYPE8, AMOVM,
371 "SWPBU", LTYPE9, ASWPBU,
372 "SWPW", LTYPE9, ASWPW,
377 "TEXT", LTYPEB, ATEXT,
378 "GLOBL", LTYPEB, AGLOBL,
379 "DATA", LTYPEC, ADATA,
380 "CASE", LTYPED, ACASE,
382 "WORD", LTYPEH, AWORD,
398 nullgen.type = D_NONE;
399 nullgen.name = D_NONE;
403 for(i=0; i<sizeof(nullgen.sval); i++)
411 for(i=0; i<NHASH; i++)
413 for(i=0; itab[i].name; i++) {
414 s = slookup(itab[i].name);
415 s->type = itab[i].type;
416 s->value = itab[i].value;
419 pathname = allocn(pathname, 0, 100);
420 if(mygetwd(pathname, 99) == 0) {
421 pathname = allocn(pathname, 100, 900);
422 if(mygetwd(pathname, 999) == 0)
423 strcpy(pathname, "/???");
447 outcode(AEND, Always, &nullgen, NREG, &nullgen);
452 zname(char *n, int t, int s)
456 Bputc(&obuf, t); /* type */
457 Bputc(&obuf, s); /* sym */
473 Bputc(&obuf, a->type);
474 Bputc(&obuf, a->reg);
476 Bputc(&obuf, a->name);
479 print("unknown type %d\n", a->type);
490 Bputc(&obuf, a->offset);
506 for(i=0; i<NSNAME; i++) {
513 ieeedtod(&e, a->dval);
515 Bputc(&obuf, e.l>>8);
516 Bputc(&obuf, e.l>>16);
517 Bputc(&obuf, e.l>>24);
519 Bputc(&obuf, e.h>>8);
520 Bputc(&obuf, e.h>>16);
521 Bputc(&obuf, e.h>>24);
547 outcode(int a, int scond, Gen *g1, int reg, Gen *g2)
552 /* hack to make B.NE etc. work: turn it into the corresponding conditional */
554 a = bcode[scond&0xf];
555 scond = (scond & ~0xf) | Always;
565 if(sf < 0 || sf >= NSYM)
571 zname(s->name, t, sym);
585 if(st < 0 || st >= NSYM)
591 zname(s->name, t, sym);
606 Bputc(&obuf, lineno);
607 Bputc(&obuf, lineno>>8);
608 Bputc(&obuf, lineno>>16);
609 Bputc(&obuf, lineno>>24);
614 if(a != AGLOBL && a != ADATA)
628 for(h = hist; h != H; h = h->link) {
631 /* on windows skip drive specifier in pathname */
632 if(systemtype(Windows) && p && p[1] == ':'){
636 if(p && p[0] != c && h->offset == 0 && pathname){
637 /* on windows skip drive specifier in pathname */
638 if(systemtype(Windows) && pathname[1] == ':') {
642 } else if(pathname[0] == c){
652 n = 1; /* leading "/" */
653 *p = '/'; /* don't emit "\" on windows */
662 Bputc(&obuf, D_FILE); /* type */
663 Bputc(&obuf, 1); /* sym */
674 g.offset = h->offset;
676 Bputc(&obuf, AHISTORY);
677 Bputc(&obuf, Always);
679 Bputc(&obuf, h->line);
680 Bputc(&obuf, h->line>>8);
681 Bputc(&obuf, h->line>>16);
682 Bputc(&obuf, h->line>>24);
688 #include "../cc/lexbody"
689 #include "../cc/macbody"
690 #include "../cc/compat"