1//===-- MSP430InstrFormats.td - MSP430 Instruction Formats -*- tablegen -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10//===----------------------------------------------------------------------===//
11//  Describe MSP430 instructions format here
12//
13
14// Format specifies the encoding used by the instruction.  This is part of the
15// ad-hoc solution used to emit machine instruction encodings by our machine
16// code emitter.
17class Format<bits<2> val> {
18  bits<2> Value = val;
19}
20
21def PseudoFrm   : Format<0>;
22def SingleOpFrm : Format<1>;
23def DoubleOpFrm : Format<2>;
24def CondJumpFrm : Format<3>;
25
26class SourceMode<bits<2> val> {
27  bits<2> Value = val;
28}
29
30def SrcReg      : SourceMode<0>;
31def SrcMem      : SourceMode<1>;
32def SrcIndReg   : SourceMode<2>;
33def SrcPostInc  : SourceMode<3>;
34def SrcImm      : SourceMode<3>;
35
36class DestMode<bit val> {
37  bit Value = val;
38}
39
40def DstReg      : DestMode<0>;
41def DstMem      : DestMode<1>;
42
43class SizeVal<bits<3> val> {
44  bits<3> Value = val;
45}
46
47def SizeUnknown : SizeVal<0>; // Unknown / unset size
48def SizeSpecial : SizeVal<1>; // Special instruction, e.g. pseudo
49def Size2Bytes  : SizeVal<2>;
50def Size4Bytes  : SizeVal<3>;
51def Size6Bytes  : SizeVal<4>;
52
53// Generic MSP430 Format
54class MSP430Inst<dag outs, dag ins, SizeVal sz, Format f,
55                 string asmstr> : Instruction {
56  field bits<16> Inst;
57
58  let Namespace = "MSP430";
59
60  dag OutOperandList = outs;
61  dag InOperandList  = ins;
62
63  Format Form = f;
64  SizeVal Sz = sz;
65
66  // Define how we want to layout our TargetSpecific information field... This
67  // should be kept up-to-date with the fields in the MSP430InstrInfo.h file.
68  let TSFlags{1-0} = Form.Value;
69  let TSFlags{4-2} = Sz.Value;
70
71  let AsmString   = asmstr;
72}
73
74// FIXME: Create different classes for different addressing modes.
75
76// MSP430 Double Operand (Format I) Instructions
77class IForm<bits<4> opcode, DestMode dest, bit bw, SourceMode src, SizeVal sz,
78            dag outs, dag ins, string asmstr, list<dag> pattern>
79  : MSP430Inst<outs, ins, sz, DoubleOpFrm, asmstr> {
80  let Pattern = pattern;
81
82  DestMode ad = dest;
83  SourceMode as = src;
84
85  let Inst{12-15} = opcode;
86  let Inst{7}     = ad.Value;
87  let Inst{6}     = bw;
88  let Inst{4-5}   = as.Value;
89}
90
91// 8 bit IForm instructions
92class IForm8<bits<4> opcode, DestMode dest, SourceMode src, SizeVal sz,
93             dag outs, dag ins, string asmstr, list<dag> pattern>
94  : IForm<opcode, dest, 1, src, sz, outs, ins, asmstr, pattern>;
95
96class I8rr<bits<4> opcode,
97           dag outs, dag ins, string asmstr, list<dag> pattern>
98  : IForm8<opcode, DstReg, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>;
99
100class I8ri<bits<4> opcode,
101           dag outs, dag ins, string asmstr, list<dag> pattern>
102  : IForm8<opcode, DstReg, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>;
103
104class I8rm<bits<4> opcode,
105           dag outs, dag ins, string asmstr, list<dag> pattern>
106  : IForm8<opcode, DstReg, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>;
107
108class I8mr<bits<4> opcode,
109           dag outs, dag ins, string asmstr, list<dag> pattern>
110  : IForm8<opcode, DstMem, SrcReg, Size4Bytes, outs, ins, asmstr, pattern>;
111
112class I8mi<bits<4> opcode,
113           dag outs, dag ins, string asmstr, list<dag> pattern>
114  : IForm8<opcode, DstMem, SrcImm, Size6Bytes, outs, ins, asmstr, pattern>;
115
116class I8mm<bits<4> opcode,
117           dag outs, dag ins, string asmstr, list<dag> pattern>
118  : IForm8<opcode, DstMem, SrcMem, Size6Bytes, outs, ins, asmstr, pattern>;
119
120// 16 bit IForm instructions
121class IForm16<bits<4> opcode, DestMode dest, SourceMode src, SizeVal sz,
122              dag outs, dag ins, string asmstr, list<dag> pattern>
123  : IForm<opcode, dest, 0, src, sz, outs, ins, asmstr, pattern>;
124
125class I16rr<bits<4> opcode,
126            dag outs, dag ins, string asmstr, list<dag> pattern>
127  : IForm16<opcode, DstReg, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>;
128
129class I16ri<bits<4> opcode,
130            dag outs, dag ins, string asmstr, list<dag> pattern>
131  : IForm16<opcode, DstReg, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>;
132
133class I16rm<bits<4> opcode,
134            dag outs, dag ins, string asmstr, list<dag> pattern>
135  : IForm16<opcode, DstReg, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>;
136
137class I16mr<bits<4> opcode,
138            dag outs, dag ins, string asmstr, list<dag> pattern>
139  : IForm16<opcode, DstMem, SrcReg, Size4Bytes, outs, ins, asmstr, pattern>;
140
141class I16mi<bits<4> opcode,
142            dag outs, dag ins, string asmstr, list<dag> pattern>
143  : IForm16<opcode, DstMem, SrcImm, Size6Bytes, outs, ins, asmstr, pattern>;
144
145class I16mm<bits<4> opcode,
146            dag outs, dag ins, string asmstr, list<dag> pattern>
147  : IForm16<opcode, DstMem, SrcMem, Size6Bytes, outs, ins, asmstr, pattern>;
148
149// MSP430 Single Operand (Format II) Instructions
150class IIForm<bits<9> opcode, bit bw, SourceMode src, SizeVal sz,
151             dag outs, dag ins, string asmstr, list<dag> pattern>
152  : MSP430Inst<outs, ins, sz, SingleOpFrm, asmstr> {
153  let Pattern = pattern;
154
155  SourceMode as = src;
156
157  let Inst{7-15} = opcode;
158  let Inst{6}    = bw;
159  let Inst{4-5}  = as.Value;
160}
161
162// 8 bit IIForm instructions
163class IIForm8<bits<9> opcode, SourceMode src, SizeVal sz,
164              dag outs, dag ins, string asmstr, list<dag> pattern>
165  : IIForm<opcode, 1, src, sz, outs, ins, asmstr, pattern>;
166
167class II8r<bits<9> opcode,
168           dag outs, dag ins, string asmstr, list<dag> pattern>
169  : IIForm8<opcode, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>;
170
171class II8m<bits<9> opcode,
172           dag outs, dag ins, string asmstr, list<dag> pattern>
173  : IIForm8<opcode, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>;
174
175class II8i<bits<9> opcode,
176           dag outs, dag ins, string asmstr, list<dag> pattern>
177  : IIForm8<opcode, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>;
178
179// 16 bit IIForm instructions
180class IIForm16<bits<9> opcode, SourceMode src, SizeVal sz,
181               dag outs, dag ins, string asmstr, list<dag> pattern>
182  : IIForm<opcode, 0, src, sz, outs, ins, asmstr, pattern>;
183
184class II16r<bits<9> opcode,
185            dag outs, dag ins, string asmstr, list<dag> pattern>
186  : IIForm16<opcode, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>;
187
188class II16m<bits<9> opcode,
189            dag outs, dag ins, string asmstr, list<dag> pattern>
190  : IIForm16<opcode, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>;
191
192class II16i<bits<9> opcode,
193            dag outs, dag ins, string asmstr, list<dag> pattern>
194  : IIForm16<opcode, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>;
195
196// MSP430 Conditional Jumps Instructions
197class CJForm<bits<3> opcode, bits<3> cond,
198             dag outs, dag ins, string asmstr, list<dag> pattern>
199  : MSP430Inst<outs, ins, Size2Bytes, CondJumpFrm, asmstr> {
200  let Pattern = pattern;
201
202  let Inst{13-15} = opcode;
203  let Inst{10-12} = cond;
204}
205
206// Pseudo instructions
207class Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern>
208  : MSP430Inst<outs, ins, SizeSpecial, PseudoFrm, asmstr> {
209  let Pattern = pattern;
210  let Inst{15-0} = 0;
211}
212