RegistersTracker#hasLoButNoHi

This commit is contained in:
angie 2022-06-13 14:01:48 -04:00
parent 4a75e20c13
commit 42a2a33d7d
4 changed files with 26 additions and 0 deletions

View File

@ -29,6 +29,7 @@ bool RabbitizerRegistersTracker_getLuiOffsetForConstant(RabbitizerRegistersTrack
void RabbitizerRegistersTracker_processConstant(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, uint32_t value, int offset);
bool RabbitizerRegistersTracker_getLuiOffsetForLo(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset, int *dstOffset, bool *dstIsGp);
void RabbitizerRegistersTracker_processLo(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, uint32_t value, int offset);
bool RabbitizerRegistersTracker_hasLoButNoHi(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr);
#endif

View File

@ -22,3 +22,4 @@ class RegistersTracker:
def processConstant(self, instr: Instruction, value: int, offset: int) -> None: ...
def getLuiOffsetForLo(self, instr: Instruction, instrOffset: int) -> tuple[int, bool, bool]: ...
def processLo(self, instr: Instruction, value: int, offset: int) -> None: ...
def hasLoButNoHi(self, instr: Instruction) -> bool: ...

View File

@ -195,6 +195,20 @@ static PyObject *rabbitizer_type_RegistersTracker_processLo(PyRabbitizerRegister
Py_RETURN_NONE;
}
static PyObject *rabbitizer_type_RegistersTracker_hasLoButNoHi(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) {
static char *kwlist[] = { "instr", NULL };
PyRabbitizerInstruction *instr;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr)) {
return NULL;
}
if (RabbitizerRegistersTracker_hasLoButNoHi(&self->tracker, &instr->instr)) {
Py_RETURN_TRUE;
}
Py_RETURN_FALSE;
}
#define METHOD_NO_ARGS(name, docs) { #name, (PyCFunction)rabbitizer_type_RegistersTracker_##name, METH_NOARGS, PyDoc_STR(docs) }
#define METHOD_ARGS(name, docs) { #name, (PyCFunction)rabbitizer_type_RegistersTracker_##name, METH_VARARGS | METH_KEYWORDS, PyDoc_STR(docs) }
@ -210,6 +224,7 @@ static PyMethodDef rabbitizer_type_RegistersTracker_methods[] = {
METHOD_ARGS(processConstant, ""),
METHOD_ARGS(getLuiOffsetForLo, ""),
METHOD_ARGS(processLo, ""),
METHOD_ARGS(hasLoButNoHi, ""),
{ 0 },
};

View File

@ -333,6 +333,15 @@ void RabbitizerRegistersTracker_processLo(RabbitizerRegistersTracker *self, cons
}
}
bool RabbitizerRegistersTracker_hasLoButNoHi(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr) {
RabbitizerTrackedRegisterState *state;
assert(instr != NULL);
state = &self->registers[instr->rs];
return state->hasLoValue && !state->hasLuiValue;
}
#if 0
def _printDebugInfo_clearRegister(self, instr: rabbitizer.Instruction, reg: int, currentVram: int|None=None) -> None: