decoder.isa

来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· ISA 代码 · 共 1,286 行 · 第 1/5 页

ISA
1,286
字号
                                NewEntry.C1 = (uint8_t)((EntryLo1 >> 3) & 0x7);                                /* Now, compute the AddrShiftAmount and OffsetMask - TLB optimizations */                                /* Addr Shift Amount for 1KB or larger pages */                                //	    warn("PTE->Mask: %x\n",pte->Mask);                                if((NewEntry.Mask & 0xFFFF) == 3){                                  NewEntry.AddrShiftAmount = 12;                                } else if((NewEntry.Mask & 0xFFFF) == 0x0000){                                  NewEntry.AddrShiftAmount = 10;                                } else if((NewEntry.Mask & 0xFFFC) == 0x000C){                                  NewEntry.AddrShiftAmount = 14;                                } else if((NewEntry.Mask & 0xFFF0) == 0x0030){                                  NewEntry.AddrShiftAmount = 16;                                } else if((NewEntry.Mask & 0xFFC0) == 0x00C0){                                  NewEntry.AddrShiftAmount = 18;                                } else if((NewEntry.Mask & 0xFF00) == 0x0300){                                  NewEntry.AddrShiftAmount = 20;                                } else if((NewEntry.Mask & 0xFC00) == 0x0C00){                                  NewEntry.AddrShiftAmount = 22;                                } else if((NewEntry.Mask & 0xF000) == 0x3000){                                  NewEntry.AddrShiftAmount = 24;                                } else if((NewEntry.Mask & 0xC000) == 0xC000){                                  NewEntry.AddrShiftAmount = 26;                                } else if((NewEntry.Mask & 0x30000) == 0x30000){                                  NewEntry.AddrShiftAmount = 28;                                } else {                                  fatal("Invalid Mask Pattern Detected!\n");                                }                                NewEntry.OffsetMask = ((1<<NewEntry.AddrShiftAmount)-1);                                MipsISA::TLB *Ptr=xc->tcBase()->getITBPtr();                                MiscReg c3=xc->readMiscReg(MipsISA::Config3);                                MiscReg pg=xc->readMiscReg(MipsISA::PageGrain);                                int SP=0;                                if(bits(c3,Config3_SP)==1 && bits(pg,PageGrain_ESP)==1){                                  SP=1;                                }                                Ptr->insertAt(NewEntry,Random,SP);                }});                0x08: tlbp({{                               int TLB_Index;                               Addr VPN;                               if(PageGrain_ESP == 1 && Config3_SP ==1){                                 VPN = EntryHi >> 11;                               } else {                                 VPN = ((EntryHi >> 11) & 0xFFFFFFFC); // Mask off lower 2 bits                               }                               TLB_Index = xc->tcBase()->getITBPtr()->probeEntry(VPN,EntryHi_ASID);                               if(TLB_Index != -1){  // Check TLB for entry matching EntryHi                                 Index=TLB_Index;                                 //			    warn("\ntlbp: Match Found!\n");                               } else {// else, set Index = 1<<31                                 Index = (1<<31);                               }                        }});              }              format CP0Unimpl {                0x20: wait();              }               default: CP0Unimpl::unknown();            }        }        //Table A-13 MIPS32 COP1 Encoding of rs Field        0x1: decode RS_MSB {            0x0: decode RS_HI {                0x0: decode RS_LO {                    format CP1Control {                        0x0: mfc1 ({{ Rt.uw = Fs.uw; }});                        0x2: cfc1({{                            switch (FS)                            {                              case 0:                                Rt = FIR;                                break;                              case 25:                                Rt = 0 | (FCSR & 0xFE000000) >> 24 | (FCSR & 0x00800000) >> 23;                                break;                              case 26:                                Rt = 0 | (FCSR & 0x0003F07C);                                break;                              case 28:                                Rt = 0 | (FCSR & 0x00000F80) | (FCSR & 0x01000000) >> 21 | (FCSR & 0x00000003);                                break;                              case 31:                                Rt = FCSR;                                break;                              default:                                warn("FP Control Value (%d) Not Valid");                            }                            //			    warn("FCSR: %x, FS: %d, FIR: %x, Rt: %x\n",FCSR, FS, FIR, Rt);                        }});                        0x3: mfhc1({{ Rt.uw = Fs.ud<63:32>;}});                        0x4: mtc1 ({{ Fs.uw = Rt.uw;       }});                        0x6: ctc1({{                            switch (FS)                            {                              case 25:                                FCSR = 0 | (Rt.uw<7:1> << 25) // move 31...25                                    | (FCSR & 0x01000000) // bit 24                                    | (FCSR & 0x004FFFFF);// bit 22...0                                break;                              case 26:                                FCSR = 0 | (FCSR & 0xFFFC0000) // move 31...18                                    | Rt.uw<17:12> << 12           // bit 17...12                                    | (FCSR & 0x00000F80) << 7// bit 11...7                                    | Rt.uw<6:2> << 2              // bit 6...2                                    | (FCSR & 0x00000002);     // bit 1...0                                break;                              case 28:                                FCSR = 0 | (FCSR & 0xFE000000) // move 31...25                                    | Rt.uw<2:2> << 24       // bit 24                                    | (FCSR & 0x00FFF000) << 23// bit 23...12                                    | Rt.uw<11:7> << 7       // bit 24                                    | (FCSR & 0x000007E)                                    | Rt.uw<1:0>;// bit 22...0                                break;                              case 31:                                FCSR  = Rt.uw;                                break;                              default:                                panic("FP Control Value (%d) Not Available. Ignoring Access to"                                      "Floating Control Status Register", FS);                            }                        }});                        0x7: mthc1({{                             uint64_t fs_hi = Rt.uw;                             uint64_t fs_lo = Fs.ud & 0x0FFFFFFFF;                             Fs.ud = (fs_hi << 32) | fs_lo;                        }});                    }                    format CP1Unimpl {                      0x1: dmfc1();                      0x5: dmtc1();                    }                   }                0x1:                   decode RS_LO {                     0x0:                     decode ND {                       format Branch {                         0x0: decode TF {                           0x0: bc1f({{ cond = getCondCode(FCSR, BRANCH_CC) == 0;                                       }});                           0x1: bc1t({{ cond = getCondCode(FCSR, BRANCH_CC) == 1;                                       }});                         }                         0x1: decode TF {                           0x0: bc1fl({{ cond = getCondCode(FCSR, BRANCH_CC) == 0;                                        }}, Likely);                           0x1: bc1tl({{ cond = getCondCode(FCSR, BRANCH_CC) == 1;                                        }}, Likely);                         }                       }                     }                   format CP1Unimpl {                     0x1: bc1any2();                     0x2: bc1any4();                     default: unknown();                   }                   }            }            0x1: decode RS_HI {                0x2: decode RS_LO {                    //Table A-14 MIPS32 COP1 Encoding of Function Field When rs=S                    //(( single-precision floating point))                    0x0: decode FUNCTION_HI {                        0x0: decode FUNCTION_LO {                            format FloatOp {                                0x0: add_s({{ Fd.sf = Fs.sf + Ft.sf;}});                                0x1: sub_s({{ Fd.sf = Fs.sf - Ft.sf;}});                                0x2: mul_s({{ Fd.sf = Fs.sf * Ft.sf;}});                                0x3: div_s({{ Fd.sf = Fs.sf / Ft.sf;}});                                0x4: sqrt_s({{ Fd.sf = sqrt(Fs.sf);}});                                0x5: abs_s({{ Fd.sf = fabs(Fs.sf);}});                                0x7: neg_s({{ Fd.sf = -Fs.sf;}});                            }                            0x6: BasicOp::mov_s({{ Fd.sf = Fs.sf;}});                        }                        0x1: decode FUNCTION_LO {                            format FloatConvertOp {                                0x0: round_l_s({{ val = Fs.sf; }}, ToLong,                                               Round);                                0x1: trunc_l_s({{ val = Fs.sf; }}, ToLong,                                               Trunc);                                0x2: ceil_l_s({{ val = Fs.sf; }}, ToLong,                                               Ceil);                                0x3: floor_l_s({{ val = Fs.sf; }}, ToLong,                                               Floor);                                0x4: round_w_s({{ val = Fs.sf; }}, ToWord,                                               Round);                                0x5: trunc_w_s({{ val = Fs.sf; }}, ToWord,                                               Trunc);                                0x6: ceil_w_s({{ val = Fs.sf; }}, ToWord,                                               Ceil);                                0x7: floor_w_s({{ val = Fs.sf; }}, ToWord,                                               Floor);                            }                        }                        0x2: decode FUNCTION_LO {                            0x1: decode MOVCF {                                format BasicOp {                                    0x0: movf_s({{ Fd = (getCondCode(FCSR,CC) == 0) ? Fs : Fd; }});                                    0x1: movt_s({{ Fd = (getCondCode(FCSR,CC) == 1) ? Fs : Fd; }});                                }                            }                            format BasicOp {                                0x2: movz_s({{ Fd = (Rt == 0) ? Fs : Fd; }});                                0x3: movn_s({{ Fd = (Rt != 0) ? Fs : Fd; }});                            }                            format FloatOp {                                0x5: recip_s({{ Fd = 1 / Fs; }});                                0x6: rsqrt_s({{ Fd = 1 / sqrt(Fs);}});                            }                            format CP1Unimpl {                              default: unknown();                            }                        }                        0x3: CP1Unimpl::unknown();                        0x4: decode FUNCTION_LO {                            format FloatConvertOp {                                0x1: cvt_d_s({{ val = Fs.sf; }}, ToDouble);                                0x4: cvt_w_s({{ val = Fs.sf; }}, ToWord);                                0x5: cvt_l_s({{ val = Fs.sf; }}, ToLong);                            }                            0x6: FloatOp::cvt_ps_s({{                                    Fd.ud = (uint64_t) Fs.uw << 32 |                                            (uint64_t) Ft.uw;                                }});                            format CP1Unimpl {                              default: unknown();                            }                        }                        0x5: CP1Unimpl::unknown();                        0x6: decode FUNCTION_LO {                            format FloatCompareOp {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?