base.isa

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

ISA
550
字号
                    switch (reg - MaxMicroReg) {                      case 1:                        ccprintf(os, "%%y");                        break;                      case 2:                        ccprintf(os, "%%ccr");                        break;                      case 3:                        ccprintf(os, "%%cansave");                        break;                      case 4:                        ccprintf(os, "%%canrestore");                        break;                      case 5:                        ccprintf(os, "%%cleanwin");                        break;                      case 6:                        ccprintf(os, "%%otherwin");                        break;                      case 7:                        ccprintf(os, "%%wstate");                        break;                    }                }            } else if (reg < Ctrl_Base_DepTag) {                ccprintf(os, "%%f%d", reg - FP_Base_DepTag);            } else {                switch (reg - Ctrl_Base_DepTag) {                  case MISCREG_ASI:                    ccprintf(os, "%%asi");                    break;                  case MISCREG_FPRS:                    ccprintf(os, "%%fprs");                    break;                  case MISCREG_PCR:                    ccprintf(os, "%%pcr");                    break;                  case MISCREG_PIC:                    ccprintf(os, "%%pic");                    break;                  case MISCREG_GSR:                    ccprintf(os, "%%gsr");                    break;                  case MISCREG_SOFTINT:                    ccprintf(os, "%%softint");                    break;                  case MISCREG_SOFTINT_SET:                    ccprintf(os, "%%softint_set");                    break;                  case MISCREG_SOFTINT_CLR:                    ccprintf(os, "%%softint_clr");                    break;                  case MISCREG_TICK_CMPR:                    ccprintf(os, "%%tick_cmpr");                    break;                  case MISCREG_STICK:                    ccprintf(os, "%%stick");                    break;                  case MISCREG_STICK_CMPR:                    ccprintf(os, "%%stick_cmpr");                    break;                  case MISCREG_TPC:                    ccprintf(os, "%%tpc");                    break;                  case MISCREG_TNPC:                    ccprintf(os, "%%tnpc");                    break;                  case MISCREG_TSTATE:                    ccprintf(os, "%%tstate");                    break;                  case MISCREG_TT:                    ccprintf(os, "%%tt");                    break;                  case MISCREG_TICK:                    ccprintf(os, "%%tick");                    break;                  case MISCREG_TBA:                    ccprintf(os, "%%tba");                    break;                  case MISCREG_PSTATE:                    ccprintf(os, "%%pstate");                    break;                  case MISCREG_TL:                    ccprintf(os, "%%tl");                    break;                  case MISCREG_PIL:                    ccprintf(os, "%%pil");                    break;                  case MISCREG_CWP:                    ccprintf(os, "%%cwp");                    break;                  case MISCREG_GL:                    ccprintf(os, "%%gl");                    break;                  case MISCREG_HPSTATE:                    ccprintf(os, "%%hpstate");                    break;                  case MISCREG_HTSTATE:                    ccprintf(os, "%%htstate");                    break;                  case MISCREG_HINTP:                    ccprintf(os, "%%hintp");                    break;                  case MISCREG_HTBA:                    ccprintf(os, "%%htba");                    break;                  case MISCREG_HSTICK_CMPR:                    ccprintf(os, "%%hstick_cmpr");                    break;                  case MISCREG_HVER:                    ccprintf(os, "%%hver");                    break;                  case MISCREG_STRAND_STS_REG:                    ccprintf(os, "%%strand_sts_reg");                    break;                  case MISCREG_FSR:                    ccprintf(os, "%%fsr");                    break;                  default:                    ccprintf(os, "%%ctrl%d", reg - Ctrl_Base_DepTag);                }            }        }        std::string SparcStaticInst::generateDisassembly(Addr pc,            const SymbolTable *symtab) const        {            std::stringstream ss;            printMnemonic(ss, mnemonic);            // just print the first two source regs... if there's            // a third one, it's a read-modify-write dest (Rc),            // e.g. for CMOVxx            if(_numSrcRegs > 0)            {                printReg(ss, _srcRegIdx[0]);            }            if(_numSrcRegs > 1)            {                ss << ",";                printReg(ss, _srcRegIdx[1]);            }            // just print the first dest... if there's a second one,            // it's generally implicit            if(_numDestRegs > 0)            {                if(_numSrcRegs > 0)                    ss << ",";                    printReg(ss, _destRegIdx[0]);            }            return ss.str();        }        bool passesFpCondition(uint32_t fcc, uint32_t condition)        {            bool u = (fcc == 3);            bool g = (fcc == 2);            bool l = (fcc == 1);            bool e = (fcc == 0);            switch(condition)            {              case FAlways:                return 1;              case FNever:                return 0;              case FUnordered:                return u;              case FGreater:                return g;              case FUnorderedOrGreater:                return u || g;              case FLess:                return l;              case FUnorderedOrLess:                return u || l;              case FLessOrGreater:                return l || g;              case FNotEqual:                return l || g || u;              case FEqual:                return e;              case FUnorderedOrEqual:                return u || e;              case FGreaterOrEqual:                return g || e;              case FUnorderedOrGreaterOrEqual:                return u || g || e;              case FLessOrEqual:                return l || e;              case FUnorderedOrLessOrEqual:                return u || l || e;              case FOrdered:                return e || l || g;            }            panic("Tried testing condition nonexistant "                    "condition code %d", condition);        }        bool passesCondition(uint32_t codes, uint32_t condition)        {            CondCodes condCodes;            condCodes.bits =  0;            condCodes.c = codes & 0x1 ? 1 : 0;            condCodes.v = codes & 0x2 ? 1 : 0;            condCodes.z = codes & 0x4 ? 1 : 0;            condCodes.n = codes & 0x8 ? 1 : 0;            switch(condition)            {              case Always:                return true;              case Never:                return false;              case NotEqual:                return !condCodes.z;              case Equal:                return condCodes.z;              case Greater:                return !(condCodes.z | (condCodes.n ^ condCodes.v));              case LessOrEqual:                return condCodes.z | (condCodes.n ^ condCodes.v);              case GreaterOrEqual:                return !(condCodes.n ^ condCodes.v);              case Less:                return (condCodes.n ^ condCodes.v);              case GreaterUnsigned:                return !(condCodes.c | condCodes.z);              case LessOrEqualUnsigned:                return (condCodes.c | condCodes.z);              case CarryClear:                return !condCodes.c;              case CarrySet:                return condCodes.c;              case Positive:                return !condCodes.n;              case Negative:                return condCodes.n;              case OverflowClear:                return !condCodes.v;              case OverflowSet:                return condCodes.v;            }            panic("Tried testing condition nonexistant "                    "condition code %d", condition);        }}};output exec {{    /// Check "FP enabled" machine status bit.  Called when executing any FP    /// instruction in full-system mode.    /// @retval Full-system mode: NoFault if FP is enabled, FpDisabled    /// if not.  Non-full-system mode: always returns NoFault.#if FULL_SYSTEM    inline Fault checkFpEnableFault(%(CPU_exec_context)s *xc)    {        Fault fault = NoFault;	// dummy... this ipr access should not fault        if (xc->readMiscReg(MISCREG_PSTATE) & PSTATE::pef &&            xc->readMiscReg(MISCREG_FPRS) & 0x4)            return NoFault;        else            return new FpDisabled;    }#else    inline Fault checkFpEnableFault(%(CPU_exec_context)s *xc)    {        return NoFault;    }#endif}};

⌨️ 快捷键说明

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