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