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++)
203 "RARG", LREG, REGARG,
204 "RARG0", LREG, REGARG,
277 "FPSR", LFCR, D_FPSR,
278 "FPCR", LFCR, D_FPCR,
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,
341 "ADCS", LTYPE1, AADCS,
342 "ADCSW", LTYPE1, AADCSW,
343 "ADCW", LTYPE1, AADCW,
345 "ADDS", LTYPE1, AADDS,
346 "ADDSW", LTYPE1, AADDSW,
347 "ADDW", LTYPE1, AADDW,
349 "ADRP", LTYPEV, AADRP,
351 "ANDS", LTYPE1, AANDS,
352 "ANDSW", LTYPE1, AANDSW,
353 "ANDW", LTYPE1, AANDW,
355 "ASRW", LTYPE1, AASRW,
358 "BFIW", LTYPEY, ABFIW,
360 "BFMW", LTYPEY, ABFMW,
361 "BFXIL", LTYPEY, ABFXIL,
362 "BFXILW", LTYPEY, ABFXILW,
364 "BICS", LTYPE1, ABICS,
365 "BICSW", LTYPE1, ABICSW,
366 "BICW", LTYPE1, ABICW,
368 "CBNZ", LTYPE8, ACBNZ,
369 "CBNZW", LTYPE8, ACBNZW,
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,
382 "CLSW", LTYPE2, ACLSW,
384 "CLZW", LTYPE2, ACLZW,
386 "CMNW", LTYPE7, ACMNW,
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,
412 "DCPS1", LTYPE6, ADCPS1,
413 "DCPS2", LTYPE6, ADCPS2,
414 "DCPS3", LTYPE6, ADCPS3,
416 "DRPS", LTYPE6, ADRPS,
419 "EONW", LTYPE1, AEONW,
421 "EORW", LTYPE1, AEORW,
422 "ERET", LTYPE0, AERET,
423 "EXTR", LTYPEP, AEXTR,
424 "EXTRW", LTYPEP, AEXTRW,
431 "LSLW", LTYPE1, ALSLW,
433 "LSRW", LTYPE1, ALSRW,
434 "MADD", LTYPEM, AMADD,
435 "MADDW", LTYPEM, AMADDW,
436 "MNEG", LTYPE1, AMNEG,
437 "MNEGW", LTYPE1, AMNEGW,
440 "MSUB", LTYPEM, AMSUB,
441 "MSUBW", LTYPEM, AMSUBW,
443 "MULW", LTYPE1, AMULW,
445 "MVNW", LTYPE1, AMVNW,
447 "NEGS", LTYPE1, ANEGS,
448 "NEGSW", LTYPE1, ANEGSW,
449 "NEGW", LTYPE1, ANEGW,
451 "NGCS", LTYPE2, ANGCS,
452 "NGCSW", LTYPE2, ANGCSW,
453 "NGCW", LTYPE2, ANGCW,
455 "ORNW", LTYPE1, AORNW,
457 "ORRW", LTYPE1, AORRW,
458 "PRFM", LTYPE1, APRFM,
459 "PRFUM", LTYPE1, APRFUM,
460 "RBIT", LTYPE2, ARBIT,
461 "RBITW", LTYPE2, ARBITW,
463 "REMW", LTYPE1, AREMW,
466 "REV16", LTYPE2, AREV16,
467 "REV16W", LTYPE2, AREV16W,
468 "REV32", LTYPE2, AREV32,
469 "REVW", LTYPE2, AREVW,
471 "RORW", LTYPE1, ARORW,
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,
485 "SEVL", LTYPE0, ASEVL,
486 "SMADDL", LTYPEM, ASMADDL,
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,
508 "SUBS", LTYPE1, ASUBS,
509 "SUBSW", LTYPE1, ASUBSW,
510 "SUBW", LTYPE1, ASUBW,
512 "SXTB", LTYPE2, ASXTB,
513 "SXTBW", LTYPE2, ASXTBW,
514 "SXTH", LTYPE2, ASXTH,
515 "SXTHW", LTYPE2, ASXTHW,
516 "SXTW", LTYPE2, ASXTW,
518 "SYSL", LTYPEO, ASYSL,
519 "TBNZ", LTYPET, ATBNZ,
521 "TLBI", LTYPEN, ATLBI,
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,
546 "YIELD", LTYPE0, AYIELD,
548 "LDXR", LTYPE3, ALDXR,
549 "LDXRB", LTYPE3, ALDXRB,
550 "LDXRH", LTYPE3, ALDXRH,
551 "LDXRW", LTYPE3, ALDXRW,
553 "LDAR", LTYPE3, ALDAR,
554 "LDARB", LTYPE3, ALDARB,
555 "LDARH", LTYPE3, ALDARH,
556 "LDARW", LTYPE3, ALDARW,
558 "LDXP", LTYPE3, ALDXP,
559 "LDXPW", LTYPE3, ALDXPW,
560 "LDAXP", LTYPE3, ALDAXP,
561 "LDAXPW", LTYPE3, ALDAXPW,
563 "LDAXR", LTYPE3, ALDAXR,
564 "LDAXRB", LTYPE3, ALDAXRB,
565 "LDAXRH", LTYPE3, ALDAXRH,
566 "LDAXRW", LTYPE3, ALDAXRW,
568 "MOVK", LMOVK, AMOVK,
569 "MOVKW", LMOVK, AMOVKW,
570 "MOVN", LMOVK, AMOVN,
571 "MOVNW", LMOVK, AMOVNW,
572 "MOVZ", LMOVK, AMOVZ,
573 "MOVZW", LMOVK, AMOVZW,
575 "MOVB", LTYPE3, AMOVB,
576 "MOVBU", LTYPE3, AMOVBU,
577 "MOVH", LTYPE3, AMOVH,
578 "MOVHU", LTYPE3, AMOVHU,
579 "MOVW", LTYPE3, AMOVW,
580 "MOVWU", LTYPE3, AMOVWU,
583 "MOVP", LTYPEJ, AMOVP,
584 "MOVPD", LTYPEJ, AMOVPD,
585 "MOVPQ", LTYPEJ, AMOVPQ,
586 "MOVPS", LTYPEJ, AMOVPS,
587 "MOVPSW", LTYPEJ, AMOVPSW,
588 "MOVPW", LTYPEJ, AMOVPW,
590 "MOVNP", LTYPEJ, AMOVNP,
591 "MOVNPW", LTYPEJ, AMOVNPW,
593 "FMOVD", LTYPE3, AFMOVD,
594 "FMOVS", LTYPE3, AFMOVS,
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,
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,
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,
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,
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,
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,
713 "BCASE", LTYPE5, ABCASE,
715 "TEXT", LTYPEB, ATEXT,
716 "GLOBL", LTYPEB, AGLOBL,
717 "DATA", LTYPEC, ADATA,
718 "CASE", LTYPED, ACASE,
720 "WORD", LTYPEH, AWORD,
721 "DWORD", LTYPEH, ADWORD,
723 "RETURN", LTYPEA, ARETURN,
735 nullgen.type = D_NONE;
736 nullgen.name = D_NONE;
741 for(i=0; i<sizeof(nullgen.sval); i++)
749 for(i=0; i<NHASH; i++)
751 for(i=0; itab[i].name; i++) {
752 s = slookup(itab[i].name);
754 yyerror("internal: duplicate %s", s->name);
755 s->type = itab[i].type;
756 s->value = itab[i].value;
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, "/???");
779 outcode(AEND, &nullgen, NREG, &nullgen);
784 zname(char *n, int t, int s)
788 Bputc(&obuf, ANAME>>8);
789 Bputc(&obuf, t); /* type */
790 Bputc(&obuf, s); /* sym */
806 if(a->type == D_CONST){
808 if((vlong)l != a->offset)
811 Bputc(&obuf, a->type);
812 Bputc(&obuf, a->reg);
814 Bputc(&obuf, a->name);
817 print("unknown type %d\n", a->type);
859 for(i=0; i<NSNAME; i++) {
866 ieeedtod(&e, a->dval);
868 Bputc(&obuf, e.l>>8);
869 Bputc(&obuf, e.l>>16);
870 Bputc(&obuf, e.l>>24);
872 Bputc(&obuf, e.h>>8);
873 Bputc(&obuf, e.h>>16);
874 Bputc(&obuf, e.h>>24);
889 if(sno < 0 || sno >= NSYM)
892 if(h[sno].type == t && h[sno].sym == s)
894 zname(s->name, t, sym);
906 outcode(int a, Gen *g1, int reg, Gen *g2)
910 if(a != AGLOBL && a != ADATA)
917 } while(sf != 0 && st == sf);
921 Bputc(&obuf, lineno);
922 Bputc(&obuf, lineno>>8);
923 Bputc(&obuf, lineno>>16);
924 Bputc(&obuf, lineno>>24);
930 outcode4(int a, Gen *g1, int reg, Gen *g2, Gen *g3)
932 int s1, s2, s3, flag;
934 if(a != AGLOBL && a != ADATA)
942 } while(s1 && (s2 && s1 == s2 || s3 && s1 == s3) || s2 && (s3 && s2 == s3));
944 if(g2->type != D_NONE)
945 flag = 0x40; /* flags extra operand */
948 Bputc(&obuf, reg | flag);
949 Bputc(&obuf, lineno);
950 Bputc(&obuf, lineno>>8);
951 Bputc(&obuf, lineno>>16);
952 Bputc(&obuf, lineno>>24);
969 for(h = hist; h != H; h = h->link) {
972 /* on windows skip drive specifier in pathname */
973 if(systemtype(Windows) && p && p[1] == ':'){
977 if(p && p[0] != c && h->offset == 0 && pathname){
978 /* on windows skip drive specifier in pathname */
979 if(systemtype(Windows) && pathname[1] == ':') {
983 } else if(pathname[0] == c){
993 n = 1; /* leading "/" */
994 *p = '/'; /* don't emit "\" on windows */
1002 Bputc(&obuf, ANAME);
1003 Bputc(&obuf, ANAME>>8);
1004 Bputc(&obuf, D_FILE); /* type */
1005 Bputc(&obuf, 1); /* sym */
1007 Bwrite(&obuf, p, n);
1016 g.offset = h->offset;
1018 Bputc(&obuf, AHISTORY);
1019 Bputc(&obuf, AHISTORY>>8);
1021 Bputc(&obuf, h->line);
1022 Bputc(&obuf, h->line>>8);
1023 Bputc(&obuf, h->line>>16);
1024 Bputc(&obuf, h->line>>24);
1030 #include "../cc/lexbody"
1031 #include "../cc/macbody"
1032 #include "../cc/compat"