1 //=- SystemZTargetStreamer.h - SystemZ Target Streamer ----------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZTARGETSTREAMER_H 10 #define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZTARGETSTREAMER_H 11 12 #include "llvm/ADT/StringRef.h" 13 #include "llvm/MC/MCInst.h" 14 #include "llvm/MC/MCStreamer.h" 15 16 namespace llvm { 17 18 class SystemZTargetStreamer : public MCTargetStreamer { 19 public: 20 SystemZTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {} 21 22 typedef std::pair<MCInst, const MCSubtargetInfo *> MCInstSTIPair; 23 struct CmpMCInst { 24 bool operator()(const MCInstSTIPair &MCI_STI_A, 25 const MCInstSTIPair &MCI_STI_B) const { 26 if (MCI_STI_A.second != MCI_STI_B.second) 27 return uintptr_t(MCI_STI_A.second) < uintptr_t(MCI_STI_B.second); 28 const MCInst &A = MCI_STI_A.first; 29 const MCInst &B = MCI_STI_B.first; 30 assert(A.getNumOperands() == B.getNumOperands() && 31 A.getNumOperands() == 5 && A.getOperand(2).getImm() == 1 && 32 B.getOperand(2).getImm() == 1 && "Unexpected EXRL target MCInst"); 33 if (A.getOpcode() != B.getOpcode()) 34 return A.getOpcode() < B.getOpcode(); 35 if (A.getOperand(0).getReg() != B.getOperand(0).getReg()) 36 return A.getOperand(0).getReg() < B.getOperand(0).getReg(); 37 if (A.getOperand(1).getImm() != B.getOperand(1).getImm()) 38 return A.getOperand(1).getImm() < B.getOperand(1).getImm(); 39 if (A.getOperand(3).getReg() != B.getOperand(3).getReg()) 40 return A.getOperand(3).getReg() < B.getOperand(3).getReg(); 41 if (A.getOperand(4).getImm() != B.getOperand(4).getImm()) 42 return A.getOperand(4).getImm() < B.getOperand(4).getImm(); 43 return false; 44 } 45 }; 46 typedef std::map<MCInstSTIPair, MCSymbol *, CmpMCInst> EXRLT2SymMap; 47 EXRLT2SymMap EXRLTargets2Sym; 48 49 void emitConstantPools() override; 50 51 virtual void emitMachine(StringRef CPU) = 0; 52 }; 53 54 } // end namespace llvm 55 56 #endif // LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZTARGETSTREAMER_H 57