def _d_clo(self, data): if bits.get(data, 10, 6): return None return MIB('clo', None)( MRO('srca', bits.get(data, 25, 21)), MRO('srca_', bits.get(data, 20, 16) ), #according to the docs, srca and srca_ must be the same MRO('dest', bits.get(data, 15, 11)))
def _d_srlv(self, data): if bits.get(data, 10, 7): return None if bits.test(data, 6): return MIB('rotrv', None)(MRO('dest', bits.get(data, 15, 11)), MRO('src', bits.get(data, 20, 16)), MIO('shift', bits.get(data, 25, 21))) return MIB('srlv', None)(MRO('dest', bits.get(data, 15, 11)), MRO('src', bits.get(data, 20, 16)), MIO('shift', bits.get(data, 25, 21)))
def _d_movci(self, data): if bits.get(data, 10, 6) or bits.test(data, 17): return None if bits.test(data, 16): return MIB('movf', None)(MRO('src', bits.get(data, 25, 21)), MIO('cc', bits.get(data, 20, 18)), MRO('dest', bits.get(data, 15, 11))) else: return MIB('movt', None)(MRO('src', bits.get(data, 25, 21)), MIO('cc', bits.get(data, 20, 18)), MRO('dest', bits.get(data, 15, 11)))
def _d_seb(self, data): if bits.get(data, 25, 21): return None return MIB('seb', None)(MRO('dest', bits.get(data, 15, 11)), MRO('src', bits.get(data, 20, 16)))
def _d_rdhwr(self, data): if bits.get(data, 10, 6) or bits.get(data, 25, 21): return None return MIB('rdhwr', None)(MRO('dest', bits.get(data, 20, 16)), MIO('num', bits.get(data, 15, 11)))
def _d_movn(self, data): if bits.get(data, 10, 6): return None return MIB('movn', None)(MRO('src', bits.get(data, 25, 21)), MRO('predicate', bits.get(data, 20, 16)), MRO('dest', bits.get(data, 15, 11)))
def _d_break(self, data): return MIB('break', None)(MIO('code', bits.get(data, 25, 6)))
def _d_cache(self, data): return MIB('cache', None)(MIO('op', bits.get(data, 20, 16)), MMO('target', MRO('base', bits.get(data, 25, 21)), MIO('offset', bits.get(data, 15, 0))))
def _d_bnel(self, data): return MIB('bnel', None)(MRO('lhs', bits.get(data, 25, 21)), MRO('rhs', bits.get(data, 20, 16)), MIO('target', bits.get(data, 15, 0)))
def _d_xori(self, data): return MIB('xori', None)(MRO('lhs', bits.get(data, 25, 21)), MRO('dest', bits.get(data, 20, 16)), MIO('rhs', bits.get(data, 15, 0)))
def _d_synci(self, data): return MIB('synci', None)(MMO(MRO('base', bits.get(data, 25, 21)), MIO('offset', bits.get(data, 15, 0))))
def _d_bgezall(self, data): return MIB('bgezall', None)(MRO('predicate', bits.get(data, 25, 21)), MIO('target', bits.get(data, 15, 0)))
def _d_tnei(self, data): return MIB('tnei', None)(MRO('lhs', bits.get(data, 25, 21)), MIO('rhs', bits.get(data, 15, 0)))
def _d_tne(self, data): return MIB('tne', None)(MRO('srca', bits.get(data, 25, 21)), MRO('srcb', bits.get(data, 20, 16)), MRO('code', bits.get(data, 15, 6)))
def _d_mtlo(self, data): if bits.get(data, 20, 6): return None return MIB('mtlo', None)(MRO('src', bits.get(data, 25, 21)))
def _d_mflo(self, data): if bits.get(data, 25, 16) or bits.get(data, 10, 6): return None return MIB('mflo', None)(MRO('dest', bits.get(data, 15, 11)))
def _d_sync(self, data): if bits.get(data, 25, 11): return None return MIB('sync', None)(MIO('stype', bits.get(data, 10, 6)))
def _d_jal(self, data): return MIB('jal', None)(MIO('target', bits.get(data, 25, 0)))
def _d_addiu(self, data): return MIB('addiu', None)(MRO('src', bits.get(data, 25, 21)), MRO('dest', bits.get(data, 20, 16)), MIO('addend', bits.get(data, 15, 0)))
def _d_mul(self, data): if bits.get(data, 10, 6): return None return MIB('mul', None)(MRO('dest', bits.get(data, 25, 21)), MRO('srca', bits.get(data, 20, 16)), MRO('srcb', bits.get(data, 15, 11)))
def _d_lui(self, data): if bits.get(data, 25, 21): return None return MIB('lui', None)(MRO('dest', bits.get(data, 20, 16)), MIO('imm', bits.get(data, 15, 0)))
def _d_msubu(self, data): if bits.get(data, 15, 6): return None return MIB('msubu', None)(MRO('srca', bits.get(data, 25, 21)), MRO('srcb', bits.get(data, 20, 16)))
def _d_bgtzl(self, data): if bits.get(data, 20, 16): return None return MIB('blgtzl', None)(MRO('predicate', bits.get(data, 25, 21)), MIO('target', bits.get(data, 15, 0)))
def _d_sdc2(self, data): return MIB('sdc2', None)(MIO('src', bits.get(data, 20, 16)), MMO('dest', MRO('base', bits.get(data, 25, 21)), MIO('offset', bits.get(data, 15, 0))))
def _d_pref(self, data): return MIB('pref', None)(MIO('hint', bits.get(data, 20, 16)), MMO('dest', MRO('base', bits.get(data, 25, 21)), MIO('offset', bits.get(data, 15, 0))))
def _d_syscall(self, data): return MIB('syscall', None)(MIO('code', bits.get(data, 25, 6)))
def _d_sll(self, data): if bits.get(data, 25, 21): return None return MIB('sll', None)(MRO('dest', bits.get(data, 15, 11)), MRO('src', bits.get(data, 20, 16)), MIO('shift', bits.get(data, 10, 6)))
def _d_sdbbp(self, data): return MIB('sdbbp', None)(MIO('code', bits.get(data, 25, 6)))
def decode(self, data): decoder_name = self.decode_table[bits.get( data, *self.row_bitrange)][bits.get(data, *self.col_bitrange)] return decoder_name and getattr(self, decoder_name)(data)
def _d_ins(self, data): return MIB('ins', None)(MRO('src', bits.get(data, 25, 21)), MRO('dest', bits.get(data, 20, 16)), MIO('size', bits.get(data, 15, 11)), MIO('pos', bits.get(data, 10, 6)))