xref: /aosp_15_r20/external/llvm/lib/Target/MSP430/MSP430InstrInfo.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//===-- MSP430InstrInfo.td - MSP430 Instruction defs -------*- tablegen -*-===//
2*9880d681SAndroid Build Coastguard Worker//
3*9880d681SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker//
5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker//
8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker//
10*9880d681SAndroid Build Coastguard Worker// This file describes the MSP430 instructions in TableGen format.
11*9880d681SAndroid Build Coastguard Worker//
12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerinclude "MSP430InstrFormats.td"
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
17*9880d681SAndroid Build Coastguard Worker// Type Constraints.
18*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
19*9880d681SAndroid Build Coastguard Workerclass SDTCisI8<int OpNum> : SDTCisVT<OpNum, i8>;
20*9880d681SAndroid Build Coastguard Workerclass SDTCisI16<int OpNum> : SDTCisVT<OpNum, i16>;
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
23*9880d681SAndroid Build Coastguard Worker// Type Profiles.
24*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
25*9880d681SAndroid Build Coastguard Workerdef SDT_MSP430Call         : SDTypeProfile<0, -1, [SDTCisVT<0, iPTR>]>;
26*9880d681SAndroid Build Coastguard Workerdef SDT_MSP430CallSeqStart : SDCallSeqStart<[SDTCisVT<0, i16>]>;
27*9880d681SAndroid Build Coastguard Workerdef SDT_MSP430CallSeqEnd   : SDCallSeqEnd<[SDTCisVT<0, i16>, SDTCisVT<1, i16>]>;
28*9880d681SAndroid Build Coastguard Workerdef SDT_MSP430Wrapper      : SDTypeProfile<1, 1, [SDTCisSameAs<0, 1>,
29*9880d681SAndroid Build Coastguard Worker                                                  SDTCisPtrTy<0>]>;
30*9880d681SAndroid Build Coastguard Workerdef SDT_MSP430Cmp          : SDTypeProfile<0, 2, [SDTCisSameAs<0, 1>]>;
31*9880d681SAndroid Build Coastguard Workerdef SDT_MSP430BrCC         : SDTypeProfile<0, 2, [SDTCisVT<0, OtherVT>,
32*9880d681SAndroid Build Coastguard Worker                                                  SDTCisVT<1, i8>]>;
33*9880d681SAndroid Build Coastguard Workerdef SDT_MSP430SelectCC     : SDTypeProfile<1, 3, [SDTCisSameAs<0, 1>,
34*9880d681SAndroid Build Coastguard Worker                                                  SDTCisSameAs<1, 2>,
35*9880d681SAndroid Build Coastguard Worker                                                  SDTCisVT<3, i8>]>;
36*9880d681SAndroid Build Coastguard Workerdef SDT_MSP430Shift        : SDTypeProfile<1, 2, [SDTCisSameAs<0, 1>,
37*9880d681SAndroid Build Coastguard Worker                                                  SDTCisI8<2>]>;
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
40*9880d681SAndroid Build Coastguard Worker// MSP430 Specific Node Definitions.
41*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
42*9880d681SAndroid Build Coastguard Workerdef MSP430retflag  : SDNode<"MSP430ISD::RET_FLAG", SDTNone,
43*9880d681SAndroid Build Coastguard Worker                       [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>;
44*9880d681SAndroid Build Coastguard Workerdef MSP430retiflag : SDNode<"MSP430ISD::RETI_FLAG", SDTNone,
45*9880d681SAndroid Build Coastguard Worker                       [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>;
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdef MSP430rra     : SDNode<"MSP430ISD::RRA", SDTIntUnaryOp, []>;
48*9880d681SAndroid Build Coastguard Workerdef MSP430rla     : SDNode<"MSP430ISD::RLA", SDTIntUnaryOp, []>;
49*9880d681SAndroid Build Coastguard Workerdef MSP430rrc     : SDNode<"MSP430ISD::RRC", SDTIntUnaryOp, []>;
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Workerdef MSP430call    : SDNode<"MSP430ISD::CALL", SDT_MSP430Call,
52*9880d681SAndroid Build Coastguard Worker                     [SDNPHasChain, SDNPOutGlue, SDNPOptInGlue, SDNPVariadic]>;
53*9880d681SAndroid Build Coastguard Workerdef MSP430callseq_start :
54*9880d681SAndroid Build Coastguard Worker                 SDNode<"ISD::CALLSEQ_START", SDT_MSP430CallSeqStart,
55*9880d681SAndroid Build Coastguard Worker                        [SDNPHasChain, SDNPOutGlue]>;
56*9880d681SAndroid Build Coastguard Workerdef MSP430callseq_end :
57*9880d681SAndroid Build Coastguard Worker                 SDNode<"ISD::CALLSEQ_END",   SDT_MSP430CallSeqEnd,
58*9880d681SAndroid Build Coastguard Worker                        [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>;
59*9880d681SAndroid Build Coastguard Workerdef MSP430Wrapper : SDNode<"MSP430ISD::Wrapper", SDT_MSP430Wrapper>;
60*9880d681SAndroid Build Coastguard Workerdef MSP430cmp     : SDNode<"MSP430ISD::CMP", SDT_MSP430Cmp, [SDNPOutGlue]>;
61*9880d681SAndroid Build Coastguard Workerdef MSP430brcc    : SDNode<"MSP430ISD::BR_CC", SDT_MSP430BrCC,
62*9880d681SAndroid Build Coastguard Worker                            [SDNPHasChain, SDNPInGlue]>;
63*9880d681SAndroid Build Coastguard Workerdef MSP430selectcc: SDNode<"MSP430ISD::SELECT_CC", SDT_MSP430SelectCC,
64*9880d681SAndroid Build Coastguard Worker                            [SDNPInGlue]>;
65*9880d681SAndroid Build Coastguard Workerdef MSP430shl     : SDNode<"MSP430ISD::SHL", SDT_MSP430Shift, []>;
66*9880d681SAndroid Build Coastguard Workerdef MSP430sra     : SDNode<"MSP430ISD::SRA", SDT_MSP430Shift, []>;
67*9880d681SAndroid Build Coastguard Workerdef MSP430srl     : SDNode<"MSP430ISD::SRL", SDT_MSP430Shift, []>;
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
70*9880d681SAndroid Build Coastguard Worker// MSP430 Operand Definitions.
71*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker// Address operands
74*9880d681SAndroid Build Coastguard Workerdef memsrc : Operand<i16> {
75*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printSrcMemOperand";
76*9880d681SAndroid Build Coastguard Worker  let MIOperandInfo = (ops GR16, i16imm);
77*9880d681SAndroid Build Coastguard Worker}
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerdef memdst : Operand<i16> {
80*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printSrcMemOperand";
81*9880d681SAndroid Build Coastguard Worker  let MIOperandInfo = (ops GR16, i16imm);
82*9880d681SAndroid Build Coastguard Worker}
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker// Short jump targets have OtherVT type and are printed as pcrel imm values.
85*9880d681SAndroid Build Coastguard Workerdef jmptarget : Operand<OtherVT> {
86*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printPCRelImmOperand";
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker// Operand for printing out a condition code.
90*9880d681SAndroid Build Coastguard Workerdef cc : Operand<i8> {
91*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printCCOperand";
92*9880d681SAndroid Build Coastguard Worker}
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
95*9880d681SAndroid Build Coastguard Worker// MSP430 Complex Pattern Definitions.
96*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workerdef addr : ComplexPattern<iPTR, 2, "SelectAddr", [], []>;
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
101*9880d681SAndroid Build Coastguard Worker// Pattern Fragments
102*9880d681SAndroid Build Coastguard Workerdef zextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (zextloadi8 node:$ptr))>;
103*9880d681SAndroid Build Coastguard Workerdef  extloadi16i8 : PatFrag<(ops node:$ptr), (i16 ( extloadi8 node:$ptr))>;
104*9880d681SAndroid Build Coastguard Workerdef and_su : PatFrag<(ops node:$lhs, node:$rhs), (and node:$lhs, node:$rhs), [{
105*9880d681SAndroid Build Coastguard Worker  return N->hasOneUse();
106*9880d681SAndroid Build Coastguard Worker}]>;
107*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
108*9880d681SAndroid Build Coastguard Worker// Instruction list..
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker// ADJCALLSTACKDOWN/UP implicitly use/def SP because they may be expanded into
111*9880d681SAndroid Build Coastguard Worker// a stack adjustment and the codegen must know that they may modify the stack
112*9880d681SAndroid Build Coastguard Worker// pointer before prolog-epilog rewriting occurs.
113*9880d681SAndroid Build Coastguard Worker// Pessimistically assume ADJCALLSTACKDOWN / ADJCALLSTACKUP will become
114*9880d681SAndroid Build Coastguard Worker// sub / add which can clobber SR.
115*9880d681SAndroid Build Coastguard Workerlet Defs = [SP, SR], Uses = [SP] in {
116*9880d681SAndroid Build Coastguard Workerdef ADJCALLSTACKDOWN : Pseudo<(outs), (ins i16imm:$amt),
117*9880d681SAndroid Build Coastguard Worker                              "#ADJCALLSTACKDOWN",
118*9880d681SAndroid Build Coastguard Worker                              [(MSP430callseq_start timm:$amt)]>;
119*9880d681SAndroid Build Coastguard Workerdef ADJCALLSTACKUP   : Pseudo<(outs), (ins i16imm:$amt1, i16imm:$amt2),
120*9880d681SAndroid Build Coastguard Worker                              "#ADJCALLSTACKUP",
121*9880d681SAndroid Build Coastguard Worker                              [(MSP430callseq_end timm:$amt1, timm:$amt2)]>;
122*9880d681SAndroid Build Coastguard Worker}
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Workerlet usesCustomInserter = 1 in {
125*9880d681SAndroid Build Coastguard Worker  def Select8  : Pseudo<(outs GR8:$dst), (ins GR8:$src, GR8:$src2, i8imm:$cc),
126*9880d681SAndroid Build Coastguard Worker                        "# Select8 PSEUDO",
127*9880d681SAndroid Build Coastguard Worker                        [(set GR8:$dst,
128*9880d681SAndroid Build Coastguard Worker                          (MSP430selectcc GR8:$src, GR8:$src2, imm:$cc))]>;
129*9880d681SAndroid Build Coastguard Worker  def Select16 : Pseudo<(outs GR16:$dst), (ins GR16:$src, GR16:$src2, i8imm:$cc),
130*9880d681SAndroid Build Coastguard Worker                        "# Select16 PSEUDO",
131*9880d681SAndroid Build Coastguard Worker                        [(set GR16:$dst,
132*9880d681SAndroid Build Coastguard Worker                          (MSP430selectcc GR16:$src, GR16:$src2, imm:$cc))]>;
133*9880d681SAndroid Build Coastguard Worker  let Defs = [SR] in {
134*9880d681SAndroid Build Coastguard Worker  def Shl8     : Pseudo<(outs GR8:$dst), (ins GR8:$src, GR8:$cnt),
135*9880d681SAndroid Build Coastguard Worker                        "# Shl8 PSEUDO",
136*9880d681SAndroid Build Coastguard Worker                        [(set GR8:$dst, (MSP430shl GR8:$src, GR8:$cnt))]>;
137*9880d681SAndroid Build Coastguard Worker  def Shl16    : Pseudo<(outs GR16:$dst), (ins GR16:$src, GR8:$cnt),
138*9880d681SAndroid Build Coastguard Worker                        "# Shl16 PSEUDO",
139*9880d681SAndroid Build Coastguard Worker                        [(set GR16:$dst, (MSP430shl GR16:$src, GR8:$cnt))]>;
140*9880d681SAndroid Build Coastguard Worker  def Sra8     : Pseudo<(outs GR8:$dst), (ins GR8:$src, GR8:$cnt),
141*9880d681SAndroid Build Coastguard Worker                        "# Sra8 PSEUDO",
142*9880d681SAndroid Build Coastguard Worker                        [(set GR8:$dst, (MSP430sra GR8:$src, GR8:$cnt))]>;
143*9880d681SAndroid Build Coastguard Worker  def Sra16    : Pseudo<(outs GR16:$dst), (ins GR16:$src, GR8:$cnt),
144*9880d681SAndroid Build Coastguard Worker                        "# Sra16 PSEUDO",
145*9880d681SAndroid Build Coastguard Worker                        [(set GR16:$dst, (MSP430sra GR16:$src, GR8:$cnt))]>;
146*9880d681SAndroid Build Coastguard Worker  def Srl8     : Pseudo<(outs GR8:$dst), (ins GR8:$src, GR8:$cnt),
147*9880d681SAndroid Build Coastguard Worker                        "# Srl8 PSEUDO",
148*9880d681SAndroid Build Coastguard Worker                        [(set GR8:$dst, (MSP430srl GR8:$src, GR8:$cnt))]>;
149*9880d681SAndroid Build Coastguard Worker  def Srl16    : Pseudo<(outs GR16:$dst), (ins GR16:$src, GR8:$cnt),
150*9880d681SAndroid Build Coastguard Worker                        "# Srl16 PSEUDO",
151*9880d681SAndroid Build Coastguard Worker                        [(set GR16:$dst, (MSP430srl GR16:$src, GR8:$cnt))]>;
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker  }
154*9880d681SAndroid Build Coastguard Worker}
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in
157*9880d681SAndroid Build Coastguard Workerdef NOP : Pseudo<(outs), (ins), "nop", []>;
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
160*9880d681SAndroid Build Coastguard Worker//  Control Flow Instructions...
161*9880d681SAndroid Build Coastguard Worker//
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Worker// FIXME: Provide proper encoding!
164*9880d681SAndroid Build Coastguard Workerlet isReturn = 1, isTerminator = 1, isBarrier = 1 in {
165*9880d681SAndroid Build Coastguard Worker  def RET  : IForm16<0x0, DstReg, SrcPostInc, Size2Bytes,
166*9880d681SAndroid Build Coastguard Worker                     (outs), (ins), "ret",  [(MSP430retflag)]>;
167*9880d681SAndroid Build Coastguard Worker  def RETI : II16r<0x0, (outs), (ins), "reti", [(MSP430retiflag)]>;
168*9880d681SAndroid Build Coastguard Worker}
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Workerlet isBranch = 1, isTerminator = 1 in {
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Worker// FIXME: expand opcode & cond field for branches!
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Worker// Direct branch
175*9880d681SAndroid Build Coastguard Workerlet isBarrier = 1 in {
176*9880d681SAndroid Build Coastguard Worker  // Short branch
177*9880d681SAndroid Build Coastguard Worker  def JMP : CJForm<0, 0, (outs), (ins jmptarget:$dst),
178*9880d681SAndroid Build Coastguard Worker                   "jmp\t$dst",
179*9880d681SAndroid Build Coastguard Worker                   [(br bb:$dst)]>;
180*9880d681SAndroid Build Coastguard Worker  let isIndirectBranch = 1 in {
181*9880d681SAndroid Build Coastguard Worker    // Long branches
182*9880d681SAndroid Build Coastguard Worker    def Bi  : I16ri<0, (outs), (ins i16imm:$brdst),
183*9880d681SAndroid Build Coastguard Worker                    "br\t$brdst",
184*9880d681SAndroid Build Coastguard Worker                    [(brind tblockaddress:$brdst)]>;
185*9880d681SAndroid Build Coastguard Worker    def Br  : I16rr<0, (outs), (ins GR16:$brdst),
186*9880d681SAndroid Build Coastguard Worker                    "br\t$brdst",
187*9880d681SAndroid Build Coastguard Worker                    [(brind GR16:$brdst)]>;
188*9880d681SAndroid Build Coastguard Worker    def Bm  : I16rm<0, (outs), (ins memsrc:$brdst),
189*9880d681SAndroid Build Coastguard Worker                    "br\t$brdst",
190*9880d681SAndroid Build Coastguard Worker                    [(brind (load addr:$brdst))]>;
191*9880d681SAndroid Build Coastguard Worker  }
192*9880d681SAndroid Build Coastguard Worker}
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Worker// Conditional branches
195*9880d681SAndroid Build Coastguard Workerlet Uses = [SR] in
196*9880d681SAndroid Build Coastguard Worker  def JCC : CJForm<0, 0,
197*9880d681SAndroid Build Coastguard Worker                   (outs), (ins jmptarget:$dst, cc:$cc),
198*9880d681SAndroid Build Coastguard Worker                   "j$cc\t$dst",
199*9880d681SAndroid Build Coastguard Worker                   [(MSP430brcc bb:$dst, imm:$cc)]>;
200*9880d681SAndroid Build Coastguard Worker} // isBranch, isTerminator
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
203*9880d681SAndroid Build Coastguard Worker//  Call Instructions...
204*9880d681SAndroid Build Coastguard Worker//
205*9880d681SAndroid Build Coastguard Workerlet isCall = 1 in
206*9880d681SAndroid Build Coastguard Worker  // All calls clobber the non-callee saved registers. SPW is marked as
207*9880d681SAndroid Build Coastguard Worker  // a use to prevent stack-pointer assignments that appear immediately
208*9880d681SAndroid Build Coastguard Worker  // before calls from potentially appearing dead. Uses for argument
209*9880d681SAndroid Build Coastguard Worker  // registers are added manually.
210*9880d681SAndroid Build Coastguard Worker  let Defs = [R12, R13, R14, R15, SR],
211*9880d681SAndroid Build Coastguard Worker      Uses = [SP] in {
212*9880d681SAndroid Build Coastguard Worker    def CALLi     : II16i<0x0,
213*9880d681SAndroid Build Coastguard Worker                          (outs), (ins i16imm:$dst),
214*9880d681SAndroid Build Coastguard Worker                          "call\t$dst", [(MSP430call imm:$dst)]>;
215*9880d681SAndroid Build Coastguard Worker    def CALLr     : II16r<0x0,
216*9880d681SAndroid Build Coastguard Worker                          (outs), (ins GR16:$dst),
217*9880d681SAndroid Build Coastguard Worker                          "call\t$dst", [(MSP430call GR16:$dst)]>;
218*9880d681SAndroid Build Coastguard Worker    def CALLm     : II16m<0x0,
219*9880d681SAndroid Build Coastguard Worker                          (outs), (ins memsrc:$dst),
220*9880d681SAndroid Build Coastguard Worker                          "call\t${dst:mem}", [(MSP430call (load addr:$dst))]>;
221*9880d681SAndroid Build Coastguard Worker  }
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Worker
224*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
225*9880d681SAndroid Build Coastguard Worker//  Miscellaneous Instructions...
226*9880d681SAndroid Build Coastguard Worker//
227*9880d681SAndroid Build Coastguard Workerlet Defs = [SP], Uses = [SP], hasSideEffects=0 in {
228*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1 in
229*9880d681SAndroid Build Coastguard Workerdef POP16r   : IForm16<0x0, DstReg, SrcPostInc, Size2Bytes,
230*9880d681SAndroid Build Coastguard Worker                       (outs GR16:$reg), (ins), "pop.w\t$reg", []>;
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard Workerlet mayStore = 1 in
233*9880d681SAndroid Build Coastguard Workerdef PUSH16r  : II16r<0x0,
234*9880d681SAndroid Build Coastguard Worker                     (outs), (ins GR16:$reg), "push.w\t$reg",[]>;
235*9880d681SAndroid Build Coastguard Worker}
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
238*9880d681SAndroid Build Coastguard Worker// Move Instructions
239*9880d681SAndroid Build Coastguard Worker
240*9880d681SAndroid Build Coastguard Worker// FIXME: Provide proper encoding!
241*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in {
242*9880d681SAndroid Build Coastguard Workerdef MOV8rr  : I8rr<0x0,
243*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src),
244*9880d681SAndroid Build Coastguard Worker                   "mov.b\t{$src, $dst}",
245*9880d681SAndroid Build Coastguard Worker                   []>;
246*9880d681SAndroid Build Coastguard Workerdef MOV16rr : I16rr<0x0,
247*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src),
248*9880d681SAndroid Build Coastguard Worker                    "mov.w\t{$src, $dst}",
249*9880d681SAndroid Build Coastguard Worker                    []>;
250*9880d681SAndroid Build Coastguard Worker}
251*9880d681SAndroid Build Coastguard Worker
252*9880d681SAndroid Build Coastguard Worker// FIXME: Provide proper encoding!
253*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isAsCheapAsAMove = 1 in {
254*9880d681SAndroid Build Coastguard Workerdef MOV8ri  : I8ri<0x0,
255*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins i8imm:$src),
256*9880d681SAndroid Build Coastguard Worker                   "mov.b\t{$src, $dst}",
257*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, imm:$src)]>;
258*9880d681SAndroid Build Coastguard Workerdef MOV16ri : I16ri<0x0,
259*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins i16imm:$src),
260*9880d681SAndroid Build Coastguard Worker                    "mov.w\t{$src, $dst}",
261*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, imm:$src)]>;
262*9880d681SAndroid Build Coastguard Worker}
263*9880d681SAndroid Build Coastguard Worker
264*9880d681SAndroid Build Coastguard Workerlet canFoldAsLoad = 1, isReMaterializable = 1 in {
265*9880d681SAndroid Build Coastguard Workerdef MOV8rm  : I8rm<0x0,
266*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins memsrc:$src),
267*9880d681SAndroid Build Coastguard Worker                   "mov.b\t{$src, $dst}",
268*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (load addr:$src))]>;
269*9880d681SAndroid Build Coastguard Workerdef MOV16rm : I16rm<0x0,
270*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins memsrc:$src),
271*9880d681SAndroid Build Coastguard Worker                    "mov.w\t{$src, $dst}",
272*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (load addr:$src))]>;
273*9880d681SAndroid Build Coastguard Worker}
274*9880d681SAndroid Build Coastguard Worker
275*9880d681SAndroid Build Coastguard Workerdef MOVZX16rr8 : I8rr<0x0,
276*9880d681SAndroid Build Coastguard Worker                      (outs GR16:$dst), (ins GR8:$src),
277*9880d681SAndroid Build Coastguard Worker                      "mov.b\t{$src, $dst}",
278*9880d681SAndroid Build Coastguard Worker                      [(set GR16:$dst, (zext GR8:$src))]>;
279*9880d681SAndroid Build Coastguard Workerdef MOVZX16rm8 : I8rm<0x0,
280*9880d681SAndroid Build Coastguard Worker                      (outs GR16:$dst), (ins memsrc:$src),
281*9880d681SAndroid Build Coastguard Worker                      "mov.b\t{$src, $dst}",
282*9880d681SAndroid Build Coastguard Worker                      [(set GR16:$dst, (zextloadi16i8 addr:$src))]>;
283*9880d681SAndroid Build Coastguard Worker
284*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, hasExtraDefRegAllocReq = 1, Constraints = "$base = $base_wb" in {
285*9880d681SAndroid Build Coastguard Workerdef MOV8rm_POST  : IForm8<0x0, DstReg, SrcPostInc, Size2Bytes,
286*9880d681SAndroid Build Coastguard Worker                         (outs GR8:$dst, GR16:$base_wb), (ins GR16:$base),
287*9880d681SAndroid Build Coastguard Worker                         "mov.b\t{@$base+, $dst}", []>;
288*9880d681SAndroid Build Coastguard Workerdef MOV16rm_POST : IForm16<0x0, DstReg, SrcPostInc, Size2Bytes,
289*9880d681SAndroid Build Coastguard Worker                           (outs GR16:$dst, GR16:$base_wb), (ins GR16:$base),
290*9880d681SAndroid Build Coastguard Worker                           "mov.w\t{@$base+, $dst}", []>;
291*9880d681SAndroid Build Coastguard Worker}
292*9880d681SAndroid Build Coastguard Worker
293*9880d681SAndroid Build Coastguard Worker// Any instruction that defines a 8-bit result leaves the high half of the
294*9880d681SAndroid Build Coastguard Worker// register. Truncate can be lowered to EXTRACT_SUBREG, and CopyFromReg may
295*9880d681SAndroid Build Coastguard Worker// be copying from a truncate, but any other 8-bit operation will zero-extend
296*9880d681SAndroid Build Coastguard Worker// up to 16 bits.
297*9880d681SAndroid Build Coastguard Workerdef def8 : PatLeaf<(i8 GR8:$src), [{
298*9880d681SAndroid Build Coastguard Worker  return N->getOpcode() != ISD::TRUNCATE &&
299*9880d681SAndroid Build Coastguard Worker         N->getOpcode() != TargetOpcode::EXTRACT_SUBREG &&
300*9880d681SAndroid Build Coastguard Worker         N->getOpcode() != ISD::CopyFromReg;
301*9880d681SAndroid Build Coastguard Worker}]>;
302*9880d681SAndroid Build Coastguard Worker
303*9880d681SAndroid Build Coastguard Worker// In the case of a 8-bit def that is known to implicitly zero-extend,
304*9880d681SAndroid Build Coastguard Worker// we can use a SUBREG_TO_REG.
305*9880d681SAndroid Build Coastguard Workerdef : Pat<(i16 (zext def8:$src)),
306*9880d681SAndroid Build Coastguard Worker          (SUBREG_TO_REG (i16 0), GR8:$src, subreg_8bit)>;
307*9880d681SAndroid Build Coastguard Worker
308*9880d681SAndroid Build Coastguard Workerdef MOV8mi  : I8mi<0x0,
309*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, i8imm:$src),
310*9880d681SAndroid Build Coastguard Worker                   "mov.b\t{$src, $dst}",
311*9880d681SAndroid Build Coastguard Worker                   [(store (i8 imm:$src), addr:$dst)]>;
312*9880d681SAndroid Build Coastguard Workerdef MOV16mi : I16mi<0x0,
313*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, i16imm:$src),
314*9880d681SAndroid Build Coastguard Worker                    "mov.w\t{$src, $dst}",
315*9880d681SAndroid Build Coastguard Worker                    [(store (i16 imm:$src), addr:$dst)]>;
316*9880d681SAndroid Build Coastguard Worker
317*9880d681SAndroid Build Coastguard Workerdef MOV8mr  : I8mr<0x0,
318*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, GR8:$src),
319*9880d681SAndroid Build Coastguard Worker                   "mov.b\t{$src, $dst}",
320*9880d681SAndroid Build Coastguard Worker                   [(store GR8:$src, addr:$dst)]>;
321*9880d681SAndroid Build Coastguard Workerdef MOV16mr : I16mr<0x0,
322*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, GR16:$src),
323*9880d681SAndroid Build Coastguard Worker                    "mov.w\t{$src, $dst}",
324*9880d681SAndroid Build Coastguard Worker                    [(store GR16:$src, addr:$dst)]>;
325*9880d681SAndroid Build Coastguard Worker
326*9880d681SAndroid Build Coastguard Workerdef MOV8mm  : I8mm<0x0,
327*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, memsrc:$src),
328*9880d681SAndroid Build Coastguard Worker                   "mov.b\t{$src, $dst}",
329*9880d681SAndroid Build Coastguard Worker                   [(store (i8 (load addr:$src)), addr:$dst)]>;
330*9880d681SAndroid Build Coastguard Workerdef MOV16mm : I16mm<0x0,
331*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, memsrc:$src),
332*9880d681SAndroid Build Coastguard Worker                    "mov.w\t{$src, $dst}",
333*9880d681SAndroid Build Coastguard Worker                    [(store (i16 (load addr:$src)), addr:$dst)]>;
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
336*9880d681SAndroid Build Coastguard Worker// Arithmetic Instructions
337*9880d681SAndroid Build Coastguard Worker
338*9880d681SAndroid Build Coastguard Workerlet Constraints = "$src = $dst" in {
339*9880d681SAndroid Build Coastguard Worker
340*9880d681SAndroid Build Coastguard Workerlet Defs = [SR] in {
341*9880d681SAndroid Build Coastguard Worker
342*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in { // X = ADD Y, Z  == X = ADD Z, Y
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Workerdef ADD8rr  : I8rr<0x0,
345*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src, GR8:$src2),
346*9880d681SAndroid Build Coastguard Worker                   "add.b\t{$src2, $dst}",
347*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (add GR8:$src, GR8:$src2)),
348*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
349*9880d681SAndroid Build Coastguard Workerdef ADD16rr : I16rr<0x0,
350*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src, GR16:$src2),
351*9880d681SAndroid Build Coastguard Worker                    "add.w\t{$src2, $dst}",
352*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (add GR16:$src, GR16:$src2)),
353*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
354*9880d681SAndroid Build Coastguard Worker}
355*9880d681SAndroid Build Coastguard Worker
356*9880d681SAndroid Build Coastguard Workerdef ADD8rm  : I8rm<0x0,
357*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src, memsrc:$src2),
358*9880d681SAndroid Build Coastguard Worker                   "add.b\t{$src2, $dst}",
359*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (add GR8:$src, (load addr:$src2))),
360*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
361*9880d681SAndroid Build Coastguard Workerdef ADD16rm : I16rm<0x0,
362*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src, memsrc:$src2),
363*9880d681SAndroid Build Coastguard Worker                    "add.w\t{$src2, $dst}",
364*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (add GR16:$src, (load addr:$src2))),
365*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
366*9880d681SAndroid Build Coastguard Worker
367*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, hasExtraDefRegAllocReq = 1,
368*9880d681SAndroid Build Coastguard WorkerConstraints = "$base = $base_wb, $src = $dst" in {
369*9880d681SAndroid Build Coastguard Workerdef ADD8rm_POST : IForm8<0x0, DstReg, SrcPostInc, Size2Bytes,
370*9880d681SAndroid Build Coastguard Worker                         (outs GR8:$dst, GR16:$base_wb),
371*9880d681SAndroid Build Coastguard Worker                         (ins GR8:$src, GR16:$base),
372*9880d681SAndroid Build Coastguard Worker                         "add.b\t{@$base+, $dst}", []>;
373*9880d681SAndroid Build Coastguard Workerdef ADD16rm_POST : IForm16<0x0, DstReg, SrcPostInc, Size2Bytes,
374*9880d681SAndroid Build Coastguard Worker                           (outs GR16:$dst, GR16:$base_wb),
375*9880d681SAndroid Build Coastguard Worker                           (ins GR16:$src, GR16:$base),
376*9880d681SAndroid Build Coastguard Worker                          "add.w\t{@$base+, $dst}", []>;
377*9880d681SAndroid Build Coastguard Worker}
378*9880d681SAndroid Build Coastguard Worker
379*9880d681SAndroid Build Coastguard Worker
380*9880d681SAndroid Build Coastguard Workerdef ADD8ri  : I8ri<0x0,
381*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src, i8imm:$src2),
382*9880d681SAndroid Build Coastguard Worker                   "add.b\t{$src2, $dst}",
383*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (add GR8:$src, imm:$src2)),
384*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
385*9880d681SAndroid Build Coastguard Workerdef ADD16ri : I16ri<0x0,
386*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src, i16imm:$src2),
387*9880d681SAndroid Build Coastguard Worker                    "add.w\t{$src2, $dst}",
388*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (add GR16:$src, imm:$src2)),
389*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
390*9880d681SAndroid Build Coastguard Worker
391*9880d681SAndroid Build Coastguard Workerlet Constraints = "" in {
392*9880d681SAndroid Build Coastguard Workerdef ADD8mr  : I8mr<0x0,
393*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, GR8:$src),
394*9880d681SAndroid Build Coastguard Worker                   "add.b\t{$src, $dst}",
395*9880d681SAndroid Build Coastguard Worker                   [(store (add (load addr:$dst), GR8:$src), addr:$dst),
396*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
397*9880d681SAndroid Build Coastguard Workerdef ADD16mr : I16mr<0x0,
398*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, GR16:$src),
399*9880d681SAndroid Build Coastguard Worker                    "add.w\t{$src, $dst}",
400*9880d681SAndroid Build Coastguard Worker                    [(store (add (load addr:$dst), GR16:$src), addr:$dst),
401*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard Workerdef ADD8mi  : I8mi<0x0,
404*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, i8imm:$src),
405*9880d681SAndroid Build Coastguard Worker                   "add.b\t{$src, $dst}",
406*9880d681SAndroid Build Coastguard Worker                   [(store (add (load addr:$dst), (i8 imm:$src)), addr:$dst),
407*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
408*9880d681SAndroid Build Coastguard Workerdef ADD16mi : I16mi<0x0,
409*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, i16imm:$src),
410*9880d681SAndroid Build Coastguard Worker                    "add.w\t{$src, $dst}",
411*9880d681SAndroid Build Coastguard Worker                    [(store (add (load addr:$dst), (i16 imm:$src)), addr:$dst),
412*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
413*9880d681SAndroid Build Coastguard Worker
414*9880d681SAndroid Build Coastguard Workerdef ADD8mm  : I8mm<0x0,
415*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, memsrc:$src),
416*9880d681SAndroid Build Coastguard Worker                   "add.b\t{$src, $dst}",
417*9880d681SAndroid Build Coastguard Worker                   [(store (add (load addr:$dst),
418*9880d681SAndroid Build Coastguard Worker                                (i8 (load addr:$src))), addr:$dst),
419*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
420*9880d681SAndroid Build Coastguard Workerdef ADD16mm : I16mm<0x0,
421*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, memsrc:$src),
422*9880d681SAndroid Build Coastguard Worker                    "add.w\t{$src, $dst}",
423*9880d681SAndroid Build Coastguard Worker                    [(store (add (load addr:$dst),
424*9880d681SAndroid Build Coastguard Worker                                  (i16 (load addr:$src))), addr:$dst),
425*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
426*9880d681SAndroid Build Coastguard Worker}
427*9880d681SAndroid Build Coastguard Worker
428*9880d681SAndroid Build Coastguard Workerlet Uses = [SR] in {
429*9880d681SAndroid Build Coastguard Worker
430*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in { // X = ADDC Y, Z  == X = ADDC Z, Y
431*9880d681SAndroid Build Coastguard Workerdef ADC8rr  : I8rr<0x0,
432*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src, GR8:$src2),
433*9880d681SAndroid Build Coastguard Worker                   "addc.b\t{$src2, $dst}",
434*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (adde GR8:$src, GR8:$src2)),
435*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
436*9880d681SAndroid Build Coastguard Workerdef ADC16rr : I16rr<0x0,
437*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src, GR16:$src2),
438*9880d681SAndroid Build Coastguard Worker                    "addc.w\t{$src2, $dst}",
439*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (adde GR16:$src, GR16:$src2)),
440*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
441*9880d681SAndroid Build Coastguard Worker} // isCommutable
442*9880d681SAndroid Build Coastguard Worker
443*9880d681SAndroid Build Coastguard Workerdef ADC8ri  : I8ri<0x0,
444*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src, i8imm:$src2),
445*9880d681SAndroid Build Coastguard Worker                   "addc.b\t{$src2, $dst}",
446*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (adde GR8:$src, imm:$src2)),
447*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
448*9880d681SAndroid Build Coastguard Workerdef ADC16ri : I16ri<0x0,
449*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src, i16imm:$src2),
450*9880d681SAndroid Build Coastguard Worker                    "addc.w\t{$src2, $dst}",
451*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (adde GR16:$src, imm:$src2)),
452*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
453*9880d681SAndroid Build Coastguard Worker
454*9880d681SAndroid Build Coastguard Workerdef ADC8rm  : I8rm<0x0,
455*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src, memsrc:$src2),
456*9880d681SAndroid Build Coastguard Worker                   "addc.b\t{$src2, $dst}",
457*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (adde GR8:$src, (load addr:$src2))),
458*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
459*9880d681SAndroid Build Coastguard Workerdef ADC16rm : I16rm<0x0,
460*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src, memsrc:$src2),
461*9880d681SAndroid Build Coastguard Worker                    "addc.w\t{$src2, $dst}",
462*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (adde GR16:$src, (load addr:$src2))),
463*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
464*9880d681SAndroid Build Coastguard Worker
465*9880d681SAndroid Build Coastguard Workerlet Constraints = "" in {
466*9880d681SAndroid Build Coastguard Workerdef ADC8mr  : I8mr<0x0,
467*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, GR8:$src),
468*9880d681SAndroid Build Coastguard Worker                   "addc.b\t{$src, $dst}",
469*9880d681SAndroid Build Coastguard Worker                   [(store (adde (load addr:$dst), GR8:$src), addr:$dst),
470*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
471*9880d681SAndroid Build Coastguard Workerdef ADC16mr : I16mr<0x0,
472*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, GR16:$src),
473*9880d681SAndroid Build Coastguard Worker                    "addc.w\t{$src, $dst}",
474*9880d681SAndroid Build Coastguard Worker                    [(store (adde (load addr:$dst), GR16:$src), addr:$dst),
475*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
476*9880d681SAndroid Build Coastguard Worker
477*9880d681SAndroid Build Coastguard Workerdef ADC8mi  : I8mi<0x0,
478*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, i8imm:$src),
479*9880d681SAndroid Build Coastguard Worker                   "addc.b\t{$src, $dst}",
480*9880d681SAndroid Build Coastguard Worker                   [(store (adde (load addr:$dst), (i8 imm:$src)), addr:$dst),
481*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
482*9880d681SAndroid Build Coastguard Workerdef ADC16mi : I16mi<0x0,
483*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, i16imm:$src),
484*9880d681SAndroid Build Coastguard Worker                    "addc.w\t{$src, $dst}",
485*9880d681SAndroid Build Coastguard Worker                    [(store (adde (load addr:$dst), (i16 imm:$src)), addr:$dst),
486*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
487*9880d681SAndroid Build Coastguard Worker
488*9880d681SAndroid Build Coastguard Workerdef ADC8mm  : I8mm<0x0,
489*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, memsrc:$src),
490*9880d681SAndroid Build Coastguard Worker                   "addc.b\t{$src, $dst}",
491*9880d681SAndroid Build Coastguard Worker                   [(store (adde (load addr:$dst),
492*9880d681SAndroid Build Coastguard Worker                                 (i8 (load addr:$src))), addr:$dst),
493*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
494*9880d681SAndroid Build Coastguard Workerdef ADC16mm : I8mm<0x0,
495*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, memsrc:$src),
496*9880d681SAndroid Build Coastguard Worker                   "addc.w\t{$src, $dst}",
497*9880d681SAndroid Build Coastguard Worker                   [(store (adde (load addr:$dst),
498*9880d681SAndroid Build Coastguard Worker                                 (i16 (load addr:$src))), addr:$dst),
499*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
500*9880d681SAndroid Build Coastguard Worker}
501*9880d681SAndroid Build Coastguard Worker
502*9880d681SAndroid Build Coastguard Worker} // Uses = [SR]
503*9880d681SAndroid Build Coastguard Worker
504*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in { // X = AND Y, Z  == X = AND Z, Y
505*9880d681SAndroid Build Coastguard Workerdef AND8rr  : I8rr<0x0,
506*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src, GR8:$src2),
507*9880d681SAndroid Build Coastguard Worker                   "and.b\t{$src2, $dst}",
508*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (and GR8:$src, GR8:$src2)),
509*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
510*9880d681SAndroid Build Coastguard Workerdef AND16rr : I16rr<0x0,
511*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src, GR16:$src2),
512*9880d681SAndroid Build Coastguard Worker                    "and.w\t{$src2, $dst}",
513*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (and GR16:$src, GR16:$src2)),
514*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
515*9880d681SAndroid Build Coastguard Worker}
516*9880d681SAndroid Build Coastguard Worker
517*9880d681SAndroid Build Coastguard Workerdef AND8ri  : I8ri<0x0,
518*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src, i8imm:$src2),
519*9880d681SAndroid Build Coastguard Worker                   "and.b\t{$src2, $dst}",
520*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (and GR8:$src, imm:$src2)),
521*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
522*9880d681SAndroid Build Coastguard Workerdef AND16ri : I16ri<0x0,
523*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src, i16imm:$src2),
524*9880d681SAndroid Build Coastguard Worker                    "and.w\t{$src2, $dst}",
525*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (and GR16:$src, imm:$src2)),
526*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
527*9880d681SAndroid Build Coastguard Worker
528*9880d681SAndroid Build Coastguard Workerdef AND8rm  : I8rm<0x0,
529*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src, memsrc:$src2),
530*9880d681SAndroid Build Coastguard Worker                   "and.b\t{$src2, $dst}",
531*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (and GR8:$src, (load addr:$src2))),
532*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
533*9880d681SAndroid Build Coastguard Workerdef AND16rm : I16rm<0x0,
534*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src, memsrc:$src2),
535*9880d681SAndroid Build Coastguard Worker                    "and.w\t{$src2, $dst}",
536*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (and GR16:$src, (load addr:$src2))),
537*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
538*9880d681SAndroid Build Coastguard Worker
539*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, hasExtraDefRegAllocReq = 1,
540*9880d681SAndroid Build Coastguard WorkerConstraints = "$base = $base_wb, $src = $dst" in {
541*9880d681SAndroid Build Coastguard Workerdef AND8rm_POST : IForm8<0x0, DstReg, SrcPostInc, Size2Bytes,
542*9880d681SAndroid Build Coastguard Worker                         (outs GR8:$dst, GR16:$base_wb),
543*9880d681SAndroid Build Coastguard Worker                         (ins GR8:$src, GR16:$base),
544*9880d681SAndroid Build Coastguard Worker                         "and.b\t{@$base+, $dst}", []>;
545*9880d681SAndroid Build Coastguard Workerdef AND16rm_POST : IForm16<0x0, DstReg, SrcPostInc, Size2Bytes,
546*9880d681SAndroid Build Coastguard Worker                           (outs GR16:$dst, GR16:$base_wb),
547*9880d681SAndroid Build Coastguard Worker                           (ins GR16:$src, GR16:$base),
548*9880d681SAndroid Build Coastguard Worker                           "and.w\t{@$base+, $dst}", []>;
549*9880d681SAndroid Build Coastguard Worker}
550*9880d681SAndroid Build Coastguard Worker
551*9880d681SAndroid Build Coastguard Workerlet Constraints = "" in {
552*9880d681SAndroid Build Coastguard Workerdef AND8mr  : I8mr<0x0,
553*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, GR8:$src),
554*9880d681SAndroid Build Coastguard Worker                   "and.b\t{$src, $dst}",
555*9880d681SAndroid Build Coastguard Worker                   [(store (and (load addr:$dst), GR8:$src), addr:$dst),
556*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
557*9880d681SAndroid Build Coastguard Workerdef AND16mr : I16mr<0x0,
558*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, GR16:$src),
559*9880d681SAndroid Build Coastguard Worker                    "and.w\t{$src, $dst}",
560*9880d681SAndroid Build Coastguard Worker                    [(store (and (load addr:$dst), GR16:$src), addr:$dst),
561*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
562*9880d681SAndroid Build Coastguard Worker
563*9880d681SAndroid Build Coastguard Workerdef AND8mi  : I8mi<0x0,
564*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, i8imm:$src),
565*9880d681SAndroid Build Coastguard Worker                   "and.b\t{$src, $dst}",
566*9880d681SAndroid Build Coastguard Worker                   [(store (and (load addr:$dst), (i8 imm:$src)), addr:$dst),
567*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
568*9880d681SAndroid Build Coastguard Workerdef AND16mi : I16mi<0x0,
569*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, i16imm:$src),
570*9880d681SAndroid Build Coastguard Worker                    "and.w\t{$src, $dst}",
571*9880d681SAndroid Build Coastguard Worker                    [(store (and (load addr:$dst), (i16 imm:$src)), addr:$dst),
572*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
573*9880d681SAndroid Build Coastguard Worker
574*9880d681SAndroid Build Coastguard Workerdef AND8mm  : I8mm<0x0,
575*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, memsrc:$src),
576*9880d681SAndroid Build Coastguard Worker                   "and.b\t{$src, $dst}",
577*9880d681SAndroid Build Coastguard Worker                   [(store (and (load addr:$dst),
578*9880d681SAndroid Build Coastguard Worker                                (i8 (load addr:$src))), addr:$dst),
579*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
580*9880d681SAndroid Build Coastguard Workerdef AND16mm : I16mm<0x0,
581*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, memsrc:$src),
582*9880d681SAndroid Build Coastguard Worker                    "and.w\t{$src, $dst}",
583*9880d681SAndroid Build Coastguard Worker                    [(store (and (load addr:$dst),
584*9880d681SAndroid Build Coastguard Worker                                 (i16 (load addr:$src))), addr:$dst),
585*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
586*9880d681SAndroid Build Coastguard Worker}
587*9880d681SAndroid Build Coastguard Worker
588*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in { // X = OR Y, Z  == X = OR Z, Y
589*9880d681SAndroid Build Coastguard Workerdef OR8rr  : I8rr<0x0,
590*9880d681SAndroid Build Coastguard Worker                  (outs GR8:$dst), (ins GR8:$src, GR8:$src2),
591*9880d681SAndroid Build Coastguard Worker                  "bis.b\t{$src2, $dst}",
592*9880d681SAndroid Build Coastguard Worker                  [(set GR8:$dst, (or GR8:$src, GR8:$src2))]>;
593*9880d681SAndroid Build Coastguard Workerdef OR16rr : I16rr<0x0,
594*9880d681SAndroid Build Coastguard Worker                   (outs GR16:$dst), (ins GR16:$src, GR16:$src2),
595*9880d681SAndroid Build Coastguard Worker                   "bis.w\t{$src2, $dst}",
596*9880d681SAndroid Build Coastguard Worker                   [(set GR16:$dst, (or GR16:$src, GR16:$src2))]>;
597*9880d681SAndroid Build Coastguard Worker}
598*9880d681SAndroid Build Coastguard Worker
599*9880d681SAndroid Build Coastguard Workerdef OR8ri  : I8ri<0x0,
600*9880d681SAndroid Build Coastguard Worker                  (outs GR8:$dst), (ins GR8:$src, i8imm:$src2),
601*9880d681SAndroid Build Coastguard Worker                  "bis.b\t{$src2, $dst}",
602*9880d681SAndroid Build Coastguard Worker                  [(set GR8:$dst, (or GR8:$src, imm:$src2))]>;
603*9880d681SAndroid Build Coastguard Workerdef OR16ri : I16ri<0x0,
604*9880d681SAndroid Build Coastguard Worker                   (outs GR16:$dst), (ins GR16:$src, i16imm:$src2),
605*9880d681SAndroid Build Coastguard Worker                   "bis.w\t{$src2, $dst}",
606*9880d681SAndroid Build Coastguard Worker                   [(set GR16:$dst, (or GR16:$src, imm:$src2))]>;
607*9880d681SAndroid Build Coastguard Worker
608*9880d681SAndroid Build Coastguard Workerdef OR8rm  : I8rm<0x0,
609*9880d681SAndroid Build Coastguard Worker                  (outs GR8:$dst), (ins GR8:$src, memsrc:$src2),
610*9880d681SAndroid Build Coastguard Worker                  "bis.b\t{$src2, $dst}",
611*9880d681SAndroid Build Coastguard Worker                  [(set GR8:$dst, (or GR8:$src, (load addr:$src2)))]>;
612*9880d681SAndroid Build Coastguard Workerdef OR16rm : I16rm<0x0,
613*9880d681SAndroid Build Coastguard Worker                   (outs GR16:$dst), (ins GR16:$src, memsrc:$src2),
614*9880d681SAndroid Build Coastguard Worker                   "bis.w\t{$src2, $dst}",
615*9880d681SAndroid Build Coastguard Worker                   [(set GR16:$dst, (or GR16:$src, (load addr:$src2)))]>;
616*9880d681SAndroid Build Coastguard Worker
617*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, hasExtraDefRegAllocReq = 1,
618*9880d681SAndroid Build Coastguard WorkerConstraints = "$base = $base_wb, $src = $dst" in {
619*9880d681SAndroid Build Coastguard Workerdef OR8rm_POST : IForm8<0x0, DstReg, SrcPostInc, Size2Bytes,
620*9880d681SAndroid Build Coastguard Worker                        (outs GR8:$dst, GR16:$base_wb),
621*9880d681SAndroid Build Coastguard Worker                        (ins GR8:$src, GR16:$base),
622*9880d681SAndroid Build Coastguard Worker                        "bis.b\t{@$base+, $dst}", []>;
623*9880d681SAndroid Build Coastguard Workerdef OR16rm_POST : IForm16<0x0, DstReg, SrcPostInc, Size2Bytes,
624*9880d681SAndroid Build Coastguard Worker                          (outs GR16:$dst, GR16:$base_wb),
625*9880d681SAndroid Build Coastguard Worker                          (ins GR16:$src, GR16:$base),
626*9880d681SAndroid Build Coastguard Worker                          "bis.w\t{@$base+, $dst}", []>;
627*9880d681SAndroid Build Coastguard Worker}
628*9880d681SAndroid Build Coastguard Worker
629*9880d681SAndroid Build Coastguard Workerlet Constraints = "" in {
630*9880d681SAndroid Build Coastguard Workerdef OR8mr  : I8mr<0x0,
631*9880d681SAndroid Build Coastguard Worker                  (outs), (ins memdst:$dst, GR8:$src),
632*9880d681SAndroid Build Coastguard Worker                  "bis.b\t{$src, $dst}",
633*9880d681SAndroid Build Coastguard Worker                  [(store (or (load addr:$dst), GR8:$src), addr:$dst)]>;
634*9880d681SAndroid Build Coastguard Workerdef OR16mr : I16mr<0x0,
635*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, GR16:$src),
636*9880d681SAndroid Build Coastguard Worker                   "bis.w\t{$src, $dst}",
637*9880d681SAndroid Build Coastguard Worker                   [(store (or (load addr:$dst), GR16:$src), addr:$dst)]>;
638*9880d681SAndroid Build Coastguard Worker
639*9880d681SAndroid Build Coastguard Workerdef OR8mi  : I8mi<0x0,
640*9880d681SAndroid Build Coastguard Worker                  (outs), (ins memdst:$dst, i8imm:$src),
641*9880d681SAndroid Build Coastguard Worker                  "bis.b\t{$src, $dst}",
642*9880d681SAndroid Build Coastguard Worker                  [(store (or (load addr:$dst), (i8 imm:$src)), addr:$dst)]>;
643*9880d681SAndroid Build Coastguard Workerdef OR16mi : I16mi<0x0,
644*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, i16imm:$src),
645*9880d681SAndroid Build Coastguard Worker                   "bis.w\t{$src, $dst}",
646*9880d681SAndroid Build Coastguard Worker                   [(store (or (load addr:$dst), (i16 imm:$src)), addr:$dst)]>;
647*9880d681SAndroid Build Coastguard Worker
648*9880d681SAndroid Build Coastguard Workerdef OR8mm  : I8mm<0x0,
649*9880d681SAndroid Build Coastguard Worker                  (outs), (ins memdst:$dst, memsrc:$src),
650*9880d681SAndroid Build Coastguard Worker                  "bis.b\t{$src, $dst}",
651*9880d681SAndroid Build Coastguard Worker                  [(store (or (i8 (load addr:$dst)),
652*9880d681SAndroid Build Coastguard Worker                              (i8 (load addr:$src))), addr:$dst)]>;
653*9880d681SAndroid Build Coastguard Workerdef OR16mm : I16mm<0x0,
654*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, memsrc:$src),
655*9880d681SAndroid Build Coastguard Worker                   "bis.w\t{$src, $dst}",
656*9880d681SAndroid Build Coastguard Worker                   [(store (or (i16 (load addr:$dst)),
657*9880d681SAndroid Build Coastguard Worker                               (i16 (load addr:$src))), addr:$dst)]>;
658*9880d681SAndroid Build Coastguard Worker}
659*9880d681SAndroid Build Coastguard Worker
660*9880d681SAndroid Build Coastguard Worker// bic does not modify condition codes
661*9880d681SAndroid Build Coastguard Workerdef BIC8rr :  I8rr<0x0,
662*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src, GR8:$src2),
663*9880d681SAndroid Build Coastguard Worker                   "bic.b\t{$src2, $dst}",
664*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (and GR8:$src, (not GR8:$src2)))]>;
665*9880d681SAndroid Build Coastguard Workerdef BIC16rr : I16rr<0x0,
666*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src, GR16:$src2),
667*9880d681SAndroid Build Coastguard Worker                    "bic.w\t{$src2, $dst}",
668*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (and GR16:$src, (not GR16:$src2)))]>;
669*9880d681SAndroid Build Coastguard Worker
670*9880d681SAndroid Build Coastguard Workerdef BIC8rm :  I8rm<0x0,
671*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src, memsrc:$src2),
672*9880d681SAndroid Build Coastguard Worker                   "bic.b\t{$src2, $dst}",
673*9880d681SAndroid Build Coastguard Worker                    [(set GR8:$dst, (and GR8:$src, (not (i8 (load addr:$src2)))))]>;
674*9880d681SAndroid Build Coastguard Workerdef BIC16rm : I16rm<0x0,
675*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src, memsrc:$src2),
676*9880d681SAndroid Build Coastguard Worker                    "bic.w\t{$src2, $dst}",
677*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (and GR16:$src, (not (i16 (load addr:$src2)))))]>;
678*9880d681SAndroid Build Coastguard Worker
679*9880d681SAndroid Build Coastguard Workerlet Constraints = "" in {
680*9880d681SAndroid Build Coastguard Workerdef BIC8mr :  I8mr<0x0,
681*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, GR8:$src),
682*9880d681SAndroid Build Coastguard Worker                   "bic.b\t{$src, $dst}",
683*9880d681SAndroid Build Coastguard Worker                   [(store (and (load addr:$dst), (not GR8:$src)), addr:$dst)]>;
684*9880d681SAndroid Build Coastguard Workerdef BIC16mr : I16mr<0x0,
685*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, GR16:$src),
686*9880d681SAndroid Build Coastguard Worker                    "bic.w\t{$src, $dst}",
687*9880d681SAndroid Build Coastguard Worker                    [(store (and (load addr:$dst), (not GR16:$src)), addr:$dst)]>;
688*9880d681SAndroid Build Coastguard Worker
689*9880d681SAndroid Build Coastguard Workerdef BIC8mm :  I8mm<0x0,
690*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, memsrc:$src),
691*9880d681SAndroid Build Coastguard Worker                   "bic.b\t{$src, $dst}",
692*9880d681SAndroid Build Coastguard Worker                   [(store (and (load addr:$dst),
693*9880d681SAndroid Build Coastguard Worker                                (not (i8 (load addr:$src)))), addr:$dst)]>;
694*9880d681SAndroid Build Coastguard Workerdef BIC16mm : I16mm<0x0,
695*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, memsrc:$src),
696*9880d681SAndroid Build Coastguard Worker                    "bic.w\t{$src, $dst}",
697*9880d681SAndroid Build Coastguard Worker                    [(store (and (load addr:$dst),
698*9880d681SAndroid Build Coastguard Worker                                 (not (i16 (load addr:$src)))), addr:$dst)]>;
699*9880d681SAndroid Build Coastguard Worker}
700*9880d681SAndroid Build Coastguard Worker
701*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in { // X = XOR Y, Z  == X = XOR Z, Y
702*9880d681SAndroid Build Coastguard Workerdef XOR8rr  : I8rr<0x0,
703*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src, GR8:$src2),
704*9880d681SAndroid Build Coastguard Worker                   "xor.b\t{$src2, $dst}",
705*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (xor GR8:$src, GR8:$src2)),
706*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
707*9880d681SAndroid Build Coastguard Workerdef XOR16rr : I16rr<0x0,
708*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src, GR16:$src2),
709*9880d681SAndroid Build Coastguard Worker                    "xor.w\t{$src2, $dst}",
710*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (xor GR16:$src, GR16:$src2)),
711*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
712*9880d681SAndroid Build Coastguard Worker}
713*9880d681SAndroid Build Coastguard Worker
714*9880d681SAndroid Build Coastguard Workerdef XOR8ri  : I8ri<0x0,
715*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src, i8imm:$src2),
716*9880d681SAndroid Build Coastguard Worker                   "xor.b\t{$src2, $dst}",
717*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (xor GR8:$src, imm:$src2)),
718*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
719*9880d681SAndroid Build Coastguard Workerdef XOR16ri : I16ri<0x0,
720*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src, i16imm:$src2),
721*9880d681SAndroid Build Coastguard Worker                    "xor.w\t{$src2, $dst}",
722*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (xor GR16:$src, imm:$src2)),
723*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
724*9880d681SAndroid Build Coastguard Worker
725*9880d681SAndroid Build Coastguard Workerdef XOR8rm  : I8rm<0x0,
726*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src, memsrc:$src2),
727*9880d681SAndroid Build Coastguard Worker                   "xor.b\t{$src2, $dst}",
728*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (xor GR8:$src, (load addr:$src2))),
729*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
730*9880d681SAndroid Build Coastguard Workerdef XOR16rm : I16rm<0x0,
731*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src, memsrc:$src2),
732*9880d681SAndroid Build Coastguard Worker                    "xor.w\t{$src2, $dst}",
733*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (xor GR16:$src, (load addr:$src2))),
734*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
735*9880d681SAndroid Build Coastguard Worker
736*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, hasExtraDefRegAllocReq = 1,
737*9880d681SAndroid Build Coastguard WorkerConstraints = "$base = $base_wb, $src = $dst" in {
738*9880d681SAndroid Build Coastguard Workerdef XOR8rm_POST : IForm8<0x0, DstReg, SrcPostInc, Size2Bytes,
739*9880d681SAndroid Build Coastguard Worker                         (outs GR8:$dst, GR16:$base_wb),
740*9880d681SAndroid Build Coastguard Worker                         (ins GR8:$src, GR16:$base),
741*9880d681SAndroid Build Coastguard Worker                         "xor.b\t{@$base+, $dst}", []>;
742*9880d681SAndroid Build Coastguard Workerdef XOR16rm_POST : IForm16<0x0, DstReg, SrcPostInc, Size2Bytes,
743*9880d681SAndroid Build Coastguard Worker                           (outs GR16:$dst, GR16:$base_wb),
744*9880d681SAndroid Build Coastguard Worker                           (ins GR16:$src, GR16:$base),
745*9880d681SAndroid Build Coastguard Worker                           "xor.w\t{@$base+, $dst}", []>;
746*9880d681SAndroid Build Coastguard Worker}
747*9880d681SAndroid Build Coastguard Worker
748*9880d681SAndroid Build Coastguard Workerlet Constraints = "" in {
749*9880d681SAndroid Build Coastguard Workerdef XOR8mr  : I8mr<0x0,
750*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, GR8:$src),
751*9880d681SAndroid Build Coastguard Worker                   "xor.b\t{$src, $dst}",
752*9880d681SAndroid Build Coastguard Worker                   [(store (xor (load addr:$dst), GR8:$src), addr:$dst),
753*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
754*9880d681SAndroid Build Coastguard Workerdef XOR16mr : I16mr<0x0,
755*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, GR16:$src),
756*9880d681SAndroid Build Coastguard Worker                    "xor.w\t{$src, $dst}",
757*9880d681SAndroid Build Coastguard Worker                    [(store (xor (load addr:$dst), GR16:$src), addr:$dst),
758*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
759*9880d681SAndroid Build Coastguard Worker
760*9880d681SAndroid Build Coastguard Workerdef XOR8mi  : I8mi<0x0,
761*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, i8imm:$src),
762*9880d681SAndroid Build Coastguard Worker                   "xor.b\t{$src, $dst}",
763*9880d681SAndroid Build Coastguard Worker                   [(store (xor (load addr:$dst), (i8 imm:$src)), addr:$dst),
764*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
765*9880d681SAndroid Build Coastguard Workerdef XOR16mi : I16mi<0x0,
766*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, i16imm:$src),
767*9880d681SAndroid Build Coastguard Worker                    "xor.w\t{$src, $dst}",
768*9880d681SAndroid Build Coastguard Worker                    [(store (xor (load addr:$dst), (i16 imm:$src)), addr:$dst),
769*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
770*9880d681SAndroid Build Coastguard Worker
771*9880d681SAndroid Build Coastguard Workerdef XOR8mm  : I8mm<0x0,
772*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, memsrc:$src),
773*9880d681SAndroid Build Coastguard Worker                   "xor.b\t{$src, $dst}",
774*9880d681SAndroid Build Coastguard Worker                   [(store (xor (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
775*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
776*9880d681SAndroid Build Coastguard Workerdef XOR16mm : I16mm<0x0,
777*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, memsrc:$src),
778*9880d681SAndroid Build Coastguard Worker                    "xor.w\t{$src, $dst}",
779*9880d681SAndroid Build Coastguard Worker                    [(store (xor (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
780*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
781*9880d681SAndroid Build Coastguard Worker}
782*9880d681SAndroid Build Coastguard Worker
783*9880d681SAndroid Build Coastguard Worker
784*9880d681SAndroid Build Coastguard Workerdef SUB8rr  : I8rr<0x0,
785*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src, GR8:$src2),
786*9880d681SAndroid Build Coastguard Worker                   "sub.b\t{$src2, $dst}",
787*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (sub GR8:$src, GR8:$src2)),
788*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
789*9880d681SAndroid Build Coastguard Workerdef SUB16rr : I16rr<0x0,
790*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src, GR16:$src2),
791*9880d681SAndroid Build Coastguard Worker                    "sub.w\t{$src2, $dst}",
792*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (sub GR16:$src, GR16:$src2)),
793*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
794*9880d681SAndroid Build Coastguard Worker
795*9880d681SAndroid Build Coastguard Workerdef SUB8ri  : I8ri<0x0,
796*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src, i8imm:$src2),
797*9880d681SAndroid Build Coastguard Worker                   "sub.b\t{$src2, $dst}",
798*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (sub GR8:$src, imm:$src2)),
799*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
800*9880d681SAndroid Build Coastguard Workerdef SUB16ri : I16ri<0x0,
801*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src, i16imm:$src2),
802*9880d681SAndroid Build Coastguard Worker                    "sub.w\t{$src2, $dst}",
803*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (sub GR16:$src, imm:$src2)),
804*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
805*9880d681SAndroid Build Coastguard Worker
806*9880d681SAndroid Build Coastguard Workerdef SUB8rm  : I8rm<0x0,
807*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src, memsrc:$src2),
808*9880d681SAndroid Build Coastguard Worker                   "sub.b\t{$src2, $dst}",
809*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (sub GR8:$src, (load addr:$src2))),
810*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
811*9880d681SAndroid Build Coastguard Workerdef SUB16rm : I16rm<0x0,
812*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src, memsrc:$src2),
813*9880d681SAndroid Build Coastguard Worker                    "sub.w\t{$src2, $dst}",
814*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (sub GR16:$src, (load addr:$src2))),
815*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
816*9880d681SAndroid Build Coastguard Worker
817*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, hasExtraDefRegAllocReq = 1,
818*9880d681SAndroid Build Coastguard WorkerConstraints = "$base = $base_wb, $src = $dst" in {
819*9880d681SAndroid Build Coastguard Workerdef SUB8rm_POST : IForm8<0x0, DstReg, SrcPostInc, Size2Bytes,
820*9880d681SAndroid Build Coastguard Worker                         (outs GR8:$dst, GR16:$base_wb),
821*9880d681SAndroid Build Coastguard Worker                         (ins GR8:$src, GR16:$base),
822*9880d681SAndroid Build Coastguard Worker                         "sub.b\t{@$base+, $dst}", []>;
823*9880d681SAndroid Build Coastguard Workerdef SUB16rm_POST : IForm16<0x0, DstReg, SrcPostInc, Size2Bytes,
824*9880d681SAndroid Build Coastguard Worker                          (outs GR16:$dst, GR16:$base_wb),
825*9880d681SAndroid Build Coastguard Worker                          (ins GR16:$src, GR16:$base),
826*9880d681SAndroid Build Coastguard Worker                          "sub.w\t{@$base+, $dst}", []>;
827*9880d681SAndroid Build Coastguard Worker}
828*9880d681SAndroid Build Coastguard Worker
829*9880d681SAndroid Build Coastguard Workerlet Constraints = "" in {
830*9880d681SAndroid Build Coastguard Workerdef SUB8mr  : I8mr<0x0,
831*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, GR8:$src),
832*9880d681SAndroid Build Coastguard Worker                   "sub.b\t{$src, $dst}",
833*9880d681SAndroid Build Coastguard Worker                   [(store (sub (load addr:$dst), GR8:$src), addr:$dst),
834*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
835*9880d681SAndroid Build Coastguard Workerdef SUB16mr : I16mr<0x0,
836*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, GR16:$src),
837*9880d681SAndroid Build Coastguard Worker                    "sub.w\t{$src, $dst}",
838*9880d681SAndroid Build Coastguard Worker                    [(store (sub (load addr:$dst), GR16:$src), addr:$dst),
839*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
840*9880d681SAndroid Build Coastguard Worker
841*9880d681SAndroid Build Coastguard Workerdef SUB8mi  : I8mi<0x0,
842*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, i8imm:$src),
843*9880d681SAndroid Build Coastguard Worker                   "sub.b\t{$src, $dst}",
844*9880d681SAndroid Build Coastguard Worker                   [(store (sub (load addr:$dst), (i8 imm:$src)), addr:$dst),
845*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
846*9880d681SAndroid Build Coastguard Workerdef SUB16mi : I16mi<0x0,
847*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, i16imm:$src),
848*9880d681SAndroid Build Coastguard Worker                    "sub.w\t{$src, $dst}",
849*9880d681SAndroid Build Coastguard Worker                    [(store (sub (load addr:$dst), (i16 imm:$src)), addr:$dst),
850*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
851*9880d681SAndroid Build Coastguard Worker
852*9880d681SAndroid Build Coastguard Workerdef SUB8mm  : I8mm<0x0,
853*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, memsrc:$src),
854*9880d681SAndroid Build Coastguard Worker                   "sub.b\t{$src, $dst}",
855*9880d681SAndroid Build Coastguard Worker                   [(store (sub (load addr:$dst),
856*9880d681SAndroid Build Coastguard Worker                                (i8 (load addr:$src))), addr:$dst),
857*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
858*9880d681SAndroid Build Coastguard Workerdef SUB16mm : I16mm<0x0,
859*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, memsrc:$src),
860*9880d681SAndroid Build Coastguard Worker                    "sub.w\t{$src, $dst}",
861*9880d681SAndroid Build Coastguard Worker                    [(store (sub (load addr:$dst),
862*9880d681SAndroid Build Coastguard Worker                                 (i16 (load addr:$src))), addr:$dst),
863*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
864*9880d681SAndroid Build Coastguard Worker}
865*9880d681SAndroid Build Coastguard Worker
866*9880d681SAndroid Build Coastguard Workerlet Uses = [SR] in {
867*9880d681SAndroid Build Coastguard Workerdef SBC8rr  : I8rr<0x0,
868*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src, GR8:$src2),
869*9880d681SAndroid Build Coastguard Worker                   "subc.b\t{$src2, $dst}",
870*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (sube GR8:$src, GR8:$src2)),
871*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
872*9880d681SAndroid Build Coastguard Workerdef SBC16rr : I16rr<0x0,
873*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src, GR16:$src2),
874*9880d681SAndroid Build Coastguard Worker                    "subc.w\t{$src2, $dst}",
875*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (sube GR16:$src, GR16:$src2)),
876*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
877*9880d681SAndroid Build Coastguard Worker
878*9880d681SAndroid Build Coastguard Workerdef SBC8ri  : I8ri<0x0,
879*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src, i8imm:$src2),
880*9880d681SAndroid Build Coastguard Worker                   "subc.b\t{$src2, $dst}",
881*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (sube GR8:$src, imm:$src2)),
882*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
883*9880d681SAndroid Build Coastguard Workerdef SBC16ri : I16ri<0x0,
884*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src, i16imm:$src2),
885*9880d681SAndroid Build Coastguard Worker                    "subc.w\t{$src2, $dst}",
886*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (sube GR16:$src, imm:$src2)),
887*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
888*9880d681SAndroid Build Coastguard Worker
889*9880d681SAndroid Build Coastguard Workerdef SBC8rm  : I8rm<0x0,
890*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src, memsrc:$src2),
891*9880d681SAndroid Build Coastguard Worker                   "subc.b\t{$src2, $dst}",
892*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (sube GR8:$src, (load addr:$src2))),
893*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
894*9880d681SAndroid Build Coastguard Workerdef SBC16rm : I16rm<0x0,
895*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src, memsrc:$src2),
896*9880d681SAndroid Build Coastguard Worker                    "subc.w\t{$src2, $dst}",
897*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (sube GR16:$src, (load addr:$src2))),
898*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
899*9880d681SAndroid Build Coastguard Worker
900*9880d681SAndroid Build Coastguard Workerlet Constraints = "" in {
901*9880d681SAndroid Build Coastguard Workerdef SBC8mr  : I8mr<0x0,
902*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, GR8:$src),
903*9880d681SAndroid Build Coastguard Worker                   "subc.b\t{$src, $dst}",
904*9880d681SAndroid Build Coastguard Worker                  [(store (sube (load addr:$dst), GR8:$src), addr:$dst),
905*9880d681SAndroid Build Coastguard Worker                   (implicit SR)]>;
906*9880d681SAndroid Build Coastguard Workerdef SBC16mr : I16mr<0x0,
907*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, GR16:$src),
908*9880d681SAndroid Build Coastguard Worker                    "subc.w\t{$src, $dst}",
909*9880d681SAndroid Build Coastguard Worker                    [(store (sube (load addr:$dst), GR16:$src), addr:$dst),
910*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
911*9880d681SAndroid Build Coastguard Worker
912*9880d681SAndroid Build Coastguard Workerdef SBC8mi  : I8mi<0x0,
913*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, i8imm:$src),
914*9880d681SAndroid Build Coastguard Worker                   "subc.b\t{$src, $dst}",
915*9880d681SAndroid Build Coastguard Worker                   [(store (sube (load addr:$dst), (i8 imm:$src)), addr:$dst),
916*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
917*9880d681SAndroid Build Coastguard Workerdef SBC16mi : I16mi<0x0,
918*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, i16imm:$src),
919*9880d681SAndroid Build Coastguard Worker                    "subc.w\t{$src, $dst}",
920*9880d681SAndroid Build Coastguard Worker                    [(store (sube (load addr:$dst), (i16 imm:$src)), addr:$dst),
921*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
922*9880d681SAndroid Build Coastguard Worker
923*9880d681SAndroid Build Coastguard Workerdef SBC8mm  : I8mm<0x0,
924*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memdst:$dst, memsrc:$src),
925*9880d681SAndroid Build Coastguard Worker                   "subc.b\t{$src, $dst}",
926*9880d681SAndroid Build Coastguard Worker                   [(store (sube (load addr:$dst),
927*9880d681SAndroid Build Coastguard Worker                                 (i8 (load addr:$src))), addr:$dst),
928*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
929*9880d681SAndroid Build Coastguard Workerdef SBC16mm : I16mm<0x0,
930*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memdst:$dst, memsrc:$src),
931*9880d681SAndroid Build Coastguard Worker                    "subc.w\t{$src, $dst}",
932*9880d681SAndroid Build Coastguard Worker                    [(store (sube (load addr:$dst),
933*9880d681SAndroid Build Coastguard Worker                            (i16 (load addr:$src))), addr:$dst),
934*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
935*9880d681SAndroid Build Coastguard Worker}
936*9880d681SAndroid Build Coastguard Worker
937*9880d681SAndroid Build Coastguard Worker} // Uses = [SR]
938*9880d681SAndroid Build Coastguard Worker
939*9880d681SAndroid Build Coastguard Worker// FIXME: memory variant!
940*9880d681SAndroid Build Coastguard Workerdef SAR8r1  : II8r<0x0,
941*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src),
942*9880d681SAndroid Build Coastguard Worker                   "rra.b\t$dst",
943*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (MSP430rra GR8:$src)),
944*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
945*9880d681SAndroid Build Coastguard Workerdef SAR16r1 : II16r<0x0,
946*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src),
947*9880d681SAndroid Build Coastguard Worker                    "rra.w\t$dst",
948*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (MSP430rra GR16:$src)),
949*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
950*9880d681SAndroid Build Coastguard Worker
951*9880d681SAndroid Build Coastguard Workerdef SHL8r1  : I8rr<0x0,
952*9880d681SAndroid Build Coastguard Worker                   (outs GR8:$dst), (ins GR8:$src),
953*9880d681SAndroid Build Coastguard Worker                   "rla.b\t$dst",
954*9880d681SAndroid Build Coastguard Worker                   [(set GR8:$dst, (MSP430rla GR8:$src)),
955*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
956*9880d681SAndroid Build Coastguard Workerdef SHL16r1 : I16rr<0x0,
957*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src),
958*9880d681SAndroid Build Coastguard Worker                    "rla.w\t$dst",
959*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (MSP430rla GR16:$src)),
960*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
961*9880d681SAndroid Build Coastguard Worker
962*9880d681SAndroid Build Coastguard Workerdef SAR8r1c  : Pseudo<(outs GR8:$dst), (ins GR8:$src),
963*9880d681SAndroid Build Coastguard Worker                      "clrc\n\t"
964*9880d681SAndroid Build Coastguard Worker                      "rrc.b\t$dst",
965*9880d681SAndroid Build Coastguard Worker                      [(set GR8:$dst, (MSP430rrc GR8:$src)),
966*9880d681SAndroid Build Coastguard Worker                       (implicit SR)]>;
967*9880d681SAndroid Build Coastguard Workerdef SAR16r1c : Pseudo<(outs GR16:$dst), (ins GR16:$src),
968*9880d681SAndroid Build Coastguard Worker                      "clrc\n\t"
969*9880d681SAndroid Build Coastguard Worker                      "rrc.w\t$dst",
970*9880d681SAndroid Build Coastguard Worker                      [(set GR16:$dst, (MSP430rrc GR16:$src)),
971*9880d681SAndroid Build Coastguard Worker                       (implicit SR)]>;
972*9880d681SAndroid Build Coastguard Worker
973*9880d681SAndroid Build Coastguard Worker// FIXME: Memory sext's ?
974*9880d681SAndroid Build Coastguard Workerdef SEXT16r : II16r<0x0,
975*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src),
976*9880d681SAndroid Build Coastguard Worker                    "sxt\t$dst",
977*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (sext_inreg GR16:$src, i8)),
978*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
979*9880d681SAndroid Build Coastguard Worker
980*9880d681SAndroid Build Coastguard Worker} // Defs = [SR]
981*9880d681SAndroid Build Coastguard Worker
982*9880d681SAndroid Build Coastguard Workerdef ZEXT16r : I8rr<0x0,
983*9880d681SAndroid Build Coastguard Worker                   (outs GR16:$dst), (ins GR16:$src),
984*9880d681SAndroid Build Coastguard Worker                   "mov.b\t{$src, $dst}",
985*9880d681SAndroid Build Coastguard Worker                   [(set GR16:$dst, (zext (trunc GR16:$src)))]>;
986*9880d681SAndroid Build Coastguard Worker
987*9880d681SAndroid Build Coastguard Worker// FIXME: Memory bitswaps?
988*9880d681SAndroid Build Coastguard Workerdef SWPB16r : II16r<0x0,
989*9880d681SAndroid Build Coastguard Worker                    (outs GR16:$dst), (ins GR16:$src),
990*9880d681SAndroid Build Coastguard Worker                    "swpb\t$dst",
991*9880d681SAndroid Build Coastguard Worker                    [(set GR16:$dst, (bswap GR16:$src))]>;
992*9880d681SAndroid Build Coastguard Worker
993*9880d681SAndroid Build Coastguard Worker} // Constraints = "$src = $dst"
994*9880d681SAndroid Build Coastguard Worker
995*9880d681SAndroid Build Coastguard Worker// Integer comparisons
996*9880d681SAndroid Build Coastguard Workerlet Defs = [SR] in {
997*9880d681SAndroid Build Coastguard Workerdef CMP8rr  : I8rr<0x0,
998*9880d681SAndroid Build Coastguard Worker                   (outs), (ins GR8:$src, GR8:$src2),
999*9880d681SAndroid Build Coastguard Worker                   "cmp.b\t{$src2, $src}",
1000*9880d681SAndroid Build Coastguard Worker                   [(MSP430cmp GR8:$src, GR8:$src2), (implicit SR)]>;
1001*9880d681SAndroid Build Coastguard Workerdef CMP16rr : I16rr<0x0,
1002*9880d681SAndroid Build Coastguard Worker                    (outs), (ins GR16:$src, GR16:$src2),
1003*9880d681SAndroid Build Coastguard Worker                    "cmp.w\t{$src2, $src}",
1004*9880d681SAndroid Build Coastguard Worker                    [(MSP430cmp GR16:$src, GR16:$src2), (implicit SR)]>;
1005*9880d681SAndroid Build Coastguard Worker
1006*9880d681SAndroid Build Coastguard Workerdef CMP8ri  : I8ri<0x0,
1007*9880d681SAndroid Build Coastguard Worker                   (outs), (ins GR8:$src, i8imm:$src2),
1008*9880d681SAndroid Build Coastguard Worker                   "cmp.b\t{$src2, $src}",
1009*9880d681SAndroid Build Coastguard Worker                   [(MSP430cmp GR8:$src, imm:$src2), (implicit SR)]>;
1010*9880d681SAndroid Build Coastguard Workerdef CMP16ri : I16ri<0x0,
1011*9880d681SAndroid Build Coastguard Worker                    (outs), (ins GR16:$src, i16imm:$src2),
1012*9880d681SAndroid Build Coastguard Worker                    "cmp.w\t{$src2, $src}",
1013*9880d681SAndroid Build Coastguard Worker                    [(MSP430cmp GR16:$src, imm:$src2), (implicit SR)]>;
1014*9880d681SAndroid Build Coastguard Worker
1015*9880d681SAndroid Build Coastguard Workerdef CMP8mi  : I8mi<0x0,
1016*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memsrc:$src, i8imm:$src2),
1017*9880d681SAndroid Build Coastguard Worker                   "cmp.b\t{$src2, $src}",
1018*9880d681SAndroid Build Coastguard Worker                   [(MSP430cmp (load addr:$src),
1019*9880d681SAndroid Build Coastguard Worker                               (i8 imm:$src2)), (implicit SR)]>;
1020*9880d681SAndroid Build Coastguard Workerdef CMP16mi : I16mi<0x0,
1021*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memsrc:$src, i16imm:$src2),
1022*9880d681SAndroid Build Coastguard Worker                    "cmp.w\t{$src2, $src}",
1023*9880d681SAndroid Build Coastguard Worker                     [(MSP430cmp (load addr:$src),
1024*9880d681SAndroid Build Coastguard Worker                                 (i16 imm:$src2)), (implicit SR)]>;
1025*9880d681SAndroid Build Coastguard Worker
1026*9880d681SAndroid Build Coastguard Workerdef CMP8rm  : I8rm<0x0,
1027*9880d681SAndroid Build Coastguard Worker                   (outs), (ins GR8:$src, memsrc:$src2),
1028*9880d681SAndroid Build Coastguard Worker                   "cmp.b\t{$src2, $src}",
1029*9880d681SAndroid Build Coastguard Worker                   [(MSP430cmp GR8:$src, (load addr:$src2)),
1030*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
1031*9880d681SAndroid Build Coastguard Workerdef CMP16rm : I16rm<0x0,
1032*9880d681SAndroid Build Coastguard Worker                    (outs), (ins GR16:$src, memsrc:$src2),
1033*9880d681SAndroid Build Coastguard Worker                    "cmp.w\t{$src2, $src}",
1034*9880d681SAndroid Build Coastguard Worker                    [(MSP430cmp GR16:$src, (load addr:$src2)),
1035*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
1036*9880d681SAndroid Build Coastguard Worker
1037*9880d681SAndroid Build Coastguard Workerdef CMP8mr  : I8mr<0x0,
1038*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memsrc:$src, GR8:$src2),
1039*9880d681SAndroid Build Coastguard Worker                   "cmp.b\t{$src2, $src}",
1040*9880d681SAndroid Build Coastguard Worker                   [(MSP430cmp (load addr:$src), GR8:$src2),
1041*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
1042*9880d681SAndroid Build Coastguard Workerdef CMP16mr : I16mr<0x0,
1043*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memsrc:$src, GR16:$src2),
1044*9880d681SAndroid Build Coastguard Worker                    "cmp.w\t{$src2, $src}",
1045*9880d681SAndroid Build Coastguard Worker                    [(MSP430cmp (load addr:$src), GR16:$src2),
1046*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
1047*9880d681SAndroid Build Coastguard Worker
1048*9880d681SAndroid Build Coastguard Worker
1049*9880d681SAndroid Build Coastguard Worker// BIT TESTS, just sets condition codes
1050*9880d681SAndroid Build Coastguard Worker// Note that the C condition is set differently than when using CMP.
1051*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in {
1052*9880d681SAndroid Build Coastguard Workerdef BIT8rr  : I8rr<0x0,
1053*9880d681SAndroid Build Coastguard Worker                   (outs), (ins GR8:$src, GR8:$src2),
1054*9880d681SAndroid Build Coastguard Worker                   "bit.b\t{$src2, $src}",
1055*9880d681SAndroid Build Coastguard Worker                   [(MSP430cmp (and_su GR8:$src, GR8:$src2), 0),
1056*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
1057*9880d681SAndroid Build Coastguard Workerdef BIT16rr : I16rr<0x0,
1058*9880d681SAndroid Build Coastguard Worker                    (outs), (ins GR16:$src, GR16:$src2),
1059*9880d681SAndroid Build Coastguard Worker                    "bit.w\t{$src2, $src}",
1060*9880d681SAndroid Build Coastguard Worker                    [(MSP430cmp (and_su GR16:$src, GR16:$src2), 0),
1061*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
1062*9880d681SAndroid Build Coastguard Worker}
1063*9880d681SAndroid Build Coastguard Workerdef BIT8ri  : I8ri<0x0,
1064*9880d681SAndroid Build Coastguard Worker                   (outs), (ins GR8:$src, i8imm:$src2),
1065*9880d681SAndroid Build Coastguard Worker                   "bit.b\t{$src2, $src}",
1066*9880d681SAndroid Build Coastguard Worker                   [(MSP430cmp (and_su GR8:$src, imm:$src2), 0),
1067*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
1068*9880d681SAndroid Build Coastguard Workerdef BIT16ri : I16ri<0x0,
1069*9880d681SAndroid Build Coastguard Worker                    (outs), (ins GR16:$src, i16imm:$src2),
1070*9880d681SAndroid Build Coastguard Worker                    "bit.w\t{$src2, $src}",
1071*9880d681SAndroid Build Coastguard Worker                    [(MSP430cmp (and_su GR16:$src, imm:$src2), 0),
1072*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
1073*9880d681SAndroid Build Coastguard Worker
1074*9880d681SAndroid Build Coastguard Workerdef BIT8rm  : I8rm<0x0,
1075*9880d681SAndroid Build Coastguard Worker                   (outs), (ins GR8:$src, memdst:$src2),
1076*9880d681SAndroid Build Coastguard Worker                   "bit.b\t{$src2, $src}",
1077*9880d681SAndroid Build Coastguard Worker                   [(MSP430cmp (and_su GR8:$src,  (load addr:$src2)), 0),
1078*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
1079*9880d681SAndroid Build Coastguard Workerdef BIT16rm : I16rm<0x0,
1080*9880d681SAndroid Build Coastguard Worker                    (outs), (ins GR16:$src, memdst:$src2),
1081*9880d681SAndroid Build Coastguard Worker                    "bit.w\t{$src2, $src}",
1082*9880d681SAndroid Build Coastguard Worker                    [(MSP430cmp (and_su GR16:$src,  (load addr:$src2)), 0),
1083*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
1084*9880d681SAndroid Build Coastguard Worker
1085*9880d681SAndroid Build Coastguard Workerdef BIT8mr  : I8mr<0x0,
1086*9880d681SAndroid Build Coastguard Worker                  (outs), (ins memsrc:$src, GR8:$src2),
1087*9880d681SAndroid Build Coastguard Worker                  "bit.b\t{$src2, $src}",
1088*9880d681SAndroid Build Coastguard Worker                  [(MSP430cmp (and_su (load addr:$src), GR8:$src2), 0),
1089*9880d681SAndroid Build Coastguard Worker                   (implicit SR)]>;
1090*9880d681SAndroid Build Coastguard Workerdef BIT16mr : I16mr<0x0,
1091*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memsrc:$src, GR16:$src2),
1092*9880d681SAndroid Build Coastguard Worker                    "bit.w\t{$src2, $src}",
1093*9880d681SAndroid Build Coastguard Worker                    [(MSP430cmp (and_su (load addr:$src), GR16:$src2), 0),
1094*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
1095*9880d681SAndroid Build Coastguard Worker
1096*9880d681SAndroid Build Coastguard Workerdef BIT8mi  : I8mi<0x0,
1097*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memsrc:$src, i8imm:$src2),
1098*9880d681SAndroid Build Coastguard Worker                   "bit.b\t{$src2, $src}",
1099*9880d681SAndroid Build Coastguard Worker                   [(MSP430cmp (and_su (load addr:$src), (i8 imm:$src2)), 0),
1100*9880d681SAndroid Build Coastguard Worker                    (implicit SR)]>;
1101*9880d681SAndroid Build Coastguard Workerdef BIT16mi : I16mi<0x0,
1102*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memsrc:$src, i16imm:$src2),
1103*9880d681SAndroid Build Coastguard Worker                    "bit.w\t{$src2, $src}",
1104*9880d681SAndroid Build Coastguard Worker                    [(MSP430cmp (and_su (load addr:$src), (i16 imm:$src2)), 0),
1105*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
1106*9880d681SAndroid Build Coastguard Worker
1107*9880d681SAndroid Build Coastguard Workerdef BIT8mm  : I8mm<0x0,
1108*9880d681SAndroid Build Coastguard Worker                   (outs), (ins memsrc:$src, memsrc:$src2),
1109*9880d681SAndroid Build Coastguard Worker                   "bit.b\t{$src2, $src}",
1110*9880d681SAndroid Build Coastguard Worker                   [(MSP430cmp (and_su (i8 (load addr:$src)),
1111*9880d681SAndroid Build Coastguard Worker                                       (load addr:$src2)),
1112*9880d681SAndroid Build Coastguard Worker                                 0),
1113*9880d681SAndroid Build Coastguard Worker                      (implicit SR)]>;
1114*9880d681SAndroid Build Coastguard Workerdef BIT16mm : I16mm<0x0,
1115*9880d681SAndroid Build Coastguard Worker                    (outs), (ins memsrc:$src, memsrc:$src2),
1116*9880d681SAndroid Build Coastguard Worker                    "bit.w\t{$src2, $src}",
1117*9880d681SAndroid Build Coastguard Worker                    [(MSP430cmp (and_su (i16 (load addr:$src)),
1118*9880d681SAndroid Build Coastguard Worker                                        (load addr:$src2)),
1119*9880d681SAndroid Build Coastguard Worker                                 0),
1120*9880d681SAndroid Build Coastguard Worker                     (implicit SR)]>;
1121*9880d681SAndroid Build Coastguard Worker} // Defs = [SR]
1122*9880d681SAndroid Build Coastguard Worker
1123*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1124*9880d681SAndroid Build Coastguard Worker// Non-Instruction Patterns
1125*9880d681SAndroid Build Coastguard Worker
1126*9880d681SAndroid Build Coastguard Worker// extload
1127*9880d681SAndroid Build Coastguard Workerdef : Pat<(extloadi16i8 addr:$src), (MOVZX16rm8 addr:$src)>;
1128*9880d681SAndroid Build Coastguard Worker
1129*9880d681SAndroid Build Coastguard Worker// anyext
1130*9880d681SAndroid Build Coastguard Workerdef : Pat<(i16 (anyext GR8:$src)),
1131*9880d681SAndroid Build Coastguard Worker          (SUBREG_TO_REG (i16 0), GR8:$src, subreg_8bit)>;
1132*9880d681SAndroid Build Coastguard Worker
1133*9880d681SAndroid Build Coastguard Worker// truncs
1134*9880d681SAndroid Build Coastguard Workerdef : Pat<(i8 (trunc GR16:$src)),
1135*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG GR16:$src, subreg_8bit)>;
1136*9880d681SAndroid Build Coastguard Worker
1137*9880d681SAndroid Build Coastguard Worker// GlobalAddress, ExternalSymbol
1138*9880d681SAndroid Build Coastguard Workerdef : Pat<(i16 (MSP430Wrapper tglobaladdr:$dst)), (MOV16ri tglobaladdr:$dst)>;
1139*9880d681SAndroid Build Coastguard Workerdef : Pat<(i16 (MSP430Wrapper texternalsym:$dst)), (MOV16ri texternalsym:$dst)>;
1140*9880d681SAndroid Build Coastguard Workerdef : Pat<(i16 (MSP430Wrapper tblockaddress:$dst)), (MOV16ri tblockaddress:$dst)>;
1141*9880d681SAndroid Build Coastguard Worker
1142*9880d681SAndroid Build Coastguard Workerdef : Pat<(add GR16:$src, (MSP430Wrapper tglobaladdr :$src2)),
1143*9880d681SAndroid Build Coastguard Worker          (ADD16ri GR16:$src, tglobaladdr:$src2)>;
1144*9880d681SAndroid Build Coastguard Workerdef : Pat<(add GR16:$src, (MSP430Wrapper texternalsym:$src2)),
1145*9880d681SAndroid Build Coastguard Worker          (ADD16ri GR16:$src, texternalsym:$src2)>;
1146*9880d681SAndroid Build Coastguard Workerdef : Pat<(add GR16:$src, (MSP430Wrapper tblockaddress:$src2)),
1147*9880d681SAndroid Build Coastguard Worker          (ADD16ri GR16:$src, tblockaddress:$src2)>;
1148*9880d681SAndroid Build Coastguard Worker
1149*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (i16 (MSP430Wrapper tglobaladdr:$src)), addr:$dst),
1150*9880d681SAndroid Build Coastguard Worker          (MOV16mi addr:$dst, tglobaladdr:$src)>;
1151*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (i16 (MSP430Wrapper texternalsym:$src)), addr:$dst),
1152*9880d681SAndroid Build Coastguard Worker          (MOV16mi addr:$dst, texternalsym:$src)>;
1153*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (i16 (MSP430Wrapper tblockaddress:$src)), addr:$dst),
1154*9880d681SAndroid Build Coastguard Worker          (MOV16mi addr:$dst, tblockaddress:$src)>;
1155*9880d681SAndroid Build Coastguard Worker
1156*9880d681SAndroid Build Coastguard Worker// calls
1157*9880d681SAndroid Build Coastguard Workerdef : Pat<(MSP430call (i16 tglobaladdr:$dst)),
1158*9880d681SAndroid Build Coastguard Worker          (CALLi tglobaladdr:$dst)>;
1159*9880d681SAndroid Build Coastguard Workerdef : Pat<(MSP430call (i16 texternalsym:$dst)),
1160*9880d681SAndroid Build Coastguard Worker          (CALLi texternalsym:$dst)>;
1161*9880d681SAndroid Build Coastguard Worker
1162*9880d681SAndroid Build Coastguard Worker// add and sub always produce carry
1163*9880d681SAndroid Build Coastguard Workerdef : Pat<(addc GR16:$src, GR16:$src2),
1164*9880d681SAndroid Build Coastguard Worker          (ADD16rr GR16:$src, GR16:$src2)>;
1165*9880d681SAndroid Build Coastguard Workerdef : Pat<(addc GR16:$src, (load addr:$src2)),
1166*9880d681SAndroid Build Coastguard Worker          (ADD16rm GR16:$src, addr:$src2)>;
1167*9880d681SAndroid Build Coastguard Workerdef : Pat<(addc GR16:$src, imm:$src2),
1168*9880d681SAndroid Build Coastguard Worker          (ADD16ri GR16:$src, imm:$src2)>;
1169*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (addc (load addr:$dst), GR16:$src), addr:$dst),
1170*9880d681SAndroid Build Coastguard Worker          (ADD16mr addr:$dst, GR16:$src)>;
1171*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (addc (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
1172*9880d681SAndroid Build Coastguard Worker          (ADD16mm addr:$dst, addr:$src)>;
1173*9880d681SAndroid Build Coastguard Worker
1174*9880d681SAndroid Build Coastguard Workerdef : Pat<(addc GR8:$src, GR8:$src2),
1175*9880d681SAndroid Build Coastguard Worker          (ADD8rr GR8:$src, GR8:$src2)>;
1176*9880d681SAndroid Build Coastguard Workerdef : Pat<(addc GR8:$src, (load addr:$src2)),
1177*9880d681SAndroid Build Coastguard Worker          (ADD8rm GR8:$src, addr:$src2)>;
1178*9880d681SAndroid Build Coastguard Workerdef : Pat<(addc GR8:$src, imm:$src2),
1179*9880d681SAndroid Build Coastguard Worker          (ADD8ri GR8:$src, imm:$src2)>;
1180*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (addc (load addr:$dst), GR8:$src), addr:$dst),
1181*9880d681SAndroid Build Coastguard Worker          (ADD8mr addr:$dst, GR8:$src)>;
1182*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (addc (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
1183*9880d681SAndroid Build Coastguard Worker          (ADD8mm addr:$dst, addr:$src)>;
1184*9880d681SAndroid Build Coastguard Worker
1185*9880d681SAndroid Build Coastguard Workerdef : Pat<(subc GR16:$src, GR16:$src2),
1186*9880d681SAndroid Build Coastguard Worker          (SUB16rr GR16:$src, GR16:$src2)>;
1187*9880d681SAndroid Build Coastguard Workerdef : Pat<(subc GR16:$src, (load addr:$src2)),
1188*9880d681SAndroid Build Coastguard Worker          (SUB16rm GR16:$src, addr:$src2)>;
1189*9880d681SAndroid Build Coastguard Workerdef : Pat<(subc GR16:$src, imm:$src2),
1190*9880d681SAndroid Build Coastguard Worker          (SUB16ri GR16:$src, imm:$src2)>;
1191*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (subc (load addr:$dst), GR16:$src), addr:$dst),
1192*9880d681SAndroid Build Coastguard Worker          (SUB16mr addr:$dst, GR16:$src)>;
1193*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (subc (load addr:$dst), (i16 (load addr:$src))), addr:$dst),
1194*9880d681SAndroid Build Coastguard Worker          (SUB16mm addr:$dst, addr:$src)>;
1195*9880d681SAndroid Build Coastguard Worker
1196*9880d681SAndroid Build Coastguard Workerdef : Pat<(subc GR8:$src, GR8:$src2),
1197*9880d681SAndroid Build Coastguard Worker          (SUB8rr GR8:$src, GR8:$src2)>;
1198*9880d681SAndroid Build Coastguard Workerdef : Pat<(subc GR8:$src, (load addr:$src2)),
1199*9880d681SAndroid Build Coastguard Worker          (SUB8rm GR8:$src, addr:$src2)>;
1200*9880d681SAndroid Build Coastguard Workerdef : Pat<(subc GR8:$src, imm:$src2),
1201*9880d681SAndroid Build Coastguard Worker          (SUB8ri GR8:$src, imm:$src2)>;
1202*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (subc (load addr:$dst), GR8:$src), addr:$dst),
1203*9880d681SAndroid Build Coastguard Worker          (SUB8mr addr:$dst, GR8:$src)>;
1204*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (subc (load addr:$dst), (i8 (load addr:$src))), addr:$dst),
1205*9880d681SAndroid Build Coastguard Worker          (SUB8mm addr:$dst, addr:$src)>;
1206*9880d681SAndroid Build Coastguard Worker
1207*9880d681SAndroid Build Coastguard Worker// peephole patterns
1208*9880d681SAndroid Build Coastguard Workerdef : Pat<(and GR16:$src, 255), (ZEXT16r GR16:$src)>;
1209*9880d681SAndroid Build Coastguard Workerdef : Pat<(MSP430cmp (trunc (and_su GR16:$src, GR16:$src2)), 0),
1210*9880d681SAndroid Build Coastguard Worker          (BIT8rr (EXTRACT_SUBREG GR16:$src, subreg_8bit),
1211*9880d681SAndroid Build Coastguard Worker                  (EXTRACT_SUBREG GR16:$src2, subreg_8bit))>;
1212