1 //===-- R600ISelLowering.cpp - TODO: Add brief description -------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // TODO: Add full description
12 //===----------------------------------------------------------------------===//
14 #include "R600ISelLowering.h"
15 #include "R600InstrInfo.h"
16 #include "R600MachineFunctionInfo.h"
17 #include "llvm/CodeGen/MachineRegisterInfo.h"
21 R600TargetLowering::R600TargetLowering(TargetMachine
&TM
) :
22 AMDGPUTargetLowering(TM
),
23 TII(static_cast<const R600InstrInfo
*>(TM
.getInstrInfo()))
25 setOperationAction(ISD::MUL
, MVT::i64
, Expand
);
26 // setSchedulingPreference(Sched::VLIW);
27 addRegisterClass(MVT::v4f32
, &AMDIL::R600_Reg128RegClass
);
28 addRegisterClass(MVT::f32
, &AMDIL::R600_Reg32RegClass
);
29 addRegisterClass(MVT::v4i32
, &AMDIL::R600_Reg128RegClass
);
30 addRegisterClass(MVT::i32
, &AMDIL::R600_Reg32RegClass
);
32 setOperationAction(ISD::EXTRACT_VECTOR_ELT
, MVT::v4f32
, Legal
);
33 setOperationAction(ISD::INSERT_VECTOR_ELT
, MVT::v4f32
, Legal
);
34 setOperationAction(ISD::EXTRACT_VECTOR_ELT
, MVT::v4i32
, Legal
);
35 setOperationAction(ISD::INSERT_VECTOR_ELT
, MVT::v4i32
, Legal
);
38 MachineBasicBlock
* R600TargetLowering::EmitInstrWithCustomInserter(
39 MachineInstr
* MI
, MachineBasicBlock
* BB
) const
41 MachineFunction
* MF
= BB
->getParent();
42 MachineRegisterInfo
&MRI
= MF
->getRegInfo();
44 switch (MI
->getOpcode()) {
45 default: return AMDGPUTargetLowering::EmitInstrWithCustomInserter(MI
, BB
);
46 /* XXX: Use helper function from AMDGPULowerShaderInstructions here */
48 addLiveIn(MI
, MF
, MRI
, TII
, AMDIL::T1_X
);
51 addLiveIn(MI
, MF
, MRI
, TII
, AMDIL::T1_Y
);
54 addLiveIn(MI
, MF
, MRI
, TII
, AMDIL::T1_Z
);
57 addLiveIn(MI
, MF
, MRI
, TII
, AMDIL::T0_X
);
60 addLiveIn(MI
, MF
, MRI
, TII
, AMDIL::T0_Y
);
63 addLiveIn(MI
, MF
, MRI
, TII
, AMDIL::T0_Z
);
65 case AMDIL::NGROUPS_X
:
66 lowerImplicitParameter(MI
, *BB
, MRI
, 0);
68 case AMDIL::NGROUPS_Y
:
69 lowerImplicitParameter(MI
, *BB
, MRI
, 1);
71 case AMDIL::NGROUPS_Z
:
72 lowerImplicitParameter(MI
, *BB
, MRI
, 2);
74 case AMDIL::GLOBAL_SIZE_X
:
75 lowerImplicitParameter(MI
, *BB
, MRI
, 3);
77 case AMDIL::GLOBAL_SIZE_Y
:
78 lowerImplicitParameter(MI
, *BB
, MRI
, 4);
80 case AMDIL::GLOBAL_SIZE_Z
:
81 lowerImplicitParameter(MI
, *BB
, MRI
, 5);
83 case AMDIL::LOCAL_SIZE_X
:
84 lowerImplicitParameter(MI
, *BB
, MRI
, 6);
86 case AMDIL::LOCAL_SIZE_Y
:
87 lowerImplicitParameter(MI
, *BB
, MRI
, 7);
89 case AMDIL::LOCAL_SIZE_Z
:
90 lowerImplicitParameter(MI
, *BB
, MRI
, 8);
92 case AMDIL::LOAD_INPUT
:
94 int64_t RegIndex
= MI
->getOperand(1).getImm();
95 addLiveIn(MI
, MF
, MRI
, TII
,
96 AMDIL::R600_TReg32RegClass
.getRegister(RegIndex
));
97 MI
->eraseFromParent();
100 case AMDIL::STORE_OUTPUT
:
102 MachineBasicBlock::iterator I
= *MI
;
103 int64_t OutputIndex
= MI
->getOperand(1).getImm();
104 unsigned OutputReg
= AMDIL::R600_TReg32RegClass
.getRegister(OutputIndex
);
106 BuildMI(*BB
, I
, BB
->findDebugLoc(I
), TII
->get(AMDIL::COPY
), OutputReg
)
107 .addOperand(MI
->getOperand(0));
109 if (!MRI
.isLiveOut(OutputReg
)) {
110 MRI
.addLiveOut(OutputReg
);
112 MI
->eraseFromParent();
116 case AMDIL::RESERVE_REG
:
118 R600MachineFunctionInfo
* MFI
= MF
->getInfo
<R600MachineFunctionInfo
>();
119 int64_t ReservedIndex
= MI
->getOperand(0).getImm();
120 unsigned ReservedReg
=
121 AMDIL::R600_TReg32RegClass
.getRegister(ReservedIndex
);
122 MFI
->ReservedRegs
.push_back(ReservedReg
);
123 MI
->eraseFromParent();
131 void R600TargetLowering::lowerImplicitParameter(MachineInstr
*MI
, MachineBasicBlock
&BB
,
132 MachineRegisterInfo
& MRI
, unsigned dword_offset
) const
134 MachineBasicBlock::iterator I
= *MI
;
135 unsigned offsetReg
= MRI
.createVirtualRegister(&AMDIL::R600_TReg32_XRegClass
);
136 MRI
.setRegClass(MI
->getOperand(0).getReg(), &AMDIL::R600_TReg32_XRegClass
);
138 BuildMI(BB
, I
, BB
.findDebugLoc(I
), TII
->get(AMDIL::MOV
), offsetReg
)
139 .addReg(AMDIL::ALU_LITERAL_X
)
140 .addImm(dword_offset
* 4);
142 BuildMI(BB
, I
, BB
.findDebugLoc(I
), TII
->get(AMDIL::VTX_READ_eg
))
143 .addOperand(MI
->getOperand(0))