1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//===- AMDGPUMCInstLower.cpp - Lower AMDGPU MachineInstr to an MCInst -----===// 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// The LLVM Compiler Infrastructure 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// This file is distributed under the University of Illinois Open Source 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// License. See LICENSE.TXT for details. 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//===----------------------------------------------------------------------===// 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// This file contains code to lower AMDGPU MachineInstrs to their corresponding 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// MCInst. 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//===----------------------------------------------------------------------===// 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "AMDGPUMCInstLower.h" 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "AMDGPUAsmPrinter.h" 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "R600InstrInfo.h" 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "llvm/CodeGen/MachineBasicBlock.h" 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "llvm/CodeGen/MachineInstr.h" 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "llvm/Constants.h" 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "llvm/MC/MCInst.h" 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "llvm/MC/MCStreamer.h" 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "llvm/Support/ErrorHandling.h" 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgusing namespace llvm; 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgAMDGPUMCInstLower::AMDGPUMCInstLower() { } 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid AMDGPUMCInstLower::lower(const MachineInstr *MI, MCInst &OutMI) const { 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OutMI.setOpcode(MI->getOpcode()); 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unsigned i = 0, e = MI->getNumExplicitOperands(); i != e; ++i) { 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const MachineOperand &MO = MI->getOperand(i); 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MCOperand MCOp; 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (MO.getType()) { 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm_unreachable("unknown operand type"); 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MachineOperand::MO_FPImmediate: { 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const APFloat &FloatValue = MO.getFPImm()->getValueAPF(); 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(&FloatValue.getSemantics() == &APFloat::IEEEsingle && 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "Only floating point immediates are supported at the moment."); 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MCOp = MCOperand::CreateFPImm(FloatValue.convertToFloat()); 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MachineOperand::MO_Immediate: 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MCOp = MCOperand::CreateImm(MO.getImm()); 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MachineOperand::MO_Register: 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MCOp = MCOperand::CreateReg(MO.getReg()); 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OutMI.addOperand(MCOp); 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid AMDGPUAsmPrinter::EmitInstruction(const MachineInstr *MI) { 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org AMDGPUMCInstLower MCInstLowering; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // Ignore placeholder instructions: 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (MI->getOpcode() == AMDGPU::MASK_WRITE) { 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (MI->isBundle()) { 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const MachineBasicBlock *MBB = MI->getParent(); 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MachineBasicBlock::const_instr_iterator I = MI; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++I; 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (I != MBB->end() && I->isInsideBundle()) { 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MCInst MCBundleInst; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const MachineInstr *BundledInst = I; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MCInstLowering.lower(BundledInst, MCBundleInst); 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OutStreamer.EmitInstruction(MCBundleInst); 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++I; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MCInst TmpInst; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MCInstLowering.lower(MI, TmpInst); 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OutStreamer.EmitInstruction(TmpInst); 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 83