diff options
author | Tom Stellard <[email protected]> | 2012-04-19 10:14:41 -0400 |
---|---|---|
committer | Tom Stellard <[email protected]> | 2012-04-23 09:34:05 -0400 |
commit | f5fc3ac284eb8312e8076a5a9d47a5c082ebb537 (patch) | |
tree | c5ff2f94adfe77a5344cee421b5a1e60783548f0 /src/gallium/drivers/radeon/AMDGPULowerInstructions.cpp | |
parent | 519789d7e6f32efa0e01a9fbc7374bc494d76769 (diff) |
radeon/llvm: Lower VCREATE_v4f32 for R600 and SI
Diffstat (limited to 'src/gallium/drivers/radeon/AMDGPULowerInstructions.cpp')
-rw-r--r-- | src/gallium/drivers/radeon/AMDGPULowerInstructions.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/gallium/drivers/radeon/AMDGPULowerInstructions.cpp b/src/gallium/drivers/radeon/AMDGPULowerInstructions.cpp new file mode 100644 index 00000000000..b49d0dddf65 --- /dev/null +++ b/src/gallium/drivers/radeon/AMDGPULowerInstructions.cpp @@ -0,0 +1,82 @@ +//===-- AMDGPULowerInstructions.cpp - TODO: Add brief description -------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// TODO: Add full description +// +//===----------------------------------------------------------------------===// + + +#include "AMDGPU.h" +#include "AMDGPURegisterInfo.h" +#include "AMDIL.h" +#include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/CodeGen/MachineInstrBuilder.h" +#include "llvm/CodeGen/MachineRegisterInfo.h" + +using namespace llvm; + +namespace { + class AMDGPULowerInstructionsPass : public MachineFunctionPass { + + private: + static char ID; + TargetMachine &TM; + void lowerVCREATE_v4f32(MachineInstr &MI, MachineBasicBlock::iterator I, + MachineBasicBlock &MBB, MachineFunction &MF); + + public: + AMDGPULowerInstructionsPass(TargetMachine &tm) : + MachineFunctionPass(ID), TM(tm) { } + + virtual bool runOnMachineFunction(MachineFunction &MF); + + }; +} /* End anonymous namespace */ + +char AMDGPULowerInstructionsPass::ID = 0; + +FunctionPass *llvm::createAMDGPULowerInstructionsPass(TargetMachine &tm) { + return new AMDGPULowerInstructionsPass(tm); +} + +bool AMDGPULowerInstructionsPass::runOnMachineFunction(MachineFunction &MF) +{ + for (MachineFunction::iterator BB = MF.begin(), BB_E = MF.end(); + BB != BB_E; ++BB) { + MachineBasicBlock &MBB = *BB; + for (MachineBasicBlock::iterator I = MBB.begin(), Next = llvm::next(I); + I != MBB.end(); I = Next, Next = llvm::next(I) ) { + MachineInstr &MI = *I; + + switch (MI.getOpcode()) { + default: continue; + case AMDIL::VCREATE_v4f32: lowerVCREATE_v4f32(MI, I, MBB, MF); break; + + } + MI.eraseFromParent(); + } + } + return false; +} + +void AMDGPULowerInstructionsPass::lowerVCREATE_v4f32(MachineInstr &MI, + MachineBasicBlock::iterator I, MachineBasicBlock &MBB, MachineFunction &MF) +{ + MachineRegisterInfo & MRI = MF.getRegInfo(); + unsigned tmp = MRI.createVirtualRegister( + MRI.getRegClass(MI.getOperand(0).getReg())); + + BuildMI(MBB, I, DebugLoc(), TM.getInstrInfo()->get(AMDIL::IMPLICIT_DEF), tmp); + + BuildMI(MBB, I, DebugLoc(), TM.getInstrInfo()->get(AMDIL::INSERT_SUBREG)) + .addOperand(MI.getOperand(0)) + .addReg(tmp) + .addOperand(MI.getOperand(1)) + .addImm(AMDIL::sel_x); +} |