blob: 442060cf7829893b294a053a7fb80b6766b80089 [file] [log] [blame]
Anton Korobeynikov37171572009-05-03 12:57:15 +00001//===- 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//===----------------------------------------------------------------------===//
Anton Korobeynikov7feedc82009-05-03 13:07:31 +000025def SDT_MSP430Call : SDTypeProfile<0, -1, [SDTCisVT<0, iPTR>]>;
Anton Korobeynikov37171572009-05-03 12:57:15 +000026
27//===----------------------------------------------------------------------===//
28// MSP430 Specific Node Definitions.
29//===----------------------------------------------------------------------===//
Anton Korobeynikov184a31c2009-05-03 13:03:33 +000030def MSP430retflag : SDNode<"MSP430ISD::RET_FLAG", SDTNone,
Anton Korobeynikov725e2d02009-05-03 12:59:50 +000031 [SDNPHasChain, SDNPOptInFlag]>;
Anton Korobeynikov37171572009-05-03 12:57:15 +000032
Anton Korobeynikov184a31c2009-05-03 13:03:33 +000033def MSP430rra : SDNode<"MSP430ISD::RRA", SDTIntUnaryOp, []>;
34
Anton Korobeynikov7feedc82009-05-03 13:07:31 +000035def MSP430call : SDNode<"MSP430ISD::CALL", SDT_MSP430Call,
36 [SDNPHasChain, SDNPOutFlag, SDNPOptInFlag]>;
37
Anton Korobeynikov37171572009-05-03 12:57:15 +000038//===----------------------------------------------------------------------===//
Anton Korobeynikov4c88f112009-05-03 13:06:03 +000039// MSP430 Operand Definitions.
Anton Korobeynikov37171572009-05-03 12:57:15 +000040//===----------------------------------------------------------------------===//
41
Anton Korobeynikov7aefbb32009-05-03 13:06:26 +000042// Address operands
Anton Korobeynikov4c88f112009-05-03 13:06:03 +000043def memsrc : Operand<i16> {
44 let PrintMethod = "printSrcMemOperand";
45 let MIOperandInfo = (ops i16imm, GR16);
46}
47
Anton Korobeynikov7aefbb32009-05-03 13:06:26 +000048def memdst : Operand<i16> {
49 let PrintMethod = "printSrcMemOperand";
50 let MIOperandInfo = (ops i16imm, GR16);
51}
52
Anton Korobeynikov4c88f112009-05-03 13:06:03 +000053
54//===----------------------------------------------------------------------===//
55// MSP430 Complex Pattern Definitions.
56//===----------------------------------------------------------------------===//
57
58def addr : ComplexPattern<iPTR, 2, "SelectAddr", [], []>;
59
60//===----------------------------------------------------------------------===//
61// Pattern Fragments
62def zextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (zextloadi8 node:$ptr))>;
63def extloadi16i8 : PatFrag<(ops node:$ptr), (i16 ( extloadi8 node:$ptr))>;
64
65//===----------------------------------------------------------------------===//
66// Pseudo Instructions
67
Anton Korobeynikov57322972009-05-03 13:04:23 +000068let neverHasSideEffects = 1 in
Anton Korobeynikov37171572009-05-03 12:57:15 +000069def NOP : Pseudo<(outs), (ins), "nop", []>;
Anton Korobeynikov725e2d02009-05-03 12:59:50 +000070
71//===----------------------------------------------------------------------===//
72// Real Instructions
Anton Korobeynikov725e2d02009-05-03 12:59:50 +000073
74// FIXME: Provide proper encoding!
75let isReturn = 1, isTerminator = 1 in {
Anton Korobeynikov184a31c2009-05-03 13:03:33 +000076 def RETI : Pseudo<(outs), (ins), "ret", [(MSP430retflag)]>;
Anton Korobeynikovf1fb8c72009-05-03 13:02:04 +000077}
78
79//===----------------------------------------------------------------------===//
80// Move Instructions
81
82// FIXME: Provide proper encoding!
83let neverHasSideEffects = 1 in {
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +000084def MOV8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src),
85 "mov.b\t{$src, $dst|$dst, $src}",
86 []>;
Anton Korobeynikov4c88f112009-05-03 13:06:03 +000087def MOV16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src),
88 "mov.w\t{$src, $dst|$dst, $src}",
89 []>;
Anton Korobeynikovf1fb8c72009-05-03 13:02:04 +000090}
91
92// FIXME: Provide proper encoding!
93let isReMaterializable = 1, isAsCheapAsAMove = 1 in {
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +000094def MOV8ri : Pseudo<(outs GR8:$dst), (ins i8imm:$src),
95 "mov.b\t{$src, $dst|$dst, $src}",
96 [(set GR8:$dst, imm:$src)]>;
Anton Korobeynikov4c88f112009-05-03 13:06:03 +000097def MOV16ri : Pseudo<(outs GR16:$dst), (ins i16imm:$src),
98 "mov.w\t{$src, $dst|$dst, $src}",
99 [(set GR16:$dst, imm:$src)]>;
Anton Korobeynikov725e2d02009-05-03 12:59:50 +0000100}
Anton Korobeynikov75b685d2009-05-03 13:02:39 +0000101
Anton Korobeynikov4c88f112009-05-03 13:06:03 +0000102let canFoldAsLoad = 1, isReMaterializable = 1, mayHaveSideEffects = 1 in {
103def MOV8rm : Pseudo<(outs GR8:$dst), (ins memsrc:$src),
104 "mov.b\t{$src, $dst|$dst, $src}",
105 [(set GR8:$dst, (load addr:$src))]>;
106def MOV16rm : Pseudo<(outs GR16:$dst), (ins memsrc:$src),
107 "mov.w\t{$src, $dst|$dst, $src}",
108 [(set GR16:$dst, (load addr:$src))]>;
109}
110
111def MOVZX16rr8 : Pseudo<(outs GR16:$dst), (ins GR8:$src),
112 "mov.b\t{$src, $dst|$dst, $src}",
113 [(set GR16:$dst, (zext GR8:$src))]>;
114def MOVZX16rm8 : Pseudo<(outs GR16:$dst), (ins memsrc:$src),
115 "mov.b\t{$src, $dst|$dst, $src}",
116 [(set GR16:$dst, (zextloadi16i8 addr:$src))]>;
117
Anton Korobeynikov7aefbb32009-05-03 13:06:26 +0000118def MOV8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
119 "mov.b\t{$src, $dst|$dst, $src}",
120 [(store (i8 imm:$src), addr:$dst)]>;
121def MOV16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
122 "mov.w\t{$src, $dst|$dst, $src}",
123 [(store (i16 imm:$src), addr:$dst)]>;
124
125def MOV8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
126 "mov.b\t{$src, $dst|$dst, $src}",
127 [(store GR8:$src, addr:$dst)]>;
128def MOV16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
129 "mov.w\t{$src, $dst|$dst, $src}",
130 [(store GR16:$src, addr:$dst)]>;
131
Anton Korobeynikov75b685d2009-05-03 13:02:39 +0000132//===----------------------------------------------------------------------===//
133// Arithmetic Instructions
134
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000135let isTwoAddress = 1 in {
Anton Korobeynikov75b685d2009-05-03 13:02:39 +0000136
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000137let Defs = [SRW] in {
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000138
139let isCommutable = 1 in { // X = ADD Y, Z == X = ADD Z, Y
Anton Korobeynikov75b685d2009-05-03 13:02:39 +0000140// FIXME: Provide proper encoding!
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000141def ADD8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
142 "add.b\t{$src2, $dst|$dst, $src2}",
143 [(set GR8:$dst, (add GR8:$src1, GR8:$src2)),
144 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000145def ADD16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
146 "add.w\t{$src2, $dst|$dst, $src2}",
147 [(set GR16:$dst, (add GR16:$src1, GR16:$src2)),
148 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000149}
150
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000151def ADD8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
152 "add.b\t{$src2, $dst|$dst, $src2}",
153 [(set GR8:$dst, (add GR8:$src1, (load addr:$src2))),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000154 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000155def ADD16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
156 "add.w\t{$src2, $dst|$dst, $src2}",
157 [(set GR16:$dst, (add GR16:$src1, (load addr:$src2))),
158 (implicit SRW)]>;
159
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000160def ADD8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
161 "add.b\t{$src2, $dst|$dst, $src2}",
162 [(set GR8:$dst, (add GR8:$src1, imm:$src2)),
163 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000164def ADD16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
165 "add.w\t{$src2, $dst|$dst, $src2}",
166 [(set GR16:$dst, (add GR16:$src1, imm:$src2)),
167 (implicit SRW)]>;
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000168
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000169let isTwoAddress = 0 in {
170def ADD8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
171 "add.b\t{$src, $dst|$dst, $src}",
172 [(store (add (load addr:$dst), GR8:$src), addr:$dst),
173 (implicit SRW)]>;
174def ADD16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
175 "add.w\t{$src, $dst|$dst, $src}",
176 [(store (add (load addr:$dst), GR16:$src), addr:$dst),
177 (implicit SRW)]>;
178
179def ADD8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
180 "add.b\t{$src, $dst|$dst, $src}",
181 [(store (add (load addr:$dst), (i8 imm:$src)), addr:$dst),
182 (implicit SRW)]>;
183def ADD16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
184 "add.w\t{$src, $dst|$dst, $src}",
185 [(store (add (load addr:$dst), (i16 imm:$src)), addr:$dst),
186 (implicit SRW)]>;
187
188def ADD8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
189 "add.b\t{$src, $dst|$dst, $src}",
190 [(store (add (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
191 (implicit SRW)]>;
192def ADD16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
193 "add.w\t{$src, $dst|$dst, $src}",
194 [(store (add (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
195 (implicit SRW)]>;
196}
197
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000198let Uses = [SRW] in {
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000199
200let isCommutable = 1 in { // X = ADDC Y, Z == X = ADDC Z, Y
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000201def ADC8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
202 "addc.b\t{$src2, $dst|$dst, $src2}",
203 [(set GR8:$dst, (adde GR8:$src1, GR8:$src2)),
204 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000205def ADC16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
206 "addc.w\t{$src2, $dst|$dst, $src2}",
207 [(set GR16:$dst, (adde GR16:$src1, GR16:$src2)),
208 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000209} // isCommutable
210
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000211def ADC8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
212 "addc.b\t{$src2, $dst|$dst, $src2}",
213 [(set GR8:$dst, (adde GR8:$src1, imm:$src2)),
214 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000215def ADC16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
216 "addc.w\t{$src2, $dst|$dst, $src2}",
217 [(set GR16:$dst, (adde GR16:$src1, imm:$src2)),
218 (implicit SRW)]>;
219
220def ADC8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
221 "addc.b\t{$src2, $dst|$dst, $src2}",
222 [(set GR8:$dst, (adde GR8:$src1, (load addr:$src2))),
223 (implicit SRW)]>;
224def ADC16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
225 "addc.w\t{$src2, $dst|$dst, $src2}",
226 [(set GR16:$dst, (adde GR16:$src1, (load addr:$src2))),
227 (implicit SRW)]>;
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000228
229let isTwoAddress = 0 in {
230def ADC8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
231 "addc.b\t{$src, $dst|$dst, $src}",
232 [(store (adde (load addr:$dst), GR8:$src), addr:$dst),
233 (implicit SRW)]>;
234def ADC16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
235 "addc.w\t{$src, $dst|$dst, $src}",
236 [(store (adde (load addr:$dst), GR16:$src), addr:$dst),
237 (implicit SRW)]>;
238
239def ADC8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
240 "addc.b\t{$src, $dst|$dst, $src}",
241 [(store (adde (load addr:$dst), (i8 imm:$src)), addr:$dst),
242 (implicit SRW)]>;
243def ADC16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
244 "addc.w\t{$src, $dst|$dst, $src}",
245 [(store (adde (load addr:$dst), (i16 imm:$src)), addr:$dst),
246 (implicit SRW)]>;
247
248def ADC8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
249 "addc.b\t{$src, $dst|$dst, $src}",
250 [(store (adde (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
251 (implicit SRW)]>;
252def ADC16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
253 "addc.w\t{$src, $dst|$dst, $src}",
254 [(store (adde (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
255 (implicit SRW)]>;
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000256}
257
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000258} // Uses = [SRW]
259
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000260let isCommutable = 1 in { // X = AND Y, Z == X = AND Z, Y
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000261def AND8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
262 "and.b\t{$src2, $dst|$dst, $src2}",
263 [(set GR8:$dst, (and GR8:$src1, GR8:$src2)),
264 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000265def AND16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
266 "and.w\t{$src2, $dst|$dst, $src2}",
267 [(set GR16:$dst, (and GR16:$src1, GR16:$src2)),
268 (implicit SRW)]>;
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000269}
270
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000271def AND8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
272 "and.b\t{$src2, $dst|$dst, $src2}",
273 [(set GR8:$dst, (and GR8:$src1, imm:$src2)),
274 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000275def AND16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
276 "and.w\t{$src2, $dst|$dst, $src2}",
277 [(set GR16:$dst, (and GR16:$src1, imm:$src2)),
278 (implicit SRW)]>;
279
280def AND8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
281 "and.b\t{$src2, $dst|$dst, $src2}",
282 [(set GR8:$dst, (and GR8:$src1, (load addr:$src2))),
283 (implicit SRW)]>;
284def AND16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
285 "and.w\t{$src2, $dst|$dst, $src2}",
286 [(set GR16:$dst, (and GR16:$src1, (load addr:$src2))),
287 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000288
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000289let isTwoAddress = 0 in {
290def AND8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
291 "and.b\t{$src, $dst|$dst, $src}",
292 [(store (and (load addr:$dst), GR8:$src), addr:$dst),
293 (implicit SRW)]>;
294def AND16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
295 "and.w\t{$src, $dst|$dst, $src}",
296 [(store (and (load addr:$dst), GR16:$src), addr:$dst),
297 (implicit SRW)]>;
298
299def AND8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
300 "and.b\t{$src, $dst|$dst, $src}",
301 [(store (and (load addr:$dst), (i8 imm:$src)), addr:$dst),
302 (implicit SRW)]>;
303def AND16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
304 "and.w\t{$src, $dst|$dst, $src}",
305 [(store (and (load addr:$dst), (i16 imm:$src)), addr:$dst),
306 (implicit SRW)]>;
307
308def AND8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
309 "and.b\t{$src, $dst|$dst, $src}",
310 [(store (and (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
311 (implicit SRW)]>;
312def AND16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
313 "and.w\t{$src, $dst|$dst, $src}",
314 [(store (and (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
315 (implicit SRW)]>;
316}
317
318
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000319let isCommutable = 1 in { // X = XOR Y, Z == X = XOR Z, Y
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000320def XOR8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
321 "xor.b\t{$src2, $dst|$dst, $src2}",
322 [(set GR8:$dst, (xor GR8:$src1, GR8:$src2)),
323 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000324def XOR16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
325 "xor.w\t{$src2, $dst|$dst, $src2}",
326 [(set GR16:$dst, (xor GR16:$src1, GR16:$src2)),
327 (implicit SRW)]>;
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000328}
329
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000330def XOR8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
331 "xor.b\t{$src2, $dst|$dst, $src2}",
332 [(set GR8:$dst, (xor GR8:$src1, imm:$src2)),
333 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000334def XOR16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
335 "xor.w\t{$src2, $dst|$dst, $src2}",
336 [(set GR16:$dst, (xor GR16:$src1, imm:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000337 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000338
339def XOR8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
340 "xor.b\t{$src2, $dst|$dst, $src2}",
341 [(set GR8:$dst, (xor GR8:$src1, (load addr:$src2))),
342 (implicit SRW)]>;
343def XOR16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
344 "xor.w\t{$src2, $dst|$dst, $src2}",
345 [(set GR16:$dst, (xor GR16:$src1, (load addr:$src2))),
346 (implicit SRW)]>;
347
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000348let isTwoAddress = 0 in {
349def XOR8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
350 "xor.b\t{$src, $dst|$dst, $src}",
351 [(store (xor (load addr:$dst), GR8:$src), addr:$dst),
352 (implicit SRW)]>;
353def XOR16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
354 "xor.w\t{$src, $dst|$dst, $src}",
355 [(store (xor (load addr:$dst), GR16:$src), addr:$dst),
356 (implicit SRW)]>;
357
358def XOR8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
359 "xor.b\t{$src, $dst|$dst, $src}",
360 [(store (xor (load addr:$dst), (i8 imm:$src)), addr:$dst),
361 (implicit SRW)]>;
362def XOR16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
363 "xor.w\t{$src, $dst|$dst, $src}",
364 [(store (xor (load addr:$dst), (i16 imm:$src)), addr:$dst),
365 (implicit SRW)]>;
366
367def XOR8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
368 "xor.b\t{$src, $dst|$dst, $src}",
369 [(store (xor (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
370 (implicit SRW)]>;
371def XOR16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
372 "xor.w\t{$src, $dst|$dst, $src}",
373 [(store (xor (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
374 (implicit SRW)]>;
375}
376
377
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000378def SUB8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
379 "sub.b\t{$src2, $dst|$dst, $src2}",
380 [(set GR8:$dst, (sub GR8:$src1, GR8:$src2)),
381 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000382def SUB16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000383 "sub.w\t{$src2, $dst|$dst, $src2}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000384 [(set GR16:$dst, (sub GR16:$src1, GR16:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000385 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000386
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000387def SUB8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
388 "sub.b\t{$src2, $dst|$dst, $src2}",
389 [(set GR8:$dst, (sub GR8:$src1, imm:$src2)),
390 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000391def SUB16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
392 "sub.w\t{$src2, $dst|$dst, $src2}",
393 [(set GR16:$dst, (sub GR16:$src1, imm:$src2)),
394 (implicit SRW)]>;
395
396def SUB8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
397 "sub.b\t{$src2, $dst|$dst, $src2}",
398 [(set GR8:$dst, (sub GR8:$src1, (load addr:$src2))),
399 (implicit SRW)]>;
400def SUB16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
401 "sub.w\t{$src2, $dst|$dst, $src2}",
402 [(set GR16:$dst, (sub GR16:$src1, (load addr:$src2))),
403 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000404
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000405let isTwoAddress = 0 in {
406def SUB8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
407 "sub.b\t{$src, $dst|$dst, $src}",
408 [(store (sub (load addr:$dst), GR8:$src), addr:$dst),
409 (implicit SRW)]>;
410def SUB16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
411 "sub.w\t{$src, $dst|$dst, $src}",
412 [(store (sub (load addr:$dst), GR16:$src), addr:$dst),
413 (implicit SRW)]>;
414
415def SUB8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
416 "sub.b\t{$src, $dst|$dst, $src}",
417 [(store (sub (load addr:$dst), (i8 imm:$src)), addr:$dst),
418 (implicit SRW)]>;
419def SUB16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
420 "sub.w\t{$src, $dst|$dst, $src}",
421 [(store (sub (load addr:$dst), (i16 imm:$src)), addr:$dst),
422 (implicit SRW)]>;
423
424def SUB8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
425 "sub.b\t{$src, $dst|$dst, $src}",
426 [(store (sub (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
427 (implicit SRW)]>;
428def SUB16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
429 "sub.w\t{$src, $dst|$dst, $src}",
430 [(store (sub (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
431 (implicit SRW)]>;
432}
433
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000434let Uses = [SRW] in {
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000435def SBC8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
436 "subc.b\t{$src2, $dst|$dst, $src2}",
437 [(set GR8:$dst, (sube GR8:$src1, GR8:$src2)),
438 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000439def SBC16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
440 "subc.w\t{$src2, $dst|$dst, $src2}",
441 [(set GR16:$dst, (sube GR16:$src1, GR16:$src2)),
442 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000443
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000444def SBC8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
445 "subc.b\t{$src2, $dst|$dst, $src2}",
446 [(set GR8:$dst, (sube GR8:$src1, imm:$src2)),
447 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000448def SBC16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
449 "subc.w\t{$src2, $dst|$dst, $src2}",
450 [(set GR16:$dst, (sube GR16:$src1, imm:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000451 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000452
453def SBC8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000454 "subc.b\t{$src2, $dst|$dst, $src2}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000455 [(set GR8:$dst, (sube GR8:$src1, (load addr:$src2))),
456 (implicit SRW)]>;
457def SBC16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
458 "subc.w\t{$src2, $dst|$dst, $src2}",
459 [(set GR16:$dst, (sube GR16:$src1, (load addr:$src2))),
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000460 (implicit SRW)]>;
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000461
462let isTwoAddress = 0 in {
463def SBC8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
464 "subc.b\t{$src, $dst|$dst, $src}",
465 [(store (sube (load addr:$dst), GR8:$src), addr:$dst),
466 (implicit SRW)]>;
467def SBC16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
468 "subc.w\t{$src, $dst|$dst, $src}",
469 [(store (sube (load addr:$dst), GR16:$src), addr:$dst),
470 (implicit SRW)]>;
471
472def SBC8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
473 "subc.b\t{$src, $dst|$dst, $src}",
474 [(store (sube (load addr:$dst), (i8 imm:$src)), addr:$dst),
475 (implicit SRW)]>;
476def SBC16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
477 "subc.w\t{$src, $dst|$dst, $src}",
478 [(store (sube (load addr:$dst), (i16 imm:$src)), addr:$dst),
479 (implicit SRW)]>;
480
481def SBC8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
482 "subc.b\t{$src, $dst|$dst, $src}",
483 [(store (sube (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
484 (implicit SRW)]>;
485def SBC16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
486 "subc.w\t{$src, $dst|$dst, $src}",
487 [(store (sube (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
488 (implicit SRW)]>;
Anton Korobeynikov75b685d2009-05-03 13:02:39 +0000489}
Anton Korobeynikov184a31c2009-05-03 13:03:33 +0000490
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000491} // Uses = [SRW]
492
Anton Korobeynikov184a31c2009-05-03 13:03:33 +0000493// FIXME: Provide proper encoding!
Anton Korobeynikov184a31c2009-05-03 13:03:33 +0000494def SAR16r1 : Pseudo<(outs GR16:$dst), (ins GR16:$src),
495 "rra.w\t$dst",
496 [(set GR16:$dst, (MSP430rra GR16:$src)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000497 (implicit SRW)]>;
498
499def SEXT16r : Pseudo<(outs GR16:$dst), (ins GR16:$src),
500 "sxt\t$dst",
501 [(set GR16:$dst, (sext_inreg GR16:$src, i8)),
502 (implicit SRW)]>;
503
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000504//def SEXT16r : Pseudo<(outs GR16:$dst), (ins GR16:$src),
505// "sxt\t$dst",
506// [(set GR16:$dst, (sext_inreg GR16:$src, i8)),
507// (implicit SRW)]>;
508
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000509} // Defs = [SRW]
Anton Korobeynikovf6ea9e92009-05-03 13:05:00 +0000510
511let isCommutable = 1 in { // X = OR Y, Z == X = OR Z, Y
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000512def OR8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
513 "bis.b\t{$src2, $dst|$dst, $src2}",
514 [(set GR8:$dst, (or GR8:$src1, GR8:$src2))]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000515def OR16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
516 "bis.w\t{$src2, $dst|$dst, $src2}",
517 [(set GR16:$dst, (or GR16:$src1, GR16:$src2))]>;
Anton Korobeynikovf6ea9e92009-05-03 13:05:00 +0000518}
519
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000520def OR8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
521 "bis.b\t{$src2, $dst|$dst, $src2}",
522 [(set GR8:$dst, (or GR8:$src1, imm:$src2))]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000523def OR16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
524 "bis.w\t{$src2, $dst|$dst, $src2}",
525 [(set GR16:$dst, (or GR16:$src1, imm:$src2))]>;
Anton Korobeynikovf6ea9e92009-05-03 13:05:00 +0000526
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000527def OR8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
528 "bis.b\t{$src2, $dst|$dst, $src2}",
529 [(set GR8:$dst, (or GR8:$src1, (load addr:$src2)))]>;
530def OR16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
531 "bis.w\t{$src2, $dst|$dst, $src2}",
532 [(set GR16:$dst, (or GR16:$src1, (load addr:$src2)))]>;
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000533
534let isTwoAddress = 0 in {
535def OR8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
536 "bis.b\t{$src, $dst|$dst, $src}",
537 [(store (or (load addr:$dst), GR8:$src), addr:$dst),
538 (implicit SRW)]>;
539def OR16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
540 "bis.w\t{$src, $dst|$dst, $src}",
541 [(store (or (load addr:$dst), GR16:$src), addr:$dst),
542 (implicit SRW)]>;
543
544def OR8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
545 "bis.b\t{$src, $dst|$dst, $src}",
546 [(store (or (load addr:$dst), (i8 imm:$src)), addr:$dst),
547 (implicit SRW)]>;
548def OR16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
549 "bis.w\t{$src, $dst|$dst, $src}",
550 [(store (or (load addr:$dst), (i16 imm:$src)), addr:$dst),
551 (implicit SRW)]>;
552
553def OR8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
554 "bis.b\t{$src, $dst|$dst, $src}",
555 [(store (or (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
556 (implicit SRW)]>;
557def OR16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
558 "bis.w\t{$src, $dst|$dst, $src}",
559 [(store (or (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
560 (implicit SRW)]>;
561}
562
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000563} // isTwoAddress = 1
Anton Korobeynikov4c88f112009-05-03 13:06:03 +0000564
565//===----------------------------------------------------------------------===//
566// Non-Instruction Patterns
567
568// extload
569def : Pat<(extloadi16i8 addr:$src), (MOVZX16rm8 addr:$src)>;
Anton Korobeynikov7aefbb32009-05-03 13:06:26 +0000570
571// truncs
572def : Pat<(i8 (trunc GR16:$src)),
573 (EXTRACT_SUBREG GR16:$src, subreg_8bit)>;