decoder.isa
来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· ISA 代码 · 共 1,399 行 · 第 1/5 页
ISA
1,399 行
//////////////////////////////////////////////////////////////////////// The actual decoder specification//decode OP default Unknown::unknown(){ 0x0: decode OP2 { //Throw an illegal instruction acception 0x0: Trap::illtrap({{fault = new IllegalInstruction;}}); format BranchN { //bpcc 0x1: decode COND2 { //Branch Always 0x8: bpa(19, annul_code={{ NPC = xc->readPC() + disp; NNPC = NPC + 4; }}); //Branch Never 0x0: bpn(19, {{;}}, annul_code={{ NNPC = NPC + 8; NPC = NPC + 4; }}); default: decode BPCC { 0x0: bpcci(19, test={{passesCondition(Ccr<3:0>, COND2)}}); 0x2: bpccx(19, test={{passesCondition(Ccr<7:4>, COND2)}}); } } //bicc 0x2: decode COND2 { //Branch Always 0x8: ba(22, annul_code={{ NPC = xc->readPC() + disp; NNPC = NPC + 4; }}); //Branch Never 0x0: bn(22, {{;}}, annul_code={{ NNPC = NPC + 8; NPC = NPC + 4; }}); default: bicc(22, test={{passesCondition(Ccr<3:0>, COND2)}}); } } 0x3: decode RCOND2 { format BranchSplit { 0x1: bpreq(test={{Rs1.sdw == 0}}); 0x2: bprle(test={{Rs1.sdw <= 0}}); 0x3: bprl(test={{Rs1.sdw < 0}}); 0x5: bprne(test={{Rs1.sdw != 0}}); 0x6: bprg(test={{Rs1.sdw > 0}}); 0x7: bprge(test={{Rs1.sdw >= 0}}); } } //SETHI (or NOP if rd == 0 and imm == 0) 0x4: SetHi::sethi({{Rd.udw = imm;}}); //fbpfcc 0x5: decode COND2 { format BranchN { //Branch Always 0x8: fbpa(22, annul_code={{ NPC = xc->readPC() + disp; NNPC = NPC + 4; }}); //Branch Never 0x0: fbpn(22, {{;}}, annul_code={{ NNPC = NPC + 8; NPC = NPC + 4; }}); default: decode BPCC { 0x0: fbpfcc0(19, test= {{passesFpCondition(Fsr<11:10>, COND2)}}); 0x1: fbpfcc1(19, test= {{passesFpCondition(Fsr<33:32>, COND2)}}); 0x2: fbpfcc2(19, test= {{passesFpCondition(Fsr<35:34>, COND2)}}); 0x3: fbpfcc3(19, test= {{passesFpCondition(Fsr<37:36>, COND2)}}); } } } //fbfcc 0x6: decode COND2 { format BranchN { //Branch Always 0x8: fba(22, annul_code={{ NPC = xc->readPC() + disp; NNPC = NPC + 4; }}); //Branch Never 0x0: fbn(22, {{;}}, annul_code={{ NNPC = NPC + 8; NPC = NPC + 4; }}); default: fbfcc(22, test= {{passesFpCondition(Fsr<11:10>, COND2)}}); } } } 0x1: BranchN::call(30, {{ if (Pstate<3:>) R15 = (xc->readPC())<31:0>; else R15 = xc->readPC(); NNPC = R15 + disp; }}); 0x2: decode OP3 { format IntOp { 0x00: add({{Rd = Rs1.sdw + Rs2_or_imm13;}}); 0x01: and({{Rd = Rs1.sdw & Rs2_or_imm13;}}); 0x02: or({{Rd = Rs1.sdw | Rs2_or_imm13;}}); 0x03: xor({{Rd = Rs1.sdw ^ Rs2_or_imm13;}}); 0x04: sub({{Rd = Rs1.sdw - Rs2_or_imm13;}}); 0x05: andn({{Rd = Rs1.sdw & ~Rs2_or_imm13;}}); 0x06: orn({{Rd = Rs1.sdw | ~Rs2_or_imm13;}}); 0x07: xnor({{Rd = ~(Rs1.sdw ^ Rs2_or_imm13);}}); 0x08: addc({{Rd = Rs1.sdw + Rs2_or_imm13 + Ccr<0:0>;}}); 0x09: mulx({{Rd = Rs1.sdw * Rs2_or_imm13;}}); 0x0A: umul({{ Rd = Rs1.udw<31:0> * Rs2_or_imm13<31:0>; Y = Rd<63:32>; }}); 0x0B: smul({{ Rd.sdw = sext<32>(Rs1.sdw<31:0>) * sext<32>(Rs2_or_imm13<31:0>); Y = Rd.sdw<63:32>; }}); 0x0C: subc({{Rd.sdw = Rs1.sdw + (~Rs2_or_imm13) + 1 - Ccr<0:0>}}); 0x0D: udivx({{ if(Rs2_or_imm13 == 0) fault = new DivisionByZero; else Rd.udw = Rs1.udw / Rs2_or_imm13; }}); 0x0E: udiv({{ if(Rs2_or_imm13 == 0) fault = new DivisionByZero; else { Rd.udw = ((Y << 32) | Rs1.udw<31:0>) / Rs2_or_imm13; if(Rd.udw >> 32 != 0) Rd.udw = 0xFFFFFFFF; } }}); 0x0F: sdiv({{ if(Rs2_or_imm13.sdw == 0) fault = new DivisionByZero; else { Rd.udw = ((int64_t)((Y << 32) | Rs1.sdw<31:0>)) / Rs2_or_imm13.sdw; if((int64_t)Rd.udw >= std::numeric_limits<int32_t>::max()) Rd.udw = 0x7FFFFFFF; else if((int64_t)Rd.udw <= std::numeric_limits<int32_t>::min()) Rd.udw = ULL(0xFFFFFFFF80000000); } }}); } format IntOpCc { 0x10: addcc({{ int64_t res, op1 = Rs1, op2 = Rs2_or_imm13; Rd = res = op1 + op2; }}); 0x11: IntOpCcRes::andcc({{Rd = Rs1 & Rs2_or_imm13;}}); 0x12: IntOpCcRes::orcc({{Rd = Rs1 | Rs2_or_imm13;}}); 0x13: IntOpCcRes::xorcc({{Rd = Rs1 ^ Rs2_or_imm13;}}); 0x14: subcc({{ int64_t res, op1 = Rs1, op2 = Rs2_or_imm13; Rd = res = op1 - op2; }}, sub=True); 0x15: IntOpCcRes::andncc({{Rd = Rs1 & ~Rs2_or_imm13;}}); 0x16: IntOpCcRes::orncc({{Rd = Rs1 | ~Rs2_or_imm13;}}); 0x17: IntOpCcRes::xnorcc({{Rd = ~(Rs1 ^ Rs2_or_imm13);}}); 0x18: addccc({{ int64_t res, op1 = Rs1, op2 = Rs2_or_imm13; Rd = res = op1 + op2 + Ccr<0:>; }}); 0x1A: IntOpCcRes::umulcc({{ uint64_t resTemp; Rd = resTemp = Rs1.udw<31:0> * Rs2_or_imm13.udw<31:0>; Y = resTemp<63:32>;}}); 0x1B: IntOpCcRes::smulcc({{ int64_t resTemp; Rd = resTemp = sext<32>(Rs1.sdw<31:0>) * sext<32>(Rs2_or_imm13<31:0>); Y = resTemp<63:32>;}}); 0x1C: subccc({{ int64_t res, op1 = Rs1, op2 = Rs2_or_imm13; Rd = res = op1 - op2 - Ccr<0:>; }}, sub=True); 0x1D: IntOpCcRes::udivxcc({{ if(Rs2_or_imm13.udw == 0) fault = new DivisionByZero; else Rd = Rs1.udw / Rs2_or_imm13.udw;}}); 0x1E: IntOpCcRes::udivcc({{ uint32_t resTemp, val2 = Rs2_or_imm13.udw; int32_t overflow = 0; if(val2 == 0) fault = new DivisionByZero; else { resTemp = (uint64_t)((Y << 32) | Rs1.udw<31:0>) / val2; overflow = (resTemp<63:32> != 0); if(overflow) Rd = resTemp = 0xFFFFFFFF; else Rd = resTemp; } }}, iv={{overflow}}); 0x1F: IntOpCcRes::sdivcc({{ int64_t val2 = Rs2_or_imm13.sdw<31:0>; bool overflow = false, underflow = false; if(val2 == 0) fault = new DivisionByZero; else { Rd = (int64_t)((Y << 32) | Rs1.sdw<31:0>) / val2; overflow = ((int64_t)Rd >= std::numeric_limits<int32_t>::max()); underflow = ((int64_t)Rd <= std::numeric_limits<int32_t>::min()); if(overflow) Rd = 0x7FFFFFFF; else if(underflow) Rd = ULL(0xFFFFFFFF80000000); } }}, iv={{overflow || underflow}}); 0x20: taddcc({{ int64_t res, op1 = Rs1, op2 = Rs2_or_imm13; Rd = res = Rs1 + op2; }}, iv={{ (op1 & mask(2)) || (op2 & mask(2)) || findOverflow(32, res, op1, op2) }}); 0x21: tsubcc({{ int64_t res, op1 = Rs1, op2 = Rs2_or_imm13; Rd = res = Rs1 - op2; }}, iv={{ (op1 & mask(2)) || (op2 & mask(2)) || findOverflow(32, res, op1, ~op2) }}, sub=True); 0x22: taddcctv({{ int64_t res, op1 = Rs1, op2 = Rs2_or_imm13; Rd = res = op1 + op2; bool overflow = (op1 & mask(2)) || (op2 & mask(2)) || findOverflow(32, res, op1, op2); if(overflow) fault = new TagOverflow; }}, iv={{overflow}}); 0x23: tsubcctv({{ int64_t res, op1 = Rs1, op2 = Rs2_or_imm13; Rd = res = op1 - op2; bool overflow = (op1 & mask(2)) || (op2 & mask(2)) || findOverflow(32, res, op1, ~op2); if(overflow) fault = new TagOverflow; }}, iv={{overflow}}, sub=True); 0x24: mulscc({{ int32_t savedLSB = Rs1<0:>; //Step 1 int64_t multiplicand = Rs2_or_imm13; //Step 2 int32_t partialP = Rs1<31:1> | ((Ccr<3:3> ^ Ccr<1:1>) << 31); //Step 3 int32_t added = Y<0:> ? multiplicand : 0; int64_t res, op1 = partialP, op2 = added; Rd = res = partialP + added; //Steps 4 & 5 Y = Y<31:1> | (savedLSB << 31); }}); } format IntOp { 0x25: decode X { 0x0: sll({{Rd = Rs1 << (I ? SHCNT32 : Rs2<4:0>);}}); 0x1: sllx({{Rd = Rs1 << (I ? SHCNT64 : Rs2<5:0>);}}); } 0x26: decode X { 0x0: srl({{Rd = Rs1.uw >> (I ? SHCNT32 : Rs2<4:0>);}}); 0x1: srlx({{Rd = Rs1.udw >> (I ? SHCNT64 : Rs2<5:0>);}}); } 0x27: decode X { 0x0: sra({{Rd = Rs1.sw >> (I ? SHCNT32 : Rs2<4:0>);}}); 0x1: srax({{Rd = Rs1.sdw >> (I ? SHCNT64 : Rs2<5:0>);}}); }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?