MSP430InstrInfo.td revision 51c31d6888a6c2a7cea74e210a1e1c8551535f28
1//===- MSP430InstrInfo.td - MSP430 Instruction defs -----------*- tblgen-*-===//
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// This file describes the MSP430 instructions in TableGen format.
11//
12//===----------------------------------------------------------------------===//
13
14include "MSP430InstrFormats.td"
15
16//===----------------------------------------------------------------------===//
17// Type Constraints.
18//===----------------------------------------------------------------------===//
19class SDTCisI8<int OpNum> : SDTCisVT<OpNum, i8>;
20class SDTCisI16<int OpNum> : SDTCisVT<OpNum, i16>;
21
22//===----------------------------------------------------------------------===//
23// Type Profiles.
24//===----------------------------------------------------------------------===//
25
26//===----------------------------------------------------------------------===//
27// MSP430 Specific Node Definitions.
28//===----------------------------------------------------------------------===//
29def MSP430retflag : SDNode<"MSP430ISD::RET_FLAG", SDTNone,
30                     [SDNPHasChain, SDNPOptInFlag]>;
31
32def MSP430rra     : SDNode<"MSP430ISD::RRA", SDTIntUnaryOp, []>;
33
34//===----------------------------------------------------------------------===//
35// Pseudo Instructions
36//===----------------------------------------------------------------------===//
37
38let neverHasSideEffects = 1 in
39def NOP : Pseudo<(outs), (ins), "nop", []>;
40
41//===----------------------------------------------------------------------===//
42// Real Instructions
43//===----------------------------------------------------------------------===//
44
45// FIXME: Provide proper encoding!
46let isReturn = 1, isTerminator = 1 in {
47  def RETI : Pseudo<(outs), (ins), "ret", [(MSP430retflag)]>;
48}
49
50//===----------------------------------------------------------------------===//
51// Move Instructions
52
53// FIXME: Provide proper encoding!
54let neverHasSideEffects = 1 in {
55def MOV16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src),
56                     "mov.w\t{$src, $dst|$dst, $src}",
57                     []>;
58def MOV8rr  : Pseudo<(outs GR8:$dst), (ins GR8:$src),
59                     "mov.b\t{$src, $dst|$dst, $src}",
60                     []>;
61}
62
63// FIXME: Provide proper encoding!
64let isReMaterializable = 1, isAsCheapAsAMove = 1 in {
65def MOV16ri : Pseudo<(outs GR16:$dst), (ins i16imm:$src),
66                     "mov.w\t{$src, $dst|$dst, $src}",
67                     [(set GR16:$dst, imm:$src)]>;
68def MOV8ri  : Pseudo<(outs GR8:$dst), (ins i8imm:$src),
69                     "mov.b\t{$src, $dst|$dst, $src}",
70                     [(set GR8:$dst, imm:$src)]>;
71
72}
73
74//===----------------------------------------------------------------------===//
75// Arithmetic Instructions
76
77let isTwoAddress = 1 in {
78
79let Defs = [SRW] in {
80
81let isCommutable = 1 in { // X = ADD Y, Z  == X = ADD Z, Y
82// FIXME: Provide proper encoding!
83def ADD16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
84                     "add.w\t{$src2, $dst|$dst, $src2}",
85                     [(set GR16:$dst, (add GR16:$src1, GR16:$src2)),
86                      (implicit SRW)]>;
87
88def ADD8rr  : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
89                     "add.b\t{$src2, $dst|$dst, $src2}",
90                     [(set GR8:$dst, (add GR8:$src1, GR8:$src2)),
91                      (implicit SRW)]>;
92}
93
94def ADD16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
95                     "add.w\t{$src2, $dst|$dst, $src2}",
96                     [(set GR16:$dst, (add GR16:$src1, imm:$src2)),
97                      (implicit SRW)]>;
98def ADD8ri  : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
99                     "add.b\t{$src2, $dst|$dst, $src2}",
100                     [(set GR8:$dst, (add GR8:$src1, imm:$src2)),
101                      (implicit SRW)]>;
102
103let Uses = [SRW] in {
104
105let isCommutable = 1 in { // X = ADDC Y, Z  == X = ADDC Z, Y
106def ADC16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
107                     "addc.w\t{$src2, $dst|$dst, $src2}",
108                     [(set GR16:$dst, (adde GR16:$src1, GR16:$src2)),
109                      (implicit SRW)]>;
110def ADC8rr  : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
111                     "addc.b\t{$src2, $dst|$dst, $src2}",
112                     [(set GR8:$dst, (adde GR8:$src1, GR8:$src2)),
113                      (implicit SRW)]>;
114} // isCommutable
115
116def ADC16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
117                     "addc.w\t{$src2, $dst|$dst, $src2}",
118                     [(set GR16:$dst, (adde GR16:$src1, imm:$src2)),
119                      (implicit SRW)]>;
120def ADC8ri  : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
121                     "addc.b\t{$src2, $dst|$dst, $src2}",
122                     [(set GR8:$dst, (adde GR8:$src1, imm:$src2)),
123                      (implicit SRW)]>;
124}
125
126let isCommutable = 1 in { // X = AND Y, Z  == X = AND Z, Y
127def AND16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
128                     "and.w\t{$src2, $dst|$dst, $src2}",
129                     [(set GR16:$dst, (and GR16:$src1, GR16:$src2)),
130                      (implicit SRW)]>;
131def AND8rr  : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
132                     "and.b\t{$src2, $dst|$dst, $src2}",
133                     [(set GR8:$dst, (and GR8:$src1, GR8:$src2)),
134                      (implicit SRW)]>;
135}
136
137def AND16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
138                     "and.w\t{$src2, $dst|$dst, $src2}",
139                     [(set GR16:$dst, (and GR16:$src1, imm:$src2)),
140                      (implicit SRW)]>;
141def AND8ri  : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
142                     "and.b\t{$src2, $dst|$dst, $src2}",
143                     [(set GR8:$dst, (and GR8:$src1, imm:$src2)),
144                      (implicit SRW)]>;
145
146let isCommutable = 1 in { // X = XOR Y, Z  == X = XOR Z, Y
147def XOR16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
148                     "xor.w\t{$src2, $dst|$dst, $src2}",
149                     [(set GR16:$dst, (xor GR16:$src1, GR16:$src2)),
150                      (implicit SRW)]>;
151def XOR8rr  : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
152                     "xor.b\t{$src2, $dst|$dst, $src2}",
153                     [(set GR8:$dst, (xor GR8:$src1, GR8:$src2)),
154                      (implicit SRW)]>;
155}
156
157def XOR16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
158                     "xor.w\t{$src2, $dst|$dst, $src2}",
159                     [(set GR16:$dst, (xor GR16:$src1, imm:$src2)),
160                      (implicit SRW)]>;
161def XOR8ri  : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
162                     "xor.b\t{$src2, $dst|$dst, $src2}",
163                     [(set GR8:$dst, (xor GR8:$src1, imm:$src2)),
164                      (implicit SRW)]>;
165
166
167def SUB16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
168                     "sub.w\t{$src2, $dst|$dst, $src2}",
169                     [(set GR16:$dst, (sub GR16:$src1, GR16:$src2)),
170                      (implicit SRW)]>;
171def SUB8rr  : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
172                     "sub.b\t{$src2, $dst|$dst, $src2}",
173                     [(set GR8:$dst, (sub GR8:$src1, GR8:$src2)),
174                      (implicit SRW)]>;
175
176def SUB16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
177                     "sub.w\t{$src2, $dst|$dst, $src2}",
178                     [(set GR16:$dst, (sub GR16:$src1, imm:$src2)),
179                      (implicit SRW)]>;
180def SUB8ri  : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
181                     "sub.b\t{$src2, $dst|$dst, $src2}",
182                     [(set GR8:$dst, (sub GR8:$src1, imm:$src2)),
183                      (implicit SRW)]>;
184
185let Uses = [SRW] in {
186def SBC16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
187                     "subc.w\t{$src2, $dst|$dst, $src2}",
188                     [(set GR16:$dst, (sube GR16:$src1, GR16:$src2)),
189                      (implicit SRW)]>;
190def SBC8rr  : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
191                     "subc.b\t{$src2, $dst|$dst, $src2}",
192                     [(set GR8:$dst, (sube GR8:$src1, GR8:$src2)),
193                      (implicit SRW)]>;
194
195def SBC16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
196                     "subc.w\t{$src2, $dst|$dst, $src2}",
197                     [(set GR16:$dst, (sube GR16:$src1, imm:$src2)),
198                      (implicit SRW)]>;
199def SBC8ri  : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
200                     "subc.b\t{$src2, $dst|$dst, $src2}",
201                     [(set GR8:$dst, (sube GR8:$src1, imm:$src2)),
202                      (implicit SRW)]>;
203}
204
205// FIXME: Provide proper encoding!
206def SAR16r1 : Pseudo<(outs GR16:$dst), (ins GR16:$src),
207                     "rra.w\t$dst",
208                     [(set GR16:$dst, (MSP430rra GR16:$src)),
209                      (implicit SRW)]>;
210
211def SEXT16r : Pseudo<(outs GR16:$dst), (ins GR16:$src),
212                     "sxt\t$dst",
213                     [(set GR16:$dst, (sext_inreg GR16:$src, i8)),
214                      (implicit SRW)]>;
215
216} // Defs = [SRW]
217
218let isCommutable = 1 in { // X = OR Y, Z  == X = OR Z, Y
219def OR16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
220                    "bis.w\t{$src2, $dst|$dst, $src2}",
221                    [(set GR16:$dst, (or GR16:$src1, GR16:$src2))]>;
222def OR8rr  : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
223                    "bis.b\t{$src2, $dst|$dst, $src2}",
224                    [(set GR8:$dst, (or GR8:$src1, GR8:$src2))]>;
225}
226
227def OR16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
228                    "bis.w\t{$src2, $dst|$dst, $src2}",
229                    [(set GR16:$dst, (or GR16:$src1, imm:$src2))]>;
230def OR8ri  : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
231                    "bis.b\t{$src2, $dst|$dst, $src2}",
232                    [(set GR8:$dst, (or GR8:$src1, imm:$src2))]>;
233
234} // isTwoAddress = 1
235