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 "llvm/CodeGen/MachineRegisterInfo.h"
20 R600TargetLowering::R600TargetLowering(TargetMachine
&TM
) :
21 AMDGPUTargetLowering(TM
),
22 TII(static_cast<const R600InstrInfo
*>(TM
.getInstrInfo()))
24 setOperationAction(ISD::MUL
, MVT::i64
, Expand
);
25 // setSchedulingPreference(Sched::VLIW);
26 addRegisterClass(MVT::v4f32
, &AMDIL::R600_Reg128RegClass
);
27 addRegisterClass(MVT::f32
, &AMDIL::R600_Reg32RegClass
);
29 setOperationAction(ISD::EXTRACT_VECTOR_ELT
, MVT::v4f32
, Legal
);
30 setOperationAction(ISD::INSERT_VECTOR_ELT
, MVT::v4f32
, Legal
);
33 MachineBasicBlock
* R600TargetLowering::EmitInstrWithCustomInserter(
34 MachineInstr
* MI
, MachineBasicBlock
* BB
) const
36 MachineFunction
* MF
= BB
->getParent();
37 MachineRegisterInfo
&MRI
= MF
->getRegInfo();
39 switch (MI
->getOpcode()) {
40 default: return AMDGPUTargetLowering::EmitInstrWithCustomInserter(MI
, BB
);
41 /* XXX: Use helper function from AMDGPULowerShaderInstructions here */
43 addLiveIn(MI
, MF
, MRI
, TII
, AMDIL::T1_X
);
46 addLiveIn(MI
, MF
, MRI
, TII
, AMDIL::T1_Y
);
49 addLiveIn(MI
, MF
, MRI
, TII
, AMDIL::T1_Z
);
52 addLiveIn(MI
, MF
, MRI
, TII
, AMDIL::T0_X
);
55 addLiveIn(MI
, MF
, MRI
, TII
, AMDIL::T0_Y
);
58 addLiveIn(MI
, MF
, MRI
, TII
, AMDIL::T0_Z
);
60 case AMDIL::NGROUPS_X
:
61 lowerImplicitParameter(MI
, *BB
, MRI
, 0);
63 case AMDIL::NGROUPS_Y
:
64 lowerImplicitParameter(MI
, *BB
, MRI
, 1);
66 case AMDIL::NGROUPS_Z
:
67 lowerImplicitParameter(MI
, *BB
, MRI
, 2);
69 case AMDIL::GLOBAL_SIZE_X
:
70 lowerImplicitParameter(MI
, *BB
, MRI
, 3);
72 case AMDIL::GLOBAL_SIZE_Y
:
73 lowerImplicitParameter(MI
, *BB
, MRI
, 4);
75 case AMDIL::GLOBAL_SIZE_Z
:
76 lowerImplicitParameter(MI
, *BB
, MRI
, 5);
78 case AMDIL::LOCAL_SIZE_X
:
79 lowerImplicitParameter(MI
, *BB
, MRI
, 6);
81 case AMDIL::LOCAL_SIZE_Y
:
82 lowerImplicitParameter(MI
, *BB
, MRI
, 7);
84 case AMDIL::LOCAL_SIZE_Z
:
85 lowerImplicitParameter(MI
, *BB
, MRI
, 8);
88 MI
->eraseFromParent();
92 void R600TargetLowering::lowerImplicitParameter(MachineInstr
*MI
, MachineBasicBlock
&BB
,
93 MachineRegisterInfo
& MRI
, unsigned dword_offset
) const
95 MachineBasicBlock::iterator I
= *MI
;
96 unsigned offsetReg
= MRI
.createVirtualRegister(&AMDIL::R600_TReg32_XRegClass
);
97 MRI
.setRegClass(MI
->getOperand(0).getReg(), &AMDIL::R600_TReg32_XRegClass
);
99 BuildMI(BB
, I
, BB
.findDebugLoc(I
), TII
->get(AMDIL::MOV
), offsetReg
)
100 .addReg(AMDIL::ALU_LITERAL_X
)
101 .addImm(dword_offset
* 4);
103 BuildMI(BB
, I
, BB
.findDebugLoc(I
), TII
->get(AMDIL::VTX_READ_eg
))
104 .addOperand(MI
->getOperand(0))