]>
Commit | Line | Data |
---|---|---|
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. | |
17 | class Format<bits<2> val> { | |
18 | bits<2> Value = val; | |
19 | } | |
20 | ||
21 | def PseudoFrm : Format<0>; | |
22 | def SingleOpFrm : Format<1>; | |
23 | def DoubleOpFrm : Format<2>; | |
24 | def CondJumpFrm : Format<3>; | |
25 | ||
26 | class SourceMode<bits<2> val> { | |
27 | bits<2> Value = val; | |
28 | } | |
29 | ||
30 | def SrcReg : SourceMode<0>; | |
31 | def SrcMem : SourceMode<1>; | |
32 | def SrcIndReg : SourceMode<2>; | |
33 | def SrcPostInc : SourceMode<3>; | |
34 | def SrcImm : SourceMode<3>; | |
35 | ||
36 | class DestMode<bit val> { | |
37 | bit Value = val; | |
38 | } | |
39 | ||
40 | def DstReg : DestMode<0>; | |
41 | def DstMem : DestMode<1>; | |
42 | ||
43 | class SizeVal<bits<3> val> { | |
44 | bits<3> Value = val; | |
45 | } | |
46 | ||
47 | def SizeUnknown : SizeVal<0>; // Unknown / unset size | |
48 | def SizeSpecial : SizeVal<1>; // Special instruction, e.g. pseudo | |
49 | def Size2Bytes : SizeVal<2>; | |
50 | def Size4Bytes : SizeVal<3>; | |
51 | def Size6Bytes : SizeVal<4>; | |
52 | ||
53 | // Generic MSP430 Format | |
54 | class 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 | |
77 | class 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 | |
92 | class 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 | ||
96 | class 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 | ||
100 | class 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 | ||
104 | class 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 | ||
108 | class 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 | ||
112 | class 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 | ||
116 | class 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 | |
121 | class 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 | ||
125 | class 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 | ||
129 | class 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 | ||
133 | class 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 | ||
137 | class 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 | ||
141 | class 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 | ||
145 | class 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 | |
150 | class 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 | |
163 | class 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 | ||
167 | class II8r<bits<9> opcode, | |
168 | dag outs, dag ins, string asmstr, list<dag> pattern> | |
169 | : IIForm8<opcode, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>; | |
170 | ||
171 | class II8m<bits<9> opcode, | |
172 | dag outs, dag ins, string asmstr, list<dag> pattern> | |
173 | : IIForm8<opcode, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>; | |
174 | ||
175 | class 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 | |
180 | class 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 | ||
184 | class II16r<bits<9> opcode, | |
185 | dag outs, dag ins, string asmstr, list<dag> pattern> | |
186 | : IIForm16<opcode, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>; | |
187 | ||
188 | class II16m<bits<9> opcode, | |
189 | dag outs, dag ins, string asmstr, list<dag> pattern> | |
190 | : IIForm16<opcode, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>; | |
191 | ||
192 | class 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 | |
197 | class 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 | |
207 | class 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 | } |