14 Bprint(&bso, "%5.2f span\n", cputime());
20 for(p = firstp; p != P; p = p->link) {
27 autosize = p->to.offset + 4;
28 if(p->from3.type == D_CONST) {
29 if(p->from3.offset & 3)
30 diag("illegal origin\n%P", p);
31 if(c > p->from3.offset)
32 diag("passed origin (#%lux)\n%P", c, p);
38 p->from.sym->value = c;
39 /* need passes to resolve branches? */
40 if(c-otxt >= (1L<<15))
46 diag("zero-width instruction\n%P", p);
53 * if any procedure is large enough to
54 * generate a large SBRA branch, then
55 * generate extra passes putting branches
56 * around jmps to fix. this is rare.
60 Bprint(&bso, "%5.2f span1\n", cputime());
63 for(p = firstp; p != P; p = p->link) {
66 if((o->type == 16 || o->type == 17) && p->cond) {
67 otxt = p->cond->pc - c;
68 if(otxt < -(1L<<16)+10 || otxt >= (1L<<15)-10) {
73 q->to.type = D_BRANCH;
80 q->to.type = D_BRANCH;
81 q->cond = q->link->link;
91 autosize = p->to.offset + 4;
93 p->from.sym->value = c;
97 diag("zero-width instruction\n%P", p);
106 setext = lookup("etext", 0);
109 textsize = c - INITTEXT;
112 INITDAT = rnd(c, INITRND);
114 Bprint(&bso, "tsize = %lux\n", textsize);
119 xdefine(char *p, int t, long v)
124 if(s->type == 0 || s->type == SXREF) {
159 if(a->offset == D_LR)
161 if(a->offset == D_XER)
163 if(a->offset == D_CTR)
186 if(t == 0 || t == SXREF) {
187 diag("undefined external: %s in %s",
188 a->sym->name, TNAME);
189 a->sym->type = SDATA;
192 instoffset = a->sym->value + a->offset;
193 switch(a->sym->type){
200 instoffset += INITDAT;
204 instoffset = a->sym->value + a->offset - BIG;
205 if(instoffset >= -BIG && instoffset < BIG)
209 instoffset = autosize + a->offset;
210 if(instoffset >= -BIG && instoffset < BIG)
215 instoffset = autosize + a->offset + 4L;
216 if(instoffset >= -BIG && instoffset < BIG)
220 instoffset = a->offset;
223 if(instoffset >= -BIG && instoffset < BIG)
230 instoffset = a->offset & 31L;
231 if(a->name == D_NONE)
239 instoffset = a->offset;
241 if(instoffset >= 0) {
242 if(r0iszero && instoffset == 0)
244 if(instoffset <= 0x7fff)
246 if(instoffset <= 0xffff)
248 if((instoffset & 0xffff) == 0)
252 if(instoffset >= -0x8000)
254 if((instoffset & 0xffff) == 0)
264 if(t == 0 || t == SXREF) {
265 diag("undefined external: %s in %s",
269 if(s->type == STEXT || s->type == SLEAF || s->type == SUNDEF) {
270 instoffset = s->value + a->offset;
273 if(s->type == SCONST) {
274 instoffset = s->value + a->offset;
280 instoffset = s->value + a->offset - BIG;
281 if(instoffset >= -BIG && instoffset < BIG && instoffset != 0)
284 instoffset = s->value + a->offset + INITDAT;
287 /* not sure why this barfs */
292 if(instoffset >= -0x8000 && instoffset <= 0xffff)
294 if((instoffset & 0xffff) == 0)
300 instoffset = autosize + a->offset;
301 if(instoffset >= -BIG && instoffset < BIG)
306 instoffset = autosize + a->offset + 4L;
307 if(instoffset >= -BIG && instoffset < BIG)
322 int a1, a2, a3, a4, r;
331 a1 = aclass(&p->from) + 1;
337 a3 = aclass(&p->from3) + 1;
343 a4 = aclass(&p->to) + 1;
351 o = oprange[r].start;
353 o = oprange[r].stop; /* just generate an error */
363 p->optab = (o-optab)+1;
366 diag("illegal combination %A %R %R %R %R",
367 p->as, a1, a2, a3, a4);
383 if(b == C_ZCON || b == C_SCON || b == C_UCON || b == C_ADDCON || b == C_ANDCON)
387 if(b == C_ZCON || b == C_SCON)
391 if(b == C_ZCON || b == C_SCON)
395 if(b == C_LR || b == C_XER || b == C_CTR)
423 if(r0iszero && b == C_ZCON)
427 if(b == C_ZOREG || b == C_SOREG)
442 ocmp(void *a1, void *a2)
472 for(i=0; i<C_NCLASS; i++)
473 for(n=0; n<C_NCLASS; n++)
474 xcmp[i][n] = cmp(n, i);
475 for(n=0; optab[n].as != AXXX; n++)
477 qsort(optab, n, sizeof(optab[0]), ocmp);
480 oprange[r].start = optab+i;
481 while(optab[i].as == r)
483 oprange[r].stop = optab+i;
489 diag("unknown op in build: %A", r);
491 case ADCBF: /* unary indexed: op (b+a); op (b) */
492 oprange[ADCBI] = oprange[r];
493 oprange[ADCBST] = oprange[r];
494 oprange[ADCBT] = oprange[r];
495 oprange[ADCBTST] = oprange[r];
496 oprange[ADCBZ] = oprange[r];
497 oprange[AICBI] = oprange[r];
499 case AECOWX: /* indexed store: op s,(b+a); op s,(b) */
500 oprange[ASTWCCC] = oprange[r];
502 case AREM: /* macro */
503 oprange[AREMCC] = oprange[r];
504 oprange[AREMV] = oprange[r];
505 oprange[AREMVCC] = oprange[r];
506 oprange[AREMU] = oprange[r];
507 oprange[AREMUCC] = oprange[r];
508 oprange[AREMUV] = oprange[r];
509 oprange[AREMUVCC] = oprange[r];
511 case ADIVW: /* op Rb[,Ra],Rd */
512 oprange[AMULHW] = oprange[r];
513 oprange[AMULHWCC] = oprange[r];
514 oprange[AMULHWU] = oprange[r];
515 oprange[AMULHWUCC] = oprange[r];
516 oprange[AMULLWCC] = oprange[r];
517 oprange[AMULLWVCC] = oprange[r];
518 oprange[AMULLWV] = oprange[r];
519 oprange[ADIVWCC] = oprange[r];
520 oprange[ADIVWV] = oprange[r];
521 oprange[ADIVWVCC] = oprange[r];
522 oprange[ADIVWU] = oprange[r];
523 oprange[ADIVWUCC] = oprange[r];
524 oprange[ADIVWUV] = oprange[r];
525 oprange[ADIVWUVCC] = oprange[r];
526 oprange[AADDCC] = oprange[r];
527 oprange[AADDCV] = oprange[r];
528 oprange[AADDCVCC] = oprange[r];
529 oprange[AADDV] = oprange[r];
530 oprange[AADDVCC] = oprange[r];
531 oprange[AADDE] = oprange[r];
532 oprange[AADDECC] = oprange[r];
533 oprange[AADDEV] = oprange[r];
534 oprange[AADDEVCC] = oprange[r];
535 oprange[ACRAND] = oprange[r];
536 oprange[ACRANDN] = oprange[r];
537 oprange[ACREQV] = oprange[r];
538 oprange[ACRNAND] = oprange[r];
539 oprange[ACRNOR] = oprange[r];
540 oprange[ACROR] = oprange[r];
541 oprange[ACRORN] = oprange[r];
542 oprange[ACRXOR] = oprange[r];
543 oprange[AMULCHW] = oprange[r];
544 oprange[AMULCHWCC] = oprange[r];
545 oprange[AMULCHWU] = oprange[r];
546 oprange[AMULCHWUCC] = oprange[r];
547 oprange[AMULHHW] = oprange[r];
548 oprange[AMULHHWCC] = oprange[r];
549 oprange[AMULHHWU] = oprange[r];
550 oprange[AMULHHWUCC] = oprange[r];
551 oprange[AMULLHW] = oprange[r];
552 oprange[AMULLHWCC] = oprange[r];
553 oprange[AMULLHWU] = oprange[r];
554 oprange[AMULLHWUCC] = oprange[r];
556 case AMACCHW: /* strictly 3 registers */
557 oprange[AMACCHWCC] = oprange[r];
558 oprange[AMACCHWS] = oprange[r];
559 oprange[AMACCHWSCC] = oprange[r];
560 oprange[AMACCHWSU] = oprange[r];
561 oprange[AMACCHWSUCC] = oprange[r];
562 oprange[AMACCHWSUV] = oprange[r];
563 oprange[AMACCHWSUVCC] = oprange[r];
564 oprange[AMACCHWSV] = oprange[r];
565 oprange[AMACCHWSVCC] = oprange[r];
566 oprange[AMACCHWU] = oprange[r];
567 oprange[AMACCHWUCC] = oprange[r];
568 oprange[AMACCHWUV] = oprange[r];
569 oprange[AMACCHWUVCC] = oprange[r];
570 oprange[AMACCHWV] = oprange[r];
571 oprange[AMACCHWVCC] = oprange[r];
572 oprange[AMACHHW] = oprange[r];
573 oprange[AMACHHWCC] = oprange[r];
574 oprange[AMACHHWS] = oprange[r];
575 oprange[AMACHHWSCC] = oprange[r];
576 oprange[AMACHHWSU] = oprange[r];
577 oprange[AMACHHWSUCC] = oprange[r];
578 oprange[AMACHHWSUV] = oprange[r];
579 oprange[AMACHHWSUVCC] = oprange[r];
580 oprange[AMACHHWSV] = oprange[r];
581 oprange[AMACHHWSVCC] = oprange[r];
582 oprange[AMACHHWU] = oprange[r];
583 oprange[AMACHHWUCC] = oprange[r];
584 oprange[AMACHHWUV] = oprange[r];
585 oprange[AMACHHWUVCC] = oprange[r];
586 oprange[AMACHHWV] = oprange[r];
587 oprange[AMACHHWVCC] = oprange[r];
588 oprange[AMACLHW] = oprange[r];
589 oprange[AMACLHWCC] = oprange[r];
590 oprange[AMACLHWS] = oprange[r];
591 oprange[AMACLHWSCC] = oprange[r];
592 oprange[AMACLHWSU] = oprange[r];
593 oprange[AMACLHWSUCC] = oprange[r];
594 oprange[AMACLHWSUV] = oprange[r];
595 oprange[AMACLHWSUVCC] = oprange[r];
596 oprange[AMACLHWSV] = oprange[r];
597 oprange[AMACLHWSVCC] = oprange[r];
598 oprange[AMACLHWU] = oprange[r];
599 oprange[AMACLHWUCC] = oprange[r];
600 oprange[AMACLHWUV] = oprange[r];
601 oprange[AMACLHWUVCC] = oprange[r];
602 oprange[AMACLHWV] = oprange[r];
603 oprange[AMACLHWVCC] = oprange[r];
604 oprange[ANMACCHW] = oprange[r];
605 oprange[ANMACCHWCC] = oprange[r];
606 oprange[ANMACCHWS] = oprange[r];
607 oprange[ANMACCHWSCC] = oprange[r];
608 oprange[ANMACCHWSV] = oprange[r];
609 oprange[ANMACCHWSVCC] = oprange[r];
610 oprange[ANMACCHWV] = oprange[r];
611 oprange[ANMACCHWVCC] = oprange[r];
612 oprange[ANMACHHW] = oprange[r];
613 oprange[ANMACHHWCC] = oprange[r];
614 oprange[ANMACHHWS] = oprange[r];
615 oprange[ANMACHHWSCC] = oprange[r];
616 oprange[ANMACHHWSV] = oprange[r];
617 oprange[ANMACHHWSVCC] = oprange[r];
618 oprange[ANMACHHWV] = oprange[r];
619 oprange[ANMACHHWVCC] = oprange[r];
620 oprange[ANMACLHW] = oprange[r];
621 oprange[ANMACLHWCC] = oprange[r];
622 oprange[ANMACLHWS] = oprange[r];
623 oprange[ANMACLHWSCC] = oprange[r];
624 oprange[ANMACLHWSV] = oprange[r];
625 oprange[ANMACLHWSVCC] = oprange[r];
626 oprange[ANMACLHWV] = oprange[r];
627 oprange[ANMACLHWVCC] = oprange[r];
629 case AMOVBZ: /* lbz, stz, rlwm(r/r), lhz, lha, stz, and x variants */
630 oprange[AMOVH] = oprange[r];
631 oprange[AMOVHZ] = oprange[r];
633 case AMOVBZU: /* lbz[x]u, stb[x]u, lhz[x]u, lha[x]u, sth[u]x */
634 oprange[AMOVHU] = oprange[r];
635 oprange[AMOVHZU] = oprange[r];
636 oprange[AMOVWU] = oprange[r];
637 oprange[AMOVMW] = oprange[r];
639 case AAND: /* logical op Rb,Rs,Ra; no literal */
640 oprange[AANDN] = oprange[r];
641 oprange[AANDNCC] = oprange[r];
642 oprange[AEQV] = oprange[r];
643 oprange[AEQVCC] = oprange[r];
644 oprange[ANAND] = oprange[r];
645 oprange[ANANDCC] = oprange[r];
646 oprange[ANOR] = oprange[r];
647 oprange[ANORCC] = oprange[r];
648 oprange[AORCC] = oprange[r];
649 oprange[AORN] = oprange[r];
650 oprange[AORNCC] = oprange[r];
651 oprange[AXORCC] = oprange[r];
653 case AADDME: /* op Ra, Rd */
654 oprange[AADDMECC] = oprange[r];
655 oprange[AADDMEV] = oprange[r];
656 oprange[AADDMEVCC] = oprange[r];
657 oprange[AADDZE] = oprange[r];
658 oprange[AADDZECC] = oprange[r];
659 oprange[AADDZEV] = oprange[r];
660 oprange[AADDZEVCC] = oprange[r];
661 oprange[ASUBME] = oprange[r];
662 oprange[ASUBMECC] = oprange[r];
663 oprange[ASUBMEV] = oprange[r];
664 oprange[ASUBMEVCC] = oprange[r];
665 oprange[ASUBZE] = oprange[r];
666 oprange[ASUBZECC] = oprange[r];
667 oprange[ASUBZEV] = oprange[r];
668 oprange[ASUBZEVCC] = oprange[r];
671 oprange[AADDCCC] = oprange[r];
674 oprange[ABGE] = oprange[r];
675 oprange[ABGT] = oprange[r];
676 oprange[ABLE] = oprange[r];
677 oprange[ABLT] = oprange[r];
678 oprange[ABNE] = oprange[r];
679 oprange[ABVC] = oprange[r];
680 oprange[ABVS] = oprange[r];
683 oprange[ABL] = oprange[r];
686 oprange[ABCL] = oprange[r];
688 case AEXTSB: /* op Rs, Ra */
689 oprange[AEXTSBCC] = oprange[r];
690 oprange[AEXTSH] = oprange[r];
691 oprange[AEXTSHCC] = oprange[r];
692 oprange[ACNTLZW] = oprange[r];
693 oprange[ACNTLZWCC] = oprange[r];
695 case AFABS: /* fop [s,]d */
696 oprange[AFABSCC] = oprange[r];
697 oprange[AFNABS] = oprange[r];
698 oprange[AFNABSCC] = oprange[r];
699 oprange[AFNEG] = oprange[r];
700 oprange[AFNEGCC] = oprange[r];
701 oprange[AFRSP] = oprange[r];
702 oprange[AFRSPCC] = oprange[r];
703 oprange[AFCTIW] = oprange[r];
704 oprange[AFCTIWCC] = oprange[r];
705 oprange[AFCTIWZ] = oprange[r];
706 oprange[AFCTIWZCC] = oprange[r];
707 oprange[AFRES] = oprange[r];
708 oprange[AFRESCC] = oprange[r];
709 oprange[AFRSQRTE] = oprange[r];
710 oprange[AFRSQRTECC] = oprange[r];
711 oprange[AFSQRT] = oprange[r];
712 oprange[AFSQRTCC] = oprange[r];
713 oprange[AFSQRTS] = oprange[r];
714 oprange[AFSQRTSCC] = oprange[r];
715 oprange[AFPRE] = oprange[r];
716 oprange[AFPRSQRTE] = oprange[r];
717 oprange[AFPABS] = oprange[r];
718 oprange[AFPNEG] = oprange[r];
719 oprange[AFPRSP] = oprange[r];
720 oprange[AFPNABS] = oprange[r];
721 oprange[AFSABS] = oprange[r];
722 oprange[AFSNEG] = oprange[r];
723 oprange[AFSNABS] = oprange[r];
724 oprange[AFPCTIW] = oprange[r];
725 oprange[AFPCTIWZ] = oprange[r];
728 oprange[AFADDS] = oprange[r];
729 oprange[AFADDCC] = oprange[r];
730 oprange[AFADDSCC] = oprange[r];
731 oprange[AFDIV] = oprange[r];
732 oprange[AFDIVS] = oprange[r];
733 oprange[AFDIVCC] = oprange[r];
734 oprange[AFDIVSCC] = oprange[r];
735 oprange[AFSUB] = oprange[r];
736 oprange[AFSUBS] = oprange[r];
737 oprange[AFSUBCC] = oprange[r];
738 oprange[AFSUBSCC] = oprange[r];
739 oprange[AFPADD] = oprange[r];
740 oprange[AFPSUB] = oprange[r];
743 oprange[AFMADDCC] = oprange[r];
744 oprange[AFMADDS] = oprange[r];
745 oprange[AFMADDSCC] = oprange[r];
746 oprange[AFMSUB] = oprange[r];
747 oprange[AFMSUBCC] = oprange[r];
748 oprange[AFMSUBS] = oprange[r];
749 oprange[AFMSUBSCC] = oprange[r];
750 oprange[AFNMADD] = oprange[r];
751 oprange[AFNMADDCC] = oprange[r];
752 oprange[AFNMADDS] = oprange[r];
753 oprange[AFNMADDSCC] = oprange[r];
754 oprange[AFNMSUB] = oprange[r];
755 oprange[AFNMSUBCC] = oprange[r];
756 oprange[AFNMSUBS] = oprange[r];
757 oprange[AFNMSUBSCC] = oprange[r];
758 oprange[AFSEL] = oprange[r];
759 oprange[AFSELCC] = oprange[r];
760 oprange[AFPSEL] = oprange[r];
761 oprange[AFPMADD] = oprange[r];
762 oprange[AFXMADD] = oprange[r];
763 oprange[AFXCPMADD] = oprange[r];
764 oprange[AFXCSMADD] = oprange[r];
765 oprange[AFPNMADD] = oprange[r];
766 oprange[AFXNMADD] = oprange[r];
767 oprange[AFXCPNMADD] = oprange[r];
768 oprange[AFXCSNMADD] = oprange[r];
769 oprange[AFPMSUB] = oprange[r];
770 oprange[AFXMSUB] = oprange[r];
771 oprange[AFXCPMSUB] = oprange[r];
772 oprange[AFXCSMSUB] = oprange[r];
773 oprange[AFPNMSUB] = oprange[r];
774 oprange[AFXNMSUB] = oprange[r];
775 oprange[AFXCPNMSUB] = oprange[r];
776 oprange[AFXCSNMSUB] = oprange[r];
777 oprange[AFXCPNPMA] = oprange[r];
778 oprange[AFXCSNPMA] = oprange[r];
779 oprange[AFXCPNSMA] = oprange[r];
780 oprange[AFXCSNSMA] = oprange[r];
781 oprange[AFXCXNPMA] = oprange[r];
782 oprange[AFXCXNSMA] = oprange[r];
783 oprange[AFXCXMA] = oprange[r];
784 oprange[AFXCXNMS] = oprange[r];
787 oprange[AFMULS] = oprange[r];
788 oprange[AFMULCC] = oprange[r];
789 oprange[AFMULSCC] = oprange[r];
790 oprange[AFPMUL] = oprange[r];
791 oprange[AFXMUL] = oprange[r];
792 oprange[AFXPMUL] = oprange[r];
793 oprange[AFXSMUL] = oprange[r];
796 oprange[AFCMPU] = oprange[r];
799 oprange[AMTFSB0CC] = oprange[r];
800 oprange[AMTFSB1] = oprange[r];
801 oprange[AMTFSB1CC] = oprange[r];
803 case ANEG: /* op [Ra,] Rd */
804 oprange[ANEGCC] = oprange[r];
805 oprange[ANEGV] = oprange[r];
806 oprange[ANEGVCC] = oprange[r];
808 case AOR: /* or/xor Rb,Rs,Ra; ori/xori $uimm,Rs,Ra; oris/xoris $uimm,Rs,Ra */
809 oprange[AXOR] = oprange[r];
812 oprange[ASLWCC] = oprange[r];
813 oprange[ASRW] = oprange[r];
814 oprange[ASRWCC] = oprange[r];
816 case ASRAW: /* sraw Rb,Rs,Ra; srawi sh,Rs,Ra */
817 oprange[ASRAWCC] = oprange[r];
819 case ASUB: /* SUB Ra,Rb,Rd => subf Rd,ra,rb */
820 oprange[ASUB] = oprange[r];
821 oprange[ASUBCC] = oprange[r];
822 oprange[ASUBV] = oprange[r];
823 oprange[ASUBVCC] = oprange[r];
824 oprange[ASUBCCC] = oprange[r];
825 oprange[ASUBCV] = oprange[r];
826 oprange[ASUBCVCC] = oprange[r];
827 oprange[ASUBE] = oprange[r];
828 oprange[ASUBECC] = oprange[r];
829 oprange[ASUBEV] = oprange[r];
830 oprange[ASUBEVCC] = oprange[r];
833 oprange[AISYNC] = oprange[r];
836 oprange[ARLWMICC] = oprange[r];
837 oprange[ARLWNM] = oprange[r];
838 oprange[ARLWNMCC] = oprange[r];
841 oprange[AFMOVDCC] = oprange[r];
842 oprange[AFMOVDU] = oprange[r];
843 oprange[AFMOVS] = oprange[r];
844 oprange[AFMOVSU] = oprange[r];
847 oprange[ALWAR] = oprange[r];
849 case ASYSCALL: /* just the op; flow of control */
850 oprange[ARFI] = oprange[r];
851 oprange[ARFCI] = oprange[r];
854 oprange[AMOVWBR] = oprange[r];
856 case AFSMOVS: /* indexed floating loads and stores (fp2) */
857 oprange[AFSMOVSU] = oprange[r];
858 oprange[AFSMOVDU] = oprange[r];
859 oprange[AFXMOVS] = oprange[r];
860 oprange[AFXMOVSU] = oprange[r];
861 oprange[AFXMOVDU] = oprange[r];
862 oprange[AFPMOVS] = oprange[r];
863 oprange[AFPMOVSU] = oprange[r];
864 oprange[AFPMOVDU] = oprange[r];
865 oprange[AFPMOVIW] = oprange[r];
867 case AFPMOVD: /* indexed load/store and moves (fp2) */
868 oprange[AFSMOVD] = oprange[r];
869 oprange[AFXMOVD] = oprange[r];
871 case AFMOVSPD: /* move between fp reg sets (fp2) */
872 oprange[AFMOVPSD] = oprange[r];
875 case AANDCC: /* and. Rb,Rs,Ra; andi. $uimm,Rs,Ra; andis. $uimm,Rs,Ra */
880 case AMOVB: /* macro: move byte with sign extension */
881 case AMOVBU: /* macro: move byte with sign extension & update */
884 case AMULLW: /* op $s[,r2],r3; op r1[,r2],r3; no cc/v */
885 case ASUBC: /* op r1,$s,r3; op r1[,r2],r3 */
904 int modemap[8] = { 0, 1, -1, 2, 3, 4, 5, 6};
906 typedef struct Reloc Reloc;
929 r->m = nm = malloc(r->t*sizeof(uchar));
930 r->a = na = malloc(r->t*sizeof(ulong));
931 memmove(nm, m, t*sizeof(uchar));
932 memmove(na, a, t*sizeof(ulong));
938 dynreloc(Sym *s, long v, int abs, int split, int sext)
946 diag("bad relocation address");
948 if(s->type == SUNDEF)
949 k = abs ? ABSU : RELU;
951 k = abs ? ABSD : RELD;
956 /* Bprint(&bso, "R %s a=%ld(%lx) %d\n", s->name, a, a, k); */
964 for(i = n; i > 0; i--){
965 if(v < a[i-1]){ /* happens occasionally for data */
1000 off = seek(cout, 0, 1);
1005 for(i = 0; i < NHASH; i++)
1006 for(s = hash[i]; s != S; s = s->link)
1007 if(s->type == SUNDEF){
1020 for(i = 0; i < n; i++){
1023 diag("bad relocation order");
1052 Bprint(&bso, "import table entries = %d\n", imports);
1053 Bprint(&bso, "export table entries = %d\n", exports);