📄 lex.c
字号:
"MULLWV", LLOGW, AMULLWV, "MULLWCC", LLOGW, AMULLWCC, "MULLWVCC", LLOGW, AMULLWVCC, "MULHW", LLOGW, AMULHW, "MULHWCC", LLOGW, AMULHWCC, "MULHWU", LLOGW, AMULHWU, "MULHWUCC", LLOGW, AMULHWUCC, "NEG", LABS, ANEG, "NEGV", LABS, ANEGV, "NEGCC", LABS, ANEGCC, "NEGVCC", LABS, ANEGVCC, "NOP", LNOP, ANOP, /* ori 0,0,0 */ "SYSCALL", LNOP, ASYSCALL, "RETURN", LRETRN, ARETURN, "RFI", LRETRN, ARFI, "RFCI", LRETRN, ARFCI, "DATA", LDATA, ADATA, "END", LEND, AEND, "TEXT", LTEXT, ATEXT, /* IBM powerpc embedded */ "MACCHW", LMA, AMACCHW, "MACCHWCC", LMA, AMACCHWCC, "MACCHWS", LMA, AMACCHWS, "MACCHWSCC", LMA, AMACCHWSCC, "MACCHWSU", LMA, AMACCHWSU, "MACCHWSUCC", LMA, AMACCHWSUCC, "MACCHWSUV", LMA, AMACCHWSUV, "MACCHWSUVCC", LMA, AMACCHWSUVCC, "MACCHWSV", LMA, AMACCHWSV, "MACCHWSVCC", LMA, AMACCHWSVCC, "MACCHWU", LMA, AMACCHWU, "MACCHWUCC", LMA, AMACCHWUCC, "MACCHWUV", LMA, AMACCHWUV, "MACCHWUVCC", LMA, AMACCHWUVCC, "MACCHWV", LMA, AMACCHWV, "MACCHWVCC", LMA, AMACCHWVCC, "MACHHW", LMA, AMACHHW, "MACHHWCC", LMA, AMACHHWCC, "MACHHWS", LMA, AMACHHWS, "MACHHWSCC", LMA, AMACHHWSCC, "MACHHWSU", LMA, AMACHHWSU, "MACHHWSUCC", LMA, AMACHHWSUCC, "MACHHWSUV", LMA, AMACHHWSUV, "MACHHWSUVCC", LMA, AMACHHWSUVCC, "MACHHWSV", LMA, AMACHHWSV, "MACHHWSVCC", LMA, AMACHHWSVCC, "MACHHWU", LMA, AMACHHWU, "MACHHWUCC", LMA, AMACHHWUCC, "MACHHWUV", LMA, AMACHHWUV, "MACHHWUVCC", LMA, AMACHHWUVCC, "MACHHWV", LMA, AMACHHWV, "MACHHWVCC", LMA, AMACHHWVCC, "MACLHW", LMA, AMACLHW, "MACLHWCC", LMA, AMACLHWCC, "MACLHWS", LMA, AMACLHWS, "MACLHWSCC", LMA, AMACLHWSCC, "MACLHWSU", LMA, AMACLHWSU, "MACLHWSUCC", LMA, AMACLHWSUCC, "MACLHWSUV", LMA, AMACLHWSUV, "MACLHWSUVCC", LMA, AMACLHWSUVCC, "MACLHWSV", LMA, AMACLHWSV, "MACLHWSVCC", LMA, AMACLHWSVCC, "MACLHWU", LMA, AMACLHWU, "MACLHWUCC", LMA, AMACLHWUCC, "MACLHWUV", LMA, AMACLHWUV, "MACLHWUVCC", LMA, AMACLHWUVCC, "MACLHWV", LMA, AMACLHWV, "MACLHWVCC", LMA, AMACLHWVCC, "MULCHW", LLOGW, AMULCHW, "MULCHWCC", LLOGW, AMULCHWCC, "MULCHWU", LLOGW, AMULCHWU, "MULCHWUCC", LLOGW, AMULCHWUCC, "MULHHW", LLOGW, AMULHHW, "MULHHWCC", LLOGW, AMULHHWCC, "MULHHWU", LLOGW, AMULHHWU, "MULHHWUCC", LLOGW, AMULHHWUCC, "MULLHW", LLOGW, AMULLHW, "MULLHWCC", LLOGW, AMULLHWCC, "MULLHWU", LLOGW, AMULLHWU, "MULLHWUCC", LLOGW, AMULLHWUCC, "NMACCHW", LMA, ANMACCHW, "NMACCHWCC", LMA, ANMACCHWCC, "NMACCHWS", LMA, ANMACCHWS, "NMACCHWSCC", LMA, ANMACCHWSCC, "NMACCHWSV", LMA, ANMACCHWSV, "NMACCHWSVCC", LMA, ANMACCHWSVCC, "NMACCHWV", LMA, ANMACCHWV, "NMACCHWVCC", LMA, ANMACCHWVCC, "NMACHHW", LMA, ANMACHHW, "NMACHHWCC", LMA, ANMACHHWCC, "NMACHHWS", LMA, ANMACHHWS, "NMACHHWSCC", LMA, ANMACHHWSCC, "NMACHHWSV", LMA, ANMACHHWSV, "NMACHHWSVCC", LMA, ANMACHHWSVCC, "NMACHHWV", LMA, ANMACHHWV, "NMACHHWVCC", LMA, ANMACHHWVCC, "NMACLHW", LMA, ANMACLHW, "NMACLHWCC", LMA, ANMACLHWCC, "NMACLHWS", LMA, ANMACLHWS, "NMACLHWSCC", LMA, ANMACLHWSCC, "NMACLHWSV", LMA, ANMACLHWSV, "NMACLHWSVCC", LMA, ANMACLHWSVCC, "NMACLHWV", LMA, ANMACLHWV, "NMACLHWVCC", LMA, ANMACLHWVCC,/* special instructions */ "DCBF", LXOP, ADCBF, "DCBI", LXOP, ADCBI, "DCBST", LXOP, ADCBST, "DCBT", LXOP, ADCBT, "DCBTST", LXOP, ADCBTST, "DCBZ", LXOP, ADCBZ, "ICBI", LXOP, AICBI, "ECIWX", LXLD, AECIWX, "ECOWX", LXST, AECOWX, "LWAR", LXLD, ALWAR, "STWCCC", LXST, ASTWCCC, "EIEIO", LRETRN, AEIEIO, "TLBIE", LNOP, ATLBIE, "LSW", LXLD, ALSW, "STSW", LXST, ASTSW, "ISYNC", LRETRN, AISYNC, "SYNC", LRETRN, ASYNC,/* "TW", LADDW, ATW,*/ "WORD", LWORD, AWORD, "SCHED", LSCHED, 0, "NOSCHED", LSCHED, 0x80, 0};voidcinit(void){ Sym *s; int i; nullgen.sym = S; nullgen.offset = 0; nullgen.type = D_NONE; nullgen.name = D_NONE; nullgen.reg = NREG; nullgen.xreg = NREG; if(FPCHIP) nullgen.dval = 0; for(i=0; i<sizeof(nullgen.sval); i++) nullgen.sval[i] = 0; nerrors = 0; iostack = I; iofree = I; peekc = IGN; nhunk = 0; for(i=0; i<NHASH; i++) hash[i] = S; for(i=0; itab[i].name; i++) { s = slookup(itab[i].name); s->type = itab[i].type; s->value = itab[i].value; } ALLOCN(pathname, 0, 100); if(mygetwd(pathname, 99) == 0) { ALLOCN(pathname, 100, 900); if(mygetwd(pathname, 999) == 0) strcpy(pathname, "/???"); }}voidsyminit(Sym *s){ s->type = LNAME; s->value = 0;}voidcclean(void){ outcode(AEND, &nullgen, NREG, &nullgen); Bflush(&obuf);}voidzname(char *n, int t, int s){ Bputc(&obuf, ANAME); Bputc(&obuf, t); /* type */ Bputc(&obuf, s); /* sym */ while(*n) { Bputc(&obuf, *n); n++; } Bputc(&obuf, 0);}voidzaddr(Gen *a, int s){ long l; int i; char *n; Ieee e; Bputc(&obuf, a->type); Bputc(&obuf, a->reg); Bputc(&obuf, s); Bputc(&obuf, a->name); switch(a->type) { default: print("unknown type %d\n", a->type); exits("arg"); case D_NONE: case D_REG: case D_FREG: case D_CREG: case D_FPSCR: case D_MSR: case D_SREG: case D_OPT: break; case D_DCR: case D_SPR: case D_OREG: case D_CONST: case D_BRANCH: l = a->offset; Bputc(&obuf, l); Bputc(&obuf, l>>8); Bputc(&obuf, l>>16); Bputc(&obuf, l>>24); break; case D_SCONST: n = a->sval; for(i=0; i<NSNAME; i++) { Bputc(&obuf, *n); n++; } break; case D_FCONST: ieeedtod(&e, a->dval); Bputc(&obuf, e.l); Bputc(&obuf, e.l>>8); Bputc(&obuf, e.l>>16); Bputc(&obuf, e.l>>24); Bputc(&obuf, e.h); Bputc(&obuf, e.h>>8); Bputc(&obuf, e.h>>16); Bputc(&obuf, e.h>>24); break; }}intoutsim(Gen *g){ Sym *s; int sno, t; s = g->sym; if(s == S) return 0; sno = s->sym; if(sno < 0 || sno >= NSYM) sno = 0; t = g->name; if(h[sno].type == t && h[sno].sym == s) return sno; zname(s->name, t, sym); s->sym = sym; h[sym].sym = s; h[sym].type = t; sno = sym; sym++; if(sym >= NSYM) sym = 1; return sno;}voidoutcode(int a, Gen *g1, int reg, Gen *g2){ int sf, st; if(a != AGLOBL && a != ADATA) pc++; if(pass == 1) return; if(g1->xreg != NREG) { if(reg != NREG || g2->xreg != NREG) yyerror("bad addressing modes"); reg = g1->xreg; } else if(g2->xreg != NREG) { if(reg != NREG) yyerror("bad addressing modes"); reg = g2->xreg; } do { sf = outsim(g1); st = outsim(g2); } while(sf != 0 && st == sf); Bputc(&obuf, a); Bputc(&obuf, reg|nosched); Bputc(&obuf, lineno); Bputc(&obuf, lineno>>8); Bputc(&obuf, lineno>>16); Bputc(&obuf, lineno>>24); zaddr(g1, sf); zaddr(g2, st);}voidoutgcode(int a, Gen *g1, int reg, Gen *g2, Gen *g3){ int s1, s2, s3, flag; if(a != AGLOBL && a != ADATA) pc++; if(pass == 1) return; do { s1 = outsim(g1); s2 = outsim(g2); s3 = outsim(g3); } while(s1 && (s2 && s1 == s2 || s3 && s1 == s3) || s2 && (s3 && s2 == s3)); flag = 0; if(g2->type != D_NONE) flag = 0x40; /* flags extra operand */ Bputc(&obuf, a); Bputc(&obuf, reg | nosched | flag); Bputc(&obuf, lineno); Bputc(&obuf, lineno>>8); Bputc(&obuf, lineno>>16); Bputc(&obuf, lineno>>24); zaddr(g1, s1); if(flag) zaddr(g2, s2); zaddr(g3, s3);}voidouthist(void){ Gen g; Hist *h; char *p, *q, *op, c; int n; g = nullgen; c = pathchar(); for(h = hist; h != H; h = h->link) { p = h->name; op = 0; /* on windows skip drive specifier in pathname */ if(systemtype(Windows) && p && p[1] == ':'){ p += 2; c = *p; } if(p && p[0] != c && h->offset == 0 && pathname){ /* on windows skip drive specifier in pathname */ if(systemtype(Windows) && pathname[1] == ':') { op = p; p = pathname+2; c = *p; } else if(pathname[0] == c){ op = p; p = pathname; } } while(p) { q = strchr(p, c); if(q) { n = q-p; if(n == 0){ n = 1; /* leading "/" */ *p = '/'; /* don't emit "\" on windows */ } q++; } else { n = strlen(p); q = 0; } if(n) { Bputc(&obuf, ANAME); Bputc(&obuf, D_FILE); /* type */ Bputc(&obuf, 1); /* sym */ Bputc(&obuf, '<'); Bwrite(&obuf, p, n); Bputc(&obuf, 0); } p = q; if(p == 0 && op) { p = op; op = 0; } } g.offset = h->offset; Bputc(&obuf, AHISTORY); Bputc(&obuf, 0); Bputc(&obuf, h->line); Bputc(&obuf, h->line>>8); Bputc(&obuf, h->line>>16); Bputc(&obuf, h->line>>24); zaddr(&nullgen, 0); zaddr(&g, 0); }}#include "../cc/lexbody"#include "../cc/macbody"#include "../cc/compat"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -