/* SPDX-FileCopyrightText: © 2022-2024 Decompollaborate */ /* SPDX-License-Identifier: MIT */ #ifndef RABBITIZER_INSTRUCTION_BASE_HPP #define RABBITIZER_INSTRUCTION_BASE_HPP #pragma once #include #include #include "instructions/RabbitizerInstruction.h" #include "common/Utils.hpp" #include "instructions/Registers.hpp" #include "instructions/OperandType.hpp" #include "instructions/InstrId.hpp" #include "instructions/InstrIdType.hpp" #include "instructions/AccessType.hpp" namespace rabbitizer { class InstructionBase { protected: RabbitizerInstruction instr; InstructionBase() = default; virtual ~InstructionBase() = default; public: /** * Returns a pointer to the inner RabbitizerInstruction. * It is recommended to not mess with it unless you know what you are doing. */ RabbitizerInstruction *getCPtr(); const RabbitizerInstruction *getCPtr() const; /* getters */ uint8_t Get_opcode() const; uint8_t Get_sa() const; uint8_t Get_function() const; Registers::Cpu::GprO32 GetO32_rs() const; Registers::Cpu::GprO32 GetO32_rt() const; Registers::Cpu::GprO32 GetO32_rd() const; Registers::Cpu::GprN32 GetN32_rs() const; Registers::Cpu::GprN32 GetN32_rt() const; Registers::Cpu::GprN32 GetN32_rd() const; Registers::Cpu::Cop0 Get_cop0d() const; uint32_t Get_instr_index() const; uint16_t Get_immediate() const; Registers::Cpu::Cop1O32 GetO32_fs() const; Registers::Cpu::Cop1O32 GetO32_ft() const; Registers::Cpu::Cop1O32 GetO32_fd() const; Registers::Cpu::Cop1N32 GetN32_fs() const; Registers::Cpu::Cop1N32 GetN32_ft() const; Registers::Cpu::Cop1N32 GetN32_fd() const; Registers::Cpu::Cop1N64 GetN64_fs() const; Registers::Cpu::Cop1N64 GetN64_ft() const; Registers::Cpu::Cop1N64 GetN64_fd() const; Registers::Cpu::Cop1Control Get_cop1cs() const; Registers::Cpu::Cop2 Get_cop2t() const; uint8_t Get_op() const; uint32_t Get_code() const; uint32_t Get_code_upper() const; uint32_t Get_code_lower() const; uint32_t Get_copraw() const; uint8_t Get_fmt() const; uint8_t Get_fc() const; uint8_t Get_cond() const; uint8_t Get_tf() const; uint8_t Get_nd() const; uint8_t Get_bc_fmt() const; uint8_t Get_stype() const; /* getters */ /* setters */ void Set_opcode(uint8_t val); void Set_sa(uint8_t val); void Set_function(uint8_t val); void Set_rs(Registers::Cpu::GprO32 val); void Set_rt(Registers::Cpu::GprO32 val); void Set_rd(Registers::Cpu::GprO32 val); void Set_rs(Registers::Cpu::GprN32 val); void Set_rt(Registers::Cpu::GprN32 val); void Set_rd(Registers::Cpu::GprN32 val); void Set_cop0d(Registers::Cpu::Cop0 val); void Set_instr_index(uint32_t val); void Set_immediate(uint16_t val); void Set_fs(Registers::Cpu::Cop1O32 val); void Set_ft(Registers::Cpu::Cop1O32 val); void Set_fd(Registers::Cpu::Cop1O32 val); void Set_fs(Registers::Cpu::Cop1N32 val); void Set_ft(Registers::Cpu::Cop1N32 val); void Set_fd(Registers::Cpu::Cop1N32 val); void Set_fs(Registers::Cpu::Cop1N64 val); void Set_ft(Registers::Cpu::Cop1N64 val); void Set_fd(Registers::Cpu::Cop1N64 val); void Set_cop1cs(Registers::Cpu::Cop1Control val); void Set_cop2t(Registers::Cpu::Cop2 val); void Set_op(uint8_t val); void Set_code(uint32_t val); void Set_code_upper(uint32_t val); void Set_code_lower(uint32_t val); void Set_copraw(uint32_t val); void Set_fmt(uint8_t val); void Set_fc(uint8_t val); void Set_cond(uint8_t val); void Set_tf(uint8_t val); void Set_nd(uint8_t val); void Set_bc_fmt(uint8_t val); void Set_stype(uint8_t val); /* setters */ /* flags */ TrinaryValue FlagGet_r5900DisasmAsData() const; void FlagSet_r5900DisasmAsData(TrinaryValue value); TrinaryValue FlagGet_r5900UseDollar() const; void FlagSet_r5900UseDollar(TrinaryValue value); /* flags */ /* more getters */ uint32_t getRaw() const; InstrId::UniqueId getUniqueId() const; InstrIdType::IdType getInstrIdType() const; std::string getInstrIdTypeName() const; uint32_t getVram() const; bool isInHandwrittenFunction() const; int32_t getProcessedImmediate() const; uint32_t getInstrIndexAsVram() const; int32_t getBranchOffset() const; //! @deprecated int32_t getGenericBranchOffset(uint32_t currentVram) const; int32_t getBranchOffsetGeneric() const; uint32_t getBranchVramGeneric() const; int8_t getDestinationGpr() const; bool outputsToGprZero() const; std::string getOpcodeName() const; /* more getters */ /* */ void blankOut(); /* Instruction examination */ //! @deprecated bool isImplemented() const; bool isLikelyHandwritten() const; bool isNop() const; bool isUnconditionalBranch() const; bool isFunctionCall() const; bool isReturn() const; bool isJumptableJump() const; //! @deprecated bool isJrRa() const; //! @deprecated bool isJrNotRa() const; bool hasDelaySlot() const; //! @deprecated std::string mapInstrToType() const; bool sameOpcode(const InstructionBase &other) const; bool sameOpcodeButDifferentArguments(const InstructionBase &other) const; bool hasOperand(OperandType operand) const; bool hasOperandAlias(OperandType operand) const; uint32_t getValidBits() const; bool isValid() const; /* Instruction examination */ /* Instruction descriptor */ bool isUnknownType() const; bool isJType() const; bool isIType() const; bool isRType() const; bool isRegimmType() const; // TODO // RabbitizerInstrSuffix instrSuffix() const; bool isBranch() const; bool isBranchLikely() const; bool isJump() const; bool isJumpWithAddress() const; bool isTrap() const; bool isFloat() const; bool isDouble() const; bool isUnsigned() const; bool modifiesRs() const; bool modifiesRt() const; bool modifiesRd() const; bool readsRs() const; bool readsRt() const; bool readsRd() const; bool readsHI() const; bool readsLO() const; bool modifiesHI() const; bool modifiesLO() const; bool modifiesFs() const; bool modifiesFt() const; bool modifiesFd() const; bool readsFs() const; bool readsFt() const; bool readsFd() const; //! @deprecated bool notEmitedByCompilers() const; bool notEmittedByCompilers() const; bool canBeHi() const; bool canBeLo() const; bool doesLink() const; bool doesDereference() const; bool doesLoad() const; bool doesStore() const; bool maybeIsMove() const; bool isPseudo() const; AccessType getAccessType() const; bool doesUnsignedMemoryAccess() const; /* Instruction descriptor */ /* Disassembly */ bool mustDisasmAsData() const; std::string disassembleOperands() const; std::string disassembleOperands(std::string_view immOverride) const; std::string disassembleInstruction(int extraLJust) const; std::string disassembleInstruction(int extraLJust, std::string_view immOverride) const; std::string disassembleAsData(int extraLJust) const; std::string disassemble(int extraLJust) const; std::string disassemble(int extraLJust, std::string_view immOverride) const; /* Disassembly */ }; }; #endif