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