📄 span.c
字号:
oprange[AADDCV] = oprange[r]; oprange[AADDCVCC] = oprange[r]; oprange[AADDV] = oprange[r]; oprange[AADDVCC] = oprange[r]; oprange[AADDE] = oprange[r]; oprange[AADDECC] = oprange[r]; oprange[AADDEV] = oprange[r]; oprange[AADDEVCC] = oprange[r]; oprange[ACRAND] = oprange[r]; oprange[ACRANDN] = oprange[r]; oprange[ACREQV] = oprange[r]; oprange[ACRNAND] = oprange[r]; oprange[ACRNOR] = oprange[r]; oprange[ACROR] = oprange[r]; oprange[ACRORN] = oprange[r]; oprange[ACRXOR] = oprange[r]; oprange[AMULCHW] = oprange[r]; oprange[AMULCHWCC] = oprange[r]; oprange[AMULCHWU] = oprange[r]; oprange[AMULCHWUCC] = oprange[r]; oprange[AMULHHW] = oprange[r]; oprange[AMULHHWCC] = oprange[r]; oprange[AMULHHWU] = oprange[r]; oprange[AMULHHWUCC] = oprange[r]; oprange[AMULLHW] = oprange[r]; oprange[AMULLHWCC] = oprange[r]; oprange[AMULLHWU] = oprange[r]; oprange[AMULLHWUCC] = oprange[r]; break; case AMACCHW: /* strictly 3 registers */ oprange[AMACCHWCC] = oprange[r]; oprange[AMACCHWS] = oprange[r]; oprange[AMACCHWSCC] = oprange[r]; oprange[AMACCHWSU] = oprange[r]; oprange[AMACCHWSUCC] = oprange[r]; oprange[AMACCHWSUV] = oprange[r]; oprange[AMACCHWSUVCC] = oprange[r]; oprange[AMACCHWSV] = oprange[r]; oprange[AMACCHWSVCC] = oprange[r]; oprange[AMACCHWU] = oprange[r]; oprange[AMACCHWUCC] = oprange[r]; oprange[AMACCHWUV] = oprange[r]; oprange[AMACCHWUVCC] = oprange[r]; oprange[AMACCHWV] = oprange[r]; oprange[AMACCHWVCC] = oprange[r]; oprange[AMACHHW] = oprange[r]; oprange[AMACHHWCC] = oprange[r]; oprange[AMACHHWS] = oprange[r]; oprange[AMACHHWSCC] = oprange[r]; oprange[AMACHHWSU] = oprange[r]; oprange[AMACHHWSUCC] = oprange[r]; oprange[AMACHHWSUV] = oprange[r]; oprange[AMACHHWSUVCC] = oprange[r]; oprange[AMACHHWSV] = oprange[r]; oprange[AMACHHWSVCC] = oprange[r]; oprange[AMACHHWU] = oprange[r]; oprange[AMACHHWUCC] = oprange[r]; oprange[AMACHHWUV] = oprange[r]; oprange[AMACHHWUVCC] = oprange[r]; oprange[AMACHHWV] = oprange[r]; oprange[AMACHHWVCC] = oprange[r]; oprange[AMACLHW] = oprange[r]; oprange[AMACLHWCC] = oprange[r]; oprange[AMACLHWS] = oprange[r]; oprange[AMACLHWSCC] = oprange[r]; oprange[AMACLHWSU] = oprange[r]; oprange[AMACLHWSUCC] = oprange[r]; oprange[AMACLHWSUV] = oprange[r]; oprange[AMACLHWSUVCC] = oprange[r]; oprange[AMACLHWSV] = oprange[r]; oprange[AMACLHWSVCC] = oprange[r]; oprange[AMACLHWU] = oprange[r]; oprange[AMACLHWUCC] = oprange[r]; oprange[AMACLHWUV] = oprange[r]; oprange[AMACLHWUVCC] = oprange[r]; oprange[AMACLHWV] = oprange[r]; oprange[AMACLHWVCC] = oprange[r]; oprange[ANMACCHW] = oprange[r]; oprange[ANMACCHWCC] = oprange[r]; oprange[ANMACCHWS] = oprange[r]; oprange[ANMACCHWSCC] = oprange[r]; oprange[ANMACCHWSV] = oprange[r]; oprange[ANMACCHWSVCC] = oprange[r]; oprange[ANMACCHWV] = oprange[r]; oprange[ANMACCHWVCC] = oprange[r]; oprange[ANMACHHW] = oprange[r]; oprange[ANMACHHWCC] = oprange[r]; oprange[ANMACHHWS] = oprange[r]; oprange[ANMACHHWSCC] = oprange[r]; oprange[ANMACHHWSV] = oprange[r]; oprange[ANMACHHWSVCC] = oprange[r]; oprange[ANMACHHWV] = oprange[r]; oprange[ANMACHHWVCC] = oprange[r]; oprange[ANMACLHW] = oprange[r]; oprange[ANMACLHWCC] = oprange[r]; oprange[ANMACLHWS] = oprange[r]; oprange[ANMACLHWSCC] = oprange[r]; oprange[ANMACLHWSV] = oprange[r]; oprange[ANMACLHWSVCC] = oprange[r]; oprange[ANMACLHWV] = oprange[r]; oprange[ANMACLHWVCC] = oprange[r]; break;/* floating point move *//* oprange[AFMR] = oprange[r]; oprange[AFMRCC] = oprange[r];*//**/ case AMOVBZ: /* lbz, stz, rlwm(r/r), lhz, lha, stz, and x variants */ oprange[AMOVH] = oprange[r]; oprange[AMOVHZ] = oprange[r]; break; case AMOVBZU: /* lbz[x]u, stb[x]u, lhz[x]u, lha[x]u, sth[u]x */ oprange[AMOVHU] = oprange[r]; oprange[AMOVHZU] = oprange[r]; oprange[AMOVWU] = oprange[r]; oprange[AMOVMW] = oprange[r]; break; case AAND: /* logical op Rb,Rs,Ra; no literal */ oprange[AANDN] = oprange[r]; oprange[AANDNCC] = oprange[r]; oprange[AEQV] = oprange[r]; oprange[AEQVCC] = oprange[r]; oprange[ANAND] = oprange[r]; oprange[ANANDCC] = oprange[r]; oprange[ANOR] = oprange[r]; oprange[ANORCC] = oprange[r]; oprange[AORCC] = oprange[r]; oprange[AORN] = oprange[r]; oprange[AORNCC] = oprange[r]; oprange[AXORCC] = oprange[r]; break; case AADDME: /* op Ra, Rd */ oprange[AADDMECC] = oprange[r]; oprange[AADDMEV] = oprange[r]; oprange[AADDMEVCC] = oprange[r]; oprange[AADDZE] = oprange[r]; oprange[AADDZECC] = oprange[r]; oprange[AADDZEV] = oprange[r]; oprange[AADDZEVCC] = oprange[r]; oprange[ASUBME] = oprange[r]; oprange[ASUBMECC] = oprange[r]; oprange[ASUBMEV] = oprange[r]; oprange[ASUBMEVCC] = oprange[r]; oprange[ASUBZE] = oprange[r]; oprange[ASUBZECC] = oprange[r]; oprange[ASUBZEV] = oprange[r]; oprange[ASUBZEVCC] = oprange[r]; break; case AADDC: oprange[AADDCCC] = oprange[r]; break; case ABEQ: oprange[ABGE] = oprange[r]; oprange[ABGT] = oprange[r]; oprange[ABLE] = oprange[r]; oprange[ABLT] = oprange[r]; oprange[ABNE] = oprange[r]; oprange[ABVC] = oprange[r]; oprange[ABVS] = oprange[r]; break; case ABR: oprange[ABL] = oprange[r]; break; case ABC: oprange[ABCL] = oprange[r]; break; case AEXTSB: /* op Rs, Ra */ oprange[AEXTSBCC] = oprange[r]; oprange[AEXTSH] = oprange[r]; oprange[AEXTSHCC] = oprange[r]; oprange[ACNTLZW] = oprange[r]; oprange[ACNTLZWCC] = oprange[r]; break; case AFABS: /* fop [s,]d */ oprange[AFABSCC] = oprange[r]; oprange[AFNABS] = oprange[r]; oprange[AFNABSCC] = oprange[r]; oprange[AFNEG] = oprange[r]; oprange[AFNEGCC] = oprange[r]; oprange[AFRSP] = oprange[r]; oprange[AFRSPCC] = oprange[r]; oprange[AFCTIW] = oprange[r]; oprange[AFCTIWCC] = oprange[r]; oprange[AFCTIWZ] = oprange[r]; oprange[AFCTIWZCC] = oprange[r]; break; case AFADD: oprange[AFADDS] = oprange[r]; oprange[AFADDCC] = oprange[r]; oprange[AFADDSCC] = oprange[r]; oprange[AFDIV] = oprange[r]; oprange[AFDIVS] = oprange[r]; oprange[AFDIVCC] = oprange[r]; oprange[AFDIVSCC] = oprange[r]; oprange[AFSUB] = oprange[r]; oprange[AFSUBS] = oprange[r]; oprange[AFSUBCC] = oprange[r]; oprange[AFSUBSCC] = oprange[r]; break; case AFMADD: oprange[AFMADDCC] = oprange[r]; oprange[AFMADDS] = oprange[r]; oprange[AFMADDSCC] = oprange[r]; oprange[AFMSUB] = oprange[r]; oprange[AFMSUBCC] = oprange[r]; oprange[AFMSUBS] = oprange[r]; oprange[AFMSUBSCC] = oprange[r]; oprange[AFNMADD] = oprange[r]; oprange[AFNMADDCC] = oprange[r]; oprange[AFNMADDS] = oprange[r]; oprange[AFNMADDSCC] = oprange[r]; oprange[AFNMSUB] = oprange[r]; oprange[AFNMSUBCC] = oprange[r]; oprange[AFNMSUBS] = oprange[r]; oprange[AFNMSUBSCC] = oprange[r]; break; case AFMUL: oprange[AFMULS] = oprange[r]; oprange[AFMULCC] = oprange[r]; oprange[AFMULSCC] = oprange[r]; break; case AFCMPO: oprange[AFCMPU] = oprange[r]; break; case AMTFSB0: oprange[AMTFSB0CC] = oprange[r]; oprange[AMTFSB1] = oprange[r]; oprange[AMTFSB1CC] = oprange[r]; break; case ANEG: /* op [Ra,] Rd */ oprange[ANEGCC] = oprange[r]; oprange[ANEGV] = oprange[r]; oprange[ANEGVCC] = oprange[r]; break; case AOR: /* or/xor Rb,Rs,Ra; ori/xori $uimm,Rs,Ra; oris/xoris $uimm,Rs,Ra */ oprange[AXOR] = oprange[r]; break; case ASLW: oprange[ASLWCC] = oprange[r]; oprange[ASRW] = oprange[r]; oprange[ASRWCC] = oprange[r]; break; case ASRAW: /* sraw Rb,Rs,Ra; srawi sh,Rs,Ra */ oprange[ASRAWCC] = oprange[r]; break; case ASUB: /* SUB Ra,Rb,Rd => subf Rd,ra,rb */ oprange[ASUB] = oprange[r]; oprange[ASUBCC] = oprange[r]; oprange[ASUBV] = oprange[r]; oprange[ASUBVCC] = oprange[r]; oprange[ASUBCCC] = oprange[r]; oprange[ASUBCV] = oprange[r]; oprange[ASUBCVCC] = oprange[r]; oprange[ASUBE] = oprange[r]; oprange[ASUBECC] = oprange[r]; oprange[ASUBEV] = oprange[r]; oprange[ASUBEVCC] = oprange[r]; break; case ASYNC: oprange[AISYNC] = oprange[r]; break; case ARLWMI: oprange[ARLWMICC] = oprange[r]; oprange[ARLWNM] = oprange[r]; oprange[ARLWNMCC] = oprange[r]; break; case AFMOVD: oprange[AFMOVDCC] = oprange[r]; oprange[AFMOVDU] = oprange[r]; oprange[AFMOVS] = oprange[r]; oprange[AFMOVSU] = oprange[r]; break; case AECIWX: oprange[ALWAR] = oprange[r]; break; case ASYSCALL: /* just the op; flow of control */ oprange[ARFI] = oprange[r]; oprange[ARFCI] = oprange[r]; break; case AMOVHBR: oprange[AMOVWBR] = oprange[r]; break; case AADD: case AANDCC: /* and. Rb,Rs,Ra; andi. $uimm,Rs,Ra; andis. $uimm,Rs,Ra */ case ACMP: case ACMPU: case AEIEIO: case ALSW: case AMOVB: /* macro: move byte with sign extension */ case AMOVBU: /* macro: move byte with sign extension & update */ case AMOVW: case AMOVFL: case AMULLW: /* op $s[,r2],r3; op r1[,r2],r3; no cc/v */ case ASUBC: /* op r1,$s,r3; op r1[,r2],r3 */ case ASTSW: case ATLBIE: case ATW: case AWORD: case ANOP: case ATEXT: break; } }}enum{ ABSD = 0, ABSU = 1, RELD = 2, RELU = 3,};int modemap[8] = { 0, 1, -1, 2, 3, 4, 5, 6};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 split, int sext){ int i, k, n; uchar *m; ulong *a; Reloc *r; if(v&3) diag("bad relocation address"); v >>= 2; if(s->type == SUNDEF) k = abs ? ABSU : RELU; else k = abs ? ABSD : RELD; if(split) k += 4; if(sext) k += 2; /* 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 + -