1234353Sdim//===-- MSP430InstrFormats.td - MSP430 Instruction Formats -*- tablegen -*-===//
2193323Sed//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6193323Sed//
7193323Sed//===----------------------------------------------------------------------===//
8193323Sed
9193323Sed//===----------------------------------------------------------------------===//
10193323Sed//  Describe MSP430 instructions format here
11193323Sed//
12193323Sed
13202878Srdivackyclass SourceMode<bits<2> val> {
14202878Srdivacky  bits<2> Value = val;
15202878Srdivacky}
16202878Srdivacky
17344779Sdimdef SrcReg      : SourceMode<0>; // r
18344779Sdimdef SrcMem      : SourceMode<1>; // m
19344779Sdimdef SrcIndReg   : SourceMode<2>; // n
20344779Sdimdef SrcPostInc  : SourceMode<3>; // p
21344779Sdimdef SrcImm      : SourceMode<3>; // i
22344779Sdim//  SrcCGImm    : SourceMode< >; // c
23202878Srdivacky
24202878Srdivackyclass DestMode<bit val> {
25202878Srdivacky  bit Value = val;
26202878Srdivacky}
27202878Srdivacky
28344779Sdimdef DstReg      : DestMode<0>;   // r
29344779Sdimdef DstMem      : DestMode<1>;   // m
30202878Srdivacky
31193323Sed// Generic MSP430 Format
32344779Sdimclass MSP430Inst<dag outs, dag ins, int size, string asmstr> : Instruction {
33344779Sdim  field bits<48> Inst;
34344779Sdim  field bits<48> SoftFail = 0;
35193323Sed
36193323Sed  let Namespace = "MSP430";
37193323Sed
38193323Sed  dag OutOperandList = outs;
39193323Sed  dag InOperandList  = ins;
40193323Sed
41344779Sdim  let AsmString = asmstr;
42344779Sdim  let Size = size;
43193323Sed}
44193323Sed
45193323Sed// MSP430 Double Operand (Format I) Instructions
46344779Sdimclass IForm<bits<4> opcode, DestMode ad, bit bw, SourceMode as, int size,
47193323Sed            dag outs, dag ins, string asmstr, list<dag> pattern>
48344779Sdim  : MSP430Inst<outs, ins, size, asmstr> {
49193323Sed  let Pattern = pattern;
50202878Srdivacky
51344779Sdim  bits<4> rs;
52344779Sdim  bits<4> rd;
53344779Sdim
54344779Sdim  let Inst{15-12} = opcode;
55344779Sdim  let Inst{11-8}  = rs;
56202878Srdivacky  let Inst{7}     = ad.Value;
57193323Sed  let Inst{6}     = bw;
58344779Sdim  let Inst{5-4}   = as.Value;
59344779Sdim  let Inst{3-0}   = rd;
60193323Sed}
61193323Sed
62202878Srdivacky// 8 bit IForm instructions
63344779Sdimclass IForm8<bits<4> opcode, DestMode dest, SourceMode src, int size,
64202878Srdivacky             dag outs, dag ins, string asmstr, list<dag> pattern>
65344779Sdim  : IForm<opcode, dest, 1, src, size, outs, ins, asmstr, pattern>;
66202878Srdivacky
67202878Srdivackyclass I8rr<bits<4> opcode,
68202878Srdivacky           dag outs, dag ins, string asmstr, list<dag> pattern>
69344779Sdim  : IForm8<opcode, DstReg, SrcReg, 2, outs, ins, asmstr, pattern> {
70344779Sdim  let DecoderNamespace = "Alpha";
71344779Sdim}
72202878Srdivacky
73202878Srdivackyclass I8ri<bits<4> opcode,
74202878Srdivacky           dag outs, dag ins, string asmstr, list<dag> pattern>
75344779Sdim  : IForm8<opcode, DstReg, SrcImm, 4, outs, ins, asmstr, pattern> {
76344779Sdim  let DecoderNamespace = "Gamma";
77344779Sdim  bits<16> imm;
78344779Sdim  let Inst{31-16} = imm;
79344779Sdim  let rs = 0b0000;
80344779Sdim}
81202878Srdivacky
82344779Sdimclass I8rc<bits<4> opcode,
83344779Sdim           dag outs, dag ins, string asmstr, list<dag> pattern>
84344779Sdim  : MSP430Inst<outs, ins, 2, asmstr> {
85344779Sdim  let DecoderNamespace = "Beta";
86344779Sdim  let Pattern = pattern;
87344779Sdim
88344779Sdim  bits<6> imm;
89344779Sdim  bits<4> rd;
90344779Sdim
91344779Sdim  let Inst{15-12} = opcode;
92344779Sdim  let Inst{11-8}  = imm{3-0};
93344779Sdim  let Inst{7}     = DstReg.Value;
94344779Sdim  let Inst{6}     = 1;
95344779Sdim  let Inst{5-4}   = imm{5-4};
96344779Sdim  let Inst{3-0}   = rd;
97344779Sdim}
98344779Sdim
99202878Srdivackyclass I8rm<bits<4> opcode,
100202878Srdivacky           dag outs, dag ins, string asmstr, list<dag> pattern>
101344779Sdim  : IForm8<opcode, DstReg, SrcMem, 4, outs, ins, asmstr, pattern> {
102344779Sdim  let DecoderNamespace = "Gamma";
103344779Sdim  bits<20> src;
104344779Sdim  let rs = src{3-0};
105344779Sdim  let Inst{31-16} = src{19-4};
106344779Sdim}
107202878Srdivacky
108344779Sdimclass I8rn<bits<4> opcode,
109344779Sdim           dag outs, dag ins, string asmstr, list<dag> pattern>
110344779Sdim  : IForm8<opcode, DstReg, SrcIndReg, 2, outs, ins, asmstr, pattern> {
111344779Sdim  let DecoderNamespace = "Delta";
112344779Sdim}
113344779Sdim
114344779Sdimclass I8rp<bits<4> opcode,
115344779Sdim           dag outs, dag ins, string asmstr, list<dag> pattern>
116344779Sdim  : IForm8<opcode, DstReg, SrcPostInc, 2, outs, ins, asmstr, pattern> {
117344779Sdim  let DecoderNamespace = "Delta";
118344779Sdim}
119344779Sdim
120202878Srdivackyclass I8mr<bits<4> opcode,
121202878Srdivacky           dag outs, dag ins, string asmstr, list<dag> pattern>
122344779Sdim  : IForm8<opcode, DstMem, SrcReg, 4, outs, ins, asmstr, pattern> {
123344779Sdim  let DecoderNamespace = "Alpha";
124344779Sdim  bits<20> dst;
125344779Sdim  let rd = dst{3-0};
126344779Sdim  let Inst{31-16} = dst{19-4};
127344779Sdim}
128202878Srdivacky
129202878Srdivackyclass I8mi<bits<4> opcode,
130202878Srdivacky           dag outs, dag ins, string asmstr, list<dag> pattern>
131344779Sdim  : IForm8<opcode, DstMem, SrcImm, 6, outs, ins, asmstr, pattern> {
132344779Sdim  let DecoderNamespace = "Gamma";
133344779Sdim  bits<16> imm;
134344779Sdim  bits<20> dst;
135344779Sdim  let rs = 0b0000;
136344779Sdim  let Inst{31-16} = imm;
137344779Sdim  let rd = dst{3-0};
138344779Sdim  let Inst{47-32} = dst{19-4};
139344779Sdim}
140202878Srdivacky
141344779Sdimclass I8mc<bits<4> opcode,
142344779Sdim           dag outs, dag ins, string asmstr, list<dag> pattern>
143344779Sdim  : MSP430Inst<outs, ins, 4, asmstr> {
144344779Sdim  let DecoderNamespace = "Beta";
145344779Sdim  let Pattern = pattern;
146344779Sdim
147344779Sdim  bits<6> imm;
148344779Sdim  bits<20> dst;
149344779Sdim
150344779Sdim  let Inst{31-16} = dst{19-4};
151344779Sdim  let Inst{15-12} = opcode;
152344779Sdim  let Inst{11-8}  = imm{3-0};
153344779Sdim  let Inst{7}     = DstMem.Value;
154344779Sdim  let Inst{6}     = 1;
155344779Sdim  let Inst{5-4}   = imm{5-4};
156344779Sdim  let Inst{3-0}   = dst{3-0};
157344779Sdim}
158344779Sdim
159202878Srdivackyclass I8mm<bits<4> opcode,
160202878Srdivacky           dag outs, dag ins, string asmstr, list<dag> pattern>
161344779Sdim  : IForm8<opcode, DstMem, SrcMem, 6, outs, ins, asmstr, pattern> {
162344779Sdim  let DecoderNamespace = "Gamma";
163344779Sdim  bits<20> src;
164344779Sdim  bits<20> dst;
165344779Sdim  let rs = src{3-0};
166344779Sdim  let Inst{31-16} = src{19-4};
167344779Sdim  let rd = dst{3-0};
168344779Sdim  let Inst{47-32} = dst{19-4};
169344779Sdim}
170202878Srdivacky
171344779Sdimclass I8mn<bits<4> opcode,
172344779Sdim           dag outs, dag ins, string asmstr, list<dag> pattern>
173344779Sdim  : IForm8<opcode, DstMem, SrcIndReg, 4, outs, ins, asmstr, pattern> {
174344779Sdim  let DecoderNamespace = "Delta";
175344779Sdim  bits<20> dst;
176344779Sdim  let rd = dst{3-0};
177344779Sdim  let Inst{31-16} = dst{19-4};
178344779Sdim}
179344779Sdim
180344779Sdimclass I8mp<bits<4> opcode,
181344779Sdim           dag outs, dag ins, string asmstr, list<dag> pattern>
182344779Sdim  : IForm8<opcode, DstMem, SrcPostInc, 4, outs, ins, asmstr, pattern> {
183344779Sdim  let DecoderNamespace = "Delta";
184344779Sdim  bits<20> dst;
185344779Sdim  let rd = dst{3-0};
186344779Sdim  let Inst{31-16} = dst{19-4};
187344779Sdim}
188344779Sdim
189202878Srdivacky// 16 bit IForm instructions
190344779Sdimclass IForm16<bits<4> opcode, DestMode dest, SourceMode src, int size,
191202878Srdivacky              dag outs, dag ins, string asmstr, list<dag> pattern>
192344779Sdim  : IForm<opcode, dest, 0, src, size, outs, ins, asmstr, pattern>;
193202878Srdivacky
194202878Srdivackyclass I16rr<bits<4> opcode,
195202878Srdivacky            dag outs, dag ins, string asmstr, list<dag> pattern>
196344779Sdim  : IForm16<opcode, DstReg, SrcReg, 2, outs, ins, asmstr, pattern> {
197344779Sdim  let DecoderNamespace = "Alpha";
198344779Sdim}
199202878Srdivacky
200202878Srdivackyclass I16ri<bits<4> opcode,
201202878Srdivacky            dag outs, dag ins, string asmstr, list<dag> pattern>
202344779Sdim  : IForm16<opcode, DstReg, SrcImm, 4, outs, ins, asmstr, pattern> {
203344779Sdim  let DecoderNamespace = "Gamma";
204344779Sdim  bits<16> imm;
205344779Sdim  let Inst{31-16} = imm;
206344779Sdim  let rs = 0b0000;
207344779Sdim}
208202878Srdivacky
209344779Sdimclass I16rc<bits<4> opcode,
210344779Sdim            dag outs, dag ins, string asmstr, list<dag> pattern>
211344779Sdim  : MSP430Inst<outs, ins, 2, asmstr> {
212344779Sdim  let DecoderNamespace = "Beta";
213344779Sdim  let Pattern = pattern;
214344779Sdim
215344779Sdim  bits<6> imm;
216344779Sdim  bits<4> rd;
217344779Sdim
218344779Sdim  let Inst{15-12} = opcode;
219344779Sdim  let Inst{11-8}  = imm{3-0};
220344779Sdim  let Inst{7}     = DstReg.Value;
221344779Sdim  let Inst{6}     = 0;
222344779Sdim  let Inst{5-4}   = imm{5-4};
223344779Sdim  let Inst{3-0}   = rd;
224344779Sdim}
225344779Sdim
226202878Srdivackyclass I16rm<bits<4> opcode,
227202878Srdivacky            dag outs, dag ins, string asmstr, list<dag> pattern>
228344779Sdim  : IForm16<opcode, DstReg, SrcMem, 4, outs, ins, asmstr, pattern> {
229344779Sdim  let DecoderNamespace = "Gamma";
230344779Sdim  bits<20> src;
231344779Sdim  let rs = src{3-0};
232344779Sdim  let Inst{31-16} = src{19-4};
233344779Sdim}
234202878Srdivacky
235344779Sdimclass I16rn<bits<4> opcode,
236344779Sdim            dag outs, dag ins, string asmstr, list<dag> pattern>
237344779Sdim  : IForm16<opcode, DstReg, SrcIndReg, 2, outs, ins, asmstr, pattern> {
238344779Sdim  let DecoderNamespace = "Delta";
239344779Sdim}
240344779Sdim
241344779Sdimclass I16rp<bits<4> opcode,
242344779Sdim            dag outs, dag ins, string asmstr, list<dag> pattern>
243344779Sdim  : IForm16<opcode, DstReg, SrcPostInc, 2, outs, ins, asmstr, pattern> {
244344779Sdim  let DecoderNamespace = "Delta";
245344779Sdim}
246344779Sdim
247202878Srdivackyclass I16mr<bits<4> opcode,
248202878Srdivacky            dag outs, dag ins, string asmstr, list<dag> pattern>
249344779Sdim  : IForm16<opcode, DstMem, SrcReg, 4, outs, ins, asmstr, pattern> {
250344779Sdim  let DecoderNamespace = "Alpha";
251344779Sdim  bits<20> dst;
252344779Sdim  let rd = dst{3-0};
253344779Sdim  let Inst{31-16} = dst{19-4};
254344779Sdim}
255202878Srdivacky
256202878Srdivackyclass I16mi<bits<4> opcode,
257202878Srdivacky            dag outs, dag ins, string asmstr, list<dag> pattern>
258344779Sdim  : IForm16<opcode, DstMem, SrcImm, 6, outs, ins, asmstr, pattern> {
259344779Sdim  let DecoderNamespace = "Gamma";
260344779Sdim  bits<16> imm;
261344779Sdim  bits<20> dst;
262344779Sdim  let Inst{31-16} = imm;
263344779Sdim  let rs = 0b0000;
264344779Sdim  let rd = dst{3-0};
265344779Sdim  let Inst{47-32} = dst{19-4};
266344779Sdim}
267202878Srdivacky
268344779Sdimclass I16mc<bits<4> opcode,
269344779Sdim            dag outs, dag ins, string asmstr, list<dag> pattern>
270344779Sdim  : MSP430Inst<outs, ins, 4, asmstr> {
271344779Sdim  let DecoderNamespace = "Beta";
272344779Sdim  let Pattern = pattern;
273344779Sdim
274344779Sdim  bits<6> imm;
275344779Sdim  bits<20> dst;
276344779Sdim
277344779Sdim  let Inst{31-16} = dst{19-4};
278344779Sdim  let Inst{15-12} = opcode;
279344779Sdim  let Inst{11-8}  = imm{3-0};
280344779Sdim  let Inst{7}     = DstMem.Value;
281344779Sdim  let Inst{6}     = 0;
282344779Sdim  let Inst{5-4}   = imm{5-4};
283344779Sdim  let Inst{3-0}   = dst{3-0};
284344779Sdim}
285344779Sdim
286202878Srdivackyclass I16mm<bits<4> opcode,
287202878Srdivacky            dag outs, dag ins, string asmstr, list<dag> pattern>
288344779Sdim  : IForm16<opcode, DstMem, SrcMem, 6, outs, ins, asmstr, pattern> {
289344779Sdim  let DecoderNamespace = "Gamma";
290344779Sdim  bits<20> src;
291344779Sdim  bits<20> dst;
292344779Sdim  let rs = src{3-0};
293344779Sdim  let Inst{31-16} = src{19-4};
294344779Sdim  let rd = dst{3-0};
295344779Sdim  let Inst{47-32} = dst{19-4};
296344779Sdim}
297202878Srdivacky
298344779Sdimclass I16mn<bits<4> opcode,
299344779Sdim            dag outs, dag ins, string asmstr, list<dag> pattern>
300344779Sdim  : IForm16<opcode, DstMem, SrcIndReg, 4, outs, ins, asmstr, pattern> {
301344779Sdim  let DecoderNamespace = "Delta";
302344779Sdim  bits<20> dst;
303344779Sdim  let rd = dst{3-0};
304344779Sdim  let Inst{31-16} = dst{19-4};
305344779Sdim}
306344779Sdim
307344779Sdimclass I16mp<bits<4> opcode,
308344779Sdim            dag outs, dag ins, string asmstr, list<dag> pattern>
309344779Sdim  : IForm16<opcode, DstMem, SrcPostInc, 4, outs, ins, asmstr, pattern> {
310344779Sdim  let DecoderNamespace = "Delta";
311344779Sdim  bits<20> dst;
312344779Sdim  let rd = dst{3-0};
313344779Sdim  let Inst{31-16} = dst{19-4};
314344779Sdim}
315344779Sdim
316193323Sed// MSP430 Single Operand (Format II) Instructions
317344779Sdimclass IIForm<bits<3> opcode, bit bw, SourceMode as, int size,
318193323Sed             dag outs, dag ins, string asmstr, list<dag> pattern>
319344779Sdim  : MSP430Inst<outs, ins, size, asmstr> {
320193323Sed  let Pattern = pattern;
321202878Srdivacky
322344779Sdim  bits<4> rs;
323344779Sdim
324344779Sdim  let Inst{15-10} = 0b000100;
325344779Sdim  let Inst{9-7}   = opcode;
326344779Sdim  let Inst{6}     = bw;
327344779Sdim  let Inst{5-4}   = as.Value;
328344779Sdim  let Inst{3-0}   = rs;
329193323Sed}
330193323Sed
331202878Srdivacky// 8 bit IIForm instructions
332344779Sdimclass IIForm8<bits<3> opcode, SourceMode src, int size,
333202878Srdivacky              dag outs, dag ins, string asmstr, list<dag> pattern>
334344779Sdim  : IIForm<opcode, 1, src, size, outs, ins, asmstr, pattern>;
335202878Srdivacky
336344779Sdimclass II8r<bits<3> opcode,
337202878Srdivacky           dag outs, dag ins, string asmstr, list<dag> pattern>
338344779Sdim  : IIForm8<opcode, SrcReg, 2, outs, ins, asmstr, pattern>;
339202878Srdivacky
340344779Sdimclass II8m<bits<3> opcode,
341202878Srdivacky           dag outs, dag ins, string asmstr, list<dag> pattern>
342344779Sdim  : IIForm8<opcode, SrcMem, 4, outs, ins, asmstr, pattern> {
343344779Sdim  bits<20> src;
344344779Sdim  let rs = src{3-0};
345344779Sdim  let Inst{31-16} = src{19-4};
346344779Sdim}
347202878Srdivacky
348344779Sdimclass II8i<bits<3> opcode,
349202878Srdivacky           dag outs, dag ins, string asmstr, list<dag> pattern>
350344779Sdim  : IIForm8<opcode, SrcImm, 4, outs, ins, asmstr, pattern> {
351344779Sdim  bits<16> imm;
352344779Sdim  let rs = 0b0000;
353344779Sdim  let Inst{31-16} = imm;
354344779Sdim}
355202878Srdivacky
356344779Sdimclass II8c<bits<3> opcode,
357344779Sdim           dag outs, dag ins, string asmstr, list<dag> pattern>
358344779Sdim  : MSP430Inst<outs, ins, 2, asmstr> {
359344779Sdim  let Pattern = pattern;
360344779Sdim
361344779Sdim  bits<6> imm;
362344779Sdim
363344779Sdim  let Inst{15-10} = 0b000100;
364344779Sdim  let Inst{9-7}   = opcode;
365344779Sdim  let Inst{6}     = 1;
366344779Sdim  let Inst{5-0}   = imm;
367344779Sdim}
368344779Sdim
369344779Sdimclass II8n<bits<3> opcode,
370344779Sdim           dag outs, dag ins, string asmstr, list<dag> pattern>
371344779Sdim  : IIForm8<opcode, SrcIndReg, 2, outs, ins, asmstr, pattern>;
372344779Sdim
373344779Sdimclass II8p<bits<3> opcode,
374344779Sdim           dag outs, dag ins, string asmstr, list<dag> pattern>
375344779Sdim  : IIForm8<opcode, SrcPostInc, 2, outs, ins, asmstr, pattern>;
376344779Sdim
377202878Srdivacky// 16 bit IIForm instructions
378344779Sdimclass IIForm16<bits<3> opcode, SourceMode src, int size,
379202878Srdivacky               dag outs, dag ins, string asmstr, list<dag> pattern>
380344779Sdim  : IIForm<opcode, 0, src, size, outs, ins, asmstr, pattern>;
381202878Srdivacky
382344779Sdimclass II16r<bits<3> opcode,
383202878Srdivacky            dag outs, dag ins, string asmstr, list<dag> pattern>
384344779Sdim  : IIForm16<opcode, SrcReg, 2, outs, ins, asmstr, pattern>;
385202878Srdivacky
386344779Sdimclass II16m<bits<3> opcode,
387202878Srdivacky            dag outs, dag ins, string asmstr, list<dag> pattern>
388344779Sdim  : IIForm16<opcode, SrcMem, 4, outs, ins, asmstr, pattern> {
389344779Sdim  bits<20> src;
390344779Sdim  let rs = src{3-0};
391344779Sdim  let Inst{31-16} = src{19-4};
392344779Sdim}
393202878Srdivacky
394344779Sdimclass II16i<bits<3> opcode,
395202878Srdivacky            dag outs, dag ins, string asmstr, list<dag> pattern>
396344779Sdim  : IIForm16<opcode, SrcImm, 4, outs, ins, asmstr, pattern> {
397344779Sdim  bits<16> imm;
398344779Sdim  let rs = 0b0000;
399344779Sdim  let Inst{31-16} = imm;
400344779Sdim}
401202878Srdivacky
402344779Sdimclass II16c<bits<3> opcode,
403344779Sdim            dag outs, dag ins, string asmstr, list<dag> pattern>
404344779Sdim  : MSP430Inst<outs, ins, 2, asmstr> {
405344779Sdim  let Pattern = pattern;
406344779Sdim
407344779Sdim  bits<6> imm;
408344779Sdim
409344779Sdim  let Inst{15-10} = 0b000100;
410344779Sdim  let Inst{9-7}   = opcode;
411344779Sdim  let Inst{6}     = 0;
412344779Sdim  let Inst{5-0}   = imm;
413344779Sdim}
414344779Sdim
415344779Sdimclass II16n<bits<3> opcode,
416344779Sdim            dag outs, dag ins, string asmstr, list<dag> pattern>
417344779Sdim  : IIForm16<opcode, SrcIndReg, 2, outs, ins, asmstr, pattern>;
418344779Sdim
419344779Sdimclass II16p<bits<3> opcode,
420344779Sdim            dag outs, dag ins, string asmstr, list<dag> pattern>
421344779Sdim  : IIForm16<opcode, SrcPostInc, 2, outs, ins, asmstr, pattern>;
422344779Sdim
423193323Sed// MSP430 Conditional Jumps Instructions
424344779Sdimclass CJForm<dag outs, dag ins, string asmstr, list<dag> pattern>
425344779Sdim  : MSP430Inst<outs, ins, 2, asmstr> {
426193323Sed  let Pattern = pattern;
427193323Sed  
428344779Sdim  bits<3> cond;
429344779Sdim  bits<10> dst;
430344779Sdim
431344779Sdim  let Inst{15-13} = 0b001;
432344779Sdim  let Inst{12-10} = cond;
433344779Sdim  let Inst{9-0} = dst;
434193323Sed}
435193323Sed
436193323Sed// Pseudo instructions
437193323Sedclass Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern>
438344779Sdim  : MSP430Inst<outs, ins, 0, asmstr> {
439193323Sed  let Pattern = pattern;
440193323Sed}
441