R600: Support for indirect addressing v4
[oota-llvm.git] / lib / Target / R600 / AMDGPURegisterInfo.cpp
1 //===-- AMDGPURegisterInfo.cpp - AMDGPU Register Information -------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 /// \file
11 /// \brief Parent TargetRegisterInfo class common to all hw codegen targets.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "AMDGPURegisterInfo.h"
16 #include "AMDGPUTargetMachine.h"
17
18 using namespace llvm;
19
20 AMDGPURegisterInfo::AMDGPURegisterInfo(TargetMachine &tm,
21     const TargetInstrInfo &tii)
22 : AMDGPUGenRegisterInfo(0),
23   TM(tm),
24   TII(tii)
25   { }
26
27 //===----------------------------------------------------------------------===//
28 // Function handling callbacks - Functions are a seldom used feature of GPUS, so
29 // they are not supported at this time.
30 //===----------------------------------------------------------------------===//
31
32 const uint16_t AMDGPURegisterInfo::CalleeSavedReg = AMDGPU::NoRegister;
33
34 const uint16_t* AMDGPURegisterInfo::getCalleeSavedRegs(const MachineFunction *MF)
35                                                                          const {
36   return &CalleeSavedReg;
37 }
38
39 void AMDGPURegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI,
40                                              int SPAdj,
41                                              unsigned FIOperandNum,
42                                              RegScavenger *RS) const {
43   assert(!"Subroutines not supported yet");
44 }
45
46 unsigned AMDGPURegisterInfo::getFrameRegister(const MachineFunction &MF) const {
47   assert(!"Subroutines not supported yet");
48   return 0;
49 }
50
51 unsigned AMDGPURegisterInfo::getIndirectSubReg(unsigned IndirectIndex) const {
52
53   switch(IndirectIndex) {
54   case 0: return AMDGPU::indirect_0;
55   case 1: return AMDGPU::indirect_1;
56   case 2: return AMDGPU::indirect_2;
57   case 3: return AMDGPU::indirect_3;
58   case 4: return AMDGPU::indirect_4;
59   case 5: return AMDGPU::indirect_5;
60   case 6: return AMDGPU::indirect_6;
61   case 7: return AMDGPU::indirect_7;
62   case 8: return AMDGPU::indirect_8;
63   case 9: return AMDGPU::indirect_9;
64   case 10: return AMDGPU::indirect_10;
65   case 11: return AMDGPU::indirect_11;
66   case 12: return AMDGPU::indirect_12;
67   case 13: return AMDGPU::indirect_13;
68   case 14: return AMDGPU::indirect_14;
69   case 15: return AMDGPU::indirect_15;
70   default: llvm_unreachable("indirect index out of range");
71   }
72 }
73
74 #define GET_REGINFO_TARGET_DESC
75 #include "AMDGPUGenRegisterInfo.inc"