📄 span.c
字号:
goto aconsize; case D_PARAM: instoffset = autosize + a->offset + 4L; aconsize: t = immrot(instoffset); if(t) return C_RACON; return C_LACON; } return C_GOK; case D_BRANCH: return C_SBRA; } return C_GOK;}Optab*oplook(Prog *p){ int a1, a2, a3, r; char *c1, *c3; Optab *o, *e; a1 = p->optab; if(a1) return optab+(a1-1); a1 = p->from.class; if(a1 == 0) { a1 = aclass(&p->from) + 1; p->from.class = a1; } a1--; a3 = p->to.class; if(a3 == 0) { a3 = aclass(&p->to) + 1; p->to.class = a3; } a3--; a2 = C_NONE; if(p->reg != NREG) a2 = C_REG; r = p->as; o = oprange[r].start; if(o == 0) { a1 = opcross[repop[r]][a1][a2][a3]; if(a1) { p->optab = a1+1; return optab+a1; } o = oprange[r].stop; /* just generate an error */ } if(0) { print("oplook %A %d %d %d\n", (int)p->as, a1, a2, a3); print(" %d %d\n", p->from.type, p->to.type); } e = oprange[r].stop; c1 = xcmp[a1]; c3 = xcmp[a3]; for(; o<e; o++) if(o->a2 == a2) if(c1[o->a1]) if(c3[o->a3]) { p->optab = (o-optab)+1; return o; } diag("illegal combination %A %d %d %d", p->as, a1, a2, a3); prasm(p); if(o == 0) o = optab; return o;}intcmp(int a, int b){ if(a == b) return 1; switch(a) { case C_LCON: if(b == C_RCON || b == C_NCON) return 1; break; case C_LACON: if(b == C_RACON) return 1; break; case C_LECON: if(b == C_RECON) return 1; break; case C_HFEXT: return b == C_HEXT || b == C_FEXT; case C_FEXT: case C_HEXT: return b == C_HFEXT; case C_SEXT: return cmp(C_HFEXT, b); case C_LEXT: return cmp(C_SEXT, b); case C_HFAUTO: return b == C_HAUTO || b == C_FAUTO; case C_FAUTO: case C_HAUTO: return b == C_HFAUTO; case C_SAUTO: return cmp(C_HFAUTO, b); case C_LAUTO: return cmp(C_SAUTO, b); case C_HFOREG: return b == C_HOREG || b == C_FOREG; case C_FOREG: case C_HOREG: return b == C_HFOREG; case C_SROREG: return cmp(C_SOREG, b) || cmp(C_ROREG, b); case C_SOREG: case C_ROREG: return b == C_SROREG || cmp(C_HFOREG, b); case C_LOREG: return cmp(C_SROREG, b); case C_LBRA: if(b == C_SBRA) return 1; break; } return 0;}intocmp(const void *a1, const void *a2){ Optab *p1, *p2; int n; p1 = (Optab*)a1; p2 = (Optab*)a2; n = p1->as - p2->as; if(n) return n; n = (p2->flag&V4) - (p1->flag&V4); /* architecture version */ if(n) return n; n = p1->a1 - p2->a1; if(n) return n; n = p1->a2 - p2->a2; if(n) return n; n = p1->a3 - p2->a3; if(n) return n; return 0;}voidbuildop(void){ int i, n, r; armv4 = !debug['h']; for(i=0; i<C_GOK; i++) for(n=0; n<C_GOK; n++) xcmp[i][n] = cmp(n, i); for(n=0; optab[n].as != AXXX; n++) if((optab[n].flag & V4) && !armv4) { optab[n].as = AXXX; break; } qsort(optab, n, sizeof(optab[0]), ocmp); for(i=0; i<n; i++) { r = optab[i].as; oprange[r].start = optab+i; while(optab[i].as == r) i++; oprange[r].stop = optab+i; i--; switch(r) { default: diag("unknown op in build: %A", r); errorexit(); case AADD: oprange[AAND] = oprange[r]; oprange[AEOR] = oprange[r]; oprange[ASUB] = oprange[r]; oprange[ARSB] = oprange[r]; oprange[AADC] = oprange[r]; oprange[ASBC] = oprange[r]; oprange[ARSC] = oprange[r]; oprange[AORR] = oprange[r]; oprange[ABIC] = oprange[r]; break; case ACMP: oprange[ATST] = oprange[r]; oprange[ATEQ] = oprange[r]; oprange[ACMN] = oprange[r]; break; case AMVN: break; case ABEQ: oprange[ABNE] = oprange[r]; oprange[ABCS] = oprange[r]; oprange[ABHS] = oprange[r]; oprange[ABCC] = oprange[r]; oprange[ABLO] = oprange[r]; oprange[ABMI] = oprange[r]; oprange[ABPL] = oprange[r]; oprange[ABVS] = oprange[r]; oprange[ABVC] = oprange[r]; oprange[ABHI] = oprange[r]; oprange[ABLS] = oprange[r]; oprange[ABGE] = oprange[r]; oprange[ABLT] = oprange[r]; oprange[ABGT] = oprange[r]; oprange[ABLE] = oprange[r]; break; case ASLL: oprange[ASRL] = oprange[r]; oprange[ASRA] = oprange[r]; break; case AMUL: oprange[AMULU] = oprange[r]; break; case ADIV: oprange[AMOD] = oprange[r]; oprange[AMODU] = oprange[r]; oprange[ADIVU] = oprange[r]; break; case AMOVW: case AMOVB: case AMOVBU: case AMOVH: case AMOVHU: break; case ASWPW: oprange[ASWPBU] = oprange[r]; break; case AB: case ABL: case ABX: case ABXRET: case ASWI: case AWORD: case AMOVM: case ARFE: case ATEXT: case ACASE: case ABCASE: break; case AADDF: oprange[AADDD] = oprange[r]; oprange[ASUBF] = oprange[r]; oprange[ASUBD] = oprange[r]; oprange[AMULF] = oprange[r]; oprange[AMULD] = oprange[r]; oprange[ADIVF] = oprange[r]; oprange[ADIVD] = oprange[r]; oprange[AMOVFD] = oprange[r]; oprange[AMOVDF] = oprange[r]; break; case ACMPF: oprange[ACMPD] = oprange[r]; break; case AMOVF: oprange[AMOVD] = oprange[r]; break; case AMOVFW: oprange[AMOVWF] = oprange[r]; oprange[AMOVWD] = oprange[r]; oprange[AMOVDW] = oprange[r]; break; case AMULL: oprange[AMULA] = oprange[r]; oprange[AMULAL] = oprange[r]; oprange[AMULLU] = oprange[r]; oprange[AMULALU] = oprange[r]; break; } }}/*voidbuildrep(int x, int as){ Opcross *p; Optab *e, *s, *o; int a1, a2, a3, n; if(C_NONE != 0 || C_REG != 1 || C_GOK >= 32 || x >= nelem(opcross)) { diag("assumptions fail in buildrep"); errorexit(); } repop[as] = x; p = (opcross + x); s = oprange[as].start; e = oprange[as].stop; for(o=e-1; o>=s; o--) { n = o-optab; for(a2=0; a2<2; a2++) { if(a2) { if(o->a2 == C_NONE) continue; } else if(o->a2 != C_NONE) continue; for(a1=0; a1<32; a1++) { if(!xcmp[a1][o->a1]) continue; for(a3=0; a3<32; a3++) if(xcmp[a3][o->a3]) (*p)[a1][a2][a3] = n; } } } oprange[as].start = 0;}*/enum{ ABSD = 0, ABSU = 1, RELD = 2, RELU = 3,};int modemap[4] = { 0, 1, -1, 2, };typedef struct Reloc Reloc;struct Reloc{ int n; int t; uchar *m; ulong *a;};Reloc rels;static voidgrow(Reloc *r){ int t; uchar *m, *nm; ulong *a, *na; t = r->t; r->t += 64; m = r->m; a = r->a; r->m = nm = malloc(r->t*sizeof(uchar)); r->a = na = malloc(r->t*sizeof(ulong)); memmove(nm, m, t*sizeof(uchar)); memmove(na, a, t*sizeof(ulong)); free(m); free(a);}voiddynreloc(Sym *s, long v, int abs){ int i, k, n; uchar *m; ulong *a; Reloc *r; if(v&3) diag("bad relocation address"); v >>= 2; if(s != S && s->type == SUNDEF) k = abs ? ABSU : RELU; else k = abs ? ABSD : RELD; /* Bprint(&bso, "R %s a=%ld(%lx) %d\n", s->name, a, a, k); */ k = modemap[k]; r = &rels; n = r->n; if(n >= r->t) grow(r); m = r->m; a = r->a; for(i = n; i > 0; i--){ if(v < a[i-1]){ /* happens occasionally for data */ m[i] = m[i-1]; a[i] = a[i-1]; } else break; } m[i] = k; a[i] = v; r->n++;}static intsput(char *s){ char *p; p = s; while(*s) cput(*s++); cput(0); return s-p+1;}voidasmdyn(){ int i, n, t, c; Sym *s; ulong la, ra, *a; vlong off; uchar *m; Reloc *r; cflush(); off = seek(cout, 0, 1); lput(0); t = 0; lput(imports); t += 4; for(i = 0; i < NHASH; i++) for(s = hash[i]; s != S; s = s->link) if(s->type == SUNDEF){ lput(s->sig); t += 4; t += sput(s->name); } la = 0; r = &rels; n = r->n; m = r->m; a = r->a; lput(n); t += 4; for(i = 0; i < n; i++){ ra = *a-la; if(*a < la) diag("bad relocation order"); if(ra < 256) c = 0; else if(ra < 65536) c = 1; else c = 2; cput((c<<6)|*m++); t++; if(c == 0){ cput(ra); t++; } else if(c == 1){ wput(ra); t += 2; } else{ lput(ra); t += 4; } la = *a++; } cflush(); seek(cout, off, 0); lput(t); if(debug['v']){ Bprint(&bso, "import table entries = %d\n", imports); Bprint(&bso, "export table entries = %d\n", exports); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -