1//===-- M68kInstrInfo.td - Main M68k Instruction Definition -*- tablegen -*-==// 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/// \file 10/// This file describes the M68k instruction set, defining the instructions 11/// and properties of the instructions which are needed for code generation, 12/// machine code emission, and analysis. 13/// 14//===----------------------------------------------------------------------===// 15 16include "M68kInstrFormats.td" 17 18//===----------------------------------------------------------------------===// 19// Profiles 20//===----------------------------------------------------------------------===// 21 22def MxSDT_CallSeqStart : SDCallSeqStart<[SDTCisVT<0, i32>, SDTCisVT<1, i32>]>; 23def MxSDT_CallSeqEnd : SDCallSeqEnd<[SDTCisVT<0, i32>, SDTCisVT<1, i32>]>; 24 25def MxSDT_Call : SDTypeProfile<0, -1, [SDTCisVT<0, iPTR>]>; 26 27def MxSDT_Ret : SDTypeProfile<0, -1, [ 28 /* ADJ */ SDTCisVT<0, i32> 29]>; 30 31def MxSDT_TCRet : SDTypeProfile<0, 2, [SDTCisPtrTy<0>, SDTCisVT<1, i32>]>; 32 33def MxSDT_Wrapper : SDTypeProfile<1, 1, [SDTCisSameAs<0, 1>, SDTCisPtrTy<0>]>; 34 35def MxSDT_UnArithCCROut : SDTypeProfile<2, 1, [ 36 /* RES */ SDTCisInt<0>, 37 /* CCR */ SDTCisVT<1, i8>, 38 /* OPD */ SDTCisSameAs<0, 2> 39]>; 40 41// RES, CCR <- op LHS, RHS 42def MxSDT_BiArithCCROut : SDTypeProfile<2, 2, [ 43 /* RES */ SDTCisInt<0>, 44 /* CCR */ SDTCisVT<1, i8>, 45 /* LHS */ SDTCisSameAs<0, 2>, 46 /* RHS */ SDTCisSameAs<0, 3> 47]>; 48 49// RES, CCR <- op LHS, RHS, CCR 50def MxSDT_BiArithCCRInOut : SDTypeProfile<2, 3, [ 51 /* RES 1 */ SDTCisInt<0>, 52 /* CCR */ SDTCisVT<1, i8>, 53 /* LHS */ SDTCisSameAs<0, 2>, 54 /* RHS */ SDTCisSameAs<0, 3>, 55 /* CCR */ SDTCisSameAs<1, 4> 56]>; 57 58// RES1, RES2, CCR <- op LHS, RHS 59def MxSDT_2BiArithCCROut : SDTypeProfile<3, 2, [ 60 /* RES 1 */ SDTCisInt<0>, 61 /* RES 2 */ SDTCisSameAs<0, 1>, 62 /* CCR */ SDTCisVT<1, i8>, 63 /* LHS */ SDTCisSameAs<0, 2>, 64 /* RHS */ SDTCisSameAs<0, 3> 65]>; 66 67def MxSDT_CmpTest : SDTypeProfile<1, 2, [ 68 /* CCR */ SDTCisVT<0, i8>, 69 /* Ops */ SDTCisSameAs<1, 2> 70]>; 71 72def MxSDT_Cmov : SDTypeProfile<1, 4, [ 73 /* ARG */ SDTCisSameAs<0, 1>, 74 /* ARG */ SDTCisSameAs<1, 2>, 75 /* Cond */ SDTCisVT<3, i8>, 76 /* CCR */ SDTCisVT<4, i8> 77]>; 78 79def MxSDT_BrCond : SDTypeProfile<0, 3, [ 80 /* Dest */ SDTCisVT<0, OtherVT>, 81 /* Cond */ SDTCisVT<1, i8>, 82 /* CCR */ SDTCisVT<2, i8> 83]>; 84 85def MxSDT_SetCC : SDTypeProfile<1, 2, [ 86 /* BOOL */ SDTCisVT<0, i8>, 87 /* Cond */ SDTCisVT<1, i8>, 88 /* CCR */ SDTCisVT<2, i8> 89]>; 90 91def MxSDT_SetCC_C : SDTypeProfile<1, 2, [ 92 /* BOOL */ SDTCisInt<0>, 93 /* Cond */ SDTCisVT<1, i8>, 94 /* CCR */ SDTCisVT<2, i8> 95]>; 96 97 98def MxSDT_SEG_ALLOCA : SDTypeProfile<1, 1,[ 99 /* MEM */ SDTCisVT<0, iPTR>, 100 /* SIZE */ SDTCisVT<1, iPTR> 101]>; 102 103 104//===----------------------------------------------------------------------===// 105// Nodes 106//===----------------------------------------------------------------------===// 107 108def MxCallSeqStart : SDNode<"ISD::CALLSEQ_START", MxSDT_CallSeqStart, 109 [SDNPHasChain, SDNPOutGlue]>; 110 111def MxCallSeqEnd : SDNode<"ISD::CALLSEQ_END", MxSDT_CallSeqEnd, 112 [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>; 113 114def MxCall : SDNode<"M68kISD::CALL", MxSDT_Call, 115 [SDNPHasChain, SDNPOutGlue, 116 SDNPOptInGlue, SDNPVariadic]>; 117 118def MxRet : SDNode<"M68kISD::RET", MxSDT_Ret, 119 [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>; 120 121def MxTCRet : SDNode<"M68kISD::TC_RETURN", MxSDT_TCRet, 122 [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>; 123 124def MxWrapper : SDNode<"M68kISD::Wrapper", MxSDT_Wrapper>; 125def MxWrapperPC : SDNode<"M68kISD::WrapperPC", MxSDT_Wrapper>; 126 127def MxAdd : SDNode<"M68kISD::ADD", MxSDT_BiArithCCROut, [SDNPCommutative]>; 128def MxSub : SDNode<"M68kISD::SUB", MxSDT_BiArithCCROut>; 129def MxOr : SDNode<"M68kISD::OR", MxSDT_BiArithCCROut, [SDNPCommutative]>; 130def MxXor : SDNode<"M68kISD::XOR", MxSDT_BiArithCCROut, [SDNPCommutative]>; 131def MxAnd : SDNode<"M68kISD::AND", MxSDT_BiArithCCROut, [SDNPCommutative]>; 132 133def MxAddX : SDNode<"M68kISD::ADDX", MxSDT_BiArithCCRInOut>; 134def MxSubX : SDNode<"M68kISD::SUBX", MxSDT_BiArithCCRInOut>; 135 136def MxSMul : SDNode<"M68kISD::SMUL", MxSDT_BiArithCCROut, [SDNPCommutative]>; 137def MxUMul : SDNode<"M68kISD::UMUL", MxSDT_2BiArithCCROut, [SDNPCommutative]>; 138 139def MxCmp : SDNode<"M68kISD::CMP", MxSDT_CmpTest>; 140def MxBtst : SDNode<"M68kISD::BTST", MxSDT_CmpTest>; 141 142def MxCmov : SDNode<"M68kISD::CMOV", MxSDT_Cmov>; 143def MxBrCond : SDNode<"M68kISD::BRCOND", MxSDT_BrCond, [SDNPHasChain]>; 144def MxSetCC : SDNode<"M68kISD::SETCC", MxSDT_SetCC>; 145def MxSetCC_C : SDNode<"M68kISD::SETCC_CARRY", MxSDT_SetCC_C>; 146 147 148def MxSegAlloca : SDNode<"M68kISD::SEG_ALLOCA", MxSDT_SEG_ALLOCA, 149 [SDNPHasChain]>; 150 151 152//===----------------------------------------------------------------------===// 153// Operands 154//===----------------------------------------------------------------------===// 155 156/// Size is the size of the data, either bits of a register or number of bits 157/// addressed in memory. Size id is a letter that identifies size. 158class MxSize<int num, string id, string full> { 159 int Num = num; 160 string Id = id; 161 string Full = full; 162} 163 164def MxSize8 : MxSize<8, "b", "byte">; 165def MxSize16 : MxSize<16, "w", "word">; 166def MxSize32 : MxSize<32, "l", "long">; 167 168class MxOpClass<string name, 169 list<AsmOperandClass> superClasses = []> : AsmOperandClass { 170 let Name = name; 171 let ParserMethod = "parseMemOp"; 172 let SuperClasses = superClasses; 173} 174 175def MxRegClass : MxOpClass<"Reg">; 176// Splitting asm register class to avoid ambiguous on operands' 177// MatchClassKind. For instance, without this separation, 178// both ADD32dd and ADD32dr has {MCK_RegClass, MCK_RegClass} for 179// their operands, which makes AsmParser unable to pick the correct 180// one in a deterministic way. 181let RenderMethod = "addRegOperands", SuperClasses = [MxRegClass]in { 182 def MxARegClass : MxOpClass<"AReg">; 183 def MxDRegClass : MxOpClass<"DReg">; 184} 185 186class MxOperand<ValueType vt, MxSize size, string letter, RegisterClass rc, dag pat = (null_frag)> { 187 ValueType VT = vt; 188 string Letter = letter; 189 MxSize Size = size; 190 RegisterClass RC = rc; 191 dag Pat = pat; 192} 193 194class MxRegOp<ValueType vt, 195 RegisterClass rc, 196 MxSize size, 197 string letter, 198 string pm = "printOperand"> 199 : RegisterOperand<rc, pm>, 200 MxOperand<vt, size, letter, rc> { 201 let ParserMatchClass = MxRegClass; 202} 203 204// REGISTER DIRECT. The operand is in the data register specified by 205// the effective address register field. 206def MxXRD16 : MxRegOp<i16, XR16, MxSize16, "r">; 207def MxXRD32 : MxRegOp<i32, XR32, MxSize32, "r">; 208 209def MxXRD16_TC : MxRegOp<i16, XR16_TC, MxSize16, "r">; 210def MxXRD32_TC : MxRegOp<i32, XR32_TC, MxSize32, "r">; 211 212// DATA REGISTER DIRECT. The operand is in the data register specified by 213// the effective address register field. 214let ParserMatchClass = MxDRegClass in { 215 def MxDRD8 : MxRegOp<i8, DR8, MxSize8, "d">; 216 def MxDRD16 : MxRegOp<i16, DR16, MxSize16, "d">; 217 def MxDRD32 : MxRegOp<i32, DR32, MxSize32, "d">; 218 219 def MxDRD16_TC : MxRegOp<i16, DR16_TC, MxSize16, "d">; 220 def MxDRD32_TC : MxRegOp<i32, DR32_TC, MxSize32, "d">; 221} 222 223// ADDRESS REGISTER DIRECT. The operand is in the address register specified by 224// the effective address register field. 225let ParserMatchClass = MxARegClass in { 226 def MxARD16 : MxRegOp<i16, AR16, MxSize16, "a">; 227 def MxARD32 : MxRegOp<i32, AR32, MxSize32, "a">; 228 229 def MxARD16_TC : MxRegOp<i16, AR16_TC, MxSize16, "a">; 230 def MxARD32_TC : MxRegOp<i32, AR32_TC, MxSize32, "a">; 231} 232 233class MxMemOp<dag ops, MxSize size, string letter, 234 string printMethod = "printOperand", 235 AsmOperandClass parserMatchClass = ImmAsmOperand> 236 : Operand<iPTR>, MxOperand<iPTR, size, letter, ?> { 237 let PrintMethod = printMethod; 238 let MIOperandInfo = ops; 239 let ParserMatchClass = parserMatchClass; 240 let OperandType = "OPERAND_MEMORY"; 241} 242 243// ADDRESS REGISTER INDIRECT. The address of the operand is in the address 244// register specified by the register field. The reference is classified as 245// a data reference with the exception of the jump and jump-to-subroutine 246// instructions. 247def MxARI : MxOpClass<"ARI">; 248def MxARI8 : MxMemOp<(ops AR32), MxSize8, "j", "printARI8Mem", MxARI>; 249def MxARI16 : MxMemOp<(ops AR32), MxSize16, "j", "printARI16Mem", MxARI>; 250def MxARI32 : MxMemOp<(ops AR32), MxSize32, "j", "printARI32Mem", MxARI>; 251 252def MxARI8_TC : MxMemOp<(ops AR32_TC), MxSize8, "j", "printARI8Mem", MxARI>; 253def MxARI16_TC : MxMemOp<(ops AR32_TC), MxSize16, "j", "printARI16Mem", MxARI>; 254def MxARI32_TC : MxMemOp<(ops AR32_TC), MxSize32, "j", "printARI32Mem", MxARI>; 255 256// ADDRESS REGISTER INDIRECT WITH POSTINCREMENT. The address of the operand is 257// in the address register specified by the register field. After the operand 258// address is used, it is incremented by one, two, or four depending upon whether 259// the size of the operand is byte, word, or long word. If the address register 260// is the stack pointer and the operand size is byte, the address is incremented 261// by two rather than one to keep the stack pointer on a word boundary. 262// The reference is classified as a data reference. 263def MxARIPI : MxOpClass<"ARIPI">; 264def MxARIPI8 : MxMemOp<(ops AR32), MxSize8, "o", "printARIPI8Mem", MxARIPI>; 265def MxARIPI16 : MxMemOp<(ops AR32), MxSize16, "o", "printARIPI16Mem", MxARIPI>; 266def MxARIPI32 : MxMemOp<(ops AR32), MxSize32, "o", "printARIPI32Mem", MxARIPI>; 267 268def MxARIPI8_TC : MxMemOp<(ops AR32_TC), MxSize8, "o", "printARIPI8Mem", MxARIPI>; 269def MxARIPI16_TC : MxMemOp<(ops AR32_TC), MxSize16, "o", "printARIPI16Mem", MxARIPI>; 270def MxARIPI32_TC : MxMemOp<(ops AR32_TC), MxSize32, "o", "printARIPI32Mem", MxARIPI>; 271 272// ADDRESS REGISTER INDIRECT WITH PREDECREMENT. The address of the operand is in 273// the address register specified by the register field. Before the operand 274// address is used, it is decremented by one, two, or four depending upon whether 275// the operand size is byte, word, or long word. If the address register is 276// the stack pointer and the operand size is byte, the address is decremented by 277// two rather than one to keep the stack pointer on a word boundary. 278// The reference is classified as a data reference. 279def MxARIPD : MxOpClass<"ARIPD">; 280def MxARIPD8 : MxMemOp<(ops AR32), MxSize8, "e", "printARIPD8Mem", MxARIPD>; 281def MxARIPD16 : MxMemOp<(ops AR32), MxSize16, "e", "printARIPD16Mem", MxARIPD>; 282def MxARIPD32 : MxMemOp<(ops AR32), MxSize32, "e", "printARIPD32Mem", MxARIPD>; 283 284def MxARIPD8_TC : MxMemOp<(ops AR32_TC), MxSize8, "e", "printARIPD8Mem", MxARIPD>; 285def MxARIPD16_TC : MxMemOp<(ops AR32_TC), MxSize16, "e", "printARIPD16Mem", MxARIPD>; 286def MxARIPD32_TC : MxMemOp<(ops AR32_TC), MxSize32, "e", "printARIPD32Mem", MxARIPD>; 287 288// ADDRESS REGISTER INDIRECT WITH DISPLACEMENT. This addressing mode requires one 289// word of extension. The address of the operand is the sum of the address in 290// the address register and the sign-extended 16-bit displacement integer in the 291// extension word. The reference is classified as a data reference with the 292// exception of the jump and jump-to-subroutine instructions. 293def MxARID : MxOpClass<"ARID">; 294def MxARID8 : MxMemOp<(ops i16imm:$disp, AR32:$reg), MxSize8, "p", "printARID8Mem", MxARID>; 295def MxARID16 : MxMemOp<(ops i16imm:$disp, AR32:$reg), MxSize16, "p", "printARID16Mem", MxARID>; 296def MxARID32 : MxMemOp<(ops i16imm:$disp, AR32:$reg), MxSize32, "p", "printARID32Mem", MxARID>; 297 298def MxARID8_TC : MxMemOp<(ops i16imm:$disp, AR32_TC:$reg), MxSize8, "p", "printARID8Mem", MxARID>; 299def MxARID16_TC : MxMemOp<(ops i16imm:$disp, AR32_TC:$reg), MxSize16, "p", "printARID16Mem", MxARID>; 300def MxARID32_TC : MxMemOp<(ops i16imm:$disp, AR32_TC:$reg), MxSize32, "p", "printARID32Mem", MxARID>; 301 302// ADDRESS REGISTER INDIRECT WITH INDEX. This addressing mode requires one word 303// of extension. The address of the operand is the sum of the address in the 304// address register, the signextended displacement integer in the low order eight 305// bits of the extension word, and the contents of the index register. 306// The reference is classified as a data reference with the exception of the 307// jump and jump-to-subroutine instructions 308def MxARII : MxOpClass<"ARII">; 309def MxARII8 : MxMemOp<(ops i8imm:$disp, AR32:$reg, XR32:$index), 310 MxSize8, "f", "printARII8Mem", MxARII>; 311def MxARII16 : MxMemOp<(ops i8imm:$disp, AR32:$reg, XR32:$index), 312 MxSize16, "f", "printARII16Mem", MxARII>; 313def MxARII32 : MxMemOp<(ops i8imm:$disp, AR32:$reg, XR32:$index), 314 MxSize32, "f", "printARII32Mem", MxARII>; 315 316def MxARII8_TC : MxMemOp<(ops i8imm:$disp, AR32_TC:$reg, XR32_TC:$index), 317 MxSize8, "f", "printARII8Mem", MxARII>; 318def MxARII16_TC : MxMemOp<(ops i8imm:$disp, AR32_TC:$reg, XR32_TC:$index), 319 MxSize16, "f", "printARII16Mem", MxARII>; 320def MxARII32_TC : MxMemOp<(ops i8imm:$disp, AR32_TC:$reg, XR32_TC:$index), 321 MxSize32, "f", "printARII32Mem", MxARII>; 322 323// ABSOLUTE SHORT ADDRESS. This addressing mode requires one word of extension. 324// The address of the operand is the extension word. The 16-bit address is sign 325// extended before it is used. The reference is classified as a data reference 326// with the exception of the jump and jump-tosubroutine instructions. 327def MxAddr : MxOpClass<"Addr">; 328let RenderMethod = "addAddrOperands" in { 329 // This hierarchy ensures Addr8 will always be parsed 330 // before other larger-width variants. 331 def MxAddr32 : MxOpClass<"Addr32", [MxAddr]>; 332 def MxAddr16 : MxOpClass<"Addr16", [MxAddr32]>; 333 def MxAddr8 : MxOpClass<"Addr8", [MxAddr16]>; 334} 335 336def MxAS8 : MxMemOp<(ops OtherVT), MxSize8, "B", "printAS8Mem", MxAddr8>; 337def MxAS16 : MxMemOp<(ops OtherVT), MxSize16, "B", "printAS16Mem", MxAddr16>; 338def MxAS32 : MxMemOp<(ops OtherVT), MxSize32, "B", "printAS32Mem", MxAddr32>; 339 340// ABSOLUTE LONG ADDRESS. This addressing mode requires two words of extension. 341// The address of the operand is developed by the concatenation of the extension 342// words. The high order part of the address is the first extension word; the low 343// order part of the address is the second extension word. The reference is 344// classified as a data reference with the exception of the jump and jump 345// to-subroutine instructions. 346def MxAL8 : MxMemOp<(ops OtherVT), MxSize8, "b", "printAL8Mem", MxAddr8>; 347def MxAL16 : MxMemOp<(ops OtherVT), MxSize16, "b", "printAL16Mem", MxAddr16>; 348def MxAL32 : MxMemOp<(ops OtherVT), MxSize32, "b", "printAL32Mem", MxAddr32>; 349 350def MxPCD : MxOpClass<"PCD">; 351def MxPCI : MxOpClass<"PCI">; 352 353let OperandType = "OPERAND_PCREL" in { 354// PROGRAM COUNTER WITH DISPLACEMENT. This addressing mode requires one word of 355// extension. The address of the operand is the sum of the address in the program 356// counter and the Sign-extended 16-bit displacement integer in the extension 357// word. The value in the program counter is the address of the extension word. 358// The reference is classified as a program reference. 359def MxPCD8 : MxMemOp<(ops i16imm), MxSize8, "q", "printPCD8Mem", MxPCD>; 360def MxPCD16 : MxMemOp<(ops i16imm), MxSize16, "q", "printPCD16Mem", MxPCD>; 361def MxPCD32 : MxMemOp<(ops i16imm), MxSize32, "q", "printPCD32Mem", MxPCD>; 362 363// PROGRAM COUNTER WITH INDEX. This addressing mode requires one word of 364// extension. The address is the sum of the address in the program counter, the 365// sign-extended displacement integer in the lower eight bits of the extension 366// word, and the contents of the index register. The value in the program 367// counter is the address of the extension word. This reference is classified as 368// a program reference. 369def MxPCI8 : MxMemOp<(ops i8imm:$disp, XR32:$index), MxSize8, "k", "printPCI8Mem", MxPCI>; 370def MxPCI16 : MxMemOp<(ops i8imm:$disp, XR32:$index), MxSize16, "k", "printPCI16Mem", MxPCI>; 371def MxPCI32 : MxMemOp<(ops i8imm:$disp, XR32:$index), MxSize32, "k", "printPCI32Mem", MxPCI>; 372} // OPERAND_PCREL 373 374def MxImm : AsmOperandClass { 375 let Name = "MxImm"; 376 let PredicateMethod = "isImm"; 377 let RenderMethod = "addImmOperands"; 378 let ParserMethod = "parseImm"; 379} 380 381class MxOp<ValueType vt, MxSize size, string letter> 382 : Operand<vt>, 383 MxOperand<vt, size, letter, ?> { 384 let ParserMatchClass = MxImm; 385} 386 387let OperandType = "OPERAND_IMMEDIATE", 388 PrintMethod = "printImmediate" in { 389// IMMEDIATE DATA. This addressing mode requires either one or two words of 390// extension depending on the size of the operation. 391// Byte Operation - operand is low order byte of extension word 392// Word Operation - operand is extension word 393// Long Word Operation - operand is in the two extension words, 394// high order 16 bits are in the first 395// extension word, low order 16 bits are 396// in the second extension word. 397def Mxi8imm : MxOp<i8, MxSize8, "i">; 398def Mxi16imm : MxOp<i16, MxSize16, "i">; 399def Mxi32imm : MxOp<i32, MxSize32, "i">; 400} // OPERAND_IMMEDIATE 401 402class MxBrTargetOperand<int N> : Operand<OtherVT> { 403 let OperandType = "OPERAND_PCREL"; 404 let PrintMethod = "printPCRelImm"; 405 let ParserMatchClass = !cast<AsmOperandClass>("MxAddr"#N); 406} 407// Branch targets have OtherVT type and print as pc-relative values. 408def MxBrTarget8 : MxBrTargetOperand<8>; 409def MxBrTarget16 : MxBrTargetOperand<16>; 410def MxBrTarget32 : MxBrTargetOperand<32>; 411 412// Used with MOVEM 413def MxMoveMaskClass : MxOpClass<"MoveMask">; 414def MxMoveMask : MxOp<i16, MxSize16, "m"> { 415 let OperandType = "OPERAND_IMMEDIATE"; 416 let PrintMethod = "printMoveMask"; 417 let ParserMatchClass = MxMoveMaskClass; 418} 419 420//===----------------------------------------------------------------------===// 421// Predicates 422//===----------------------------------------------------------------------===// 423 424def SmallCode : Predicate<"TM.getCodeModel() == CodeModel::Small">; 425def KernelCode : Predicate<"TM.getCodeModel() == CodeModel::Kernel">; 426def FarData : Predicate<"TM.getCodeModel() != CodeModel::Small &&" 427 "TM.getCodeModel() != CodeModel::Kernel">; 428def NearData : Predicate<"TM.getCodeModel() == CodeModel::Small ||" 429 "TM.getCodeModel() == CodeModel::Kernel">; 430def IsPIC : Predicate<"TM.isPositionIndependent()">; 431def IsNotPIC : Predicate<"!TM.isPositionIndependent()">; 432def IsM68000 : Predicate<"Subtarget.IsM68000()">; 433def IsM68010 : Predicate<"Subtarget.IsM68010()">; 434def IsM68020 : Predicate<"Subtarget.IsM68020()">; 435def IsM68030 : Predicate<"Subtarget.IsM68030()">; 436def IsM68040 : Predicate<"Subtarget.IsM68040()">; 437 438 439//===----------------------------------------------------------------------===// 440// Condition Codes 441// 442// These MUST be kept in sync with codes enum in M68kInstrInfo.h 443//===----------------------------------------------------------------------===// 444 445def MxCONDt : PatLeaf<(i8 0)>; // True 446def MxCONDf : PatLeaf<(i8 1)>; // False 447def MxCONDhi : PatLeaf<(i8 2)>; // High 448def MxCONDls : PatLeaf<(i8 3)>; // Less or Same 449def MxCONDcc : PatLeaf<(i8 4)>; // Carry Clear 450def MxCONDcs : PatLeaf<(i8 5)>; // Carry Set 451def MxCONDne : PatLeaf<(i8 6)>; // Not Equal 452def MxCONDeq : PatLeaf<(i8 7)>; // Equal 453def MxCONDvc : PatLeaf<(i8 8)>; // Overflow Clear 454def MxCONDvs : PatLeaf<(i8 9)>; // Overflow Set 455def MxCONDpl : PatLeaf<(i8 10)>; // Plus 456def MxCONDmi : PatLeaf<(i8 11)>; // Minus 457def MxCONDge : PatLeaf<(i8 12)>; // Greater or Equal 458def MxCONDlt : PatLeaf<(i8 13)>; // Less Than 459def MxCONDgt : PatLeaf<(i8 14)>; // Greater Than 460def MxCONDle : PatLeaf<(i8 15)>; // Less or Equal 461 462 463//===----------------------------------------------------------------------===// 464// Complex Patterns 465//===----------------------------------------------------------------------===// 466 467// NOTE Though this CP is not strictly necessarily it will simplify instruciton 468// definitions 469def MxCP_ARI : ComplexPattern<iPTR, 1, "SelectARI", 470 [], [SDNPWantParent]>; 471 472def MxCP_ARIPI : ComplexPattern<iPTR, 1, "SelectARIPI", 473 [], [SDNPWantParent]>; 474 475def MxCP_ARIPD : ComplexPattern<iPTR, 1, "SelectARIPD", 476 [], [SDNPWantParent]>; 477 478def MxCP_ARID : ComplexPattern<iPTR, 2, "SelectARID", 479 [add, sub, mul, or, shl, frameindex], 480 [SDNPWantParent]>; 481 482def MxCP_ARII : ComplexPattern<iPTR, 3, "SelectARII", 483 [add, sub, mul, or, shl, frameindex], 484 [SDNPWantParent]>; 485 486def MxCP_AL : ComplexPattern<iPTR, 1, "SelectAL", 487 [add, sub, mul, or, shl], 488 [SDNPWantParent]>; 489 490def MxCP_PCD : ComplexPattern<iPTR, 1, "SelectPCD", 491 [add, sub, mul, or, shl], 492 [SDNPWantParent]>; 493 494def MxCP_PCI : ComplexPattern<iPTR, 2, "SelectPCI", 495 [add, sub, mul, or, shl], [SDNPWantParent]>; 496 497 498//===----------------------------------------------------------------------===// 499// Pattern Fragments 500//===----------------------------------------------------------------------===// 501 502def MximmSExt8 : PatLeaf<(i8 imm)>; 503def MximmSExt16 : PatLeaf<(i16 imm)>; 504def MximmSExt32 : PatLeaf<(i32 imm)>; 505 506// Used for Shifts and Rotations, since M68k immediates in these instructions 507// are 1 <= i <= 8. Generally, if immediate is bigger than 8 it will be moved 508// to a register and then an operation is performed. 509// 510// TODO Need to evaluate whether splitting one big shift(or rotate) 511// into a few smaller is faster than doing a move, if so do custom lowering 512def Mximm8_1to8 : ImmLeaf<i8, [{ return Imm >= 1 && Imm <= 8; }]>; 513def Mximm16_1to8 : ImmLeaf<i16, [{ return Imm >= 1 && Imm <= 8; }]>; 514def Mximm32_1to8 : ImmLeaf<i32, [{ return Imm >= 1 && Imm <= 8; }]>; 515 516// Helper fragments for loads. 517// It's always safe to treat a anyext i16 load as a i32 load if the i16 is 518// known to be 32-bit aligned or better. Ditto for i8 to i16. 519def Mxloadi16 : PatFrag<(ops node:$ptr), (i16 (unindexedload node:$ptr)), [{ 520 LoadSDNode *LD = cast<LoadSDNode>(N); 521 ISD::LoadExtType ExtType = LD->getExtensionType(); 522 if (ExtType == ISD::NON_EXTLOAD) 523 return true; 524 if (ExtType == ISD::EXTLOAD) 525 return LD->getAlignment() >= 2 && !LD->isSimple(); 526 return false; 527}]>; 528 529def Mxloadi32 : PatFrag<(ops node:$ptr), (i32 (unindexedload node:$ptr)), [{ 530 LoadSDNode *LD = cast<LoadSDNode>(N); 531 ISD::LoadExtType ExtType = LD->getExtensionType(); 532 if (ExtType == ISD::NON_EXTLOAD) 533 return true; 534 if (ExtType == ISD::EXTLOAD) 535 return LD->getAlignment() >= 4 && !LD->isSimple(); 536 return false; 537}]>; 538 539def Mxloadi8 : PatFrag<(ops node:$ptr), (i8 (load node:$ptr))>; 540 541def MxSExtLoadi16i8 : PatFrag<(ops node:$ptr), (i16 (sextloadi8 node:$ptr))>; 542def MxSExtLoadi32i8 : PatFrag<(ops node:$ptr), (i32 (sextloadi8 node:$ptr))>; 543def MxSExtLoadi32i16 : PatFrag<(ops node:$ptr), (i32 (sextloadi16 node:$ptr))>; 544 545def MxZExtLoadi8i1 : PatFrag<(ops node:$ptr), (i8 (zextloadi1 node:$ptr))>; 546def MxZExtLoadi16i1 : PatFrag<(ops node:$ptr), (i16 (zextloadi1 node:$ptr))>; 547def MxZExtLoadi32i1 : PatFrag<(ops node:$ptr), (i32 (zextloadi1 node:$ptr))>; 548def MxZExtLoadi16i8 : PatFrag<(ops node:$ptr), (i16 (zextloadi8 node:$ptr))>; 549def MxZExtLoadi32i8 : PatFrag<(ops node:$ptr), (i32 (zextloadi8 node:$ptr))>; 550def MxZExtLoadi32i16 : PatFrag<(ops node:$ptr), (i32 (zextloadi16 node:$ptr))>; 551 552def MxExtLoadi8i1 : PatFrag<(ops node:$ptr), (i8 (extloadi1 node:$ptr))>; 553def MxExtLoadi16i1 : PatFrag<(ops node:$ptr), (i16 (extloadi1 node:$ptr))>; 554def MxExtLoadi32i1 : PatFrag<(ops node:$ptr), (i32 (extloadi1 node:$ptr))>; 555def MxExtLoadi16i8 : PatFrag<(ops node:$ptr), (i16 (extloadi8 node:$ptr))>; 556def MxExtLoadi32i8 : PatFrag<(ops node:$ptr), (i32 (extloadi8 node:$ptr))>; 557def MxExtLoadi32i16 : PatFrag<(ops node:$ptr), (i32 (extloadi16 node:$ptr))>; 558 559 560//===----------------------------------------------------------------------===// 561// Type Fixtures 562// 563// Type Fixtures are ValueType related information sets that usually go together 564//===----------------------------------------------------------------------===// 565 566// TODO make it folded like MxType8.F.Op nad MxType8.F.Pat 567// TODO move strings into META subclass 568// vt: Type of data this fixture refers to 569// prefix: Prefix used to identify type 570// postfix: Prefix used to qualify type 571class MxType<ValueType vt, string prefix, string postfix, 572 // rLet: Register letter 573 // rOp: Supported any register operand 574 string rLet, MxOperand rOp, 575 // jOp: Supported ARI operand 576 // jPat: What ARI pattern to use 577 MxOperand jOp, ComplexPattern jPat, 578 // oOp: Supported ARIPI operand 579 // oPat: What ARIPI pattern is used 580 MxOperand oOp, ComplexPattern oPat, 581 // eOp: Supported ARIPD operand 582 // ePat: What ARIPD pattern is used 583 MxOperand eOp, ComplexPattern ePat, 584 // pOp: Supported ARID operand 585 // pPat: What ARID pattern is used 586 MxOperand pOp, ComplexPattern pPat, 587 // fOp: Supported ARII operand 588 // fPat: What ARII pattern is used 589 MxOperand fOp, ComplexPattern fPat, 590 // bOp: Supported absolute operand 591 // bPat: What absolute pattern is used 592 MxOperand bOp, ComplexPattern bPat, 593 // qOp: Supported PCD operand 594 // qPat: What PCD pattern is used 595 MxOperand qOp, ComplexPattern qPat, 596 // kOp: Supported PCI operand 597 // kPat: What PCI pattern is used 598 MxOperand kOp, ComplexPattern kPat, 599 // iOp: Supported immediate operand 600 // iPat: What immediate pattern is used 601 MxOperand iOp, PatFrag iPat, 602 // load: What load operation is used with MEM 603 PatFrag load> { 604 int Size = vt.Size; 605 ValueType VT = vt; 606 string Prefix = prefix; 607 string Postfix = postfix; 608 609 string RLet = rLet; 610 MxOperand ROp = rOp; 611 612 MxOperand JOp = jOp; 613 ComplexPattern JPat = jPat; 614 615 MxOperand OOp = oOp; 616 ComplexPattern OPat = oPat; 617 618 MxOperand EOp = eOp; 619 ComplexPattern EPat = ePat; 620 621 MxOperand POp = pOp; 622 ComplexPattern PPat = pPat; 623 624 MxOperand FOp = fOp; 625 ComplexPattern FPat = fPat; 626 627 MxOperand BOp = bOp; 628 ComplexPattern BPat = bPat; 629 630 MxOperand QOp = qOp; 631 ComplexPattern QPat = qPat; 632 633 MxOperand KOp = kOp; 634 ComplexPattern KPat = kPat; 635 636 MxOperand IOp = iOp; 637 PatFrag IPat = iPat; 638 639 PatFrag Load = load; 640} 641 642// Provides an alternative way to access the MxOperand and 643// patterns w.r.t a specific addressing mode. 644class MxOpBundle<int size, MxOperand op, ComplexPattern pat> { 645 int Size = size; 646 MxOperand Op = op; 647 ComplexPattern Pat = pat; 648} 649 650class MxImmOpBundle<int size, MxOperand op, PatFrag pat> 651 : MxOpBundle<size, op, ?> { 652 PatFrag ImmPat = pat; 653} 654 655// TODO: We can use MxOp<S>AddrMode_<AM> in more places to 656// replace MxType-based operand factoring. 657foreach size = [8, 16, 32] in { 658 // Dn 659 def MxOp#size#AddrMode_d 660 : MxOpBundle<size, !cast<MxOperand>("MxDRD"#size), ?>; 661 662 // (An) 663 def MxOp#size#AddrMode_j 664 : MxOpBundle<size, !cast<MxOperand>("MxARI"#size), MxCP_ARI>; 665 666 // (An)+ 667 def MxOp#size#AddrMode_o 668 : MxOpBundle<size, !cast<MxOperand>("MxARIPI"#size), MxCP_ARIPI>; 669 670 // -(An) 671 def MxOp#size#AddrMode_e 672 : MxOpBundle<size, !cast<MxOperand>("MxARIPD"#size), MxCP_ARIPD>; 673 674 // (i,An) 675 def MxOp#size#AddrMode_p 676 : MxOpBundle<size, !cast<MxOperand>("MxARID"#size), MxCP_ARID>; 677 678 // (i,An,Xn) 679 def MxOp#size#AddrMode_f 680 : MxOpBundle<size, !cast<MxOperand>("MxARII"#size), MxCP_ARII>; 681 682 // (ABS).L 683 def MxOp#size#AddrMode_b 684 : MxOpBundle<size, !cast<MxOperand>("MxAL"#size), MxCP_AL>; 685 686 // (i,PC) 687 def MxOp#size#AddrMode_q 688 : MxOpBundle<size, !cast<MxOperand>("MxPCD"#size), MxCP_PCD>; 689 690 // (i,PC,Xn) 691 def MxOp#size#AddrMode_k 692 : MxOpBundle<size, !cast<MxOperand>("MxPCI"#size), MxCP_PCI>; 693 694 // #imm 695 def MxOp#size#AddrMode_i 696 : MxImmOpBundle<size, !cast<MxOperand>("Mxi"#size#"imm"), 697 !cast<PatFrag>("MximmSExt"#size)>; 698} // foreach size = [8, 16, 32] 699 700foreach size = [16, 32] in { 701 // An 702 def MxOp#size#AddrMode_a 703 : MxOpBundle<size, !cast<MxOperand>("MxARD"#size), ?>; 704 705 // Xn 706 def MxOp#size#AddrMode_r 707 : MxOpBundle<size, !cast<MxOperand>("MxXRD"#size), ?>; 708} // foreach size = [16, 32] 709 710class MxType8Class<string rLet, MxOperand reg> 711 : MxType<i8, "b", "", rLet, reg, 712 MxARI8, MxCP_ARI, 713 MxARIPI8, MxCP_ARIPI, 714 MxARIPD8, MxCP_ARIPD, 715 MxARID8, MxCP_ARID, 716 MxARII8, MxCP_ARII, 717 MxAL8, MxCP_AL, 718 MxPCD8, MxCP_PCD, 719 MxPCI8, MxCP_PCI, 720 Mxi8imm, MximmSExt8, 721 Mxloadi8>; 722 723def MxType8 : MxType8Class<?,?>; 724 725class MxType16Class<string rLet, MxOperand reg> 726 : MxType<i16, "w", "", rLet, reg, 727 MxARI16, MxCP_ARI, 728 MxARIPI16, MxCP_ARIPI, 729 MxARIPD16, MxCP_ARIPD, 730 MxARID16, MxCP_ARID, 731 MxARII16, MxCP_ARII, 732 MxAL16, MxCP_AL, 733 MxPCD16, MxCP_PCD, 734 MxPCI16, MxCP_PCI, 735 Mxi16imm, MximmSExt16, 736 Mxloadi16>; 737 738def MxType16 : MxType16Class<?,?>; 739 740class MxType32Class<string rLet, MxOperand reg> 741 : MxType<i32, "l", "", rLet, reg, 742 MxARI32, MxCP_ARI, 743 MxARIPI32, MxCP_ARIPI, 744 MxARIPD32, MxCP_ARIPD, 745 MxARID32, MxCP_ARID, 746 MxARII32, MxCP_ARII, 747 MxAL32, MxCP_AL, 748 MxPCD32, MxCP_PCD, 749 MxPCI32, MxCP_PCI, 750 Mxi32imm, MximmSExt32, 751 Mxloadi32>; 752 753def MxType32 : MxType32Class<?,?>; 754 755 756def MxType8d : MxType8Class<"d", MxDRD8>; 757 758def MxType16d : MxType16Class<"d", MxDRD16>; 759def MxType16a : MxType16Class<"a", MxARD16>; 760def MxType16r : MxType16Class<"r", MxXRD16>; 761def MxType32d : MxType32Class<"d", MxDRD32>; 762def MxType32a : MxType32Class<"a", MxARD32>; 763def MxType32r : MxType32Class<"r", MxXRD32>; 764 765let Postfix = "_TC" in { 766def MxType16d_TC : MxType16Class<"d", MxDRD16_TC>; 767def MxType16a_TC : MxType16Class<"a", MxARD16_TC>; 768def MxType16r_TC : MxType16Class<"r", MxXRD16_TC>; 769def MxType32d_TC : MxType32Class<"d", MxDRD32_TC>; 770def MxType32a_TC : MxType32Class<"a", MxARD32_TC>; 771def MxType32r_TC : MxType32Class<"r", MxXRD32_TC>; 772} 773 774 775//===----------------------------------------------------------------------===// 776// Subsystems 777//===----------------------------------------------------------------------===// 778 779include "M68kInstrData.td" 780include "M68kInstrShiftRotate.td" 781include "M68kInstrBits.td" 782include "M68kInstrArithmetic.td" 783include "M68kInstrControl.td" 784 785include "M68kInstrCompiler.td" 786