txt.c
来自「这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易」· C语言 代码 · 共 1,409 行 · 第 1/2 页
C
1,409 行
case CASE( TUINT, TINT): case CASE( TLONG, TINT): case CASE( TULONG, TINT): case CASE( TIND, TINT): case CASE( TINT, TUINT): case CASE( TUINT, TUINT): case CASE( TLONG, TUINT): case CASE( TULONG, TUINT): case CASE( TIND, TUINT): case CASE( TINT, TLONG): case CASE( TUINT, TLONG): case CASE( TLONG, TLONG): case CASE( TULONG, TLONG): case CASE( TIND, TLONG): case CASE( TINT, TULONG): case CASE( TUINT, TULONG): case CASE( TLONG, TULONG): case CASE( TULONG, TULONG): case CASE( TIND, TULONG): case CASE( TINT, TIND): case CASE( TUINT, TIND): case CASE( TLONG, TIND): case CASE( TULONG, TIND): case CASE( TIND, TIND): *****/ a = AMOVL; break; case CASE( TSHORT, TINT): case CASE( TSHORT, TUINT): case CASE( TSHORT, TLONG): case CASE( TSHORT, TULONG): case CASE( TSHORT, TIND): a = AMOVWLSX; if(f->op == OCONST) { f->vconst &= 0xffff; if(f->vconst & 0x8000) f->vconst |= 0xffff0000; a = AMOVL; } break; case CASE( TUSHORT,TINT): case CASE( TUSHORT,TUINT): case CASE( TUSHORT,TLONG): case CASE( TUSHORT,TULONG): case CASE( TUSHORT,TIND): a = AMOVWLZX; if(f->op == OCONST) { f->vconst &= 0xffff; a = AMOVL; } break; case CASE( TCHAR, TSHORT): case CASE( TCHAR, TUSHORT): case CASE( TCHAR, TINT): case CASE( TCHAR, TUINT): case CASE( TCHAR, TLONG): case CASE( TCHAR, TULONG): case CASE( TCHAR, TIND): a = AMOVBLSX; if(f->op == OCONST) { f->vconst &= 0xff; if(f->vconst & 0x80) f->vconst |= 0xffffff00; a = AMOVL; } break; case CASE( TUCHAR, TSHORT): case CASE( TUCHAR, TUSHORT): case CASE( TUCHAR, TINT): case CASE( TUCHAR, TUINT): case CASE( TUCHAR, TLONG): case CASE( TUCHAR, TULONG): case CASE( TUCHAR, TIND): a = AMOVBLZX; if(f->op == OCONST) { f->vconst &= 0xff; a = AMOVL; } break;/* * float to fix */ case CASE( TFLOAT, TCHAR): case CASE( TFLOAT, TUCHAR): case CASE( TFLOAT, TSHORT): case CASE( TFLOAT, TUSHORT): case CASE( TFLOAT, TINT): case CASE( TFLOAT, TLONG): case CASE( TFLOAT, TIND): case CASE( TDOUBLE,TCHAR): case CASE( TDOUBLE,TUCHAR): case CASE( TDOUBLE,TSHORT): case CASE( TDOUBLE,TUSHORT): case CASE( TDOUBLE,TINT): case CASE( TDOUBLE,TLONG): case CASE( TDOUBLE,TIND): if(fproundflg) { regsalloc(&nod, ®node); gins(AFMOVLP, f, &nod); gmove(&nod, t); return; } regsalloc(&nod, ®node); regsalloc(&nod1, ®node); gins(AFSTCW, Z, &nod1); nod1.xoffset += 2; gins(AMOVW, nodconst(0xf7f), &nod1); gins(AFLDCW, &nod1, Z); gins(AFMOVLP, f, &nod); nod1.xoffset -= 2; gins(AFLDCW, &nod1, Z); gmove(&nod, t); return;/* * float to ulong */ case CASE( TDOUBLE, TULONG): case CASE( TFLOAT, TULONG): case CASE( TDOUBLE, TUINT): case CASE( TFLOAT, TUINT): regsalloc(&nod, ®node); gmove(f, &fregnode0); gins(AFADDD, nodfconst(-2147483648.), &fregnode0); gins(AFMOVLP, f, &nod); gins(ASUBL, nodconst(-2147483648), &nod); gmove(&nod, t); return;/* * ulong to float */ case CASE( TULONG, TDOUBLE): case CASE( TULONG, TFLOAT): case CASE( TUINT, TDOUBLE): case CASE( TUINT, TFLOAT): regalloc(&nod, f, f); gmove(f, &nod); regsalloc(&nod1, ®node); gmove(&nod, &nod1); gins(AFMOVL, &nod1, &fregnode0); gins(ACMPL, &nod, nodconst(0)); gins(AJGE, Z, Z); p1 = p; gins(AFADDD, nodfconst(4294967296.), &fregnode0); patch(p1, pc); regfree(&nod); return;/* * fix to float */ case CASE( TCHAR, TFLOAT): case CASE( TUCHAR, TFLOAT): case CASE( TSHORT, TFLOAT): case CASE( TUSHORT,TFLOAT): case CASE( TINT, TFLOAT): case CASE( TLONG, TFLOAT): case CASE( TIND, TFLOAT): case CASE( TCHAR, TDOUBLE): case CASE( TUCHAR, TDOUBLE): case CASE( TSHORT, TDOUBLE): case CASE( TUSHORT,TDOUBLE): case CASE( TINT, TDOUBLE): case CASE( TLONG, TDOUBLE): case CASE( TIND, TDOUBLE): regsalloc(&nod, ®node); gmove(f, &nod); gins(AFMOVL, &nod, &fregnode0); return;/* * float to float */ case CASE( TFLOAT, TFLOAT): case CASE( TDOUBLE,TFLOAT): case CASE( TFLOAT, TDOUBLE): case CASE( TDOUBLE,TDOUBLE): a = AFMOVD; break; } if(a == AMOVL || a == AFMOVD) if(samaddr(f, t)) return; gins(a, f, t);}voiddoindex(Node *n){ Node nod, nod1; long v;if(debug['Y'])prtree(n, "index");if(n->left->complex >= FNX)print("botch in doindex\n"); regalloc(&nod, ®node, Z); v = constnode.vconst; cgen(n->right, &nod); idx.ptr = D_NONE; if(n->left->op == OCONST) idx.ptr = D_CONST; else if(n->left->op == OREGISTER)// else if(n->left->op == OREGISTER && typeil[n->left->type->etype]) idx.ptr = n->left->reg; else if(n->left->op != OADDR) { reg[D_BP]++; // cant be used as a base regalloc(&nod1, ®node, Z); cgen(n->left, &nod1); idx.ptr = nod1.reg; regfree(&nod1); reg[D_BP]--; } idx.reg = nod.reg; regfree(&nod); constnode.vconst = v;}voidgins(int a, Node *f, Node *t){ if(f != Z && f->op == OINDEX) doindex(f); if(t != Z && t->op == OINDEX) doindex(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);}voidfgopcode(int o, Node *f, Node *t, int pop, int rev){ int a, et; Node nod; et = TLONG; if(f != Z && f->type != T) et = f->type->etype; if(!typefd[et]) { diag(f, "fop: integer %O", o); return; } if(debug['M']) { if(t != Z && t->type != T) print("gop: %O %O-%s Z\n", o, f->op, tnames[et]); else print("gop: %O %O-%s %O-%s\n", o, f->op, tnames[et], t->op, tnames[t->type->etype]); } a = AGOK; switch(o) { case OASADD: case OADD: if(et == TFLOAT) a = AFADDF; else if(et == TDOUBLE || et == TVLONG) { a = AFADDD; if(pop) a = AFADDDP; } break; case OASSUB: case OSUB: if(et == TFLOAT) { a = AFSUBF; if(rev) a = AFSUBRF; } else if(et == TDOUBLE || et == TVLONG) { a = AFSUBD; if(pop) a = AFSUBDP; if(rev) { a = AFSUBRD; if(pop) a = AFSUBRDP; } } break; case OASMUL: case OMUL: if(et == TFLOAT) a = AFMULF; else if(et == TDOUBLE || et == TVLONG) { a = AFMULD; if(pop) a = AFMULDP; } break; case OASMOD: case OMOD: case OASDIV: case ODIV: if(et == TFLOAT) { a = AFDIVF; if(rev) a = AFDIVRF; } else if(et == TDOUBLE || et == TVLONG) { a = AFDIVD; if(pop) a = AFDIVDP; if(rev) { a = AFDIVRD; if(pop) a = AFDIVRDP; } } break; case OEQ: case ONE: case OLT: case OLE: case OGE: case OGT: pop += rev; if(et == TFLOAT) { a = AFCOMF; if(pop) { a = AFCOMFP; if(pop > 1) a = AGOK; } } else if(et == TDOUBLE || et == TVLONG) { a = AFCOMF; if(pop) { a = AFCOMDP; if(pop > 1) a = AFCOMDPP; } } gins(a, f, t); regalloc(&nod, ®node, Z); if(nod.reg != D_AX) { regfree(&nod); nod.reg = D_AX; gins(APUSHL, &nod, Z); gins(AWAIT, Z, Z); gins(AFSTSW, Z, &nod); gins(ASAHF, Z, Z); gins(APOPL, Z, &nod); } else { gins(AWAIT, Z, Z); gins(AFSTSW, Z, &nod); gins(ASAHF, Z, Z); regfree(&nod); } switch(o) { case OEQ: a = AJEQ; break; case ONE: a = AJNE; break; case OLT: a = AJCS; break; case OLE: a = AJLS; break; case OGE: a = AJCC; break; case OGT: a = AJHI; break; } gins(a, Z, Z); return; } if(a == AGOK) diag(Z, "bad in gopcode %O", o); gins(a, f, t);}voidgopcode(int o, Type *ty, Node *f, Node *t){ int a, et; et = TLONG; if(ty != T) et = ty->etype; if(typefd[et] && o != OADDR && o != OFUNC) { diag(f, "gop: float %O", o); return; } if(debug['M']) { if(f != Z && f->type != T) print("gop: %O %O[%s],", o, f->op, tnames[et]); else print("gop: %O Z,", o); if(t != Z && t->type != T) print("%O[%s]\n", t->op, tnames[t->type->etype]); else print("Z\n"); } a = AGOK; switch(o) { case OCOM: a = ANOTL; if(et == TCHAR || et == TUCHAR) a = ANOTB; if(et == TSHORT || et == TUSHORT) a = ANOTW; break; case ONEG: a = ANEGL; if(et == TCHAR || et == TUCHAR) a = ANEGB; if(et == TSHORT || et == TUSHORT) a = ANEGW; break; case OADDR: a = ALEAL; break; case OASADD: case OADD: a = AADDL; if(et == TCHAR || et == TUCHAR) a = AADDB; if(et == TSHORT || et == TUSHORT) a = AADDW; break; case OASSUB: case OSUB: a = ASUBL; if(et == TCHAR || et == TUCHAR) a = ASUBB; if(et == TSHORT || et == TUSHORT) a = ASUBW; break; case OASOR: case OOR: a = AORL; if(et == TCHAR || et == TUCHAR) a = AORB; if(et == TSHORT || et == TUSHORT) a = AORW; break; case OASAND: case OAND: a = AANDL; if(et == TCHAR || et == TUCHAR) a = AANDB; if(et == TSHORT || et == TUSHORT) a = AANDW; break; case OASXOR: case OXOR: a = AXORL; if(et == TCHAR || et == TUCHAR) a = AXORB; if(et == TSHORT || et == TUSHORT) a = AXORW; break; case OASLSHR: case OLSHR: a = ASHRL; if(et == TCHAR || et == TUCHAR) a = ASHRB; if(et == TSHORT || et == TUSHORT) a = ASHRW; break; case OASASHR: case OASHR: a = ASARL; if(et == TCHAR || et == TUCHAR) a = ASARB; if(et == TSHORT || et == TUSHORT) a = ASARW; break; case OASASHL: case OASHL: a = ASALL; if(et == TCHAR || et == TUCHAR) a = ASALB; if(et == TSHORT || et == TUSHORT) a = ASALW; break; case OFUNC: a = ACALL; break; case OASMUL: case OMUL: if(f->op == OREGISTER && t != Z && isreg(t, D_AX) && reg[D_DX] == 0) t = Z; a = AIMULL; break; case OASMOD: case OMOD: case OASDIV: case ODIV: a = AIDIVL; break; case OASLMUL: case OLMUL: a = AMULL; break; case OASLMOD: case OLMOD: case OASLDIV: case OLDIV: a = ADIVL; break; case OEQ: case ONE: case OLT: case OLE: case OGE: case OGT: case OLO: case OLS: case OHS: case OHI: a = ACMPL; if(et == TCHAR || et == TUCHAR) a = ACMPB; if(et == TSHORT || et == TUSHORT) a = ACMPW; gins(a, f, t); switch(o) { case OEQ: a = AJEQ; break; case ONE: a = AJNE; break; case OLT: a = AJLT; break; case OLE: a = AJLE; break; case OGE: a = AJGE; break; case OGT: a = AJGT; break; case OLO: a = AJCS; break; case OLS: a = AJLS; break; case OHS: a = AJCC; break; case OHI: a = AJHI; break; } gins(a, Z, Z); return; } if(a == AGOK) diag(Z, "bad in gopcode %O", o); gins(a, f, t);}intsamaddr(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 = 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_EXTERN; p->from.sym = s; p->from.scale = (profileflg ? 0 : NOPROF); if(s->class == CSTATIC) p->from.type = D_STATIC; naddr(n, &p->to); if(a == ADATA || a == AGLOBL) pc--;}intsconst(Node *n){ long v; if(n->op == OCONST && !typefd[n->type->etype]) { v = n->vconst; if(v >= -32766L && v < 32766L) return 1; } return 0;}longexreg(Type *t){ USED(t); 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 + =
减小字号Ctrl + -
显示快捷键?