137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===-- HexagonMCCodeEmitter.cpp - Hexagon Target Descriptions ------------===//
237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//                     The LLVM Compiler Infrastructure
437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// This file is distributed under the University of Illinois Open Source
637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// License. See LICENSE.TXT for details.
737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===----------------------------------------------------------------------===//
937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "Hexagon.h"
1137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "MCTargetDesc/HexagonBaseInfo.h"
126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "MCTargetDesc/HexagonFixupKinds.h"
1337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "MCTargetDesc/HexagonMCCodeEmitter.h"
14ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "MCTargetDesc/HexagonMCInstrInfo.h"
1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "MCTargetDesc/HexagonMCTargetDesc.h"
1637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/ADT/Statistic.h"
1737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCCodeEmitter.h"
1837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCContext.h"
1937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCExpr.h"
2037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCInst.h"
2137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCInstrInfo.h"
2237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCRegisterInfo.h"
2337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCSubtargetInfo.h"
2437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/Support/Debug.h"
256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/Support/EndianStream.h"
2637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/Support/raw_ostream.h"
2737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
2837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define DEBUG_TYPE "mccodeemitter"
2937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
3037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesusing namespace llvm;
3137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesusing namespace Hexagon;
3237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
3337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesSTATISTIC(MCNumEmitted, "Number of MC instructions emitted");
3437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
3537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesHexagonMCCodeEmitter::HexagonMCCodeEmitter(MCInstrInfo const &aMII,
3637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                           MCContext &aMCT)
376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    : MCT(aMCT), MCII(aMII), Addend(new unsigned(0)),
386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Extended(new bool(false)), CurrentBundle(new MCInst const *) {}
396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainaruint32_t HexagonMCCodeEmitter::parseBits(size_t Instruction, size_t Last,
416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                         MCInst const &MCB,
426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                         MCInst const &MCI) const {
436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  bool Duplex = HexagonMCInstrInfo::isDuplex(MCII, MCI);
446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (Instruction == 0) {
456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (HexagonMCInstrInfo::isInnerLoop(MCB)) {
466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      assert(!Duplex);
476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      assert(Instruction != Last);
486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return HexagonII::INST_PARSE_LOOP_END;
496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (Instruction == 1) {
526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (HexagonMCInstrInfo::isOuterLoop(MCB)) {
536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      assert(!Duplex);
546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      assert(Instruction != Last);
556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return HexagonII::INST_PARSE_LOOP_END;
566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (Duplex) {
596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    assert(Instruction == Last);
606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return HexagonII::INST_PARSE_DUPLEX;
616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if(Instruction == Last)
636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return HexagonII::INST_PARSE_PACKET_END;
646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return HexagonII::INST_PARSE_NOT_END;
656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
6637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid HexagonMCCodeEmitter::encodeInstruction(MCInst const &MI, raw_ostream &OS,
6837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                             SmallVectorImpl<MCFixup> &Fixups,
6937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                             MCSubtargetInfo const &STI) const {
706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  MCInst &HMB = const_cast<MCInst &>(MI);
716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  assert(HexagonMCInstrInfo::isBundle(HMB));
736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DEBUG(dbgs() << "Encoding bundle\n";);
746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  *Addend = 0;
756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  *Extended = false;
766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  *CurrentBundle = &MI;
776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  size_t Instruction = 0;
786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  size_t Last = HexagonMCInstrInfo::bundleSize(HMB) - 1;
796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  for (auto &I : HexagonMCInstrInfo::bundleInstructions(HMB)) {
806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    MCInst &HMI = const_cast<MCInst &>(*I.getInst());
816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    EncodeSingleInstruction(HMI, OS, Fixups, STI,
826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                            parseBits(Instruction, Last, HMB, HMI),
836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                            Instruction);
846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    *Extended = HexagonMCInstrInfo::isImmext(HMI);
856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    *Addend += HEXAGON_INSTR_SIZE;
866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    ++Instruction;
876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return;
896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic bool RegisterMatches(unsigned Consumer, unsigned Producer,
92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                            unsigned Producer2) {
93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Consumer == Producer)
94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return true;
95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Consumer == Producer2)
96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return true;
97de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Calculate if we're a single vector consumer referencing a double producer
98de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Producer >= Hexagon::W0 && Producer <= Hexagon::W15)
99de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Consumer >= Hexagon::V0 && Consumer <= Hexagon::V31)
100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return ((Consumer - Hexagon::V0) >> 1) == (Producer - Hexagon::W0);
101de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return false;
102de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
103de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// EncodeSingleInstruction - Emit a single
1056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid HexagonMCCodeEmitter::EncodeSingleInstruction(
1066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    const MCInst &MI, raw_ostream &OS, SmallVectorImpl<MCFixup> &Fixups,
1076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    const MCSubtargetInfo &STI, uint32_t Parse, size_t Index) const {
1086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  MCInst HMB = MI;
1096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  assert(!HexagonMCInstrInfo::isBundle(HMB));
1106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  uint64_t Binary;
1116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
112f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Compound instructions are limited to using registers 0-7 and 16-23
113f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // and here we make a map 16-23 to 8-15 so they can be correctly encoded.
114f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  static unsigned RegMap[8] = {Hexagon::R8,  Hexagon::R9,  Hexagon::R10,
115f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                               Hexagon::R11, Hexagon::R12, Hexagon::R13,
116f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                               Hexagon::R14, Hexagon::R15};
117f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
1186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // Pseudo instructions don't get encoded and shouldn't be here
1196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // in the first place!
1206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  assert(!HexagonMCInstrInfo::getDesc(MCII, HMB).isPseudo() &&
1216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar         "pseudo-instruction found");
1226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DEBUG(dbgs() << "Encoding insn"
1236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                  " `" << HexagonMCInstrInfo::getName(MCII, HMB) << "'"
1246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                                                    "\n");
1256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
126f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (llvm::HexagonMCInstrInfo::getType(MCII, HMB) == HexagonII::TypeCOMPOUND) {
127f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    for (unsigned i = 0; i < HMB.getNumOperands(); ++i)
128f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      if (HMB.getOperand(i).isReg()) {
129f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        unsigned Reg =
130f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar            MCT.getRegisterInfo()->getEncodingValue(HMB.getOperand(i).getReg());
131f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        if ((Reg <= 23) && (Reg >= 16))
132f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          HMB.getOperand(i).setReg(RegMap[Reg - 16]);
133f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      }
134f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
135f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
1366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (HexagonMCInstrInfo::isNewValue(MCII, HMB)) {
1376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // Calculate the new value distance to the associated producer
1386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    MCOperand &MCO =
1396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        HMB.getOperand(HexagonMCInstrInfo::getNewValueOp(MCII, HMB));
1406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    unsigned SOffset = 0;
141de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    unsigned VOffset = 0;
1426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    unsigned Register = MCO.getReg();
1436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    unsigned Register1;
144de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    unsigned Register2;
1456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    auto Instructions = HexagonMCInstrInfo::bundleInstructions(**CurrentBundle);
1466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    auto i = Instructions.begin() + Index - 1;
1476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    for (;; --i) {
1486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      assert(i != Instructions.begin() - 1 && "Couldn't find producer");
1496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      MCInst const &Inst = *i->getInst();
1506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      if (HexagonMCInstrInfo::isImmext(Inst))
1516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        continue;
1526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      ++SOffset;
153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (HexagonMCInstrInfo::isVector(MCII, Inst))
154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        // Vector instructions don't count scalars
155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        ++VOffset;
1566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Register1 =
1576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar          HexagonMCInstrInfo::hasNewValue(MCII, Inst)
1586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar              ? HexagonMCInstrInfo::getNewValueOperand(MCII, Inst).getReg()
1596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar              : static_cast<unsigned>(Hexagon::NoRegister);
160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Register2 =
161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          HexagonMCInstrInfo::hasNewValue2(MCII, Inst)
162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar              ? HexagonMCInstrInfo::getNewValueOperand2(MCII, Inst).getReg()
163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar              : static_cast<unsigned>(Hexagon::NoRegister);
164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (!RegisterMatches(Register, Register1, Register2))
1656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        // This isn't the register we're looking for
1666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        continue;
1676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      if (!HexagonMCInstrInfo::isPredicated(MCII, Inst))
1686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        // Producer is unpredicated
1696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
1706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      assert(HexagonMCInstrInfo::isPredicated(MCII, HMB) &&
1716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar             "Unpredicated consumer depending on predicated producer");
1726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      if (HexagonMCInstrInfo::isPredicatedTrue(MCII, Inst) ==
1736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar          HexagonMCInstrInfo::isPredicatedTrue(MCII, HMB))
1746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        // Producer predicate sense matched ours
1756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
1766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
1776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // Hexagon PRM 10.11 Construct Nt from distance
178de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    unsigned Offset =
179de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        HexagonMCInstrInfo::isVector(MCII, HMB) ? VOffset : SOffset;
1806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Offset <<= 1;
181de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Offset |=
182de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        HexagonMCInstrInfo::SubregisterBit(Register, Register1, Register2);
1836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    MCO.setReg(Offset + Hexagon::R0);
1846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
1856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Binary = getBinaryCodeForInstr(HMB, Fixups, STI);
1876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // Check for unimplemented instructions. Immediate extenders
1886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // are encoded as zero, so they need to be accounted for.
1896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if ((!Binary) &&
1906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      ((HMB.getOpcode() != DuplexIClass0) && (HMB.getOpcode() != A4_ext) &&
1916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar       (HMB.getOpcode() != A4_ext_b) && (HMB.getOpcode() != A4_ext_c) &&
1926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar       (HMB.getOpcode() != A4_ext_g))) {
1936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    DEBUG(dbgs() << "Unimplemented inst: "
1946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                    " `" << HexagonMCInstrInfo::getName(MCII, HMB) << "'"
1956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                                                      "\n");
1966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    llvm_unreachable("Unimplemented Instruction");
1976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
1986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Binary |= Parse;
1996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
2006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // if we need to emit a duplexed instruction
2016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (HMB.getOpcode() >= Hexagon::DuplexIClass0 &&
2026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      HMB.getOpcode() <= Hexagon::DuplexIClassF) {
2036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    assert(Parse == HexagonII::INST_PARSE_DUPLEX &&
2046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar           "Emitting duplex without duplex parse bits");
2056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    unsigned dupIClass;
2066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    switch (HMB.getOpcode()) {
2076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    case Hexagon::DuplexIClass0:
2086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      dupIClass = 0;
2096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
2106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    case Hexagon::DuplexIClass1:
2116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      dupIClass = 1;
2126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
2136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    case Hexagon::DuplexIClass2:
2146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      dupIClass = 2;
2156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
2166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    case Hexagon::DuplexIClass3:
2176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      dupIClass = 3;
2186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
2196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    case Hexagon::DuplexIClass4:
2206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      dupIClass = 4;
2216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
2226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    case Hexagon::DuplexIClass5:
2236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      dupIClass = 5;
2246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
2256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    case Hexagon::DuplexIClass6:
2266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      dupIClass = 6;
2276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
2286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    case Hexagon::DuplexIClass7:
2296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      dupIClass = 7;
2306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
2316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    case Hexagon::DuplexIClass8:
2326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      dupIClass = 8;
2336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
2346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    case Hexagon::DuplexIClass9:
2356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      dupIClass = 9;
2366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
2376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    case Hexagon::DuplexIClassA:
2386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      dupIClass = 10;
2396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
2406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    case Hexagon::DuplexIClassB:
2416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      dupIClass = 11;
2426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
2436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    case Hexagon::DuplexIClassC:
2446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      dupIClass = 12;
2456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
2466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    case Hexagon::DuplexIClassD:
2476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      dupIClass = 13;
2486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
2496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    case Hexagon::DuplexIClassE:
2506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      dupIClass = 14;
2516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
2526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    case Hexagon::DuplexIClassF:
2536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      dupIClass = 15;
2546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
2556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    default:
2566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      llvm_unreachable("Unimplemented DuplexIClass");
2576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
2586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
2596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // 29 is the bit position.
2606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // 0b1110 =0xE bits are masked off and down shifted by 1 bit.
2616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // Last bit is moved to bit position 13
2626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Binary = ((dupIClass & 0xE) << (29 - 1)) | ((dupIClass & 0x1) << 13);
2636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
2646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    const MCInst *subInst0 = HMB.getOperand(0).getInst();
2656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    const MCInst *subInst1 = HMB.getOperand(1).getInst();
2666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
2676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // get subinstruction slot 0
2686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    unsigned subInstSlot0Bits = getBinaryCodeForInstr(*subInst0, Fixups, STI);
2696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // get subinstruction slot 1
2706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    unsigned subInstSlot1Bits = getBinaryCodeForInstr(*subInst1, Fixups, STI);
2716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
2726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Binary |= subInstSlot0Bits | (subInstSlot1Bits << 16);
2736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
2746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  support::endian::Writer<support::little>(OS).write<uint32_t>(Binary);
27537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ++MCNumEmitted;
27637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
27737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
278de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace {
279de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid raise_relocation_error(unsigned bits, unsigned kind) {
280de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string Text;
281de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {
282de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    llvm::raw_string_ostream Stream(Text);
283de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Stream << "Unrecognized relocation combination bits: " << bits
284de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar           << " kind: " << kind;
285de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
286de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  report_fatal_error(Text);
287de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
288de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
289de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
290de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// getFixupNoBits - Some insns are not extended and thus have no
291de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// bits.  These cases require a more brute force method for determining
292de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// the correct relocation.
293de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace {
294de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarHexagon::Fixups getFixupNoBits(MCInstrInfo const &MCII, const MCInst &MI,
2956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                      const MCOperand &MO,
2966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                      const MCSymbolRefExpr::VariantKind kind) {
2976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const MCInstrDesc &MCID = HexagonMCInstrInfo::getDesc(MCII, MI);
2986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned insnType = llvm::HexagonMCInstrInfo::getType(MCII, MI);
2996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (insnType == HexagonII::TypePREFIX) {
3016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    switch (kind) {
302de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_GOTREL:
3036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_GOTREL_32_6_X;
304de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_GOT:
3056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_GOT_32_6_X;
306de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_TPREL:
3076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_TPREL_32_6_X;
308de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_DTPREL:
3096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_DTPREL_32_6_X;
310de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_Hexagon_GD_GOT:
3116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_GD_GOT_32_6_X;
312de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_Hexagon_LD_GOT:
3136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_LD_GOT_32_6_X;
314de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_Hexagon_IE:
3156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_IE_32_6_X;
316de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_Hexagon_IE_GOT:
3176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_IE_GOT_32_6_X;
318de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_Hexagon_PCREL:
319de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_None:
3206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      if (MCID.isBranch())
3216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        return Hexagon::fixup_Hexagon_B32_PCREL_X;
3226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      else
3236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        return Hexagon::fixup_Hexagon_32_6_X;
324de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    default:
325de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      raise_relocation_error(0, kind);
3266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
3276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  } else if (MCID.isBranch())
328de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return Hexagon::fixup_Hexagon_B13_PCREL;
3296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  switch (MCID.getOpcode()) {
3316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case Hexagon::HI:
3326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case Hexagon::A2_tfrih:
3336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    switch (kind) {
334de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_GOT:
3356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_GOT_HI16;
336de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_GOTREL:
3376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_GOTREL_HI16;
338de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_Hexagon_GD_GOT:
3396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_GD_GOT_HI16;
340de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_Hexagon_LD_GOT:
3416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_LD_GOT_HI16;
342de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_Hexagon_IE:
3436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_IE_HI16;
344de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_Hexagon_IE_GOT:
3456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_IE_GOT_HI16;
346de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_TPREL:
3476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_TPREL_HI16;
348de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_DTPREL:
3496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_DTPREL_HI16;
350de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_None:
3516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_HI16;
352de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    default:
353de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      raise_relocation_error(0, kind);
3546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
3556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case Hexagon::LO:
3576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case Hexagon::A2_tfril:
3586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    switch (kind) {
359de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_GOT:
3606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_GOT_LO16;
361de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_GOTREL:
3626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_GOTREL_LO16;
363de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_Hexagon_GD_GOT:
3646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_GD_GOT_LO16;
365de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_Hexagon_LD_GOT:
3666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_LD_GOT_LO16;
367de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_Hexagon_IE:
3686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_IE_LO16;
369de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_Hexagon_IE_GOT:
3706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_IE_GOT_LO16;
371de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_TPREL:
3726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_TPREL_LO16;
373de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_DTPREL:
3746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_DTPREL_LO16;
375de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_None:
3766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Hexagon::fixup_Hexagon_LO16;
377de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    default:
378de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      raise_relocation_error(0, kind);
3796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
3806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // The only relocs left should be GP relative:
3826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  default:
3836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (MCID.mayStore() || MCID.mayLoad()) {
384f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      for (const MCPhysReg *ImpUses = MCID.getImplicitUses(); *ImpUses;
3856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar           ++ImpUses) {
386de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        if (*ImpUses != Hexagon::GP)
387de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          continue;
388de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        switch (HexagonMCInstrInfo::getAccessSize(MCII, MI)) {
389de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        case HexagonII::MemAccessSize::ByteAccess:
390de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          return fixup_Hexagon_GPREL16_0;
391de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        case HexagonII::MemAccessSize::HalfWordAccess:
392de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          return fixup_Hexagon_GPREL16_1;
393de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        case HexagonII::MemAccessSize::WordAccess:
394de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          return fixup_Hexagon_GPREL16_2;
395de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        case HexagonII::MemAccessSize::DoubleWordAccess:
396de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          return fixup_Hexagon_GPREL16_3;
397de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        default:
398de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          raise_relocation_error(0, kind);
3996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        }
4006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      }
401de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
402de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    raise_relocation_error(0, kind);
4036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
404de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm_unreachable("Relocation exit not taken");
405de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
4066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
4076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
408f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarnamespace llvm {
409f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarextern const MCInstrDesc HexagonInsts[];
410f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
411f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
412f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarnamespace {
413f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool isPCRel (unsigned Kind) {
414f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    switch(Kind){
415f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case fixup_Hexagon_B22_PCREL:
416f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case fixup_Hexagon_B15_PCREL:
417f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case fixup_Hexagon_B7_PCREL:
418f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case fixup_Hexagon_B13_PCREL:
419f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case fixup_Hexagon_B9_PCREL:
420f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case fixup_Hexagon_B32_PCREL_X:
421f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case fixup_Hexagon_B22_PCREL_X:
422f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case fixup_Hexagon_B15_PCREL_X:
423f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case fixup_Hexagon_B13_PCREL_X:
424f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case fixup_Hexagon_B9_PCREL_X:
425f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case fixup_Hexagon_B7_PCREL_X:
426f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case fixup_Hexagon_32_PCREL:
427f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case fixup_Hexagon_PLT_B22_PCREL:
428f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case fixup_Hexagon_GD_PLT_B22_PCREL:
429f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case fixup_Hexagon_LD_PLT_B22_PCREL:
430f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case fixup_Hexagon_6_PCREL_X:
431f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return true;
432f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    default:
433f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return false;
434f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
435f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
436f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
437f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
4386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarunsigned HexagonMCCodeEmitter::getExprOpValue(const MCInst &MI,
4396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                              const MCOperand &MO,
4406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                              const MCExpr *ME,
4416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                              SmallVectorImpl<MCFixup> &Fixups,
4426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                              const MCSubtargetInfo &STI) const
4436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
4446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar{
445de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (isa<HexagonMCExpr>(ME))
446de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ME = &HexagonMCInstrInfo::getExpr(*ME);
447de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  int64_t Value;
448de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (ME->evaluateAsAbsolute(Value))
449de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return Value;
450de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  assert(ME->getKind() == MCExpr::SymbolRef || ME->getKind() == MCExpr::Binary);
451de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (ME->getKind() == MCExpr::Binary) {
452de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    MCBinaryExpr const *Binary = cast<MCBinaryExpr>(ME);
453de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    getExprOpValue(MI, MO, Binary->getLHS(), Fixups, STI);
454de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    getExprOpValue(MI, MO, Binary->getRHS(), Fixups, STI);
455f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return 0;
4566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
4576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Hexagon::Fixups FixupKind =
4586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Hexagon::Fixups(Hexagon::fixup_Hexagon_TPREL_LO16);
4596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const MCSymbolRefExpr *MCSRE = static_cast<const MCSymbolRefExpr *>(ME);
4606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const MCInstrDesc &MCID = HexagonMCInstrInfo::getDesc(MCII, MI);
4616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned bits = HexagonMCInstrInfo::getExtentBits(MCII, MI) -
4626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                  HexagonMCInstrInfo::getExtentAlignment(MCII, MI);
4636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const MCSymbolRefExpr::VariantKind kind = MCSRE->getKind();
4646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
4656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DEBUG(dbgs() << "----------------------------------------\n");
4666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DEBUG(dbgs() << "Opcode Name: " << HexagonMCInstrInfo::getName(MCII, MI)
4676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar               << "\n");
4686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DEBUG(dbgs() << "Opcode: " << MCID.getOpcode() << "\n");
4696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DEBUG(dbgs() << "Relocation bits: " << bits << "\n");
4706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DEBUG(dbgs() << "Addend: " << *Addend << "\n");
4716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DEBUG(dbgs() << "----------------------------------------\n");
4726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
4736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  switch (bits) {
4746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  default:
475de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    raise_relocation_error(bits, kind);
4766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case 32:
4776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    switch (kind) {
478de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_DTPREL:
479de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      FixupKind = *Extended ? Hexagon::fixup_Hexagon_DTPREL_32_6_X
480de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                            : Hexagon::fixup_Hexagon_DTPREL_32;
4816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
482de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_GOT:
4836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      FixupKind = *Extended ? Hexagon::fixup_Hexagon_GOT_32_6_X
4846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                            : Hexagon::fixup_Hexagon_GOT_32;
4856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
486de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_GOTREL:
4876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      FixupKind = *Extended ? Hexagon::fixup_Hexagon_GOTREL_32_6_X
4886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                            : Hexagon::fixup_Hexagon_GOTREL_32;
4896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
490de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_Hexagon_GD_GOT:
4916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      FixupKind = *Extended ? Hexagon::fixup_Hexagon_GD_GOT_32_6_X
4926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                            : Hexagon::fixup_Hexagon_GD_GOT_32;
4936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
494de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_Hexagon_IE:
4956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      FixupKind = *Extended ? Hexagon::fixup_Hexagon_IE_32_6_X
4966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                            : Hexagon::fixup_Hexagon_IE_32;
4976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
498de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_Hexagon_IE_GOT:
4996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      FixupKind = *Extended ? Hexagon::fixup_Hexagon_IE_GOT_32_6_X
5006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                            : Hexagon::fixup_Hexagon_IE_GOT_32;
5016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
502de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_Hexagon_LD_GOT:
503de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      FixupKind = *Extended ? Hexagon::fixup_Hexagon_LD_GOT_32_6_X
504de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                            : Hexagon::fixup_Hexagon_LD_GOT_32;
5056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
506de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_Hexagon_PCREL:
507de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      FixupKind = Hexagon::fixup_Hexagon_32_PCREL;
5086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
509de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_None:
5106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      FixupKind =
5116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar          *Extended ? Hexagon::fixup_Hexagon_32_6_X : Hexagon::fixup_Hexagon_32;
5126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
513de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_TPREL:
514de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      FixupKind = *Extended ? Hexagon::fixup_Hexagon_TPREL_32_6_X
515de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                            : Hexagon::fixup_Hexagon_TPREL_32;
516de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
517de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    default:
518de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      raise_relocation_error(bits, kind);
5196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
5206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
5216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
5226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case 22:
5236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    switch (kind) {
524de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_Hexagon_GD_PLT:
5256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      FixupKind = Hexagon::fixup_Hexagon_GD_PLT_B22_PCREL;
5266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
527de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_Hexagon_LD_PLT:
5286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      FixupKind = Hexagon::fixup_Hexagon_LD_PLT_B22_PCREL;
5296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
530de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_None:
531de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      FixupKind = *Extended ? Hexagon::fixup_Hexagon_B22_PCREL_X
532de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                            : Hexagon::fixup_Hexagon_B22_PCREL;
533de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
534de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_PLT:
535de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      FixupKind = Hexagon::fixup_Hexagon_PLT_B22_PCREL;
5366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      break;
537de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    default:
538de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      raise_relocation_error(bits, kind);
5396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
5406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
5416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
5426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case 16:
5436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (*Extended) {
5446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      switch (kind) {
545de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_DTPREL:
546de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_DTPREL_16_X;
5476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
548de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_GOT:
5496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_GOT_16_X;
5506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
551de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_GOTREL:
5526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_GOTREL_16_X;
5536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
554de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_Hexagon_GD_GOT:
5556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_GD_GOT_16_X;
5566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
557de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_Hexagon_IE:
5586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_IE_16_X;
5596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
560de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_Hexagon_IE_GOT:
5616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_IE_GOT_16_X;
5626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
563de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_Hexagon_LD_GOT:
564de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_LD_GOT_16_X;
5656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
566de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_None:
567de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_16_X;
568de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        break;
569de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_TPREL:
570de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_TPREL_16_X;
5716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
572de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      default:
573de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        raise_relocation_error(bits, kind);
5746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      }
5756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    } else
5766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      switch (kind) {
577de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_None: {
578de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        if (HexagonMCInstrInfo::s23_2_reloc(*MO.getExpr()))
579de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          FixupKind = Hexagon::fixup_Hexagon_23_REG;
580de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        else
581de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          raise_relocation_error(bits, kind);
582de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        break;
583de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      }
584de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_DTPREL:
585de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_DTPREL_16;
5866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
587de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_GOTREL:
588de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        if (MCID.getOpcode() == Hexagon::HI)
5896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar          FixupKind = Hexagon::fixup_Hexagon_GOTREL_HI16;
5906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        else
5916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar          FixupKind = Hexagon::fixup_Hexagon_GOTREL_LO16;
5926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
593de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_Hexagon_GD_GOT:
594de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_GD_GOT_16;
5956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
596de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_Hexagon_GPREL:
597de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_GPREL16_0;
5986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
599de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_Hexagon_HI16:
6006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_HI16;
6016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
602de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_Hexagon_IE_GOT:
603de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_IE_GOT_16;
6046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
605de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_Hexagon_LD_GOT:
6066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_LD_GOT_16;
6076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
608de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_Hexagon_LO16:
609de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_LO16;
6106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
611de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_TPREL:
6126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_TPREL_16;
6136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
614de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      default:
615de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        raise_relocation_error(bits, kind);
6166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      }
6176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
6186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case 15:
620de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    switch (kind) {
621de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_None:
6226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      FixupKind = *Extended ? Hexagon::fixup_Hexagon_B15_PCREL_X
6236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                            : Hexagon::fixup_Hexagon_B15_PCREL;
624de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
625de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    default:
626de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      raise_relocation_error(bits, kind);
627de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
6286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
6296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case 13:
631de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    switch (kind) {
632de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_None:
6336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      FixupKind = Hexagon::fixup_Hexagon_B13_PCREL;
634de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
635de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    default:
636de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      raise_relocation_error(bits, kind);
6376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
6386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
6396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case 12:
6416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (*Extended)
6426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      switch (kind) {
6436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      // There isn't a GOT_12_X, both 11_X and 16_X resolve to 6/26
644de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_GOT:
6456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_GOT_16_X;
6466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
647de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_GOTREL:
6486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_GOTREL_16_X;
6496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
650de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_None:
651de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_12_X;
652de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        break;
653de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      default:
654de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        raise_relocation_error(bits, kind);
6556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      }
656de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    else
657de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      raise_relocation_error(bits, kind);
6586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
6596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case 11:
6616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (*Extended)
6626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      switch (kind) {
663de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_DTPREL:
664de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_DTPREL_11_X;
6656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
666de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_GOT:
6676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_GOT_11_X;
6686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
669de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_GOTREL:
6706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_GOTREL_11_X;
6716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
672de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_Hexagon_GD_GOT:
6736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_GD_GOT_11_X;
6746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
675de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_Hexagon_IE_GOT:
676de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_IE_GOT_11_X;
677de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        break;
678de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_Hexagon_LD_GOT:
6796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_LD_GOT_11_X;
6806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
681de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_None:
682de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_11_X;
6836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
684de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_TPREL:
6856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_TPREL_11_X;
6866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
687de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      default:
688de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        raise_relocation_error(bits, kind);
6896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      }
6906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    else {
691de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      switch (kind) {
692de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_TPREL:
693de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_TPREL_11_X;
694de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        break;
695de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      default:
696de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        raise_relocation_error(bits, kind);
697de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      }
6986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
6996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
7006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
7016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case 10:
702de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (*Extended) {
703de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      switch (kind) {
704de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_None:
705de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_10_X;
706de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        break;
707de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      default:
708de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        raise_relocation_error(bits, kind);
709de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      }
710de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    } else
711de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      raise_relocation_error(bits, kind);
7126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
7136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
7146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case 9:
7156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (MCID.isBranch() ||
716de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        (HexagonMCInstrInfo::getType(MCII, MI) == HexagonII::TypeCR))
7176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      FixupKind = *Extended ? Hexagon::fixup_Hexagon_B9_PCREL_X
7186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                            : Hexagon::fixup_Hexagon_B9_PCREL;
7196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    else if (*Extended)
7206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      FixupKind = Hexagon::fixup_Hexagon_9_X;
721de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    else
722de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      raise_relocation_error(bits, kind);
7236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
7246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
7256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case 8:
7266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (*Extended)
7276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      FixupKind = Hexagon::fixup_Hexagon_8_X;
728de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    else
729de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      raise_relocation_error(bits, kind);
7306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
7316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
7326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case 7:
7336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (MCID.isBranch() ||
734de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        (HexagonMCInstrInfo::getType(MCII, MI) == HexagonII::TypeCR))
7356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      FixupKind = *Extended ? Hexagon::fixup_Hexagon_B7_PCREL_X
7366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                            : Hexagon::fixup_Hexagon_B7_PCREL;
7376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    else if (*Extended)
7386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      FixupKind = Hexagon::fixup_Hexagon_7_X;
739de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    else
740de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      raise_relocation_error(bits, kind);
7416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
7426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
7436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case 6:
7446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (*Extended) {
7456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      switch (kind) {
746de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_DTPREL:
747de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_DTPREL_16_X;
7486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
7496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      // This is part of an extender, GOT_11 is a
7506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      // Word32_U6 unsigned/truncated reloc.
751de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_GOT:
7526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_GOT_11_X;
7536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
754de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_GOTREL:
7556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_GOTREL_11_X;
7566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        break;
757de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_Hexagon_PCREL:
758de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_6_PCREL_X;
759de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        break;
760de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_TPREL:
761de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_TPREL_16_X;
762de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        break;
763de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case MCSymbolRefExpr::VK_None:
764de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        FixupKind = Hexagon::fixup_Hexagon_6_X;
765de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        break;
766de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      default:
767de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        raise_relocation_error(bits, kind);
7686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      }
769de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    } else
770de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      raise_relocation_error(bits, kind);
7716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
7726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
7736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case 0:
7746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    FixupKind = getFixupNoBits(MCII, MI, MO, kind);
7756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
7766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
7776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
778de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MCExpr const *FixupExpression =
779de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      (*Addend > 0 && isPCRel(FixupKind))
780de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          ? MCBinaryExpr::createAdd(MO.getExpr(),
781de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                    MCConstantExpr::create(*Addend, MCT), MCT)
782de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          : MO.getExpr();
783f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
784de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MCFixup fixup = MCFixup::create(*Addend, FixupExpression,
785f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                  MCFixupKind(FixupKind), MI.getLoc());
7866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Fixups.push_back(fixup);
7876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // All of the information is in the fixup.
788de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return 0;
7896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
7906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
79137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesunsigned
79237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesHexagonMCCodeEmitter::getMachineOpValue(MCInst const &MI, MCOperand const &MO,
79337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                        SmallVectorImpl<MCFixup> &Fixups,
79437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                        MCSubtargetInfo const &STI) const {
795de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  assert(!MO.isImm());
796de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (MO.isReg()) {
797de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    unsigned Reg = MO.getReg();
798de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (HexagonMCInstrInfo::isSubInstruction(MI))
799de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return HexagonMCInstrInfo::getDuplexRegisterNumbering(Reg);
800de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    switch(MI.getOpcode()){
801de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case Hexagon::A2_tfrrcr:
802de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case Hexagon::A2_tfrcrr:
803de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if(Reg == Hexagon::M0)
804de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Reg = Hexagon::C6;
805de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if(Reg == Hexagon::M1)
806de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Reg = Hexagon::C7;
807de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
808de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return MCT.getRegisterInfo()->getEncodingValue(Reg);
809de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
8106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
8116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return getExprOpValue(MI, MO, MO.getExpr(), Fixups, STI);
81237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
81337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
81437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesMCCodeEmitter *llvm::createHexagonMCCodeEmitter(MCInstrInfo const &MII,
81537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                                MCRegisterInfo const &MRI,
81637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                                MCContext &MCT) {
8174c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  return new HexagonMCCodeEmitter(MII, MCT);
81837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
81937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
82037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "HexagonGenMCCodeEmitter.inc"
821