xref: /llvm-project/llvm/lib/Target/M68k/MCTargetDesc/M68kBaseInfo.h (revision 4a0ccfa865437fe29ef2ecb18152df7694dddb7f)
16bf22ae4SJim Lin //===-- M68kBaseInfo.h - Top level definitions for M68k MC ------*- C++ -*-===//
28dddc152SMin-Yih Hsu //
38dddc152SMin-Yih Hsu // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
48dddc152SMin-Yih Hsu // See https://llvm.org/LICENSE.txt for license information.
58dddc152SMin-Yih Hsu // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
68dddc152SMin-Yih Hsu //
78dddc152SMin-Yih Hsu //===----------------------------------------------------------------------===//
88dddc152SMin-Yih Hsu ///
98dddc152SMin-Yih Hsu /// \file
108dddc152SMin-Yih Hsu /// This file contains small standalone helper functions and enum definitions
118dddc152SMin-Yih Hsu /// for the M68k target useful for the compiler back-end and the MC
128dddc152SMin-Yih Hsu /// libraries.  As such, it deliberately does not include references to LLVM
138dddc152SMin-Yih Hsu /// core code gen types, passes, etc..
148dddc152SMin-Yih Hsu ///
158dddc152SMin-Yih Hsu //===----------------------------------------------------------------------===//
168dddc152SMin-Yih Hsu 
178dddc152SMin-Yih Hsu #ifndef LLVM_LIB_TARGET_M68K_MCTARGETDESC_M68KBASEINFO_H
188dddc152SMin-Yih Hsu #define LLVM_LIB_TARGET_M68K_MCTARGETDESC_M68KBASEINFO_H
198dddc152SMin-Yih Hsu 
208dddc152SMin-Yih Hsu #include "M68kMCTargetDesc.h"
218dddc152SMin-Yih Hsu 
228dddc152SMin-Yih Hsu #include "llvm/MC/MCExpr.h"
238dddc152SMin-Yih Hsu #include "llvm/Support/DataTypes.h"
24c40b158eSMin-Yih Hsu #include "llvm/Support/Endian.h"
258dddc152SMin-Yih Hsu #include "llvm/Support/ErrorHandling.h"
268dddc152SMin-Yih Hsu 
278dddc152SMin-Yih Hsu #define GET_INSTRINFO_MI_OPS_INFO
288dddc152SMin-Yih Hsu #define GET_INSTRINFO_OPERAND_TYPES_ENUM
298dddc152SMin-Yih Hsu #define GET_INSTRINFO_LOGICAL_OPERAND_SIZE_MAP
308dddc152SMin-Yih Hsu #include "M68kGenInstrInfo.inc"
318dddc152SMin-Yih Hsu 
328dddc152SMin-Yih Hsu namespace llvm {
338dddc152SMin-Yih Hsu 
348dddc152SMin-Yih Hsu namespace M68k {
358dddc152SMin-Yih Hsu 
368dddc152SMin-Yih Hsu /// Enums for memory operand decoding. Supports these forms:
378dddc152SMin-Yih Hsu /// (d,An)
388dddc152SMin-Yih Hsu /// (d,An,Xn)
398dddc152SMin-Yih Hsu /// ([bd,An],Xn,od)
408dddc152SMin-Yih Hsu /// ([bd,An,Xn],od)
418dddc152SMin-Yih Hsu /// TODO Implement scaling other than 1
428dddc152SMin-Yih Hsu enum { MemDisp = 0, MemBase = 1, MemIndex = 2, MemOuter = 3 };
438dddc152SMin-Yih Hsu 
448dddc152SMin-Yih Hsu /// Enums for pc-relative memory operand decoding. Supports these forms:
458dddc152SMin-Yih Hsu /// (d,PC)
468dddc152SMin-Yih Hsu /// (d,PC,Xn)
478dddc152SMin-Yih Hsu /// ([bd,PC],Xn,od)
488dddc152SMin-Yih Hsu /// ([bd,PC,Xn],od)
498dddc152SMin-Yih Hsu enum { PCRelDisp = 0, PCRelIndex = 1, PCRelOuter = 2 };
50c40b158eSMin-Yih Hsu 
517335cd05SMin-Yih Hsu enum class MemAddrModeKind : unsigned {
527335cd05SMin-Yih Hsu   j = 1, // (An)
537335cd05SMin-Yih Hsu   o,     // (An)+
547335cd05SMin-Yih Hsu   e,     // -(An)
557335cd05SMin-Yih Hsu   p,     // (d,An)
567335cd05SMin-Yih Hsu   f,     // (d,An,Xn.L)
577335cd05SMin-Yih Hsu   F,     // (d,An,Xn.W)
587335cd05SMin-Yih Hsu   g,     // (d,An,Xn.L,SCALE)
597335cd05SMin-Yih Hsu   G,     // (d,An,Xn.W,SCALE)
607335cd05SMin-Yih Hsu   u,     // ([bd,An],Xn.L,SCALE,od)
617335cd05SMin-Yih Hsu   U,     // ([bd,An],Xn.W,SCALE,od)
627335cd05SMin-Yih Hsu   v,     // ([bd,An,Xn.L,SCALE],od)
637335cd05SMin-Yih Hsu   V,     // ([bd,An,Xn.W,SCALE],od)
647335cd05SMin-Yih Hsu   b,     // abs.L
657335cd05SMin-Yih Hsu   B,     // abs.W
667335cd05SMin-Yih Hsu   q,     // (d,PC)
677335cd05SMin-Yih Hsu   k,     // (d,PC,Xn.L)
687335cd05SMin-Yih Hsu   K,     // (d,PC,Xn.W)
697335cd05SMin-Yih Hsu   l,     // (d,PC,Xn.L,SCALE)
707335cd05SMin-Yih Hsu   L,     // (d,PC,Xn.W,SCALE)
717335cd05SMin-Yih Hsu   x,     // ([bd,PC],Xn.L,SCALE,od)
727335cd05SMin-Yih Hsu   X,     // ([bd,PC],Xn.W,SCALE,od)
737335cd05SMin-Yih Hsu   y,     // ([bd,PC,Xn.L,SCALE],od)
747335cd05SMin-Yih Hsu   Y      // ([bd,PC,Xn.W,SCALE],od)
757335cd05SMin-Yih Hsu };
767335cd05SMin-Yih Hsu 
77c40b158eSMin-Yih Hsu // On a LE host:
78c40b158eSMin-Yih Hsu // MSB                   LSB    MSB                   LSB
79c40b158eSMin-Yih Hsu // | 0x12 0x34 | 0xAB 0xCD | -> | 0xAB 0xCD | 0x12 0x34 |
80c40b158eSMin-Yih Hsu // (On a BE host nothing changes)
swapWord(value_t Val)81c40b158eSMin-Yih Hsu template <typename value_t> value_t swapWord(value_t Val) {
82c40b158eSMin-Yih Hsu   const unsigned NumWords = sizeof(Val) / 2;
83c40b158eSMin-Yih Hsu   if (NumWords <= 1)
84c40b158eSMin-Yih Hsu     return Val;
85*4a0ccfa8SKazu Hirata   Val = support::endian::byte_swap(Val, llvm::endianness::big);
86c40b158eSMin-Yih Hsu   value_t NewVal = 0;
87c40b158eSMin-Yih Hsu   for (unsigned i = 0U; i != NumWords; ++i) {
88c40b158eSMin-Yih Hsu     uint16_t Part = (Val >> (i * 16)) & 0xFFFF;
89*4a0ccfa8SKazu Hirata     Part = support::endian::byte_swap(Part, llvm::endianness::big);
90c40b158eSMin-Yih Hsu     NewVal |= (Part << (i * 16));
91c40b158eSMin-Yih Hsu   }
92c40b158eSMin-Yih Hsu   return NewVal;
93c40b158eSMin-Yih Hsu }
948dddc152SMin-Yih Hsu } // namespace M68k
958dddc152SMin-Yih Hsu 
968dddc152SMin-Yih Hsu namespace M68kBeads {
978dddc152SMin-Yih Hsu enum {
988dddc152SMin-Yih Hsu   Ctrl = 0x0,
998dddc152SMin-Yih Hsu   Bits1 = 0x1,
1008dddc152SMin-Yih Hsu   Bits2 = 0x2,
1018dddc152SMin-Yih Hsu   Bits3 = 0x3,
1028dddc152SMin-Yih Hsu   Bits4 = 0x4,
1038dddc152SMin-Yih Hsu   DAReg = 0x5,
1048dddc152SMin-Yih Hsu   DA = 0x6,
1058dddc152SMin-Yih Hsu   Reg = 0x7,
10651884c6bSRicky Taylor   DReg = 0x8,
10751884c6bSRicky Taylor   Disp8 = 0x9,
10851884c6bSRicky Taylor   Imm8 = 0xA,
10951884c6bSRicky Taylor   Imm16 = 0xB,
11051884c6bSRicky Taylor   Imm32 = 0xC,
11151884c6bSRicky Taylor   Imm3 = 0xD,
1128dddc152SMin-Yih Hsu };
1138dddc152SMin-Yih Hsu 
1148dddc152SMin-Yih Hsu // Ctrl payload
1158dddc152SMin-Yih Hsu enum {
1168dddc152SMin-Yih Hsu   Term = 0x0,
1178dddc152SMin-Yih Hsu   Ignore = 0x1,
1188dddc152SMin-Yih Hsu };
1198dddc152SMin-Yih Hsu } // namespace M68kBeads
1208dddc152SMin-Yih Hsu 
1218dddc152SMin-Yih Hsu /// This namespace holds all of the target specific flags that instruction info
1228dddc152SMin-Yih Hsu /// tracks.
1238dddc152SMin-Yih Hsu namespace M68kII {
1248dddc152SMin-Yih Hsu /// Target Operand Flag enum.
1258dddc152SMin-Yih Hsu enum TOF {
1268dddc152SMin-Yih Hsu 
1278dddc152SMin-Yih Hsu   MO_NO_FLAG,
1288dddc152SMin-Yih Hsu 
1298dddc152SMin-Yih Hsu   /// On a symbol operand this indicates that the immediate is the absolute
1308dddc152SMin-Yih Hsu   /// address of the symbol.
1318dddc152SMin-Yih Hsu   MO_ABSOLUTE_ADDRESS,
1328dddc152SMin-Yih Hsu 
1338dddc152SMin-Yih Hsu   /// On a symbol operand this indicates that the immediate is the pc-relative
1348dddc152SMin-Yih Hsu   /// address of the symbol.
1358dddc152SMin-Yih Hsu   MO_PC_RELATIVE_ADDRESS,
1368dddc152SMin-Yih Hsu 
1378dddc152SMin-Yih Hsu   /// On a symbol operand this indicates that the immediate is the offset to
1388dddc152SMin-Yih Hsu   /// the GOT entry for the symbol name from the base of the GOT.
1398dddc152SMin-Yih Hsu   ///
1408dddc152SMin-Yih Hsu   ///    name@GOT
1418dddc152SMin-Yih Hsu   MO_GOT,
1428dddc152SMin-Yih Hsu 
1438dddc152SMin-Yih Hsu   /// On a symbol operand this indicates that the immediate is the offset to
1448dddc152SMin-Yih Hsu   /// the location of the symbol name from the base of the GOT.
1458dddc152SMin-Yih Hsu   ///
1468dddc152SMin-Yih Hsu   ///    name@GOTOFF
1478dddc152SMin-Yih Hsu   MO_GOTOFF,
1488dddc152SMin-Yih Hsu 
1498dddc152SMin-Yih Hsu   /// On a symbol operand this indicates that the immediate is offset to the
1508dddc152SMin-Yih Hsu   /// GOT entry for the symbol name from the current code location.
1518dddc152SMin-Yih Hsu   ///
1528dddc152SMin-Yih Hsu   ///    name@GOTPCREL
1538dddc152SMin-Yih Hsu   MO_GOTPCREL,
1548dddc152SMin-Yih Hsu 
1558dddc152SMin-Yih Hsu   /// On a symbol operand this indicates that the immediate is offset to the
1568dddc152SMin-Yih Hsu   /// PLT entry of symbol name from the current code location.
1578dddc152SMin-Yih Hsu   ///
1588dddc152SMin-Yih Hsu   ///    name@PLT
1598dddc152SMin-Yih Hsu   MO_PLT,
1604c2ec08eSSheng 
1614c2ec08eSSheng   /// On a symbol operand, this indicates that the immediate is the offset to
1624c2ec08eSSheng   /// the slot in GOT which stores the information for accessing the TLS
1634c2ec08eSSheng   /// variable. This is used when operating in Global Dynamic mode.
1644c2ec08eSSheng   ///    name@TLSGD
1654c2ec08eSSheng   MO_TLSGD,
1664c2ec08eSSheng 
1674c2ec08eSSheng   /// On a symbol operand, this indicates that the immediate is the offset to
1684c2ec08eSSheng   /// variable within the thread local storage when operating in Local Dynamic
1694c2ec08eSSheng   /// mode.
1704c2ec08eSSheng   ///    name@TLSLD
1714c2ec08eSSheng   MO_TLSLD,
1724c2ec08eSSheng 
1734c2ec08eSSheng   /// On a symbol operand, this indicates that the immediate is the offset to
1744c2ec08eSSheng   /// the slot in GOT which stores the information for accessing the TLS
1754c2ec08eSSheng   /// variable. This is used when operating in Local Dynamic mode.
1764c2ec08eSSheng   ///    name@TLSLDM
1774c2ec08eSSheng   MO_TLSLDM,
1784c2ec08eSSheng 
1794c2ec08eSSheng   /// On a symbol operand, this indicates that the immediate is the offset to
1804c2ec08eSSheng   /// the variable within the thread local storage when operating in Initial
1814c2ec08eSSheng   /// Exec mode.
1824c2ec08eSSheng   ///    name@TLSIE
1834c2ec08eSSheng   MO_TLSIE,
1844c2ec08eSSheng 
1854c2ec08eSSheng   /// On a symbol operand, this indicates that the immediate is the offset to
1864c2ec08eSSheng   /// the variable within in the thread local storage when operating in Local
1874c2ec08eSSheng   /// Exec mode.
1884c2ec08eSSheng   ///    name@TLSLE
1894c2ec08eSSheng   MO_TLSLE,
1904c2ec08eSSheng 
1918dddc152SMin-Yih Hsu }; // enum TOF
1928dddc152SMin-Yih Hsu 
1938dddc152SMin-Yih Hsu /// Return true if the specified TargetFlag operand is a reference to a stub
1948dddc152SMin-Yih Hsu /// for a global, not the global itself.
isGlobalStubReference(unsigned char TargetFlag)1958dddc152SMin-Yih Hsu inline static bool isGlobalStubReference(unsigned char TargetFlag) {
1968dddc152SMin-Yih Hsu   switch (TargetFlag) {
1978dddc152SMin-Yih Hsu   default:
1988dddc152SMin-Yih Hsu     return false;
1998dddc152SMin-Yih Hsu   case M68kII::MO_GOTPCREL: // pc-relative GOT reference.
2008dddc152SMin-Yih Hsu   case M68kII::MO_GOT:      // normal GOT reference.
2018dddc152SMin-Yih Hsu     return true;
2028dddc152SMin-Yih Hsu   }
2038dddc152SMin-Yih Hsu }
2048dddc152SMin-Yih Hsu 
2058dddc152SMin-Yih Hsu /// Return True if the specified GlobalValue is a direct reference for a
2068dddc152SMin-Yih Hsu /// symbol.
isDirectGlobalReference(unsigned char Flag)2078dddc152SMin-Yih Hsu inline static bool isDirectGlobalReference(unsigned char Flag) {
2088dddc152SMin-Yih Hsu   switch (Flag) {
2098dddc152SMin-Yih Hsu   default:
2108dddc152SMin-Yih Hsu     return false;
2118dddc152SMin-Yih Hsu   case M68kII::MO_NO_FLAG:
2128dddc152SMin-Yih Hsu   case M68kII::MO_ABSOLUTE_ADDRESS:
2138dddc152SMin-Yih Hsu   case M68kII::MO_PC_RELATIVE_ADDRESS:
2148dddc152SMin-Yih Hsu     return true;
2158dddc152SMin-Yih Hsu   }
2168dddc152SMin-Yih Hsu }
2178dddc152SMin-Yih Hsu 
2188dddc152SMin-Yih Hsu /// Return true if the specified global value reference is relative to a 32-bit
2198dddc152SMin-Yih Hsu /// PIC base (M68kISD::GLOBAL_BASE_REG). If this is true, the addressing mode
2208dddc152SMin-Yih Hsu /// has the PIC base register added in.
isGlobalRelativeToPICBase(unsigned char TargetFlag)2218dddc152SMin-Yih Hsu inline static bool isGlobalRelativeToPICBase(unsigned char TargetFlag) {
2228dddc152SMin-Yih Hsu   switch (TargetFlag) {
2238dddc152SMin-Yih Hsu   default:
2248dddc152SMin-Yih Hsu     return false;
2258dddc152SMin-Yih Hsu   case M68kII::MO_GOTOFF: // isPICStyleGOT: local global.
2268dddc152SMin-Yih Hsu   case M68kII::MO_GOT:    // isPICStyleGOT: other global.
2278dddc152SMin-Yih Hsu     return true;
2288dddc152SMin-Yih Hsu   }
2298dddc152SMin-Yih Hsu }
2308dddc152SMin-Yih Hsu 
2318dddc152SMin-Yih Hsu /// Return True if the specified GlobalValue requires PC addressing mode.
isPCRelGlobalReference(unsigned char Flag)2328dddc152SMin-Yih Hsu inline static bool isPCRelGlobalReference(unsigned char Flag) {
2338dddc152SMin-Yih Hsu   switch (Flag) {
2348dddc152SMin-Yih Hsu   default:
2358dddc152SMin-Yih Hsu     return false;
2368dddc152SMin-Yih Hsu   case M68kII::MO_GOTPCREL:
2378dddc152SMin-Yih Hsu   case M68kII::MO_PC_RELATIVE_ADDRESS:
2388dddc152SMin-Yih Hsu     return true;
2398dddc152SMin-Yih Hsu   }
2408dddc152SMin-Yih Hsu }
2418dddc152SMin-Yih Hsu 
2428dddc152SMin-Yih Hsu /// Return True if the Block is referenced using PC
isPCRelBlockReference(unsigned char Flag)2438dddc152SMin-Yih Hsu inline static bool isPCRelBlockReference(unsigned char Flag) {
2448dddc152SMin-Yih Hsu   switch (Flag) {
2458dddc152SMin-Yih Hsu   default:
2468dddc152SMin-Yih Hsu     return false;
2478dddc152SMin-Yih Hsu   case M68kII::MO_PC_RELATIVE_ADDRESS:
2488dddc152SMin-Yih Hsu     return true;
2498dddc152SMin-Yih Hsu   }
2508dddc152SMin-Yih Hsu }
2518dddc152SMin-Yih Hsu 
isAddressRegister(unsigned RegNo)2528dddc152SMin-Yih Hsu static inline bool isAddressRegister(unsigned RegNo) {
2538dddc152SMin-Yih Hsu   switch (RegNo) {
2548dddc152SMin-Yih Hsu   case M68k::WA0:
2558dddc152SMin-Yih Hsu   case M68k::WA1:
2568dddc152SMin-Yih Hsu   case M68k::WA2:
2578dddc152SMin-Yih Hsu   case M68k::WA3:
2588dddc152SMin-Yih Hsu   case M68k::WA4:
2598dddc152SMin-Yih Hsu   case M68k::WA5:
2608dddc152SMin-Yih Hsu   case M68k::WA6:
261cd442157SRicky Taylor   case M68k::WSP:
2628dddc152SMin-Yih Hsu   case M68k::A0:
2638dddc152SMin-Yih Hsu   case M68k::A1:
2648dddc152SMin-Yih Hsu   case M68k::A2:
2658dddc152SMin-Yih Hsu   case M68k::A3:
2668dddc152SMin-Yih Hsu   case M68k::A4:
2678dddc152SMin-Yih Hsu   case M68k::A5:
2688dddc152SMin-Yih Hsu   case M68k::A6:
2698dddc152SMin-Yih Hsu   case M68k::SP:
2708dddc152SMin-Yih Hsu     return true;
2718dddc152SMin-Yih Hsu   default:
2728dddc152SMin-Yih Hsu     return false;
2738dddc152SMin-Yih Hsu   }
2748dddc152SMin-Yih Hsu }
2758dddc152SMin-Yih Hsu 
hasMultiMIOperands(unsigned Op,unsigned LogicalOpIdx)2768dddc152SMin-Yih Hsu static inline bool hasMultiMIOperands(unsigned Op, unsigned LogicalOpIdx) {
2778dddc152SMin-Yih Hsu   return M68k::getLogicalOperandSize(Op, LogicalOpIdx) > 1;
2788dddc152SMin-Yih Hsu }
2798dddc152SMin-Yih Hsu 
getMaskedSpillRegister(unsigned order)2808dddc152SMin-Yih Hsu static inline unsigned getMaskedSpillRegister(unsigned order) {
2818dddc152SMin-Yih Hsu   switch (order) {
2828dddc152SMin-Yih Hsu   default:
2838dddc152SMin-Yih Hsu     return 0;
2848dddc152SMin-Yih Hsu   case 0:
2858dddc152SMin-Yih Hsu     return M68k::D0;
2868dddc152SMin-Yih Hsu   case 1:
2878dddc152SMin-Yih Hsu     return M68k::D1;
2888dddc152SMin-Yih Hsu   case 2:
2898dddc152SMin-Yih Hsu     return M68k::D2;
2908dddc152SMin-Yih Hsu   case 3:
2918dddc152SMin-Yih Hsu     return M68k::D3;
2928dddc152SMin-Yih Hsu   case 4:
2938dddc152SMin-Yih Hsu     return M68k::D4;
2948dddc152SMin-Yih Hsu   case 5:
2958dddc152SMin-Yih Hsu     return M68k::D5;
2968dddc152SMin-Yih Hsu   case 6:
2978dddc152SMin-Yih Hsu     return M68k::D6;
2988dddc152SMin-Yih Hsu   case 7:
2998dddc152SMin-Yih Hsu     return M68k::D7;
3008dddc152SMin-Yih Hsu   case 8:
3018dddc152SMin-Yih Hsu     return M68k::A0;
3028dddc152SMin-Yih Hsu   case 9:
3038dddc152SMin-Yih Hsu     return M68k::A1;
3048dddc152SMin-Yih Hsu   case 10:
3058dddc152SMin-Yih Hsu     return M68k::A2;
3068dddc152SMin-Yih Hsu   case 11:
3078dddc152SMin-Yih Hsu     return M68k::A3;
3088dddc152SMin-Yih Hsu   case 12:
3098dddc152SMin-Yih Hsu     return M68k::A4;
3108dddc152SMin-Yih Hsu   case 13:
3118dddc152SMin-Yih Hsu     return M68k::A5;
3128dddc152SMin-Yih Hsu   case 14:
3138dddc152SMin-Yih Hsu     return M68k::A6;
3148dddc152SMin-Yih Hsu   case 15:
315cd442157SRicky Taylor     return M68k::SP;
3168dddc152SMin-Yih Hsu   }
3178dddc152SMin-Yih Hsu }
3188dddc152SMin-Yih Hsu 
3198dddc152SMin-Yih Hsu } // namespace M68kII
3208dddc152SMin-Yih Hsu 
3218dddc152SMin-Yih Hsu } // namespace llvm
3228dddc152SMin-Yih Hsu 
3234a7890c6SJim Lin #endif // LLVM_LIB_TARGET_M68K_MCTARGETDESC_M68KBASEINFO_H
324