rabbitizer/cplusplus/include/instructions/InstructionBase.hpp

312 lines
8.1 KiB
C++

/* SPDX-FileCopyrightText: © 2022-2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
#ifndef RABBITIZER_INSTRUCTION_BASE_HPP
#define RABBITIZER_INSTRUCTION_BASE_HPP
#pragma once
#include <string>
#include <string_view>
#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