45 const char *getPassName()
const {
46 return "R600 Expand special instructions pass";
55 return new R600ExpandSpecialInstrsPass(TM);
58 bool R600ExpandSpecialInstrsPass::runOnMachineFunction(
MachineFunction &MF) {
67 while (I != MBB.
end()) {
73 int DstIdx =
TII->getOperandIdx(MI.
getOpcode(), AMDGPU::OpName::dst);
77 DstOp.
getReg(), AMDGPU::OQAP);
78 DstOp.
setReg(AMDGPU::OQAP);
80 AMDGPU::OpName::pred_sel);
82 AMDGPU::OpName::pred_sel);
91 case AMDGPU::PRED_X: {
102 TII->setImmOperand(PredSet, AMDGPU::OpName::update_exec_mask, 1);
104 TII->setImmOperand(PredSet, AMDGPU::OpName::update_pred, 1);
110 case AMDGPU::INTERP_PAIR_XY: {
112 unsigned PReg = AMDGPU::R600_ArrayBaseRegClass.getRegister(
115 for (
unsigned Chan = 0; Chan < 4; ++Chan) {
121 DstReg = Chan == 2 ? AMDGPU::T0_Z : AMDGPU::T0_W;
123 BMI =
TII->buildDefaultInstruction(MBB, I, AMDGPU::INTERP_XY,
139 case AMDGPU::INTERP_PAIR_ZW: {
141 unsigned PReg = AMDGPU::R600_ArrayBaseRegClass.getRegister(
144 for (
unsigned Chan = 0; Chan < 4; ++Chan) {
148 DstReg = Chan == 0 ? AMDGPU::T0_X : AMDGPU::T0_Y;
152 BMI =
TII->buildDefaultInstruction(MBB, I, AMDGPU::INTERP_ZW,
168 case AMDGPU::INTERP_VEC_LOAD: {
171 unsigned PReg = AMDGPU::R600_ArrayBaseRegClass.getRegister(
175 for (
unsigned Chan = 0; Chan < 4; ++Chan) {
176 BMI =
TII->buildDefaultInstruction(MBB, I, AMDGPU::INTERP_LOAD_P0,
188 case AMDGPU::DOT_4: {
193 unsigned DstBase = TRI.getEncodingValue(DstReg) &
HW_REG_MASK;
195 for (
unsigned Chan = 0; Chan < 4; ++Chan) {
198 AMDGPU::R600_TReg32RegClass.getRegister((DstBase * 4) + Chan);
200 TII->buildSlotOfVectorInstruction(MBB, &MI, Chan, SubDstReg);
213 TII->getOperandIdx(Opcode, AMDGPU::OpName::src0))
216 TII->getOperandIdx(Opcode, AMDGPU::OpName::src1))
220 if ((TRI.getEncodingValue(Src0) & 0xff) < 127 &&
221 (TRI.getEncodingValue(Src1) & 0xff) < 127)
230 bool IsVector =
TII->isVector(MI);
232 if (!IsReduction && !IsVector && !IsCube) {
261 for (
unsigned Chan = 0; Chan < 4; Chan++) {
263 TII->getOperandIdx(MI, AMDGPU::OpName::dst)).
getReg();
265 TII->getOperandIdx(MI, AMDGPU::OpName::src0)).
getReg();
270 int Src1Idx =
TII->getOperandIdx(MI, AMDGPU::OpName::src1);
277 Src0 = TRI.getSubReg(Src0, SubRegIndex);
278 Src1 = TRI.getSubReg(Src1, SubRegIndex);
280 static const int CubeSrcSwz[] = {2, 2, 0, 1};
283 Src1 = TRI.getSubReg(Src0, SubRegIndex1);
284 Src0 = TRI.getSubReg(Src0, SubRegIndex0);
292 DstReg = TRI.getSubReg(DstReg, SubRegIndex);
297 unsigned DstBase = TRI.getEncodingValue(DstReg) &
HW_REG_MASK;
298 DstReg = AMDGPU::R600_TReg32RegClass.getRegister((DstBase * 4) + Chan);
302 NotLast = (Chan != 3 );
307 case AMDGPU::CUBE_r600_pseudo:
308 Opcode = AMDGPU::CUBE_r600_real;
310 case AMDGPU::CUBE_eg_pseudo:
311 Opcode = AMDGPU::CUBE_eg_real;
318 TII->buildDefaultInstruction(MBB, I, Opcode, DstReg, Src0, Src1);
Interface definition for R600InstrInfo.
unsigned getHWRegChan(unsigned reg) const
get the HW encoding for a register's channel.
Interface definition for R600RegisterInfo.
const HexagonInstrInfo * TII
FunctionPass * createR600ExpandSpecialInstrsPass(TargetMachine &tm)
ID
LLVM Calling Convention Representation.
#define HW_REG_MASK
Defines for extracting register infomation from register encoding.
bundle_iterator< MachineInstr, instr_iterator > iterator
const MachineOperand & getOperand(unsigned i) const
unsigned getSubRegFromChannel(unsigned Channel) const
ItTy next(ItTy it, Dist n)
virtual const TargetInstrInfo * getInstrInfo() const
void setReg(unsigned Reg)
static unsigned getReg(const void *D, unsigned RC, unsigned RegNo)
const TargetMachine & getTarget() const
unsigned getReg() const
getReg - Returns the register number.
virtual const HexagonRegisterInfo & getRegisterInfo() const
BasicBlockListType::iterator iterator