xref: /netbsd-src/external/apache2/llvm/dist/llvm/lib/Target/M68k/M68kInstrFormats.td (revision 82d56013d7b633d116a93943de88e08335357a7c)
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