📄 txt.c
字号:
case TVLONG: case TDOUBLE: a = AMOVD; break; } if(ft == tt) regalloc(&nod, t, f); else regalloc(&nod, t, Z); gmove(f, &nod); gins(a, &nod, t); regfree(&nod); return; } /* * type x type cross table */ a = AGOK; switch(ft) { case TDOUBLE: case TVLONG: case TFLOAT: switch(tt) { case TDOUBLE: case TVLONG: a = AMOVD; if(ft == TFLOAT) a = AMOVFD; break; case TFLOAT: a = AMOVDF; if(ft == TFLOAT) a = AMOVF; break; case TINT: case TUINT: case TLONG: case TULONG: case TIND: a = AMOVDW; if(ft == TFLOAT) a = AMOVFW; break; case TSHORT: case TUSHORT: case TCHAR: case TUCHAR: a = AMOVDW; if(ft == TFLOAT) a = AMOVFW; break; } break; case TUINT: case TINT: case TULONG: case TLONG: case TIND: switch(tt) { case TDOUBLE: case TVLONG: gins(AMOVWD, f, t); if(ft == TULONG) { } return; case TFLOAT: gins(AMOVWF, f, t); if(ft == TULONG) { } return; case TINT: case TUINT: case TLONG: case TULONG: case TIND: case TSHORT: case TUSHORT: case TCHAR: case TUCHAR: a = AMOVW; break; } break; case TSHORT: switch(tt) { case TDOUBLE: case TVLONG: regalloc(&nod, f, Z); gins(AMOVH, f, &nod); gins(AMOVWD, &nod, t); regfree(&nod); return; case TFLOAT: regalloc(&nod, f, Z); gins(AMOVH, f, &nod); gins(AMOVWF, &nod, t); regfree(&nod); return; case TUINT: case TINT: case TULONG: case TLONG: case TIND: a = AMOVH; break; case TSHORT: case TUSHORT: case TCHAR: case TUCHAR: a = AMOVW; break; } break; case TUSHORT: switch(tt) { case TDOUBLE: case TVLONG: regalloc(&nod, f, Z); gins(AMOVHU, f, &nod); gins(AMOVWD, &nod, t); regfree(&nod); return; case TFLOAT: regalloc(&nod, f, Z); gins(AMOVHU, f, &nod); gins(AMOVWF, &nod, t); regfree(&nod); return; case TINT: case TUINT: case TLONG: case TULONG: case TIND: a = AMOVHU; break; case TSHORT: case TUSHORT: case TCHAR: case TUCHAR: a = AMOVW; break; } break; case TCHAR: switch(tt) { case TDOUBLE: case TVLONG: regalloc(&nod, f, Z); gins(AMOVB, f, &nod); gins(AMOVWD, &nod, t); regfree(&nod); return; case TFLOAT: regalloc(&nod, f, Z); gins(AMOVB, f, &nod); gins(AMOVWF, &nod, t); regfree(&nod); return; case TINT: case TUINT: case TLONG: case TULONG: case TIND: case TSHORT: case TUSHORT: a = AMOVB; break; case TCHAR: case TUCHAR: a = AMOVW; break; } break; case TUCHAR: switch(tt) { case TDOUBLE: case TVLONG: regalloc(&nod, f, Z); gins(AMOVBU, f, &nod); gins(AMOVWD, &nod, t); regfree(&nod); return; case TFLOAT: regalloc(&nod, f, Z); gins(AMOVBU, f, &nod); gins(AMOVWF, &nod, t); regfree(&nod); return; case TINT: case TUINT: case TLONG: case TULONG: case TIND: case TSHORT: case TUSHORT: a = AMOVBU; break; case TCHAR: case TUCHAR: a = AMOVW; break; } break; } if(a == AGOK) diag(Z, "bad opcode in gmove %T -> %T", f->type, t->type); if(a == AMOVW || a == AMOVF || a == AMOVD) if(samaddr(f, t)) return; gins(a, f, t);}voidgmover(Node *f, Node *t){ int ft, tt, a; ft = f->type->etype; tt = t->type->etype; a = AGOK; if(typechlp[ft] && typechlp[tt] && ewidth[ft] >= ewidth[tt]){ switch(tt){ case TSHORT: a = AMOVH; break; case TUSHORT: a = AMOVHU; break; case TCHAR: a = AMOVB; break; case TUCHAR: a = AMOVBU; break; } } if(a == AGOK) gmove(f, t); else gins(a, f, t);}voidgins(int a, Node *f, Node *t){ nextpc(); p->as = a; if(f != Z) naddr(f, &p->from); if(t != Z) naddr(t, &p->to); if(debug['g']) print("%P\n", p);}voidgopcode(int o, Node *f1, Node *f2, Node *t){ int a, et; Adr ta; et = TLONG; if(f1 != Z && f1->type != T) et = f1->type->etype; a = AGOK; switch(o) { case OAS: gmove(f1, t); return; case OASADD: case OADD: a = AADD; if(et == TFLOAT) a = AADDF; else if(et == TDOUBLE || et == TVLONG) a = AADDD; break; case OASSUB: case OSUB: if(f2 && f2->op == OCONST) { Node *t = f1; f1 = f2; f2 = t; a = ARSB; } else a = ASUB; if(et == TFLOAT) a = ASUBF; else if(et == TDOUBLE || et == TVLONG) a = ASUBD; break; case OASOR: case OOR: a = AORR; break; case OASAND: case OAND: a = AAND; break; case OASXOR: case OXOR: a = AEOR; break; case OASLSHR: case OLSHR: a = ASRL; break; case OASASHR: case OASHR: a = ASRA; break; case OASASHL: case OASHL: a = ASLL; break; case OFUNC: a = ABL; break; case OASMUL: case OMUL: a = AMUL; if(et == TFLOAT) a = AMULF; else if(et == TDOUBLE || et == TVLONG) a = AMULD; break; case OASDIV: case ODIV: a = ADIV; if(et == TFLOAT) a = ADIVF; else if(et == TDOUBLE || et == TVLONG) a = ADIVD; break; case OASMOD: case OMOD: a = AMOD; break; case OASLMUL: case OLMUL: a = AMULU; break; case OASLMOD: case OLMOD: a = AMODU; break; case OASLDIV: case OLDIV: a = ADIVU; break; case OCASE: case OEQ: case ONE: case OLT: case OLE: case OGE: case OGT: case OLO: case OLS: case OHS: case OHI: a = ACMP; if(et == TFLOAT) a = ACMPF; else if(et == TDOUBLE || et == TVLONG) a = ACMPD; nextpc(); p->as = a; naddr(f1, &p->from); if(a == ACMP && f1->op == OCONST && p->from.offset < 0) { p->as = ACMN; p->from.offset = -p->from.offset; } raddr(f2, p); switch(o) { case OEQ: a = ABEQ; break; case ONE: a = ABNE; break; case OLT: a = ABLT; break; case OLE: a = ABLE; break; case OGE: a = ABGE; break; case OGT: a = ABGT; break; case OLO: a = ABLO; break; case OLS: a = ABLS; break; case OHS: a = ABHS; break; case OHI: a = ABHI; break; case OCASE: nextpc(); p->as = ACASE; p->scond = 0x9; naddr(f2, &p->from); a = ABHI; break; } f1 = Z; f2 = Z; break; } if(a == AGOK) diag(Z, "bad in gopcode %O", o); nextpc(); p->as = a; if(f1 != Z) naddr(f1, &p->from); if(f2 != Z) { naddr(f2, &ta); p->reg = ta.reg; } if(t != Z) naddr(t, &p->to); if(debug['g']) print("%P\n", p);}samaddr(Node *f, Node *t){ if(f->op != t->op) return 0; switch(f->op) { case OREGISTER: if(f->reg != t->reg) break; return 1; } return 0;}voidgbranch(int o){ int a; a = AGOK; switch(o) { case ORETURN: a = ARET; break; case OGOTO: a = AB; break; } nextpc(); if(a == AGOK) { diag(Z, "bad in gbranch %O", o); nextpc(); } p->as = a;}voidpatch(Prog *op, long pc){ op->to.offset = pc; op->to.type = D_BRANCH;}voidgpseudo(int a, Sym *s, Node *n){ nextpc(); p->as = a; p->from.type = D_OREG; p->from.sym = s; p->from.name = D_EXTERN; p->reg = (profileflg ? 0 : NOPROF); if(s->class == CSTATIC) p->from.name = D_STATIC; naddr(n, &p->to); if(a == ADATA || a == AGLOBL) pc--;}intsconst(Node *n){ vlong vv; if(n->op == OCONST) { if(!typefd[n->type->etype]) { vv = n->vconst; if(vv >= (vlong)(-32766) && vv < (vlong)32766) return 1; /* * should be specialised for constant values which will * fit in different instructionsl; for now, let 5l * sort it out */ return 1; } } return 0;}intsval(long v){ int i; for(i=0; i<16; i++) { if((v & ~0xff) == 0) return 1; if((~v & ~0xff) == 0) return 1; v = (v<<2) | ((ulong)v>>30); } return 0;}longexreg(Type *t){ long o; if(typechlp[t->etype]) { if(exregoffset <= REGEXT-4) return 0; o = exregoffset; exregoffset--; return o; } if(typefd[t->etype]) { if(exfregoffset <= NFREG-1) return 0; o = exfregoffset + NREG; exfregoffset--; return o; } return 0;}schar ewidth[NTYPE] ={ -1, /* [TXXX] */ SZ_CHAR, /* [TCHAR] */ SZ_CHAR, /* [TUCHAR] */ SZ_SHORT, /* [TSHORT] */ SZ_SHORT, /* [TUSHORT] */ SZ_INT, /* [TINT] */ SZ_INT, /* [TUINT] */ SZ_LONG, /* [TLONG] */ SZ_LONG, /* [TULONG] */ SZ_VLONG, /* [TVLONG] */ SZ_VLONG, /* [TUVLONG] */ SZ_FLOAT, /* [TFLOAT] */ SZ_DOUBLE, /* [TDOUBLE] */ SZ_IND, /* [TIND] */ 0, /* [TFUNC] */ -1, /* [TARRAY] */ 0, /* [TVOID] */ -1, /* [TSTRUCT] */ -1, /* [TUNION] */ SZ_INT, /* [TENUM] */};long ncast[NTYPE] ={ 0, /* [TXXX] */ BCHAR|BUCHAR, /* [TCHAR] */ BCHAR|BUCHAR, /* [TUCHAR] */ BSHORT|BUSHORT, /* [TSHORT] */ BSHORT|BUSHORT, /* [TUSHORT] */ BINT|BUINT|BLONG|BULONG|BIND, /* [TINT] */ BINT|BUINT|BLONG|BULONG|BIND, /* [TUINT] */ BINT|BUINT|BLONG|BULONG|BIND, /* [TLONG] */ BINT|BUINT|BLONG|BULONG|BIND, /* [TULONG] */ BVLONG|BUVLONG, /* [TVLONG] */ BVLONG|BUVLONG, /* [TUVLONG] */ BFLOAT, /* [TFLOAT] */ BDOUBLE, /* [TDOUBLE] */ BLONG|BULONG|BIND, /* [TIND] */ 0, /* [TFUNC] */ 0, /* [TARRAY] */ 0, /* [TVOID] */ BSTRUCT, /* [TSTRUCT] */ BUNION, /* [TUNION] */ 0, /* [TENUM] */};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -