1 //===-- SIInstrInfo.cpp - SI Instruction Information ---------------------===//
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 //===----------------------------------------------------------------------===//
11 /// \brief SI Implementation of TargetInstrInfo.
13 //===----------------------------------------------------------------------===//
16 #include "SIInstrInfo.h"
17 #include "AMDGPUTargetMachine.h"
18 #include "llvm/CodeGen/MachineInstrBuilder.h"
19 #include "llvm/CodeGen/MachineRegisterInfo.h"
20 #include "llvm/MC/MCInstrDesc.h"
26 SIInstrInfo::SIInstrInfo(AMDGPUTargetMachine &tm)
27 : AMDGPUInstrInfo(tm),
31 const SIRegisterInfo &SIInstrInfo::getRegisterInfo() const {
36 SIInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
37 MachineBasicBlock::iterator MI, DebugLoc DL,
38 unsigned DestReg, unsigned SrcReg,
40 // If we are trying to copy to or from SCC, there is a bug somewhere else in
41 // the backend. While it may be theoretically possible to do this, it should
42 // never be necessary.
43 assert(DestReg != AMDGPU::SCC && SrcReg != AMDGPU::SCC);
45 if (AMDGPU::SReg_64RegClass.contains(DestReg)) {
46 assert(AMDGPU::SReg_64RegClass.contains(SrcReg));
47 BuildMI(MBB, MI, DL, get(AMDGPU::S_MOV_B64), DestReg)
48 .addReg(SrcReg, getKillRegState(KillSrc));
49 } else if (AMDGPU::VReg_32RegClass.contains(DestReg)) {
50 assert(AMDGPU::VReg_32RegClass.contains(SrcReg) ||
51 AMDGPU::SReg_32RegClass.contains(SrcReg));
52 BuildMI(MBB, MI, DL, get(AMDGPU::V_MOV_B32_e32), DestReg)
53 .addReg(SrcReg, getKillRegState(KillSrc));
55 assert(AMDGPU::SReg_32RegClass.contains(DestReg));
56 assert(AMDGPU::SReg_32RegClass.contains(SrcReg));
57 BuildMI(MBB, MI, DL, get(AMDGPU::S_MOV_B32), DestReg)
58 .addReg(SrcReg, getKillRegState(KillSrc));
62 MachineInstr * SIInstrInfo::getMovImmInstr(MachineFunction *MF, unsigned DstReg,
64 MachineInstr * MI = MF->CreateMachineInstr(get(AMDGPU::V_MOV_IMM_I32), DebugLoc());
65 MachineInstrBuilder MIB(*MF, MI);
66 MIB.addReg(DstReg, RegState::Define);
73 bool SIInstrInfo::isMov(unsigned Opcode) const {
75 default: return false;
76 case AMDGPU::S_MOV_B32:
77 case AMDGPU::S_MOV_B64:
78 case AMDGPU::V_MOV_B32_e32:
79 case AMDGPU::V_MOV_B32_e64:
80 case AMDGPU::V_MOV_IMM_F32:
81 case AMDGPU::V_MOV_IMM_I32:
82 case AMDGPU::S_MOV_IMM_I32:
88 SIInstrInfo::isSafeToMoveRegClassDefs(const TargetRegisterClass *RC) const {
89 return RC != &AMDGPU::EXECRegRegClass;