blob: a9e87dad0cd8b6d1bda42ce4cf3bc2f7b0027f26 [file] [log] [blame]
Jia Liub22310f2012-02-18 12:03:15 +00001//===-- MSP430InstrFormats.td - MSP430 Instruction Formats -*- tablegen -*-===//
Anton Korobeynikov10138002009-05-03 12:57:15 +00002//
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
Anton Korobeynikove57b2342010-01-15 21:17:13 +000014// 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
Anton Korobeynikove57b2342010-01-15 21:17:13 +000021def PseudoFrm : Format<0>;
22def SingleOpFrm : Format<1>;
23def DoubleOpFrm : Format<2>;
24def CondJumpFrm : Format<3>;
25
Anton Korobeynikov71471292010-01-15 21:18:39 +000026class SourceMode<bits<2> val> {
27 bits<2> Value = val;
28}
Anton Korobeynikove57b2342010-01-15 21:17:13 +000029
30def SrcReg : SourceMode<0>;
31def SrcMem : SourceMode<1>;
32def SrcIndReg : SourceMode<2>;
33def SrcPostInc : SourceMode<3>;
34def SrcImm : SourceMode<3>;
35
Anton Korobeynikov71471292010-01-15 21:18:39 +000036class 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
Anton Korobeynikov10138002009-05-03 12:57:15 +000053// Generic MSP430 Format
Anton Korobeynikov71471292010-01-15 21:18:39 +000054class MSP430Inst<dag outs, dag ins, SizeVal sz, Format f,
55 string asmstr> : Instruction {
Anton Korobeynikov10138002009-05-03 12:57:15 +000056 field bits<16> Inst;
57
58 let Namespace = "MSP430";
59
60 dag OutOperandList = outs;
61 dag InOperandList = ins;
62
Anton Korobeynikove57b2342010-01-15 21:17:13 +000063 Format Form = f;
Anton Korobeynikov71471292010-01-15 21:18:39 +000064 SizeVal Sz = sz;
Jakob Stoklund Olesenb93331f2010-04-05 03:10:20 +000065
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;
Anton Korobeynikov71471292010-01-15 21:18:39 +000070
Anton Korobeynikov10138002009-05-03 12:57:15 +000071 let AsmString = asmstr;
72}
73
74// FIXME: Create different classes for different addressing modes.
75
76// MSP430 Double Operand (Format I) Instructions
Anton Korobeynikov71471292010-01-15 21:18:39 +000077class IForm<bits<4> opcode, DestMode dest, bit bw, SourceMode src, SizeVal sz,
Anton Korobeynikov10138002009-05-03 12:57:15 +000078 dag outs, dag ins, string asmstr, list<dag> pattern>
Anton Korobeynikov71471292010-01-15 21:18:39 +000079 : MSP430Inst<outs, ins, sz, DoubleOpFrm, asmstr> {
Anton Korobeynikov10138002009-05-03 12:57:15 +000080 let Pattern = pattern;
Anton Korobeynikove57b2342010-01-15 21:17:13 +000081
82 DestMode ad = dest;
Anton Korobeynikov71471292010-01-15 21:18:39 +000083 SourceMode as = src;
Anton Korobeynikov10138002009-05-03 12:57:15 +000084
85 let Inst{12-15} = opcode;
Anton Korobeynikove57b2342010-01-15 21:17:13 +000086 let Inst{7} = ad.Value;
Anton Korobeynikov10138002009-05-03 12:57:15 +000087 let Inst{6} = bw;
Anton Korobeynikove57b2342010-01-15 21:17:13 +000088 let Inst{4-5} = as.Value;
Anton Korobeynikov10138002009-05-03 12:57:15 +000089}
90
Anton Korobeynikove57b2342010-01-15 21:17:13 +000091// 8 bit IForm instructions
Anton Korobeynikov71471292010-01-15 21:18:39 +000092class IForm8<bits<4> opcode, DestMode dest, SourceMode src, SizeVal sz,
Anton Korobeynikov10138002009-05-03 12:57:15 +000093 dag outs, dag ins, string asmstr, list<dag> pattern>
Anton Korobeynikov71471292010-01-15 21:18:39 +000094 : IForm<opcode, dest, 1, src, sz, outs, ins, asmstr, pattern>;
Anton Korobeynikove57b2342010-01-15 21:17:13 +000095
96class I8rr<bits<4> opcode,
97 dag outs, dag ins, string asmstr, list<dag> pattern>
Anton Korobeynikov71471292010-01-15 21:18:39 +000098 : IForm8<opcode, DstReg, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>;
Anton Korobeynikove57b2342010-01-15 21:17:13 +000099
100class I8ri<bits<4> opcode,
101 dag outs, dag ins, string asmstr, list<dag> pattern>
Anton Korobeynikov71471292010-01-15 21:18:39 +0000102 : IForm8<opcode, DstReg, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>;
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000103
104class I8rm<bits<4> opcode,
105 dag outs, dag ins, string asmstr, list<dag> pattern>
Anton Korobeynikov71471292010-01-15 21:18:39 +0000106 : IForm8<opcode, DstReg, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>;
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000107
108class I8mr<bits<4> opcode,
109 dag outs, dag ins, string asmstr, list<dag> pattern>
Anton Korobeynikov71471292010-01-15 21:18:39 +0000110 : IForm8<opcode, DstMem, SrcReg, Size4Bytes, outs, ins, asmstr, pattern>;
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000111
112class I8mi<bits<4> opcode,
113 dag outs, dag ins, string asmstr, list<dag> pattern>
Anton Korobeynikov71471292010-01-15 21:18:39 +0000114 : IForm8<opcode, DstMem, SrcImm, Size6Bytes, outs, ins, asmstr, pattern>;
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000115
116class I8mm<bits<4> opcode,
117 dag outs, dag ins, string asmstr, list<dag> pattern>
Anton Korobeynikov71471292010-01-15 21:18:39 +0000118 : IForm8<opcode, DstMem, SrcMem, Size6Bytes, outs, ins, asmstr, pattern>;
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000119
120// 16 bit IForm instructions
Anton Korobeynikov71471292010-01-15 21:18:39 +0000121class IForm16<bits<4> opcode, DestMode dest, SourceMode src, SizeVal sz,
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000122 dag outs, dag ins, string asmstr, list<dag> pattern>
Anton Korobeynikov71471292010-01-15 21:18:39 +0000123 : IForm<opcode, dest, 0, src, sz, outs, ins, asmstr, pattern>;
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000124
125class I16rr<bits<4> opcode,
126 dag outs, dag ins, string asmstr, list<dag> pattern>
Anton Korobeynikov71471292010-01-15 21:18:39 +0000127 : IForm16<opcode, DstReg, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>;
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000128
129class I16ri<bits<4> opcode,
130 dag outs, dag ins, string asmstr, list<dag> pattern>
Anton Korobeynikov71471292010-01-15 21:18:39 +0000131 : IForm16<opcode, DstReg, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>;
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000132
133class I16rm<bits<4> opcode,
134 dag outs, dag ins, string asmstr, list<dag> pattern>
Anton Korobeynikov71471292010-01-15 21:18:39 +0000135 : IForm16<opcode, DstReg, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>;
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000136
137class I16mr<bits<4> opcode,
138 dag outs, dag ins, string asmstr, list<dag> pattern>
Anton Korobeynikov71471292010-01-15 21:18:39 +0000139 : IForm16<opcode, DstMem, SrcReg, Size4Bytes, outs, ins, asmstr, pattern>;
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000140
141class I16mi<bits<4> opcode,
142 dag outs, dag ins, string asmstr, list<dag> pattern>
Anton Korobeynikov71471292010-01-15 21:18:39 +0000143 : IForm16<opcode, DstMem, SrcImm, Size6Bytes, outs, ins, asmstr, pattern>;
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000144
145class I16mm<bits<4> opcode,
146 dag outs, dag ins, string asmstr, list<dag> pattern>
Anton Korobeynikov71471292010-01-15 21:18:39 +0000147 : IForm16<opcode, DstMem, SrcMem, Size6Bytes, outs, ins, asmstr, pattern>;
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000148
149// MSP430 Single Operand (Format II) Instructions
Anton Korobeynikov71471292010-01-15 21:18:39 +0000150class IIForm<bits<9> opcode, bit bw, SourceMode src, SizeVal sz,
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000151 dag outs, dag ins, string asmstr, list<dag> pattern>
Anton Korobeynikov71471292010-01-15 21:18:39 +0000152 : MSP430Inst<outs, ins, sz, SingleOpFrm, asmstr> {
Anton Korobeynikov10138002009-05-03 12:57:15 +0000153 let Pattern = pattern;
154
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000155 SourceMode as = src;
156
Anton Korobeynikov10138002009-05-03 12:57:15 +0000157 let Inst{7-15} = opcode;
158 let Inst{6} = bw;
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000159 let Inst{4-5} = as.Value;
Anton Korobeynikov10138002009-05-03 12:57:15 +0000160}
161
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000162// 8 bit IIForm instructions
Anton Korobeynikov71471292010-01-15 21:18:39 +0000163class IIForm8<bits<9> opcode, SourceMode src, SizeVal sz,
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000164 dag outs, dag ins, string asmstr, list<dag> pattern>
Anton Korobeynikov71471292010-01-15 21:18:39 +0000165 : 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>;
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000178
179// 16 bit IIForm instructions
Anton Korobeynikov71471292010-01-15 21:18:39 +0000180class IIForm16<bits<9> opcode, SourceMode src, SizeVal sz,
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000181 dag outs, dag ins, string asmstr, list<dag> pattern>
Anton Korobeynikov71471292010-01-15 21:18:39 +0000182 : 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>;
Anton Korobeynikove57b2342010-01-15 21:17:13 +0000195
Anton Korobeynikov10138002009-05-03 12:57:15 +0000196// MSP430 Conditional Jumps Instructions
Anton Korobeynikov71471292010-01-15 21:18:39 +0000197class CJForm<bits<3> opcode, bits<3> cond,
Anton Korobeynikov10138002009-05-03 12:57:15 +0000198 dag outs, dag ins, string asmstr, list<dag> pattern>
Anton Korobeynikov71471292010-01-15 21:18:39 +0000199 : MSP430Inst<outs, ins, Size2Bytes, CondJumpFrm, asmstr> {
Anton Korobeynikov10138002009-05-03 12:57:15 +0000200 let Pattern = pattern;
201
202 let Inst{13-15} = opcode;
203 let Inst{10-12} = cond;
Anton Korobeynikov10138002009-05-03 12:57:15 +0000204}
205
206// Pseudo instructions
207class Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern>
Anton Korobeynikov71471292010-01-15 21:18:39 +0000208 : MSP430Inst<outs, ins, SizeSpecial, PseudoFrm, asmstr> {
Anton Korobeynikov10138002009-05-03 12:57:15 +0000209 let Pattern = pattern;
210 let Inst{15-0} = 0;
211}