def input_registers_masks(self): from peachpy.x86_64.operand import get_operand_registers if self._cancelling_inputs: from peachpy.x86_64.registers import Register input_operands = [ operand for (is_input_reg, operand) in zip(self.in_regs, self.operands) if is_input_reg ] assert len( input_operands ) == 2, "Instruction forms with cancelling inputs must have two inputs" assert all(map(lambda op: isinstance(op, Register), input_operands)), \ "Both inputs of instruction form with cancelling inputs must be registers" if input_operands[0] == input_operands[1]: return dict() else: return {reg._internal_id: reg.mask for reg in input_operands} else: registers_masks = self._implicit_in_regs.copy() for (has_input_registers, operand) in zip(self.in_regs, self.operands): if has_input_registers: for register in get_operand_registers(operand): register_id = register._internal_id registers_masks[register_id] = \ registers_masks.get(register_id, 0) | register.mask return registers_masks
def registers(self): from peachpy.x86_64.operand import get_operand_registers registers = set() for operand in self.operands: registers.update(get_operand_registers(operand)) return registers
def input_registers(self): from peachpy.x86_64.operand import get_operand_registers registers_set = set() for (has_input_registers, operand) in zip(self.in_regs, self.operands): if has_input_registers: registers_set.update(get_operand_registers(operand)) # Instruction forms with cancelling inputs have exactly 2 input operands, both of which are registers. # If they are the same, only one of them is added to registers_set, thus len(registers_set) == 1 if self._cancelling_inputs and len(registers_set) == 1: return set() return registers_set
def input_registers(self): from peachpy.x86_64.operand import get_operand_registers registers_set = set() for (has_input_registers, operand) in zip(self.in_regs, self.operands): if has_input_registers: registers_set.update(get_operand_registers(operand)) # Instruction forms with cancelling inputs have exactly 2 input operands, both of which are registers. # If they are the same, only one of them is added to registers_set, thus len(registers_set) == 1 if self._cancelling_inputs and len(registers_set) == 1: return set() return registers_set
def output_registers(self): from peachpy.x86_64.operand import get_operand_registers from peachpy.x86_64.registers import GeneralPurposeRegister32, XMMRegister registers_set = set() for (is_output_register, operand) in zip(self.out_regs, self.operands): if is_output_register: for register in get_operand_registers(operand): if isinstance(register, GeneralPurposeRegister32): registers_set.add(register.as_qword) elif bool(self.avx_mode) and isinstance(register, XMMRegister): registers_set.add(register.as_ymm) else: registers_set.add(register) return registers_set
def output_registers(self): from peachpy.x86_64.operand import get_operand_registers from peachpy.x86_64.registers import GeneralPurposeRegister32, XMMRegister registers_set = set() for (is_output_register, operand) in zip(self.out_regs, self.operands): if is_output_register: for register in get_operand_registers(operand): if isinstance(register, GeneralPurposeRegister32): registers_set.add(register.as_qword) elif bool(self.avx_mode) and isinstance(register, XMMRegister): registers_set.add(register.as_ymm) else: registers_set.add(register) return registers_set
def output_registers_masks(self): from peachpy.x86_64.operand import get_operand_registers from peachpy.x86_64.registers import GeneralPurposeRegister32, GeneralPurposeRegister64, \ XMMRegister, YMMRegister registers_masks = self._implicit_out_regs.copy() for (is_output_register, operand) in zip(self.out_regs, self.operands): if is_output_register: for register in get_operand_registers(operand): register_id = register._internal_id register_mask = register.mask if register_mask == GeneralPurposeRegister32._mask: register_mask = GeneralPurposeRegister64._mask elif bool(self.avx_mode) and register_mask == XMMRegister._mask: register_mask = YMMRegister._mask registers_masks[register_id] = \ registers_masks.get(register_id, 0) | register_mask return registers_masks
def output_registers_masks(self): from peachpy.x86_64.operand import get_operand_registers from peachpy.x86_64.registers import GeneralPurposeRegister32, GeneralPurposeRegister64, \ XMMRegister, YMMRegister registers_masks = self._implicit_out_regs.copy() for (is_output_register, operand) in zip(self.out_regs, self.operands): if is_output_register: for register in get_operand_registers(operand): register_id = register._internal_id register_mask = register.mask if register_mask == GeneralPurposeRegister32._mask: register_mask = GeneralPurposeRegister64._mask elif bool(self.avx_mode) and register_mask == XMMRegister._mask: register_mask = YMMRegister._mask registers_masks[register_id] = \ registers_masks.get(register_id, 0) | register_mask return registers_masks
def input_registers_masks(self): from peachpy.x86_64.operand import get_operand_registers if self._cancelling_inputs: from peachpy.x86_64.registers import Register input_operands = [operand for (is_input_reg, operand) in zip(self.in_regs, self.operands) if is_input_reg] assert len(input_operands) == 2, "Instruction forms with cancelling inputs must have two inputs" assert all(map(lambda op: isinstance(op, Register), input_operands)), \ "Both inputs of instruction form with cancelling inputs must be registers" if input_operands[0] == input_operands[1]: return dict() else: return {reg._internal_id: reg.mask for reg in input_operands} else: registers_masks = self._implicit_in_regs.copy() for (has_input_registers, operand) in zip(self.in_regs, self.operands): if has_input_registers: for register in get_operand_registers(operand): register_id = register._internal_id registers_masks[register_id] = \ registers_masks.get(register_id, 0) | register.mask return registers_masks
def registers(self): from peachpy.x86_64.operand import get_operand_registers registers = set() for operand in self.operands: registers.update(get_operand_registers(operand)) return registers