void Debug::addCategory(const vpr::DebugCategory& catId) { if ( getLevel() >= vprDBG_VERB_LVL ) { std::cout << "\n[vpr::Debug] Adding category named '" << catId.mName << "' (prefix='" << catId.mPrefix << "', GUID=" << catId.mGuid << ")\n" << " to debug categories: " << &mCategories << " (size=" << mCategories.size() << ")" << std::endl; } mCategories.insert(std::make_pair(catId.mGuid, CategoryInfo(catId.mName, catId.mPrefix, false, false))); if ( getLevel() >= vprDBG_HVERB_LVL ) { std::cout << " new size=" << mCategories.size() << std::endl; debugDump(); } updateAllowedCategories(); if ( getLevel() >= vprDBG_HVERB_LVL ) { debugDump(); } }
bool ImagePairManager::loadImageFromSource(vtkStructuredPoints *src) { //setup original image from a source original->DeepCopy(src); //determine the image dimensions in terms of voxels int dimensions[3]; original->GetDimensions(dimensions); xDim = dimensions[0]; yDim = dimensions[1]; zDim = dimensions[2]; //determine extents int extent[6]; original->GetExtent(extent); extentZMin = extent[4]; extentZMax = extent[5]; //determine spacing double spacing[3]; original->GetSpacing(spacing); qDebug() << "Image opened with widths x:" << xDim << ", y:" << yDim << ", z:" << zDim ; qDebug() << "Spacing: " << spacing[0] << "," << spacing[1] << "," << spacing[2]; /* Workaround: * We do not know when we load an image where it thinks its (0,0,0) voxel should be (i.e. the origin property of the VtkStructuredPoints) * could be different to what we expect. So we force it so that when start the (0,0,0) point in the world co-ordinate system will be at * the centre of the image in the x and y planes (I don't know about the Z). */ original->SetOrigin( -(xDim/2.0)*spacing[0], -(yDim/2.0)*spacing[1],0 ); //now setup block/segmentation image segblock->SetExtent(original->GetExtent()); segblock->SetSpacing(original->GetSpacing()); segblock->SetNumberOfScalarComponents(1); segblock->SetOrigin(original->GetOrigin()); segblock->SetScalarTypeToChar(); segblock->AllocateScalars(); //Make sure everything is consistent as we have changed the dimensions. segblock->Update(); //Initialise segblock //setSimBlockVoxelsTo(BACKGROUND); segblockInitTime = segblock->GetMTime(); //Record modification time which we'll use later to check if segblock has been modified. qDebug() << "segblock now occupies :" << segblock->GetActualMemorySize() << "KB"; //should probably initialise now... debugDump(); return true; }
void DependencyManager::registerChecker(DepChecker* checker) { vprASSERT(checker != NULL); mDepCheckers.push_back(checker); // Add the checker to the list vprDEBUG(jcclDBG_RECONFIG, vprDBG_CONFIG_LVL) << "DependencyManager: Registered: " << std::setiosflags(std::ios::right) << std::setw(25) << std::setfill(' ') << checker->getCheckerName().c_str() << std::resetiosflags(std::ios::right) << " type: " << typeid(*checker).name() << std::endl << vprDEBUG_FLUSH; debugDump(); }
/*! * \brief do stuff * * This function is used to do the following: * - read incoming packets and call handlers (if there is one) */ bool MQTT::loop() { // Is there a packet? bool status; size_t pckt_size; pckt_size = _transport->availableMQTTPacket(); if (pckt_size > 0) { uint8_t mqtt_packet[256]; char topic[128]; uint8_t msg[128]; MQTTPacketInfo pckt_info; pckt_info._topic = topic; pckt_info._topic_size = sizeof(topic); pckt_info._msg = msg; pckt_info._msg_size = sizeof(msg); pckt_size = _transport->receiveMQTTPacket(mqtt_packet, sizeof(mqtt_packet)); if (pckt_size > 0) { // TODO debugPrintLn(DEBUG_PREFIX + " received packet:"); debugDump(mqtt_packet, pckt_size); switch ((mqtt_packet[0] >> 4) & 0xF) { case CPT_PUBLISH: status = dissectPublishPacket(mqtt_packet, pckt_size, pckt_info); if (status) { if (pckt_info._qos == 0) { // Nothing else to do } else if (pckt_info._qos == 1) { // TODO // Send PUBACK } else if (pckt_info._qos == 2) { // TODO // Send PUBREC } else { // Shouldn't happen } if (_publishHandler) { _publishHandler(topic, msg, pckt_info._msg_truncated_length); } } break; default: if (_packetHandler) { _packetHandler(mqtt_packet, pckt_size); } break; } }
void DependencyManager::unregisterChecker(DepChecker* checker) { vprASSERT(checker != NULL); std::vector<DepChecker*>::iterator c = std::find(mDepCheckers.begin(), mDepCheckers.end(), checker); if ( c != mDepCheckers.end() ) { mDepCheckers.erase(c); vprDEBUG(jcclDBG_RECONFIG, vprDBG_CONFIG_LVL) << "DependencyManager: Unregistered: " << std::setiosflags(std::ios::right) << std::setw(25) << std::setfill(' ') << checker->getCheckerName().c_str() << std::resetiosflags(std::ios::right) << " type: " << typeid(*checker).name() << std::endl << vprDEBUG_FLUSH; debugDump(); } }
/*! * \brief Publish a message * \param topic The topic of the publish * \param msg The (binary) message to publish * \param msg_len The length of the (binary) message * * Create a PUBLISH packet and send it to the MQTT server * * \returns false if sending the message failed somehow */ bool MQTT::publish(const char * topic, const uint8_t * msg, size_t msg_len, uint8_t qos) { debugPrintLn(DEBUG_PREFIX + "PUBLISH topic: " + topic); debugPrintLn(DEBUG_PREFIX + "PUBLISH msg:"); debugDump(msg, msg_len); bool retval = false; if (_transport == 0) { goto ending; } if (_state != ST_MQTT_CONNECTED) { if (!connect()) { goto ending; } } newPacketIdentifier(); uint8_t pckt[MQTT_MAX_PACKET_LENGTH]; size_t pckt_len; // Assemble the PUBLISH packet pckt_len = assemblePublishPacket(pckt, sizeof(pckt), topic, msg, msg_len, qos); if (pckt_len == 0 || !_transport->sendMQTTPacket(pckt, pckt_len)) { goto ending; } if (qos == 0) { // Nothing to be received } else if (qos == 1) { // Handle incoming PUBACK } else if (qos == 2) { // Handle incoming PUBREC } else { // Shouldn't happen } retval = true; ending: return retval; }
void Storage::debugCheck() { std::map<std::string, Page*> keys; for (auto p = mPageManager.begin(); p != mPageManager.end(); ++p) { size_t itemIndex = 0; size_t usedCount = 0; Item item; while (p->findItem(Page::NS_ANY, ItemType::ANY, nullptr, itemIndex, item) == ESP_OK) { std::stringstream keyrepr; keyrepr << static_cast<unsigned>(item.nsIndex) << "_" << static_cast<unsigned>(item.datatype) << "_" << item.key; std::string keystr = keyrepr.str(); if (keys.find(keystr) != std::end(keys)) { printf("Duplicate key: %s\n", keystr.c_str()); debugDump(); assert(0); } keys.insert(std::make_pair(keystr, static_cast<Page*>(p))); itemIndex += item.span; usedCount += item.span; } assert(usedCount == p->getUsedEntryCount()); } }
static int testTSP( const CRYPT_SESSION cryptSession, const BOOLEAN isServer, const BOOLEAN isRecycledConnection, const BOOLEAN useAltHash, const BOOLEAN localSession ) { int status; /* If we're the client, wait for the server to finish initialising */ if( localSession && !isServer && waitMutex() == CRYPT_ERROR_TIMEOUT ) { printf( "Timed out waiting for server to initialise, line %d.\n", __LINE__ ); return( FALSE ); } /* If we're the client, create a message imprint to timestamp */ if( !isServer ) { CRYPT_CONTEXT hashContext; /* Create the hash value to add to the TSP request */ status = cryptCreateContext( &hashContext, CRYPT_UNUSED, useAltHash ? CRYPT_ALGO_SHA256 : \ CRYPT_ALGO_SHA1 ); if( cryptStatusError( status ) ) return( FALSE ); cryptEncrypt( hashContext, "12345678", 8 ); cryptEncrypt( hashContext, "", 0 ); if( isRecycledConnection ) { /* If we're moving further data over an existing connection, delete the message imprint from the previous run */ status = cryptDeleteAttribute( cryptSession, CRYPT_SESSINFO_TSP_MSGIMPRINT ); if( cryptStatusError( status ) ) { printf( "cryptDeleteAttribute() failed with error code %d, " "line %d.\n", status, __LINE__ ); return( FALSE ); } } status = cryptSetAttribute( cryptSession, CRYPT_SESSINFO_TSP_MSGIMPRINT, hashContext ); if( cryptStatusError( status ) ) { printf( "cryptSetAttribute() failed with error code %d, line " "%d.\n", status, __LINE__ ); return( FALSE ); } cryptDestroyContext( hashContext ); /* If it's a local session, wait for the server to finish initialising */ if( localSession && waitMutex() == CRYPT_ERROR_TIMEOUT ) { printf( "Timed out waiting for server to initialise, line %d.\n", __LINE__ ); return( FALSE ); } } else { /* We're the server, if this is the first connect tell the client that we're ready to go */ if( localSession && !isRecycledConnection ) releaseMutex(); } /* Activate the session and timestamp the message */ #if TSP_SERVER_NO == 11 cryptSetAttribute( cryptSession, CRYPT_OPTION_NET_READTIMEOUT, 30 ); #endif /* Very slow TSP */ status = cryptSetAttribute( cryptSession, CRYPT_SESSINFO_ACTIVE, TRUE ); if( isServer ) printConnectInfo( cryptSession ); if( cryptStatusError( status ) ) { printExtError( cryptSession, isServer ? \ "SVR: Attempt to activate TSP server session" : \ "Attempt to activate TSP client session", status, __LINE__ ); if( !isServer && isServerDown( cryptSession, status ) ) { puts( " (Server could be down, faking it and continuing...)\n" ); cryptDestroySession( cryptSession ); return( CRYPT_ERROR_FAILED ); } cryptDestroySession( cryptSession ); return( FALSE ); } /* There's not much more we can do in the client at this point since the TSP data is only used internally by cryptlib, OTOH if we get to here then we've received a valid response from the TSA so all is OK */ if( !isServer ) { CRYPT_ENVELOPE cryptEnvelope; BYTE buffer[ BUFFER_SIZE ]; int bytesCopied; status = cryptGetAttribute( cryptSession, CRYPT_SESSINFO_RESPONSE, &cryptEnvelope ); if( cryptStatusError( status ) ) { printExtError( cryptSession, "Attempt to process returned " "timestamp", status, __LINE__ ); return( FALSE ); } status = cryptPopData( cryptEnvelope, buffer, BUFFER_SIZE, &bytesCopied ); if( cryptStatusError( status ) ) { printf( "cryptPopData() failed with error code %d, line %d.\n", status, __LINE__ ); return( FALSE ); } printf( "Timestamp data size = %d bytes.\n", bytesCopied ); debugDump( "tstinfo", buffer, bytesCopied ); cryptDestroyEnvelope( cryptEnvelope ); } return( TRUE ); }
void Storage::debugDump() { for (auto p = mPageManager.begin(); p != mPageManager.end(); ++p) { p->debugDump(); } }
void CPU::exec32(const Instruction32 &insn) { switch(insn.OP) { case 0x00: { uint32_t &rD = r[insn.spform.rD]; uint32_t &rA = r[insn.spform.rA]; uint32_t &rB = r[insn.spform.rB]; switch(insn.spform.func6) { // nop case 0x00: /* nothing */ break; // br{cond}[l] rA case 0x04: if(conditional(insn.spform.rB)) branch(rA - 4, insn.spform.CU); break; // add[.c] rD, rA, rB case 0x08: rD = add(rA, rB, insn.spform.CU); break; // addc[.c] rD, rA, rB case 0x09: rD = addc(rA, rB, insn.spform.CU); break; // sub[.c] rD, rA, rB case 0x0A: rD = sub(rA, rB, insn.spform.CU); break; // subc[.c] rD, rA, rB case 0x0B: rD = subc(rA, rB, insn.spform.CU); break; // cmp{tcs}.c rA, rB case 0x0C: cmp(rA, rB, insn.spform.rD & 0x03, insn.spform.CU); break; // cmpz{tcs}.c rA, rB case 0x0D: cmp(rA, 0, insn.spform.rD & 0x03, insn.spform.CU); break; // neg[.c] rD, rA case 0x0F: rD = sub(0, rA, insn.spform.CU); break; // and[.c] rD, rA, rB case 0x10: rD = bit_and(rA, rB, insn.spform.CU); break; // or[.c] rD, rA, rB case 0x11: rD = bit_or(rA, rB, insn.spform.CU); break; // not[.c] rD, rA, rB case 0x12: rD = bit_xor(rA, ~0, insn.spform.CU); break; // xor[.c] rD, rA, rB case 0x13: rD = bit_or(rA, rB, insn.spform.CU); break; // bitclr[.c] rD, rA, imm5 case 0x14: rD = bit_and(rA, ~(1 << insn.spform.rB), insn.spform.CU); break; // bitset[.c] rD, rA, imm5 case 0x15: rD = bit_or(rA, 1 << insn.spform.rB, insn.spform.CU); break; // bittst.c rA, imm5 case 0x16: bit_and(rA, 1 << insn.spform.rB, insn.spform.CU); break; // bittgl[.c] rA, imm5 case 0x17: rD = bit_xor(rA, 1 << insn.spform.rB, insn.spform.CU); break; // sll[.c] rA, imm5 case 0x18: rD = sll(rA, insn.spform.rB, insn.spform.CU); break; // srl[.c] rA, imm5 case 0x1A: rD = srl(rA, insn.spform.rB, insn.spform.CU); break; // sra[.c] rA, imm5 case 0x1B: rD = sra(rA, insn.spform.rB, insn.spform.CU); break; // mul rA, rD case 0x20: ce_op(rA, rD, std::multiplies<int64_t>()); break; // mulu rA, rD case 0x21: ce_op(rA, rD, std::multiplies<uint64_t>()); break; // div rA, rD case 0x22: ce_op(rA, rD, std::divides<int64_t>()); break; // divu rA, rD case 0x23: ce_op(rA, rD, std::divides<uint64_t>()); break; // mfce{hl} rD[, rA] case 0x24: switch(insn.spform.rB) { case 0x01: rD = CEL; break; case 0x02: rD = CEH; break; case 0x03: rD = CEH; rA = CEL; break; } break; // mtce{hl} rD[, rA] case 0x25: switch(insn.spform.rB) { case 0x01: CEL = rD; break; case 0x02: CEH = rD; break; case 0x03: CEH = rD; CEL = rA; break; } break; // mfsr rA, Srn case 0x28: rA = sr[insn.spform.rB]; // mtsr rA, Srn case 0x29: sr[insn.spform.rB] = rA; // t{cond} case 0x2A: T = conditional(insn.spform.rB); break; // mv{cond} rD, rA case 0x2B: if(conditional(insn.spform.rB)) rD = rA; break; // extsb[.c] rD, rA case 0x2C: rD = sign_extend(rA, 8); if(insn.spform.CU) basic_flags(rD); break; // extsh[.c] rD, rA case 0x2D: rD = sign_extend(rA, 16); if(insn.spform.CU) basic_flags(rD); break; // extzb[.c] rD, rA case 0x2E: rD = bit_and(rA, 0x000000FF, insn.spform.CU); break; // extzh[.c] rD, rA case 0x2F: rD = bit_and(rA, 0x0000FFFF, insn.spform.CU); break; // slli[.c] rD, rA, imm5 case 0x38: rD = sll(rA, insn.spform.rB, insn.spform.CU); break; // srli[.c] rD, rA, imm5 case 0x3A: rD = srl(rA, insn.spform.rB, insn.spform.CU); break; // srai[.c] rD, rA, imm5 case 0x3B: rD = sra(rA, insn.spform.rB, insn.spform.CU); break; default: debugDump(); } } break; case 0x01: { uint32_t &rD = r[insn.iform.rD]; switch(insn.iform.func3) { // addi[.c] rD, imm16 case 0x00: rD = add(rD, sign_extend(insn.iform.Imm16, 16), insn.iform.CU); break; // cmpi.c rD, imm16 case 0x02: cmp(rD, sign_extend(insn.iform.Imm16, 16), 3, insn.iform.CU); break; // andi.c rD, imm16 case 0x04: rD = bit_and(rD, insn.iform.Imm16, insn.iform.CU); break; // ori.c rD, imm16 case 0x05: rD = bit_or(rD, insn.iform.Imm16, insn.iform.CU); break; // ldi rD, imm16 case 0x06: rD = sign_extend(insn.iform.Imm16, 16); break; default: debugDump(); } } break; case 0x02: { // j[l] imm24 if(insn.jform.LK) link(); // Update PC pc &= 0xFC000000; pc |= (insn.jform.Disp24 << 1) - 4; } break; case 0x03: { uint32_t &rD = r[insn.rixform.rD]; uint32_t &rA = r[insn.rixform.rA]; // Pre-increment rA += sign_extend(insn.rixform.Imm12, 12); switch(insn.rixform.func3) { // lw rD, [rA, imm12]+ case 0x00: rD = miu.readU32(rA); break; // lh rD, [rA, imm12]+ case 0x01: rD = sign_extend(miu.readU16(rA), 16); break; // lhu rD, [rA, imm12]+ case 0x02: rD = miu.readU16(rA); break; // lb rD, [rA, imm12]+ case 0x03: rD = sign_extend(miu.readU8(rA), 8); break; // sw rD, [rA, imm12]+ case 0x04: miu.writeU32(rA, rD); break; // sh rD, [rA, imm12]+ case 0x05: miu.writeU16(rA, rD); break; // lbu rD, [rA, imm12]+ case 0x06: rD = miu.readU8(rA); break; // sb rD, [rA, imm12]+ case 0x07: miu.writeU8(rA, rD); break; default: debugDump(); } } break; case 0x04: { // b{cond}[l] if(conditional(insn.bcform.BC)) { if(insn.bcform.LK) link(); pc += sign_extend(((insn.bcform.Disp18_9 << 9) | insn.bcform.Disp8_0) << 1, 20) - 4; } } break; case 0x05: { uint32_t &rD = r[insn.iform.rD]; uint32_t imm16 = insn.iform.Imm16 << 16; switch(insn.iform.func3) { // addis[.c] rD, imm16 case 0x00: rD = add(rD, imm16, insn.iform.CU); break; // cmpis.c rD, imm16 case 0x02: cmp(rD, imm16, 3, insn.iform.CU); break; // andis.c rD, imm16 case 0x04: rD = bit_and(rD, imm16, insn.iform.CU); break; // oris.c rD, imm16 case 0x05: rD = bit_or(rD, imm16, insn.iform.CU); break; // ldis rD, imm16 case 0x06: rD = imm16; break; default: debugDump(); } } break; case 0x06: { uint32_t &rD = r[insn.crform.rD]; uint32_t &crA = cr[insn.crform.crA]; switch(insn.crform.CR_OP) { // mtcr rD, crA case 0x00: crA = rD; break; // mfcr rD, crA case 0x01: rD = crA; break; // rte case 0x84: branch(cr5 - 4, false); /* TODO: missing PSR */ break; default: debugDump(); } } break; case 0x07: { uint32_t &rD = r[insn.rixform.rD]; uint32_t &rA = r[insn.rixform.rA]; switch(insn.rixform.func3) { // lw rD, [rA]+, imm12 case 0x00: rD = miu.readU32(rA); break; // lh rD, [rA]+, imm12 case 0x01: rD = sign_extend(miu.readU16(rA), 16); break; // lhu rD, [rA]+, imm12 case 0x02: rD = miu.readU16(rA); break; // lb rD, [rA]+, imm12 case 0x03: rD = sign_extend(miu.readU8(rA), 8); break; // sw rD, [rA]+, imm12 case 0x04: miu.writeU32(rA, rD); break; // sh rD, [rA]+, imm12 case 0x05: miu.writeU16(rA, rD); break; // lbu rD, [rA]+, imm12 case 0x06: rD = miu.readU8(rA); break; // sb rD, [rA]+, imm12 case 0x07: miu.writeU8(rA, rD); break; default: debugDump(); } // Post-increment rA += sign_extend(insn.rixform.Imm12, 12); } break; case 0x08: { // addri[.c] rD, rA, imm14 uint32_t &rD = r[insn.riform.rD]; uint32_t &rA = r[insn.riform.rA]; uint32_t imm14 = sign_extend(insn.riform.Imm14, 14); rD = add(rA, imm14, insn.riform.CU); } break; case 0x0C: { // andri[.c] rD, rA, imm14 uint32_t &rD = r[insn.riform.rD]; uint32_t &rA = r[insn.riform.rA]; uint32_t imm14 = insn.riform.Imm14; rD = bit_and(rA, imm14, insn.riform.CU); } break; case 0x0D: { // orri[.c] rD, rA, imm14 uint32_t &rD = r[insn.riform.rD]; uint32_t &rA = r[insn.riform.rA]; uint32_t imm14 = insn.riform.Imm14; rD = bit_or(rA, imm14, insn.riform.CU); } break; case 0x10: { // lw rD, [rA, imm15] uint32_t &rD = r[insn.mform.rD]; uint32_t &rA = r[insn.mform.rA]; uint32_t imm15 = sign_extend(insn.mform.Imm15, 15); rD = miu.readU32(rA + imm15); } break; case 0x11: { // lh rD, [rA, imm15] uint32_t &rD = r[insn.mform.rD]; uint32_t &rA = r[insn.mform.rA]; uint32_t imm15 = sign_extend(insn.mform.Imm15, 15); rD = sign_extend(miu.readU16(rA + imm15), 16); } break; case 0x12: { // lhu rD, [rA, imm15] uint32_t &rD = r[insn.mform.rD]; uint32_t &rA = r[insn.mform.rA]; uint32_t imm15 = sign_extend(insn.mform.Imm15, 15); rD = miu.readU16(rA + imm15); } break; case 0x13: { // lb rD, [rA, imm15] uint32_t &rD = r[insn.mform.rD]; uint32_t &rA = r[insn.mform.rA]; uint32_t imm15 = sign_extend(insn.mform.Imm15, 15); rD = sign_extend(miu.readU8(rA + imm15), 8); } break; case 0x14: { // sw rD, [rA, imm15] uint32_t &rD = r[insn.mform.rD]; uint32_t &rA = r[insn.mform.rA]; uint32_t imm15 = sign_extend(insn.mform.Imm15, 15); miu.writeU32(rA + imm15, rD); } break; case 0x15: { // sh rD, [rA, imm15] uint32_t &rD = r[insn.mform.rD]; uint32_t &rA = r[insn.mform.rA]; uint32_t imm15 = sign_extend(insn.mform.Imm15, 15); miu.writeU16(rA + imm15, rD); } break; case 0x16: { // lbu rD, [rA, imm15] uint32_t &rD = r[insn.mform.rD]; uint32_t &rA = r[insn.mform.rA]; uint32_t imm15 = sign_extend(insn.mform.Imm15, 15); rD = miu.readU8(rA + imm15); } break; case 0x17: { // sb rD, [rA, imm15] uint32_t &rD = r[insn.mform.rD]; uint32_t &rA = r[insn.mform.rA]; uint32_t imm15 = sign_extend(insn.mform.Imm15, 15); miu.writeU8(rA + imm15, rD); } break; case 0x18: // cache op, [rA, imm15] break; default: debugDump(); } }
void CPU::exec16(const Instruction16 &insn) { switch(insn.OP) { case 0x00: switch(insn.rform.func4) { // nop! case 0x00: /* noting */ break; // mlfh! rDg0, rAg1 case 0x01: g0[insn.rform.rD] = g1[insn.rform.rA]; break; // mhfl! rDg1, rAg0 case 0x02: g1[insn.rform.rD] = g0[insn.rform.rA]; break; // mv! rDg0, rAg0 case 0x03: g0[insn.rform.rD] = g0[insn.rform.rA]; break; // br{cond}! rAg0 case 0x04: if(conditional(insn.rform.rD)) branch(g0[insn.rform.rA] - 2, false); break; // t{cond}! case 0x05: T = conditional(insn.rform.rD); break; default: debugDump(); } break; case 0x01: { uint32_t &rA = g0[insn.rform.rA]; // uint32_t &rD = g0[insn.rform.rD]; switch(insn.rform.func4) { // mtce{lh}! rA case 0x00: switch(insn.rform.rD) { case 0x00: CEL = rA; break; case 0x01: CEH = rA; break; } break; // mfce{lh}! rA case 0x01: switch(insn.rform.rD) { case 0x00: rA = CEL; break; case 0x01: rA = CEH; break; } break; default: debugDump(); } } break; case 0x02: { uint32_t &rA = g0[insn.rform.rA]; uint32_t &rD = g0[insn.rform.rD]; uint32_t &rAh = g0[insn.rhform.rA]; uint32_t &rDh = g[insn.rhform.H][insn.rhform.rD]; switch(insn.rform.func4) { // add! rDg0, rAg0 case 0x00: rD = add(rD, rA, true); break; // sub! rDg0, rAg0 case 0x01: rD = sub(rD, rA, true); break; // neg! rDg0, rAg0 case 0x02: rD = sub(0, rA, true); break; // cmp! rDg0, rAg0 case 0x03: sub(rD, rA, true); break; // and! rDg0, rAg0 case 0x04: rD = bit_and(rD, rA, true); break; // or! rDg0, rAg0 case 0x05: rD = bit_or(rD, rA, true); break; // not! rDg0, rAg0 case 0x06: rD = bit_xor(rA, ~0, true); break; // xor! rDg0, rAg0 case 0x07: rD = bit_xor(rD, rA, true); break; // lw! rDg0, [rAg0] case 0x08: rD = miu.readU32(rA); break; // lh! rDg0, [rAg0] case 0x09: rD = sign_extend(miu.readU16(rA), 16); break; // pop! rDgh, [rAg0] case 0x0A: rDh = miu.readU32(rAh); rAh += 4; break; // lbu! rDg0, [rAg0] case 0x0B: rD = miu.readU8(rA); break; // sw! rDg0, [rAg0] case 0x0C: miu.writeU32(rA, rD); break; // sh! rDg0, [rAg0] case 0x0D: miu.writeU16(rA, rD); break; // push! rDgh, [rAg0] case 0x0E: miu.writeU32(rAh -= 4, rDh); break; // sb! rDg0, [rAg0] case 0x0F: miu.writeU8(rA, rD); break; } } break; case 0x03: { // j[l]! imm11 if(insn.jform.LK) link(); pc &= 0xFFFFF000; pc |= (insn.jform.Disp11 << 1) - 2; } break; case 0x04: { // b{cond}! imm8 if(conditional(insn.bxform.EC)) pc += (sign_extend(insn.bxform.Imm8, 8) << 1) - 2; } break; case 0x05: // ldiu! imm8 g0[insn.iform2.rD] = insn.iform2.Imm8; break; case 0x06: { uint32_t &rD = g0[insn.iform1.rD]; uint32_t imm = 1 << insn.iform1.Imm5; switch(insn.iform1.func3) { // srli! rD, imm5 case 0x03: rD = srl(rD, insn.iform1.Imm5, true); break; // bitclr! rD, imm5 case 0x04: rD = bit_and(rD, ~imm, true); break; // bitset! rD, imm5 case 0x05: rD = bit_or(rD, imm, true); break; // bittst! rD, imm5 case 0x06: bit_and(rD, imm, true); break; default: debugDump(); } } break; case 0x07: { uint32_t &rD = g0[insn.iform1.rD]; uint32_t imm = insn.iform1.Imm5 << 2; switch(insn.iform1.func3) { // lwp! rDg0, imm case 0x00: rD = miu.readU32(r2 + imm); break; // lbup! rDg0, imm case 0x01: rD = miu.readU8(r2 + imm); break; // lhp! rDg0, imm case 0x03: rD = sign_extend(miu.readU8(r2 + imm), 16); break; // swp! rDg0, imm case 0x04: miu.writeU32(r2 + imm, rD); break; // shp! rDg0, imm case 0x05: miu.writeU16(r2 + imm, rD); break; // sbp! rDg0, imm case 0x07: miu.writeU32(r2 + imm, rD); break; default: debugDump(); } } break; default: debugDump(); } }