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