summaryrefslogtreecommitdiff
path: root/lib/Target/R600/R600ControlFlowFinalizer.cpp
diff options
context:
space:
mode:
authorVincent Lejeune <vljn@ovi.com>2013-04-23 17:34:00 +0000
committerVincent Lejeune <vljn@ovi.com>2013-04-23 17:34:00 +0000
commit7a28d8afa77ac3afce265f2b61fb321e4e0d84d7 (patch)
tree655659c2448a2f93f9492bf3dfe69e307781f10d /lib/Target/R600/R600ControlFlowFinalizer.cpp
parenta7d9a6ee63bec70fecea79b85a30108ed3e8fabd (diff)
downloadllvm-7a28d8afa77ac3afce265f2b61fb321e4e0d84d7.tar.gz
llvm-7a28d8afa77ac3afce265f2b61fb321e4e0d84d7.tar.bz2
llvm-7a28d8afa77ac3afce265f2b61fb321e4e0d84d7.tar.xz
R600: Add CF_END
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@180123 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/R600/R600ControlFlowFinalizer.cpp')
-rw-r--r--lib/Target/R600/R600ControlFlowFinalizer.cpp91
1 files changed, 49 insertions, 42 deletions
diff --git a/lib/Target/R600/R600ControlFlowFinalizer.cpp b/lib/Target/R600/R600ControlFlowFinalizer.cpp
index bc1ca58b86..e683d7594b 100644
--- a/lib/Target/R600/R600ControlFlowFinalizer.cpp
+++ b/lib/Target/R600/R600ControlFlowFinalizer.cpp
@@ -39,7 +39,8 @@ private:
CF_LOOP_CONTINUE,
CF_JUMP,
CF_ELSE,
- CF_POP
+ CF_POP,
+ CF_END
};
static char ID;
@@ -91,49 +92,46 @@ private:
}
const MCInstrDesc &getHWInstrDesc(ControlFlowInstruction CFI) const {
- if (ST.device()->getGeneration() <= AMDGPUDeviceInfo::HD4XXX) {
- switch (CFI) {
- case CF_TC:
- return TII->get(AMDGPU::CF_TC_R600);
- case CF_CALL_FS:
- return TII->get(AMDGPU::CF_CALL_FS_R600);
- case CF_WHILE_LOOP:
- return TII->get(AMDGPU::WHILE_LOOP_R600);
- case CF_END_LOOP:
- return TII->get(AMDGPU::END_LOOP_R600);
- case CF_LOOP_BREAK:
- return TII->get(AMDGPU::LOOP_BREAK_R600);
- case CF_LOOP_CONTINUE:
- return TII->get(AMDGPU::CF_CONTINUE_R600);
- case CF_JUMP:
- return TII->get(AMDGPU::CF_JUMP_R600);
- case CF_ELSE:
- return TII->get(AMDGPU::CF_ELSE_R600);
- case CF_POP:
- return TII->get(AMDGPU::POP_R600);
- }
- } else {
- switch (CFI) {
- case CF_TC:
- return TII->get(AMDGPU::CF_TC_EG);
- case CF_CALL_FS:
- return TII->get(AMDGPU::CF_CALL_FS_EG);
- case CF_WHILE_LOOP:
- return TII->get(AMDGPU::WHILE_LOOP_EG);
- case CF_END_LOOP:
- return TII->get(AMDGPU::END_LOOP_EG);
- case CF_LOOP_BREAK:
- return TII->get(AMDGPU::LOOP_BREAK_EG);
- case CF_LOOP_CONTINUE:
- return TII->get(AMDGPU::CF_CONTINUE_EG);
- case CF_JUMP:
- return TII->get(AMDGPU::CF_JUMP_EG);
- case CF_ELSE:
- return TII->get(AMDGPU::CF_ELSE_EG);
- case CF_POP:
- return TII->get(AMDGPU::POP_EG);
+ unsigned Opcode = 0;
+ bool isEg = (ST.device()->getGeneration() >= AMDGPUDeviceInfo::HD5XXX);
+ switch (CFI) {
+ case CF_TC:
+ Opcode = isEg ? AMDGPU::CF_TC_EG : AMDGPU::CF_TC_R600;
+ break;
+ case CF_CALL_FS:
+ Opcode = isEg ? AMDGPU::CF_CALL_FS_EG : AMDGPU::CF_CALL_FS_R600;
+ break;
+ case CF_WHILE_LOOP:
+ Opcode = isEg ? AMDGPU::WHILE_LOOP_EG : AMDGPU::WHILE_LOOP_R600;
+ break;
+ case CF_END_LOOP:
+ Opcode = isEg ? AMDGPU::END_LOOP_EG : AMDGPU::END_LOOP_R600;
+ break;
+ case CF_LOOP_BREAK:
+ Opcode = isEg ? AMDGPU::LOOP_BREAK_EG : AMDGPU::LOOP_BREAK_R600;
+ break;
+ case CF_LOOP_CONTINUE:
+ Opcode = isEg ? AMDGPU::CF_CONTINUE_EG : AMDGPU::CF_CONTINUE_R600;
+ break;
+ case CF_JUMP:
+ Opcode = isEg ? AMDGPU::CF_JUMP_EG : AMDGPU::CF_JUMP_R600;
+ break;
+ case CF_ELSE:
+ Opcode = isEg ? AMDGPU::CF_ELSE_EG : AMDGPU::CF_ELSE_R600;
+ break;
+ case CF_POP:
+ Opcode = isEg ? AMDGPU::POP_EG : AMDGPU::POP_R600;
+ break;
+ case CF_END:
+ if (ST.device()->getGeneration() == AMDGPUDeviceInfo::HD6XXX) {
+ Opcode = AMDGPU::CF_END_CM;
+ break;
}
+ Opcode = isEg ? AMDGPU::CF_END_EG : AMDGPU::CF_END_R600;
+ break;
}
+ assert (Opcode && "No opcode selected");
+ return TII->get(Opcode);
}
MachineBasicBlock::iterator
@@ -310,6 +308,15 @@ public:
CfCount++;
break;
}
+ case AMDGPU::RETURN: {
+ BuildMI(MBB, MI, MBB.findDebugLoc(MI), getHWInstrDesc(CF_END));
+ CfCount++;
+ MI->eraseFromParent();
+ if (CfCount % 2) {
+ BuildMI(MBB, I, MBB.findDebugLoc(MI), TII->get(AMDGPU::PAD));
+ CfCount++;
+ }
+ }
default:
break;
}