1234353Sdim//===-- MSP430InstrFormats.td - MSP430 Instruction Formats -*- tablegen -*-===//
2193323Sed//
3193323Sed//                     The LLVM Compiler Infrastructure
4193323Sed//
5193323Sed// This file is distributed under the University of Illinois Open Source 
6193323Sed// License. See LICENSE.TXT for details.
7193323Sed//
8193323Sed//===----------------------------------------------------------------------===//
9193323Sed
10193323Sed//===----------------------------------------------------------------------===//
11193323Sed//  Describe MSP430 instructions format here
12193323Sed//
13193323Sed
14202878Srdivacky// Format specifies the encoding used by the instruction.  This is part of the
15202878Srdivacky// ad-hoc solution used to emit machine instruction encodings by our machine
16202878Srdivacky// code emitter.
17202878Srdivackyclass Format<bits<2> val> {
18202878Srdivacky  bits<2> Value = val;
19202878Srdivacky}
20202878Srdivacky
21202878Srdivackydef PseudoFrm   : Format<0>;
22202878Srdivackydef SingleOpFrm : Format<1>;
23202878Srdivackydef DoubleOpFrm : Format<2>;
24202878Srdivackydef CondJumpFrm : Format<3>;
25202878Srdivacky
26202878Srdivackyclass SourceMode<bits<2> val> {
27202878Srdivacky  bits<2> Value = val;
28202878Srdivacky}
29202878Srdivacky
30202878Srdivackydef SrcReg      : SourceMode<0>;
31202878Srdivackydef SrcMem      : SourceMode<1>;
32202878Srdivackydef SrcIndReg   : SourceMode<2>;
33202878Srdivackydef SrcPostInc  : SourceMode<3>;
34202878Srdivackydef SrcImm      : SourceMode<3>;
35202878Srdivacky
36202878Srdivackyclass DestMode<bit val> {
37202878Srdivacky  bit Value = val;
38202878Srdivacky}
39202878Srdivacky
40202878Srdivackydef DstReg      : DestMode<0>;
41202878Srdivackydef DstMem      : DestMode<1>;
42202878Srdivacky
43202878Srdivackyclass SizeVal<bits<3> val> {
44202878Srdivacky  bits<3> Value = val;
45202878Srdivacky}
46202878Srdivacky
47202878Srdivackydef SizeUnknown : SizeVal<0>; // Unknown / unset size
48202878Srdivackydef SizeSpecial : SizeVal<1>; // Special instruction, e.g. pseudo
49202878Srdivackydef Size2Bytes  : SizeVal<2>;
50202878Srdivackydef Size4Bytes  : SizeVal<3>;
51202878Srdivackydef Size6Bytes  : SizeVal<4>;
52202878Srdivacky
53193323Sed// Generic MSP430 Format
54202878Srdivackyclass MSP430Inst<dag outs, dag ins, SizeVal sz, Format f,
55202878Srdivacky                 string asmstr> : Instruction {
56193323Sed  field bits<16> Inst;
57193323Sed
58193323Sed  let Namespace = "MSP430";
59193323Sed
60193323Sed  dag OutOperandList = outs;
61193323Sed  dag InOperandList  = ins;
62193323Sed
63202878Srdivacky  Format Form = f;
64202878Srdivacky  SizeVal Sz = sz;
65202878Srdivacky
66206274Srdivacky  // Define how we want to layout our TargetSpecific information field... This
67206274Srdivacky  // should be kept up-to-date with the fields in the MSP430InstrInfo.h file.
68206274Srdivacky  let TSFlags{1-0} = Form.Value;
69206274Srdivacky  let TSFlags{4-2} = Sz.Value;
70206274Srdivacky
71193323Sed  let AsmString   = asmstr;
72193323Sed}
73193323Sed
74193323Sed// FIXME: Create different classes for different addressing modes.
75193323Sed
76193323Sed// MSP430 Double Operand (Format I) Instructions
77202878Srdivackyclass IForm<bits<4> opcode, DestMode dest, bit bw, SourceMode src, SizeVal sz,
78193323Sed            dag outs, dag ins, string asmstr, list<dag> pattern>
79202878Srdivacky  : MSP430Inst<outs, ins, sz, DoubleOpFrm, asmstr> {
80193323Sed  let Pattern = pattern;
81202878Srdivacky
82202878Srdivacky  DestMode ad = dest;
83202878Srdivacky  SourceMode as = src;
84193323Sed  
85193323Sed  let Inst{12-15} = opcode;
86202878Srdivacky  let Inst{7}     = ad.Value;
87193323Sed  let Inst{6}     = bw;
88202878Srdivacky  let Inst{4-5}   = as.Value;
89193323Sed}
90193323Sed
91202878Srdivacky// 8 bit IForm instructions
92202878Srdivackyclass IForm8<bits<4> opcode, DestMode dest, SourceMode src, SizeVal sz,
93202878Srdivacky             dag outs, dag ins, string asmstr, list<dag> pattern>
94202878Srdivacky  : IForm<opcode, dest, 1, src, sz, outs, ins, asmstr, pattern>;
95202878Srdivacky
96202878Srdivackyclass I8rr<bits<4> opcode,
97202878Srdivacky           dag outs, dag ins, string asmstr, list<dag> pattern>
98202878Srdivacky  : IForm8<opcode, DstReg, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>;
99202878Srdivacky
100202878Srdivackyclass I8ri<bits<4> opcode,
101202878Srdivacky           dag outs, dag ins, string asmstr, list<dag> pattern>
102202878Srdivacky  : IForm8<opcode, DstReg, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>;
103202878Srdivacky
104202878Srdivackyclass I8rm<bits<4> opcode,
105202878Srdivacky           dag outs, dag ins, string asmstr, list<dag> pattern>
106202878Srdivacky  : IForm8<opcode, DstReg, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>;
107202878Srdivacky
108202878Srdivackyclass I8mr<bits<4> opcode,
109202878Srdivacky           dag outs, dag ins, string asmstr, list<dag> pattern>
110202878Srdivacky  : IForm8<opcode, DstMem, SrcReg, Size4Bytes, outs, ins, asmstr, pattern>;
111202878Srdivacky
112202878Srdivackyclass I8mi<bits<4> opcode,
113202878Srdivacky           dag outs, dag ins, string asmstr, list<dag> pattern>
114202878Srdivacky  : IForm8<opcode, DstMem, SrcImm, Size6Bytes, outs, ins, asmstr, pattern>;
115202878Srdivacky
116202878Srdivackyclass I8mm<bits<4> opcode,
117202878Srdivacky           dag outs, dag ins, string asmstr, list<dag> pattern>
118202878Srdivacky  : IForm8<opcode, DstMem, SrcMem, Size6Bytes, outs, ins, asmstr, pattern>;
119202878Srdivacky
120202878Srdivacky// 16 bit IForm instructions
121202878Srdivackyclass IForm16<bits<4> opcode, DestMode dest, SourceMode src, SizeVal sz,
122202878Srdivacky              dag outs, dag ins, string asmstr, list<dag> pattern>
123202878Srdivacky  : IForm<opcode, dest, 0, src, sz, outs, ins, asmstr, pattern>;
124202878Srdivacky
125202878Srdivackyclass I16rr<bits<4> opcode,
126202878Srdivacky            dag outs, dag ins, string asmstr, list<dag> pattern>
127202878Srdivacky  : IForm16<opcode, DstReg, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>;
128202878Srdivacky
129202878Srdivackyclass I16ri<bits<4> opcode,
130202878Srdivacky            dag outs, dag ins, string asmstr, list<dag> pattern>
131202878Srdivacky  : IForm16<opcode, DstReg, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>;
132202878Srdivacky
133202878Srdivackyclass I16rm<bits<4> opcode,
134202878Srdivacky            dag outs, dag ins, string asmstr, list<dag> pattern>
135202878Srdivacky  : IForm16<opcode, DstReg, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>;
136202878Srdivacky
137202878Srdivackyclass I16mr<bits<4> opcode,
138202878Srdivacky            dag outs, dag ins, string asmstr, list<dag> pattern>
139202878Srdivacky  : IForm16<opcode, DstMem, SrcReg, Size4Bytes, outs, ins, asmstr, pattern>;
140202878Srdivacky
141202878Srdivackyclass I16mi<bits<4> opcode,
142202878Srdivacky            dag outs, dag ins, string asmstr, list<dag> pattern>
143202878Srdivacky  : IForm16<opcode, DstMem, SrcImm, Size6Bytes, outs, ins, asmstr, pattern>;
144202878Srdivacky
145202878Srdivackyclass I16mm<bits<4> opcode,
146202878Srdivacky            dag outs, dag ins, string asmstr, list<dag> pattern>
147202878Srdivacky  : IForm16<opcode, DstMem, SrcMem, Size6Bytes, outs, ins, asmstr, pattern>;
148202878Srdivacky
149193323Sed// MSP430 Single Operand (Format II) Instructions
150202878Srdivackyclass IIForm<bits<9> opcode, bit bw, SourceMode src, SizeVal sz,
151193323Sed             dag outs, dag ins, string asmstr, list<dag> pattern>
152202878Srdivacky  : MSP430Inst<outs, ins, sz, SingleOpFrm, asmstr> {
153193323Sed  let Pattern = pattern;
154193323Sed  
155202878Srdivacky  SourceMode as = src;
156202878Srdivacky
157193323Sed  let Inst{7-15} = opcode;
158193323Sed  let Inst{6}    = bw;
159202878Srdivacky  let Inst{4-5}  = as.Value;
160193323Sed}
161193323Sed
162202878Srdivacky// 8 bit IIForm instructions
163202878Srdivackyclass IIForm8<bits<9> opcode, SourceMode src, SizeVal sz,
164202878Srdivacky              dag outs, dag ins, string asmstr, list<dag> pattern>
165202878Srdivacky  : IIForm<opcode, 1, src, sz, outs, ins, asmstr, pattern>;
166202878Srdivacky
167202878Srdivackyclass II8r<bits<9> opcode,
168202878Srdivacky           dag outs, dag ins, string asmstr, list<dag> pattern>
169202878Srdivacky  : IIForm8<opcode, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>;
170202878Srdivacky
171202878Srdivackyclass II8m<bits<9> opcode,
172202878Srdivacky           dag outs, dag ins, string asmstr, list<dag> pattern>
173202878Srdivacky  : IIForm8<opcode, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>;
174202878Srdivacky
175202878Srdivackyclass II8i<bits<9> opcode,
176202878Srdivacky           dag outs, dag ins, string asmstr, list<dag> pattern>
177202878Srdivacky  : IIForm8<opcode, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>;
178202878Srdivacky
179202878Srdivacky// 16 bit IIForm instructions
180202878Srdivackyclass IIForm16<bits<9> opcode, SourceMode src, SizeVal sz,
181202878Srdivacky               dag outs, dag ins, string asmstr, list<dag> pattern>
182202878Srdivacky  : IIForm<opcode, 0, src, sz, outs, ins, asmstr, pattern>;
183202878Srdivacky
184202878Srdivackyclass II16r<bits<9> opcode,
185202878Srdivacky            dag outs, dag ins, string asmstr, list<dag> pattern>
186202878Srdivacky  : IIForm16<opcode, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>;
187202878Srdivacky
188202878Srdivackyclass II16m<bits<9> opcode,
189202878Srdivacky            dag outs, dag ins, string asmstr, list<dag> pattern>
190202878Srdivacky  : IIForm16<opcode, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>;
191202878Srdivacky
192202878Srdivackyclass II16i<bits<9> opcode,
193202878Srdivacky            dag outs, dag ins, string asmstr, list<dag> pattern>
194202878Srdivacky  : IIForm16<opcode, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>;
195202878Srdivacky
196193323Sed// MSP430 Conditional Jumps Instructions
197202878Srdivackyclass CJForm<bits<3> opcode, bits<3> cond,
198193323Sed             dag outs, dag ins, string asmstr, list<dag> pattern>
199202878Srdivacky  : MSP430Inst<outs, ins, Size2Bytes, CondJumpFrm, asmstr> {
200193323Sed  let Pattern = pattern;
201193323Sed  
202193323Sed  let Inst{13-15} = opcode;
203193323Sed  let Inst{10-12} = cond;
204193323Sed}
205193323Sed
206193323Sed// Pseudo instructions
207193323Sedclass Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern>
208202878Srdivacky  : MSP430Inst<outs, ins, SizeSpecial, PseudoFrm, asmstr> {
209193323Sed  let Pattern = pattern;
210193323Sed  let Inst{15-0} = 0;
211193323Sed}
212