Ejemplo n.º 1
0
 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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
 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
Ejemplo n.º 4
0
 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
Ejemplo n.º 5
0
 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
Ejemplo n.º 6
0
 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
Ejemplo n.º 7
0
 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
Ejemplo n.º 8
0
 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
Ejemplo n.º 9
0
 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
Ejemplo n.º 10
0
 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