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))
41 print("usage: %ca [-options] file.s\n", thechar);
44 if(argc > 1 && systemtype(Windows)){
45 print("can't assemble multiple files on windows\n");
48 if(argc > 1 && !systemtype(Windows)) {
50 if(p = getenv("NPROC"))
51 nproc = atol(p); /* */
55 while(nout < nproc && argc > 0) {
67 print("%s:\n", *argv);
95 char ofile[100], incfile[20], *p;
99 p = utfrrune(ofile, pathchar());
108 p = utfrrune(outfile, '.');
110 if(p[1] == 's' && p[2] == 0)
112 p = utfrune(outfile, 0);
117 outfile = "/dev/null";
119 p = getenv("INCLUDE");
123 if(systemtype(Plan9)) {
124 sprint(incfile,"/%s/include", thestring);
125 setinclude(strdup(incfile));
129 of = mycreat(outfile, 0664);
131 yyerror("%ca: cannot create %s", thechar, outfile);
134 Binit(&obuf, of, OWRITE);
138 for(i=0; i<nDlist; i++)
149 for(i=0; i<nDlist; i++)
282 "ADDCC", LADDW, AADDCC,
283 "ADDX", LADDW, AADDX,
284 "ADDXCC", LADDW, AADDXCC,
286 "ANDCC", LADDW, AANDCC,
287 "ANDN", LADDW, AANDN,
288 "ANDNCC", LADDW, AANDNCC,
307 "CB012", LBRA, ACB012,
308 "CB013", LBRA, ACB013,
310 "CB023", LBRA, ACB023,
314 "CB123", LBRA, ACB123,
322 "CPOP1", LCPOP, ACPOP1,
323 "CPOP2", LCPOP, ACPOP2,
324 "DATA", LDATA, ADATA,
326 "DIVL", LADDW, ADIVL,
328 "FABSD", LFCONV, AFABSD,
329 "FABSF", LFCONV, AFABSF,
330 "FABSX", LFCONV, AFABSX,
331 "FADDD", LFADD, AFADDD,
332 "FADDF", LFADD, AFADDF,
333 "FADDX", LFADD, AFADDX,
347 "FBUGE", LBRA, AFBUGE,
349 "FBULE", LBRA, AFBULE,
350 "FCMPD", LFADD, AFCMPD,
351 "FCMPED", LFADD, AFCMPED,
352 "FCMPEF", LFADD, AFCMPEF,
353 "FCMPEX", LFADD, AFCMPEX,
354 "FCMPF", LFADD, AFCMPF,
355 "FCMPX", LFADD, AFCMPX,
356 "FDIVD", LFADD, AFDIVD,
357 "FDIVF", LFADD, AFDIVF,
358 "FDIVX", LFADD, AFDIVX,
359 "FMOVD", LFMOV, AFMOVD,
360 "FMOVDF", LFCONV, AFMOVDF,
361 "FMOVDW", LFCONV, AFMOVDW,
362 "FMOVDX", LFCONV, AFMOVDX,
363 "FMOVF", LFMOV, AFMOVF,
364 "FMOVFD", LFCONV, AFMOVFD,
365 "FMOVFW", LFCONV, AFMOVFW,
366 "FMOVFX", LFCONV, AFMOVFX,
367 "FMOVWD", LFCONV, AFMOVWD,
368 "FMOVWF", LFCONV, AFMOVWF,
369 "FMOVWX", LFCONV, AFMOVWX,
370 "FMOVX", LFCONV, AFMOVX,
371 "FMOVXD", LFCONV, AFMOVXD,
372 "FMOVXF", LFCONV, AFMOVXF,
373 "FMOVXW", LFCONV, AFMOVXW,
374 "FMULD", LFADD, AFMULD,
375 "FMULF", LFADD, AFMULF,
376 "FMULX", LFADD, AFMULX,
377 "FNEGD", LFCONV, AFNEGD,
378 "FNEGF", LFCONV, AFNEGF,
379 "FNEGX", LFCONV, AFNEGX,
380 "FSQRTD", LFCONV, AFSQRTD,
381 "FSQRTF", LFCONV, AFSQRTF,
382 "FSQRTX", LFCONV, AFSQRTX,
383 "FSUBD", LFADD, AFSUBD,
384 "FSUBF", LFADD, AFSUBF,
385 "FSUBX", LFADD, AFSUBX,
386 "GLOBL", LTEXT, AGLOBL,
387 "IFLUSH", LFLUSH, AIFLUSH,
388 "JMPL", LJMPL, AJMPL,
391 "MODL", LADDW, AMODL,
392 "MOVB", LMOVB, AMOVB,
393 "MOVBU", LMOVB, AMOVBU,
394 "MOVD", LMOVD, AMOVD,
395 "MOVH", LMOVB, AMOVH,
396 "MOVHU", LMOVB, AMOVHU,
397 "MOVW", LMOVW, AMOVW,
399 "MULSCC", LADDW, AMULSCC,
402 "ORCC", LADDW, AORCC,
404 "ORNCC", LADDW, AORNCC,
405 "RESTORE", LADDW, ARESTORE,
406 "RETT", LRETT, ARETT,
407 "RETURN", LRETRN, ARETURN,
408 "SAVE", LADDW, ASAVE,
413 "SUBCC", LADDW, ASUBCC,
414 "SUBX", LADDW, ASUBX,
415 "SUBXCC", LADDW, ASUBXCC,
416 "SWAP", LSWAP, ASWAP,
418 "TADDCC", LADDW, ATADDCC,
419 "TADDCCTV", LADDW, ATADDCCTV,
424 "TEXT", LTEXT, ATEXT,
430 "TLEU", LTRAP, ATLEU,
433 "TNEG", LTRAP, ATNEG,
434 "TPOS", LTRAP, ATPOS,
435 "TSUBCC", LADDW, ATSUBCC,
436 "TSUBCCTV", LADDW, ATSUBCCTV,
439 "UNIMP", LUNIMP, AUNIMP,
440 "WORD", LUNIMP, AWORD,
441 "XNOR", LADDW, AXNOR,
442 "XNORCC", LADDW, AXNORCC,
444 "XORCC", LADDW, AXORCC,
447 "NOSCHED", LSCHED, 0x80,
460 nullgen.type = D_NONE;
461 nullgen.name = D_NONE;
466 for(i=0; i<sizeof(nullgen.sval); i++)
474 for(i=0; i<NHASH; i++)
476 for(i=0; itab[i].name; i++) {
477 s = slookup(itab[i].name);
478 s->type = itab[i].type;
479 s->value = itab[i].value;
482 pathname = allocn(pathname, 0, 100);
483 if(mygetwd(pathname, 99) == 0) {
484 pathname = allocn(pathname, 100, 900);
485 if(mygetwd(pathname, 999) == 0)
486 strcpy(pathname, "/???");
502 outcode(AEND, &nullgen, NREG, &nullgen);
507 zname(char *n, int t, int s)
511 Bputc(&obuf, t); /* type */
512 Bputc(&obuf, s); /* sym */
528 Bputc(&obuf, a->type);
529 Bputc(&obuf, a->reg);
531 Bputc(&obuf, a->name);
534 print("unknown type %d\n", a->type);
557 for(i=0; i<NSNAME; i++) {
564 ieeedtod(&e, a->dval);
566 Bputc(&obuf, e.l>>8);
567 Bputc(&obuf, e.l>>16);
568 Bputc(&obuf, e.l>>24);
570 Bputc(&obuf, e.h>>8);
571 Bputc(&obuf, e.h>>16);
572 Bputc(&obuf, e.h>>24);
578 outcode(int a, Gen *g1, int reg, Gen *g2)
585 if(g1->xreg != NREG) {
586 if(reg != NREG || g2->xreg != NREG)
587 yyerror("bad addressing modes");
590 if(g2->xreg != NREG) {
592 yyerror("bad addressing modes");
600 if(sf < 0 || sf >= NSYM)
606 zname(s->name, t, sym);
620 if(st < 0 || st >= NSYM)
626 zname(s->name, t, sym);
639 Bputc(&obuf, reg|nosched);
640 Bputc(&obuf, lineno);
641 Bputc(&obuf, lineno>>8);
642 Bputc(&obuf, lineno>>16);
643 Bputc(&obuf, lineno>>24);
648 if(a != AGLOBL && a != ADATA)
662 for(h = hist; h != H; h = h->link) {
665 /* on windows skip drive specifier in pathname */
666 if(systemtype(Windows) && p && p[1] == ':'){
670 if(p && p[0] != c && h->offset == 0 && pathname){
671 /* on windows skip drive specifier in pathname */
672 if(systemtype(Windows) && pathname[1] == ':') {
676 } else if(pathname[0] == c){
686 n = 1; /* leading "/" */
687 *p = '/'; /* don't emit "\" on windows */
696 Bputc(&obuf, D_FILE); /* type */
697 Bputc(&obuf, 1); /* sym */
708 g.offset = h->offset;
710 Bputc(&obuf, AHISTORY);
712 Bputc(&obuf, h->line);
713 Bputc(&obuf, h->line>>8);
714 Bputc(&obuf, h->line>>16);
715 Bputc(&obuf, h->line>>24);
721 #include "../cc/lexbody"
722 #include "../cc/macbody"
723 #include "../cc/compat"