11a5ab3e9SJonas Paulsson //=- SystemZTargetStreamer.h - SystemZ Target Streamer ----------*- C++ -*-===// 21a5ab3e9SJonas Paulsson // 31a5ab3e9SJonas Paulsson // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 41a5ab3e9SJonas Paulsson // See https://llvm.org/LICENSE.txt for license information. 51a5ab3e9SJonas Paulsson // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 61a5ab3e9SJonas Paulsson // 71a5ab3e9SJonas Paulsson //===----------------------------------------------------------------------===// 81a5ab3e9SJonas Paulsson 91a5ab3e9SJonas Paulsson #ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZTARGETSTREAMER_H 101a5ab3e9SJonas Paulsson #define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZTARGETSTREAMER_H 111a5ab3e9SJonas Paulsson 121a5ab3e9SJonas Paulsson #include "llvm/ADT/StringRef.h" 13*ef736a1cSserge-sans-paille #include "llvm/MC/MCInst.h" 141a5ab3e9SJonas Paulsson #include "llvm/MC/MCStreamer.h" 151a5ab3e9SJonas Paulsson 161a5ab3e9SJonas Paulsson namespace llvm { 171a5ab3e9SJonas Paulsson 181a5ab3e9SJonas Paulsson class SystemZTargetStreamer : public MCTargetStreamer { 191a5ab3e9SJonas Paulsson public: SystemZTargetStreamer(MCStreamer & S)201a5ab3e9SJonas Paulsson SystemZTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {} 211a5ab3e9SJonas Paulsson 22a48b43f9SJonas Paulsson typedef std::pair<MCInst, const MCSubtargetInfo *> MCInstSTIPair; 23a48b43f9SJonas Paulsson struct CmpMCInst { operatorCmpMCInst24a48b43f9SJonas Paulsson bool operator()(const MCInstSTIPair &MCI_STI_A, 25a48b43f9SJonas Paulsson const MCInstSTIPair &MCI_STI_B) const { 26a48b43f9SJonas Paulsson if (MCI_STI_A.second != MCI_STI_B.second) 27a48b43f9SJonas Paulsson return uintptr_t(MCI_STI_A.second) < uintptr_t(MCI_STI_B.second); 28a48b43f9SJonas Paulsson const MCInst &A = MCI_STI_A.first; 29a48b43f9SJonas Paulsson const MCInst &B = MCI_STI_B.first; 30a48b43f9SJonas Paulsson assert(A.getNumOperands() == B.getNumOperands() && 31a48b43f9SJonas Paulsson A.getNumOperands() == 5 && A.getOperand(2).getImm() == 1 && 32a48b43f9SJonas Paulsson B.getOperand(2).getImm() == 1 && "Unexpected EXRL target MCInst"); 33a48b43f9SJonas Paulsson if (A.getOpcode() != B.getOpcode()) 34a48b43f9SJonas Paulsson return A.getOpcode() < B.getOpcode(); 35a48b43f9SJonas Paulsson if (A.getOperand(0).getReg() != B.getOperand(0).getReg()) 36a48b43f9SJonas Paulsson return A.getOperand(0).getReg() < B.getOperand(0).getReg(); 37a48b43f9SJonas Paulsson if (A.getOperand(1).getImm() != B.getOperand(1).getImm()) 38a48b43f9SJonas Paulsson return A.getOperand(1).getImm() < B.getOperand(1).getImm(); 39a48b43f9SJonas Paulsson if (A.getOperand(3).getReg() != B.getOperand(3).getReg()) 40a48b43f9SJonas Paulsson return A.getOperand(3).getReg() < B.getOperand(3).getReg(); 41a48b43f9SJonas Paulsson if (A.getOperand(4).getImm() != B.getOperand(4).getImm()) 42a48b43f9SJonas Paulsson return A.getOperand(4).getImm() < B.getOperand(4).getImm(); 43a48b43f9SJonas Paulsson return false; 44a48b43f9SJonas Paulsson } 45a48b43f9SJonas Paulsson }; 46a48b43f9SJonas Paulsson typedef std::map<MCInstSTIPair, MCSymbol *, CmpMCInst> EXRLT2SymMap; 47a48b43f9SJonas Paulsson EXRLT2SymMap EXRLTargets2Sym; 48a48b43f9SJonas Paulsson 49a48b43f9SJonas Paulsson void emitConstantPools() override; 50a48b43f9SJonas Paulsson 511a5ab3e9SJonas Paulsson virtual void emitMachine(StringRef CPU) = 0; 521a5ab3e9SJonas Paulsson }; 531a5ab3e9SJonas Paulsson 541a5ab3e9SJonas Paulsson } // end namespace llvm 551a5ab3e9SJonas Paulsson 561a5ab3e9SJonas Paulsson #endif // LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZTARGETSTREAMER_H 57