11d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===-- SystemZMCCodeEmitter.cpp - Convert SystemZ code to machine code ---===// 21d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// 31d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// The LLVM Compiler Infrastructure 41d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// 51d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// This file is distributed under the University of Illinois Open Source 61d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// License. See LICENSE.TXT for details. 71d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// 81d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===----------------------------------------------------------------------===// 91d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// 101d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// This file implements the SystemZMCCodeEmitter class. 111d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// 121d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===----------------------------------------------------------------------===// 131d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 141d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "MCTargetDesc/SystemZMCTargetDesc.h" 151d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "MCTargetDesc/SystemZMCFixups.h" 161d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/MC/MCCodeEmitter.h" 171d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/MC/MCContext.h" 181d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/MC/MCExpr.h" 191d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/MC/MCInstrInfo.h" 201d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 211d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandusing namespace llvm; 221d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 23dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "mccodeemitter" 24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 251d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandnamespace { 261d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandclass SystemZMCCodeEmitter : public MCCodeEmitter { 271d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const MCInstrInfo &MCII; 281d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MCContext &Ctx; 291d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 301d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandpublic: 311d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SystemZMCCodeEmitter(const MCInstrInfo &mcii, MCContext &ctx) 321d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand : MCII(mcii), Ctx(ctx) { 331d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand } 341d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 351d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ~SystemZMCCodeEmitter() {} 361d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 371d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // OVerride MCCodeEmitter. 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EncodeInstruction(const MCInst &MI, raw_ostream &OS, 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MCFixup> &Fixups, 4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) const override; 411d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 421d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandprivate: 431d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Automatically generated by TableGen. 441d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand uint64_t getBinaryCodeForInstr(const MCInst &MI, 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MCFixup> &Fixups, 4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) const; 471d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 481d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Called by the TableGen code to get the binary encoding of operand 491d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // MO in MI. Fixups is the list of fixups against MI. 50055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford uint64_t getMachineOpValue(const MCInst &MI, const MCOperand &MO, 5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MCFixup> &Fixups, 5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) const; 531d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 54055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford // Called by the TableGen code to get the binary encoding of an address. 559188443a2d35352c4e8a2cffd1b4d31d47843b26Richard Sandiford // The index or length, if any, is encoded first, followed by the base, 56055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford // followed by the displacement. In a 20-bit displacement, 57055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford // the low 12 bits are encoded before the high 8 bits. 58055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford uint64_t getBDAddr12Encoding(const MCInst &MI, unsigned OpNum, 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MCFixup> &Fixups, 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) const; 61055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford uint64_t getBDAddr20Encoding(const MCInst &MI, unsigned OpNum, 6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MCFixup> &Fixups, 6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) const; 64055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford uint64_t getBDXAddr12Encoding(const MCInst &MI, unsigned OpNum, 6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MCFixup> &Fixups, 6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) const; 67055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford uint64_t getBDXAddr20Encoding(const MCInst &MI, unsigned OpNum, 6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MCFixup> &Fixups, 6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) const; 709188443a2d35352c4e8a2cffd1b4d31d47843b26Richard Sandiford uint64_t getBDLAddr12Len8Encoding(const MCInst &MI, unsigned OpNum, 7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MCFixup> &Fixups, 7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) const; 73055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford 741d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand OpNum of MI needs a PC-relative fixup of kind Kind at 751d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Offset bytes from the start of MI. Add the fixup to Fixups 761d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // and return the in-place addend, which since we're a RELA target 771d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // is always 0. 78055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford uint64_t getPCRelEncoding(const MCInst &MI, unsigned OpNum, 791d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SmallVectorImpl<MCFixup> &Fixups, 801d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand unsigned Kind, int64_t Offset) const; 811d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 82055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford uint64_t getPC16DBLEncoding(const MCInst &MI, unsigned OpNum, 8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MCFixup> &Fixups, 8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) const { 851d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand return getPCRelEncoding(MI, OpNum, Fixups, SystemZ::FK_390_PC16DBL, 2); 861d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand } 87055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford uint64_t getPC32DBLEncoding(const MCInst &MI, unsigned OpNum, 8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MCFixup> &Fixups, 8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) const { 901d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand return getPCRelEncoding(MI, OpNum, Fixups, SystemZ::FK_390_PC32DBL, 2); 911d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand } 921d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}; 9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} // end anonymous namespace 941d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 951d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich WeigandMCCodeEmitter *llvm::createSystemZMCCodeEmitter(const MCInstrInfo &MCII, 961d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const MCRegisterInfo &MRI, 971d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const MCSubtargetInfo &MCSTI, 981d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MCContext &Ctx) { 991d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand return new SystemZMCCodeEmitter(MCII, Ctx); 1001d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} 1011d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 1021d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandvoid SystemZMCCodeEmitter:: 1031d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich WeigandEncodeInstruction(const MCInst &MI, raw_ostream &OS, 10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MCFixup> &Fixups, 10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) const { 10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Bits = getBinaryCodeForInstr(MI, Fixups, STI); 1071d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand unsigned Size = MCII.get(MI.getOpcode()).getSize(); 1081d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Big-endian insertion of Size bytes. 1091d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand unsigned ShiftValue = (Size * 8) - 8; 1101d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand for (unsigned I = 0; I != Size; ++I) { 1111d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand OS << uint8_t(Bits >> ShiftValue); 1121d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ShiftValue -= 8; 1131d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand } 1141d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} 1151d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 116055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiforduint64_t SystemZMCCodeEmitter:: 1171d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich WeigandgetMachineOpValue(const MCInst &MI, const MCOperand &MO, 11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MCFixup> &Fixups, 11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) const { 1201d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand if (MO.isReg()) 12199cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling return Ctx.getRegisterInfo()->getEncodingValue(MO.getReg()); 1221d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand if (MO.isImm()) 123055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford return static_cast<uint64_t>(MO.getImm()); 1241d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand llvm_unreachable("Unexpected operand type!"); 1251d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} 1261d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 127055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiforduint64_t SystemZMCCodeEmitter:: 128055ac429cc995c78be4aee552ea51be7b32efbf1Richard SandifordgetBDAddr12Encoding(const MCInst &MI, unsigned OpNum, 12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MCFixup> &Fixups, 13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) const { 13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Base = getMachineOpValue(MI, MI.getOperand(OpNum), Fixups, STI); 13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Disp = getMachineOpValue(MI, MI.getOperand(OpNum + 1), Fixups, STI); 133055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford assert(isUInt<4>(Base) && isUInt<12>(Disp)); 134055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford return (Base << 12) | Disp; 135055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford} 136055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford 137055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiforduint64_t SystemZMCCodeEmitter:: 138055ac429cc995c78be4aee552ea51be7b32efbf1Richard SandifordgetBDAddr20Encoding(const MCInst &MI, unsigned OpNum, 13936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MCFixup> &Fixups, 14036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) const { 14136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Base = getMachineOpValue(MI, MI.getOperand(OpNum), Fixups, STI); 14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Disp = getMachineOpValue(MI, MI.getOperand(OpNum + 1), Fixups, STI); 143055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford assert(isUInt<4>(Base) && isInt<20>(Disp)); 144055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford return (Base << 20) | ((Disp & 0xfff) << 8) | ((Disp & 0xff000) >> 12); 145055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford} 146055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford 147055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiforduint64_t SystemZMCCodeEmitter:: 148055ac429cc995c78be4aee552ea51be7b32efbf1Richard SandifordgetBDXAddr12Encoding(const MCInst &MI, unsigned OpNum, 14936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MCFixup> &Fixups, 15036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) const { 15136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Base = getMachineOpValue(MI, MI.getOperand(OpNum), Fixups, STI); 15236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Disp = getMachineOpValue(MI, MI.getOperand(OpNum + 1), Fixups, STI); 15336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Index = getMachineOpValue(MI, MI.getOperand(OpNum + 2), Fixups, STI); 154055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford assert(isUInt<4>(Base) && isUInt<12>(Disp) && isUInt<4>(Index)); 155055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford return (Index << 16) | (Base << 12) | Disp; 156055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford} 157055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford 158055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiforduint64_t SystemZMCCodeEmitter:: 159055ac429cc995c78be4aee552ea51be7b32efbf1Richard SandifordgetBDXAddr20Encoding(const MCInst &MI, unsigned OpNum, 16036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MCFixup> &Fixups, 16136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) const { 16236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Base = getMachineOpValue(MI, MI.getOperand(OpNum), Fixups, STI); 16336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Disp = getMachineOpValue(MI, MI.getOperand(OpNum + 1), Fixups, STI); 16436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Index = getMachineOpValue(MI, MI.getOperand(OpNum + 2), Fixups, STI); 165055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford assert(isUInt<4>(Base) && isInt<20>(Disp) && isUInt<4>(Index)); 166055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford return (Index << 24) | (Base << 20) | ((Disp & 0xfff) << 8) 167055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford | ((Disp & 0xff000) >> 12); 168055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford} 169055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiford 1709188443a2d35352c4e8a2cffd1b4d31d47843b26Richard Sandiforduint64_t SystemZMCCodeEmitter:: 1719188443a2d35352c4e8a2cffd1b4d31d47843b26Richard SandifordgetBDLAddr12Len8Encoding(const MCInst &MI, unsigned OpNum, 17236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MCFixup> &Fixups, 17336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) const { 17436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Base = getMachineOpValue(MI, MI.getOperand(OpNum), Fixups, STI); 17536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Disp = getMachineOpValue(MI, MI.getOperand(OpNum + 1), Fixups, STI); 17636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Len = getMachineOpValue(MI, MI.getOperand(OpNum + 2), Fixups, STI) - 1; 1779188443a2d35352c4e8a2cffd1b4d31d47843b26Richard Sandiford assert(isUInt<4>(Base) && isUInt<12>(Disp) && isUInt<8>(Len)); 1789188443a2d35352c4e8a2cffd1b4d31d47843b26Richard Sandiford return (Len << 16) | (Base << 12) | Disp; 1799188443a2d35352c4e8a2cffd1b4d31d47843b26Richard Sandiford} 1809188443a2d35352c4e8a2cffd1b4d31d47843b26Richard Sandiford 181055ac429cc995c78be4aee552ea51be7b32efbf1Richard Sandiforduint64_t 182055ac429cc995c78be4aee552ea51be7b32efbf1Richard SandifordSystemZMCCodeEmitter::getPCRelEncoding(const MCInst &MI, unsigned OpNum, 1831d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SmallVectorImpl<MCFixup> &Fixups, 1841d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand unsigned Kind, int64_t Offset) const { 1851d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const MCOperand &MO = MI.getOperand(OpNum); 186b594c4c873bd3e2ee560cc83bd50282ec56b01e9Richard Sandiford const MCExpr *Expr; 1871d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand if (MO.isImm()) 188b594c4c873bd3e2ee560cc83bd50282ec56b01e9Richard Sandiford Expr = MCConstantExpr::Create(MO.getImm() + Offset, Ctx); 189b594c4c873bd3e2ee560cc83bd50282ec56b01e9Richard Sandiford else { 190b594c4c873bd3e2ee560cc83bd50282ec56b01e9Richard Sandiford Expr = MO.getExpr(); 191b594c4c873bd3e2ee560cc83bd50282ec56b01e9Richard Sandiford if (Offset) { 192b594c4c873bd3e2ee560cc83bd50282ec56b01e9Richard Sandiford // The operand value is relative to the start of MI, but the fixup 193b594c4c873bd3e2ee560cc83bd50282ec56b01e9Richard Sandiford // is relative to the operand field itself, which is Offset bytes 194b594c4c873bd3e2ee560cc83bd50282ec56b01e9Richard Sandiford // into MI. Add Offset to the relocation value to cancel out 195b594c4c873bd3e2ee560cc83bd50282ec56b01e9Richard Sandiford // this difference. 196b594c4c873bd3e2ee560cc83bd50282ec56b01e9Richard Sandiford const MCExpr *OffsetExpr = MCConstantExpr::Create(Offset, Ctx); 197b594c4c873bd3e2ee560cc83bd50282ec56b01e9Richard Sandiford Expr = MCBinaryExpr::CreateAdd(Expr, OffsetExpr, Ctx); 198b594c4c873bd3e2ee560cc83bd50282ec56b01e9Richard Sandiford } 1991d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand } 2001d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand Fixups.push_back(MCFixup::Create(Offset, Expr, (MCFixupKind)Kind)); 2011d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand return 0; 2021d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} 2031d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 2041d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "SystemZGenMCCodeEmitter.inc" 205