summaryrefslogtreecommitdiff
path: root/lib/Target/TGSI/TGSIRegisterInfo.cpp
blob: f849d49046914fe52eff6f227c1712d54e0902bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
//===- TGSIRegisterInfo.cpp - TGSI Register Information -------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file contains the TGSI implementation of the TargetRegisterInfo class.
//
//===----------------------------------------------------------------------===//

#include "TGSI.h"
#include "TGSIRegisterInfo.h"
#include "TGSISubtarget.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/IR/Type.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/STLExtras.h"

#define GET_REGINFO_TARGET_DESC
#include "TGSIGenRegisterInfo.inc"

using namespace llvm;

TGSIRegisterInfo::TGSIRegisterInfo(TGSISubtarget &st,
				   const TargetInstrInfo &tii)
  : TGSIGenRegisterInfo(0), Subtarget(st), TII(tii) {
}

const MCPhysReg *TGSIRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF)
                                                                         const {
  static const MCPhysReg regs[] = {
    TGSI::TEMP2, TGSI::TEMP3, TGSI::TEMP4, TGSI::TEMP5, TGSI::TEMP6,
    TGSI::TEMP7, TGSI::TEMP8, TGSI::TEMP9, TGSI::TEMP10, TGSI::TEMP11,
    TGSI::TEMP12, TGSI::TEMP13, TGSI::TEMP14, TGSI::TEMP15, TGSI::TEMP16,
    TGSI::TEMP17, TGSI::TEMP18, TGSI::TEMP19, TGSI::TEMP20, TGSI::TEMP21,
    TGSI::TEMP22, TGSI::TEMP23, TGSI::TEMP24, TGSI::TEMP25, TGSI::TEMP26,
    TGSI::TEMP27, TGSI::TEMP28, TGSI::TEMP29, TGSI::TEMP30, TGSI::TEMP31
  };

  return regs;
}

BitVector TGSIRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
  BitVector rsv(getNumRegs());

  rsv.set(TGSI::TEMP0x);
  rsv.set(TGSI::TEMP0y);
  rsv.set(TGSI::TEMP0z);
  rsv.set(TGSI::TEMP0w);
  rsv.set(TGSI::TEMP0);

  rsv.set(TGSI::SV0x);
  rsv.set(TGSI::SV0y);
  rsv.set(TGSI::SV0z);
  rsv.set(TGSI::SV0w);
  rsv.set(TGSI::SV0);

  rsv.set(TGSI::SV1x);
  rsv.set(TGSI::SV1y);
  rsv.set(TGSI::SV1z);
  rsv.set(TGSI::SV1w);
  rsv.set(TGSI::SV1);

  rsv.set(TGSI::SV2x);
  rsv.set(TGSI::SV2y);
  rsv.set(TGSI::SV2z);
  rsv.set(TGSI::SV2w);
  rsv.set(TGSI::SV2);

  rsv.set(TGSI::SV3x);
  rsv.set(TGSI::SV3y);
  rsv.set(TGSI::SV3z);
  rsv.set(TGSI::SV3w);
  rsv.set(TGSI::SV3);

  rsv.set(TGSI::ADDR0x);
  rsv.set(TGSI::ADDR0y);
  rsv.set(TGSI::ADDR0z);
  rsv.set(TGSI::ADDR0w);
  rsv.set(TGSI::ADDR0);

  return rsv;
}

void TGSIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator ii,
                                           int spadj, unsigned int fiop,
                                           RegScavenger *rs) const {
  unsigned i = 0;
  MachineInstr &mi = *ii;
  DebugLoc dl = mi.getDebugLoc();
  MachineFunction &mf = *mi.getParent()->getParent();

  assert(spadj == 0);

  while (!mi.getOperand(i).isFI()) {
    ++i;
    assert(i < mi.getNumOperands() && "Instr doesn't have FrameIndex operand!");
  }

  int frameidx = mi.getOperand(i).getIndex();
  int offset = mf.getFrameInfo()->getObjectOffset(frameidx);

  // Replace frame index with a frame pointer reference.
  BuildMI(*mi.getParent(), ii, dl, TII.get(TGSI::UADDs), TGSI::TEMP0y)
    .addReg(TGSI::TEMP0x).addImm(offset);
  mi.getOperand(i).ChangeToRegister(TGSI::TEMP0y, false);
}

unsigned TGSIRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
  llvm_unreachable("What is the frame register");
  return 0;
}

unsigned TGSIRegisterInfo::getEHExceptionRegister() const {
  llvm_unreachable("What is the exception register");
  return 0;
}

unsigned TGSIRegisterInfo::getEHHandlerRegister() const {
  llvm_unreachable("What is the exception handler register");
  return 0;
}