decoder.isa
来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· ISA 代码 · 共 1,399 行 · 第 1/5 页
ISA
1,399 行
0x01: fmovs_fcc0({{ if(passesFpCondition(Fsr<11:10>, COND4)) Frds = Frs2s; else Frds = Frds; }}); 0x02: fmovd_fcc0({{ if(passesFpCondition(Fsr<11:10>, COND4)) Frd = Frs2; else Frd = Frd; }}); 0x03: FpUnimpl::fmovq_fcc0(); 0x25: fmovrsz({{ if(Rs1 == 0) Frds = Frs2s; else Frds = Frds; }}); 0x26: fmovrdz({{ if(Rs1 == 0) Frd = Frs2; else Frd = Frd; }}); 0x27: FpUnimpl::fmovrqz(); 0x41: fmovs_fcc1({{ if(passesFpCondition(Fsr<33:32>, COND4)) Frds = Frs2s; else Frds = Frds; }}); 0x42: fmovd_fcc1({{ if(passesFpCondition(Fsr<33:32>, COND4)) Frd = Frs2; else Frd = Frd; }}); 0x43: FpUnimpl::fmovq_fcc1(); 0x45: fmovrslez({{ if(Rs1 <= 0) Frds = Frs2s; else Frds = Frds; }}); 0x46: fmovrdlez({{ if(Rs1 <= 0) Frd = Frs2; else Frd = Frd; }}); 0x47: FpUnimpl::fmovrqlez(); 0x51: fcmps({{ uint8_t fcc; if(isnan(Frs1s) || isnan(Frs2s)) fcc = 3; else if(Frs1s < Frs2s) fcc = 1; else if(Frs1s > Frs2s) fcc = 2; else fcc = 0; uint8_t firstbit = 10; if(FCMPCC) firstbit = FCMPCC * 2 + 30; Fsr = insertBits(Fsr, firstbit +1, firstbit, fcc); }}); 0x52: fcmpd({{ uint8_t fcc; if(isnan(Frs1) || isnan(Frs2)) fcc = 3; else if(Frs1 < Frs2) fcc = 1; else if(Frs1 > Frs2) fcc = 2; else fcc = 0; uint8_t firstbit = 10; if(FCMPCC) firstbit = FCMPCC * 2 + 30; Fsr = insertBits(Fsr, firstbit +1, firstbit, fcc); }}); 0x53: FpUnimpl::fcmpq(); 0x55: fcmpes({{ uint8_t fcc = 0; if(isnan(Frs1s) || isnan(Frs2s)) fault = new FpExceptionIEEE754; if(Frs1s < Frs2s) fcc = 1; else if(Frs1s > Frs2s) fcc = 2; uint8_t firstbit = 10; if(FCMPCC) firstbit = FCMPCC * 2 + 30; Fsr = insertBits(Fsr, firstbit +1, firstbit, fcc); }}); 0x56: fcmped({{ uint8_t fcc = 0; if(isnan(Frs1) || isnan(Frs2)) fault = new FpExceptionIEEE754; if(Frs1 < Frs2) fcc = 1; else if(Frs1 > Frs2) fcc = 2; uint8_t firstbit = 10; if(FCMPCC) firstbit = FCMPCC * 2 + 30; Fsr = insertBits(Fsr, firstbit +1, firstbit, fcc); }}); 0x57: FpUnimpl::fcmpeq(); 0x65: fmovrslz({{ if(Rs1 < 0) Frds = Frs2s; else Frds = Frds; }}); 0x66: fmovrdlz({{ if(Rs1 < 0) Frd = Frs2; else Frd = Frd; }}); 0x67: FpUnimpl::fmovrqlz(); 0x81: fmovs_fcc2({{ if(passesFpCondition(Fsr<35:34>, COND4)) Frds = Frs2s; else Frds = Frds; }}); 0x82: fmovd_fcc2({{ if(passesFpCondition(Fsr<35:34>, COND4)) Frd = Frs2; else Frd = Frd; }}); 0x83: FpUnimpl::fmovq_fcc2(); 0xA5: fmovrsnz({{ if(Rs1 != 0) Frds = Frs2s; else Frds = Frds; }}); 0xA6: fmovrdnz({{ if(Rs1 != 0) Frd = Frs2; else Frd = Frd; }}); 0xA7: FpUnimpl::fmovrqnz(); 0xC1: fmovs_fcc3({{ if(passesFpCondition(Fsr<37:36>, COND4)) Frds = Frs2s; else Frds = Frds; }}); 0xC2: fmovd_fcc3({{ if(passesFpCondition(Fsr<37:36>, COND4)) Frd = Frs2; else Frd = Frd; }}); 0xC3: FpUnimpl::fmovq_fcc3(); 0xC5: fmovrsgz({{ if(Rs1 > 0) Frds = Frs2s; else Frds = Frds; }}); 0xC6: fmovrdgz({{ if(Rs1 > 0) Frd = Frs2; else Frd = Frd; }}); 0xC7: FpUnimpl::fmovrqgz(); 0xE5: fmovrsgez({{ if(Rs1 >= 0) Frds = Frs2s; else Frds = Frds; }}); 0xE6: fmovrdgez({{ if(Rs1 >= 0) Frd = Frs2; else Frd = Frd; }}); 0xE7: FpUnimpl::fmovrqgez(); 0x101: fmovs_icc({{ if(passesCondition(Ccr<3:0>, COND4)) Frds = Frs2s; else Frds = Frds; }}); 0x102: fmovd_icc({{ if(passesCondition(Ccr<3:0>, COND4)) Frd = Frs2; else Frd = Frd; }}); 0x103: FpUnimpl::fmovq_icc(); 0x181: fmovs_xcc({{ if(passesCondition(Ccr<7:4>, COND4)) Frds = Frs2s; else Frds = Frds; }}); 0x182: fmovd_xcc({{ if(passesCondition(Ccr<7:4>, COND4)) Frd = Frs2; else Frd = Frd; }}); 0x183: FpUnimpl::fmovq_xcc(); default: FailUnimpl::fpop2(); } } //This used to be just impdep1, but now it's a whole bunch //of instructions 0x36: decode OPF{ 0x00: FailUnimpl::edge8(); 0x01: FailUnimpl::edge8n(); 0x02: FailUnimpl::edge8l(); 0x03: FailUnimpl::edge8ln(); 0x04: FailUnimpl::edge16(); 0x05: FailUnimpl::edge16n(); 0x06: FailUnimpl::edge16l(); 0x07: FailUnimpl::edge16ln(); 0x08: FailUnimpl::edge32(); 0x09: FailUnimpl::edge32n(); 0x0A: FailUnimpl::edge32l(); 0x0B: FailUnimpl::edge32ln(); 0x10: FailUnimpl::array8(); 0x12: FailUnimpl::array16(); 0x14: FailUnimpl::array32(); 0x18: BasicOperate::alignaddr({{ uint64_t sum = Rs1 + Rs2; Rd = sum & ~7; Gsr = (Gsr & ~7) | (sum & 7); }}); 0x19: FailUnimpl::bmask(); 0x1A: BasicOperate::alignaddresslittle({{ uint64_t sum = Rs1 + Rs2; Rd = sum & ~7; Gsr = (Gsr & ~7) | ((~sum + 1) & 7); }}); 0x20: FailUnimpl::fcmple16(); 0x22: FailUnimpl::fcmpne16(); 0x24: FailUnimpl::fcmple32(); 0x26: FailUnimpl::fcmpne32(); 0x28: FailUnimpl::fcmpgt16(); 0x2A: FailUnimpl::fcmpeq16(); 0x2C: FailUnimpl::fcmpgt32(); 0x2E: FailUnimpl::fcmpeq32(); 0x31: FailUnimpl::fmul8x16(); 0x33: FailUnimpl::fmul8x16au(); 0x35: FailUnimpl::fmul8x16al(); 0x36: FailUnimpl::fmul8sux16(); 0x37: FailUnimpl::fmul8ulx16(); 0x38: FailUnimpl::fmuld8sux16(); 0x39: FailUnimpl::fmuld8ulx16(); 0x3A: Trap::fpack32({{fault = new IllegalInstruction;}}); 0x3B: Trap::fpack16({{fault = new IllegalInstruction;}}); 0x3D: Trap::fpackfix({{fault = new IllegalInstruction;}}); 0x3E: Trap::pdist({{fault = new IllegalInstruction;}}); 0x48: BasicOperate::faligndata({{ uint64_t msbX = Frs1.udw; uint64_t lsbX = Frs2.udw; //Some special cases need to be split out, first //because they're the most likely to be used, and //second because otherwise, we end up shifting by //greater than the width of the type being shifted, //namely 64, which produces undefined results according //to the C standard. switch(Gsr<2:0>) { case 0: Frd.udw = msbX; break; case 8:
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?