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