(Creeper, Fishron): Program executors have been reorganized

This commit is contained in:
Gabriel Correia 2024-06-05 18:46:05 -03:00
parent c6f99c9171
commit 6319ee9101
26 changed files with 208 additions and 117 deletions

View File

@ -42,18 +42,18 @@ target_sources(cosmic PRIVATE
${COSMIC_DIR}/mio/blocks.cpp
${COSMIC_DIR}/creeper/inst_operands.cpp
${COSMIC_DIR}/creeper/fastmem.cpp
${COSMIC_DIR}/creeper/psx/iop_interpreter.cpp
${COSMIC_DIR}/creeper/psx/psx_ep1.cpp
${COSMIC_DIR}/creeper/ee/addons_fpu.cpp
${COSMIC_DIR}/creeper/ee/cached_blocks.cpp
${COSMIC_DIR}/creeper/ee/more_mips.cpp
${COSMIC_DIR}/creeper/ee/translate_opcodes.cpp
${COSMIC_DIR}/creeper/ee/iv_special.cpp
${COSMIC_DIR}/creeper/ee/iv_math.cpp
${COSMIC_DIR}/creeper/ee/iv_cop.cpp
${COSMIC_DIR}/creeper/micro/vum_code.cpp
${COSMIC_DIR}/creeper/micro/int_lower1.cpp
${COSMIC_DIR}/creeper/micro/float_vectorization.cpp
${COSMIC_DIR}/creeper/iop_interpreter.cpp
${COSMIC_DIR}/creeper/psx_ep1.cpp
${COSMIC_DIR}/creeper/addons_fpu.cpp
${COSMIC_DIR}/creeper/cached_blocks.cpp
${COSMIC_DIR}/creeper/more_mips.cpp
${COSMIC_DIR}/creeper/translate_opcodes.cpp
${COSMIC_DIR}/creeper/iv_special.cpp
${COSMIC_DIR}/creeper/iv_math.cpp
${COSMIC_DIR}/creeper/iv_cop.cpp
${COSMIC_DIR}/creeper/vum_code.cpp
${COSMIC_DIR}/creeper/int_lower1.cpp
${COSMIC_DIR}/creeper/float_vectorization.cpp
${COSMIC_DIR}/gs/gs_tables.cpp
${COSMIC_DIR}/gs/gs_engine.cpp
${COSMIC_DIR}/gs/gif_bridge.cpp
@ -91,7 +91,7 @@ target_sources(cosmic PRIVATE
${COSMIC_DIR}/console/backdoor.cpp
${COSMIC_DIR}/console/bios_loader.cpp
${COSMIC_DIR}/fishron/emitter_common.cpp
${COSMIC_DIR}/fishron/ee2arm/jitter_arm64_ee.cpp
${COSMIC_DIR}/fishron/jitter_arm64_ee.cpp
${COSMIC_DIR}/ipu/chrome_table.cpp
${COSMIC_DIR}/ipu/ipu_core.cpp
${COSMIC_DIR}/ipu/decoder_fifo.cpp

View File

@ -1,11 +1,12 @@
// SPDX-short-identifier: MIT, Version N/A
// This file is protected by the MIT license (please refer to LICENSE.md before making any changes, copying, or redistributing this software)
#include <creeper/ee/cached_blocks.h>
#include <creeper/cached_blocks.h>
#include <engine/ee_core.h>
#include <common/global.h>
#define DSP_MATH_PARAMS 0
namespace cosmic::creeper::ee {
namespace cosmic::creeper {
std::array<f32, 3> fpList;
u8 dest;
#define CHK_OVER_OR_UNDER(d)\

View File

@ -2,12 +2,12 @@
// This file is protected by the MIT license (please refer to LICENSE.md before making any changes, copying, or redistributing this software)
#include <range/v3/algorithm.hpp>
#include <creeper/ee/cached_blocks.h>
#include <creeper/cached_blocks.h>
#include <common/global.h>
#include <vm/emu_vm.h>
#include <engine/ee_core.h>
namespace cosmic::creeper::ee {
namespace cosmic::creeper {
static constexpr auto cleanPcBlock{
(static_cast<u32>(-1) ^ (superBlockCount * 4 - 1))};
static constexpr auto dangerousPipe{OutOfOrder::EffectivePipeline::Branch};

View File

@ -3,8 +3,8 @@
#include <vector>
#include <boost/unordered_map.hpp>
#include <creeper/inst_operands.h>
#include <engine/ee_info.h>
#include "inst_operands.h"
#include "cosmic/engine/ee_info.h"
#define RD_DW cpu->GPRs[ops.rd].dw[0]
#define RT_DW cpu->GPRs[ops.rt].dw[0]
@ -29,7 +29,7 @@ namespace cosmic {
class CtrlCop;
}
}
namespace cosmic::creeper::ee {
namespace cosmic::creeper {
constexpr u32 superBlockCount{4096 / 4};
struct OutOfOrder {
@ -96,10 +96,9 @@ namespace cosmic::creeper::ee {
u32 executeCode() override;
void performInvalidation(u32 address) override;
#define DECLARE_INST_IV_FUNC(name) static void name(Operands)
DECLARE_INST_IV_FUNC(addi);
DECLARE_INST_IV_FUNC(lui);
static void addi(Operands);
static void lui(Operands);
static void slti(Operands ops);
static void sw(Operands ops);
static void sd(Operands ops);
@ -145,18 +144,18 @@ namespace cosmic::creeper::ee {
static void sub(Operands ops);
static void subu(Operands ops);
DECLARE_INST_IV_FUNC(iAnd);
DECLARE_INST_IV_FUNC(iOr);
DECLARE_INST_IV_FUNC(iXor);
DECLARE_INST_IV_FUNC(nor);
static void iAnd(Operands);
static void iOr(Operands);
static void iXor(Operands);
static void nor(Operands);
static void dsub(Operands ops);
static void dsubu(Operands ops);
DECLARE_INST_IV_FUNC(slt);
DECLARE_INST_IV_FUNC(ori);
DECLARE_INST_IV_FUNC(xori);
DECLARE_INST_IV_FUNC(jr);
static void slt(Operands);
static void ori(Operands);
static void xori(Operands);
static void jr(Operands);
static void bne(Operands ops);

View File

@ -1,6 +1,6 @@
#include <creeper/micro/vum_code.h>
#include <creeper/vum_code.h>
#include <vu/vecu.h>
namespace cosmic::creeper::micro {
namespace cosmic::creeper {
void VuMicroInterpreter::mr32(VuMicroOperands& ops) {
static const std::array<u8, 4> rotates{8, 4, 2, 1};
f32 fsX{vu->VuGPRs[ops.fs].floats[0]};

View File

@ -5,7 +5,7 @@
namespace cosmic::creeper {
using EeCore = engine::MipsIvOpcodes;
std::array<const char*, 3> EeOpcodeTranslator::interpreters{
std::array<std::string, 3> EeOpcodeTranslator::interpreters{
"Emotion Engine by Cached Interpreter",
"IOP Interpreter",
"VU (0, 1) Interpreter"
@ -14,7 +14,7 @@ namespace cosmic::creeper {
{EeCore::Ori, {"{} {},{},{}"}},
};
std::array<const char*, 1> EeOpcodeTranslator::eeOps{""};
std::array<const char*, 1> EeOpcodeTranslator::iopOps{""};
std::array<const char*, 1> EeOpcodeTranslator::vuOps{""};
std::array<std::string, 1> EeOpcodeTranslator::eeOps{""};
std::array<std::string, 1> EeOpcodeTranslator::iopOps{""};
std::array<std::string, 1> EeOpcodeTranslator::vuOps{""};
}

View File

@ -53,19 +53,18 @@ namespace cosmic::creeper {
};
};
};
using OpcodeListAlternative = std::array<const char*, 3>;
using OpcodeListAlternative = std::array<std::string, 3>;
using OpcodeMapType = std::unordered_map<u64, OpcodeListAlternative>;
struct EeInstructionSet {
std::string opcodeStr{"@@@"};
bool extraParameter;
std::string instruction{"xxx"};
};
class EeOpcodeTranslator{
public:
static std::array<const char*, 3> interpreters;
static std::array<const char*, 1> eeOps;
static std::array<const char*, 1> iopOps;
static std::array<const char*, 1> vuOps;
static std::array<std::string, 3> interpreters;
static std::array<std::string, 1> eeOps;
static std::array<std::string, 1> iopOps;
static std::array<std::string, 1> vuOps;
static OpcodeMapType eeMipsCoreFmt;
static auto getRegisters(u32 r9Inst) {

View File

@ -1,7 +1,7 @@
#include <creeper/micro/vum_code.h>
#include <creeper/vum_code.h>
#include <vu/vecu.h>
namespace cosmic::creeper::micro {
namespace cosmic::creeper {
void VuMicroInterpreter::iddai(VuMicroOperands& ops) {
vu->pushIntPipe(ops.ft & 0xf, ops.fs & 0xf);
i16 imm{static_cast<i16>((ops.inst >> 6) & 0x1f)};

View File

@ -1,10 +1,10 @@
#include <range/v3/algorithm.hpp>
#include <console/backdoor.h>
#include <common/global.h>
#include <creeper/psx/iop_interpreter.h>
#include <creeper/iop_interpreter.h>
#include <vm/emu_vm.h>
namespace cosmic::creeper::psx {
namespace cosmic::creeper {
using namespace iop;
void IopInterpreter::bne(Operands ops) {
cpu->takeBranchIf(cpu->ioGPRs[ops.rs] != cpu->ioGPRs[ops.rt],

View File

@ -6,7 +6,7 @@
namespace cosmic::vm {
class EmuVm;
}
namespace cosmic::creeper::psx {
namespace cosmic::creeper {
class IopInterpreter : public iop::IopExecVe {
public:
IopInterpreter(Ref<iop::IoMipsCore> core);

View File

@ -2,9 +2,9 @@
// This file is protected by the MIT license (please refer to LICENSE.md before making any changes, copying, or redistributing this software)
#include <range/v3/algorithm.hpp>
#include <creeper/ee/cached_blocks.h>
#include <creeper/cached_blocks.h>
#include <engine/ee_core.h>
namespace cosmic::creeper::ee {
namespace cosmic::creeper {
void MipsIvInterpreter::tlbr(Operands ops) {
auto entry{cpu->fetchTlbFromCop(c0->GPRs.data())};
c0->loadFromGprToTlb(*entry);

View File

@ -1,8 +1,8 @@
#include <creeper/ee/cached_blocks.h>
#include <creeper/cached_blocks.h>
#include <engine/ee_core.h>
#include <console/backdoor.h>
namespace cosmic::creeper::ee {
namespace cosmic::creeper {
void MipsIvInterpreter::mult(Operands ops) {
auto fi{cpu->GPRs[ops.rs].swords[0]};
auto se{cpu->GPRs[ops.rt].swords[0]};

View File

@ -1,9 +1,9 @@
#include <creeper/ee/cached_blocks.h>
#include <creeper/cached_blocks.h>
#include <engine/ee_core.h>
#include <console/backdoor.h>
#include <vm/emu_vm.h>
namespace cosmic::creeper::ee {
namespace cosmic::creeper {
#define SPECIAL_IV_OP(op)\
RD_SW = RS_SW op RT_SW
#define SPECIAL_IV_OP_UNS(op)\

View File

@ -1,8 +1,8 @@
#include <creeper/ee/cached_blocks.h>
#include <creeper/cached_blocks.h>
#include <engine/ee_core.h>
#include <vm/emu_vm.h>
namespace cosmic::creeper::ee {
namespace cosmic::creeper {
void MipsIvInterpreter::addi(Operands ops) {
cpu->GPRs[ops.rt].words[0] = ops.pa16[0] + cpu->GPRs[ops.rs].words[0];
}

View File

@ -1,7 +1,7 @@
#include <creeper/psx/iop_interpreter.h>
#include <creeper/iop_interpreter.h>
#include <iop/iop_core.h>
namespace cosmic::creeper::psx {
namespace cosmic::creeper {
void IopInterpreter::orMips(Operands ops) {
cpu->ioGPRs[ops.rd] = cpu->ioGPRs[ops.rs] | cpu->ioGPRs[ops.rt];
}

View File

@ -1,9 +1,10 @@
// SPDX-short-identifier: MIT, Version N/A
// This file is protected by the MIT license (please refer to LICENSE.md before making any changes, copying, or redistributing this software)
#include <common/global.h>
#include <creeper/ee/cached_blocks.h>
#include <creeper/cached_blocks.h>
#include <engine/ee_core.h>
namespace cosmic::creeper::ee {
namespace cosmic::creeper {
using namespace engine;
EeMapSpecial MipsIvInterpreter::ivSpecial{
@ -134,7 +135,7 @@ namespace cosmic::creeper::ee {
std::array<u8, 3> operands{
EeOpcodeTranslator::getRegisters(opcode)};
EeInstructionSet set{};
const u32 offsetOrBase{opcode & 0x0000ffff};
// const u32 offsetOrBase{opcode & 0x0000ffff};
microCodes.ops = Operands{opcode, operands};
switch (opcode >> 26) {
@ -148,28 +149,25 @@ namespace cosmic::creeper::ee {
decodeCop(opcode, microCodes, set);
break;
}
std::array<std::string, 3> tagged{
std::string{""} + eeAllGprIdentifier[operands.at(0)],
std::string{""} + eeAllGprIdentifier[operands.at(1)],
std::string{""} + eeAllGprIdentifier[operands.at(2)],
};
const auto& first{eeAllGprIdentifier[operands.at(0)]};
const auto& second{eeAllGprIdentifier[operands.at(1)]};
// const auto& third{eeAllGprIdentifier[operands.at(2)]};
auto coreOps{static_cast<MipsIvOpcodes>(opcode >> 26)};
getOpcodeHandler(ivCore, coreOps, microCodes, set);
const auto thirdArg{set.extraParameter ? tagged[2] : fmt::format("{:x}", offsetOrBase)};
std::string decoded;
if (set.extraParameter)
decoded = fmt::format("{}\t{}, {}, {}", set.opcodeStr, tagged[0], tagged[1], thirdArg);
else
decoded = fmt::format("{}\t{}, {}", set.opcodeStr, tagged[0], tagged[1]);
decoded = fmt::format("{}\t{}, {}", set.instruction, first, second);
if (microCodes.execute) {
user->debug("(MIPS) Opcode value {} at PC address {} decoded to {}", opcode, *cpu->eePc, decoded);
} else {
if (!microCodes.execute) {
microCodes.execute = [decoded](Operands& err) {
throw AppErr("Currently, we cannot handle the operation {} at PC address {:x}", decoded, *cpu->eePc);
};
return;
}
user->debug("(MIPS) Opcode value {} at PC address {} decoded to {}", opcode, *cpu->eePc, decoded);
}
void MipsIvInterpreter::getOpcodeHandler(auto opcodes, auto micro,
InvokeOpInfo& info, EeInstructionSet& set) {
@ -181,7 +179,7 @@ namespace cosmic::creeper::ee {
auto& handler{(opc->second).opcodeHandler};
info.execute = handler;
set.opcodeStr = std::string{""} + opc->second.opcodeName;
set.instruction = opc->second.opcodeName;
}
u32 MipsIvInterpreter::fetchPcInst(u32 pc) {

View File

@ -1,6 +1,6 @@
#include <creeper/micro/vum_code.h>
#include <creeper/vum_code.h>
#include <vu/vecu.h>
namespace cosmic::creeper::micro {
namespace cosmic::creeper {
Ref<vu::VectorUnit> VuMicroInterpreter::vu;
u32 VuMicroInterpreter::executeCode() {

View File

@ -1,7 +1,7 @@
#pragma once
#include <creeper/inst_operands.h>
#include <vu/vu_info.h>
namespace cosmic::creeper::micro {
namespace cosmic::creeper {
struct VuMicroOrder {
// A VU, in microcode mode, executes more than one instruction,
// but there may be a dependency between registers

View File

@ -3,8 +3,8 @@
#include <engine/ee_core.h>
#include <engine/cop0.h>
#include <creeper/ee/cached_blocks.h>
#include <fishron/ee2arm/jitter_arm64_ee.h>
#include "cosmic/creeper/cached_blocks.h"
#include "cosmic/fishron/jitter_arm64_ee.h"
#include <console/virt_devices.h>
namespace cosmic::engine {
EeMipsCore::~EeMipsCore() {

View File

@ -102,5 +102,5 @@ namespace cosmic::engine {
Nop = 0x33,
Ld = 0x37,
};
extern const std::array<const char*, 32> eeAllGprIdentifier;
extern const std::array<std::string, 32> eeAllGprIdentifier;
}

View File

@ -17,7 +17,7 @@ namespace cosmic::engine {
mulDivStorage[0] = val & 0xffffffff;
mulDivStorage[1] = (val >> 32) & 0xffffffff;
}
const std::array<const char*, 32> eeAllGprIdentifier{
const std::array<std::string, 32> eeAllGprIdentifier{
"zero",
"at", "v0", "v1", "a0", "a1", "a2", "a3",
"t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",

View File

@ -1,4 +1,4 @@
#include <fishron/ee2arm/jitter_arm64_ee.h>
#include <fishron/jitter_arm64_ee.h>
namespace cosmic::fishron::ee2arm {
u32 EeArm64Jitter::executeCode() {

View File

@ -3,41 +3,135 @@
#include <common/global.h>
namespace cosmic::hle {
// https://github.com/PCSX2/pcsx2/blob/8c94efd61a437263dc23853c7658053be3c8ba7d/pcsx2/R5900OpcodeImpl.cpp#L99C1-L99C7
static const std::array<const char*, 256> mipsCustomCallsNames{
"RFU000_FullReset", "ResetEE", "SetGsCrt", "RFU003", "Exit", "RFU005", "LoadExecPS2",
"ExecPS2", "RFU008", "RFU009", "AddSbusIntcHandler", "RemoveSbusIntcHandler",
"Interrupt2Iop", "SetVTLBRefillHandler", "SetVCommonHandler", "SetVInterruptHandler",
"AddIntcHandler", "RemoveIntcHandler", "AddDmacHandler", "RemoveDmacHandler",
"_EnableIntc", "_DisableIntc", "_EnableDmac", "_DisableDmac", "_SetAlarm", "_ReleaseAlarm",
"_iEnableIntc", "_iDisableIntc", "_iEnableDmac", "_iDisableDmac", "_iSetAlarm",
"_iReleaseAlarm", "CreateThread", "DeleteThread", "StartThread", "ExitThread",
"ExitDeleteThread", "TerminateThread", "iTerminateThread", "DisableDispatchThread",
"EnableDispatchThread", "ChangeThreadPriority", "iChangeThreadPriority",
"RotateThreadReadyQueue", "iRotateThreadReadyQueue", "ReleaseWaitThread",
"iReleaseWaitThread", "GetThreadId", "ReferThreadStatus", "iReferThreadStatus",
"SleepThread", "WakeupThread", "_iWakeupThread", "CancelWakeupThread",
"iCancelWakeupThread", "SuspendThread", "iSuspendThread", "ResumeThread", "iResumeThread",
"JoinThread", "RFU060", "RFU061", "EndOfHeap", "RFU063", "CreateSema", "DeleteSema",
"SignalSema", "iSignalSema", "WaitSema", "PollSema", "iPollSema", "ReferSemaStatus",
"iReferSemaStatus", "RFU073", "SetOsdConfigParam", "GetOsdConfigParam", "GetGsHParam",
"GetGsVParam", "SetGsHParam", "SetGsVParam",
"RFU080_CreateEventFlag", "RFU081_DeleteEventFlag",
"RFU082_SetEventFlag", "RFU083_iSetEventFlag",
"RFU084_ClearEventFlag", "RFU085_iClearEventFlag",
"RFU086_WaitEventFlag", "RFU087_PollEventFlag",
"RFU088_iPollEventFlag", "RFU089_ReferEventFlagStatus",
"RFU090_iReferEventFlagStatus", "RFU091_GetEntryAddress",
static const std::array<std::string, 256> mipsCustomCallsNames{
"RFU000_FullReset",
"ResetEE",
"SetGsCrt",
"RFU003",
"Exit",
"RFU005",
"LoadExecPS2",
"ExecPS2",
"RFU008",
"RFU009",
"AddSbusIntcHandler",
"RemoveSbusIntcHandler",
"Interrupt2Iop",
"SetVTLBRefillHandler",
"SetVCommonHandler",
"SetVInterruptHandler",
"AddIntcHandler",
"RemoveIntcHandler",
"AddDmacHandler",
"RemoveDmacHandler",
"_EnableIntc",
"_DisableIntc",
"_EnableDmac",
"_DisableDmac",
"_SetAlarm",
"_ReleaseAlarm",
"_iEnableIntc",
"_iDisableIntc",
"_iEnableDmac",
"_iDisableDmac",
"_iSetAlarm",
"_iReleaseAlarm",
"CreateThread",
"DeleteThread",
"StartThread",
"ExitThread",
"ExitDeleteThread",
"TerminateThread",
"iTerminateThread",
"DisableDispatchThread",
"EnableDispatchThread",
"ChangeThreadPriority",
"iChangeThreadPriority",
"RotateThreadReadyQueue",
"iRotateThreadReadyQueue",
"ReleaseWaitThread",
"iReleaseWaitThread",
"GetThreadId",
"ReferThreadStatus",
"iReferThreadStatus",
"SleepThread",
"WakeupThread",
"_iWakeupThread",
"CancelWakeupThread",
"iCancelWakeupThread",
"SuspendThread",
"iSuspendThread",
"ResumeThread",
"iResumeThread",
"JoinThread",
"RFU060",
"RFU061",
"EndOfHeap",
"RFU063",
"CreateSema",
"DeleteSema",
"SignalSema",
"iSignalSema",
"WaitSema",
"PollSema",
"iPollSema",
"ReferSemaStatus",
"iReferSemaStatus",
"RFU073",
"SetOsdConfigParam",
"GetOsdConfigParam",
"GetGsHParam",
"GetGsVParam",
"SetGsHParam",
"SetGsVParam",
"RFU080_CreateEventFlag",
"RFU081_DeleteEventFlag",
"RFU082_SetEventFlag",
"RFU083_iSetEventFlag",
"RFU084_ClearEventFlag",
"RFU085_iClearEventFlag",
"RFU086_WaitEventFlag",
"RFU087_PollEventFlag",
"RFU088_iPollEventFlag",
"RFU089_ReferEventFlagStatus",
"RFU090_iReferEventFlagStatus",
"RFU091_GetEntryAddress",
"EnableIntcHandler_iEnableIntcHandler",
"DisableIntcHandler_iDisableIntcHandler",
"EnableDmacHandler_iEnableDmacHandler",
"DisableDmacHandler_iDisableDmacHandler",
"KSeg0", "EnableCache", "DisableCache", "GetCop0", "FlushCache", "RFU101", "CpuConfig",
"iGetCop0", "iFlushCache", "RFU105", "iCpuConfig", "sceSifStopDma", "SetCPUTimerHandler",
"SetCPUTimer", "SetOsdConfigParam2", "GetOsdConfigParam2", "GsGetIMR_iGsGetIMR",
"GsGetIMR_iGsPutIMR", "SetPgifHandler", "SetVSyncFlag", "RFU116", "print",
"sceSifDmaStat_isceSifDmaStat", "sceSifSetDma_isceSifSetDma",
"sceSifSetDChain_isceSifSetDChain", "sceSifSetReg", "sceSifGetReg", "ExecOSD", "Deci2Call",
"PSMode", "MachineType", "GetMemorySize",
"KSeg0",
"EnableCache",
"DisableCache",
"GetCop0",
"FlushCache",
"RFU101",
"CpuConfig",
"iGetCop0",
"iFlushCache",
"RFU105",
"iCpuConfig",
"sceSifStopDma",
"SetCPUTimerHandler",
"SetCPUTimer",
"SetOsdConfigParam2",
"GetOsdConfigParam2",
"GsGetIMR_iGsGetIMR",
"GsGetIMR_iGsPutIMR",
"SetPgifHandler",
"SetVSyncFlag",
"RFU116",
"print",
"sceSifDmaStat_isceSifDmaStat",
"sceSifSetDma_isceSifSetDma",
"sceSifSetDChain_isceSifSetDChain",
"sceSifSetReg",
"sceSifGetReg",
"ExecOSD",
"Deci2Call",
"PSMode",
"MachineType",
"GetMemorySize",
};
void SyscallDealer::resetEe() {
i32 resetParam{*vm->mips->gprAt<i32>(Param0)};

View File

@ -1,7 +1,7 @@
#include <range/v3/algorithm.hpp>
#include <common/global.h>
#include <iop/iop_core.h>
#include <creeper/psx/iop_interpreter.h>
#include "cosmic/creeper/iop_interpreter.h"
#include <pshook/hk_psx.h>
namespace cosmic::iop {

View File

@ -4,7 +4,7 @@
#include <vm/emu_vm.h>
#include <console/backdoor.h>
#include <common/global.h>
#include <creeper/micro/vum_code.h>
#include "cosmic/creeper/vum_code.h"
namespace cosmic::vu {
VuIntPipeline::VuIntPipeline() {
pipeline[0].clearEntry();