Ejemplo n.º 1
0
    def _synthesize_epilogue(self):
        """
    Save the values in some registers (see PPC ABI p41)
    """

        # Reset the epilogue
        self._epilogue = [self.lbl_epilogue]

        # Restore vrsave
        self._epilogue.append(ppc.mtvrsave(self._vrsave))

        # Get the list of saved registers
        save_gp = [
            reg for reg in self._register_files[GPRegister].get_used()
            if reg in gp_save
        ]
        save_fp = [
            reg for reg in self._register_files[FPRegister].get_used()
            if reg in fp_save
        ]
        save_vx = [
            reg for reg in self._register_files[VMXRegister].get_used()
            if reg in vx_save
        ]

        r_addr = GPRegister(13, None)  # Only available volatile register
        r_idx = GPRegister(14,
                           None)  # Non-volatile; safe to use before restoring

        self._load_word(self._epilogue, r_addr,
                        self._saved_vx_registers.buffer_info()[0])

        for i, reg in enumerate(save_vx):
            #print 'restoring vx:', reg, r_addr, i * WORD_SIZE * 4
            self._load_word(self._epilogue, r_idx, i * WORD_SIZE * 4)
            self._epilogue.append(
                vmx.lvx(reg, r_idx, r_addr, ignore_active=True))

        self._load_word(self._epilogue, r_addr,
                        self._saved_fp_registers.buffer_info()[0])

        for i, reg in enumerate(save_fp):
            # print 'restoring fp:', reg, r_addr, i * WORD_SIZE
            self._epilogue.append(
                ppc.lfd(reg, r_addr, i * WORD_SIZE * 2, ignore_active=True))

        self._load_word(self._epilogue, r_addr,
                        self._saved_gp_registers.buffer_info()[0])

        for i, reg in enumerate(save_gp):
            # print 'restoring gp:', reg, r_addr, i * WORD_SIZE
            self._epilogue.append(
                ppc.lwz(reg, r_addr, i * WORD_SIZE, ignore_active=True))

        self._epilogue.append(ppc.blr(ignore_active=True))
        return
Ejemplo n.º 2
0
    def _synthesize_epilogue(self):
        """
    Save the values in some registers (see PPC ABI p41)
    """

        # Reset the epilogue
        self._epilogue = [self.lbl_epilogue]

        r_addr = GPRegister(13)  # Only available volatile register
        r_idx = GPRegister(14)  # Non-volatile; safe to use before restoring

        # Get the list of saved registers
        save_gp = [r for r in self._used_registers[GPRegister] if r in gp_save]
        save_fp = [r for r in self._used_registers[FPRegister] if r in fp_save]

        if self._enable_vmx:
            save_vx = [
                r for r in self._used_registers[VMXRegister] if r in vx_save
            ]

            if len(save_vx) > 0:
                # Restore vrsave
                self._epilogue.append(
                    ppc.mtvrsave(self._vrsave, ignore_active=True))

                # Restore saved VMX registers
                self._load_word(self._epilogue, r_addr,
                                self._saved_vx_registers.buffer_info()[0])

                for i, reg in enumerate(save_vx):
                    self._load_word(self._epilogue, r_idx, i * WORD_SIZE * 4)
                    self._epilogue.append(
                        vmx.lvx(reg, r_idx, r_addr, ignore_active=True))

        if len(save_fp) > 0:
            # Restore saved FP registers
            self._load_word(self._epilogue, r_addr,
                            self._saved_fp_registers.buffer_info()[0])

            for i, reg in enumerate(save_fp):
                self._epilogue.append(
                    ppc.lfd(reg, r_addr, i * WORD_SIZE * 2,
                            ignore_active=True))

        if len(save_gp) > 0:
            # Restore saved GP registers
            self._load_word(self._epilogue, r_addr,
                            self._saved_gp_registers.buffer_info()[0])

            for i, reg in enumerate(save_gp):
                self._epilogue.append(
                    ppc.lwz(reg, r_addr, i * WORD_SIZE, ignore_active=True))

        self._epilogue.append(ppc.blr(ignore_active=True))
        return
Ejemplo n.º 3
0
def load_vector(code, v_target, addr):
    """
  Generate the code to load a vector into a vector register.
  """
    r_temp = code.prgm.acquire_register()

    load_word(code, r_temp, addr)
    code.add(vmx.lvx(v_target, 0, r_temp))
    code.prgm.release_register(r_temp)

    return
Ejemplo n.º 4
0
def load_vector(code, v_target, addr):
  """
  Generate the code to load a vector into a vector register.
  """
  r_temp = code.prgm.acquire_register()

  load_word(code, r_temp, addr)
  code.add(vmx.lvx(v_target, 0, r_temp))
  code.prgm.release_register(r_temp)
  
  return
Ejemplo n.º 5
0
  def _synthesize_epilogue(self):
    """
    Save the values in some registers (see PPC ABI p41)
    """

    # Reset the epilogue
    self._epilogue = [self.lbl_epilogue]

    r_addr = GPRegister(13) # Only available volatile register
    r_idx = GPRegister(14)  # Non-volatile; safe to use before restoring

    # Get the list of saved registers
    save_gp = [r for r in self._used_registers[GPRegister] if r in gp_save]
    save_fp = [r for r in self._used_registers[FPRegister] if r in fp_save]

    if self._enable_vmx:
      save_vx = [r for r in self._used_registers[VMXRegister] if r in vx_save]

      if len(save_vx) > 0:
        # Restore vrsave
        self._epilogue.append(ppc.mtvrsave(self._vrsave, ignore_active = True))

        # Restore saved VMX registers
        self._load_word(self._epilogue, r_addr,
            self._saved_vx_registers.buffer_info()[0])

        for i, reg in enumerate(save_vx):
          self._load_word(self._epilogue, r_idx, i * WORD_SIZE * 4)
          self._epilogue.append(
              vmx.lvx(reg, r_idx, r_addr, ignore_active = True))

    if len(save_fp) > 0:
      # Restore saved FP registers
      self._load_word(self._epilogue, r_addr,
          self._saved_fp_registers.buffer_info()[0])

      for i, reg in enumerate(save_fp):
        self._epilogue.append(
            ppc.lfd(reg, r_addr, i * WORD_SIZE * 2, ignore_active = True))

    if len(save_gp) > 0:
      # Restore saved GP registers
      self._load_word(self._epilogue, r_addr,
          self._saved_gp_registers.buffer_info()[0])

      for i, reg in enumerate(save_gp):
        self._epilogue.append(
            ppc.lwz(reg, r_addr, i * WORD_SIZE, ignore_active = True))

    self._epilogue.append(ppc.blr(ignore_active = True))
    return
Ejemplo n.º 6
0
 def load_current(self):
   return self.code.add(vmx.lvx(self.r_current, self.r_count, self.r_addr))