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
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
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
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
def load_current(self): return self.code.add(vmx.lvx(self.r_current, self.r_count, self.r_addr))