📄 txt.c
字号:
case TSHORT: a = AMOVH; break; case TUSHORT: a = AMOVHU; break; } regalloc(&nod, f, t); gins(a, f, &nod); gmove(&nod, t); regfree(&nod); return; } /* * a store -- * put it into a register then * store it. */ if(t->op == ONAME || t->op == OINDREG || t->op == OIND) { switch(tt) { default: if(typefd[ft]) { /* special case can store mem from Freg */ regalloc(&nod, f, Z); a = AFMOVDW; if(ft == TFLOAT) a = AFMOVFW; gins(a, f, &nod); gins(AMOVW, &nod, t); regfree(&nod); return; } a = AMOVW; break; case TUCHAR: a = AMOVBU; break; case TCHAR: a = AMOVB; break; case TUSHORT: a = AMOVHU; break; case TSHORT: a = AMOVH; break; case TFLOAT: a = AFMOVF; break; case TVLONG: case TDOUBLE: a = AFMOVD; break; } if(!typefd[ft] && vconst(f) == 0) { gins(a, f, t); return; } 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 = AFMOVD; if(ft == TFLOAT) a = AFMOVFD; break; case TFLOAT: a = AFMOVDF; if(ft == TFLOAT) a = AFMOVF; break; case TLONG: case TULONG: case TIND: case TINT: case TUINT: case TSHORT: case TUSHORT: case TCHAR: case TUCHAR: regalloc(&nod, f, Z); /* should be type float */ a = AFMOVDW; if(ft == TFLOAT) a = AFMOVFW; gins(a, f, &nod); gins(AFMOVF, &nod, nodrat); regfree(&nod); gins(AMOVW, nodrat, t); gmove(t, t); if(nrathole < SZ_LONG) nrathole = SZ_LONG; return; } break; case TINT: case TUINT: case TLONG: case TULONG: case TIND: switch(tt) { case TDOUBLE: case TVLONG: case TFLOAT: goto fxtofl; case TLONG: case TULONG: case TINT: case TUINT: case TIND: case TSHORT: case TUSHORT: case TCHAR: case TUCHAR: a = AMOVW; break; } break; case TSHORT: switch(tt) { case TDOUBLE: case TVLONG: case TFLOAT: goto fxtofl; 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: case TFLOAT: goto fxtofl; 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: case TFLOAT: goto fxtofl; 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: case TFLOAT: fxtofl: regalloc(&nod, t, t); /* should be type float */ gins(AMOVW, f, nodrat); gins(AFMOVF, nodrat, &nod); a = AFMOVWD; if(tt == TFLOAT) a = AFMOVWF; gins(a, &nod, t); regfree(&nod); if(nrathole < SZ_LONG) nrathole = SZ_LONG; if(ft == TULONG) { regalloc(&nod, t, Z); if(tt == TFLOAT) { gins(AFCMPF, t, Z); p->to.type = D_FREG; p->to.reg = FREGZERO; gins(AFBGE, Z, Z); p1 = p; gins(AFMOVF, nodfconst(4294967296.), &nod); gins(AFADDF, &nod, t); } else { gins(AFCMPD, t, Z); p->to.type = D_FREG; p->to.reg = FREGZERO; gins(AFBGE, Z, Z); p1 = p; gins(AFMOVD, nodfconst(4294967296.), &nod); gins(AFADDD, &nod, t); } patch(p1, pc); 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 == AFMOVF || a == AFMOVD) if(samaddr(f, t)) return; 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 = AFADDF; else if(et == TDOUBLE || et == TVLONG) a = AFADDD; break; case OASSUB: case OSUB: a = ASUB; if(et == TFLOAT) a = AFSUBF; else if(et == TDOUBLE || et == TVLONG) a = AFSUBD; break; case OASOR: case OOR: a = AOR; break; case OASAND: case OAND: a = AAND; break; case OASXOR: case OXOR: a = AXOR; 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 = AJMPL; break; case OASLMUL: case OLMUL: case OASMUL: case OMUL: if(et == TFLOAT) { a = AFMULF; break; } else if(et == TDOUBLE || et == TVLONG) { a = AFMULD; break; } a = AMUL; break; case OASDIV: case ODIV: if(et == TFLOAT) { a = AFDIVF; break; } else if(et == TDOUBLE || et == TVLONG) { a = AFDIVD; break; } a = ADIV; break; case OASMOD: case OMOD: a = AMOD; break; case OASLMOD: case OLMOD: a = AMODL; break; case OASLDIV: case OLDIV: a = ADIVL; break; case OEQ: a = ABE; if(typefd[et]) a = AFBE; goto cmp; case ONE: a = ABNE; if(typefd[et]) a = AFBLG; goto cmp; case OLT: a = ABL; if(typefd[et]) a = AFBL; goto cmp; case OLE: a = ABLE; if(typefd[et]) a = AFBLE; goto cmp; case OGE: a = ABGE; if(typefd[et]) a = AFBGE; goto cmp; case OGT: a = ABG; if(typefd[et]) a = AFBG; goto cmp; case OLO: a = ABCS; goto cmp; case OLS: a = ABLEU; goto cmp; case OHS: a = ABCC; goto cmp; case OHI: a = ABGU; goto cmp; cmp: nextpc(); p->as = ACMP; if(et == TFLOAT) p->as = AFCMPF; else if(et == TDOUBLE || et == TVLONG) p->as = AFCMPD; if(f1 != Z) naddr(f1, &p->from); if(t != Z) naddr(t, &p->to); if(f1 == Z || t == Z || f2 != Z) diag(Z, "bad cmp in gopcode %O", o); if(debug['g']) print("%P\n", p); f1 = Z; f2 = Z; t = 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(ta.type == D_CONST && ta.offset == 0) p->reg = REGZERO; } 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 = ARETURN; break; case OGOTO: a = AJMP; 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->reg = (profileflg ? 0 : NOPROF); p->from.name = D_EXTERN; if(s->class == CSTATIC) p->from.name = D_STATIC; naddr(n, &p->to); if(a == ADATA || a == AGLOBL) pc--;}intsval(long v){ if(v >= -(1<<12) && v < (1<<12)) return 1; return 0;}intsconst(Node *n){ vlong vv; if(n->op == OCONST) { if(!typefd[n->type->etype]) { vv = n->vconst; if(vv >= -(vlong)(1<<12) && vv < (vlong)(1<<12)) return 1; } } return 0;}longexreg(Type *t){ long o; if(typechlp[t->etype]) { if(exregoffset <= 3) return 0; o = exregoffset; exregoffset--; return o; } if(typefd[t->etype]) { if(exfregoffset <= 16) 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 + -