Path: blob/main/contrib/llvm-project/llvm/lib/Target/M68k/M68kInstrInfo.h
35269 views
//===-- M68kInstrInfo.h - M68k Instruction Information ----------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7///8/// \file9/// This file contains the M68k implementation of the TargetInstrInfo class.10///11//===----------------------------------------------------------------------===//1213#ifndef LLVM_LIB_TARGET_M68K_M68KINSTRINFO_H14#define LLVM_LIB_TARGET_M68K_M68KINSTRINFO_H1516#include "M68k.h"17#include "M68kRegisterInfo.h"1819#include "MCTargetDesc/M68kBaseInfo.h"2021#include "llvm/CodeGen/MachineInstrBuilder.h"22#include "llvm/CodeGen/TargetInstrInfo.h"2324#define GET_INSTRINFO_HEADER25#include "M68kGenInstrInfo.inc"2627namespace llvm {2829class M68kSubtarget;3031namespace M68k {32// These MUST be kept in sync with codes definitions in M68kInstrInfo.td33enum CondCode {34COND_T = 0, // True35COND_F = 1, // False36COND_HI = 2, // High37COND_LS = 3, // Less or Same38COND_CC = 4, // Carry Clear39COND_CS = 5, // Carry Set40COND_NE = 6, // Not Equal41COND_EQ = 7, // Equal42COND_VC = 8, // Overflow Clear43COND_VS = 9, // Overflow Set44COND_PL = 10, // Plus45COND_MI = 11, // Minus46COND_GE = 12, // Greater or Equal47COND_LT = 13, // Less Than48COND_GT = 14, // Greater Than49COND_LE = 15, // Less or Equal50LAST_VALID_COND = COND_LE,51COND_INVALID52};5354// FIXME would be nice tablegen to generate these predicates and converters55// mb tag based5657static inline M68k::CondCode GetOppositeBranchCondition(M68k::CondCode CC) {58switch (CC) {59default:60llvm_unreachable("Illegal condition code!");61case M68k::COND_T:62return M68k::COND_F;63case M68k::COND_F:64return M68k::COND_T;65case M68k::COND_HI:66return M68k::COND_LS;67case M68k::COND_LS:68return M68k::COND_HI;69case M68k::COND_CC:70return M68k::COND_CS;71case M68k::COND_CS:72return M68k::COND_CC;73case M68k::COND_NE:74return M68k::COND_EQ;75case M68k::COND_EQ:76return M68k::COND_NE;77case M68k::COND_VC:78return M68k::COND_VS;79case M68k::COND_VS:80return M68k::COND_VC;81case M68k::COND_PL:82return M68k::COND_MI;83case M68k::COND_MI:84return M68k::COND_PL;85case M68k::COND_GE:86return M68k::COND_LT;87case M68k::COND_LT:88return M68k::COND_GE;89case M68k::COND_GT:90return M68k::COND_LE;91case M68k::COND_LE:92return M68k::COND_GT;93}94}9596static inline unsigned GetCondBranchFromCond(M68k::CondCode CC) {97switch (CC) {98default:99llvm_unreachable("Illegal condition code!");100case M68k::COND_EQ:101return M68k::Beq8;102case M68k::COND_NE:103return M68k::Bne8;104case M68k::COND_LT:105return M68k::Blt8;106case M68k::COND_LE:107return M68k::Ble8;108case M68k::COND_GT:109return M68k::Bgt8;110case M68k::COND_GE:111return M68k::Bge8;112case M68k::COND_CS:113return M68k::Bcs8;114case M68k::COND_LS:115return M68k::Bls8;116case M68k::COND_HI:117return M68k::Bhi8;118case M68k::COND_CC:119return M68k::Bcc8;120case M68k::COND_MI:121return M68k::Bmi8;122case M68k::COND_PL:123return M68k::Bpl8;124case M68k::COND_VS:125return M68k::Bvs8;126case M68k::COND_VC:127return M68k::Bvc8;128}129}130131static inline M68k::CondCode GetCondFromBranchOpc(unsigned Opcode) {132switch (Opcode) {133default:134return M68k::COND_INVALID;135case M68k::Beq8:136return M68k::COND_EQ;137case M68k::Bne8:138return M68k::COND_NE;139case M68k::Blt8:140return M68k::COND_LT;141case M68k::Ble8:142return M68k::COND_LE;143case M68k::Bgt8:144return M68k::COND_GT;145case M68k::Bge8:146return M68k::COND_GE;147case M68k::Bcs8:148return M68k::COND_CS;149case M68k::Bls8:150return M68k::COND_LS;151case M68k::Bhi8:152return M68k::COND_HI;153case M68k::Bcc8:154return M68k::COND_CC;155case M68k::Bmi8:156return M68k::COND_MI;157case M68k::Bpl8:158return M68k::COND_PL;159case M68k::Bvs8:160return M68k::COND_VS;161case M68k::Bvc8:162return M68k::COND_VC;163}164}165166static inline unsigned IsCMP(unsigned Op) {167switch (Op) {168default:169return false;170case M68k::CMP8dd:171case M68k::CMP8df:172case M68k::CMP8di:173case M68k::CMP8dj:174case M68k::CMP8dp:175case M68k::CMP16dr:176case M68k::CMP16df:177case M68k::CMP16di:178case M68k::CMP16dj:179case M68k::CMP16dp:180return true;181}182}183184static inline bool IsSETCC(unsigned SETCC) {185switch (SETCC) {186default:187return false;188case M68k::SETd8eq:189case M68k::SETd8ne:190case M68k::SETd8lt:191case M68k::SETd8ge:192case M68k::SETd8le:193case M68k::SETd8gt:194case M68k::SETd8cs:195case M68k::SETd8cc:196case M68k::SETd8ls:197case M68k::SETd8hi:198case M68k::SETd8pl:199case M68k::SETd8mi:200case M68k::SETd8vc:201case M68k::SETd8vs:202case M68k::SETj8eq:203case M68k::SETj8ne:204case M68k::SETj8lt:205case M68k::SETj8ge:206case M68k::SETj8le:207case M68k::SETj8gt:208case M68k::SETj8cs:209case M68k::SETj8cc:210case M68k::SETj8ls:211case M68k::SETj8hi:212case M68k::SETj8pl:213case M68k::SETj8mi:214case M68k::SETj8vc:215case M68k::SETj8vs:216case M68k::SETp8eq:217case M68k::SETp8ne:218case M68k::SETp8lt:219case M68k::SETp8ge:220case M68k::SETp8le:221case M68k::SETp8gt:222case M68k::SETp8cs:223case M68k::SETp8cc:224case M68k::SETp8ls:225case M68k::SETp8hi:226case M68k::SETp8pl:227case M68k::SETp8mi:228case M68k::SETp8vc:229case M68k::SETp8vs:230return true;231}232}233234} // namespace M68k235236class M68kInstrInfo : public M68kGenInstrInfo {237virtual void anchor();238239protected:240const M68kSubtarget &Subtarget;241const M68kRegisterInfo RI;242243public:244explicit M68kInstrInfo(const M68kSubtarget &STI);245246static const M68kInstrInfo *create(M68kSubtarget &STI);247248/// TargetInstrInfo is a superset of MRegister info. As such, whenever a249/// client has an instance of instruction info, it should always be able to250/// get register info as well (through this method).251const M68kRegisterInfo &getRegisterInfo() const { return RI; };252253bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB,254MachineBasicBlock *&FBB,255SmallVectorImpl<MachineOperand> &Cond,256bool AllowModify) const override;257258bool AnalyzeBranchImpl(MachineBasicBlock &MBB, MachineBasicBlock *&TBB,259MachineBasicBlock *&FBB,260SmallVectorImpl<MachineOperand> &Cond,261bool AllowModify) const;262263unsigned removeBranch(MachineBasicBlock &MBB,264int *BytesRemoved = nullptr) const override;265266unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,267MachineBasicBlock *FBB, ArrayRef<MachineOperand> Cond,268const DebugLoc &DL,269int *BytesAdded = nullptr) const override;270271void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,272const DebugLoc &DL, MCRegister DestReg, MCRegister SrcReg,273bool KillSrc) const override;274275bool getStackSlotRange(const TargetRegisterClass *RC, unsigned SubIdx,276unsigned &Size, unsigned &Offset,277const MachineFunction &MF) const override;278279void storeRegToStackSlot(MachineBasicBlock &MBB,280MachineBasicBlock::iterator MI, Register SrcReg,281bool IsKill, int FrameIndex,282const TargetRegisterClass *RC,283const TargetRegisterInfo *TRI,284Register VReg) const override;285286void loadRegFromStackSlot(MachineBasicBlock &MBB,287MachineBasicBlock::iterator MI, Register DestReg,288int FrameIndex, const TargetRegisterClass *RC,289const TargetRegisterInfo *TRI,290Register VReg) const override;291292bool expandPostRAPseudo(MachineInstr &MI) const override;293294bool isPCRelRegisterOperandLegal(const MachineOperand &MO) const override;295296/// Add appropriate SExt nodes297void AddSExt(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,298DebugLoc DL, unsigned Reg, MVT From, MVT To) const;299300/// Add appropriate ZExt nodes301void AddZExt(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,302DebugLoc DL, unsigned Reg, MVT From, MVT To) const;303304/// Move immediate to register305bool ExpandMOVI(MachineInstrBuilder &MIB, MVT MVTSize) const;306307/// Move across register classes without extension308bool ExpandMOVX_RR(MachineInstrBuilder &MIB, MVT MVTDst, MVT MVTSrc) const;309310/// Move from register and extend311bool ExpandMOVSZX_RR(MachineInstrBuilder &MIB, bool IsSigned, MVT MVTDst,312MVT MVTSrc) const;313314/// Move from memory and extend315bool ExpandMOVSZX_RM(MachineInstrBuilder &MIB, bool IsSigned,316const MCInstrDesc &Desc, MVT MVTDst, MVT MVTSrc) const;317318/// Push/Pop to/from stack319bool ExpandPUSH_POP(MachineInstrBuilder &MIB, const MCInstrDesc &Desc,320bool IsPush) const;321322/// Moves to/from CCR323bool ExpandCCR(MachineInstrBuilder &MIB, bool IsToCCR) const;324325/// Expand all MOVEM pseudos into real MOVEMs326bool ExpandMOVEM(MachineInstrBuilder &MIB, const MCInstrDesc &Desc,327bool IsRM) const;328329/// Return a virtual register initialized with the global base register330/// value. Output instructions required to initialize the register in the331/// function entry block, if necessary.332unsigned getGlobalBaseReg(MachineFunction *MF) const;333334std::pair<unsigned, unsigned>335decomposeMachineOperandsTargetFlags(unsigned TF) const override;336337ArrayRef<std::pair<unsigned, const char *>>338getSerializableDirectMachineOperandTargetFlags() const override;339};340341} // namespace llvm342343#endif // LLVM_LIB_TARGET_M68K_M68KINSTRINFO_H344345346