diff options
Diffstat (limited to 'src/gallium/drivers/radeon/R600InstrInfo.cpp')
-rw-r--r-- | src/gallium/drivers/radeon/R600InstrInfo.cpp | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/src/gallium/drivers/radeon/R600InstrInfo.cpp b/src/gallium/drivers/radeon/R600InstrInfo.cpp index 80adf8c12fa..0c7ffc4334d 100644 --- a/src/gallium/drivers/radeon/R600InstrInfo.cpp +++ b/src/gallium/drivers/radeon/R600InstrInfo.cpp @@ -39,8 +39,26 @@ R600InstrInfo::copyPhysReg(MachineBasicBlock &MBB, unsigned DestReg, unsigned SrcReg, bool KillSrc) const { - BuildMI(MBB, MI, DL, get(AMDIL::MOV), DestReg) - .addReg(SrcReg, getKillRegState(KillSrc)); + + unsigned subRegMap[4] = {AMDIL::sel_x, AMDIL::sel_y, AMDIL::sel_z, AMDIL::sel_w}; + + if (AMDIL::R600_Reg128RegClass.contains(DestReg) + && AMDIL::R600_Reg128RegClass.contains(SrcReg)) { + for (unsigned i = 0; i < 4; i++) { + BuildMI(MBB, MI, DL, get(AMDIL::MOV)) + .addReg(RI.getSubReg(DestReg, subRegMap[i]), RegState::Define) + .addReg(RI.getSubReg(SrcReg, subRegMap[i])) + .addReg(DestReg, RegState::Define | RegState::Implicit); + } + } else { + + /* We can't copy vec4 registers */ + assert(!AMDIL::R600_Reg128RegClass.contains(DestReg) + && !AMDIL::R600_Reg128RegClass.contains(SrcReg)); + + BuildMI(MBB, MI, DL, get(AMDIL::MOV), DestReg) + .addReg(SrcReg, getKillRegState(KillSrc)); + } } unsigned R600InstrInfo::getISAOpcode(unsigned opcode) const |