SIInstrInfo.cpp revision d6c2d3722d795381d3cdf11fe00f63780ad0725a
1//===-- SIInstrInfo.cpp - SI Instruction Information  ---------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// SI Implementation of TargetInstrInfo.
11//
12//===----------------------------------------------------------------------===//
13
14
15#include "SIInstrInfo.h"
16#include "AMDGPUTargetMachine.h"
17#include "llvm/CodeGen/MachineRegisterInfo.h"
18#include "llvm/MC/MCInstrDesc.h"
19
20#include <stdio.h>
21
22using namespace llvm;
23
24SIInstrInfo::SIInstrInfo(AMDGPUTargetMachine &tm)
25  : AMDGPUInstrInfo(tm),
26    RI(tm, *this),
27    TM(tm)
28    { }
29
30const SIRegisterInfo &SIInstrInfo::getRegisterInfo() const
31{
32  return RI;
33}
34
35void
36SIInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
37                           MachineBasicBlock::iterator MI, DebugLoc DL,
38                           unsigned DestReg, unsigned SrcReg,
39                           bool KillSrc) const
40{
41  BuildMI(MBB, MI, DL, get(AMDIL::V_MOV_B32_e32), DestReg)
42   .addReg(SrcReg, getKillRegState(KillSrc));
43}
44
45unsigned SIInstrInfo::getEncodingType(const MachineInstr &MI) const
46{
47  return get(MI.getOpcode()).TSFlags & SI_INSTR_FLAGS_ENCODING_MASK;
48}
49
50unsigned SIInstrInfo::getEncodingBytes(const MachineInstr &MI) const
51{
52
53  /* Instructions with literal constants are expanded to 64-bits, and
54   * the constant is stored in bits [63:32] */
55  for (unsigned i = 0; i < MI.getNumOperands(); i++) {
56    if (MI.getOperand(i).getType() == MachineOperand::MO_FPImmediate) {
57      return 8;
58    }
59  }
60
61  /* This instruction always has a literal */
62  if (MI.getOpcode() == AMDIL::S_MOV_IMM_I32) {
63    return 8;
64  }
65
66  unsigned encoding_type = getEncodingType(MI);
67  switch (encoding_type) {
68    case SIInstrEncodingType::EXP:
69    case SIInstrEncodingType::LDS:
70    case SIInstrEncodingType::MUBUF:
71    case SIInstrEncodingType::MTBUF:
72    case SIInstrEncodingType::MIMG:
73    case SIInstrEncodingType::VOP3:
74      return 8;
75    default:
76      return 4;
77  }
78}
79
80MachineInstr * SIInstrInfo::convertToISA(MachineInstr & MI, MachineFunction &MF,
81    DebugLoc DL) const
82{
83  MachineInstr * newMI = AMDGPUInstrInfo::convertToISA(MI, MF, DL);
84  const MCInstrDesc &newDesc = get(newMI->getOpcode());
85
86  /* If this instruction was converted to a VOP3, we need to add the extra
87   * operands for abs, clamp, omod, and negate. */
88  if (getEncodingType(*newMI) == SIInstrEncodingType::VOP3
89      && newMI->getNumOperands() < newDesc.getNumOperands()) {
90    MachineInstrBuilder builder(newMI);
91    for (unsigned op_idx = newMI->getNumOperands();
92                  op_idx < newDesc.getNumOperands(); op_idx++) {
93      builder.addImm(0);
94    }
95  }
96  return newMI;
97}
98
99unsigned SIInstrInfo::getISAOpcode(unsigned AMDILopcode) const
100{
101  switch (AMDILopcode) {
102  //XXX We need a better way of detecting end of program
103  case AMDIL::RETURN: return AMDIL::S_ENDPGM;
104  case AMDIL::MOVE_f32: return AMDIL::V_MOV_B32_e32;
105  default: return AMDILopcode;
106  }
107}
108
109MachineInstr * SIInstrInfo::getMovImmInstr(MachineFunction *MF, unsigned DstReg,
110                                           int64_t Imm) const
111{
112  MachineInstr * MI = MF->CreateMachineInstr(get(AMDIL::V_MOV_IMM), DebugLoc());
113  MachineInstrBuilder(MI).addReg(DstReg, RegState::Define);
114  MachineInstrBuilder(MI).addImm(Imm);
115
116  return MI;
117
118}
119