std::string toDecString(uint8_t number) { return toDecString(static_cast<int>(number)); }
InstDataStr InstDecoder::decodeInstStr(const unsigned& src, const bool& useHex) { unsigned opCode; unsigned rs, rt, rd; unsigned c; unsigned funct; std::string opCodeStr; std::string rsStr, rtStr, rdStr; std::string cStr; std::string functStr; opCode = getBitsInRange(src, 26, 32); opCodeStr = InstLookUp::opCodeLookUp(opCode); if (opCodeStr == "undef") { return InstDataStr(); } else if (opCode == 0x0u) { funct = getBitsInRange(src, 0, 6); rs = getBitsInRange(src, 21, 26); rt = getBitsInRange(src, 16, 21); rd = getBitsInRange(src, 11, 16); c = getBitsInRange(src, 6, 11); rsStr = InstLookUp::registerLookUpNumber(rs); rtStr = InstLookUp::registerLookUpNumber(rt); rdStr = InstLookUp::registerLookUpNumber(rd); if (useHex) { cStr = toHexString(c); } else { cStr = toDecString(c); } functStr = InstLookUp::functLookUp(funct); InstDataStr ret; ret.setType(InstType::R); ret.setOpCode(opCodeStr); ret.setRs(rsStr); ret.setRt(rtStr); ret.setRd(rdStr); ret.setC(cStr); ret.setFunct(functStr); return ret; } else if (opCode == 0x02u || opCode == 0x03u) { c = getBitsInRange(src, 0, 26); if (useHex) { cStr = toHexString(c); } else { cStr = toDecString(c); } InstDataStr ret; ret.setType(InstType::J); ret.setOpCode(opCodeStr); ret.setC(cStr); return ret; } else if (opCode == 0x3Fu) { opCodeStr = InstLookUp::opCodeLookUp(opCode); InstDataStr ret; ret.setType(InstType::S); ret.setOpCode(opCodeStr); return ret; } else { rs = getBitsInRange(src, 21, 26); rt = getBitsInRange(src, 16, 21); c = getBitsInRange(src, 0, 16); rsStr = InstLookUp::registerLookUpNumber(rs); rtStr = InstLookUp::registerLookUpNumber(rt); int sc; switch (opCode) { case 0x08u: case 0x23u: case 0x21u: case 0x25u: case 0x20u: case 0x24u: case 0x2Bu: case 0x29u: case 0x28u: case 0x04u: case 0x05u: case 0x07u: sc = toSigned(c, 16); break; default: sc = static_cast<int>(c); } if (useHex) { cStr = toHexString(sc); } else { cStr = toDecString(sc); } InstDataStr ret; ret.setType(InstType::I); ret.setOpCode(opCodeStr); ret.setRs(rsStr); ret.setRt(rtStr); ret.setC(cStr); return ret; } }
std::string toDecString(bool number) { return (number ? toDecString("1") : toDecString("0")); }