1*82d56013Sjoerg//=== M68kInstrFormats.td - M68k Instruction Formats ---*- tablegen -*-===// 2*82d56013Sjoerg// The LLVM Compiler Infrastructure 3*82d56013Sjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*82d56013Sjoerg// See https://llvm.org/LICENSE.txt for license information. 5*82d56013Sjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*82d56013Sjoerg//===----------------------------------------------------------------------===// 7*82d56013Sjoerg/// 8*82d56013Sjoerg/// \file 9*82d56013Sjoerg/// This file contains M68k instruction formats. 10*82d56013Sjoerg/// 11*82d56013Sjoerg/// Since M68k has quite a lot memory addressing modes there are more 12*82d56013Sjoerg/// instruction prefixes than just i, r and m: 13*82d56013Sjoerg/// TSF Since Form Letter Description 14*82d56013Sjoerg/// 00 M68000 Dn or An r any register 15*82d56013Sjoerg/// 01 M68000 Dn d data register direct 16*82d56013Sjoerg/// 02 M68000 An a address register direct 17*82d56013Sjoerg/// 03 M68000 (An) j address register indirect 18*82d56013Sjoerg/// 04 M68000 (An)+ o address register indirect with postincrement 19*82d56013Sjoerg/// 05 M68000 -(An) e address register indirect with predecrement 20*82d56013Sjoerg/// 06 M68000 (i,An) p address register indirect with displacement 21*82d56013Sjoerg/// 10 M68000 (i,An,Xn.L) f address register indirect with index and scale = 1 22*82d56013Sjoerg/// 07 M68000 (i,An,Xn.W) F address register indirect with index and scale = 1 23*82d56013Sjoerg/// 12 M68020 (i,An,Xn.L,SCALE) g address register indirect with index 24*82d56013Sjoerg/// 11 M68020 (i,An,Xn.W,SCALE) G address register indirect with index 25*82d56013Sjoerg/// 14 M68020 ([bd,An],Xn.L,SCALE,od) u memory indirect postindexed mode 26*82d56013Sjoerg/// 13 M68020 ([bd,An],Xn.W,SCALE,od) U memory indirect postindexed mode 27*82d56013Sjoerg/// 16 M68020 ([bd,An,Xn.L,SCALE],od) v memory indirect preindexed mode 28*82d56013Sjoerg/// 15 M68020 ([bd,An,Xn.W,SCALE],od) V memory indirect preindexed mode 29*82d56013Sjoerg/// 20 M68000 abs.L b absolute long address 30*82d56013Sjoerg/// 17 M68000 abs.W B absolute short address 31*82d56013Sjoerg/// 21 M68000 (i,PC) q program counter with displacement 32*82d56013Sjoerg/// 23 M68000 (i,PC,Xn.L) k program counter with index and scale = 1 33*82d56013Sjoerg/// 22 M68000 (i,PC,Xn.W) K program counter with index and scale = 1 34*82d56013Sjoerg/// 25 M68020 (i,PC,Xn.L,SCALE) l program counter with index 35*82d56013Sjoerg/// 24 M68020 (i,PC,Xn.W,SCALE) L program counter with index 36*82d56013Sjoerg/// 27 M68020 ([bd,PC],Xn.L,SCALE,od) x program counter memory indirect postindexed mode 37*82d56013Sjoerg/// 26 M68020 ([bd,PC],Xn.W,SCALE,od) X program counter memory indirect postindexed mode 38*82d56013Sjoerg/// 31 M68020 ([bd,PC,Xn.L,SCALE],od) y program counter memory indirect preindexed mode 39*82d56013Sjoerg/// 30 M68020 ([bd,PC,Xn.W,SCALE],od) Y program counter memory indirect preindexed mode 40*82d56013Sjoerg/// 32 M68000 #immediate i immediate data 41*82d56013Sjoerg/// 42*82d56013Sjoerg/// NOTE that long form is always lowercase, word variants are capitalized 43*82d56013Sjoerg/// 44*82d56013Sjoerg/// Operand can be qualified with size where appropriate to force a particular 45*82d56013Sjoerg/// instruction encoding, e.g.: 46*82d56013Sjoerg/// (i8,An,Xn.W) f8 1 extension word 47*82d56013Sjoerg/// (i16,An,Xn.W) f16 2 extension words 48*82d56013Sjoerg/// (i32,An,Xn.W) f32 3 extension words 49*82d56013Sjoerg/// 50*82d56013Sjoerg/// Form without size qualifier will adapt to operand size automatically, e.g.: 51*82d56013Sjoerg/// (i,An,Xn.W) f 1, 2 or 3 extension words 52*82d56013Sjoerg/// 53*82d56013Sjoerg/// Some forms already imply a particular size of their operands, e.g.: 54*82d56013Sjoerg/// (i,An) p 1 extension word and i is 16bit 55*82d56013Sjoerg/// 56*82d56013Sjoerg/// Operand order follows x86 Intel order(destination before source), e.g.: 57*82d56013Sjoerg/// MOV8df MOVE (4,A0,D0), D1 58*82d56013Sjoerg/// 59*82d56013Sjoerg/// Number after instruction mnemonics determines the size of the data 60*82d56013Sjoerg/// 61*82d56013Sjoerg//===----------------------------------------------------------------------===// 62*82d56013Sjoerg 63*82d56013Sjoerg/// ??? Is it possible to use this stuff for disassembling? 64*82d56013Sjoerg/// NOTE 1: In case of conditional beads(DA, DAReg), cond part is able to 65*82d56013Sjoerg/// consume any bit, though a more general instructions must be chosen, e.g. 66*82d56013Sjoerg/// d -> r, a -> r 67*82d56013Sjoerg 68*82d56013Sjoerg//===----------------------------------------------------------------------===// 69*82d56013Sjoerg// Encoding primitives 70*82d56013Sjoerg//===----------------------------------------------------------------------===// 71*82d56013Sjoerg 72*82d56013Sjoergclass MxBead<bits<4> type, bit b4 = 0, bit b5 = 0, bit b6 = 0, bit b7 = 0> { 73*82d56013Sjoerg bits<8> Value = 0b00000000; 74*82d56013Sjoerg let Value{3-0} = type; 75*82d56013Sjoerg let Value{4} = b4; 76*82d56013Sjoerg let Value{5} = b5; 77*82d56013Sjoerg let Value{6} = b6; 78*82d56013Sjoerg let Value{7} = b7; 79*82d56013Sjoerg} 80*82d56013Sjoerg 81*82d56013Sjoerg/// System beads, allow to control beading flow 82*82d56013Sjoergdef MxBeadTerm : MxBead<0x0, 0, 0, 0, 0>; 83*82d56013Sjoergdef MxBeadIgnore : MxBead<0x0, 1, 0, 0, 0>; 84*82d56013Sjoerg 85*82d56013Sjoerg/// Add plain bit to the instruction 86*82d56013Sjoergclass MxBead1Bit <bits<1> b> : MxBead<0x1, b>; 87*82d56013Sjoergclass MxBead2Bits <bits<2> b> : MxBead<0x2, b{0}, b{1}>; 88*82d56013Sjoergclass MxBead3Bits <bits<3> b> : MxBead<0x3, b{0}, b{1}, b{2}>; 89*82d56013Sjoergclass MxBead4Bits <bits<4> b> : MxBead<0x4, b{0}, b{1}, b{2}, b{3}>; 90*82d56013Sjoerg 91*82d56013Sjoerg/// bits<3> o - operand number 92*82d56013Sjoerg/// bit a - use alternative, used to select index register or 93*82d56013Sjoerg/// outer displacement/immediate 94*82d56013Sjoerg/// suffix NP means non-padded 95*82d56013Sjoergclass MxBeadDAReg <bits<3> o, bit a = 0> : MxBead<0x5, o{0}, o{1}, o{2}, a>; 96*82d56013Sjoergclass MxBeadDA <bits<3> o, bit a = 0> : MxBead<0x6, o{0}, o{1}, o{2}, a>; 97*82d56013Sjoergclass MxBeadReg <bits<3> o, bit a = 0> : MxBead<0x7, o{0}, o{1}, o{2}, a>; 98*82d56013Sjoergclass MxBeadDReg <bits<3> o, bit a = 0> : MxBead<0x8, o{0}, o{1}, o{2}, a>; 99*82d56013Sjoergclass MxBead8Disp <bits<3> o, bit a = 0> : MxBead<0x9, o{0}, o{1}, o{2}, a>; 100*82d56013Sjoerg 101*82d56013Sjoerg/// Add Immediate to the instruction. 8-bit version is padded with zeros to fit 102*82d56013Sjoerg/// the word. 103*82d56013Sjoergclass MxBead8Imm <bits<3> o, bit a = 0> : MxBead<0xA, o{0}, o{1}, o{2}, a>; 104*82d56013Sjoergclass MxBead16Imm <bits<3> o, bit a = 0> : MxBead<0xB, o{0}, o{1}, o{2}, a>; 105*82d56013Sjoergclass MxBead32Imm <bits<3> o, bit a = 0> : MxBead<0xC, o{0}, o{1}, o{2}, a>; 106*82d56013Sjoerg 107*82d56013Sjoerg/// Encodes an immediate 0-7(alt. 1-8) into 3 bit field 108*82d56013Sjoergclass MxBead3Imm <bits<3> o, bit a = 0> : MxBead<0xD, o{0}, o{1}, o{2}, a>; 109*82d56013Sjoerg 110*82d56013Sjoerg 111*82d56013Sjoergclass MxEncoding<MxBead n0 = MxBeadTerm, MxBead n1 = MxBeadTerm, 112*82d56013Sjoerg MxBead n2 = MxBeadTerm, MxBead n3 = MxBeadTerm, 113*82d56013Sjoerg MxBead n4 = MxBeadTerm, MxBead n5 = MxBeadTerm, 114*82d56013Sjoerg MxBead n6 = MxBeadTerm, MxBead n7 = MxBeadTerm, 115*82d56013Sjoerg MxBead n8 = MxBeadTerm, MxBead n9 = MxBeadTerm, 116*82d56013Sjoerg MxBead n10 = MxBeadTerm, MxBead n11 = MxBeadTerm, 117*82d56013Sjoerg MxBead n12 = MxBeadTerm, MxBead n13 = MxBeadTerm, 118*82d56013Sjoerg MxBead n14 = MxBeadTerm, MxBead n15 = MxBeadTerm, 119*82d56013Sjoerg MxBead n16 = MxBeadTerm, MxBead n17 = MxBeadTerm, 120*82d56013Sjoerg MxBead n18 = MxBeadTerm, MxBead n19 = MxBeadTerm, 121*82d56013Sjoerg MxBead n20 = MxBeadTerm, MxBead n21 = MxBeadTerm, 122*82d56013Sjoerg MxBead n22 = MxBeadTerm, MxBead n23 = MxBeadTerm> { 123*82d56013Sjoerg bits <192> Value; 124*82d56013Sjoerg let Value{7-0} = n0.Value; 125*82d56013Sjoerg let Value{15-8} = n1.Value; 126*82d56013Sjoerg let Value{23-16} = n2.Value; 127*82d56013Sjoerg let Value{31-24} = n3.Value; 128*82d56013Sjoerg let Value{39-32} = n4.Value; 129*82d56013Sjoerg let Value{47-40} = n5.Value; 130*82d56013Sjoerg let Value{55-48} = n6.Value; 131*82d56013Sjoerg let Value{63-56} = n7.Value; 132*82d56013Sjoerg let Value{71-64} = n8.Value; 133*82d56013Sjoerg let Value{79-72} = n9.Value; 134*82d56013Sjoerg let Value{87-80} = n10.Value; 135*82d56013Sjoerg let Value{95-88} = n11.Value; 136*82d56013Sjoerg let Value{103-96} = n12.Value; 137*82d56013Sjoerg let Value{111-104} = n13.Value; 138*82d56013Sjoerg let Value{119-112} = n14.Value; 139*82d56013Sjoerg let Value{127-120} = n15.Value; 140*82d56013Sjoerg let Value{135-128} = n16.Value; 141*82d56013Sjoerg let Value{143-136} = n17.Value; 142*82d56013Sjoerg let Value{151-144} = n18.Value; 143*82d56013Sjoerg let Value{159-152} = n19.Value; 144*82d56013Sjoerg let Value{167-160} = n20.Value; 145*82d56013Sjoerg let Value{175-168} = n21.Value; 146*82d56013Sjoerg let Value{183-176} = n22.Value; 147*82d56013Sjoerg let Value{191-184} = n23.Value; 148*82d56013Sjoerg} 149*82d56013Sjoerg 150*82d56013Sjoergclass MxEncFixed<bits<16> value> : MxEncoding { 151*82d56013Sjoerg let Value{7-0} = MxBead4Bits<value{3-0}>.Value; 152*82d56013Sjoerg let Value{15-8} = MxBead4Bits<value{7-4}>.Value; 153*82d56013Sjoerg let Value{23-16} = MxBead4Bits<value{11-8}>.Value; 154*82d56013Sjoerg let Value{31-24} = MxBead4Bits<value{15-12}>.Value; 155*82d56013Sjoerg} 156*82d56013Sjoerg 157*82d56013Sjoerg//===----------------------------------------------------------------------===// 158*82d56013Sjoerg// Encoding composites 159*82d56013Sjoerg// 160*82d56013Sjoerg// These must be lowered to MxEncoding by instr specific wrappers 161*82d56013Sjoerg// 162*82d56013Sjoerg// HERE BE DRAGONS... 163*82d56013Sjoerg//===----------------------------------------------------------------------===// 164*82d56013Sjoerg 165*82d56013Sjoergclass MxEncByte<bits<8> value> : MxEncoding { 166*82d56013Sjoerg MxBead4Bits LO = MxBead4Bits<value{3-0}>; 167*82d56013Sjoerg MxBead4Bits HI = MxBead4Bits<value{7-4}>; 168*82d56013Sjoerg} 169*82d56013Sjoerg 170*82d56013Sjoergdef MxEncEmpty : MxEncoding; 171*82d56013Sjoerg 172*82d56013Sjoerg 173*82d56013Sjoerg/// M68k Standard Effective Address layout: 174*82d56013Sjoerg/// 175*82d56013Sjoerg/// :-------------------: 176*82d56013Sjoerg/// | 5 4 3 | 2 1 0 | 177*82d56013Sjoerg/// | mode | reg | 178*82d56013Sjoerg/// :-------------------: 179*82d56013Sjoerg/// 180*82d56013Sjoerg/// If the EA is a direct register mode, bits 4 and 5 are 0, and the register 181*82d56013Sjoerg/// number will be encoded in bit 0 - 3. Since the first address register's 182*82d56013Sjoerg/// (A0) register number is 8, we can easily tell data registers from 183*82d56013Sjoerg/// address registers by only inspecting bit 3 (i.e. if bit 3 is set, it's an 184*82d56013Sjoerg/// address register). 185*82d56013Sjoerg/// 186*82d56013Sjoerg/// 187*82d56013Sjoerg/// But MOVE instruction uses reversed layout for destination EA: 188*82d56013Sjoerg/// 189*82d56013Sjoerg/// :-------------------: 190*82d56013Sjoerg/// | 5 4 3 | 2 1 0 | 191*82d56013Sjoerg/// | reg | mode | 192*82d56013Sjoerg/// :-------------------: 193*82d56013Sjoerg/// 194*82d56013Sjoerg/// And this complicates things a bit because the DA bit is now separated from 195*82d56013Sjoerg/// the register and we have to encode those separately using MxBeadDA<opN> 196*82d56013Sjoerg/// 197*82d56013Sjoergclass MxEncEA<MxBead reg, MxBead mode, MxBead da = MxBeadIgnore> { 198*82d56013Sjoerg MxBead Reg = reg; 199*82d56013Sjoerg MxBead Mode = mode; 200*82d56013Sjoerg MxBead DA = da; 201*82d56013Sjoerg} 202*82d56013Sjoerg 203*82d56013Sjoerg// FIXME: Is there a way to factorize the addressing mode suffix (i.e. 204*82d56013Sjoerg// 'r', 'd', 'a' etc.) and use something like multiclass to replace? 205*82d56013Sjoergdef MxEncEAr_0: MxEncEA<MxBeadDAReg<0>, MxBead2Bits<0b00>>; 206*82d56013Sjoergdef MxEncEAd_0: MxEncEA<MxBeadDReg<0>, MxBead2Bits<0b00>, MxBead1Bit<0>>; 207*82d56013Sjoergdef MxEncEAa_0: MxEncEA<MxBeadReg<0>, MxBead2Bits<0b00>, MxBead1Bit<1>>; 208*82d56013Sjoergdef MxEncEAj_0: MxEncEA<MxBeadReg<0>, MxBead2Bits<0b01>, MxBead1Bit<0>>; 209*82d56013Sjoergdef MxEncEAo_0: MxEncEA<MxBeadReg<0>, MxBead2Bits<0b01>, MxBead1Bit<1>>; 210*82d56013Sjoergdef MxEncEAe_0: MxEncEA<MxBeadReg<0>, MxBead2Bits<0b10>, MxBead1Bit<0>>; 211*82d56013Sjoergdef MxEncEAp_0: MxEncEA<MxBeadReg<0>, MxBead2Bits<0b10>, MxBead1Bit<1>>; 212*82d56013Sjoergdef MxEncEAf_0: MxEncEA<MxBeadReg<0>, MxBead2Bits<0b11>, MxBead1Bit<0>>; 213*82d56013Sjoerg 214*82d56013Sjoergdef MxEncEAa_0_reflected : MxEncEA<MxBeadReg<0>, MxBead3Bits<0b001>>; 215*82d56013Sjoergdef MxEncEAr_0_reflected : MxEncEA<MxBeadReg<0>, MxBead2Bits<0b00>, MxBeadDA<0>>; 216*82d56013Sjoerg 217*82d56013Sjoergdef MxEncEAr_1: MxEncEA<MxBeadDAReg<1>, MxBead2Bits<0b00>>; 218*82d56013Sjoergdef MxEncEAd_1: MxEncEA<MxBeadDReg<1>, MxBead2Bits<0b00>, MxBead1Bit<0>>; 219*82d56013Sjoergdef MxEncEAa_1: MxEncEA<MxBeadReg<1>, MxBead2Bits<0b00>, MxBead1Bit<1>>; 220*82d56013Sjoergdef MxEncEAj_1: MxEncEA<MxBeadReg<1>, MxBead2Bits<0b01>, MxBead1Bit<0>>; 221*82d56013Sjoergdef MxEncEAo_1: MxEncEA<MxBeadReg<1>, MxBead2Bits<0b01>, MxBead1Bit<1>>; 222*82d56013Sjoergdef MxEncEAe_1: MxEncEA<MxBeadReg<1>, MxBead2Bits<0b10>, MxBead1Bit<0>>; 223*82d56013Sjoergdef MxEncEAp_1: MxEncEA<MxBeadReg<1>, MxBead2Bits<0b10>, MxBead1Bit<1>>; 224*82d56013Sjoergdef MxEncEAf_1: MxEncEA<MxBeadReg<1>, MxBead2Bits<0b11>, MxBead1Bit<0>>; 225*82d56013Sjoerg 226*82d56013Sjoergdef MxEncEAr_2: MxEncEA<MxBeadDAReg<2>, MxBead2Bits<0b00>>; 227*82d56013Sjoergdef MxEncEAd_2: MxEncEA<MxBeadDReg<2>, MxBead2Bits<0b00>, MxBead1Bit<0>>; 228*82d56013Sjoergdef MxEncEAa_2: MxEncEA<MxBeadReg<2>, MxBead2Bits<0b00>, MxBead1Bit<1>>; 229*82d56013Sjoergdef MxEncEAj_2: MxEncEA<MxBeadReg<2>, MxBead2Bits<0b01>, MxBead1Bit<0>>; 230*82d56013Sjoergdef MxEncEAo_2: MxEncEA<MxBeadReg<2>, MxBead2Bits<0b01>, MxBead1Bit<1>>; 231*82d56013Sjoergdef MxEncEAe_2: MxEncEA<MxBeadReg<2>, MxBead2Bits<0b10>, MxBead1Bit<0>>; 232*82d56013Sjoergdef MxEncEAp_2: MxEncEA<MxBeadReg<2>, MxBead2Bits<0b10>, MxBead1Bit<1>>; 233*82d56013Sjoergdef MxEncEAf_2: MxEncEA<MxBeadReg<2>, MxBead2Bits<0b11>, MxBead1Bit<0>>; 234*82d56013Sjoerg 235*82d56013Sjoergdef MxEncEAb : MxEncEA<MxBead3Bits<0b001>, MxBead2Bits<0b11>, MxBead1Bit<1>>; 236*82d56013Sjoergdef MxEncEAq : MxEncEA<MxBead3Bits<0b010>, MxBead2Bits<0b11>, MxBead1Bit<1>>; 237*82d56013Sjoergdef MxEncEAk : MxEncEA<MxBead3Bits<0b011>, MxBead2Bits<0b11>, MxBead1Bit<1>>; 238*82d56013Sjoergdef MxEncEAi : MxEncEA<MxBead3Bits<0b100>, MxBead2Bits<0b11>, MxBead1Bit<1>>; 239*82d56013Sjoerg 240*82d56013Sjoerg// Allows you to specify each bit of opcode 241*82d56013Sjoergclass MxEncOpMode<MxBead b0, MxBead b1 = MxBeadIgnore, MxBead b2 = MxBeadIgnore> { 242*82d56013Sjoerg MxBead B0 = b0; 243*82d56013Sjoerg MxBead B1 = b1; 244*82d56013Sjoerg MxBead B2 = b2; 245*82d56013Sjoerg} 246*82d56013Sjoerg 247*82d56013Sjoerg// op EA, Dn 248*82d56013Sjoergdef MxOpMode8dEA : MxEncOpMode<MxBead3Bits<0b000>>; 249*82d56013Sjoergdef MxOpMode16dEA : MxEncOpMode<MxBead3Bits<0b001>>; 250*82d56013Sjoergdef MxOpMode32dEA : MxEncOpMode<MxBead3Bits<0b010>>; 251*82d56013Sjoerg 252*82d56013Sjoerg// op EA, An 253*82d56013Sjoergdef MxOpMode16aEA : MxEncOpMode<MxBead3Bits<0b110>>; 254*82d56013Sjoergdef MxOpMode32aEA : MxEncOpMode<MxBead3Bits<0b111>>; 255*82d56013Sjoerg 256*82d56013Sjoerg// op EA, Rn 257*82d56013Sjoerg// As you might noticed this guy is special... Since M68k differentiates 258*82d56013Sjoerg// between Data and Address registers we required to use different OPMODE codes 259*82d56013Sjoerg// for Address registers DST operands. One way of dealing with it is to use 260*82d56013Sjoerg// separate tablegen instructions, but in this case it would force Register 261*82d56013Sjoerg// Allocator to use specific Register Classes and eventually will lead to 262*82d56013Sjoerg// superfluous moves. Another approach is to use reg-variadic encoding which will 263*82d56013Sjoerg// change OPMODE base on Register Class used. Luckily, all the bits that differ go 264*82d56013Sjoerg// from 0 to 1 and can be encoded with MxBeadDA. 265*82d56013Sjoerg// Basically, if the register used is of Data type these encodings will be 266*82d56013Sjoerg// the same as MxOpMode{16,32}dEA above and used with regular instructions(e.g. ADD, 267*82d56013Sjoerg// SUB), but if the register is of Address type the appropriate bits will flip and 268*82d56013Sjoerg// the instructions become of *A type(e.g ADDA, SUBA). 269*82d56013Sjoergdef MxOpMode16rEA : MxEncOpMode<MxBead1Bit<1>, MxBeadDA<0>, MxBead1Bit<0>>; 270*82d56013Sjoergdef MxOpMode32rEA : MxEncOpMode<MxBeadDA<0>, MxBead1Bit<1>, MxBeadDA<0>>; 271*82d56013Sjoerg 272*82d56013Sjoerg// op Dn, EA 273*82d56013Sjoergdef MxOpMode8EAd : MxEncOpMode<MxBead3Bits<0b100>>; 274*82d56013Sjoergdef MxOpMode16EAd : MxEncOpMode<MxBead3Bits<0b101>>; 275*82d56013Sjoergdef MxOpMode32EAd : MxEncOpMode<MxBead3Bits<0b110>>; 276*82d56013Sjoerg 277*82d56013Sjoerg 278*82d56013Sjoerg// Represents two types of extension word: 279*82d56013Sjoerg// - Imm extension word 280*82d56013Sjoerg// - Brief extension word 281*82d56013Sjoergclass MxEncExt<MxBead imm = MxBeadIgnore, MxBead b8 = MxBeadIgnore, 282*82d56013Sjoerg MxBead scale = MxBeadIgnore, MxBead wl = MxBeadIgnore, 283*82d56013Sjoerg MxBead daReg = MxBeadIgnore> { 284*82d56013Sjoerg MxBead Imm = imm; 285*82d56013Sjoerg MxBead B8 = b8; 286*82d56013Sjoerg MxBead Scale = scale; 287*82d56013Sjoerg MxBead WL = wl; 288*82d56013Sjoerg MxBead DAReg = daReg; 289*82d56013Sjoerg} 290*82d56013Sjoerg 291*82d56013Sjoergdef MxExtEmpty : MxEncExt; 292*82d56013Sjoerg 293*82d56013Sjoerg// These handle encoding of displacement fields, absolute addresses and 294*82d56013Sjoerg// immediate values, since encoding for these categories is mainly the same, 295*82d56013Sjoerg// with exception of some weird immediates. 296*82d56013Sjoergdef MxExtI8_0 : MxEncExt<MxBead8Imm<0>>; 297*82d56013Sjoergdef MxExtI16_0 : MxEncExt<MxBead16Imm<0>>; 298*82d56013Sjoergdef MxExtI32_0 : MxEncExt<MxBead32Imm<0>>; 299*82d56013Sjoerg 300*82d56013Sjoergdef MxExtI8_1 : MxEncExt<MxBead8Imm<1>>; 301*82d56013Sjoergdef MxExtI16_1 : MxEncExt<MxBead16Imm<1>>; 302*82d56013Sjoergdef MxExtI32_1 : MxEncExt<MxBead32Imm<1>>; 303*82d56013Sjoerg 304*82d56013Sjoergdef MxExtI8_2 : MxEncExt<MxBead8Imm<2>>; 305*82d56013Sjoergdef MxExtI16_2 : MxEncExt<MxBead16Imm<2>>; 306*82d56013Sjoergdef MxExtI32_2 : MxEncExt<MxBead32Imm<2>>; 307*82d56013Sjoerg 308*82d56013Sjoerg// NOTE They are all using Long Xn 309*82d56013Sjoergdef MxExtBrief_0 : MxEncExt<MxBead8Disp<0>, MxBead1Bit<0b0>, 310*82d56013Sjoerg MxBead2Bits<0b00>, MxBead1Bit<1>, 311*82d56013Sjoerg MxBeadDAReg<0, 1>>; 312*82d56013Sjoerg 313*82d56013Sjoergdef MxExtBrief_1 : MxEncExt<MxBead8Disp<1>, MxBead1Bit<0b0>, 314*82d56013Sjoerg MxBead2Bits<0b00>, MxBead1Bit<1>, 315*82d56013Sjoerg MxBeadDAReg<1, 1>>; 316*82d56013Sjoerg 317*82d56013Sjoergdef MxExtBrief_2 : MxEncExt<MxBead8Disp<2>, MxBead1Bit<0b0>, 318*82d56013Sjoerg MxBead2Bits<0b00>, MxBead1Bit<1>, 319*82d56013Sjoerg MxBeadDAReg<2, 1>>; 320*82d56013Sjoerg 321*82d56013Sjoergdef MxExtBrief_3 : MxEncExt<MxBead8Disp<3>, MxBead1Bit<0b0>, 322*82d56013Sjoerg MxBead2Bits<0b00>, MxBead1Bit<1>, 323*82d56013Sjoerg MxBeadDAReg<3, 1>>; 324*82d56013Sjoerg 325*82d56013Sjoergdef MxExtBrief_4 : MxEncExt<MxBead8Disp<4>, MxBead1Bit<0b0>, 326*82d56013Sjoerg MxBead2Bits<0b00>, MxBead1Bit<1>, 327*82d56013Sjoerg MxBeadDAReg<4, 1>>; 328*82d56013Sjoerg 329*82d56013Sjoergclass MxEncSize<bits<2> value> : MxBead2Bits<value>; 330*82d56013Sjoergdef MxEncSize8 : MxEncSize<0b00>; 331*82d56013Sjoergdef MxEncSize16 : MxEncSize<0b01>; 332*82d56013Sjoergdef MxEncSize32 : MxEncSize<0b10>; 333*82d56013Sjoergdef MxEncSize64 : MxEncSize<0b11>; 334*82d56013Sjoerg 335*82d56013Sjoerg// M68k INSTRUCTION. Most instructions specify the location of an operand by 336*82d56013Sjoerg// using the effective address field in the operation word. The effective address 337*82d56013Sjoerg// is composed of two 3-bit fields: the mode field and the register field. The 338*82d56013Sjoerg// value in the mode field selects the different address modes. The register 339*82d56013Sjoerg// field contains the number of a register. The effective address field may 340*82d56013Sjoerg// require additional information to fully specify the operand. This additional 341*82d56013Sjoerg// information, called the effective address extension, is contained in the 342*82d56013Sjoerg// following word or words and is considered part of the instruction. The 343*82d56013Sjoerg// effective address modes are grouped into three categories: register direct, 344*82d56013Sjoerg// memory addressing, and special. 345*82d56013Sjoergclass MxInst<dag outs, dag ins, 346*82d56013Sjoerg string asmStr = "", 347*82d56013Sjoerg list<dag> pattern = [], 348*82d56013Sjoerg MxEncoding beads = MxEncEmpty, 349*82d56013Sjoerg InstrItinClass itin = NoItinerary> 350*82d56013Sjoerg : Instruction { 351*82d56013Sjoerg let Namespace = "M68k"; 352*82d56013Sjoerg let OutOperandList = outs; 353*82d56013Sjoerg let InOperandList = ins; 354*82d56013Sjoerg let AsmString = asmStr; 355*82d56013Sjoerg let Pattern = pattern; 356*82d56013Sjoerg let Itinerary = itin; 357*82d56013Sjoerg 358*82d56013Sjoerg // Byte stream 359*82d56013Sjoerg field bits<192> Beads = beads.Value; 360*82d56013Sjoerg 361*82d56013Sjoerg // Number of bytes 362*82d56013Sjoerg let Size = 0; 363*82d56013Sjoerg 364*82d56013Sjoerg let UseLogicalOperandMappings = 1; 365*82d56013Sjoerg} 366*82d56013Sjoerg 367*82d56013Sjoerg// M68k PSEUDO INSTRUCTION 368*82d56013Sjoergclass MxPseudo<dag outs, dag ins, list<dag> pattern = []> 369*82d56013Sjoerg : MxInst<outs, ins, "; error: this should not be emitted", pattern> { 370*82d56013Sjoerg let isPseudo = 1; 371*82d56013Sjoerg} 372