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 + -
显示快捷键?