]> git.proxmox.com Git - rustc.git/blame - src/llvm/lib/Target/MSP430/MSP430InstrFormats.td
Imported Upstream version 1.0.0+dfsg1
[rustc.git] / src / llvm / lib / Target / MSP430 / MSP430InstrFormats.td
CommitLineData
223e47cc
LB
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}