blob: 5d3566df5ff9c55217cd61011918f8fedd78c892 [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 Korobeynikov33b85092009-05-03 13:07:54 +000025def SDT_MSP430Call : SDTypeProfile<0, -1, [SDTCisVT<0, iPTR>]>;
26def SDT_MSP430CallSeqStart : SDCallSeqStart<[SDTCisVT<0, i16>]>;
27def SDT_MSP430CallSeqEnd : SDCallSeqEnd<[SDTCisVT<0, i16>, SDTCisVT<1, i16>]>;
Anton Korobeynikov37171572009-05-03 12:57:15 +000028
29//===----------------------------------------------------------------------===//
30// MSP430 Specific Node Definitions.
31//===----------------------------------------------------------------------===//
Anton Korobeynikov184a31c2009-05-03 13:03:33 +000032def MSP430retflag : SDNode<"MSP430ISD::RET_FLAG", SDTNone,
Anton Korobeynikov725e2d02009-05-03 12:59:50 +000033 [SDNPHasChain, SDNPOptInFlag]>;
Anton Korobeynikov37171572009-05-03 12:57:15 +000034
Anton Korobeynikov184a31c2009-05-03 13:03:33 +000035def MSP430rra : SDNode<"MSP430ISD::RRA", SDTIntUnaryOp, []>;
36
Anton Korobeynikov7feedc82009-05-03 13:07:31 +000037def MSP430call : SDNode<"MSP430ISD::CALL", SDT_MSP430Call,
38 [SDNPHasChain, SDNPOutFlag, SDNPOptInFlag]>;
Anton Korobeynikov33b85092009-05-03 13:07:54 +000039def MSP430callseq_start :
40 SDNode<"ISD::CALLSEQ_START", SDT_MSP430CallSeqStart,
41 [SDNPHasChain, SDNPOutFlag]>;
42def MSP430callseq_end :
43 SDNode<"ISD::CALLSEQ_END", SDT_MSP430CallSeqEnd,
44 [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>;
Anton Korobeynikov7feedc82009-05-03 13:07:31 +000045
Anton Korobeynikov37171572009-05-03 12:57:15 +000046//===----------------------------------------------------------------------===//
Anton Korobeynikov4c88f112009-05-03 13:06:03 +000047// MSP430 Operand Definitions.
Anton Korobeynikov37171572009-05-03 12:57:15 +000048//===----------------------------------------------------------------------===//
49
Anton Korobeynikov7aefbb32009-05-03 13:06:26 +000050// Address operands
Anton Korobeynikov4c88f112009-05-03 13:06:03 +000051def memsrc : Operand<i16> {
52 let PrintMethod = "printSrcMemOperand";
53 let MIOperandInfo = (ops i16imm, GR16);
54}
55
Anton Korobeynikov7aefbb32009-05-03 13:06:26 +000056def memdst : Operand<i16> {
57 let PrintMethod = "printSrcMemOperand";
58 let MIOperandInfo = (ops i16imm, GR16);
59}
60
Anton Korobeynikov4c88f112009-05-03 13:06:03 +000061
62//===----------------------------------------------------------------------===//
63// MSP430 Complex Pattern Definitions.
64//===----------------------------------------------------------------------===//
65
66def addr : ComplexPattern<iPTR, 2, "SelectAddr", [], []>;
67
68//===----------------------------------------------------------------------===//
69// Pattern Fragments
70def zextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (zextloadi8 node:$ptr))>;
71def extloadi16i8 : PatFrag<(ops node:$ptr), (i16 ( extloadi8 node:$ptr))>;
72
73//===----------------------------------------------------------------------===//
Anton Korobeynikov33b85092009-05-03 13:07:54 +000074// Instruction list..
75
76// ADJCALLSTACKDOWN/UP implicitly use/def SP because they may be expanded into
77// a stack adjustment and the codegen must know that they may modify the stack
78// pointer before prolog-epilog rewriting occurs.
79// Pessimistically assume ADJCALLSTACKDOWN / ADJCALLSTACKUP will become
80// sub / add which can clobber SRW.
81let Defs = [SPW, SRW], Uses = [SPW] in {
82def ADJCALLSTACKDOWN : Pseudo<(outs), (ins i16imm:$amt),
83 "#ADJCALLSTACKDOWN",
84 [(MSP430callseq_start timm:$amt)]>;
85def ADJCALLSTACKUP : Pseudo<(outs), (ins i16imm:$amt1, i16imm:$amt2),
86 "#ADJCALLSTACKUP",
87 [(MSP430callseq_end timm:$amt1, timm:$amt2)]>;
88}
89
Anton Korobeynikov4c88f112009-05-03 13:06:03 +000090
Anton Korobeynikov57322972009-05-03 13:04:23 +000091let neverHasSideEffects = 1 in
Anton Korobeynikov37171572009-05-03 12:57:15 +000092def NOP : Pseudo<(outs), (ins), "nop", []>;
Anton Korobeynikov725e2d02009-05-03 12:59:50 +000093
Anton Korobeynikov725e2d02009-05-03 12:59:50 +000094// FIXME: Provide proper encoding!
95let isReturn = 1, isTerminator = 1 in {
Anton Korobeynikov33b85092009-05-03 13:07:54 +000096 def RET : Pseudo<(outs), (ins), "ret", [(MSP430retflag)]>;
Anton Korobeynikovf1fb8c72009-05-03 13:02:04 +000097}
98
99//===----------------------------------------------------------------------===//
Anton Korobeynikov33b85092009-05-03 13:07:54 +0000100// Call Instructions...
101//
102let isCall = 1 in
103 // All calls clobber the non-callee saved registers. SPW is marked as
104 // a use to prevent stack-pointer assignments that appear immediately
105 // before calls from potentially appearing dead. Uses for argument
106 // registers are added manually.
107 let Defs = [R12W, R13W, R14W, R15W, SRW],
108 Uses = [SPW] in {
Anton Korobeynikove60685a2009-05-03 13:08:13 +0000109 def CALLi : Pseudo<(outs), (ins i16imm:$dst, variable_ops),
110 "call\t${dst:call}", [(MSP430call imm:$dst)]>;
111 def CALLr : Pseudo<(outs), (ins GR16:$dst, variable_ops),
112 "call\t$dst", [(MSP430call GR16:$dst)]>;
113 def CALLm : Pseudo<(outs), (ins memsrc:$dst, variable_ops),
114 "call\t${dst:mem}", [(MSP430call (load addr:$dst))]>;
Anton Korobeynikov33b85092009-05-03 13:07:54 +0000115 }
116
117
118//===----------------------------------------------------------------------===//
Anton Korobeynikovf1fb8c72009-05-03 13:02:04 +0000119// Move Instructions
120
121// FIXME: Provide proper encoding!
122let neverHasSideEffects = 1 in {
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000123def MOV8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src),
124 "mov.b\t{$src, $dst|$dst, $src}",
125 []>;
Anton Korobeynikov4c88f112009-05-03 13:06:03 +0000126def MOV16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src),
127 "mov.w\t{$src, $dst|$dst, $src}",
128 []>;
Anton Korobeynikovf1fb8c72009-05-03 13:02:04 +0000129}
130
131// FIXME: Provide proper encoding!
132let isReMaterializable = 1, isAsCheapAsAMove = 1 in {
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000133def MOV8ri : Pseudo<(outs GR8:$dst), (ins i8imm:$src),
134 "mov.b\t{$src, $dst|$dst, $src}",
135 [(set GR8:$dst, imm:$src)]>;
Anton Korobeynikov4c88f112009-05-03 13:06:03 +0000136def MOV16ri : Pseudo<(outs GR16:$dst), (ins i16imm:$src),
137 "mov.w\t{$src, $dst|$dst, $src}",
138 [(set GR16:$dst, imm:$src)]>;
Anton Korobeynikov725e2d02009-05-03 12:59:50 +0000139}
Anton Korobeynikov75b685d2009-05-03 13:02:39 +0000140
Anton Korobeynikov4c88f112009-05-03 13:06:03 +0000141let canFoldAsLoad = 1, isReMaterializable = 1, mayHaveSideEffects = 1 in {
142def MOV8rm : Pseudo<(outs GR8:$dst), (ins memsrc:$src),
143 "mov.b\t{$src, $dst|$dst, $src}",
144 [(set GR8:$dst, (load addr:$src))]>;
145def MOV16rm : Pseudo<(outs GR16:$dst), (ins memsrc:$src),
146 "mov.w\t{$src, $dst|$dst, $src}",
147 [(set GR16:$dst, (load addr:$src))]>;
148}
149
150def MOVZX16rr8 : Pseudo<(outs GR16:$dst), (ins GR8:$src),
151 "mov.b\t{$src, $dst|$dst, $src}",
152 [(set GR16:$dst, (zext GR8:$src))]>;
153def MOVZX16rm8 : Pseudo<(outs GR16:$dst), (ins memsrc:$src),
154 "mov.b\t{$src, $dst|$dst, $src}",
155 [(set GR16:$dst, (zextloadi16i8 addr:$src))]>;
156
Anton Korobeynikov7aefbb32009-05-03 13:06:26 +0000157def MOV8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
158 "mov.b\t{$src, $dst|$dst, $src}",
159 [(store (i8 imm:$src), addr:$dst)]>;
160def MOV16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
161 "mov.w\t{$src, $dst|$dst, $src}",
162 [(store (i16 imm:$src), addr:$dst)]>;
163
164def MOV8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
165 "mov.b\t{$src, $dst|$dst, $src}",
166 [(store GR8:$src, addr:$dst)]>;
167def MOV16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
168 "mov.w\t{$src, $dst|$dst, $src}",
169 [(store GR16:$src, addr:$dst)]>;
170
Anton Korobeynikov75b685d2009-05-03 13:02:39 +0000171//===----------------------------------------------------------------------===//
172// Arithmetic Instructions
173
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000174let isTwoAddress = 1 in {
Anton Korobeynikov75b685d2009-05-03 13:02:39 +0000175
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000176let Defs = [SRW] in {
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000177
178let isCommutable = 1 in { // X = ADD Y, Z == X = ADD Z, Y
Anton Korobeynikov75b685d2009-05-03 13:02:39 +0000179// FIXME: Provide proper encoding!
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000180def ADD8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
181 "add.b\t{$src2, $dst|$dst, $src2}",
182 [(set GR8:$dst, (add GR8:$src1, GR8:$src2)),
183 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000184def ADD16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
185 "add.w\t{$src2, $dst|$dst, $src2}",
186 [(set GR16:$dst, (add GR16:$src1, GR16:$src2)),
187 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000188}
189
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000190def ADD8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
191 "add.b\t{$src2, $dst|$dst, $src2}",
192 [(set GR8:$dst, (add GR8:$src1, (load addr:$src2))),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000193 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000194def ADD16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
195 "add.w\t{$src2, $dst|$dst, $src2}",
196 [(set GR16:$dst, (add GR16:$src1, (load addr:$src2))),
197 (implicit SRW)]>;
198
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000199def ADD8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
200 "add.b\t{$src2, $dst|$dst, $src2}",
201 [(set GR8:$dst, (add GR8:$src1, imm:$src2)),
202 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000203def ADD16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
204 "add.w\t{$src2, $dst|$dst, $src2}",
205 [(set GR16:$dst, (add GR16:$src1, imm:$src2)),
206 (implicit SRW)]>;
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000207
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000208let isTwoAddress = 0 in {
209def ADD8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
210 "add.b\t{$src, $dst|$dst, $src}",
211 [(store (add (load addr:$dst), GR8:$src), addr:$dst),
212 (implicit SRW)]>;
213def ADD16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
214 "add.w\t{$src, $dst|$dst, $src}",
215 [(store (add (load addr:$dst), GR16:$src), addr:$dst),
216 (implicit SRW)]>;
217
218def ADD8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
219 "add.b\t{$src, $dst|$dst, $src}",
220 [(store (add (load addr:$dst), (i8 imm:$src)), addr:$dst),
221 (implicit SRW)]>;
222def ADD16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
223 "add.w\t{$src, $dst|$dst, $src}",
224 [(store (add (load addr:$dst), (i16 imm:$src)), addr:$dst),
225 (implicit SRW)]>;
226
227def ADD8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
228 "add.b\t{$src, $dst|$dst, $src}",
229 [(store (add (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
230 (implicit SRW)]>;
231def ADD16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
232 "add.w\t{$src, $dst|$dst, $src}",
233 [(store (add (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
234 (implicit SRW)]>;
235}
236
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000237let Uses = [SRW] in {
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000238
239let isCommutable = 1 in { // X = ADDC Y, Z == X = ADDC Z, Y
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000240def ADC8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
241 "addc.b\t{$src2, $dst|$dst, $src2}",
242 [(set GR8:$dst, (adde GR8:$src1, GR8:$src2)),
243 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000244def ADC16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
245 "addc.w\t{$src2, $dst|$dst, $src2}",
246 [(set GR16:$dst, (adde GR16:$src1, GR16:$src2)),
247 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000248} // isCommutable
249
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000250def ADC8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
251 "addc.b\t{$src2, $dst|$dst, $src2}",
252 [(set GR8:$dst, (adde GR8:$src1, imm:$src2)),
253 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000254def ADC16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
255 "addc.w\t{$src2, $dst|$dst, $src2}",
256 [(set GR16:$dst, (adde GR16:$src1, imm:$src2)),
257 (implicit SRW)]>;
258
259def ADC8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
260 "addc.b\t{$src2, $dst|$dst, $src2}",
261 [(set GR8:$dst, (adde GR8:$src1, (load addr:$src2))),
262 (implicit SRW)]>;
263def ADC16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
264 "addc.w\t{$src2, $dst|$dst, $src2}",
265 [(set GR16:$dst, (adde GR16:$src1, (load addr:$src2))),
266 (implicit SRW)]>;
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000267
268let isTwoAddress = 0 in {
269def ADC8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
270 "addc.b\t{$src, $dst|$dst, $src}",
271 [(store (adde (load addr:$dst), GR8:$src), addr:$dst),
272 (implicit SRW)]>;
273def ADC16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
274 "addc.w\t{$src, $dst|$dst, $src}",
275 [(store (adde (load addr:$dst), GR16:$src), addr:$dst),
276 (implicit SRW)]>;
277
278def ADC8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
279 "addc.b\t{$src, $dst|$dst, $src}",
280 [(store (adde (load addr:$dst), (i8 imm:$src)), addr:$dst),
281 (implicit SRW)]>;
282def ADC16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
283 "addc.w\t{$src, $dst|$dst, $src}",
284 [(store (adde (load addr:$dst), (i16 imm:$src)), addr:$dst),
285 (implicit SRW)]>;
286
287def ADC8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
288 "addc.b\t{$src, $dst|$dst, $src}",
289 [(store (adde (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
290 (implicit SRW)]>;
291def ADC16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
292 "addc.w\t{$src, $dst|$dst, $src}",
293 [(store (adde (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
294 (implicit SRW)]>;
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000295}
296
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000297} // Uses = [SRW]
298
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000299let isCommutable = 1 in { // X = AND Y, Z == X = AND Z, Y
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000300def AND8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
301 "and.b\t{$src2, $dst|$dst, $src2}",
302 [(set GR8:$dst, (and GR8:$src1, GR8:$src2)),
303 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000304def AND16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
305 "and.w\t{$src2, $dst|$dst, $src2}",
306 [(set GR16:$dst, (and GR16:$src1, GR16:$src2)),
307 (implicit SRW)]>;
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000308}
309
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000310def AND8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
311 "and.b\t{$src2, $dst|$dst, $src2}",
312 [(set GR8:$dst, (and GR8:$src1, imm:$src2)),
313 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000314def AND16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
315 "and.w\t{$src2, $dst|$dst, $src2}",
316 [(set GR16:$dst, (and GR16:$src1, imm:$src2)),
317 (implicit SRW)]>;
318
319def AND8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
320 "and.b\t{$src2, $dst|$dst, $src2}",
321 [(set GR8:$dst, (and GR8:$src1, (load addr:$src2))),
322 (implicit SRW)]>;
323def AND16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
324 "and.w\t{$src2, $dst|$dst, $src2}",
325 [(set GR16:$dst, (and GR16:$src1, (load addr:$src2))),
326 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000327
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000328let isTwoAddress = 0 in {
329def AND8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
330 "and.b\t{$src, $dst|$dst, $src}",
331 [(store (and (load addr:$dst), GR8:$src), addr:$dst),
332 (implicit SRW)]>;
333def AND16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
334 "and.w\t{$src, $dst|$dst, $src}",
335 [(store (and (load addr:$dst), GR16:$src), addr:$dst),
336 (implicit SRW)]>;
337
338def AND8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
339 "and.b\t{$src, $dst|$dst, $src}",
340 [(store (and (load addr:$dst), (i8 imm:$src)), addr:$dst),
341 (implicit SRW)]>;
342def AND16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
343 "and.w\t{$src, $dst|$dst, $src}",
344 [(store (and (load addr:$dst), (i16 imm:$src)), addr:$dst),
345 (implicit SRW)]>;
346
347def AND8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
348 "and.b\t{$src, $dst|$dst, $src}",
349 [(store (and (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
350 (implicit SRW)]>;
351def AND16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
352 "and.w\t{$src, $dst|$dst, $src}",
353 [(store (and (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
354 (implicit SRW)]>;
355}
356
357
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000358let isCommutable = 1 in { // X = XOR Y, Z == X = XOR Z, Y
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000359def XOR8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
360 "xor.b\t{$src2, $dst|$dst, $src2}",
361 [(set GR8:$dst, (xor GR8:$src1, GR8:$src2)),
362 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000363def XOR16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
364 "xor.w\t{$src2, $dst|$dst, $src2}",
365 [(set GR16:$dst, (xor GR16:$src1, GR16:$src2)),
366 (implicit SRW)]>;
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000367}
368
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000369def XOR8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
370 "xor.b\t{$src2, $dst|$dst, $src2}",
371 [(set GR8:$dst, (xor GR8:$src1, imm:$src2)),
372 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000373def XOR16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
374 "xor.w\t{$src2, $dst|$dst, $src2}",
375 [(set GR16:$dst, (xor GR16:$src1, imm:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000376 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000377
378def XOR8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
379 "xor.b\t{$src2, $dst|$dst, $src2}",
380 [(set GR8:$dst, (xor GR8:$src1, (load addr:$src2))),
381 (implicit SRW)]>;
382def XOR16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
383 "xor.w\t{$src2, $dst|$dst, $src2}",
384 [(set GR16:$dst, (xor GR16:$src1, (load addr:$src2))),
385 (implicit SRW)]>;
386
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000387let isTwoAddress = 0 in {
388def XOR8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
389 "xor.b\t{$src, $dst|$dst, $src}",
390 [(store (xor (load addr:$dst), GR8:$src), addr:$dst),
391 (implicit SRW)]>;
392def XOR16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
393 "xor.w\t{$src, $dst|$dst, $src}",
394 [(store (xor (load addr:$dst), GR16:$src), addr:$dst),
395 (implicit SRW)]>;
396
397def XOR8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
398 "xor.b\t{$src, $dst|$dst, $src}",
399 [(store (xor (load addr:$dst), (i8 imm:$src)), addr:$dst),
400 (implicit SRW)]>;
401def XOR16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
402 "xor.w\t{$src, $dst|$dst, $src}",
403 [(store (xor (load addr:$dst), (i16 imm:$src)), addr:$dst),
404 (implicit SRW)]>;
405
406def XOR8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
407 "xor.b\t{$src, $dst|$dst, $src}",
408 [(store (xor (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
409 (implicit SRW)]>;
410def XOR16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
411 "xor.w\t{$src, $dst|$dst, $src}",
412 [(store (xor (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
413 (implicit SRW)]>;
414}
415
416
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000417def SUB8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
418 "sub.b\t{$src2, $dst|$dst, $src2}",
419 [(set GR8:$dst, (sub GR8:$src1, GR8:$src2)),
420 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000421def SUB16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000422 "sub.w\t{$src2, $dst|$dst, $src2}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000423 [(set GR16:$dst, (sub GR16:$src1, GR16:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000424 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000425
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000426def SUB8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
427 "sub.b\t{$src2, $dst|$dst, $src2}",
428 [(set GR8:$dst, (sub GR8:$src1, imm:$src2)),
429 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000430def SUB16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
431 "sub.w\t{$src2, $dst|$dst, $src2}",
432 [(set GR16:$dst, (sub GR16:$src1, imm:$src2)),
433 (implicit SRW)]>;
434
435def SUB8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
436 "sub.b\t{$src2, $dst|$dst, $src2}",
437 [(set GR8:$dst, (sub GR8:$src1, (load addr:$src2))),
438 (implicit SRW)]>;
439def SUB16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
440 "sub.w\t{$src2, $dst|$dst, $src2}",
441 [(set GR16:$dst, (sub GR16:$src1, (load addr:$src2))),
442 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000443
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000444let isTwoAddress = 0 in {
445def SUB8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
446 "sub.b\t{$src, $dst|$dst, $src}",
447 [(store (sub (load addr:$dst), GR8:$src), addr:$dst),
448 (implicit SRW)]>;
449def SUB16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
450 "sub.w\t{$src, $dst|$dst, $src}",
451 [(store (sub (load addr:$dst), GR16:$src), addr:$dst),
452 (implicit SRW)]>;
453
454def SUB8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
455 "sub.b\t{$src, $dst|$dst, $src}",
456 [(store (sub (load addr:$dst), (i8 imm:$src)), addr:$dst),
457 (implicit SRW)]>;
458def SUB16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
459 "sub.w\t{$src, $dst|$dst, $src}",
460 [(store (sub (load addr:$dst), (i16 imm:$src)), addr:$dst),
461 (implicit SRW)]>;
462
463def SUB8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
464 "sub.b\t{$src, $dst|$dst, $src}",
465 [(store (sub (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
466 (implicit SRW)]>;
467def SUB16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
468 "sub.w\t{$src, $dst|$dst, $src}",
469 [(store (sub (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
470 (implicit SRW)]>;
471}
472
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000473let Uses = [SRW] in {
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000474def SBC8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
475 "subc.b\t{$src2, $dst|$dst, $src2}",
476 [(set GR8:$dst, (sube GR8:$src1, GR8:$src2)),
477 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000478def SBC16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
479 "subc.w\t{$src2, $dst|$dst, $src2}",
480 [(set GR16:$dst, (sube GR16:$src1, GR16:$src2)),
481 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000482
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000483def SBC8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
484 "subc.b\t{$src2, $dst|$dst, $src2}",
485 [(set GR8:$dst, (sube GR8:$src1, imm:$src2)),
486 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000487def SBC16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
488 "subc.w\t{$src2, $dst|$dst, $src2}",
489 [(set GR16:$dst, (sube GR16:$src1, imm:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000490 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000491
492def SBC8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000493 "subc.b\t{$src2, $dst|$dst, $src2}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000494 [(set GR8:$dst, (sube GR8:$src1, (load addr:$src2))),
495 (implicit SRW)]>;
496def SBC16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
497 "subc.w\t{$src2, $dst|$dst, $src2}",
498 [(set GR16:$dst, (sube GR16:$src1, (load addr:$src2))),
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000499 (implicit SRW)]>;
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000500
501let isTwoAddress = 0 in {
502def SBC8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
503 "subc.b\t{$src, $dst|$dst, $src}",
504 [(store (sube (load addr:$dst), GR8:$src), addr:$dst),
505 (implicit SRW)]>;
506def SBC16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
507 "subc.w\t{$src, $dst|$dst, $src}",
508 [(store (sube (load addr:$dst), GR16:$src), addr:$dst),
509 (implicit SRW)]>;
510
511def SBC8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
512 "subc.b\t{$src, $dst|$dst, $src}",
513 [(store (sube (load addr:$dst), (i8 imm:$src)), addr:$dst),
514 (implicit SRW)]>;
515def SBC16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
516 "subc.w\t{$src, $dst|$dst, $src}",
517 [(store (sube (load addr:$dst), (i16 imm:$src)), addr:$dst),
518 (implicit SRW)]>;
519
520def SBC8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
521 "subc.b\t{$src, $dst|$dst, $src}",
522 [(store (sube (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
523 (implicit SRW)]>;
524def SBC16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
525 "subc.w\t{$src, $dst|$dst, $src}",
526 [(store (sube (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
527 (implicit SRW)]>;
Anton Korobeynikov75b685d2009-05-03 13:02:39 +0000528}
Anton Korobeynikov184a31c2009-05-03 13:03:33 +0000529
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000530} // Uses = [SRW]
531
Anton Korobeynikov184a31c2009-05-03 13:03:33 +0000532// FIXME: Provide proper encoding!
Anton Korobeynikov184a31c2009-05-03 13:03:33 +0000533def SAR16r1 : Pseudo<(outs GR16:$dst), (ins GR16:$src),
534 "rra.w\t$dst",
535 [(set GR16:$dst, (MSP430rra GR16:$src)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000536 (implicit SRW)]>;
537
538def SEXT16r : Pseudo<(outs GR16:$dst), (ins GR16:$src),
539 "sxt\t$dst",
540 [(set GR16:$dst, (sext_inreg GR16:$src, i8)),
541 (implicit SRW)]>;
542
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000543//def SEXT16r : Pseudo<(outs GR16:$dst), (ins GR16:$src),
544// "sxt\t$dst",
545// [(set GR16:$dst, (sext_inreg GR16:$src, i8)),
546// (implicit SRW)]>;
547
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000548} // Defs = [SRW]
Anton Korobeynikovf6ea9e92009-05-03 13:05:00 +0000549
550let isCommutable = 1 in { // X = OR Y, Z == X = OR Z, Y
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000551def OR8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
552 "bis.b\t{$src2, $dst|$dst, $src2}",
553 [(set GR8:$dst, (or GR8:$src1, GR8:$src2))]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000554def OR16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
555 "bis.w\t{$src2, $dst|$dst, $src2}",
556 [(set GR16:$dst, (or GR16:$src1, GR16:$src2))]>;
Anton Korobeynikovf6ea9e92009-05-03 13:05:00 +0000557}
558
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000559def OR8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
560 "bis.b\t{$src2, $dst|$dst, $src2}",
561 [(set GR8:$dst, (or GR8:$src1, imm:$src2))]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000562def OR16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
563 "bis.w\t{$src2, $dst|$dst, $src2}",
564 [(set GR16:$dst, (or GR16:$src1, imm:$src2))]>;
Anton Korobeynikovf6ea9e92009-05-03 13:05:00 +0000565
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000566def OR8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
567 "bis.b\t{$src2, $dst|$dst, $src2}",
568 [(set GR8:$dst, (or GR8:$src1, (load addr:$src2)))]>;
569def OR16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
570 "bis.w\t{$src2, $dst|$dst, $src2}",
571 [(set GR16:$dst, (or GR16:$src1, (load addr:$src2)))]>;
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000572
573let isTwoAddress = 0 in {
574def OR8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
575 "bis.b\t{$src, $dst|$dst, $src}",
576 [(store (or (load addr:$dst), GR8:$src), addr:$dst),
577 (implicit SRW)]>;
578def OR16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
579 "bis.w\t{$src, $dst|$dst, $src}",
580 [(store (or (load addr:$dst), GR16:$src), addr:$dst),
581 (implicit SRW)]>;
582
583def OR8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
584 "bis.b\t{$src, $dst|$dst, $src}",
585 [(store (or (load addr:$dst), (i8 imm:$src)), addr:$dst),
586 (implicit SRW)]>;
587def OR16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
588 "bis.w\t{$src, $dst|$dst, $src}",
589 [(store (or (load addr:$dst), (i16 imm:$src)), addr:$dst),
590 (implicit SRW)]>;
591
592def OR8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
593 "bis.b\t{$src, $dst|$dst, $src}",
594 [(store (or (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
595 (implicit SRW)]>;
596def OR16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
597 "bis.w\t{$src, $dst|$dst, $src}",
598 [(store (or (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
599 (implicit SRW)]>;
600}
601
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000602} // isTwoAddress = 1
Anton Korobeynikov4c88f112009-05-03 13:06:03 +0000603
604//===----------------------------------------------------------------------===//
605// Non-Instruction Patterns
606
607// extload
608def : Pat<(extloadi16i8 addr:$src), (MOVZX16rm8 addr:$src)>;
Anton Korobeynikov7aefbb32009-05-03 13:06:26 +0000609
610// truncs
611def : Pat<(i8 (trunc GR16:$src)),
612 (EXTRACT_SUBREG GR16:$src, subreg_8bit)>;
Anton Korobeynikove60685a2009-05-03 13:08:13 +0000613
614// calls
615def : Pat<(MSP430call (i16 tglobaladdr:$dst)),
616 (CALLi tglobaladdr:$dst)>;
617def : Pat<(MSP430call (i16 texternalsym:$dst)),
618 (CALLi texternalsym:$dst)>;