diff options
author | Vincent Lejeune <vljn@ovi.com> | 2013-04-23 17:34:00 +0000 |
---|---|---|
committer | Vincent Lejeune <vljn@ovi.com> | 2013-04-23 17:34:00 +0000 |
commit | 7a28d8afa77ac3afce265f2b61fb321e4e0d84d7 (patch) | |
tree | 655659c2448a2f93f9492bf3dfe69e307781f10d /lib/Target/R600/R600ControlFlowFinalizer.cpp | |
parent | a7d9a6ee63bec70fecea79b85a30108ed3e8fabd (diff) |
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.cpp | 91 |
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; } |