1 //===-- R600InstrInfo.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 "R600InstrInfo.h"
15 #include "AMDGPUTargetMachine.h"
16 #include "R600RegisterInfo.h"
20 R600InstrInfo::R600InstrInfo(AMDGPUTargetMachine
&tm
)
21 : AMDGPUInstrInfo(tm
),
26 const R600RegisterInfo
&R600InstrInfo::getRegisterInfo() const
31 bool R600InstrInfo::isTrig(const MachineInstr
&MI
) const
33 return get(MI
.getOpcode()).TSFlags
& R600_InstFlag::TRIG
;
37 R600InstrInfo::copyPhysReg(MachineBasicBlock
&MBB
,
38 MachineBasicBlock::iterator MI
, DebugLoc DL
,
39 unsigned DestReg
, unsigned SrcReg
,
43 unsigned subRegMap
[4] = {AMDIL::sel_x
, AMDIL::sel_y
, AMDIL::sel_z
, AMDIL::sel_w
};
45 if (AMDIL::R600_Reg128RegClass
.contains(DestReg
)
46 && AMDIL::R600_Reg128RegClass
.contains(SrcReg
)) {
47 for (unsigned i
= 0; i
< 4; i
++) {
48 BuildMI(MBB
, MI
, DL
, get(AMDIL::MOV
))
49 .addReg(RI
.getSubReg(DestReg
, subRegMap
[i
]), RegState::Define
)
50 .addReg(RI
.getSubReg(SrcReg
, subRegMap
[i
]))
51 .addReg(DestReg
, RegState::Define
| RegState::Implicit
);
55 /* We can't copy vec4 registers */
56 assert(!AMDIL::R600_Reg128RegClass
.contains(DestReg
)
57 && !AMDIL::R600_Reg128RegClass
.contains(SrcReg
));
59 BuildMI(MBB
, MI
, DL
, get(AMDIL::MOV
), DestReg
)
60 .addReg(SrcReg
, getKillRegState(KillSrc
));
64 unsigned R600InstrInfo::getISAOpcode(unsigned opcode
) const
67 default: return AMDGPUInstrInfo::getISAOpcode(opcode
);
68 case AMDIL::CUSTOM_ADD_i32
:
69 return AMDIL::ADD_INT
;
70 case AMDIL::CUSTOM_XOR_i32
:
71 return AMDIL::XOR_INT
;
80 unsigned R600InstrInfo::getLSHRop() const
82 unsigned gen
= TM
.getSubtarget
<AMDILSubtarget
>().device()->getGeneration();
83 if (gen
< AMDILDeviceInfo::HD5XXX
) {
84 return AMDIL::LSHR_r600
;
86 return AMDIL::LSHR_eg
;
90 unsigned R600InstrInfo::getMULHI_UINT() const
92 unsigned gen
= TM
.getSubtarget
<AMDILSubtarget
>().device()->getGeneration();
94 if (gen
< AMDILDeviceInfo::HD5XXX
) {
95 return AMDIL::MULHI_UINT_r600
;
97 return AMDIL::MULHI_UINT_eg
;
101 unsigned R600InstrInfo::getMULLO_UINT() const
103 unsigned gen
= TM
.getSubtarget
<AMDILSubtarget
>().device()->getGeneration();
105 if (gen
< AMDILDeviceInfo::HD5XXX
) {
106 return AMDIL::MULLO_UINT_r600
;
108 return AMDIL::MULLO_UINT_eg
;
112 unsigned R600InstrInfo::getRECIP_UINT() const
114 const AMDILDevice
* dev
= TM
.getSubtarget
<AMDILSubtarget
>().device();
116 if (dev
->getGeneration() < AMDILDeviceInfo::HD5XXX
) {
117 return AMDIL::RECIP_UINT_r600
;
118 } else if (dev
->getDeviceFlag() != OCL_DEVICE_CAYMAN
) {
119 return AMDIL::RECIP_UINT_eg
;
121 return AMDIL::RECIP_UINT_cm
;