blob: 022d171f35b7fe8b003ebc828a31ca91c9a3e3cc [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 Korobeynikov13d927f2009-05-03 13:08:33 +000028def SDT_MSP430Wrapper : SDTypeProfile<1, 1, [SDTCisSameAs<0, 1>, SDTCisPtrTy<0>]>;
Anton Korobeynikov38c44b92009-05-03 13:12:06 +000029def SDT_MSP430Cmp : SDTypeProfile<0, 2, [SDTCisSameAs<0, 1>]>;
Anton Korobeynikov47f1a8c2009-05-03 13:19:09 +000030def SDT_MSP430BrCC : SDTypeProfile<0, 2, [SDTCisVT<0, OtherVT>,
31 SDTCisVT<1, i8>]>;
32def SDT_MSP430SelectCC : SDTypeProfile<1, 3, [SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>,
33 SDTCisVT<3, i8>]>;
Anton Korobeynikov36d987e2009-12-12 18:55:37 +000034def SDT_MSP430Shift : SDTypeProfile<1, 2, [SDTCisSameAs<0, 1>, SDTCisI8<2>]>;
Anton Korobeynikov37171572009-05-03 12:57:15 +000035
36//===----------------------------------------------------------------------===//
37// MSP430 Specific Node Definitions.
38//===----------------------------------------------------------------------===//
Anton Korobeynikov5a39d692009-12-07 02:27:53 +000039def MSP430retflag : SDNode<"MSP430ISD::RET_FLAG", SDTNone,
40 [SDNPHasChain, SDNPOptInFlag]>;
41def MSP430retiflag : SDNode<"MSP430ISD::RETI_FLAG", SDTNone,
42 [SDNPHasChain, SDNPOptInFlag]>;
Anton Korobeynikov37171572009-05-03 12:57:15 +000043
Anton Korobeynikov184a31c2009-05-03 13:03:33 +000044def MSP430rra : SDNode<"MSP430ISD::RRA", SDTIntUnaryOp, []>;
Anton Korobeynikov29779cb2009-05-03 13:13:17 +000045def MSP430rla : SDNode<"MSP430ISD::RLA", SDTIntUnaryOp, []>;
Anton Korobeynikov7a872e92009-05-03 13:16:37 +000046def MSP430rrc : SDNode<"MSP430ISD::RRC", SDTIntUnaryOp, []>;
Anton Korobeynikov184a31c2009-05-03 13:03:33 +000047
Anton Korobeynikov7feedc82009-05-03 13:07:31 +000048def MSP430call : SDNode<"MSP430ISD::CALL", SDT_MSP430Call,
49 [SDNPHasChain, SDNPOutFlag, SDNPOptInFlag]>;
Anton Korobeynikov33b85092009-05-03 13:07:54 +000050def MSP430callseq_start :
51 SDNode<"ISD::CALLSEQ_START", SDT_MSP430CallSeqStart,
52 [SDNPHasChain, SDNPOutFlag]>;
53def MSP430callseq_end :
54 SDNode<"ISD::CALLSEQ_END", SDT_MSP430CallSeqEnd,
55 [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>;
Anton Korobeynikov38c44b92009-05-03 13:12:06 +000056def MSP430Wrapper : SDNode<"MSP430ISD::Wrapper", SDT_MSP430Wrapper>;
Anton Korobeynikov47f1a8c2009-05-03 13:19:09 +000057def MSP430cmp : SDNode<"MSP430ISD::CMP", SDT_MSP430Cmp, [SDNPOutFlag]>;
58def MSP430brcc : SDNode<"MSP430ISD::BR_CC", SDT_MSP430BrCC, [SDNPHasChain, SDNPInFlag]>;
59def MSP430selectcc: SDNode<"MSP430ISD::SELECT_CC", SDT_MSP430SelectCC, [SDNPInFlag]>;
Anton Korobeynikov36d987e2009-12-12 18:55:37 +000060def MSP430shl : SDNode<"MSP430ISD::SHL", SDT_MSP430Shift, []>;
61def MSP430sra : SDNode<"MSP430ISD::SRA", SDT_MSP430Shift, []>;
62def MSP430srl : SDNode<"MSP430ISD::SRL", SDT_MSP430Shift, []>;
Anton Korobeynikov7feedc82009-05-03 13:07:31 +000063
Anton Korobeynikov37171572009-05-03 12:57:15 +000064//===----------------------------------------------------------------------===//
Anton Korobeynikov4c88f112009-05-03 13:06:03 +000065// MSP430 Operand Definitions.
Anton Korobeynikov37171572009-05-03 12:57:15 +000066//===----------------------------------------------------------------------===//
67
Anton Korobeynikov7aefbb32009-05-03 13:06:26 +000068// Address operands
Anton Korobeynikov4c88f112009-05-03 13:06:03 +000069def memsrc : Operand<i16> {
70 let PrintMethod = "printSrcMemOperand";
Anton Korobeynikova6e36692009-05-03 13:09:40 +000071 let MIOperandInfo = (ops GR16, i16imm);
Anton Korobeynikov4c88f112009-05-03 13:06:03 +000072}
73
Anton Korobeynikov7aefbb32009-05-03 13:06:26 +000074def memdst : Operand<i16> {
75 let PrintMethod = "printSrcMemOperand";
Anton Korobeynikova6e36692009-05-03 13:09:40 +000076 let MIOperandInfo = (ops GR16, i16imm);
Anton Korobeynikov7aefbb32009-05-03 13:06:26 +000077}
78
Anton Korobeynikov38c44b92009-05-03 13:12:06 +000079// Branch targets have OtherVT type.
Anton Korobeynikovc9a90ae2009-10-21 00:13:25 +000080def brtarget : Operand<OtherVT> {
81 let PrintMethod = "printPCRelImmOperand";
82}
Anton Korobeynikov38c44b92009-05-03 13:12:06 +000083
Anton Korobeynikov46499082009-05-03 13:12:23 +000084// Operand for printing out a condition code.
85def cc : Operand<i8> {
86 let PrintMethod = "printCCOperand";
87}
88
Anton Korobeynikov4c88f112009-05-03 13:06:03 +000089//===----------------------------------------------------------------------===//
90// MSP430 Complex Pattern Definitions.
91//===----------------------------------------------------------------------===//
92
93def addr : ComplexPattern<iPTR, 2, "SelectAddr", [], []>;
94
95//===----------------------------------------------------------------------===//
96// Pattern Fragments
97def zextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (zextloadi8 node:$ptr))>;
98def extloadi16i8 : PatFrag<(ops node:$ptr), (i16 ( extloadi8 node:$ptr))>;
Anton Korobeynikov3caef712009-12-08 01:03:04 +000099def and_su : PatFrag<(ops node:$lhs, node:$rhs), (and node:$lhs, node:$rhs), [{
100 return N->hasOneUse();
101}]>;
Anton Korobeynikov4c88f112009-05-03 13:06:03 +0000102//===----------------------------------------------------------------------===//
Anton Korobeynikov33b85092009-05-03 13:07:54 +0000103// Instruction list..
104
105// ADJCALLSTACKDOWN/UP implicitly use/def SP because they may be expanded into
106// a stack adjustment and the codegen must know that they may modify the stack
107// pointer before prolog-epilog rewriting occurs.
108// Pessimistically assume ADJCALLSTACKDOWN / ADJCALLSTACKUP will become
109// sub / add which can clobber SRW.
110let Defs = [SPW, SRW], Uses = [SPW] in {
111def ADJCALLSTACKDOWN : Pseudo<(outs), (ins i16imm:$amt),
112 "#ADJCALLSTACKDOWN",
113 [(MSP430callseq_start timm:$amt)]>;
114def ADJCALLSTACKUP : Pseudo<(outs), (ins i16imm:$amt1, i16imm:$amt2),
115 "#ADJCALLSTACKUP",
116 [(MSP430callseq_end timm:$amt1, timm:$amt2)]>;
117}
118
Dan Gohman30afe012009-10-29 18:10:34 +0000119let usesCustomInserter = 1 in {
Anton Korobeynikovac4679e2009-05-08 18:50:26 +0000120 def Select8 : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2, i8imm:$cc),
121 "# Select8 PSEUDO",
122 [(set GR8:$dst,
123 (MSP430selectcc GR8:$src1, GR8:$src2, imm:$cc))]>;
Anton Korobeynikov46499082009-05-03 13:12:23 +0000124 def Select16 : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2, i8imm:$cc),
125 "# Select16 PSEUDO",
126 [(set GR16:$dst,
Anton Korobeynikov47f1a8c2009-05-03 13:19:09 +0000127 (MSP430selectcc GR16:$src1, GR16:$src2, imm:$cc))]>;
Anton Korobeynikov36d987e2009-12-12 18:55:37 +0000128 let Defs = [SRW] in {
129 def Shl8 : Pseudo<(outs GR8:$dst), (ins GR8:$src, GR8:$cnt),
130 "# Shl8 PSEUDO",
131 [(set GR8:$dst, (MSP430shl GR8:$src, GR8:$cnt))]>;
132 def Shl16 : Pseudo<(outs GR16:$dst), (ins GR16:$src, GR8:$cnt),
133 "# Shl16 PSEUDO",
134 [(set GR16:$dst, (MSP430shl GR16:$src, GR8:$cnt))]>;
135 def Sra8 : Pseudo<(outs GR8:$dst), (ins GR8:$src, GR8:$cnt),
136 "# Sra8 PSEUDO",
137 [(set GR8:$dst, (MSP430sra GR8:$src, GR8:$cnt))]>;
138 def Sra16 : Pseudo<(outs GR16:$dst), (ins GR16:$src, GR8:$cnt),
139 "# Sra16 PSEUDO",
140 [(set GR16:$dst, (MSP430sra GR16:$src, GR8:$cnt))]>;
141 def Srl8 : Pseudo<(outs GR8:$dst), (ins GR8:$src, GR8:$cnt),
142 "# Srl8 PSEUDO",
143 [(set GR8:$dst, (MSP430srl GR8:$src, GR8:$cnt))]>;
144 def Srl16 : Pseudo<(outs GR16:$dst), (ins GR16:$src, GR8:$cnt),
145 "# Srl16 PSEUDO",
146 [(set GR16:$dst, (MSP430srl GR16:$src, GR8:$cnt))]>;
147
148 }
Anton Korobeynikov46499082009-05-03 13:12:23 +0000149}
Anton Korobeynikov4c88f112009-05-03 13:06:03 +0000150
Anton Korobeynikov57322972009-05-03 13:04:23 +0000151let neverHasSideEffects = 1 in
Anton Korobeynikov37171572009-05-03 12:57:15 +0000152def NOP : Pseudo<(outs), (ins), "nop", []>;
Anton Korobeynikov725e2d02009-05-03 12:59:50 +0000153
Anton Korobeynikov38c44b92009-05-03 13:12:06 +0000154//===----------------------------------------------------------------------===//
155// Control Flow Instructions...
156//
157
Anton Korobeynikov725e2d02009-05-03 12:59:50 +0000158// FIXME: Provide proper encoding!
Dan Gohman40685552009-11-11 18:11:07 +0000159let isReturn = 1, isTerminator = 1, isBarrier = 1 in {
Anton Korobeynikov5a39d692009-12-07 02:27:53 +0000160 def RET : Pseudo<(outs), (ins), "ret", [(MSP430retflag)]>;
161 def RETI : Pseudo<(outs), (ins), "reti", [(MSP430retiflag)]>;
Anton Korobeynikovf1fb8c72009-05-03 13:02:04 +0000162}
163
Anton Korobeynikovdda59242009-05-03 13:12:58 +0000164let isBranch = 1, isTerminator = 1 in {
165
166// Direct branch
167let isBarrier = 1 in
168 def JMP : Pseudo<(outs), (ins brtarget:$dst),
169 "jmp\t$dst",
170 [(br bb:$dst)]>;
171
Anton Korobeynikov38c44b92009-05-03 13:12:06 +0000172// Conditional branches
Anton Korobeynikovdda59242009-05-03 13:12:58 +0000173let Uses = [SRW] in
174 def JCC : Pseudo<(outs), (ins brtarget:$dst, cc:$cc),
Anton Korobeynikovb5d6f652009-11-08 15:32:11 +0000175 "j$cc\t$dst",
Anton Korobeynikov47f1a8c2009-05-03 13:19:09 +0000176 [(MSP430brcc bb:$dst, imm:$cc)]>;
Anton Korobeynikovdda59242009-05-03 13:12:58 +0000177} // isBranch, isTerminator
Anton Korobeynikov38c44b92009-05-03 13:12:06 +0000178
Anton Korobeynikovf1fb8c72009-05-03 13:02:04 +0000179//===----------------------------------------------------------------------===//
Anton Korobeynikov33b85092009-05-03 13:07:54 +0000180// Call Instructions...
181//
182let isCall = 1 in
183 // All calls clobber the non-callee saved registers. SPW is marked as
184 // a use to prevent stack-pointer assignments that appear immediately
185 // before calls from potentially appearing dead. Uses for argument
186 // registers are added manually.
187 let Defs = [R12W, R13W, R14W, R15W, SRW],
188 Uses = [SPW] in {
Anton Korobeynikove60685a2009-05-03 13:08:13 +0000189 def CALLi : Pseudo<(outs), (ins i16imm:$dst, variable_ops),
Anton Korobeynikov0c425ac2009-10-11 19:14:02 +0000190 "call\t$dst", [(MSP430call imm:$dst)]>;
Anton Korobeynikove60685a2009-05-03 13:08:13 +0000191 def CALLr : Pseudo<(outs), (ins GR16:$dst, variable_ops),
192 "call\t$dst", [(MSP430call GR16:$dst)]>;
193 def CALLm : Pseudo<(outs), (ins memsrc:$dst, variable_ops),
194 "call\t${dst:mem}", [(MSP430call (load addr:$dst))]>;
Anton Korobeynikov33b85092009-05-03 13:07:54 +0000195 }
196
197
198//===----------------------------------------------------------------------===//
Anton Korobeynikov2c276e12009-05-03 13:11:04 +0000199// Miscellaneous Instructions...
200//
201let Defs = [SPW], Uses = [SPW], neverHasSideEffects=1 in {
202let mayLoad = 1 in
203def POP16r : Pseudo<(outs GR16:$reg), (ins), "pop.w\t$reg", []>;
204
205let mayStore = 1 in
206def PUSH16r : Pseudo<(outs), (ins GR16:$reg), "push.w\t$reg",[]>;
207}
208
209//===----------------------------------------------------------------------===//
Anton Korobeynikovf1fb8c72009-05-03 13:02:04 +0000210// Move Instructions
211
212// FIXME: Provide proper encoding!
213let neverHasSideEffects = 1 in {
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000214def MOV8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000215 "mov.b\t{$src, $dst}",
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000216 []>;
Anton Korobeynikov4c88f112009-05-03 13:06:03 +0000217def MOV16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000218 "mov.w\t{$src, $dst}",
Anton Korobeynikov4c88f112009-05-03 13:06:03 +0000219 []>;
Anton Korobeynikovf1fb8c72009-05-03 13:02:04 +0000220}
221
222// FIXME: Provide proper encoding!
223let isReMaterializable = 1, isAsCheapAsAMove = 1 in {
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000224def MOV8ri : Pseudo<(outs GR8:$dst), (ins i8imm:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000225 "mov.b\t{$src, $dst}",
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000226 [(set GR8:$dst, imm:$src)]>;
Anton Korobeynikov4c88f112009-05-03 13:06:03 +0000227def MOV16ri : Pseudo<(outs GR16:$dst), (ins i16imm:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000228 "mov.w\t{$src, $dst}",
Anton Korobeynikov4c88f112009-05-03 13:06:03 +0000229 [(set GR16:$dst, imm:$src)]>;
Anton Korobeynikov725e2d02009-05-03 12:59:50 +0000230}
Anton Korobeynikov75b685d2009-05-03 13:02:39 +0000231
Anton Korobeynikov4c88f112009-05-03 13:06:03 +0000232let canFoldAsLoad = 1, isReMaterializable = 1, mayHaveSideEffects = 1 in {
233def MOV8rm : Pseudo<(outs GR8:$dst), (ins memsrc:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000234 "mov.b\t{$src, $dst}",
Anton Korobeynikov4c88f112009-05-03 13:06:03 +0000235 [(set GR8:$dst, (load addr:$src))]>;
236def MOV16rm : Pseudo<(outs GR16:$dst), (ins memsrc:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000237 "mov.w\t{$src, $dst}",
Anton Korobeynikov4c88f112009-05-03 13:06:03 +0000238 [(set GR16:$dst, (load addr:$src))]>;
239}
240
241def MOVZX16rr8 : Pseudo<(outs GR16:$dst), (ins GR8:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000242 "mov.b\t{$src, $dst}",
Anton Korobeynikov4c88f112009-05-03 13:06:03 +0000243 [(set GR16:$dst, (zext GR8:$src))]>;
244def MOVZX16rm8 : Pseudo<(outs GR16:$dst), (ins memsrc:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000245 "mov.b\t{$src, $dst}",
Anton Korobeynikov4c88f112009-05-03 13:06:03 +0000246 [(set GR16:$dst, (zextloadi16i8 addr:$src))]>;
247
Anton Korobeynikova6d97be2009-11-07 17:15:06 +0000248let mayLoad = 1, hasExtraDefRegAllocReq = 1, Constraints = "$base = $base_wb" in {
249def MOV8rm_POST : Pseudo<(outs GR8:$dst, GR16:$base_wb), (ins GR16:$base),
250 "mov.b\t{@$base+, $dst}", []>;
251def MOV16rm_POST : Pseudo<(outs GR16:$dst, GR16:$base_wb), (ins GR16:$base),
252 "mov.w\t{@$base+, $dst}", []>;
253}
254
Anton Korobeynikov3f83f912009-05-03 15:50:18 +0000255// Any instruction that defines a 8-bit result leaves the high half of the
256// register. Truncate can be lowered to EXTRACT_SUBREG, and CopyFromReg may
257// be copying from a truncate, but any other 8-bit operation will zero-extend
258// up to 16 bits.
259def def8 : PatLeaf<(i8 GR8:$src), [{
260 return N->getOpcode() != ISD::TRUNCATE &&
261 N->getOpcode() != TargetInstrInfo::EXTRACT_SUBREG &&
262 N->getOpcode() != ISD::CopyFromReg;
263}]>;
264
265// In the case of a 8-bit def that is known to implicitly zero-extend,
266// we can use a SUBREG_TO_REG.
267def : Pat<(i16 (zext def8:$src)),
268 (SUBREG_TO_REG (i16 0), GR8:$src, subreg_8bit)>;
269
270
Anton Korobeynikov7aefbb32009-05-03 13:06:26 +0000271def MOV8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000272 "mov.b\t{$src, $dst}",
Anton Korobeynikov7aefbb32009-05-03 13:06:26 +0000273 [(store (i8 imm:$src), addr:$dst)]>;
274def MOV16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000275 "mov.w\t{$src, $dst}",
Anton Korobeynikov7aefbb32009-05-03 13:06:26 +0000276 [(store (i16 imm:$src), addr:$dst)]>;
277
278def MOV8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000279 "mov.b\t{$src, $dst}",
Anton Korobeynikov7aefbb32009-05-03 13:06:26 +0000280 [(store GR8:$src, addr:$dst)]>;
281def MOV16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000282 "mov.w\t{$src, $dst}",
Anton Korobeynikov7aefbb32009-05-03 13:06:26 +0000283 [(store GR16:$src, addr:$dst)]>;
284
Anton Korobeynikov2012d002009-10-11 23:03:53 +0000285def MOV8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
286 "mov.b\t{$src, $dst}",
287 [(store (i8 (load addr:$src)), addr:$dst)]>;
288def MOV16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
289 "mov.w\t{$src, $dst}",
290 [(store (i16 (load addr:$src)), addr:$dst)]>;
291
Anton Korobeynikov75b685d2009-05-03 13:02:39 +0000292//===----------------------------------------------------------------------===//
293// Arithmetic Instructions
294
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000295let isTwoAddress = 1 in {
Anton Korobeynikov75b685d2009-05-03 13:02:39 +0000296
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000297let Defs = [SRW] in {
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000298
299let isCommutable = 1 in { // X = ADD Y, Z == X = ADD Z, Y
Anton Korobeynikov75b685d2009-05-03 13:02:39 +0000300// FIXME: Provide proper encoding!
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000301def ADD8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000302 "add.b\t{$src2, $dst}",
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000303 [(set GR8:$dst, (add GR8:$src1, GR8:$src2)),
304 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000305def ADD16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000306 "add.w\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000307 [(set GR16:$dst, (add GR16:$src1, GR16:$src2)),
308 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000309}
310
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000311def ADD8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000312 "add.b\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000313 [(set GR8:$dst, (add GR8:$src1, (load addr:$src2))),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000314 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000315def ADD16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000316 "add.w\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000317 [(set GR16:$dst, (add GR16:$src1, (load addr:$src2))),
318 (implicit SRW)]>;
319
Anton Korobeynikova0e695b2009-11-07 17:15:25 +0000320let mayLoad = 1, hasExtraDefRegAllocReq = 1,
321Constraints = "$base = $base_wb, $src1 = $dst" in {
322def ADD8rm_POST : Pseudo<(outs GR8:$dst, GR16:$base_wb), (ins GR8:$src1, GR16:$base),
323 "add.b\t{@$base+, $dst}", []>;
324def ADD16rm_POST : Pseudo<(outs GR16:$dst, GR16:$base_wb), (ins GR16:$src1, GR16:$base),
325 "add.w\t{@$base+, $dst}", []>;
326}
327
328
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000329def ADD8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000330 "add.b\t{$src2, $dst}",
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000331 [(set GR8:$dst, (add GR8:$src1, imm:$src2)),
332 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000333def ADD16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000334 "add.w\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000335 [(set GR16:$dst, (add GR16:$src1, imm:$src2)),
336 (implicit SRW)]>;
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000337
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000338let isTwoAddress = 0 in {
339def ADD8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000340 "add.b\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000341 [(store (add (load addr:$dst), GR8:$src), addr:$dst),
342 (implicit SRW)]>;
343def ADD16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000344 "add.w\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000345 [(store (add (load addr:$dst), GR16:$src), addr:$dst),
346 (implicit SRW)]>;
347
348def ADD8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000349 "add.b\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000350 [(store (add (load addr:$dst), (i8 imm:$src)), addr:$dst),
351 (implicit SRW)]>;
352def ADD16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000353 "add.w\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000354 [(store (add (load addr:$dst), (i16 imm:$src)), addr:$dst),
355 (implicit SRW)]>;
356
357def ADD8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000358 "add.b\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000359 [(store (add (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
360 (implicit SRW)]>;
361def ADD16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000362 "add.w\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000363 [(store (add (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
364 (implicit SRW)]>;
365}
366
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000367let Uses = [SRW] in {
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000368
369let isCommutable = 1 in { // X = ADDC Y, Z == X = ADDC Z, Y
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000370def ADC8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000371 "addc.b\t{$src2, $dst}",
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000372 [(set GR8:$dst, (adde GR8:$src1, GR8:$src2)),
373 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000374def ADC16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000375 "addc.w\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000376 [(set GR16:$dst, (adde GR16:$src1, GR16:$src2)),
377 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000378} // isCommutable
379
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000380def ADC8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000381 "addc.b\t{$src2, $dst}",
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000382 [(set GR8:$dst, (adde GR8:$src1, imm:$src2)),
383 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000384def ADC16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000385 "addc.w\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000386 [(set GR16:$dst, (adde GR16:$src1, imm:$src2)),
387 (implicit SRW)]>;
388
389def ADC8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000390 "addc.b\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000391 [(set GR8:$dst, (adde GR8:$src1, (load addr:$src2))),
392 (implicit SRW)]>;
393def ADC16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000394 "addc.w\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000395 [(set GR16:$dst, (adde GR16:$src1, (load addr:$src2))),
396 (implicit SRW)]>;
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000397
398let isTwoAddress = 0 in {
399def ADC8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000400 "addc.b\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000401 [(store (adde (load addr:$dst), GR8:$src), addr:$dst),
402 (implicit SRW)]>;
403def ADC16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000404 "addc.w\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000405 [(store (adde (load addr:$dst), GR16:$src), addr:$dst),
406 (implicit SRW)]>;
407
408def ADC8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000409 "addc.b\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000410 [(store (adde (load addr:$dst), (i8 imm:$src)), addr:$dst),
411 (implicit SRW)]>;
412def ADC16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000413 "addc.w\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000414 [(store (adde (load addr:$dst), (i16 imm:$src)), addr:$dst),
415 (implicit SRW)]>;
416
417def ADC8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000418 "addc.b\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000419 [(store (adde (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
420 (implicit SRW)]>;
421def ADC16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000422 "addc.w\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000423 [(store (adde (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
424 (implicit SRW)]>;
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000425}
426
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000427} // Uses = [SRW]
428
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000429let isCommutable = 1 in { // X = AND Y, Z == X = AND Z, Y
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000430def AND8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000431 "and.b\t{$src2, $dst}",
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000432 [(set GR8:$dst, (and GR8:$src1, GR8:$src2)),
433 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000434def AND16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000435 "and.w\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000436 [(set GR16:$dst, (and GR16:$src1, GR16:$src2)),
437 (implicit SRW)]>;
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000438}
439
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000440def AND8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000441 "and.b\t{$src2, $dst}",
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000442 [(set GR8:$dst, (and GR8:$src1, imm:$src2)),
443 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000444def AND16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000445 "and.w\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000446 [(set GR16:$dst, (and GR16:$src1, imm:$src2)),
447 (implicit SRW)]>;
448
449def AND8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000450 "and.b\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000451 [(set GR8:$dst, (and GR8:$src1, (load addr:$src2))),
452 (implicit SRW)]>;
453def AND16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000454 "and.w\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000455 [(set GR16:$dst, (and GR16:$src1, (load addr:$src2))),
456 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000457
Anton Korobeynikovfc5c66b2009-11-08 14:27:38 +0000458let mayLoad = 1, hasExtraDefRegAllocReq = 1,
459Constraints = "$base = $base_wb, $src1 = $dst" in {
460def AND8rm_POST : Pseudo<(outs GR8:$dst, GR16:$base_wb), (ins GR8:$src1, GR16:$base),
461 "and.b\t{@$base+, $dst}", []>;
462def AND16rm_POST : Pseudo<(outs GR16:$dst, GR16:$base_wb), (ins GR16:$src1, GR16:$base),
463 "and.w\t{@$base+, $dst}", []>;
464}
465
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000466let isTwoAddress = 0 in {
467def AND8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000468 "and.b\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000469 [(store (and (load addr:$dst), GR8:$src), addr:$dst),
470 (implicit SRW)]>;
471def AND16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000472 "and.w\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000473 [(store (and (load addr:$dst), GR16:$src), addr:$dst),
474 (implicit SRW)]>;
475
476def AND8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000477 "and.b\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000478 [(store (and (load addr:$dst), (i8 imm:$src)), addr:$dst),
479 (implicit SRW)]>;
480def AND16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000481 "and.w\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000482 [(store (and (load addr:$dst), (i16 imm:$src)), addr:$dst),
483 (implicit SRW)]>;
484
485def AND8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000486 "and.b\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000487 [(store (and (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
488 (implicit SRW)]>;
489def AND16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000490 "and.w\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000491 [(store (and (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
492 (implicit SRW)]>;
493}
494
Anton Korobeynikov185c2132009-11-08 15:32:44 +0000495let isCommutable = 1 in { // X = OR Y, Z == X = OR Z, Y
496def OR8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
497 "bis.b\t{$src2, $dst}",
498 [(set GR8:$dst, (or GR8:$src1, GR8:$src2))]>;
499def OR16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
500 "bis.w\t{$src2, $dst}",
501 [(set GR16:$dst, (or GR16:$src1, GR16:$src2))]>;
502}
503
504def OR8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
505 "bis.b\t{$src2, $dst}",
506 [(set GR8:$dst, (or GR8:$src1, imm:$src2))]>;
507def OR16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
508 "bis.w\t{$src2, $dst}",
509 [(set GR16:$dst, (or GR16:$src1, imm:$src2))]>;
510
511def OR8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
512 "bis.b\t{$src2, $dst}",
513 [(set GR8:$dst, (or GR8:$src1, (load addr:$src2)))]>;
514def OR16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
515 "bis.w\t{$src2, $dst}",
516 [(set GR16:$dst, (or GR16:$src1, (load addr:$src2)))]>;
517
518let mayLoad = 1, hasExtraDefRegAllocReq = 1,
519Constraints = "$base = $base_wb, $src1 = $dst" in {
520def OR8rm_POST : Pseudo<(outs GR8:$dst, GR16:$base_wb), (ins GR8:$src1, GR16:$base),
521 "bis.b\t{@$base+, $dst}", []>;
522def OR16rm_POST : Pseudo<(outs GR16:$dst, GR16:$base_wb), (ins GR16:$src1, GR16:$base),
523 "bis.w\t{@$base+, $dst}", []>;
524}
525
526let isTwoAddress = 0 in {
527def OR8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
528 "bis.b\t{$src, $dst}",
529 [(store (or (load addr:$dst), GR8:$src), addr:$dst)]>;
530def OR16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
531 "bis.w\t{$src, $dst}",
532 [(store (or (load addr:$dst), GR16:$src), addr:$dst)]>;
533
534def OR8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
535 "bis.b\t{$src, $dst}",
536 [(store (or (load addr:$dst), (i8 imm:$src)), addr:$dst)]>;
537def OR16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
538 "bis.w\t{$src, $dst}",
539 [(store (or (load addr:$dst), (i16 imm:$src)), addr:$dst)]>;
540
541def OR8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
542 "bis.b\t{$src, $dst}",
543 [(store (or (i8 (load addr:$dst)),
544 (i8 (load addr:$src))), addr:$dst)]>;
545def OR16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
546 "bis.w\t{$src, $dst}",
547 [(store (or (i16 (load addr:$dst)),
548 (i16 (load addr:$src))), addr:$dst)]>;
549}
550
Anton Korobeynikovc5073682009-11-08 15:33:12 +0000551// bic does not modify condition codes
552def BIC8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
553 "bic.b\t{$src2, $dst}",
554 [(set GR8:$dst, (and GR8:$src1, (not GR8:$src2)))]>;
555def BIC16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
556 "bic.w\t{$src2, $dst}",
557 [(set GR16:$dst, (and GR16:$src1, (not GR16:$src2)))]>;
558
559def BIC8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
560 "bic.b\t{$src2, $dst}",
561 [(set GR8:$dst, (and GR8:$src1, (not (i8 (load addr:$src2)))))]>;
562def BIC16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
563 "bic.w\t{$src2, $dst}",
564 [(set GR16:$dst, (and GR16:$src1, (not (i16 (load addr:$src2)))))]>;
565
566let isTwoAddress = 0 in {
567def BIC8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
568 "bic.b\t{$src, $dst}",
569 [(store (and (load addr:$dst), (not GR8:$src)), addr:$dst)]>;
570def BIC16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
571 "bic.w\t{$src, $dst}",
572 [(store (and (load addr:$dst), (not GR16:$src)), addr:$dst)]>;
573
574def BIC8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
575 "bic.b\t{$src, $dst}",
576 [(store (and (load addr:$dst), (not (i8 (load addr:$src)))), addr:$dst)]>;
577def BIC16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
578 "bic.w\t{$src, $dst}",
579 [(store (and (load addr:$dst), (not (i16 (load addr:$src)))), addr:$dst)]>;
580}
581
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000582let isCommutable = 1 in { // X = XOR Y, Z == X = XOR Z, Y
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000583def XOR8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000584 "xor.b\t{$src2, $dst}",
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000585 [(set GR8:$dst, (xor GR8:$src1, GR8:$src2)),
586 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000587def XOR16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000588 "xor.w\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000589 [(set GR16:$dst, (xor GR16:$src1, GR16:$src2)),
590 (implicit SRW)]>;
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000591}
592
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000593def XOR8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000594 "xor.b\t{$src2, $dst}",
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000595 [(set GR8:$dst, (xor GR8:$src1, imm:$src2)),
596 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000597def XOR16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000598 "xor.w\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000599 [(set GR16:$dst, (xor GR16:$src1, imm:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000600 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000601
602def XOR8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000603 "xor.b\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000604 [(set GR8:$dst, (xor GR8:$src1, (load addr:$src2))),
605 (implicit SRW)]>;
606def XOR16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000607 "xor.w\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000608 [(set GR16:$dst, (xor GR16:$src1, (load addr:$src2))),
609 (implicit SRW)]>;
610
Anton Korobeynikovfc5c66b2009-11-08 14:27:38 +0000611let mayLoad = 1, hasExtraDefRegAllocReq = 1,
612Constraints = "$base = $base_wb, $src1 = $dst" in {
613def XOR8rm_POST : Pseudo<(outs GR8:$dst, GR16:$base_wb), (ins GR8:$src1, GR16:$base),
614 "xor.b\t{@$base+, $dst}", []>;
615def XOR16rm_POST : Pseudo<(outs GR16:$dst, GR16:$base_wb), (ins GR16:$src1, GR16:$base),
616 "xor.w\t{@$base+, $dst}", []>;
617}
618
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000619let isTwoAddress = 0 in {
620def XOR8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000621 "xor.b\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000622 [(store (xor (load addr:$dst), GR8:$src), addr:$dst),
623 (implicit SRW)]>;
624def XOR16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000625 "xor.w\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000626 [(store (xor (load addr:$dst), GR16:$src), addr:$dst),
627 (implicit SRW)]>;
628
629def XOR8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000630 "xor.b\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000631 [(store (xor (load addr:$dst), (i8 imm:$src)), addr:$dst),
632 (implicit SRW)]>;
633def XOR16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000634 "xor.w\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000635 [(store (xor (load addr:$dst), (i16 imm:$src)), addr:$dst),
636 (implicit SRW)]>;
637
638def XOR8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000639 "xor.b\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000640 [(store (xor (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
641 (implicit SRW)]>;
642def XOR16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000643 "xor.w\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000644 [(store (xor (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
645 (implicit SRW)]>;
646}
647
648
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000649def SUB8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000650 "sub.b\t{$src2, $dst}",
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000651 [(set GR8:$dst, (sub GR8:$src1, GR8:$src2)),
652 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000653def SUB16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000654 "sub.w\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000655 [(set GR16:$dst, (sub GR16:$src1, GR16:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000656 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000657
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000658def SUB8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000659 "sub.b\t{$src2, $dst}",
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000660 [(set GR8:$dst, (sub GR8:$src1, imm:$src2)),
661 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000662def SUB16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000663 "sub.w\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000664 [(set GR16:$dst, (sub GR16:$src1, imm:$src2)),
665 (implicit SRW)]>;
666
667def SUB8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000668 "sub.b\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000669 [(set GR8:$dst, (sub GR8:$src1, (load addr:$src2))),
670 (implicit SRW)]>;
671def SUB16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000672 "sub.w\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000673 [(set GR16:$dst, (sub GR16:$src1, (load addr:$src2))),
674 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000675
Anton Korobeynikovfc5c66b2009-11-08 14:27:38 +0000676let mayLoad = 1, hasExtraDefRegAllocReq = 1,
677Constraints = "$base = $base_wb, $src1 = $dst" in {
678def SUB8rm_POST : Pseudo<(outs GR8:$dst, GR16:$base_wb), (ins GR8:$src1, GR16:$base),
679 "sub.b\t{@$base+, $dst}", []>;
680def SUB16rm_POST : Pseudo<(outs GR16:$dst, GR16:$base_wb), (ins GR16:$src1, GR16:$base),
681 "sub.w\t{@$base+, $dst}", []>;
682}
683
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000684let isTwoAddress = 0 in {
685def SUB8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000686 "sub.b\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000687 [(store (sub (load addr:$dst), GR8:$src), addr:$dst),
688 (implicit SRW)]>;
689def SUB16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000690 "sub.w\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000691 [(store (sub (load addr:$dst), GR16:$src), addr:$dst),
692 (implicit SRW)]>;
693
694def SUB8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000695 "sub.b\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000696 [(store (sub (load addr:$dst), (i8 imm:$src)), addr:$dst),
697 (implicit SRW)]>;
698def SUB16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000699 "sub.w\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000700 [(store (sub (load addr:$dst), (i16 imm:$src)), addr:$dst),
701 (implicit SRW)]>;
702
703def SUB8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000704 "sub.b\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000705 [(store (sub (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
706 (implicit SRW)]>;
707def SUB16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000708 "sub.w\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000709 [(store (sub (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
710 (implicit SRW)]>;
711}
712
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000713let Uses = [SRW] in {
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000714def SBC8rr : Pseudo<(outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000715 "subc.b\t{$src2, $dst}",
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000716 [(set GR8:$dst, (sube GR8:$src1, GR8:$src2)),
717 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000718def SBC16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000719 "subc.w\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000720 [(set GR16:$dst, (sube GR16:$src1, GR16:$src2)),
721 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000722
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000723def SBC8ri : Pseudo<(outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000724 "subc.b\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000725 [(set GR8:$dst, (sube GR8:$src1, imm:$src2)),
726 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000727def SBC16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000728 "subc.w\t{$src2, $dst}",
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000729 [(set GR16:$dst, (sube GR16:$src1, imm:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000730 (implicit SRW)]>;
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000731
732def SBC8rm : Pseudo<(outs GR8:$dst), (ins GR8:$src1, memsrc:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000733 "subc.b\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000734 [(set GR8:$dst, (sube GR8:$src1, (load addr:$src2))),
735 (implicit SRW)]>;
736def SBC16rm : Pseudo<(outs GR16:$dst), (ins GR16:$src1, memsrc:$src2),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000737 "subc.w\t{$src2, $dst}",
Anton Korobeynikov63ef1fe2009-05-03 13:06:46 +0000738 [(set GR16:$dst, (sube GR16:$src1, (load addr:$src2))),
Anton Korobeynikovd6e5e222009-05-03 13:05:42 +0000739 (implicit SRW)]>;
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000740
741let isTwoAddress = 0 in {
742def SBC8mr : Pseudo<(outs), (ins memdst:$dst, GR8:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000743 "subc.b\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000744 [(store (sube (load addr:$dst), GR8:$src), addr:$dst),
745 (implicit SRW)]>;
746def SBC16mr : Pseudo<(outs), (ins memdst:$dst, GR16:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000747 "subc.w\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000748 [(store (sube (load addr:$dst), GR16:$src), addr:$dst),
749 (implicit SRW)]>;
750
751def SBC8mi : Pseudo<(outs), (ins memdst:$dst, i8imm:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000752 "subc.b\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000753 [(store (sube (load addr:$dst), (i8 imm:$src)), addr:$dst),
754 (implicit SRW)]>;
755def SBC16mi : Pseudo<(outs), (ins memdst:$dst, i16imm:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000756 "subc.w\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000757 [(store (sube (load addr:$dst), (i16 imm:$src)), addr:$dst),
758 (implicit SRW)]>;
759
760def SBC8mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000761 "subc.b\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000762 [(store (sube (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
763 (implicit SRW)]>;
764def SBC16mm : Pseudo<(outs), (ins memdst:$dst, memsrc:$src),
Anton Korobeynikovd5991ca2009-05-03 13:12:37 +0000765 "subc.w\t{$src, $dst}",
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000766 [(store (sube (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
767 (implicit SRW)]>;
Anton Korobeynikov75b685d2009-05-03 13:02:39 +0000768}
Anton Korobeynikov184a31c2009-05-03 13:03:33 +0000769
Anton Korobeynikov5f064292009-05-03 13:07:10 +0000770} // Uses = [SRW]
771
Anton Korobeynikov184a31c2009-05-03 13:03:33 +0000772// FIXME: Provide proper encoding!
Anton Korobeynikov7a872e92009-05-03 13:16:37 +0000773def SAR8r1 : Pseudo<(outs GR8:$dst), (ins GR8:$src),
774 "rra.b\t$dst",
775 [(set GR8:$dst, (MSP430rra GR8:$src)),
776 (implicit SRW)]>;
Anton Korobeynikov184a31c2009-05-03 13:03:33 +0000777def SAR16r1 : Pseudo<(outs GR16:$dst), (ins GR16:$src),
778 "rra.w\t$dst",
779 [(set GR16:$dst, (MSP430rra GR16:$src)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000780 (implicit SRW)]>;
781
Anton Korobeynikov7a872e92009-05-03 13:16:37 +0000782def SHL8r1 : Pseudo<(outs GR8:$dst), (ins GR8:$src),
783 "rla.b\t$dst",
784 [(set GR8:$dst, (MSP430rla GR8:$src)),
785 (implicit SRW)]>;
Anton Korobeynikov29779cb2009-05-03 13:13:17 +0000786def SHL16r1 : Pseudo<(outs GR16:$dst), (ins GR16:$src),
787 "rla.w\t$dst",
788 [(set GR16:$dst, (MSP430rla GR16:$src)),
789 (implicit SRW)]>;
790
Anton Korobeynikov7a872e92009-05-03 13:16:37 +0000791def SAR8r1c : Pseudo<(outs GR8:$dst), (ins GR8:$src),
Anton Korobeynikov95a736e2009-05-17 10:15:22 +0000792 "clrc\n\t"
Anton Korobeynikov7a872e92009-05-03 13:16:37 +0000793 "rrc.b\t$dst",
794 [(set GR8:$dst, (MSP430rrc GR8:$src)),
795 (implicit SRW)]>;
Anton Korobeynikov5f763602009-05-03 13:16:17 +0000796def SAR16r1c : Pseudo<(outs GR16:$dst), (ins GR16:$src),
Anton Korobeynikov95a736e2009-05-17 10:15:22 +0000797 "clrc\n\t"
Anton Korobeynikov5f763602009-05-03 13:16:17 +0000798 "rrc.w\t$dst",
799 [(set GR16:$dst, (MSP430rrc GR16:$src)),
800 (implicit SRW)]>;
801
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000802def SEXT16r : Pseudo<(outs GR16:$dst), (ins GR16:$src),
803 "sxt\t$dst",
804 [(set GR16:$dst, (sext_inreg GR16:$src, i8)),
805 (implicit SRW)]>;
806
807} // Defs = [SRW]
Anton Korobeynikovf6ea9e92009-05-03 13:05:00 +0000808
Anton Korobeynikove3b260e2009-11-08 15:32:28 +0000809def ZEXT16r : Pseudo<(outs GR16:$dst), (ins GR16:$src),
810 "mov.b\t{$src, $dst}",
811 [(set GR16:$dst, (zext (trunc GR16:$src)))]>;
812
Anton Korobeynikov90232fe2009-05-03 13:15:03 +0000813def SWPB16r : Pseudo<(outs GR16:$dst), (ins GR16:$src),
814 "swpb\t$dst",
815 [(set GR16:$dst, (bswap GR16:$src))]>;
816
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000817} // isTwoAddress = 1
Anton Korobeynikov4c88f112009-05-03 13:06:03 +0000818
Anton Korobeynikov38c44b92009-05-03 13:12:06 +0000819// Integer comparisons
820let Defs = [SRW] in {
821def CMP8rr : Pseudo<(outs), (ins GR8:$src1, GR8:$src2),
Anton Korobeynikov2ffaa152010-01-15 01:29:49 +0000822 "cmp.b\t{$src2, $src1}",
Anton Korobeynikov38c44b92009-05-03 13:12:06 +0000823 [(MSP430cmp GR8:$src1, GR8:$src2), (implicit SRW)]>;
824def CMP16rr : Pseudo<(outs), (ins GR16:$src1, GR16:$src2),
Anton Korobeynikov2ffaa152010-01-15 01:29:49 +0000825 "cmp.w\t{$src2, $src1}",
Anton Korobeynikov38c44b92009-05-03 13:12:06 +0000826 [(MSP430cmp GR16:$src1, GR16:$src2), (implicit SRW)]>;
827
Anton Korobeynikov2ffaa152010-01-15 01:29:49 +0000828def CMP8ri : Pseudo<(outs), (ins GR8:$src1, i8imm:$src2),
829 "cmp.b\t{$src2, $src1}",
830 [(MSP430cmp GR8:$src1, imm:$src2), (implicit SRW)]>;
831def CMP16ri : Pseudo<(outs), (ins GR16:$src1, i16imm:$src2),
832 "cmp.w\t{$src2, $src1}",
833 [(MSP430cmp GR16:$src1, imm:$src2), (implicit SRW)]>;
Anton Korobeynikovc2f8c722009-05-10 14:49:00 +0000834
Anton Korobeynikov2ffaa152010-01-15 01:29:49 +0000835def CMP8mi : Pseudo<(outs), (ins memsrc:$src1, i8imm:$src2),
836 "cmp.b\t{$src2, $src1}",
837 [(MSP430cmp (load addr:$src1),
838 (i8 imm:$src2)), (implicit SRW)]>;
839def CMP16mi : Pseudo<(outs), (ins memsrc:$src1, i16imm:$src2),
840 "cmp.w\t{$src2, $src1}",
841 [(MSP430cmp (load addr:$src1),
842 (i16 imm:$src2)), (implicit SRW)]>;
Anton Korobeynikovc2f8c722009-05-10 14:49:00 +0000843
Anton Korobeynikov38c44b92009-05-03 13:12:06 +0000844def CMP8rm : Pseudo<(outs), (ins GR8:$src1, memsrc:$src2),
Anton Korobeynikov2ffaa152010-01-15 01:29:49 +0000845 "cmp.b\t{$src2, $src1}",
Anton Korobeynikov38c44b92009-05-03 13:12:06 +0000846 [(MSP430cmp GR8:$src1, (load addr:$src2)), (implicit SRW)]>;
847def CMP16rm : Pseudo<(outs), (ins GR16:$src1, memsrc:$src2),
Anton Korobeynikov2ffaa152010-01-15 01:29:49 +0000848 "cmp.w\t{$src2, $src1}",
Anton Korobeynikov38c44b92009-05-03 13:12:06 +0000849 [(MSP430cmp GR16:$src1, (load addr:$src2)), (implicit SRW)]>;
850
851def CMP8mr : Pseudo<(outs), (ins memsrc:$src1, GR8:$src2),
Anton Korobeynikov2ffaa152010-01-15 01:29:49 +0000852 "cmp.b\t{$src2, $src1}",
Anton Korobeynikov38c44b92009-05-03 13:12:06 +0000853 [(MSP430cmp (load addr:$src1), GR8:$src2), (implicit SRW)]>;
854def CMP16mr : Pseudo<(outs), (ins memsrc:$src1, GR16:$src2),
Anton Korobeynikov2ffaa152010-01-15 01:29:49 +0000855 "cmp.w\t{$src2, $src1}",
Anton Korobeynikov38c44b92009-05-03 13:12:06 +0000856 [(MSP430cmp (load addr:$src1), GR16:$src2), (implicit SRW)]>;
857
Anton Korobeynikov3caef712009-12-08 01:03:04 +0000858
859// BIT TESTS, just sets condition codes
860// Note that the C condition is set differently than when using CMP.
861let isCommutable = 1 in {
862def BIT8rr : Pseudo<(outs), (ins GR8:$src1, GR8:$src2),
863 "bit.b\t{$src2, $src1}",
864 [(MSP430cmp 0, (and_su GR8:$src1, GR8:$src2)),
865 (implicit SRW)]>;
866def BIT16rr : Pseudo<(outs), (ins GR16:$src1, GR16:$src2),
867 "bit.w\t{$src2, $src1}",
868 [(MSP430cmp 0, (and_su GR16:$src1, GR16:$src2)),
869 (implicit SRW)]>;
870}
871def BIT8ri : Pseudo<(outs), (ins GR8:$src1, i8imm:$src2),
872 "bit.b\t{$src2, $src1}",
873 [(MSP430cmp 0, (and_su GR8:$src1, imm:$src2)),
874 (implicit SRW)]>;
875def BIT16ri : Pseudo<(outs), (ins GR16:$src1, i16imm:$src2),
876 "bit.w\t{$src2, $src1}",
877 [(MSP430cmp 0, (and_su GR16:$src1, imm:$src2)),
878 (implicit SRW)]>;
879
880def BIT8rm : Pseudo<(outs), (ins GR8:$src1, memdst:$src2),
881 "bit.b\t{$src2, $src1}",
882 [(MSP430cmp 0, (and_su GR8:$src1, (load addr:$src2))),
883 (implicit SRW)]>;
884def BIT16rm : Pseudo<(outs), (ins GR16:$src1, memdst:$src2),
885 "bit.w\t{$src2, $src1}",
886 [(MSP430cmp 0, (and_su GR16:$src1, (load addr:$src2))),
887 (implicit SRW)]>;
888
889def BIT8mr : Pseudo<(outs), (ins memsrc:$src1, GR8:$src2),
890 "bit.b\t{$src2, $src1}",
891 [(MSP430cmp 0, (and_su (load addr:$src1), GR8:$src2)),
892 (implicit SRW)]>;
893def BIT16mr : Pseudo<(outs), (ins memsrc:$src1, GR16:$src2),
894 "bit.w\t{$src2, $src1}",
895 [(MSP430cmp 0, (and_su (load addr:$src1), GR16:$src2)),
896 (implicit SRW)]>;
897
898def BIT8mi : Pseudo<(outs), (ins memsrc:$src1, i8imm:$src2),
899 "bit.b\t{$src2, $src1}",
900 [(MSP430cmp 0, (and_su (load addr:$src1), (i8 imm:$src2))),
901 (implicit SRW)]>;
902def BIT16mi : Pseudo<(outs), (ins memsrc:$src1, i16imm:$src2),
903 "bit.w\t{$src2, $src1}",
904 [(MSP430cmp 0, (and_su (load addr:$src1), (i16 imm:$src2))),
905 (implicit SRW)]>;
906
907def BIT8mm : Pseudo<(outs), (ins memsrc:$src1, memsrc:$src2),
908 "bit.b\t{$src2, $src1}",
909 [(MSP430cmp 0, (and_su (i8 (load addr:$src1)),
910 (load addr:$src2))),
911 (implicit SRW)]>;
912def BIT16mm : Pseudo<(outs), (ins memsrc:$src1, memsrc:$src2),
913 "bit.w\t{$src2, $src1}",
914 [(MSP430cmp 0, (and_su (i16 (load addr:$src1)),
915 (load addr:$src2))),
916 (implicit SRW)]>;
Anton Korobeynikov38c44b92009-05-03 13:12:06 +0000917} // Defs = [SRW]
918
Anton Korobeynikov4c88f112009-05-03 13:06:03 +0000919//===----------------------------------------------------------------------===//
920// Non-Instruction Patterns
921
922// extload
923def : Pat<(extloadi16i8 addr:$src), (MOVZX16rm8 addr:$src)>;
Anton Korobeynikov7aefbb32009-05-03 13:06:26 +0000924
Anton Korobeynikovc0d68e12009-05-03 13:15:57 +0000925// anyext
926def : Pat<(anyext addr:$src), (MOVZX16rr8 GR8:$src)>;
927
Anton Korobeynikov7aefbb32009-05-03 13:06:26 +0000928// truncs
929def : Pat<(i8 (trunc GR16:$src)),
930 (EXTRACT_SUBREG GR16:$src, subreg_8bit)>;
Anton Korobeynikove60685a2009-05-03 13:08:13 +0000931
Anton Korobeynikov165bbe32009-05-03 13:14:46 +0000932// GlobalAddress, ExternalSymbol
Anton Korobeynikov3c10ef52009-05-03 13:10:26 +0000933def : Pat<(i16 (MSP430Wrapper tglobaladdr:$dst)), (MOV16ri tglobaladdr:$dst)>;
Anton Korobeynikov165bbe32009-05-03 13:14:46 +0000934def : Pat<(i16 (MSP430Wrapper texternalsym:$dst)), (MOV16ri texternalsym:$dst)>;
Anton Korobeynikov13d927f2009-05-03 13:08:33 +0000935
936def : Pat<(add GR16:$src1, (MSP430Wrapper tglobaladdr :$src2)),
937 (ADD16ri GR16:$src1, tglobaladdr:$src2)>;
Anton Korobeynikov165bbe32009-05-03 13:14:46 +0000938def : Pat<(add GR16:$src1, (MSP430Wrapper texternalsym:$src2)),
939 (ADD16ri GR16:$src1, texternalsym:$src2)>;
940
941def : Pat<(store (i16 (MSP430Wrapper tglobaladdr:$src)), addr:$dst),
942 (MOV16mi addr:$dst, tglobaladdr:$src)>;
943def : Pat<(store (i16 (MSP430Wrapper texternalsym:$src)), addr:$dst),
944 (MOV16mi addr:$dst, texternalsym:$src)>;
Anton Korobeynikov13d927f2009-05-03 13:08:33 +0000945
Anton Korobeynikove60685a2009-05-03 13:08:13 +0000946// calls
947def : Pat<(MSP430call (i16 tglobaladdr:$dst)),
948 (CALLi tglobaladdr:$dst)>;
Anton Korobeynikov165bbe32009-05-03 13:14:46 +0000949def : Pat<(MSP430call (i16 texternalsym:$dst)),
950 (CALLi texternalsym:$dst)>;
Anton Korobeynikovd7d974a2009-05-03 13:13:34 +0000951
952// add and sub always produce carry
953def : Pat<(addc GR16:$src1, GR16:$src2),
954 (ADD16rr GR16:$src1, GR16:$src2)>;
955def : Pat<(addc GR16:$src1, (load addr:$src2)),
956 (ADD16rm GR16:$src1, addr:$src2)>;
957def : Pat<(addc GR16:$src1, imm:$src2),
958 (ADD16ri GR16:$src1, imm:$src2)>;
959def : Pat<(store (addc (load addr:$dst), GR16:$src), addr:$dst),
960 (ADD16mr addr:$dst, GR16:$src)>;
961def : Pat<(store (addc (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
962 (ADD16mm addr:$dst, addr:$src)>;
963
964def : Pat<(addc GR8:$src1, GR8:$src2),
965 (ADD8rr GR8:$src1, GR8:$src2)>;
966def : Pat<(addc GR8:$src1, (load addr:$src2)),
967 (ADD8rm GR8:$src1, addr:$src2)>;
968def : Pat<(addc GR8:$src1, imm:$src2),
969 (ADD8ri GR8:$src1, imm:$src2)>;
970def : Pat<(store (addc (load addr:$dst), GR8:$src), addr:$dst),
971 (ADD8mr addr:$dst, GR8:$src)>;
972def : Pat<(store (addc (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
973 (ADD8mm addr:$dst, addr:$src)>;
974
975def : Pat<(subc GR16:$src1, GR16:$src2),
976 (SUB16rr GR16:$src1, GR16:$src2)>;
977def : Pat<(subc GR16:$src1, (load addr:$src2)),
978 (SUB16rm GR16:$src1, addr:$src2)>;
979def : Pat<(subc GR16:$src1, imm:$src2),
980 (SUB16ri GR16:$src1, imm:$src2)>;
981def : Pat<(store (subc (load addr:$dst), GR16:$src), addr:$dst),
982 (SUB16mr addr:$dst, GR16:$src)>;
983def : Pat<(store (subc (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
984 (SUB16mm addr:$dst, addr:$src)>;
985
986def : Pat<(subc GR8:$src1, GR8:$src2),
987 (SUB8rr GR8:$src1, GR8:$src2)>;
988def : Pat<(subc GR8:$src1, (load addr:$src2)),
989 (SUB8rm GR8:$src1, addr:$src2)>;
990def : Pat<(subc GR8:$src1, imm:$src2),
991 (SUB8ri GR8:$src1, imm:$src2)>;
992def : Pat<(store (subc (load addr:$dst), GR8:$src), addr:$dst),
993 (SUB8mr addr:$dst, GR8:$src)>;
994def : Pat<(store (subc (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
995 (SUB8mm addr:$dst, addr:$src)>;
Anton Korobeynikove3b260e2009-11-08 15:32:28 +0000996
997// peephole patterns
998def : Pat<(and GR16:$src, 255), (ZEXT16r GR16:$src)>;
Anton Korobeynikov3caef712009-12-08 01:03:04 +0000999def : Pat<(MSP430cmp 0, (trunc (and_su GR16:$src1, GR16:$src2))),
1000 (BIT8rr (EXTRACT_SUBREG GR16:$src1, subreg_8bit),
1001 (EXTRACT_SUBREG GR16:$src2, subreg_8bit))>;