mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-03 14:21:30 +00:00 
			
		
		
		
	R600 port. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229804 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			78 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//===-- SIMachineFunctionInfo.cpp - SI Machine Function Info -------===//
 | 
						|
//
 | 
						|
//                     The LLVM Compiler Infrastructure
 | 
						|
//
 | 
						|
// This file is distributed under the University of Illinois Open Source
 | 
						|
// License. See LICENSE.TXT for details.
 | 
						|
//
 | 
						|
/// \file
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
 | 
						|
#include "SIMachineFunctionInfo.h"
 | 
						|
#include "AMDGPUSubtarget.h"
 | 
						|
#include "SIInstrInfo.h"
 | 
						|
#include "llvm/CodeGen/MachineInstrBuilder.h"
 | 
						|
#include "llvm/CodeGen/MachineFrameInfo.h"
 | 
						|
#include "llvm/CodeGen/MachineRegisterInfo.h"
 | 
						|
#include "llvm/IR/Function.h"
 | 
						|
#include "llvm/IR/LLVMContext.h"
 | 
						|
 | 
						|
#define MAX_LANES 64
 | 
						|
 | 
						|
using namespace llvm;
 | 
						|
 | 
						|
 | 
						|
// Pin the vtable to this file.
 | 
						|
void SIMachineFunctionInfo::anchor() {}
 | 
						|
 | 
						|
SIMachineFunctionInfo::SIMachineFunctionInfo(const MachineFunction &MF)
 | 
						|
  : AMDGPUMachineFunction(MF),
 | 
						|
    TIDReg(AMDGPU::NoRegister),
 | 
						|
    HasSpilledVGPRs(false),
 | 
						|
    PSInputAddr(0),
 | 
						|
    NumUserSGPRs(0),
 | 
						|
    LDSWaveSpillSize(0) { }
 | 
						|
 | 
						|
SIMachineFunctionInfo::SpilledReg SIMachineFunctionInfo::getSpilledReg(
 | 
						|
                                                       MachineFunction *MF,
 | 
						|
                                                       unsigned FrameIndex,
 | 
						|
                                                       unsigned SubIdx) {
 | 
						|
  const MachineFrameInfo *FrameInfo = MF->getFrameInfo();
 | 
						|
  const SIRegisterInfo *TRI = static_cast<const SIRegisterInfo *>(
 | 
						|
      MF->getSubtarget<AMDGPUSubtarget>().getRegisterInfo());
 | 
						|
  MachineRegisterInfo &MRI = MF->getRegInfo();
 | 
						|
  int64_t Offset = FrameInfo->getObjectOffset(FrameIndex);
 | 
						|
  Offset += SubIdx * 4;
 | 
						|
 | 
						|
  unsigned LaneVGPRIdx = Offset / (64 * 4);
 | 
						|
  unsigned Lane = (Offset / 4) % 64;
 | 
						|
 | 
						|
  struct SpilledReg Spill;
 | 
						|
 | 
						|
  if (!LaneVGPRs.count(LaneVGPRIdx)) {
 | 
						|
    unsigned LaneVGPR = TRI->findUnusedRegister(MRI, &AMDGPU::VGPR_32RegClass);
 | 
						|
    LaneVGPRs[LaneVGPRIdx] = LaneVGPR;
 | 
						|
    MRI.setPhysRegUsed(LaneVGPR);
 | 
						|
 | 
						|
    // Add this register as live-in to all blocks to avoid machine verifer
 | 
						|
    // complaining about use of an undefined physical register.
 | 
						|
    for (MachineFunction::iterator BI = MF->begin(), BE = MF->end();
 | 
						|
         BI != BE; ++BI) {
 | 
						|
      BI->addLiveIn(LaneVGPR);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  Spill.VGPR = LaneVGPRs[LaneVGPRIdx];
 | 
						|
  Spill.Lane = Lane;
 | 
						|
  return Spill;
 | 
						|
}
 | 
						|
 | 
						|
unsigned SIMachineFunctionInfo::getMaximumWorkGroupSize(
 | 
						|
                                              const MachineFunction &MF) const {
 | 
						|
  const AMDGPUSubtarget &ST = MF.getSubtarget<AMDGPUSubtarget>();
 | 
						|
  // FIXME: We should get this information from kernel attributes if it
 | 
						|
  // is available.
 | 
						|
  return getShaderType() == ShaderType::COMPUTE ? 256 : ST.getWavefrontSize();
 | 
						|
}
 |