mirror of
https://github.com/Decompollaborate/rabbitizer.git
synced 2025-03-14 13:21:28 +00:00
RabbitizerInstruction_hasOperandAlias
This commit is contained in:
parent
568a0662f2
commit
63591003f6
@ -153,6 +153,7 @@ bool RabbitizerInstruction_sameOpcode(const RabbitizerInstruction *self, const R
|
||||
bool RabbitizerInstruction_sameOpcodeButDifferentArguments(const RabbitizerInstruction *self, const RabbitizerInstruction *other);
|
||||
|
||||
bool RabbitizerInstruction_hasOperand(const RabbitizerInstruction *self, RabbitizerOperandType operand);
|
||||
bool RabbitizerInstruction_hasOperandAlias(const RabbitizerInstruction *self, RabbitizerOperandType operand);
|
||||
|
||||
bool RabbitizerInstruction_isValid(const RabbitizerInstruction *self);
|
||||
|
||||
|
@ -8,6 +8,7 @@
|
||||
|
||||
typedef enum RabbitizerOperandType {
|
||||
RABBITIZER_OPERAND_TYPE_INVALID,
|
||||
|
||||
RABBITIZER_OPERAND_TYPE_rs,
|
||||
RABBITIZER_OPERAND_TYPE_rt,
|
||||
RABBITIZER_OPERAND_TYPE_rd,
|
||||
@ -23,9 +24,10 @@ typedef enum RabbitizerOperandType {
|
||||
RABBITIZER_OPERAND_TYPE_code,
|
||||
RABBITIZER_OPERAND_TYPE_LABEL,
|
||||
RABBITIZER_OPERAND_TYPE_IMM,
|
||||
// composed/aliased operands
|
||||
RABBITIZER_OPERAND_TYPE_IMM_base,
|
||||
|
||||
// rsp
|
||||
/* rsp */
|
||||
RABBITIZER_OPERAND_TYPE_RSP_rs,
|
||||
RABBITIZER_OPERAND_TYPE_RSP_rt,
|
||||
RABBITIZER_OPERAND_TYPE_RSP_rd,
|
||||
@ -33,12 +35,17 @@ typedef enum RabbitizerOperandType {
|
||||
RABBITIZER_OPERAND_TYPE_RSP_vs,
|
||||
RABBITIZER_OPERAND_TYPE_RSP_vt,
|
||||
RABBITIZER_OPERAND_TYPE_RSP_vd,
|
||||
// RABBITIZER_OPERAND_TYPE_RSP_elementhigh,
|
||||
// RABBITIZER_OPERAND_TYPE_RSP_elementlow,
|
||||
// RABBITIZER_OPERAND_TYPE_RSP_index,
|
||||
// RABBITIZER_OPERAND_TYPE_RSP_offset,
|
||||
// composed/aliased operands
|
||||
RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh,
|
||||
RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow,
|
||||
RABBITIZER_OPERAND_TYPE_RSP_vd_vs,
|
||||
RABBITIZER_OPERAND_TYPE_RSP_vd_index,
|
||||
RABBITIZER_OPERAND_TYPE_RSP_offset_rs,
|
||||
// rsp
|
||||
/* rsp */
|
||||
|
||||
RABBITIZER_OPERAND_TYPE_MAX,
|
||||
} RabbitizerOperandType;
|
||||
|
@ -134,6 +134,159 @@ bool RabbitizerInstruction_hasOperand(const RabbitizerInstruction *self, Rabbiti
|
||||
return false;
|
||||
}
|
||||
|
||||
bool RabbitizerInstruction_hasOperandAlias(const RabbitizerInstruction *self, RabbitizerOperandType operand) {
|
||||
switch (operand) {
|
||||
case RABBITIZER_OPERAND_TYPE_rs:
|
||||
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_IMM_base)) {
|
||||
return true;
|
||||
}
|
||||
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_RSP_rs)) {
|
||||
return true;
|
||||
}
|
||||
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_RSP_offset_rs)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case RABBITIZER_OPERAND_TYPE_IMM:
|
||||
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_IMM_base)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case RABBITIZER_OPERAND_TYPE_rt:
|
||||
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_RSP_rt)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case RABBITIZER_OPERAND_TYPE_rd:
|
||||
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_RSP_rd)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case RABBITIZER_OPERAND_TYPE_sa:
|
||||
// case RABBITIZER_OPERAND_TYPE_function:
|
||||
case RABBITIZER_OPERAND_TYPE_cop0d:
|
||||
case RABBITIZER_OPERAND_TYPE_fs:
|
||||
case RABBITIZER_OPERAND_TYPE_ft:
|
||||
case RABBITIZER_OPERAND_TYPE_fd:
|
||||
case RABBITIZER_OPERAND_TYPE_cop1cs:
|
||||
case RABBITIZER_OPERAND_TYPE_cop2t:
|
||||
case RABBITIZER_OPERAND_TYPE_op:
|
||||
case RABBITIZER_OPERAND_TYPE_code:
|
||||
case RABBITIZER_OPERAND_TYPE_LABEL:
|
||||
break;
|
||||
|
||||
case RABBITIZER_OPERAND_TYPE_IMM_base:
|
||||
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_rs)) {
|
||||
return true;
|
||||
}
|
||||
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_IMM)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
/* rsp */
|
||||
case RABBITIZER_OPERAND_TYPE_RSP_rs:
|
||||
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_rs)) {
|
||||
return true;
|
||||
}
|
||||
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_RSP_offset_rs)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case RABBITIZER_OPERAND_TYPE_RSP_rt:
|
||||
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_rt)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case RABBITIZER_OPERAND_TYPE_RSP_rd:
|
||||
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_rd)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case RABBITIZER_OPERAND_TYPE_RSP_cop0d:
|
||||
break;
|
||||
|
||||
// case RABBITIZER_OPERAND_TYPE_RSP_elementhigh:
|
||||
// case RABBITIZER_OPERAND_TYPE_RSP_elementlow:
|
||||
// case RABBITIZER_OPERAND_TYPE_RSP_index:
|
||||
// case RABBITIZER_OPERAND_TYPE_RSP_offset:
|
||||
|
||||
case RABBITIZER_OPERAND_TYPE_RSP_vs:
|
||||
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_RSP_vd_vs)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case RABBITIZER_OPERAND_TYPE_RSP_vt:
|
||||
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh)) {
|
||||
return true;
|
||||
}
|
||||
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case RABBITIZER_OPERAND_TYPE_RSP_vd:
|
||||
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_RSP_vd_vs)) {
|
||||
return true;
|
||||
}
|
||||
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_RSP_vd_index)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh:
|
||||
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_RSP_vt)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow:
|
||||
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_RSP_vt)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case RABBITIZER_OPERAND_TYPE_RSP_vd_vs:
|
||||
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_RSP_vd)) {
|
||||
return true;
|
||||
}
|
||||
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_RSP_vs)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case RABBITIZER_OPERAND_TYPE_RSP_vd_index:
|
||||
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_RSP_vd)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case RABBITIZER_OPERAND_TYPE_RSP_offset_rs:
|
||||
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_RSP_rs)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
/* rsp */
|
||||
|
||||
case RABBITIZER_OPERAND_TYPE_INVALID:
|
||||
case RABBITIZER_OPERAND_TYPE_MAX:
|
||||
assert(operand != RABBITIZER_OPERAND_TYPE_INVALID && operand != RABBITIZER_OPERAND_TYPE_MAX);
|
||||
break;
|
||||
}
|
||||
|
||||
return RabbitizerInstruction_hasOperand(self, operand);
|
||||
}
|
||||
|
||||
|
||||
bool RabbitizerInstruction_isValid(const RabbitizerInstruction *self) {
|
||||
size_t i;
|
||||
uint32_t validbits;
|
||||
|
Loading…
x
Reference in New Issue
Block a user