1*9880d681SAndroid Build Coastguard Worker//===-- SystemZInstrInfo.td - General SystemZ instructions ----*- tblgen-*-===// 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//===----------------------------------------------------------------------===// 11*9880d681SAndroid Build Coastguard Worker// Stack allocation 12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdef ADJCALLSTACKDOWN : Pseudo<(outs), (ins i64imm:$amt), 15*9880d681SAndroid Build Coastguard Worker [(callseq_start timm:$amt)]>; 16*9880d681SAndroid Build Coastguard Workerdef ADJCALLSTACKUP : Pseudo<(outs), (ins i64imm:$amt1, i64imm:$amt2), 17*9880d681SAndroid Build Coastguard Worker [(callseq_end timm:$amt1, timm:$amt2)]>; 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 20*9880d681SAndroid Build Coastguard Worker // Takes as input the value of the stack pointer after a dynamic allocation 21*9880d681SAndroid Build Coastguard Worker // has been made. Sets the output to the address of the dynamically- 22*9880d681SAndroid Build Coastguard Worker // allocated area itself, skipping the outgoing arguments. 23*9880d681SAndroid Build Coastguard Worker // 24*9880d681SAndroid Build Coastguard Worker // This expands to an LA or LAY instruction. We restrict the offset 25*9880d681SAndroid Build Coastguard Worker // to the range of LA and keep the LAY range in reserve for when 26*9880d681SAndroid Build Coastguard Worker // the size of the outgoing arguments is added. 27*9880d681SAndroid Build Coastguard Worker def ADJDYNALLOC : Pseudo<(outs GR64:$dst), (ins dynalloc12only:$src), 28*9880d681SAndroid Build Coastguard Worker [(set GR64:$dst, dynalloc12only:$src)]>; 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 32*9880d681SAndroid Build Coastguard Worker// Control flow instructions 33*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker// A return instruction (br %r14). 36*9880d681SAndroid Build Coastguard Workerlet isReturn = 1, isTerminator = 1, isBarrier = 1, hasCtrlDep = 1 in 37*9880d681SAndroid Build Coastguard Worker def Return : Alias<2, (outs), (ins), [(z_retflag)]>; 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker// A conditional return instruction (bcr <cond>, %r14). 40*9880d681SAndroid Build Coastguard Workerlet isReturn = 1, isTerminator = 1, hasCtrlDep = 1, CCMaskFirst = 1, Uses = [CC] in 41*9880d681SAndroid Build Coastguard Worker def CondReturn : Alias<2, (outs), (ins cond4:$valid, cond4:$R1), []>; 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker// Fused compare and conditional returns. 44*9880d681SAndroid Build Coastguard Workerlet isReturn = 1, isTerminator = 1, hasCtrlDep = 1 in { 45*9880d681SAndroid Build Coastguard Worker def CRBReturn : Alias<6, (outs), (ins GR32:$R1, GR32:$R2, cond4:$M3), []>; 46*9880d681SAndroid Build Coastguard Worker def CGRBReturn : Alias<6, (outs), (ins GR64:$R1, GR64:$R2, cond4:$M3), []>; 47*9880d681SAndroid Build Coastguard Worker def CIBReturn : Alias<6, (outs), (ins GR32:$R1, imm32sx8:$I2, cond4:$M3), []>; 48*9880d681SAndroid Build Coastguard Worker def CGIBReturn : Alias<6, (outs), (ins GR64:$R1, imm64sx8:$I2, cond4:$M3), []>; 49*9880d681SAndroid Build Coastguard Worker def CLRBReturn : Alias<6, (outs), (ins GR32:$R1, GR32:$R2, cond4:$M3), []>; 50*9880d681SAndroid Build Coastguard Worker def CLGRBReturn : Alias<6, (outs), (ins GR64:$R1, GR64:$R2, cond4:$M3), []>; 51*9880d681SAndroid Build Coastguard Worker def CLIBReturn : Alias<6, (outs), (ins GR32:$R1, imm32zx8:$I2, cond4:$M3), []>; 52*9880d681SAndroid Build Coastguard Worker def CLGIBReturn : Alias<6, (outs), (ins GR64:$R1, imm64zx8:$I2, cond4:$M3), []>; 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker// Unconditional branches. R1 is the condition-code mask (all 1s). 56*9880d681SAndroid Build Coastguard Workerlet isBranch = 1, isTerminator = 1, isBarrier = 1, R1 = 15 in { 57*9880d681SAndroid Build Coastguard Worker let isIndirectBranch = 1 in 58*9880d681SAndroid Build Coastguard Worker def BR : InstRR<0x07, (outs), (ins ADDR64:$R2), 59*9880d681SAndroid Build Coastguard Worker "br\t$R2", [(brind ADDR64:$R2)]>; 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker // An assembler extended mnemonic for BRC. 62*9880d681SAndroid Build Coastguard Worker def J : InstRI<0xA74, (outs), (ins brtarget16:$I2), "j\t$I2", 63*9880d681SAndroid Build Coastguard Worker [(br bb:$I2)]>; 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker // An assembler extended mnemonic for BRCL. (The extension is "G" 66*9880d681SAndroid Build Coastguard Worker // rather than "L" because "JL" is "Jump if Less".) 67*9880d681SAndroid Build Coastguard Worker def JG : InstRIL<0xC04, (outs), (ins brtarget32:$I2), "jg\t$I2", []>; 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker// FIXME: This trap instruction should be marked as isTerminator, but there is 71*9880d681SAndroid Build Coastguard Worker// currently a general bug that allows non-terminators to be placed between 72*9880d681SAndroid Build Coastguard Worker// terminators. Temporarily leave this unmarked until the bug is fixed. 73*9880d681SAndroid Build Coastguard Workerlet isBarrier = 1, hasCtrlDep = 1 in { 74*9880d681SAndroid Build Coastguard Worker def Trap : Alias<4, (outs), (ins), [(trap)]>; 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerlet isTerminator = 1, hasCtrlDep = 1, Uses = [CC] in { 78*9880d681SAndroid Build Coastguard Worker def CondTrap : Alias<4, (outs), (ins cond4:$valid, cond4:$R1), []>; 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker// Conditional branches. It's easier for LLVM to handle these branches 82*9880d681SAndroid Build Coastguard Worker// in their raw BRC/BRCL form, with the 4-bit condition-code mask being 83*9880d681SAndroid Build Coastguard Worker// the first operand. It seems friendlier to use mnemonic forms like 84*9880d681SAndroid Build Coastguard Worker// JE and JLH when writing out the assembly though. 85*9880d681SAndroid Build Coastguard Workerlet isBranch = 1, isTerminator = 1, Uses = [CC] in { 86*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1, CCMaskFirst = 1 in { 87*9880d681SAndroid Build Coastguard Worker def BRC : InstRI<0xA74, (outs), (ins cond4:$valid, cond4:$R1, 88*9880d681SAndroid Build Coastguard Worker brtarget16:$I2), "j$R1\t$I2", 89*9880d681SAndroid Build Coastguard Worker [(z_br_ccmask cond4:$valid, cond4:$R1, bb:$I2)]>; 90*9880d681SAndroid Build Coastguard Worker def BRCL : InstRIL<0xC04, (outs), (ins cond4:$valid, cond4:$R1, 91*9880d681SAndroid Build Coastguard Worker brtarget32:$I2), "jg$R1\t$I2", []>; 92*9880d681SAndroid Build Coastguard Worker let isIndirectBranch = 1 in 93*9880d681SAndroid Build Coastguard Worker def BCR : InstRR<0x07, (outs), (ins cond4:$valid, cond4:$R1, GR64:$R2), 94*9880d681SAndroid Build Coastguard Worker "b${R1}r\t$R2", []>; 95*9880d681SAndroid Build Coastguard Worker } 96*9880d681SAndroid Build Coastguard Worker def AsmBRC : InstRI<0xA74, (outs), (ins imm32zx4:$R1, brtarget16:$I2), 97*9880d681SAndroid Build Coastguard Worker "brc\t$R1, $I2", []>; 98*9880d681SAndroid Build Coastguard Worker def AsmBRCL : InstRIL<0xC04, (outs), (ins imm32zx4:$R1, brtarget32:$I2), 99*9880d681SAndroid Build Coastguard Worker "brcl\t$R1, $I2", []>; 100*9880d681SAndroid Build Coastguard Worker let isIndirectBranch = 1 in { 101*9880d681SAndroid Build Coastguard Worker def AsmBC : InstRX<0x47, (outs), (ins imm32zx4:$R1, bdxaddr12only:$XBD2), 102*9880d681SAndroid Build Coastguard Worker "bc\t$R1, $XBD2", []>; 103*9880d681SAndroid Build Coastguard Worker def AsmBCR : InstRR<0x07, (outs), (ins imm32zx4:$R1, GR64:$R2), 104*9880d681SAndroid Build Coastguard Worker "bcr\t$R1, $R2", []>; 105*9880d681SAndroid Build Coastguard Worker } 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerdef AsmNop : InstAlias<"nop\t$XBD", (AsmBC 0, bdxaddr12only:$XBD), 0>; 109*9880d681SAndroid Build Coastguard Workerdef AsmNopR : InstAlias<"nopr\t$R", (AsmBCR 0, GR64:$R), 0>; 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker// Fused compare-and-branch instructions. As for normal branches, 112*9880d681SAndroid Build Coastguard Worker// we handle these instructions internally in their raw CRJ-like form, 113*9880d681SAndroid Build Coastguard Worker// but use assembly macros like CRJE when writing them out. 114*9880d681SAndroid Build Coastguard Worker// 115*9880d681SAndroid Build Coastguard Worker// These instructions do not use or clobber the condition codes. 116*9880d681SAndroid Build Coastguard Worker// We nevertheless pretend that they clobber CC, so that we can lower 117*9880d681SAndroid Build Coastguard Worker// them to separate comparisons and BRCLs if the branch ends up being 118*9880d681SAndroid Build Coastguard Worker// out of range. 119*9880d681SAndroid Build Coastguard Workermulticlass CompareBranches<Operand ccmask, string pos1, string pos2> { 120*9880d681SAndroid Build Coastguard Worker let isBranch = 1, isTerminator = 1, Defs = [CC] in { 121*9880d681SAndroid Build Coastguard Worker def RJ : InstRIEb<0xEC76, (outs), (ins GR32:$R1, GR32:$R2, ccmask:$M3, 122*9880d681SAndroid Build Coastguard Worker brtarget16:$RI4), 123*9880d681SAndroid Build Coastguard Worker "crj"##pos1##"\t$R1, $R2"##pos2##", $RI4", []>; 124*9880d681SAndroid Build Coastguard Worker def GRJ : InstRIEb<0xEC64, (outs), (ins GR64:$R1, GR64:$R2, ccmask:$M3, 125*9880d681SAndroid Build Coastguard Worker brtarget16:$RI4), 126*9880d681SAndroid Build Coastguard Worker "cgrj"##pos1##"\t$R1, $R2"##pos2##", $RI4", []>; 127*9880d681SAndroid Build Coastguard Worker def IJ : InstRIEc<0xEC7E, (outs), (ins GR32:$R1, imm32sx8:$I2, ccmask:$M3, 128*9880d681SAndroid Build Coastguard Worker brtarget16:$RI4), 129*9880d681SAndroid Build Coastguard Worker "cij"##pos1##"\t$R1, $I2"##pos2##", $RI4", []>; 130*9880d681SAndroid Build Coastguard Worker def GIJ : InstRIEc<0xEC7C, (outs), (ins GR64:$R1, imm64sx8:$I2, ccmask:$M3, 131*9880d681SAndroid Build Coastguard Worker brtarget16:$RI4), 132*9880d681SAndroid Build Coastguard Worker "cgij"##pos1##"\t$R1, $I2"##pos2##", $RI4", []>; 133*9880d681SAndroid Build Coastguard Worker def LRJ : InstRIEb<0xEC77, (outs), (ins GR32:$R1, GR32:$R2, ccmask:$M3, 134*9880d681SAndroid Build Coastguard Worker brtarget16:$RI4), 135*9880d681SAndroid Build Coastguard Worker "clrj"##pos1##"\t$R1, $R2"##pos2##", $RI4", []>; 136*9880d681SAndroid Build Coastguard Worker def LGRJ : InstRIEb<0xEC65, (outs), (ins GR64:$R1, GR64:$R2, ccmask:$M3, 137*9880d681SAndroid Build Coastguard Worker brtarget16:$RI4), 138*9880d681SAndroid Build Coastguard Worker "clgrj"##pos1##"\t$R1, $R2"##pos2##", $RI4", []>; 139*9880d681SAndroid Build Coastguard Worker def LIJ : InstRIEc<0xEC7F, (outs), (ins GR32:$R1, imm32zx8:$I2, ccmask:$M3, 140*9880d681SAndroid Build Coastguard Worker brtarget16:$RI4), 141*9880d681SAndroid Build Coastguard Worker "clij"##pos1##"\t$R1, $I2"##pos2##", $RI4", []>; 142*9880d681SAndroid Build Coastguard Worker def LGIJ : InstRIEc<0xEC7D, (outs), (ins GR64:$R1, imm64zx8:$I2, ccmask:$M3, 143*9880d681SAndroid Build Coastguard Worker brtarget16:$RI4), 144*9880d681SAndroid Build Coastguard Worker "clgij"##pos1##"\t$R1, $I2"##pos2##", $RI4", []>; 145*9880d681SAndroid Build Coastguard Worker let isIndirectBranch = 1 in { 146*9880d681SAndroid Build Coastguard Worker def RB : InstRRS<0xECF6, (outs), (ins GR32:$R1, GR32:$R2, ccmask:$M3, 147*9880d681SAndroid Build Coastguard Worker bdaddr12only:$BD4), 148*9880d681SAndroid Build Coastguard Worker "crb"##pos1##"\t$R1, $R2"##pos2##", $BD4", []>; 149*9880d681SAndroid Build Coastguard Worker def GRB : InstRRS<0xECE4, (outs), (ins GR64:$R1, GR64:$R2, ccmask:$M3, 150*9880d681SAndroid Build Coastguard Worker bdaddr12only:$BD4), 151*9880d681SAndroid Build Coastguard Worker "cgrb"##pos1##"\t$R1, $R2"##pos2##", $BD4", []>; 152*9880d681SAndroid Build Coastguard Worker def IB : InstRIS<0xECFE, (outs), (ins GR32:$R1, imm32sx8:$I2, ccmask:$M3, 153*9880d681SAndroid Build Coastguard Worker bdaddr12only:$BD4), 154*9880d681SAndroid Build Coastguard Worker "cib"##pos1##"\t$R1, $I2"##pos2##", $BD4", []>; 155*9880d681SAndroid Build Coastguard Worker def GIB : InstRIS<0xECFC, (outs), (ins GR64:$R1, imm64sx8:$I2, ccmask:$M3, 156*9880d681SAndroid Build Coastguard Worker bdaddr12only:$BD4), 157*9880d681SAndroid Build Coastguard Worker "cgib"##pos1##"\t$R1, $I2"##pos2##", $BD4", []>; 158*9880d681SAndroid Build Coastguard Worker def LRB : InstRRS<0xECF7, (outs), (ins GR32:$R1, GR32:$R2, ccmask:$M3, 159*9880d681SAndroid Build Coastguard Worker bdaddr12only:$BD4), 160*9880d681SAndroid Build Coastguard Worker "clrb"##pos1##"\t$R1, $R2"##pos2##", $BD4", []>; 161*9880d681SAndroid Build Coastguard Worker def LGRB : InstRRS<0xECE5, (outs), (ins GR64:$R1, GR64:$R2, ccmask:$M3, 162*9880d681SAndroid Build Coastguard Worker bdaddr12only:$BD4), 163*9880d681SAndroid Build Coastguard Worker "clgrb"##pos1##"\t$R1, $R2"##pos2##", $BD4", []>; 164*9880d681SAndroid Build Coastguard Worker def LIB : InstRIS<0xECFF, (outs), (ins GR32:$R1, imm32zx8:$I2, ccmask:$M3, 165*9880d681SAndroid Build Coastguard Worker bdaddr12only:$BD4), 166*9880d681SAndroid Build Coastguard Worker "clib"##pos1##"\t$R1, $I2"##pos2##", $BD4", []>; 167*9880d681SAndroid Build Coastguard Worker def LGIB : InstRIS<0xECFD, (outs), (ins GR64:$R1, imm64zx8:$I2, ccmask:$M3, 168*9880d681SAndroid Build Coastguard Worker bdaddr12only:$BD4), 169*9880d681SAndroid Build Coastguard Worker "clgib"##pos1##"\t$R1, $I2"##pos2##", $BD4", []>; 170*9880d681SAndroid Build Coastguard Worker } 171*9880d681SAndroid Build Coastguard Worker } 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker let isTerminator = 1, hasCtrlDep = 1 in { 174*9880d681SAndroid Build Coastguard Worker def RT : InstRRFc<0xB972, (outs), (ins GR32:$R1, GR32:$R2, ccmask:$M3), 175*9880d681SAndroid Build Coastguard Worker "crt"##pos1##"\t$R1, $R2"##pos2, []>; 176*9880d681SAndroid Build Coastguard Worker def GRT : InstRRFc<0xB960, (outs), (ins GR64:$R1, GR64:$R2, ccmask:$M3), 177*9880d681SAndroid Build Coastguard Worker "cgrt"##pos1##"\t$R1, $R2"##pos2, []>; 178*9880d681SAndroid Build Coastguard Worker def LRT : InstRRFc<0xB973, (outs), (ins GR32:$R1, GR32:$R2, ccmask:$M3), 179*9880d681SAndroid Build Coastguard Worker "clrt"##pos1##"\t$R1, $R2"##pos2, []>; 180*9880d681SAndroid Build Coastguard Worker def LGRT : InstRRFc<0xB961, (outs), (ins GR64:$R1, GR64:$R2, ccmask:$M3), 181*9880d681SAndroid Build Coastguard Worker "clgrt"##pos1##"\t$R1, $R2"##pos2, []>; 182*9880d681SAndroid Build Coastguard Worker def IT : InstRIEa<0xEC72, (outs), (ins GR32:$R1, imm32sx16:$I2, ccmask:$M3), 183*9880d681SAndroid Build Coastguard Worker "cit"##pos1##"\t$R1, $I2"##pos2, []>; 184*9880d681SAndroid Build Coastguard Worker def GIT : InstRIEa<0xEC70, (outs), (ins GR64:$R1, imm32sx16:$I2, ccmask:$M3), 185*9880d681SAndroid Build Coastguard Worker "cgit"##pos1##"\t$R1, $I2"##pos2, []>; 186*9880d681SAndroid Build Coastguard Worker def LFIT : InstRIEa<0xEC73, (outs), (ins GR32:$R1, imm32zx16:$I2, ccmask:$M3), 187*9880d681SAndroid Build Coastguard Worker "clfit"##pos1##"\t$R1, $I2"##pos2, []>; 188*9880d681SAndroid Build Coastguard Worker def LGIT : InstRIEa<0xEC71, (outs), (ins GR64:$R1, imm32zx16:$I2, ccmask:$M3), 189*9880d681SAndroid Build Coastguard Worker "clgit"##pos1##"\t$R1, $I2"##pos2, []>; 190*9880d681SAndroid Build Coastguard Worker } 191*9880d681SAndroid Build Coastguard Worker} 192*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in 193*9880d681SAndroid Build Coastguard Worker defm C : CompareBranches<cond4, "$M3", "">; 194*9880d681SAndroid Build Coastguard Workerdefm AsmC : CompareBranches<imm32zx4, "", ", $M3">; 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Worker// Define AsmParser mnemonics for each general condition-code mask 197*9880d681SAndroid Build Coastguard Worker// (integer or floating-point) 198*9880d681SAndroid Build Coastguard Workermulticlass CondExtendedMnemonicA<bits<4> ccmask, string name> { 199*9880d681SAndroid Build Coastguard Worker let isBranch = 1, isTerminator = 1, R1 = ccmask in { 200*9880d681SAndroid Build Coastguard Worker def J : InstRI<0xA74, (outs), (ins brtarget16:$I2), 201*9880d681SAndroid Build Coastguard Worker "j"##name##"\t$I2", []>; 202*9880d681SAndroid Build Coastguard Worker def JG : InstRIL<0xC04, (outs), (ins brtarget32:$I2), 203*9880d681SAndroid Build Coastguard Worker "jg"##name##"\t$I2", []>; 204*9880d681SAndroid Build Coastguard Worker def BR : InstRR<0x07, (outs), (ins ADDR64:$R2), "b"##name##"r\t$R2", []>; 205*9880d681SAndroid Build Coastguard Worker } 206*9880d681SAndroid Build Coastguard Worker def LOCR : FixedCondUnaryRRF<"locr"##name, 0xB9F2, GR32, GR32, ccmask>; 207*9880d681SAndroid Build Coastguard Worker def LOCGR : FixedCondUnaryRRF<"locgr"##name, 0xB9E2, GR64, GR64, ccmask>; 208*9880d681SAndroid Build Coastguard Worker def LOCHI : FixedCondUnaryRIE<"lochi"##name, 0xEC42, GR64, imm32sx16, 209*9880d681SAndroid Build Coastguard Worker ccmask>; 210*9880d681SAndroid Build Coastguard Worker def LOCGHI: FixedCondUnaryRIE<"locghi"##name, 0xEC46, GR64, imm64sx16, 211*9880d681SAndroid Build Coastguard Worker ccmask>; 212*9880d681SAndroid Build Coastguard Worker def LOC : FixedCondUnaryRSY<"loc"##name, 0xEBF2, GR32, ccmask, 4>; 213*9880d681SAndroid Build Coastguard Worker def LOCG : FixedCondUnaryRSY<"locg"##name, 0xEBE2, GR64, ccmask, 8>; 214*9880d681SAndroid Build Coastguard Worker def STOC : FixedCondStoreRSY<"stoc"##name, 0xEBF3, GR32, ccmask, 4>; 215*9880d681SAndroid Build Coastguard Worker def STOCG : FixedCondStoreRSY<"stocg"##name, 0xEBE3, GR64, ccmask, 8>; 216*9880d681SAndroid Build Coastguard Worker} 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Workermulticlass CondExtendedMnemonic<bits<4> ccmask, string name1, string name2> 219*9880d681SAndroid Build Coastguard Worker : CondExtendedMnemonicA<ccmask, name1> { 220*9880d681SAndroid Build Coastguard Worker let isAsmParserOnly = 1 in 221*9880d681SAndroid Build Coastguard Worker defm Alt : CondExtendedMnemonicA<ccmask, name2>; 222*9880d681SAndroid Build Coastguard Worker} 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Workerdefm AsmO : CondExtendedMnemonicA<1, "o">; 225*9880d681SAndroid Build Coastguard Workerdefm AsmH : CondExtendedMnemonic<2, "h", "p">; 226*9880d681SAndroid Build Coastguard Workerdefm AsmNLE : CondExtendedMnemonicA<3, "nle">; 227*9880d681SAndroid Build Coastguard Workerdefm AsmL : CondExtendedMnemonic<4, "l", "m">; 228*9880d681SAndroid Build Coastguard Workerdefm AsmNHE : CondExtendedMnemonicA<5, "nhe">; 229*9880d681SAndroid Build Coastguard Workerdefm AsmLH : CondExtendedMnemonicA<6, "lh">; 230*9880d681SAndroid Build Coastguard Workerdefm AsmNE : CondExtendedMnemonic<7, "ne", "nz">; 231*9880d681SAndroid Build Coastguard Workerdefm AsmE : CondExtendedMnemonic<8, "e", "z">; 232*9880d681SAndroid Build Coastguard Workerdefm AsmNLH : CondExtendedMnemonicA<9, "nlh">; 233*9880d681SAndroid Build Coastguard Workerdefm AsmHE : CondExtendedMnemonicA<10, "he">; 234*9880d681SAndroid Build Coastguard Workerdefm AsmNL : CondExtendedMnemonic<11, "nl", "nm">; 235*9880d681SAndroid Build Coastguard Workerdefm AsmLE : CondExtendedMnemonicA<12, "le">; 236*9880d681SAndroid Build Coastguard Workerdefm AsmNH : CondExtendedMnemonic<13, "nh", "np">; 237*9880d681SAndroid Build Coastguard Workerdefm AsmNO : CondExtendedMnemonicA<14, "no">; 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Worker// Define AsmParser mnemonics for each integer condition-code mask. 240*9880d681SAndroid Build Coastguard Worker// This is like the list above, except that condition 3 is not possible 241*9880d681SAndroid Build Coastguard Worker// and that the low bit of the mask is therefore always 0. This means 242*9880d681SAndroid Build Coastguard Worker// that each condition has two names. Conditions "o" and "no" are not used. 243*9880d681SAndroid Build Coastguard Worker// 244*9880d681SAndroid Build Coastguard Worker// We don't make one of the two names an alias of the other because 245*9880d681SAndroid Build Coastguard Worker// we need the custom parsing routines to select the correct register class. 246*9880d681SAndroid Build Coastguard Workermulticlass IntCondExtendedMnemonicA<bits<4> ccmask, string name> { 247*9880d681SAndroid Build Coastguard Worker let isBranch = 1, isTerminator = 1, M3 = ccmask in { 248*9880d681SAndroid Build Coastguard Worker def CRJ : InstRIEb<0xEC76, (outs), (ins GR32:$R1, GR32:$R2, 249*9880d681SAndroid Build Coastguard Worker brtarget16:$RI4), 250*9880d681SAndroid Build Coastguard Worker "crj"##name##"\t$R1, $R2, $RI4", []>; 251*9880d681SAndroid Build Coastguard Worker def CGRJ : InstRIEb<0xEC64, (outs), (ins GR64:$R1, GR64:$R2, 252*9880d681SAndroid Build Coastguard Worker brtarget16:$RI4), 253*9880d681SAndroid Build Coastguard Worker "cgrj"##name##"\t$R1, $R2, $RI4", []>; 254*9880d681SAndroid Build Coastguard Worker def CIJ : InstRIEc<0xEC7E, (outs), (ins GR32:$R1, imm32sx8:$I2, 255*9880d681SAndroid Build Coastguard Worker brtarget16:$RI4), 256*9880d681SAndroid Build Coastguard Worker "cij"##name##"\t$R1, $I2, $RI4", []>; 257*9880d681SAndroid Build Coastguard Worker def CGIJ : InstRIEc<0xEC7C, (outs), (ins GR64:$R1, imm64sx8:$I2, 258*9880d681SAndroid Build Coastguard Worker brtarget16:$RI4), 259*9880d681SAndroid Build Coastguard Worker "cgij"##name##"\t$R1, $I2, $RI4", []>; 260*9880d681SAndroid Build Coastguard Worker def CLRJ : InstRIEb<0xEC77, (outs), (ins GR32:$R1, GR32:$R2, 261*9880d681SAndroid Build Coastguard Worker brtarget16:$RI4), 262*9880d681SAndroid Build Coastguard Worker "clrj"##name##"\t$R1, $R2, $RI4", []>; 263*9880d681SAndroid Build Coastguard Worker def CLGRJ : InstRIEb<0xEC65, (outs), (ins GR64:$R1, GR64:$R2, 264*9880d681SAndroid Build Coastguard Worker brtarget16:$RI4), 265*9880d681SAndroid Build Coastguard Worker "clgrj"##name##"\t$R1, $R2, $RI4", []>; 266*9880d681SAndroid Build Coastguard Worker def CLIJ : InstRIEc<0xEC7F, (outs), (ins GR32:$R1, imm32zx8:$I2, 267*9880d681SAndroid Build Coastguard Worker brtarget16:$RI4), 268*9880d681SAndroid Build Coastguard Worker "clij"##name##"\t$R1, $I2, $RI4", []>; 269*9880d681SAndroid Build Coastguard Worker def CLGIJ : InstRIEc<0xEC7D, (outs), (ins GR64:$R1, imm64zx8:$I2, 270*9880d681SAndroid Build Coastguard Worker brtarget16:$RI4), 271*9880d681SAndroid Build Coastguard Worker "clgij"##name##"\t$R1, $I2, $RI4", []>; 272*9880d681SAndroid Build Coastguard Worker let isIndirectBranch = 1 in { 273*9880d681SAndroid Build Coastguard Worker def CRB : InstRRS<0xECF6, (outs), (ins GR32:$R1, GR32:$R2, 274*9880d681SAndroid Build Coastguard Worker bdaddr12only:$BD4), 275*9880d681SAndroid Build Coastguard Worker "crb"##name##"\t$R1, $R2, $BD4", []>; 276*9880d681SAndroid Build Coastguard Worker def CGRB : InstRRS<0xECE4, (outs), (ins GR64:$R1, GR64:$R2, 277*9880d681SAndroid Build Coastguard Worker bdaddr12only:$BD4), 278*9880d681SAndroid Build Coastguard Worker "cgrb"##name##"\t$R1, $R2, $BD4", []>; 279*9880d681SAndroid Build Coastguard Worker def CIB : InstRIS<0xECFE, (outs), (ins GR32:$R1, imm32sx8:$I2, 280*9880d681SAndroid Build Coastguard Worker bdaddr12only:$BD4), 281*9880d681SAndroid Build Coastguard Worker "cib"##name##"\t$R1, $I2, $BD4", []>; 282*9880d681SAndroid Build Coastguard Worker def CGIB : InstRIS<0xECFC, (outs), (ins GR64:$R1, imm64sx8:$I2, 283*9880d681SAndroid Build Coastguard Worker bdaddr12only:$BD4), 284*9880d681SAndroid Build Coastguard Worker "cgib"##name##"\t$R1, $I2, $BD4", []>; 285*9880d681SAndroid Build Coastguard Worker def CLRB : InstRRS<0xECF7, (outs), (ins GR32:$R1, GR32:$R2, 286*9880d681SAndroid Build Coastguard Worker bdaddr12only:$BD4), 287*9880d681SAndroid Build Coastguard Worker "clrb"##name##"\t$R1, $R2, $BD4", []>; 288*9880d681SAndroid Build Coastguard Worker def CLGRB : InstRRS<0xECE5, (outs), (ins GR64:$R1, GR64:$R2, 289*9880d681SAndroid Build Coastguard Worker bdaddr12only:$BD4), 290*9880d681SAndroid Build Coastguard Worker "clgrb"##name##"\t$R1, $R2, $BD4", []>; 291*9880d681SAndroid Build Coastguard Worker def CLIB : InstRIS<0xECFF, (outs), (ins GR32:$R1, imm32zx8:$I2, 292*9880d681SAndroid Build Coastguard Worker bdaddr12only:$BD4), 293*9880d681SAndroid Build Coastguard Worker "clib"##name##"\t$R1, $I2, $BD4", []>; 294*9880d681SAndroid Build Coastguard Worker def CLGIB : InstRIS<0xECFD, (outs), (ins GR64:$R1, imm64zx8:$I2, 295*9880d681SAndroid Build Coastguard Worker bdaddr12only:$BD4), 296*9880d681SAndroid Build Coastguard Worker "clgib"##name##"\t$R1, $I2, $BD4", []>; 297*9880d681SAndroid Build Coastguard Worker } 298*9880d681SAndroid Build Coastguard Worker } 299*9880d681SAndroid Build Coastguard Worker 300*9880d681SAndroid Build Coastguard Worker let hasCtrlDep = 1, isTerminator = 1, M3 = ccmask in { 301*9880d681SAndroid Build Coastguard Worker def CRT : InstRRFc<0xB972, (outs), (ins GR32:$R1, GR32:$R2), 302*9880d681SAndroid Build Coastguard Worker "crt"##name##"\t$R1, $R2", []>; 303*9880d681SAndroid Build Coastguard Worker def CGRT : InstRRFc<0xB960, (outs), (ins GR64:$R1, GR64:$R2), 304*9880d681SAndroid Build Coastguard Worker "cgrt"##name##"\t$R1, $R2", []>; 305*9880d681SAndroid Build Coastguard Worker def CLRT : InstRRFc<0xB973, (outs), (ins GR32:$R1, GR32:$R2), 306*9880d681SAndroid Build Coastguard Worker "clrt"##name##"\t$R1, $R2", []>; 307*9880d681SAndroid Build Coastguard Worker def CLGRT : InstRRFc<0xB961, (outs), (ins GR64:$R1, GR64:$R2), 308*9880d681SAndroid Build Coastguard Worker "clgrt"##name##"\t$R1, $R2", []>; 309*9880d681SAndroid Build Coastguard Worker def CIT : InstRIEa<0xEC72, (outs), (ins GR32:$R1, imm32sx16:$I2), 310*9880d681SAndroid Build Coastguard Worker "cit"##name##"\t$R1, $I2", []>; 311*9880d681SAndroid Build Coastguard Worker def CGIT : InstRIEa<0xEC70, (outs), (ins GR64:$R1, imm32sx16:$I2), 312*9880d681SAndroid Build Coastguard Worker "cgit"##name##"\t$R1, $I2", []>; 313*9880d681SAndroid Build Coastguard Worker def CLFIT : InstRIEa<0xEC73, (outs), (ins GR32:$R1, imm32zx16:$I2), 314*9880d681SAndroid Build Coastguard Worker "clfit"##name##"\t$R1, $I2", []>; 315*9880d681SAndroid Build Coastguard Worker def CLGIT : InstRIEa<0xEC71, (outs), (ins GR64:$R1, imm32zx16:$I2), 316*9880d681SAndroid Build Coastguard Worker "clgit"##name##"\t$R1, $I2", []>; 317*9880d681SAndroid Build Coastguard Worker } 318*9880d681SAndroid Build Coastguard Worker} 319*9880d681SAndroid Build Coastguard Workermulticlass IntCondExtendedMnemonic<bits<4> ccmask, string name1, string name2> 320*9880d681SAndroid Build Coastguard Worker : IntCondExtendedMnemonicA<ccmask, name1> { 321*9880d681SAndroid Build Coastguard Worker let isAsmParserOnly = 1 in 322*9880d681SAndroid Build Coastguard Worker defm Alt : IntCondExtendedMnemonicA<ccmask, name2>; 323*9880d681SAndroid Build Coastguard Worker} 324*9880d681SAndroid Build Coastguard Workerdefm AsmJH : IntCondExtendedMnemonic<2, "h", "nle">; 325*9880d681SAndroid Build Coastguard Workerdefm AsmJL : IntCondExtendedMnemonic<4, "l", "nhe">; 326*9880d681SAndroid Build Coastguard Workerdefm AsmJLH : IntCondExtendedMnemonic<6, "lh", "ne">; 327*9880d681SAndroid Build Coastguard Workerdefm AsmJE : IntCondExtendedMnemonic<8, "e", "nlh">; 328*9880d681SAndroid Build Coastguard Workerdefm AsmJHE : IntCondExtendedMnemonic<10, "he", "nl">; 329*9880d681SAndroid Build Coastguard Workerdefm AsmJLE : IntCondExtendedMnemonic<12, "le", "nh">; 330*9880d681SAndroid Build Coastguard Worker 331*9880d681SAndroid Build Coastguard Worker// Decrement a register and branch if it is nonzero. These don't clobber CC, 332*9880d681SAndroid Build Coastguard Worker// but we might need to split long branches into sequences that do. 333*9880d681SAndroid Build Coastguard Workerlet Defs = [CC] in { 334*9880d681SAndroid Build Coastguard Worker def BRCT : BranchUnaryRI<"brct", 0xA76, GR32>; 335*9880d681SAndroid Build Coastguard Worker def BRCTG : BranchUnaryRI<"brctg", 0xA77, GR64>; 336*9880d681SAndroid Build Coastguard Worker} 337*9880d681SAndroid Build Coastguard Worker 338*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 339*9880d681SAndroid Build Coastguard Worker// Select instructions 340*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 341*9880d681SAndroid Build Coastguard Worker 342*9880d681SAndroid Build Coastguard Workerdef Select32Mux : SelectWrapper<GRX32>, Requires<[FeatureHighWord]>; 343*9880d681SAndroid Build Coastguard Workerdef Select32 : SelectWrapper<GR32>; 344*9880d681SAndroid Build Coastguard Workerdef Select64 : SelectWrapper<GR64>; 345*9880d681SAndroid Build Coastguard Worker 346*9880d681SAndroid Build Coastguard Worker// We don't define 32-bit Mux stores because the low-only STOC should 347*9880d681SAndroid Build Coastguard Worker// always be used if possible. 348*9880d681SAndroid Build Coastguard Workerdefm CondStore8Mux : CondStores<GRX32, nonvolatile_truncstorei8, 349*9880d681SAndroid Build Coastguard Worker nonvolatile_anyextloadi8, bdxaddr20only>, 350*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 351*9880d681SAndroid Build Coastguard Workerdefm CondStore16Mux : CondStores<GRX32, nonvolatile_truncstorei16, 352*9880d681SAndroid Build Coastguard Worker nonvolatile_anyextloadi16, bdxaddr20only>, 353*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 354*9880d681SAndroid Build Coastguard Workerdefm CondStore8 : CondStores<GR32, nonvolatile_truncstorei8, 355*9880d681SAndroid Build Coastguard Worker nonvolatile_anyextloadi8, bdxaddr20only>; 356*9880d681SAndroid Build Coastguard Workerdefm CondStore16 : CondStores<GR32, nonvolatile_truncstorei16, 357*9880d681SAndroid Build Coastguard Worker nonvolatile_anyextloadi16, bdxaddr20only>; 358*9880d681SAndroid Build Coastguard Workerdefm CondStore32 : CondStores<GR32, nonvolatile_store, 359*9880d681SAndroid Build Coastguard Worker nonvolatile_load, bdxaddr20only>; 360*9880d681SAndroid Build Coastguard Worker 361*9880d681SAndroid Build Coastguard Workerdefm : CondStores64<CondStore8, CondStore8Inv, nonvolatile_truncstorei8, 362*9880d681SAndroid Build Coastguard Worker nonvolatile_anyextloadi8, bdxaddr20only>; 363*9880d681SAndroid Build Coastguard Workerdefm : CondStores64<CondStore16, CondStore16Inv, nonvolatile_truncstorei16, 364*9880d681SAndroid Build Coastguard Worker nonvolatile_anyextloadi16, bdxaddr20only>; 365*9880d681SAndroid Build Coastguard Workerdefm : CondStores64<CondStore32, CondStore32Inv, nonvolatile_truncstorei32, 366*9880d681SAndroid Build Coastguard Worker nonvolatile_anyextloadi32, bdxaddr20only>; 367*9880d681SAndroid Build Coastguard Workerdefm CondStore64 : CondStores<GR64, nonvolatile_store, 368*9880d681SAndroid Build Coastguard Worker nonvolatile_load, bdxaddr20only>; 369*9880d681SAndroid Build Coastguard Worker 370*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 371*9880d681SAndroid Build Coastguard Worker// Call instructions 372*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 373*9880d681SAndroid Build Coastguard Worker 374*9880d681SAndroid Build Coastguard Workerlet isCall = 1, Defs = [R14D, CC] in { 375*9880d681SAndroid Build Coastguard Worker def CallBRASL : Alias<6, (outs), (ins pcrel32:$I2, variable_ops), 376*9880d681SAndroid Build Coastguard Worker [(z_call pcrel32:$I2)]>; 377*9880d681SAndroid Build Coastguard Worker def CallBASR : Alias<2, (outs), (ins ADDR64:$R2, variable_ops), 378*9880d681SAndroid Build Coastguard Worker [(z_call ADDR64:$R2)]>; 379*9880d681SAndroid Build Coastguard Worker} 380*9880d681SAndroid Build Coastguard Worker 381*9880d681SAndroid Build Coastguard Worker// Sibling calls. Indirect sibling calls must be via R1, since R2 upwards 382*9880d681SAndroid Build Coastguard Worker// are argument registers and since branching to R0 is a no-op. 383*9880d681SAndroid Build Coastguard Workerlet isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in { 384*9880d681SAndroid Build Coastguard Worker def CallJG : Alias<6, (outs), (ins pcrel32:$I2), 385*9880d681SAndroid Build Coastguard Worker [(z_sibcall pcrel32:$I2)]>; 386*9880d681SAndroid Build Coastguard Worker let Uses = [R1D] in 387*9880d681SAndroid Build Coastguard Worker def CallBR : Alias<2, (outs), (ins), [(z_sibcall R1D)]>; 388*9880d681SAndroid Build Coastguard Worker} 389*9880d681SAndroid Build Coastguard Worker 390*9880d681SAndroid Build Coastguard Workerlet CCMaskFirst = 1, isCall = 1, isTerminator = 1, isReturn = 1 in { 391*9880d681SAndroid Build Coastguard Worker def CallBRCL : Alias<6, (outs), (ins cond4:$valid, cond4:$R1, 392*9880d681SAndroid Build Coastguard Worker pcrel32:$I2), []>; 393*9880d681SAndroid Build Coastguard Worker 394*9880d681SAndroid Build Coastguard Worker let Uses = [R1D] in 395*9880d681SAndroid Build Coastguard Worker def CallBCR : Alias<2, (outs), (ins cond4:$valid, cond4:$R1), []>; 396*9880d681SAndroid Build Coastguard Worker} 397*9880d681SAndroid Build Coastguard Worker 398*9880d681SAndroid Build Coastguard Worker// Fused compare and conditional sibling calls. 399*9880d681SAndroid Build Coastguard Workerlet isCall = 1, isTerminator = 1, isReturn = 1, Uses = [R1D] in { 400*9880d681SAndroid Build Coastguard Worker def CRBCall : Alias<6, (outs), (ins GR32:$R1, GR32:$R2, cond4:$M3), []>; 401*9880d681SAndroid Build Coastguard Worker def CGRBCall : Alias<6, (outs), (ins GR64:$R1, GR64:$R2, cond4:$M3), []>; 402*9880d681SAndroid Build Coastguard Worker def CIBCall : Alias<6, (outs), (ins GR32:$R1, imm32sx8:$I2, cond4:$M3), []>; 403*9880d681SAndroid Build Coastguard Worker def CGIBCall : Alias<6, (outs), (ins GR64:$R1, imm64sx8:$I2, cond4:$M3), []>; 404*9880d681SAndroid Build Coastguard Worker def CLRBCall : Alias<6, (outs), (ins GR32:$R1, GR32:$R2, cond4:$M3), []>; 405*9880d681SAndroid Build Coastguard Worker def CLGRBCall : Alias<6, (outs), (ins GR64:$R1, GR64:$R2, cond4:$M3), []>; 406*9880d681SAndroid Build Coastguard Worker def CLIBCall : Alias<6, (outs), (ins GR32:$R1, imm32zx8:$I2, cond4:$M3), []>; 407*9880d681SAndroid Build Coastguard Worker def CLGIBCall : Alias<6, (outs), (ins GR64:$R1, imm64zx8:$I2, cond4:$M3), []>; 408*9880d681SAndroid Build Coastguard Worker} 409*9880d681SAndroid Build Coastguard Worker 410*9880d681SAndroid Build Coastguard Worker// TLS calls. These will be lowered into a call to __tls_get_offset, 411*9880d681SAndroid Build Coastguard Worker// with an extra relocation specifying the TLS symbol. 412*9880d681SAndroid Build Coastguard Workerlet isCall = 1, Defs = [R14D, CC] in { 413*9880d681SAndroid Build Coastguard Worker def TLS_GDCALL : Alias<6, (outs), (ins tlssym:$I2, variable_ops), 414*9880d681SAndroid Build Coastguard Worker [(z_tls_gdcall tglobaltlsaddr:$I2)]>; 415*9880d681SAndroid Build Coastguard Worker def TLS_LDCALL : Alias<6, (outs), (ins tlssym:$I2, variable_ops), 416*9880d681SAndroid Build Coastguard Worker [(z_tls_ldcall tglobaltlsaddr:$I2)]>; 417*9880d681SAndroid Build Coastguard Worker} 418*9880d681SAndroid Build Coastguard Worker 419*9880d681SAndroid Build Coastguard Worker// Define the general form of the call instructions for the asm parser. 420*9880d681SAndroid Build Coastguard Worker// These instructions don't hard-code %r14 as the return address register. 421*9880d681SAndroid Build Coastguard Worker// Allow an optional TLS marker symbol to generate TLS call relocations. 422*9880d681SAndroid Build Coastguard Workerlet isCall = 1, Defs = [CC] in { 423*9880d681SAndroid Build Coastguard Worker def BRAS : InstRI<0xA75, (outs), (ins GR64:$R1, brtarget16tls:$I2), 424*9880d681SAndroid Build Coastguard Worker "bras\t$R1, $I2", []>; 425*9880d681SAndroid Build Coastguard Worker def BRASL : InstRIL<0xC05, (outs), (ins GR64:$R1, brtarget32tls:$I2), 426*9880d681SAndroid Build Coastguard Worker "brasl\t$R1, $I2", []>; 427*9880d681SAndroid Build Coastguard Worker def BASR : InstRR<0x0D, (outs), (ins GR64:$R1, ADDR64:$R2), 428*9880d681SAndroid Build Coastguard Worker "basr\t$R1, $R2", []>; 429*9880d681SAndroid Build Coastguard Worker} 430*9880d681SAndroid Build Coastguard Worker 431*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 432*9880d681SAndroid Build Coastguard Worker// Move instructions 433*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 434*9880d681SAndroid Build Coastguard Worker 435*9880d681SAndroid Build Coastguard Worker// Register moves. 436*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 437*9880d681SAndroid Build Coastguard Worker // Expands to LR, RISBHG or RISBLG, depending on the choice of registers. 438*9880d681SAndroid Build Coastguard Worker def LRMux : UnaryRRPseudo<"l", null_frag, GRX32, GRX32>, 439*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 440*9880d681SAndroid Build Coastguard Worker def LR : UnaryRR <"l", 0x18, null_frag, GR32, GR32>; 441*9880d681SAndroid Build Coastguard Worker def LGR : UnaryRRE<"lg", 0xB904, null_frag, GR64, GR64>; 442*9880d681SAndroid Build Coastguard Worker} 443*9880d681SAndroid Build Coastguard Workerlet Defs = [CC], CCValues = 0xE, CompareZeroCCMask = 0xE in { 444*9880d681SAndroid Build Coastguard Worker def LTR : UnaryRR <"lt", 0x12, null_frag, GR32, GR32>; 445*9880d681SAndroid Build Coastguard Worker def LTGR : UnaryRRE<"ltg", 0xB902, null_frag, GR64, GR64>; 446*9880d681SAndroid Build Coastguard Worker} 447*9880d681SAndroid Build Coastguard Worker 448*9880d681SAndroid Build Coastguard Worker// Move on condition. 449*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, Uses = [CC] in { 450*9880d681SAndroid Build Coastguard Worker def LOCR : CondUnaryRRF<"loc", 0xB9F2, GR32, GR32>; 451*9880d681SAndroid Build Coastguard Worker def LOCGR : CondUnaryRRF<"locg", 0xB9E2, GR64, GR64>; 452*9880d681SAndroid Build Coastguard Worker} 453*9880d681SAndroid Build Coastguard Workerlet Uses = [CC] in { 454*9880d681SAndroid Build Coastguard Worker def AsmLOCR : AsmCondUnaryRRF<"loc", 0xB9F2, GR32, GR32>; 455*9880d681SAndroid Build Coastguard Worker def AsmLOCGR : AsmCondUnaryRRF<"locg", 0xB9E2, GR64, GR64>; 456*9880d681SAndroid Build Coastguard Worker} 457*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, Uses = [CC] in { 458*9880d681SAndroid Build Coastguard Worker def LOCHI : CondUnaryRIE<"lochi", 0xEC42, GR32, imm32sx16>; 459*9880d681SAndroid Build Coastguard Worker def LOCGHI : CondUnaryRIE<"locghi", 0xEC46, GR64, imm64sx16>; 460*9880d681SAndroid Build Coastguard Worker} 461*9880d681SAndroid Build Coastguard Workerlet Uses = [CC] in { 462*9880d681SAndroid Build Coastguard Worker def AsmLOCHI : AsmCondUnaryRIE<"lochi", 0xEC42, GR32, imm32sx16>; 463*9880d681SAndroid Build Coastguard Worker def AsmLOCGHI : AsmCondUnaryRIE<"locghi", 0xEC46, GR64, imm64sx16>; 464*9880d681SAndroid Build Coastguard Worker} 465*9880d681SAndroid Build Coastguard Worker 466*9880d681SAndroid Build Coastguard Worker// Immediate moves. 467*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, isAsCheapAsAMove = 1, isMoveImm = 1, 468*9880d681SAndroid Build Coastguard Worker isReMaterializable = 1 in { 469*9880d681SAndroid Build Coastguard Worker // 16-bit sign-extended immediates. LHIMux expands to LHI or IIHF, 470*9880d681SAndroid Build Coastguard Worker // deopending on the choice of register. 471*9880d681SAndroid Build Coastguard Worker def LHIMux : UnaryRIPseudo<bitconvert, GRX32, imm32sx16>, 472*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 473*9880d681SAndroid Build Coastguard Worker def LHI : UnaryRI<"lhi", 0xA78, bitconvert, GR32, imm32sx16>; 474*9880d681SAndroid Build Coastguard Worker def LGHI : UnaryRI<"lghi", 0xA79, bitconvert, GR64, imm64sx16>; 475*9880d681SAndroid Build Coastguard Worker 476*9880d681SAndroid Build Coastguard Worker // Other 16-bit immediates. 477*9880d681SAndroid Build Coastguard Worker def LLILL : UnaryRI<"llill", 0xA5F, bitconvert, GR64, imm64ll16>; 478*9880d681SAndroid Build Coastguard Worker def LLILH : UnaryRI<"llilh", 0xA5E, bitconvert, GR64, imm64lh16>; 479*9880d681SAndroid Build Coastguard Worker def LLIHL : UnaryRI<"llihl", 0xA5D, bitconvert, GR64, imm64hl16>; 480*9880d681SAndroid Build Coastguard Worker def LLIHH : UnaryRI<"llihh", 0xA5C, bitconvert, GR64, imm64hh16>; 481*9880d681SAndroid Build Coastguard Worker 482*9880d681SAndroid Build Coastguard Worker // 32-bit immediates. 483*9880d681SAndroid Build Coastguard Worker def LGFI : UnaryRIL<"lgfi", 0xC01, bitconvert, GR64, imm64sx32>; 484*9880d681SAndroid Build Coastguard Worker def LLILF : UnaryRIL<"llilf", 0xC0F, bitconvert, GR64, imm64lf32>; 485*9880d681SAndroid Build Coastguard Worker def LLIHF : UnaryRIL<"llihf", 0xC0E, bitconvert, GR64, imm64hf32>; 486*9880d681SAndroid Build Coastguard Worker} 487*9880d681SAndroid Build Coastguard Worker 488*9880d681SAndroid Build Coastguard Worker// Register loads. 489*9880d681SAndroid Build Coastguard Workerlet canFoldAsLoad = 1, SimpleBDXLoad = 1 in { 490*9880d681SAndroid Build Coastguard Worker // Expands to L, LY or LFH, depending on the choice of register. 491*9880d681SAndroid Build Coastguard Worker def LMux : UnaryRXYPseudo<"l", load, GRX32, 4>, 492*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 493*9880d681SAndroid Build Coastguard Worker defm L : UnaryRXPair<"l", 0x58, 0xE358, load, GR32, 4>; 494*9880d681SAndroid Build Coastguard Worker def LFH : UnaryRXY<"lfh", 0xE3CA, load, GRH32, 4>, 495*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 496*9880d681SAndroid Build Coastguard Worker def LG : UnaryRXY<"lg", 0xE304, load, GR64, 8>; 497*9880d681SAndroid Build Coastguard Worker 498*9880d681SAndroid Build Coastguard Worker // These instructions are split after register allocation, so we don't 499*9880d681SAndroid Build Coastguard Worker // want a custom inserter. 500*9880d681SAndroid Build Coastguard Worker let Has20BitOffset = 1, HasIndex = 1, Is128Bit = 1 in { 501*9880d681SAndroid Build Coastguard Worker def L128 : Pseudo<(outs GR128:$dst), (ins bdxaddr20only128:$src), 502*9880d681SAndroid Build Coastguard Worker [(set GR128:$dst, (load bdxaddr20only128:$src))]>; 503*9880d681SAndroid Build Coastguard Worker } 504*9880d681SAndroid Build Coastguard Worker} 505*9880d681SAndroid Build Coastguard Workerlet Defs = [CC], CCValues = 0xE, CompareZeroCCMask = 0xE in { 506*9880d681SAndroid Build Coastguard Worker def LT : UnaryRXY<"lt", 0xE312, load, GR32, 4>; 507*9880d681SAndroid Build Coastguard Worker def LTG : UnaryRXY<"ltg", 0xE302, load, GR64, 8>; 508*9880d681SAndroid Build Coastguard Worker} 509*9880d681SAndroid Build Coastguard Worker 510*9880d681SAndroid Build Coastguard Workerlet canFoldAsLoad = 1 in { 511*9880d681SAndroid Build Coastguard Worker def LRL : UnaryRILPC<"lrl", 0xC4D, aligned_load, GR32>; 512*9880d681SAndroid Build Coastguard Worker def LGRL : UnaryRILPC<"lgrl", 0xC48, aligned_load, GR64>; 513*9880d681SAndroid Build Coastguard Worker} 514*9880d681SAndroid Build Coastguard Worker 515*9880d681SAndroid Build Coastguard Worker// Load on condition. 516*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, Uses = [CC] in { 517*9880d681SAndroid Build Coastguard Worker def LOC : CondUnaryRSY<"loc", 0xEBF2, nonvolatile_load, GR32, 4>; 518*9880d681SAndroid Build Coastguard Worker def LOCG : CondUnaryRSY<"locg", 0xEBE2, nonvolatile_load, GR64, 8>; 519*9880d681SAndroid Build Coastguard Worker} 520*9880d681SAndroid Build Coastguard Workerlet Uses = [CC] in { 521*9880d681SAndroid Build Coastguard Worker def AsmLOC : AsmCondUnaryRSY<"loc", 0xEBF2, GR32, 4>; 522*9880d681SAndroid Build Coastguard Worker def AsmLOCG : AsmCondUnaryRSY<"locg", 0xEBE2, GR64, 8>; 523*9880d681SAndroid Build Coastguard Worker} 524*9880d681SAndroid Build Coastguard Worker 525*9880d681SAndroid Build Coastguard Worker// Register stores. 526*9880d681SAndroid Build Coastguard Workerlet SimpleBDXStore = 1 in { 527*9880d681SAndroid Build Coastguard Worker // Expands to ST, STY or STFH, depending on the choice of register. 528*9880d681SAndroid Build Coastguard Worker def STMux : StoreRXYPseudo<store, GRX32, 4>, 529*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 530*9880d681SAndroid Build Coastguard Worker defm ST : StoreRXPair<"st", 0x50, 0xE350, store, GR32, 4>; 531*9880d681SAndroid Build Coastguard Worker def STFH : StoreRXY<"stfh", 0xE3CB, store, GRH32, 4>, 532*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 533*9880d681SAndroid Build Coastguard Worker def STG : StoreRXY<"stg", 0xE324, store, GR64, 8>; 534*9880d681SAndroid Build Coastguard Worker 535*9880d681SAndroid Build Coastguard Worker // These instructions are split after register allocation, so we don't 536*9880d681SAndroid Build Coastguard Worker // want a custom inserter. 537*9880d681SAndroid Build Coastguard Worker let Has20BitOffset = 1, HasIndex = 1, Is128Bit = 1 in { 538*9880d681SAndroid Build Coastguard Worker def ST128 : Pseudo<(outs), (ins GR128:$src, bdxaddr20only128:$dst), 539*9880d681SAndroid Build Coastguard Worker [(store GR128:$src, bdxaddr20only128:$dst)]>; 540*9880d681SAndroid Build Coastguard Worker } 541*9880d681SAndroid Build Coastguard Worker} 542*9880d681SAndroid Build Coastguard Workerdef STRL : StoreRILPC<"strl", 0xC4F, aligned_store, GR32>; 543*9880d681SAndroid Build Coastguard Workerdef STGRL : StoreRILPC<"stgrl", 0xC4B, aligned_store, GR64>; 544*9880d681SAndroid Build Coastguard Worker 545*9880d681SAndroid Build Coastguard Worker// Store on condition. 546*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, Uses = [CC] in { 547*9880d681SAndroid Build Coastguard Worker def STOC : CondStoreRSY<"stoc", 0xEBF3, GR32, 4>; 548*9880d681SAndroid Build Coastguard Worker def STOCG : CondStoreRSY<"stocg", 0xEBE3, GR64, 8>; 549*9880d681SAndroid Build Coastguard Worker} 550*9880d681SAndroid Build Coastguard Workerlet Uses = [CC] in { 551*9880d681SAndroid Build Coastguard Worker def AsmSTOC : AsmCondStoreRSY<"stoc", 0xEBF3, GR32, 4>; 552*9880d681SAndroid Build Coastguard Worker def AsmSTOCG : AsmCondStoreRSY<"stocg", 0xEBE3, GR64, 8>; 553*9880d681SAndroid Build Coastguard Worker} 554*9880d681SAndroid Build Coastguard Worker 555*9880d681SAndroid Build Coastguard Worker// 8-bit immediate stores to 8-bit fields. 556*9880d681SAndroid Build Coastguard Workerdefm MVI : StoreSIPair<"mvi", 0x92, 0xEB52, truncstorei8, imm32zx8trunc>; 557*9880d681SAndroid Build Coastguard Worker 558*9880d681SAndroid Build Coastguard Worker// 16-bit immediate stores to 16-, 32- or 64-bit fields. 559*9880d681SAndroid Build Coastguard Workerdef MVHHI : StoreSIL<"mvhhi", 0xE544, truncstorei16, imm32sx16trunc>; 560*9880d681SAndroid Build Coastguard Workerdef MVHI : StoreSIL<"mvhi", 0xE54C, store, imm32sx16>; 561*9880d681SAndroid Build Coastguard Workerdef MVGHI : StoreSIL<"mvghi", 0xE548, store, imm64sx16>; 562*9880d681SAndroid Build Coastguard Worker 563*9880d681SAndroid Build Coastguard Worker// Memory-to-memory moves. 564*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, mayStore = 1 in 565*9880d681SAndroid Build Coastguard Worker defm MVC : MemorySS<"mvc", 0xD2, z_mvc, z_mvc_loop>; 566*9880d681SAndroid Build Coastguard Worker 567*9880d681SAndroid Build Coastguard Worker// String moves. 568*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, mayStore = 1, Defs = [CC] in 569*9880d681SAndroid Build Coastguard Worker defm MVST : StringRRE<"mvst", 0xB255, z_stpcpy>; 570*9880d681SAndroid Build Coastguard Worker 571*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 572*9880d681SAndroid Build Coastguard Worker// Sign extensions 573*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 574*9880d681SAndroid Build Coastguard Worker// 575*9880d681SAndroid Build Coastguard Worker// Note that putting these before zero extensions mean that we will prefer 576*9880d681SAndroid Build Coastguard Worker// them for anyextload*. There's not really much to choose between the two 577*9880d681SAndroid Build Coastguard Worker// either way, but signed-extending loads have a short LH and a long LHY, 578*9880d681SAndroid Build Coastguard Worker// while zero-extending loads have only the long LLH. 579*9880d681SAndroid Build Coastguard Worker// 580*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 581*9880d681SAndroid Build Coastguard Worker 582*9880d681SAndroid Build Coastguard Worker// 32-bit extensions from registers. 583*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 584*9880d681SAndroid Build Coastguard Worker def LBR : UnaryRRE<"lb", 0xB926, sext8, GR32, GR32>; 585*9880d681SAndroid Build Coastguard Worker def LHR : UnaryRRE<"lh", 0xB927, sext16, GR32, GR32>; 586*9880d681SAndroid Build Coastguard Worker} 587*9880d681SAndroid Build Coastguard Worker 588*9880d681SAndroid Build Coastguard Worker// 64-bit extensions from registers. 589*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 590*9880d681SAndroid Build Coastguard Worker def LGBR : UnaryRRE<"lgb", 0xB906, sext8, GR64, GR64>; 591*9880d681SAndroid Build Coastguard Worker def LGHR : UnaryRRE<"lgh", 0xB907, sext16, GR64, GR64>; 592*9880d681SAndroid Build Coastguard Worker def LGFR : UnaryRRE<"lgf", 0xB914, sext32, GR64, GR32>; 593*9880d681SAndroid Build Coastguard Worker} 594*9880d681SAndroid Build Coastguard Workerlet Defs = [CC], CCValues = 0xE, CompareZeroCCMask = 0xE in 595*9880d681SAndroid Build Coastguard Worker def LTGFR : UnaryRRE<"ltgf", 0xB912, null_frag, GR64, GR32>; 596*9880d681SAndroid Build Coastguard Worker 597*9880d681SAndroid Build Coastguard Worker// Match 32-to-64-bit sign extensions in which the source is already 598*9880d681SAndroid Build Coastguard Worker// in a 64-bit register. 599*9880d681SAndroid Build Coastguard Workerdef : Pat<(sext_inreg GR64:$src, i32), 600*9880d681SAndroid Build Coastguard Worker (LGFR (EXTRACT_SUBREG GR64:$src, subreg_l32))>; 601*9880d681SAndroid Build Coastguard Worker 602*9880d681SAndroid Build Coastguard Worker// 32-bit extensions from 8-bit memory. LBMux expands to LB or LBH, 603*9880d681SAndroid Build Coastguard Worker// depending on the choice of register. 604*9880d681SAndroid Build Coastguard Workerdef LBMux : UnaryRXYPseudo<"lb", asextloadi8, GRX32, 1>, 605*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 606*9880d681SAndroid Build Coastguard Workerdef LB : UnaryRXY<"lb", 0xE376, asextloadi8, GR32, 1>; 607*9880d681SAndroid Build Coastguard Workerdef LBH : UnaryRXY<"lbh", 0xE3C0, asextloadi8, GRH32, 1>, 608*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 609*9880d681SAndroid Build Coastguard Worker 610*9880d681SAndroid Build Coastguard Worker// 32-bit extensions from 16-bit memory. LHMux expands to LH or LHH, 611*9880d681SAndroid Build Coastguard Worker// depending on the choice of register. 612*9880d681SAndroid Build Coastguard Workerdef LHMux : UnaryRXYPseudo<"lh", asextloadi16, GRX32, 2>, 613*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 614*9880d681SAndroid Build Coastguard Workerdefm LH : UnaryRXPair<"lh", 0x48, 0xE378, asextloadi16, GR32, 2>; 615*9880d681SAndroid Build Coastguard Workerdef LHH : UnaryRXY<"lhh", 0xE3C4, asextloadi16, GRH32, 2>, 616*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 617*9880d681SAndroid Build Coastguard Workerdef LHRL : UnaryRILPC<"lhrl", 0xC45, aligned_asextloadi16, GR32>; 618*9880d681SAndroid Build Coastguard Worker 619*9880d681SAndroid Build Coastguard Worker// 64-bit extensions from memory. 620*9880d681SAndroid Build Coastguard Workerdef LGB : UnaryRXY<"lgb", 0xE377, asextloadi8, GR64, 1>; 621*9880d681SAndroid Build Coastguard Workerdef LGH : UnaryRXY<"lgh", 0xE315, asextloadi16, GR64, 2>; 622*9880d681SAndroid Build Coastguard Workerdef LGF : UnaryRXY<"lgf", 0xE314, asextloadi32, GR64, 4>; 623*9880d681SAndroid Build Coastguard Workerdef LGHRL : UnaryRILPC<"lghrl", 0xC44, aligned_asextloadi16, GR64>; 624*9880d681SAndroid Build Coastguard Workerdef LGFRL : UnaryRILPC<"lgfrl", 0xC4C, aligned_asextloadi32, GR64>; 625*9880d681SAndroid Build Coastguard Workerlet Defs = [CC], CCValues = 0xE, CompareZeroCCMask = 0xE in 626*9880d681SAndroid Build Coastguard Worker def LTGF : UnaryRXY<"ltgf", 0xE332, asextloadi32, GR64, 4>; 627*9880d681SAndroid Build Coastguard Worker 628*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 629*9880d681SAndroid Build Coastguard Worker// Zero extensions 630*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 631*9880d681SAndroid Build Coastguard Worker 632*9880d681SAndroid Build Coastguard Worker// 32-bit extensions from registers. 633*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 634*9880d681SAndroid Build Coastguard Worker // Expands to LLCR or RISB[LH]G, depending on the choice of registers. 635*9880d681SAndroid Build Coastguard Worker def LLCRMux : UnaryRRPseudo<"llc", zext8, GRX32, GRX32>, 636*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 637*9880d681SAndroid Build Coastguard Worker def LLCR : UnaryRRE<"llc", 0xB994, zext8, GR32, GR32>; 638*9880d681SAndroid Build Coastguard Worker // Expands to LLHR or RISB[LH]G, depending on the choice of registers. 639*9880d681SAndroid Build Coastguard Worker def LLHRMux : UnaryRRPseudo<"llh", zext16, GRX32, GRX32>, 640*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 641*9880d681SAndroid Build Coastguard Worker def LLHR : UnaryRRE<"llh", 0xB995, zext16, GR32, GR32>; 642*9880d681SAndroid Build Coastguard Worker} 643*9880d681SAndroid Build Coastguard Worker 644*9880d681SAndroid Build Coastguard Worker// 64-bit extensions from registers. 645*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 646*9880d681SAndroid Build Coastguard Worker def LLGCR : UnaryRRE<"llgc", 0xB984, zext8, GR64, GR64>; 647*9880d681SAndroid Build Coastguard Worker def LLGHR : UnaryRRE<"llgh", 0xB985, zext16, GR64, GR64>; 648*9880d681SAndroid Build Coastguard Worker def LLGFR : UnaryRRE<"llgf", 0xB916, zext32, GR64, GR32>; 649*9880d681SAndroid Build Coastguard Worker} 650*9880d681SAndroid Build Coastguard Worker 651*9880d681SAndroid Build Coastguard Worker// Match 32-to-64-bit zero extensions in which the source is already 652*9880d681SAndroid Build Coastguard Worker// in a 64-bit register. 653*9880d681SAndroid Build Coastguard Workerdef : Pat<(and GR64:$src, 0xffffffff), 654*9880d681SAndroid Build Coastguard Worker (LLGFR (EXTRACT_SUBREG GR64:$src, subreg_l32))>; 655*9880d681SAndroid Build Coastguard Worker 656*9880d681SAndroid Build Coastguard Worker// 32-bit extensions from 8-bit memory. LLCMux expands to LLC or LLCH, 657*9880d681SAndroid Build Coastguard Worker// depending on the choice of register. 658*9880d681SAndroid Build Coastguard Workerdef LLCMux : UnaryRXYPseudo<"llc", azextloadi8, GRX32, 1>, 659*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 660*9880d681SAndroid Build Coastguard Workerdef LLC : UnaryRXY<"llc", 0xE394, azextloadi8, GR32, 1>; 661*9880d681SAndroid Build Coastguard Workerdef LLCH : UnaryRXY<"llch", 0xE3C2, azextloadi8, GRH32, 1>, 662*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 663*9880d681SAndroid Build Coastguard Worker 664*9880d681SAndroid Build Coastguard Worker// 32-bit extensions from 16-bit memory. LLHMux expands to LLH or LLHH, 665*9880d681SAndroid Build Coastguard Worker// depending on the choice of register. 666*9880d681SAndroid Build Coastguard Workerdef LLHMux : UnaryRXYPseudo<"llh", azextloadi16, GRX32, 2>, 667*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 668*9880d681SAndroid Build Coastguard Workerdef LLH : UnaryRXY<"llh", 0xE395, azextloadi16, GR32, 2>; 669*9880d681SAndroid Build Coastguard Workerdef LLHH : UnaryRXY<"llhh", 0xE3C6, azextloadi16, GRH32, 2>, 670*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 671*9880d681SAndroid Build Coastguard Workerdef LLHRL : UnaryRILPC<"llhrl", 0xC42, aligned_azextloadi16, GR32>; 672*9880d681SAndroid Build Coastguard Worker 673*9880d681SAndroid Build Coastguard Worker// 64-bit extensions from memory. 674*9880d681SAndroid Build Coastguard Workerdef LLGC : UnaryRXY<"llgc", 0xE390, azextloadi8, GR64, 1>; 675*9880d681SAndroid Build Coastguard Workerdef LLGH : UnaryRXY<"llgh", 0xE391, azextloadi16, GR64, 2>; 676*9880d681SAndroid Build Coastguard Workerdef LLGF : UnaryRXY<"llgf", 0xE316, azextloadi32, GR64, 4>; 677*9880d681SAndroid Build Coastguard Workerdef LLGHRL : UnaryRILPC<"llghrl", 0xC46, aligned_azextloadi16, GR64>; 678*9880d681SAndroid Build Coastguard Workerdef LLGFRL : UnaryRILPC<"llgfrl", 0xC4E, aligned_azextloadi32, GR64>; 679*9880d681SAndroid Build Coastguard Worker 680*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 681*9880d681SAndroid Build Coastguard Worker// Truncations 682*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 683*9880d681SAndroid Build Coastguard Worker 684*9880d681SAndroid Build Coastguard Worker// Truncations of 64-bit registers to 32-bit registers. 685*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (trunc GR64:$src)), 686*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG GR64:$src, subreg_l32)>; 687*9880d681SAndroid Build Coastguard Worker 688*9880d681SAndroid Build Coastguard Worker// Truncations of 32-bit registers to 8-bit memory. STCMux expands to 689*9880d681SAndroid Build Coastguard Worker// STC, STCY or STCH, depending on the choice of register. 690*9880d681SAndroid Build Coastguard Workerdef STCMux : StoreRXYPseudo<truncstorei8, GRX32, 1>, 691*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 692*9880d681SAndroid Build Coastguard Workerdefm STC : StoreRXPair<"stc", 0x42, 0xE372, truncstorei8, GR32, 1>; 693*9880d681SAndroid Build Coastguard Workerdef STCH : StoreRXY<"stch", 0xE3C3, truncstorei8, GRH32, 1>, 694*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 695*9880d681SAndroid Build Coastguard Worker 696*9880d681SAndroid Build Coastguard Worker// Truncations of 32-bit registers to 16-bit memory. STHMux expands to 697*9880d681SAndroid Build Coastguard Worker// STH, STHY or STHH, depending on the choice of register. 698*9880d681SAndroid Build Coastguard Workerdef STHMux : StoreRXYPseudo<truncstorei16, GRX32, 1>, 699*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 700*9880d681SAndroid Build Coastguard Workerdefm STH : StoreRXPair<"sth", 0x40, 0xE370, truncstorei16, GR32, 2>; 701*9880d681SAndroid Build Coastguard Workerdef STHH : StoreRXY<"sthh", 0xE3C7, truncstorei16, GRH32, 2>, 702*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 703*9880d681SAndroid Build Coastguard Workerdef STHRL : StoreRILPC<"sthrl", 0xC47, aligned_truncstorei16, GR32>; 704*9880d681SAndroid Build Coastguard Worker 705*9880d681SAndroid Build Coastguard Worker// Truncations of 64-bit registers to memory. 706*9880d681SAndroid Build Coastguard Workerdefm : StoreGR64Pair<STC, STCY, truncstorei8>; 707*9880d681SAndroid Build Coastguard Workerdefm : StoreGR64Pair<STH, STHY, truncstorei16>; 708*9880d681SAndroid Build Coastguard Workerdef : StoreGR64PC<STHRL, aligned_truncstorei16>; 709*9880d681SAndroid Build Coastguard Workerdefm : StoreGR64Pair<ST, STY, truncstorei32>; 710*9880d681SAndroid Build Coastguard Workerdef : StoreGR64PC<STRL, aligned_truncstorei32>; 711*9880d681SAndroid Build Coastguard Worker 712*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 713*9880d681SAndroid Build Coastguard Worker// Multi-register moves 714*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 715*9880d681SAndroid Build Coastguard Worker 716*9880d681SAndroid Build Coastguard Worker// Multi-register loads. 717*9880d681SAndroid Build Coastguard Workerdefm LM : LoadMultipleRSPair<"lm", 0x98, 0xEB98, GR32>; 718*9880d681SAndroid Build Coastguard Workerdef LMG : LoadMultipleRSY<"lmg", 0xEB04, GR64>; 719*9880d681SAndroid Build Coastguard Workerdef LMH : LoadMultipleRSY<"lmh", 0xEB96, GRH32>; 720*9880d681SAndroid Build Coastguard Worker 721*9880d681SAndroid Build Coastguard Worker// Multi-register stores. 722*9880d681SAndroid Build Coastguard Workerdefm STM : StoreMultipleRSPair<"stm", 0x90, 0xEB90, GR32>; 723*9880d681SAndroid Build Coastguard Workerdef STMG : StoreMultipleRSY<"stmg", 0xEB24, GR64>; 724*9880d681SAndroid Build Coastguard Workerdef STMH : StoreMultipleRSY<"stmh", 0xEB26, GRH32>; 725*9880d681SAndroid Build Coastguard Worker 726*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 727*9880d681SAndroid Build Coastguard Worker// Byte swaps 728*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 729*9880d681SAndroid Build Coastguard Worker 730*9880d681SAndroid Build Coastguard Worker// Byte-swapping register moves. 731*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 732*9880d681SAndroid Build Coastguard Worker def LRVR : UnaryRRE<"lrv", 0xB91F, bswap, GR32, GR32>; 733*9880d681SAndroid Build Coastguard Worker def LRVGR : UnaryRRE<"lrvg", 0xB90F, bswap, GR64, GR64>; 734*9880d681SAndroid Build Coastguard Worker} 735*9880d681SAndroid Build Coastguard Worker 736*9880d681SAndroid Build Coastguard Worker// Byte-swapping loads. Unlike normal loads, these instructions are 737*9880d681SAndroid Build Coastguard Worker// allowed to access storage more than once. 738*9880d681SAndroid Build Coastguard Workerdef LRVH : UnaryRXY<"lrvh", 0xE31F, z_lrvh, GR32, 2>; 739*9880d681SAndroid Build Coastguard Workerdef LRV : UnaryRXY<"lrv", 0xE31E, z_lrv, GR32, 4>; 740*9880d681SAndroid Build Coastguard Workerdef LRVG : UnaryRXY<"lrvg", 0xE30F, z_lrvg, GR64, 8>; 741*9880d681SAndroid Build Coastguard Worker 742*9880d681SAndroid Build Coastguard Worker// Likewise byte-swapping stores. 743*9880d681SAndroid Build Coastguard Workerdef STRVH : StoreRXY<"strvh", 0xE33F, z_strvh, GR32, 2>; 744*9880d681SAndroid Build Coastguard Workerdef STRV : StoreRXY<"strv", 0xE33E, z_strv, GR32, 4>; 745*9880d681SAndroid Build Coastguard Workerdef STRVG : StoreRXY<"strvg", 0xE32F, z_strvg, GR64, 8>; 746*9880d681SAndroid Build Coastguard Worker 747*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 748*9880d681SAndroid Build Coastguard Worker// Load address instructions 749*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 750*9880d681SAndroid Build Coastguard Worker 751*9880d681SAndroid Build Coastguard Worker// Load BDX-style addresses. 752*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, isAsCheapAsAMove = 1, isReMaterializable = 1, 753*9880d681SAndroid Build Coastguard Worker DispKey = "la" in { 754*9880d681SAndroid Build Coastguard Worker let DispSize = "12" in 755*9880d681SAndroid Build Coastguard Worker def LA : InstRX<0x41, (outs GR64:$R1), (ins laaddr12pair:$XBD2), 756*9880d681SAndroid Build Coastguard Worker "la\t$R1, $XBD2", 757*9880d681SAndroid Build Coastguard Worker [(set GR64:$R1, laaddr12pair:$XBD2)]>; 758*9880d681SAndroid Build Coastguard Worker let DispSize = "20" in 759*9880d681SAndroid Build Coastguard Worker def LAY : InstRXY<0xE371, (outs GR64:$R1), (ins laaddr20pair:$XBD2), 760*9880d681SAndroid Build Coastguard Worker "lay\t$R1, $XBD2", 761*9880d681SAndroid Build Coastguard Worker [(set GR64:$R1, laaddr20pair:$XBD2)]>; 762*9880d681SAndroid Build Coastguard Worker} 763*9880d681SAndroid Build Coastguard Worker 764*9880d681SAndroid Build Coastguard Worker// Load a PC-relative address. There's no version of this instruction 765*9880d681SAndroid Build Coastguard Worker// with a 16-bit offset, so there's no relaxation. 766*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, isAsCheapAsAMove = 1, isMoveImm = 1, 767*9880d681SAndroid Build Coastguard Worker isReMaterializable = 1 in { 768*9880d681SAndroid Build Coastguard Worker def LARL : InstRIL<0xC00, (outs GR64:$R1), (ins pcrel32:$I2), 769*9880d681SAndroid Build Coastguard Worker "larl\t$R1, $I2", 770*9880d681SAndroid Build Coastguard Worker [(set GR64:$R1, pcrel32:$I2)]>; 771*9880d681SAndroid Build Coastguard Worker} 772*9880d681SAndroid Build Coastguard Worker 773*9880d681SAndroid Build Coastguard Worker// Load the Global Offset Table address. This will be lowered into a 774*9880d681SAndroid Build Coastguard Worker// larl $R1, _GLOBAL_OFFSET_TABLE_ 775*9880d681SAndroid Build Coastguard Worker// instruction. 776*9880d681SAndroid Build Coastguard Workerdef GOT : Alias<6, (outs GR64:$R1), (ins), 777*9880d681SAndroid Build Coastguard Worker [(set GR64:$R1, (global_offset_table))]>; 778*9880d681SAndroid Build Coastguard Worker 779*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 780*9880d681SAndroid Build Coastguard Worker// Absolute and Negation 781*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 782*9880d681SAndroid Build Coastguard Worker 783*9880d681SAndroid Build Coastguard Workerlet Defs = [CC] in { 784*9880d681SAndroid Build Coastguard Worker let CCValues = 0xF, CompareZeroCCMask = 0x8 in { 785*9880d681SAndroid Build Coastguard Worker def LPR : UnaryRR <"lp", 0x10, z_iabs, GR32, GR32>; 786*9880d681SAndroid Build Coastguard Worker def LPGR : UnaryRRE<"lpg", 0xB900, z_iabs, GR64, GR64>; 787*9880d681SAndroid Build Coastguard Worker } 788*9880d681SAndroid Build Coastguard Worker let CCValues = 0xE, CompareZeroCCMask = 0xE in 789*9880d681SAndroid Build Coastguard Worker def LPGFR : UnaryRRE<"lpgf", 0xB910, null_frag, GR64, GR32>; 790*9880d681SAndroid Build Coastguard Worker} 791*9880d681SAndroid Build Coastguard Workerdef : Pat<(z_iabs32 GR32:$src), (LPR GR32:$src)>; 792*9880d681SAndroid Build Coastguard Workerdef : Pat<(z_iabs64 GR64:$src), (LPGR GR64:$src)>; 793*9880d681SAndroid Build Coastguard Workerdefm : SXU<z_iabs, LPGFR>; 794*9880d681SAndroid Build Coastguard Workerdefm : SXU<z_iabs64, LPGFR>; 795*9880d681SAndroid Build Coastguard Worker 796*9880d681SAndroid Build Coastguard Workerlet Defs = [CC] in { 797*9880d681SAndroid Build Coastguard Worker let CCValues = 0xF, CompareZeroCCMask = 0x8 in { 798*9880d681SAndroid Build Coastguard Worker def LNR : UnaryRR <"ln", 0x11, z_inegabs, GR32, GR32>; 799*9880d681SAndroid Build Coastguard Worker def LNGR : UnaryRRE<"lng", 0xB901, z_inegabs, GR64, GR64>; 800*9880d681SAndroid Build Coastguard Worker } 801*9880d681SAndroid Build Coastguard Worker let CCValues = 0xE, CompareZeroCCMask = 0xE in 802*9880d681SAndroid Build Coastguard Worker def LNGFR : UnaryRRE<"lngf", 0xB911, null_frag, GR64, GR32>; 803*9880d681SAndroid Build Coastguard Worker} 804*9880d681SAndroid Build Coastguard Workerdef : Pat<(z_inegabs32 GR32:$src), (LNR GR32:$src)>; 805*9880d681SAndroid Build Coastguard Workerdef : Pat<(z_inegabs64 GR64:$src), (LNGR GR64:$src)>; 806*9880d681SAndroid Build Coastguard Workerdefm : SXU<z_inegabs, LNGFR>; 807*9880d681SAndroid Build Coastguard Workerdefm : SXU<z_inegabs64, LNGFR>; 808*9880d681SAndroid Build Coastguard Worker 809*9880d681SAndroid Build Coastguard Workerlet Defs = [CC] in { 810*9880d681SAndroid Build Coastguard Worker let CCValues = 0xF, CompareZeroCCMask = 0x8 in { 811*9880d681SAndroid Build Coastguard Worker def LCR : UnaryRR <"lc", 0x13, ineg, GR32, GR32>; 812*9880d681SAndroid Build Coastguard Worker def LCGR : UnaryRRE<"lcg", 0xB903, ineg, GR64, GR64>; 813*9880d681SAndroid Build Coastguard Worker } 814*9880d681SAndroid Build Coastguard Worker let CCValues = 0xE, CompareZeroCCMask = 0xE in 815*9880d681SAndroid Build Coastguard Worker def LCGFR : UnaryRRE<"lcgf", 0xB913, null_frag, GR64, GR32>; 816*9880d681SAndroid Build Coastguard Worker} 817*9880d681SAndroid Build Coastguard Workerdefm : SXU<ineg, LCGFR>; 818*9880d681SAndroid Build Coastguard Worker 819*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 820*9880d681SAndroid Build Coastguard Worker// Insertion 821*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 822*9880d681SAndroid Build Coastguard Worker 823*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in 824*9880d681SAndroid Build Coastguard Worker defm IC32 : BinaryRXPair<"ic", 0x43, 0xE373, inserti8, GR32, azextloadi8, 1>; 825*9880d681SAndroid Build Coastguard Workerdefm IC : BinaryRXPair<"ic", 0x43, 0xE373, inserti8, GR64, azextloadi8, 1>; 826*9880d681SAndroid Build Coastguard Worker 827*9880d681SAndroid Build Coastguard Workerdefm : InsertMem<"inserti8", IC32, GR32, azextloadi8, bdxaddr12pair>; 828*9880d681SAndroid Build Coastguard Workerdefm : InsertMem<"inserti8", IC32Y, GR32, azextloadi8, bdxaddr20pair>; 829*9880d681SAndroid Build Coastguard Worker 830*9880d681SAndroid Build Coastguard Workerdefm : InsertMem<"inserti8", IC, GR64, azextloadi8, bdxaddr12pair>; 831*9880d681SAndroid Build Coastguard Workerdefm : InsertMem<"inserti8", ICY, GR64, azextloadi8, bdxaddr20pair>; 832*9880d681SAndroid Build Coastguard Worker 833*9880d681SAndroid Build Coastguard Workerlet Defs = [CC] in { 834*9880d681SAndroid Build Coastguard Worker defm ICM : TernaryRSPair<"icm", 0xBF, 0xEB81, GR32, 0>; 835*9880d681SAndroid Build Coastguard Worker def ICMH : TernaryRSY<"icmh", 0xEB80, GRH32, 0>; 836*9880d681SAndroid Build Coastguard Worker} 837*9880d681SAndroid Build Coastguard Worker 838*9880d681SAndroid Build Coastguard Worker// Insertions of a 16-bit immediate, leaving other bits unaffected. 839*9880d681SAndroid Build Coastguard Worker// We don't have or_as_insert equivalents of these operations because 840*9880d681SAndroid Build Coastguard Worker// OI is available instead. 841*9880d681SAndroid Build Coastguard Worker// 842*9880d681SAndroid Build Coastguard Worker// IIxMux expands to II[LH]x, depending on the choice of register. 843*9880d681SAndroid Build Coastguard Workerdef IILMux : BinaryRIPseudo<insertll, GRX32, imm32ll16>, 844*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 845*9880d681SAndroid Build Coastguard Workerdef IIHMux : BinaryRIPseudo<insertlh, GRX32, imm32lh16>, 846*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 847*9880d681SAndroid Build Coastguard Workerdef IILL : BinaryRI<"iill", 0xA53, insertll, GR32, imm32ll16>; 848*9880d681SAndroid Build Coastguard Workerdef IILH : BinaryRI<"iilh", 0xA52, insertlh, GR32, imm32lh16>; 849*9880d681SAndroid Build Coastguard Workerdef IIHL : BinaryRI<"iihl", 0xA51, insertll, GRH32, imm32ll16>; 850*9880d681SAndroid Build Coastguard Workerdef IIHH : BinaryRI<"iihh", 0xA50, insertlh, GRH32, imm32lh16>; 851*9880d681SAndroid Build Coastguard Workerdef IILL64 : BinaryAliasRI<insertll, GR64, imm64ll16>; 852*9880d681SAndroid Build Coastguard Workerdef IILH64 : BinaryAliasRI<insertlh, GR64, imm64lh16>; 853*9880d681SAndroid Build Coastguard Workerdef IIHL64 : BinaryAliasRI<inserthl, GR64, imm64hl16>; 854*9880d681SAndroid Build Coastguard Workerdef IIHH64 : BinaryAliasRI<inserthh, GR64, imm64hh16>; 855*9880d681SAndroid Build Coastguard Worker 856*9880d681SAndroid Build Coastguard Worker// ...likewise for 32-bit immediates. For GR32s this is a general 857*9880d681SAndroid Build Coastguard Worker// full-width move. (We use IILF rather than something like LLILF 858*9880d681SAndroid Build Coastguard Worker// for 32-bit moves because IILF leaves the upper 32 bits of the 859*9880d681SAndroid Build Coastguard Worker// GR64 unchanged.) 860*9880d681SAndroid Build Coastguard Workerlet isAsCheapAsAMove = 1, isMoveImm = 1, isReMaterializable = 1 in { 861*9880d681SAndroid Build Coastguard Worker def IIFMux : UnaryRIPseudo<bitconvert, GRX32, uimm32>, 862*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 863*9880d681SAndroid Build Coastguard Worker def IILF : UnaryRIL<"iilf", 0xC09, bitconvert, GR32, uimm32>; 864*9880d681SAndroid Build Coastguard Worker def IIHF : UnaryRIL<"iihf", 0xC08, bitconvert, GRH32, uimm32>; 865*9880d681SAndroid Build Coastguard Worker} 866*9880d681SAndroid Build Coastguard Workerdef IILF64 : BinaryAliasRIL<insertlf, GR64, imm64lf32>; 867*9880d681SAndroid Build Coastguard Workerdef IIHF64 : BinaryAliasRIL<inserthf, GR64, imm64hf32>; 868*9880d681SAndroid Build Coastguard Worker 869*9880d681SAndroid Build Coastguard Worker// An alternative model of inserthf, with the first operand being 870*9880d681SAndroid Build Coastguard Worker// a zero-extended value. 871*9880d681SAndroid Build Coastguard Workerdef : Pat<(or (zext32 GR32:$src), imm64hf32:$imm), 872*9880d681SAndroid Build Coastguard Worker (IIHF64 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), GR32:$src, subreg_l32), 873*9880d681SAndroid Build Coastguard Worker imm64hf32:$imm)>; 874*9880d681SAndroid Build Coastguard Worker 875*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 876*9880d681SAndroid Build Coastguard Worker// Addition 877*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 878*9880d681SAndroid Build Coastguard Worker 879*9880d681SAndroid Build Coastguard Worker// Plain addition. 880*9880d681SAndroid Build Coastguard Workerlet Defs = [CC], CCValues = 0xF, CompareZeroCCMask = 0x8 in { 881*9880d681SAndroid Build Coastguard Worker // Addition of a register. 882*9880d681SAndroid Build Coastguard Worker let isCommutable = 1 in { 883*9880d681SAndroid Build Coastguard Worker defm AR : BinaryRRAndK<"a", 0x1A, 0xB9F8, add, GR32, GR32>; 884*9880d681SAndroid Build Coastguard Worker defm AGR : BinaryRREAndK<"ag", 0xB908, 0xB9E8, add, GR64, GR64>; 885*9880d681SAndroid Build Coastguard Worker } 886*9880d681SAndroid Build Coastguard Worker def AGFR : BinaryRRE<"agf", 0xB918, null_frag, GR64, GR32>; 887*9880d681SAndroid Build Coastguard Worker 888*9880d681SAndroid Build Coastguard Worker // Addition of signed 16-bit immediates. 889*9880d681SAndroid Build Coastguard Worker defm AHIMux : BinaryRIAndKPseudo<"ahimux", add, GRX32, imm32sx16>; 890*9880d681SAndroid Build Coastguard Worker defm AHI : BinaryRIAndK<"ahi", 0xA7A, 0xECD8, add, GR32, imm32sx16>; 891*9880d681SAndroid Build Coastguard Worker defm AGHI : BinaryRIAndK<"aghi", 0xA7B, 0xECD9, add, GR64, imm64sx16>; 892*9880d681SAndroid Build Coastguard Worker 893*9880d681SAndroid Build Coastguard Worker // Addition of signed 32-bit immediates. 894*9880d681SAndroid Build Coastguard Worker def AFIMux : BinaryRIPseudo<add, GRX32, simm32>, 895*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 896*9880d681SAndroid Build Coastguard Worker def AFI : BinaryRIL<"afi", 0xC29, add, GR32, simm32>; 897*9880d681SAndroid Build Coastguard Worker def AIH : BinaryRIL<"aih", 0xCC8, add, GRH32, simm32>, 898*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 899*9880d681SAndroid Build Coastguard Worker def AGFI : BinaryRIL<"agfi", 0xC28, add, GR64, imm64sx32>; 900*9880d681SAndroid Build Coastguard Worker 901*9880d681SAndroid Build Coastguard Worker // Addition of memory. 902*9880d681SAndroid Build Coastguard Worker defm AH : BinaryRXPair<"ah", 0x4A, 0xE37A, add, GR32, asextloadi16, 2>; 903*9880d681SAndroid Build Coastguard Worker defm A : BinaryRXPair<"a", 0x5A, 0xE35A, add, GR32, load, 4>; 904*9880d681SAndroid Build Coastguard Worker def AGF : BinaryRXY<"agf", 0xE318, add, GR64, asextloadi32, 4>; 905*9880d681SAndroid Build Coastguard Worker def AG : BinaryRXY<"ag", 0xE308, add, GR64, load, 8>; 906*9880d681SAndroid Build Coastguard Worker 907*9880d681SAndroid Build Coastguard Worker // Addition to memory. 908*9880d681SAndroid Build Coastguard Worker def ASI : BinarySIY<"asi", 0xEB6A, add, imm32sx8>; 909*9880d681SAndroid Build Coastguard Worker def AGSI : BinarySIY<"agsi", 0xEB7A, add, imm64sx8>; 910*9880d681SAndroid Build Coastguard Worker} 911*9880d681SAndroid Build Coastguard Workerdefm : SXB<add, GR64, AGFR>; 912*9880d681SAndroid Build Coastguard Worker 913*9880d681SAndroid Build Coastguard Worker// Addition producing a carry. 914*9880d681SAndroid Build Coastguard Workerlet Defs = [CC] in { 915*9880d681SAndroid Build Coastguard Worker // Addition of a register. 916*9880d681SAndroid Build Coastguard Worker let isCommutable = 1 in { 917*9880d681SAndroid Build Coastguard Worker defm ALR : BinaryRRAndK<"al", 0x1E, 0xB9FA, addc, GR32, GR32>; 918*9880d681SAndroid Build Coastguard Worker defm ALGR : BinaryRREAndK<"alg", 0xB90A, 0xB9EA, addc, GR64, GR64>; 919*9880d681SAndroid Build Coastguard Worker } 920*9880d681SAndroid Build Coastguard Worker def ALGFR : BinaryRRE<"algf", 0xB91A, null_frag, GR64, GR32>; 921*9880d681SAndroid Build Coastguard Worker 922*9880d681SAndroid Build Coastguard Worker // Addition of signed 16-bit immediates. 923*9880d681SAndroid Build Coastguard Worker def ALHSIK : BinaryRIE<"alhsik", 0xECDA, addc, GR32, imm32sx16>, 924*9880d681SAndroid Build Coastguard Worker Requires<[FeatureDistinctOps]>; 925*9880d681SAndroid Build Coastguard Worker def ALGHSIK : BinaryRIE<"alghsik", 0xECDB, addc, GR64, imm64sx16>, 926*9880d681SAndroid Build Coastguard Worker Requires<[FeatureDistinctOps]>; 927*9880d681SAndroid Build Coastguard Worker 928*9880d681SAndroid Build Coastguard Worker // Addition of unsigned 32-bit immediates. 929*9880d681SAndroid Build Coastguard Worker def ALFI : BinaryRIL<"alfi", 0xC2B, addc, GR32, uimm32>; 930*9880d681SAndroid Build Coastguard Worker def ALGFI : BinaryRIL<"algfi", 0xC2A, addc, GR64, imm64zx32>; 931*9880d681SAndroid Build Coastguard Worker 932*9880d681SAndroid Build Coastguard Worker // Addition of memory. 933*9880d681SAndroid Build Coastguard Worker defm AL : BinaryRXPair<"al", 0x5E, 0xE35E, addc, GR32, load, 4>; 934*9880d681SAndroid Build Coastguard Worker def ALGF : BinaryRXY<"algf", 0xE31A, addc, GR64, azextloadi32, 4>; 935*9880d681SAndroid Build Coastguard Worker def ALG : BinaryRXY<"alg", 0xE30A, addc, GR64, load, 8>; 936*9880d681SAndroid Build Coastguard Worker} 937*9880d681SAndroid Build Coastguard Workerdefm : ZXB<addc, GR64, ALGFR>; 938*9880d681SAndroid Build Coastguard Worker 939*9880d681SAndroid Build Coastguard Worker// Addition producing and using a carry. 940*9880d681SAndroid Build Coastguard Workerlet Defs = [CC], Uses = [CC] in { 941*9880d681SAndroid Build Coastguard Worker // Addition of a register. 942*9880d681SAndroid Build Coastguard Worker def ALCR : BinaryRRE<"alc", 0xB998, adde, GR32, GR32>; 943*9880d681SAndroid Build Coastguard Worker def ALCGR : BinaryRRE<"alcg", 0xB988, adde, GR64, GR64>; 944*9880d681SAndroid Build Coastguard Worker 945*9880d681SAndroid Build Coastguard Worker // Addition of memory. 946*9880d681SAndroid Build Coastguard Worker def ALC : BinaryRXY<"alc", 0xE398, adde, GR32, load, 4>; 947*9880d681SAndroid Build Coastguard Worker def ALCG : BinaryRXY<"alcg", 0xE388, adde, GR64, load, 8>; 948*9880d681SAndroid Build Coastguard Worker} 949*9880d681SAndroid Build Coastguard Worker 950*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 951*9880d681SAndroid Build Coastguard Worker// Subtraction 952*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 953*9880d681SAndroid Build Coastguard Worker 954*9880d681SAndroid Build Coastguard Worker// Plain subtraction. Although immediate forms exist, we use the 955*9880d681SAndroid Build Coastguard Worker// add-immediate instruction instead. 956*9880d681SAndroid Build Coastguard Workerlet Defs = [CC], CCValues = 0xF, CompareZeroCCMask = 0x8 in { 957*9880d681SAndroid Build Coastguard Worker // Subtraction of a register. 958*9880d681SAndroid Build Coastguard Worker defm SR : BinaryRRAndK<"s", 0x1B, 0xB9F9, sub, GR32, GR32>; 959*9880d681SAndroid Build Coastguard Worker def SGFR : BinaryRRE<"sgf", 0xB919, null_frag, GR64, GR32>; 960*9880d681SAndroid Build Coastguard Worker defm SGR : BinaryRREAndK<"sg", 0xB909, 0xB9E9, sub, GR64, GR64>; 961*9880d681SAndroid Build Coastguard Worker 962*9880d681SAndroid Build Coastguard Worker // Subtraction of memory. 963*9880d681SAndroid Build Coastguard Worker defm SH : BinaryRXPair<"sh", 0x4B, 0xE37B, sub, GR32, asextloadi16, 2>; 964*9880d681SAndroid Build Coastguard Worker defm S : BinaryRXPair<"s", 0x5B, 0xE35B, sub, GR32, load, 4>; 965*9880d681SAndroid Build Coastguard Worker def SGF : BinaryRXY<"sgf", 0xE319, sub, GR64, asextloadi32, 4>; 966*9880d681SAndroid Build Coastguard Worker def SG : BinaryRXY<"sg", 0xE309, sub, GR64, load, 8>; 967*9880d681SAndroid Build Coastguard Worker} 968*9880d681SAndroid Build Coastguard Workerdefm : SXB<sub, GR64, SGFR>; 969*9880d681SAndroid Build Coastguard Worker 970*9880d681SAndroid Build Coastguard Worker// Subtraction producing a carry. 971*9880d681SAndroid Build Coastguard Workerlet Defs = [CC] in { 972*9880d681SAndroid Build Coastguard Worker // Subtraction of a register. 973*9880d681SAndroid Build Coastguard Worker defm SLR : BinaryRRAndK<"sl", 0x1F, 0xB9FB, subc, GR32, GR32>; 974*9880d681SAndroid Build Coastguard Worker def SLGFR : BinaryRRE<"slgf", 0xB91B, null_frag, GR64, GR32>; 975*9880d681SAndroid Build Coastguard Worker defm SLGR : BinaryRREAndK<"slg", 0xB90B, 0xB9EB, subc, GR64, GR64>; 976*9880d681SAndroid Build Coastguard Worker 977*9880d681SAndroid Build Coastguard Worker // Subtraction of unsigned 32-bit immediates. These don't match 978*9880d681SAndroid Build Coastguard Worker // subc because we prefer addc for constants. 979*9880d681SAndroid Build Coastguard Worker def SLFI : BinaryRIL<"slfi", 0xC25, null_frag, GR32, uimm32>; 980*9880d681SAndroid Build Coastguard Worker def SLGFI : BinaryRIL<"slgfi", 0xC24, null_frag, GR64, imm64zx32>; 981*9880d681SAndroid Build Coastguard Worker 982*9880d681SAndroid Build Coastguard Worker // Subtraction of memory. 983*9880d681SAndroid Build Coastguard Worker defm SL : BinaryRXPair<"sl", 0x5F, 0xE35F, subc, GR32, load, 4>; 984*9880d681SAndroid Build Coastguard Worker def SLGF : BinaryRXY<"slgf", 0xE31B, subc, GR64, azextloadi32, 4>; 985*9880d681SAndroid Build Coastguard Worker def SLG : BinaryRXY<"slg", 0xE30B, subc, GR64, load, 8>; 986*9880d681SAndroid Build Coastguard Worker} 987*9880d681SAndroid Build Coastguard Workerdefm : ZXB<subc, GR64, SLGFR>; 988*9880d681SAndroid Build Coastguard Worker 989*9880d681SAndroid Build Coastguard Worker// Subtraction producing and using a carry. 990*9880d681SAndroid Build Coastguard Workerlet Defs = [CC], Uses = [CC] in { 991*9880d681SAndroid Build Coastguard Worker // Subtraction of a register. 992*9880d681SAndroid Build Coastguard Worker def SLBR : BinaryRRE<"slb", 0xB999, sube, GR32, GR32>; 993*9880d681SAndroid Build Coastguard Worker def SLBGR : BinaryRRE<"slbg", 0xB989, sube, GR64, GR64>; 994*9880d681SAndroid Build Coastguard Worker 995*9880d681SAndroid Build Coastguard Worker // Subtraction of memory. 996*9880d681SAndroid Build Coastguard Worker def SLB : BinaryRXY<"slb", 0xE399, sube, GR32, load, 4>; 997*9880d681SAndroid Build Coastguard Worker def SLBG : BinaryRXY<"slbg", 0xE389, sube, GR64, load, 8>; 998*9880d681SAndroid Build Coastguard Worker} 999*9880d681SAndroid Build Coastguard Worker 1000*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1001*9880d681SAndroid Build Coastguard Worker// AND 1002*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1003*9880d681SAndroid Build Coastguard Worker 1004*9880d681SAndroid Build Coastguard Workerlet Defs = [CC] in { 1005*9880d681SAndroid Build Coastguard Worker // ANDs of a register. 1006*9880d681SAndroid Build Coastguard Worker let isCommutable = 1, CCValues = 0xC, CompareZeroCCMask = 0x8 in { 1007*9880d681SAndroid Build Coastguard Worker defm NR : BinaryRRAndK<"n", 0x14, 0xB9F4, and, GR32, GR32>; 1008*9880d681SAndroid Build Coastguard Worker defm NGR : BinaryRREAndK<"ng", 0xB980, 0xB9E4, and, GR64, GR64>; 1009*9880d681SAndroid Build Coastguard Worker } 1010*9880d681SAndroid Build Coastguard Worker 1011*9880d681SAndroid Build Coastguard Worker let isConvertibleToThreeAddress = 1 in { 1012*9880d681SAndroid Build Coastguard Worker // ANDs of a 16-bit immediate, leaving other bits unaffected. 1013*9880d681SAndroid Build Coastguard Worker // The CC result only reflects the 16-bit field, not the full register. 1014*9880d681SAndroid Build Coastguard Worker // 1015*9880d681SAndroid Build Coastguard Worker // NIxMux expands to NI[LH]x, depending on the choice of register. 1016*9880d681SAndroid Build Coastguard Worker def NILMux : BinaryRIPseudo<and, GRX32, imm32ll16c>, 1017*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 1018*9880d681SAndroid Build Coastguard Worker def NIHMux : BinaryRIPseudo<and, GRX32, imm32lh16c>, 1019*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 1020*9880d681SAndroid Build Coastguard Worker def NILL : BinaryRI<"nill", 0xA57, and, GR32, imm32ll16c>; 1021*9880d681SAndroid Build Coastguard Worker def NILH : BinaryRI<"nilh", 0xA56, and, GR32, imm32lh16c>; 1022*9880d681SAndroid Build Coastguard Worker def NIHL : BinaryRI<"nihl", 0xA55, and, GRH32, imm32ll16c>; 1023*9880d681SAndroid Build Coastguard Worker def NIHH : BinaryRI<"nihh", 0xA54, and, GRH32, imm32lh16c>; 1024*9880d681SAndroid Build Coastguard Worker def NILL64 : BinaryAliasRI<and, GR64, imm64ll16c>; 1025*9880d681SAndroid Build Coastguard Worker def NILH64 : BinaryAliasRI<and, GR64, imm64lh16c>; 1026*9880d681SAndroid Build Coastguard Worker def NIHL64 : BinaryAliasRI<and, GR64, imm64hl16c>; 1027*9880d681SAndroid Build Coastguard Worker def NIHH64 : BinaryAliasRI<and, GR64, imm64hh16c>; 1028*9880d681SAndroid Build Coastguard Worker 1029*9880d681SAndroid Build Coastguard Worker // ANDs of a 32-bit immediate, leaving other bits unaffected. 1030*9880d681SAndroid Build Coastguard Worker // The CC result only reflects the 32-bit field, which means we can 1031*9880d681SAndroid Build Coastguard Worker // use it as a zero indicator for i32 operations but not otherwise. 1032*9880d681SAndroid Build Coastguard Worker let CCValues = 0xC, CompareZeroCCMask = 0x8 in { 1033*9880d681SAndroid Build Coastguard Worker // Expands to NILF or NIHF, depending on the choice of register. 1034*9880d681SAndroid Build Coastguard Worker def NIFMux : BinaryRIPseudo<and, GRX32, uimm32>, 1035*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 1036*9880d681SAndroid Build Coastguard Worker def NILF : BinaryRIL<"nilf", 0xC0B, and, GR32, uimm32>; 1037*9880d681SAndroid Build Coastguard Worker def NIHF : BinaryRIL<"nihf", 0xC0A, and, GRH32, uimm32>; 1038*9880d681SAndroid Build Coastguard Worker } 1039*9880d681SAndroid Build Coastguard Worker def NILF64 : BinaryAliasRIL<and, GR64, imm64lf32c>; 1040*9880d681SAndroid Build Coastguard Worker def NIHF64 : BinaryAliasRIL<and, GR64, imm64hf32c>; 1041*9880d681SAndroid Build Coastguard Worker } 1042*9880d681SAndroid Build Coastguard Worker 1043*9880d681SAndroid Build Coastguard Worker // ANDs of memory. 1044*9880d681SAndroid Build Coastguard Worker let CCValues = 0xC, CompareZeroCCMask = 0x8 in { 1045*9880d681SAndroid Build Coastguard Worker defm N : BinaryRXPair<"n", 0x54, 0xE354, and, GR32, load, 4>; 1046*9880d681SAndroid Build Coastguard Worker def NG : BinaryRXY<"ng", 0xE380, and, GR64, load, 8>; 1047*9880d681SAndroid Build Coastguard Worker } 1048*9880d681SAndroid Build Coastguard Worker 1049*9880d681SAndroid Build Coastguard Worker // AND to memory 1050*9880d681SAndroid Build Coastguard Worker defm NI : BinarySIPair<"ni", 0x94, 0xEB54, null_frag, imm32zx8>; 1051*9880d681SAndroid Build Coastguard Worker 1052*9880d681SAndroid Build Coastguard Worker // Block AND. 1053*9880d681SAndroid Build Coastguard Worker let mayLoad = 1, mayStore = 1 in 1054*9880d681SAndroid Build Coastguard Worker defm NC : MemorySS<"nc", 0xD4, z_nc, z_nc_loop>; 1055*9880d681SAndroid Build Coastguard Worker} 1056*9880d681SAndroid Build Coastguard Workerdefm : RMWIByte<and, bdaddr12pair, NI>; 1057*9880d681SAndroid Build Coastguard Workerdefm : RMWIByte<and, bdaddr20pair, NIY>; 1058*9880d681SAndroid Build Coastguard Worker 1059*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1060*9880d681SAndroid Build Coastguard Worker// OR 1061*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1062*9880d681SAndroid Build Coastguard Worker 1063*9880d681SAndroid Build Coastguard Workerlet Defs = [CC] in { 1064*9880d681SAndroid Build Coastguard Worker // ORs of a register. 1065*9880d681SAndroid Build Coastguard Worker let isCommutable = 1, CCValues = 0xC, CompareZeroCCMask = 0x8 in { 1066*9880d681SAndroid Build Coastguard Worker defm OR : BinaryRRAndK<"o", 0x16, 0xB9F6, or, GR32, GR32>; 1067*9880d681SAndroid Build Coastguard Worker defm OGR : BinaryRREAndK<"og", 0xB981, 0xB9E6, or, GR64, GR64>; 1068*9880d681SAndroid Build Coastguard Worker } 1069*9880d681SAndroid Build Coastguard Worker 1070*9880d681SAndroid Build Coastguard Worker // ORs of a 16-bit immediate, leaving other bits unaffected. 1071*9880d681SAndroid Build Coastguard Worker // The CC result only reflects the 16-bit field, not the full register. 1072*9880d681SAndroid Build Coastguard Worker // 1073*9880d681SAndroid Build Coastguard Worker // OIxMux expands to OI[LH]x, depending on the choice of register. 1074*9880d681SAndroid Build Coastguard Worker def OILMux : BinaryRIPseudo<or, GRX32, imm32ll16>, 1075*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 1076*9880d681SAndroid Build Coastguard Worker def OIHMux : BinaryRIPseudo<or, GRX32, imm32lh16>, 1077*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 1078*9880d681SAndroid Build Coastguard Worker def OILL : BinaryRI<"oill", 0xA5B, or, GR32, imm32ll16>; 1079*9880d681SAndroid Build Coastguard Worker def OILH : BinaryRI<"oilh", 0xA5A, or, GR32, imm32lh16>; 1080*9880d681SAndroid Build Coastguard Worker def OIHL : BinaryRI<"oihl", 0xA59, or, GRH32, imm32ll16>; 1081*9880d681SAndroid Build Coastguard Worker def OIHH : BinaryRI<"oihh", 0xA58, or, GRH32, imm32lh16>; 1082*9880d681SAndroid Build Coastguard Worker def OILL64 : BinaryAliasRI<or, GR64, imm64ll16>; 1083*9880d681SAndroid Build Coastguard Worker def OILH64 : BinaryAliasRI<or, GR64, imm64lh16>; 1084*9880d681SAndroid Build Coastguard Worker def OIHL64 : BinaryAliasRI<or, GR64, imm64hl16>; 1085*9880d681SAndroid Build Coastguard Worker def OIHH64 : BinaryAliasRI<or, GR64, imm64hh16>; 1086*9880d681SAndroid Build Coastguard Worker 1087*9880d681SAndroid Build Coastguard Worker // ORs of a 32-bit immediate, leaving other bits unaffected. 1088*9880d681SAndroid Build Coastguard Worker // The CC result only reflects the 32-bit field, which means we can 1089*9880d681SAndroid Build Coastguard Worker // use it as a zero indicator for i32 operations but not otherwise. 1090*9880d681SAndroid Build Coastguard Worker let CCValues = 0xC, CompareZeroCCMask = 0x8 in { 1091*9880d681SAndroid Build Coastguard Worker // Expands to OILF or OIHF, depending on the choice of register. 1092*9880d681SAndroid Build Coastguard Worker def OIFMux : BinaryRIPseudo<or, GRX32, uimm32>, 1093*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 1094*9880d681SAndroid Build Coastguard Worker def OILF : BinaryRIL<"oilf", 0xC0D, or, GR32, uimm32>; 1095*9880d681SAndroid Build Coastguard Worker def OIHF : BinaryRIL<"oihf", 0xC0C, or, GRH32, uimm32>; 1096*9880d681SAndroid Build Coastguard Worker } 1097*9880d681SAndroid Build Coastguard Worker def OILF64 : BinaryAliasRIL<or, GR64, imm64lf32>; 1098*9880d681SAndroid Build Coastguard Worker def OIHF64 : BinaryAliasRIL<or, GR64, imm64hf32>; 1099*9880d681SAndroid Build Coastguard Worker 1100*9880d681SAndroid Build Coastguard Worker // ORs of memory. 1101*9880d681SAndroid Build Coastguard Worker let CCValues = 0xC, CompareZeroCCMask = 0x8 in { 1102*9880d681SAndroid Build Coastguard Worker defm O : BinaryRXPair<"o", 0x56, 0xE356, or, GR32, load, 4>; 1103*9880d681SAndroid Build Coastguard Worker def OG : BinaryRXY<"og", 0xE381, or, GR64, load, 8>; 1104*9880d681SAndroid Build Coastguard Worker } 1105*9880d681SAndroid Build Coastguard Worker 1106*9880d681SAndroid Build Coastguard Worker // OR to memory 1107*9880d681SAndroid Build Coastguard Worker defm OI : BinarySIPair<"oi", 0x96, 0xEB56, null_frag, imm32zx8>; 1108*9880d681SAndroid Build Coastguard Worker 1109*9880d681SAndroid Build Coastguard Worker // Block OR. 1110*9880d681SAndroid Build Coastguard Worker let mayLoad = 1, mayStore = 1 in 1111*9880d681SAndroid Build Coastguard Worker defm OC : MemorySS<"oc", 0xD6, z_oc, z_oc_loop>; 1112*9880d681SAndroid Build Coastguard Worker} 1113*9880d681SAndroid Build Coastguard Workerdefm : RMWIByte<or, bdaddr12pair, OI>; 1114*9880d681SAndroid Build Coastguard Workerdefm : RMWIByte<or, bdaddr20pair, OIY>; 1115*9880d681SAndroid Build Coastguard Worker 1116*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1117*9880d681SAndroid Build Coastguard Worker// XOR 1118*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1119*9880d681SAndroid Build Coastguard Worker 1120*9880d681SAndroid Build Coastguard Workerlet Defs = [CC] in { 1121*9880d681SAndroid Build Coastguard Worker // XORs of a register. 1122*9880d681SAndroid Build Coastguard Worker let isCommutable = 1, CCValues = 0xC, CompareZeroCCMask = 0x8 in { 1123*9880d681SAndroid Build Coastguard Worker defm XR : BinaryRRAndK<"x", 0x17, 0xB9F7, xor, GR32, GR32>; 1124*9880d681SAndroid Build Coastguard Worker defm XGR : BinaryRREAndK<"xg", 0xB982, 0xB9E7, xor, GR64, GR64>; 1125*9880d681SAndroid Build Coastguard Worker } 1126*9880d681SAndroid Build Coastguard Worker 1127*9880d681SAndroid Build Coastguard Worker // XORs of a 32-bit immediate, leaving other bits unaffected. 1128*9880d681SAndroid Build Coastguard Worker // The CC result only reflects the 32-bit field, which means we can 1129*9880d681SAndroid Build Coastguard Worker // use it as a zero indicator for i32 operations but not otherwise. 1130*9880d681SAndroid Build Coastguard Worker let CCValues = 0xC, CompareZeroCCMask = 0x8 in { 1131*9880d681SAndroid Build Coastguard Worker // Expands to XILF or XIHF, depending on the choice of register. 1132*9880d681SAndroid Build Coastguard Worker def XIFMux : BinaryRIPseudo<xor, GRX32, uimm32>, 1133*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 1134*9880d681SAndroid Build Coastguard Worker def XILF : BinaryRIL<"xilf", 0xC07, xor, GR32, uimm32>; 1135*9880d681SAndroid Build Coastguard Worker def XIHF : BinaryRIL<"xihf", 0xC06, xor, GRH32, uimm32>; 1136*9880d681SAndroid Build Coastguard Worker } 1137*9880d681SAndroid Build Coastguard Worker def XILF64 : BinaryAliasRIL<xor, GR64, imm64lf32>; 1138*9880d681SAndroid Build Coastguard Worker def XIHF64 : BinaryAliasRIL<xor, GR64, imm64hf32>; 1139*9880d681SAndroid Build Coastguard Worker 1140*9880d681SAndroid Build Coastguard Worker // XORs of memory. 1141*9880d681SAndroid Build Coastguard Worker let CCValues = 0xC, CompareZeroCCMask = 0x8 in { 1142*9880d681SAndroid Build Coastguard Worker defm X : BinaryRXPair<"x",0x57, 0xE357, xor, GR32, load, 4>; 1143*9880d681SAndroid Build Coastguard Worker def XG : BinaryRXY<"xg", 0xE382, xor, GR64, load, 8>; 1144*9880d681SAndroid Build Coastguard Worker } 1145*9880d681SAndroid Build Coastguard Worker 1146*9880d681SAndroid Build Coastguard Worker // XOR to memory 1147*9880d681SAndroid Build Coastguard Worker defm XI : BinarySIPair<"xi", 0x97, 0xEB57, null_frag, imm32zx8>; 1148*9880d681SAndroid Build Coastguard Worker 1149*9880d681SAndroid Build Coastguard Worker // Block XOR. 1150*9880d681SAndroid Build Coastguard Worker let mayLoad = 1, mayStore = 1 in 1151*9880d681SAndroid Build Coastguard Worker defm XC : MemorySS<"xc", 0xD7, z_xc, z_xc_loop>; 1152*9880d681SAndroid Build Coastguard Worker} 1153*9880d681SAndroid Build Coastguard Workerdefm : RMWIByte<xor, bdaddr12pair, XI>; 1154*9880d681SAndroid Build Coastguard Workerdefm : RMWIByte<xor, bdaddr20pair, XIY>; 1155*9880d681SAndroid Build Coastguard Worker 1156*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1157*9880d681SAndroid Build Coastguard Worker// Multiplication 1158*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1159*9880d681SAndroid Build Coastguard Worker 1160*9880d681SAndroid Build Coastguard Worker// Multiplication of a register. 1161*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in { 1162*9880d681SAndroid Build Coastguard Worker def MSR : BinaryRRE<"ms", 0xB252, mul, GR32, GR32>; 1163*9880d681SAndroid Build Coastguard Worker def MSGR : BinaryRRE<"msg", 0xB90C, mul, GR64, GR64>; 1164*9880d681SAndroid Build Coastguard Worker} 1165*9880d681SAndroid Build Coastguard Workerdef MSGFR : BinaryRRE<"msgf", 0xB91C, null_frag, GR64, GR32>; 1166*9880d681SAndroid Build Coastguard Workerdefm : SXB<mul, GR64, MSGFR>; 1167*9880d681SAndroid Build Coastguard Worker 1168*9880d681SAndroid Build Coastguard Worker// Multiplication of a signed 16-bit immediate. 1169*9880d681SAndroid Build Coastguard Workerdef MHI : BinaryRI<"mhi", 0xA7C, mul, GR32, imm32sx16>; 1170*9880d681SAndroid Build Coastguard Workerdef MGHI : BinaryRI<"mghi", 0xA7D, mul, GR64, imm64sx16>; 1171*9880d681SAndroid Build Coastguard Worker 1172*9880d681SAndroid Build Coastguard Worker// Multiplication of a signed 32-bit immediate. 1173*9880d681SAndroid Build Coastguard Workerdef MSFI : BinaryRIL<"msfi", 0xC21, mul, GR32, simm32>; 1174*9880d681SAndroid Build Coastguard Workerdef MSGFI : BinaryRIL<"msgfi", 0xC20, mul, GR64, imm64sx32>; 1175*9880d681SAndroid Build Coastguard Worker 1176*9880d681SAndroid Build Coastguard Worker// Multiplication of memory. 1177*9880d681SAndroid Build Coastguard Workerdefm MH : BinaryRXPair<"mh", 0x4C, 0xE37C, mul, GR32, asextloadi16, 2>; 1178*9880d681SAndroid Build Coastguard Workerdefm MS : BinaryRXPair<"ms", 0x71, 0xE351, mul, GR32, load, 4>; 1179*9880d681SAndroid Build Coastguard Workerdef MSGF : BinaryRXY<"msgf", 0xE31C, mul, GR64, asextloadi32, 4>; 1180*9880d681SAndroid Build Coastguard Workerdef MSG : BinaryRXY<"msg", 0xE30C, mul, GR64, load, 8>; 1181*9880d681SAndroid Build Coastguard Worker 1182*9880d681SAndroid Build Coastguard Worker// Multiplication of a register, producing two results. 1183*9880d681SAndroid Build Coastguard Workerdef MLGR : BinaryRRE<"mlg", 0xB986, z_umul_lohi64, GR128, GR64>; 1184*9880d681SAndroid Build Coastguard Worker 1185*9880d681SAndroid Build Coastguard Worker// Multiplication of memory, producing two results. 1186*9880d681SAndroid Build Coastguard Workerdef MLG : BinaryRXY<"mlg", 0xE386, z_umul_lohi64, GR128, load, 8>; 1187*9880d681SAndroid Build Coastguard Worker 1188*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1189*9880d681SAndroid Build Coastguard Worker// Division and remainder 1190*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1191*9880d681SAndroid Build Coastguard Worker 1192*9880d681SAndroid Build Coastguard Worker// Division and remainder, from registers. 1193*9880d681SAndroid Build Coastguard Workerdef DSGFR : BinaryRRE<"dsgf", 0xB91D, z_sdivrem32, GR128, GR32>; 1194*9880d681SAndroid Build Coastguard Workerdef DSGR : BinaryRRE<"dsg", 0xB90D, z_sdivrem64, GR128, GR64>; 1195*9880d681SAndroid Build Coastguard Workerdef DLR : BinaryRRE<"dl", 0xB997, z_udivrem32, GR128, GR32>; 1196*9880d681SAndroid Build Coastguard Workerdef DLGR : BinaryRRE<"dlg", 0xB987, z_udivrem64, GR128, GR64>; 1197*9880d681SAndroid Build Coastguard Worker 1198*9880d681SAndroid Build Coastguard Worker// Division and remainder, from memory. 1199*9880d681SAndroid Build Coastguard Workerdef DSGF : BinaryRXY<"dsgf", 0xE31D, z_sdivrem32, GR128, load, 4>; 1200*9880d681SAndroid Build Coastguard Workerdef DSG : BinaryRXY<"dsg", 0xE30D, z_sdivrem64, GR128, load, 8>; 1201*9880d681SAndroid Build Coastguard Workerdef DL : BinaryRXY<"dl", 0xE397, z_udivrem32, GR128, load, 4>; 1202*9880d681SAndroid Build Coastguard Workerdef DLG : BinaryRXY<"dlg", 0xE387, z_udivrem64, GR128, load, 8>; 1203*9880d681SAndroid Build Coastguard Worker 1204*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1205*9880d681SAndroid Build Coastguard Worker// Shifts 1206*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1207*9880d681SAndroid Build Coastguard Worker 1208*9880d681SAndroid Build Coastguard Worker// Shift left. 1209*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 1210*9880d681SAndroid Build Coastguard Worker defm SLL : BinaryRSAndK<"sll", 0x89, 0xEBDF, shl, GR32>; 1211*9880d681SAndroid Build Coastguard Worker defm SLA : BinaryRSAndK<"sla", 0x8B, 0xEBDD, null_frag, GR32>; 1212*9880d681SAndroid Build Coastguard Worker def SLLG : BinaryRSY<"sllg", 0xEB0D, shl, GR64>; 1213*9880d681SAndroid Build Coastguard Worker} 1214*9880d681SAndroid Build Coastguard Worker 1215*9880d681SAndroid Build Coastguard Worker// Logical shift right. 1216*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 1217*9880d681SAndroid Build Coastguard Worker defm SRL : BinaryRSAndK<"srl", 0x88, 0xEBDE, srl, GR32>; 1218*9880d681SAndroid Build Coastguard Worker def SRLG : BinaryRSY<"srlg", 0xEB0C, srl, GR64>; 1219*9880d681SAndroid Build Coastguard Worker} 1220*9880d681SAndroid Build Coastguard Worker 1221*9880d681SAndroid Build Coastguard Worker// Arithmetic shift right. 1222*9880d681SAndroid Build Coastguard Workerlet Defs = [CC], CCValues = 0xE, CompareZeroCCMask = 0xE in { 1223*9880d681SAndroid Build Coastguard Worker defm SRA : BinaryRSAndK<"sra", 0x8A, 0xEBDC, sra, GR32>; 1224*9880d681SAndroid Build Coastguard Worker def SRAG : BinaryRSY<"srag", 0xEB0A, sra, GR64>; 1225*9880d681SAndroid Build Coastguard Worker} 1226*9880d681SAndroid Build Coastguard Worker 1227*9880d681SAndroid Build Coastguard Worker// Rotate left. 1228*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 1229*9880d681SAndroid Build Coastguard Worker def RLL : BinaryRSY<"rll", 0xEB1D, rotl, GR32>; 1230*9880d681SAndroid Build Coastguard Worker def RLLG : BinaryRSY<"rllg", 0xEB1C, rotl, GR64>; 1231*9880d681SAndroid Build Coastguard Worker} 1232*9880d681SAndroid Build Coastguard Worker 1233*9880d681SAndroid Build Coastguard Worker// Rotate second operand left and inserted selected bits into first operand. 1234*9880d681SAndroid Build Coastguard Worker// These can act like 32-bit operands provided that the constant start and 1235*9880d681SAndroid Build Coastguard Worker// end bits (operands 2 and 3) are in the range [32, 64). 1236*9880d681SAndroid Build Coastguard Workerlet Defs = [CC] in { 1237*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 1238*9880d681SAndroid Build Coastguard Worker def RISBG32 : RotateSelectRIEf<"risbg", 0xEC55, GR32, GR32>; 1239*9880d681SAndroid Build Coastguard Worker let CCValues = 0xE, CompareZeroCCMask = 0xE in 1240*9880d681SAndroid Build Coastguard Worker def RISBG : RotateSelectRIEf<"risbg", 0xEC55, GR64, GR64>; 1241*9880d681SAndroid Build Coastguard Worker} 1242*9880d681SAndroid Build Coastguard Worker 1243*9880d681SAndroid Build Coastguard Worker// On zEC12 we have a variant of RISBG that does not set CC. 1244*9880d681SAndroid Build Coastguard Workerlet Predicates = [FeatureMiscellaneousExtensions] in 1245*9880d681SAndroid Build Coastguard Worker def RISBGN : RotateSelectRIEf<"risbgn", 0xEC59, GR64, GR64>; 1246*9880d681SAndroid Build Coastguard Worker 1247*9880d681SAndroid Build Coastguard Worker// Forms of RISBG that only affect one word of the destination register. 1248*9880d681SAndroid Build Coastguard Worker// They do not set CC. 1249*9880d681SAndroid Build Coastguard Workerlet Predicates = [FeatureHighWord] in { 1250*9880d681SAndroid Build Coastguard Worker def RISBMux : RotateSelectRIEfPseudo<GRX32, GRX32>; 1251*9880d681SAndroid Build Coastguard Worker def RISBLL : RotateSelectAliasRIEf<GR32, GR32>; 1252*9880d681SAndroid Build Coastguard Worker def RISBLH : RotateSelectAliasRIEf<GR32, GRH32>; 1253*9880d681SAndroid Build Coastguard Worker def RISBHL : RotateSelectAliasRIEf<GRH32, GR32>; 1254*9880d681SAndroid Build Coastguard Worker def RISBHH : RotateSelectAliasRIEf<GRH32, GRH32>; 1255*9880d681SAndroid Build Coastguard Worker def RISBLG : RotateSelectRIEf<"risblg", 0xEC51, GR32, GR64>; 1256*9880d681SAndroid Build Coastguard Worker def RISBHG : RotateSelectRIEf<"risbhg", 0xEC5D, GRH32, GR64>; 1257*9880d681SAndroid Build Coastguard Worker} 1258*9880d681SAndroid Build Coastguard Worker 1259*9880d681SAndroid Build Coastguard Worker// Rotate second operand left and perform a logical operation with selected 1260*9880d681SAndroid Build Coastguard Worker// bits of the first operand. The CC result only describes the selected bits, 1261*9880d681SAndroid Build Coastguard Worker// so isn't useful for a full comparison against zero. 1262*9880d681SAndroid Build Coastguard Workerlet Defs = [CC] in { 1263*9880d681SAndroid Build Coastguard Worker def RNSBG : RotateSelectRIEf<"rnsbg", 0xEC54, GR64, GR64>; 1264*9880d681SAndroid Build Coastguard Worker def ROSBG : RotateSelectRIEf<"rosbg", 0xEC56, GR64, GR64>; 1265*9880d681SAndroid Build Coastguard Worker def RXSBG : RotateSelectRIEf<"rxsbg", 0xEC57, GR64, GR64>; 1266*9880d681SAndroid Build Coastguard Worker} 1267*9880d681SAndroid Build Coastguard Worker 1268*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1269*9880d681SAndroid Build Coastguard Worker// Comparison 1270*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1271*9880d681SAndroid Build Coastguard Worker 1272*9880d681SAndroid Build Coastguard Worker// Signed comparisons. We put these before the unsigned comparisons because 1273*9880d681SAndroid Build Coastguard Worker// some of the signed forms have COMPARE AND BRANCH equivalents whereas none 1274*9880d681SAndroid Build Coastguard Worker// of the unsigned forms do. 1275*9880d681SAndroid Build Coastguard Workerlet Defs = [CC], CCValues = 0xE in { 1276*9880d681SAndroid Build Coastguard Worker // Comparison with a register. 1277*9880d681SAndroid Build Coastguard Worker def CR : CompareRR <"c", 0x19, z_scmp, GR32, GR32>; 1278*9880d681SAndroid Build Coastguard Worker def CGFR : CompareRRE<"cgf", 0xB930, null_frag, GR64, GR32>; 1279*9880d681SAndroid Build Coastguard Worker def CGR : CompareRRE<"cg", 0xB920, z_scmp, GR64, GR64>; 1280*9880d681SAndroid Build Coastguard Worker 1281*9880d681SAndroid Build Coastguard Worker // Comparison with a signed 16-bit immediate. 1282*9880d681SAndroid Build Coastguard Worker def CHI : CompareRI<"chi", 0xA7E, z_scmp, GR32, imm32sx16>; 1283*9880d681SAndroid Build Coastguard Worker def CGHI : CompareRI<"cghi", 0xA7F, z_scmp, GR64, imm64sx16>; 1284*9880d681SAndroid Build Coastguard Worker 1285*9880d681SAndroid Build Coastguard Worker // Comparison with a signed 32-bit immediate. CFIMux expands to CFI or CIH, 1286*9880d681SAndroid Build Coastguard Worker // depending on the choice of register. 1287*9880d681SAndroid Build Coastguard Worker def CFIMux : CompareRIPseudo<z_scmp, GRX32, simm32>, 1288*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 1289*9880d681SAndroid Build Coastguard Worker def CFI : CompareRIL<"cfi", 0xC2D, z_scmp, GR32, simm32>; 1290*9880d681SAndroid Build Coastguard Worker def CIH : CompareRIL<"cih", 0xCCD, z_scmp, GRH32, simm32>, 1291*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 1292*9880d681SAndroid Build Coastguard Worker def CGFI : CompareRIL<"cgfi", 0xC2C, z_scmp, GR64, imm64sx32>; 1293*9880d681SAndroid Build Coastguard Worker 1294*9880d681SAndroid Build Coastguard Worker // Comparison with memory. 1295*9880d681SAndroid Build Coastguard Worker defm CH : CompareRXPair<"ch", 0x49, 0xE379, z_scmp, GR32, asextloadi16, 2>; 1296*9880d681SAndroid Build Coastguard Worker def CMux : CompareRXYPseudo<z_scmp, GRX32, load, 4>, 1297*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 1298*9880d681SAndroid Build Coastguard Worker defm C : CompareRXPair<"c", 0x59, 0xE359, z_scmp, GR32, load, 4>; 1299*9880d681SAndroid Build Coastguard Worker def CHF : CompareRXY<"chf", 0xE3CD, z_scmp, GRH32, load, 4>, 1300*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 1301*9880d681SAndroid Build Coastguard Worker def CGH : CompareRXY<"cgh", 0xE334, z_scmp, GR64, asextloadi16, 2>; 1302*9880d681SAndroid Build Coastguard Worker def CGF : CompareRXY<"cgf", 0xE330, z_scmp, GR64, asextloadi32, 4>; 1303*9880d681SAndroid Build Coastguard Worker def CG : CompareRXY<"cg", 0xE320, z_scmp, GR64, load, 8>; 1304*9880d681SAndroid Build Coastguard Worker def CHRL : CompareRILPC<"chrl", 0xC65, z_scmp, GR32, aligned_asextloadi16>; 1305*9880d681SAndroid Build Coastguard Worker def CRL : CompareRILPC<"crl", 0xC6D, z_scmp, GR32, aligned_load>; 1306*9880d681SAndroid Build Coastguard Worker def CGHRL : CompareRILPC<"cghrl", 0xC64, z_scmp, GR64, aligned_asextloadi16>; 1307*9880d681SAndroid Build Coastguard Worker def CGFRL : CompareRILPC<"cgfrl", 0xC6C, z_scmp, GR64, aligned_asextloadi32>; 1308*9880d681SAndroid Build Coastguard Worker def CGRL : CompareRILPC<"cgrl", 0xC68, z_scmp, GR64, aligned_load>; 1309*9880d681SAndroid Build Coastguard Worker 1310*9880d681SAndroid Build Coastguard Worker // Comparison between memory and a signed 16-bit immediate. 1311*9880d681SAndroid Build Coastguard Worker def CHHSI : CompareSIL<"chhsi", 0xE554, z_scmp, asextloadi16, imm32sx16>; 1312*9880d681SAndroid Build Coastguard Worker def CHSI : CompareSIL<"chsi", 0xE55C, z_scmp, load, imm32sx16>; 1313*9880d681SAndroid Build Coastguard Worker def CGHSI : CompareSIL<"cghsi", 0xE558, z_scmp, load, imm64sx16>; 1314*9880d681SAndroid Build Coastguard Worker} 1315*9880d681SAndroid Build Coastguard Workerdefm : SXB<z_scmp, GR64, CGFR>; 1316*9880d681SAndroid Build Coastguard Worker 1317*9880d681SAndroid Build Coastguard Worker// Unsigned comparisons. 1318*9880d681SAndroid Build Coastguard Workerlet Defs = [CC], CCValues = 0xE, IsLogical = 1 in { 1319*9880d681SAndroid Build Coastguard Worker // Comparison with a register. 1320*9880d681SAndroid Build Coastguard Worker def CLR : CompareRR <"cl", 0x15, z_ucmp, GR32, GR32>; 1321*9880d681SAndroid Build Coastguard Worker def CLGFR : CompareRRE<"clgf", 0xB931, null_frag, GR64, GR32>; 1322*9880d681SAndroid Build Coastguard Worker def CLGR : CompareRRE<"clg", 0xB921, z_ucmp, GR64, GR64>; 1323*9880d681SAndroid Build Coastguard Worker 1324*9880d681SAndroid Build Coastguard Worker // Comparison with an unsigned 32-bit immediate. CLFIMux expands to CLFI 1325*9880d681SAndroid Build Coastguard Worker // or CLIH, depending on the choice of register. 1326*9880d681SAndroid Build Coastguard Worker def CLFIMux : CompareRIPseudo<z_ucmp, GRX32, uimm32>, 1327*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 1328*9880d681SAndroid Build Coastguard Worker def CLFI : CompareRIL<"clfi", 0xC2F, z_ucmp, GR32, uimm32>; 1329*9880d681SAndroid Build Coastguard Worker def CLIH : CompareRIL<"clih", 0xCCF, z_ucmp, GRH32, uimm32>, 1330*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 1331*9880d681SAndroid Build Coastguard Worker def CLGFI : CompareRIL<"clgfi", 0xC2E, z_ucmp, GR64, imm64zx32>; 1332*9880d681SAndroid Build Coastguard Worker 1333*9880d681SAndroid Build Coastguard Worker // Comparison with memory. 1334*9880d681SAndroid Build Coastguard Worker def CLMux : CompareRXYPseudo<z_ucmp, GRX32, load, 4>, 1335*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 1336*9880d681SAndroid Build Coastguard Worker defm CL : CompareRXPair<"cl", 0x55, 0xE355, z_ucmp, GR32, load, 4>; 1337*9880d681SAndroid Build Coastguard Worker def CLHF : CompareRXY<"clhf", 0xE3CF, z_ucmp, GRH32, load, 4>, 1338*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 1339*9880d681SAndroid Build Coastguard Worker def CLGF : CompareRXY<"clgf", 0xE331, z_ucmp, GR64, azextloadi32, 4>; 1340*9880d681SAndroid Build Coastguard Worker def CLG : CompareRXY<"clg", 0xE321, z_ucmp, GR64, load, 8>; 1341*9880d681SAndroid Build Coastguard Worker def CLHRL : CompareRILPC<"clhrl", 0xC67, z_ucmp, GR32, 1342*9880d681SAndroid Build Coastguard Worker aligned_azextloadi16>; 1343*9880d681SAndroid Build Coastguard Worker def CLRL : CompareRILPC<"clrl", 0xC6F, z_ucmp, GR32, 1344*9880d681SAndroid Build Coastguard Worker aligned_load>; 1345*9880d681SAndroid Build Coastguard Worker def CLGHRL : CompareRILPC<"clghrl", 0xC66, z_ucmp, GR64, 1346*9880d681SAndroid Build Coastguard Worker aligned_azextloadi16>; 1347*9880d681SAndroid Build Coastguard Worker def CLGFRL : CompareRILPC<"clgfrl", 0xC6E, z_ucmp, GR64, 1348*9880d681SAndroid Build Coastguard Worker aligned_azextloadi32>; 1349*9880d681SAndroid Build Coastguard Worker def CLGRL : CompareRILPC<"clgrl", 0xC6A, z_ucmp, GR64, 1350*9880d681SAndroid Build Coastguard Worker aligned_load>; 1351*9880d681SAndroid Build Coastguard Worker 1352*9880d681SAndroid Build Coastguard Worker // Comparison between memory and an unsigned 8-bit immediate. 1353*9880d681SAndroid Build Coastguard Worker defm CLI : CompareSIPair<"cli", 0x95, 0xEB55, z_ucmp, azextloadi8, imm32zx8>; 1354*9880d681SAndroid Build Coastguard Worker 1355*9880d681SAndroid Build Coastguard Worker // Comparison between memory and an unsigned 16-bit immediate. 1356*9880d681SAndroid Build Coastguard Worker def CLHHSI : CompareSIL<"clhhsi", 0xE555, z_ucmp, azextloadi16, imm32zx16>; 1357*9880d681SAndroid Build Coastguard Worker def CLFHSI : CompareSIL<"clfhsi", 0xE55D, z_ucmp, load, imm32zx16>; 1358*9880d681SAndroid Build Coastguard Worker def CLGHSI : CompareSIL<"clghsi", 0xE559, z_ucmp, load, imm64zx16>; 1359*9880d681SAndroid Build Coastguard Worker} 1360*9880d681SAndroid Build Coastguard Workerdefm : ZXB<z_ucmp, GR64, CLGFR>; 1361*9880d681SAndroid Build Coastguard Worker 1362*9880d681SAndroid Build Coastguard Worker// Memory-to-memory comparison. 1363*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, Defs = [CC] in 1364*9880d681SAndroid Build Coastguard Worker defm CLC : MemorySS<"clc", 0xD5, z_clc, z_clc_loop>; 1365*9880d681SAndroid Build Coastguard Worker 1366*9880d681SAndroid Build Coastguard Worker// String comparison. 1367*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, Defs = [CC] in 1368*9880d681SAndroid Build Coastguard Worker defm CLST : StringRRE<"clst", 0xB25D, z_strcmp>; 1369*9880d681SAndroid Build Coastguard Worker 1370*9880d681SAndroid Build Coastguard Worker// Test under mask. 1371*9880d681SAndroid Build Coastguard Workerlet Defs = [CC] in { 1372*9880d681SAndroid Build Coastguard Worker // TMxMux expands to TM[LH]x, depending on the choice of register. 1373*9880d681SAndroid Build Coastguard Worker def TMLMux : CompareRIPseudo<z_tm_reg, GRX32, imm32ll16>, 1374*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 1375*9880d681SAndroid Build Coastguard Worker def TMHMux : CompareRIPseudo<z_tm_reg, GRX32, imm32lh16>, 1376*9880d681SAndroid Build Coastguard Worker Requires<[FeatureHighWord]>; 1377*9880d681SAndroid Build Coastguard Worker def TMLL : CompareRI<"tmll", 0xA71, z_tm_reg, GR32, imm32ll16>; 1378*9880d681SAndroid Build Coastguard Worker def TMLH : CompareRI<"tmlh", 0xA70, z_tm_reg, GR32, imm32lh16>; 1379*9880d681SAndroid Build Coastguard Worker def TMHL : CompareRI<"tmhl", 0xA73, z_tm_reg, GRH32, imm32ll16>; 1380*9880d681SAndroid Build Coastguard Worker def TMHH : CompareRI<"tmhh", 0xA72, z_tm_reg, GRH32, imm32lh16>; 1381*9880d681SAndroid Build Coastguard Worker 1382*9880d681SAndroid Build Coastguard Worker def TMLL64 : CompareAliasRI<z_tm_reg, GR64, imm64ll16>; 1383*9880d681SAndroid Build Coastguard Worker def TMLH64 : CompareAliasRI<z_tm_reg, GR64, imm64lh16>; 1384*9880d681SAndroid Build Coastguard Worker def TMHL64 : CompareAliasRI<z_tm_reg, GR64, imm64hl16>; 1385*9880d681SAndroid Build Coastguard Worker def TMHH64 : CompareAliasRI<z_tm_reg, GR64, imm64hh16>; 1386*9880d681SAndroid Build Coastguard Worker 1387*9880d681SAndroid Build Coastguard Worker defm TM : CompareSIPair<"tm", 0x91, 0xEB51, z_tm_mem, anyextloadi8, imm32zx8>; 1388*9880d681SAndroid Build Coastguard Worker} 1389*9880d681SAndroid Build Coastguard Worker 1390*9880d681SAndroid Build Coastguard Workerdef TML : InstAlias<"tml\t$R, $I", (TMLL GR32:$R, imm32ll16:$I), 0>; 1391*9880d681SAndroid Build Coastguard Workerdef TMH : InstAlias<"tmh\t$R, $I", (TMLH GR32:$R, imm32lh16:$I), 0>; 1392*9880d681SAndroid Build Coastguard Worker 1393*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1394*9880d681SAndroid Build Coastguard Worker// Prefetch 1395*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1396*9880d681SAndroid Build Coastguard Worker 1397*9880d681SAndroid Build Coastguard Workerdef PFD : PrefetchRXY<"pfd", 0xE336, z_prefetch>; 1398*9880d681SAndroid Build Coastguard Workerdef PFDRL : PrefetchRILPC<"pfdrl", 0xC62, z_prefetch>; 1399*9880d681SAndroid Build Coastguard Worker 1400*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1401*9880d681SAndroid Build Coastguard Worker// Atomic operations 1402*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1403*9880d681SAndroid Build Coastguard Worker 1404*9880d681SAndroid Build Coastguard Worker// A serialization instruction that acts as a barrier for all memory 1405*9880d681SAndroid Build Coastguard Worker// accesses, which expands to "bcr 14, 0". 1406*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 1 in 1407*9880d681SAndroid Build Coastguard Workerdef Serialize : Alias<2, (outs), (ins), [(z_serialize)]>; 1408*9880d681SAndroid Build Coastguard Worker 1409*9880d681SAndroid Build Coastguard Worker// A pseudo instruction that serves as a compiler barrier. 1410*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 1 in 1411*9880d681SAndroid Build Coastguard Workerdef MemBarrier : Pseudo<(outs), (ins), [(z_membarrier)]>; 1412*9880d681SAndroid Build Coastguard Worker 1413*9880d681SAndroid Build Coastguard Workerlet Predicates = [FeatureInterlockedAccess1], Defs = [CC] in { 1414*9880d681SAndroid Build Coastguard Worker def LAA : LoadAndOpRSY<"laa", 0xEBF8, atomic_load_add_32, GR32>; 1415*9880d681SAndroid Build Coastguard Worker def LAAG : LoadAndOpRSY<"laag", 0xEBE8, atomic_load_add_64, GR64>; 1416*9880d681SAndroid Build Coastguard Worker def LAAL : LoadAndOpRSY<"laal", 0xEBFA, null_frag, GR32>; 1417*9880d681SAndroid Build Coastguard Worker def LAALG : LoadAndOpRSY<"laalg", 0xEBEA, null_frag, GR64>; 1418*9880d681SAndroid Build Coastguard Worker def LAN : LoadAndOpRSY<"lan", 0xEBF4, atomic_load_and_32, GR32>; 1419*9880d681SAndroid Build Coastguard Worker def LANG : LoadAndOpRSY<"lang", 0xEBE4, atomic_load_and_64, GR64>; 1420*9880d681SAndroid Build Coastguard Worker def LAO : LoadAndOpRSY<"lao", 0xEBF6, atomic_load_or_32, GR32>; 1421*9880d681SAndroid Build Coastguard Worker def LAOG : LoadAndOpRSY<"laog", 0xEBE6, atomic_load_or_64, GR64>; 1422*9880d681SAndroid Build Coastguard Worker def LAX : LoadAndOpRSY<"lax", 0xEBF7, atomic_load_xor_32, GR32>; 1423*9880d681SAndroid Build Coastguard Worker def LAXG : LoadAndOpRSY<"laxg", 0xEBE7, atomic_load_xor_64, GR64>; 1424*9880d681SAndroid Build Coastguard Worker} 1425*9880d681SAndroid Build Coastguard Worker 1426*9880d681SAndroid Build Coastguard Workerdef ATOMIC_SWAPW : AtomicLoadWBinaryReg<z_atomic_swapw>; 1427*9880d681SAndroid Build Coastguard Workerdef ATOMIC_SWAP_32 : AtomicLoadBinaryReg32<atomic_swap_32>; 1428*9880d681SAndroid Build Coastguard Workerdef ATOMIC_SWAP_64 : AtomicLoadBinaryReg64<atomic_swap_64>; 1429*9880d681SAndroid Build Coastguard Worker 1430*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOADW_AR : AtomicLoadWBinaryReg<z_atomic_loadw_add>; 1431*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOADW_AFI : AtomicLoadWBinaryImm<z_atomic_loadw_add, simm32>; 1432*9880d681SAndroid Build Coastguard Workerlet Predicates = [FeatureNoInterlockedAccess1] in { 1433*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_AR : AtomicLoadBinaryReg32<atomic_load_add_32>; 1434*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_AHI : AtomicLoadBinaryImm32<atomic_load_add_32, imm32sx16>; 1435*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_AFI : AtomicLoadBinaryImm32<atomic_load_add_32, simm32>; 1436*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_AGR : AtomicLoadBinaryReg64<atomic_load_add_64>; 1437*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_AGHI : AtomicLoadBinaryImm64<atomic_load_add_64, imm64sx16>; 1438*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_AGFI : AtomicLoadBinaryImm64<atomic_load_add_64, imm64sx32>; 1439*9880d681SAndroid Build Coastguard Worker} 1440*9880d681SAndroid Build Coastguard Worker 1441*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOADW_SR : AtomicLoadWBinaryReg<z_atomic_loadw_sub>; 1442*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_SR : AtomicLoadBinaryReg32<atomic_load_sub_32>; 1443*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_SGR : AtomicLoadBinaryReg64<atomic_load_sub_64>; 1444*9880d681SAndroid Build Coastguard Worker 1445*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOADW_NR : AtomicLoadWBinaryReg<z_atomic_loadw_and>; 1446*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOADW_NILH : AtomicLoadWBinaryImm<z_atomic_loadw_and, imm32lh16c>; 1447*9880d681SAndroid Build Coastguard Workerlet Predicates = [FeatureNoInterlockedAccess1] in { 1448*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_NR : AtomicLoadBinaryReg32<atomic_load_and_32>; 1449*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_NILL : AtomicLoadBinaryImm32<atomic_load_and_32, 1450*9880d681SAndroid Build Coastguard Worker imm32ll16c>; 1451*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_NILH : AtomicLoadBinaryImm32<atomic_load_and_32, 1452*9880d681SAndroid Build Coastguard Worker imm32lh16c>; 1453*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_NILF : AtomicLoadBinaryImm32<atomic_load_and_32, uimm32>; 1454*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_NGR : AtomicLoadBinaryReg64<atomic_load_and_64>; 1455*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_NILL64 : AtomicLoadBinaryImm64<atomic_load_and_64, 1456*9880d681SAndroid Build Coastguard Worker imm64ll16c>; 1457*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_NILH64 : AtomicLoadBinaryImm64<atomic_load_and_64, 1458*9880d681SAndroid Build Coastguard Worker imm64lh16c>; 1459*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_NIHL64 : AtomicLoadBinaryImm64<atomic_load_and_64, 1460*9880d681SAndroid Build Coastguard Worker imm64hl16c>; 1461*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_NIHH64 : AtomicLoadBinaryImm64<atomic_load_and_64, 1462*9880d681SAndroid Build Coastguard Worker imm64hh16c>; 1463*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_NILF64 : AtomicLoadBinaryImm64<atomic_load_and_64, 1464*9880d681SAndroid Build Coastguard Worker imm64lf32c>; 1465*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_NIHF64 : AtomicLoadBinaryImm64<atomic_load_and_64, 1466*9880d681SAndroid Build Coastguard Worker imm64hf32c>; 1467*9880d681SAndroid Build Coastguard Worker} 1468*9880d681SAndroid Build Coastguard Worker 1469*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOADW_OR : AtomicLoadWBinaryReg<z_atomic_loadw_or>; 1470*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOADW_OILH : AtomicLoadWBinaryImm<z_atomic_loadw_or, imm32lh16>; 1471*9880d681SAndroid Build Coastguard Workerlet Predicates = [FeatureNoInterlockedAccess1] in { 1472*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_OR : AtomicLoadBinaryReg32<atomic_load_or_32>; 1473*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_OILL : AtomicLoadBinaryImm32<atomic_load_or_32, imm32ll16>; 1474*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_OILH : AtomicLoadBinaryImm32<atomic_load_or_32, imm32lh16>; 1475*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_OILF : AtomicLoadBinaryImm32<atomic_load_or_32, uimm32>; 1476*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_OGR : AtomicLoadBinaryReg64<atomic_load_or_64>; 1477*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_OILL64 : AtomicLoadBinaryImm64<atomic_load_or_64, imm64ll16>; 1478*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_OILH64 : AtomicLoadBinaryImm64<atomic_load_or_64, imm64lh16>; 1479*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_OIHL64 : AtomicLoadBinaryImm64<atomic_load_or_64, imm64hl16>; 1480*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_OIHH64 : AtomicLoadBinaryImm64<atomic_load_or_64, imm64hh16>; 1481*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_OILF64 : AtomicLoadBinaryImm64<atomic_load_or_64, imm64lf32>; 1482*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_OIHF64 : AtomicLoadBinaryImm64<atomic_load_or_64, imm64hf32>; 1483*9880d681SAndroid Build Coastguard Worker} 1484*9880d681SAndroid Build Coastguard Worker 1485*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOADW_XR : AtomicLoadWBinaryReg<z_atomic_loadw_xor>; 1486*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOADW_XILF : AtomicLoadWBinaryImm<z_atomic_loadw_xor, uimm32>; 1487*9880d681SAndroid Build Coastguard Workerlet Predicates = [FeatureNoInterlockedAccess1] in { 1488*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_XR : AtomicLoadBinaryReg32<atomic_load_xor_32>; 1489*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_XILF : AtomicLoadBinaryImm32<atomic_load_xor_32, uimm32>; 1490*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_XGR : AtomicLoadBinaryReg64<atomic_load_xor_64>; 1491*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_XILF64 : AtomicLoadBinaryImm64<atomic_load_xor_64, imm64lf32>; 1492*9880d681SAndroid Build Coastguard Worker def ATOMIC_LOAD_XIHF64 : AtomicLoadBinaryImm64<atomic_load_xor_64, imm64hf32>; 1493*9880d681SAndroid Build Coastguard Worker} 1494*9880d681SAndroid Build Coastguard Worker 1495*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOADW_NRi : AtomicLoadWBinaryReg<z_atomic_loadw_nand>; 1496*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOADW_NILHi : AtomicLoadWBinaryImm<z_atomic_loadw_nand, 1497*9880d681SAndroid Build Coastguard Worker imm32lh16c>; 1498*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_NRi : AtomicLoadBinaryReg32<atomic_load_nand_32>; 1499*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_NILLi : AtomicLoadBinaryImm32<atomic_load_nand_32, 1500*9880d681SAndroid Build Coastguard Worker imm32ll16c>; 1501*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_NILHi : AtomicLoadBinaryImm32<atomic_load_nand_32, 1502*9880d681SAndroid Build Coastguard Worker imm32lh16c>; 1503*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_NILFi : AtomicLoadBinaryImm32<atomic_load_nand_32, uimm32>; 1504*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_NGRi : AtomicLoadBinaryReg64<atomic_load_nand_64>; 1505*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_NILL64i : AtomicLoadBinaryImm64<atomic_load_nand_64, 1506*9880d681SAndroid Build Coastguard Worker imm64ll16c>; 1507*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_NILH64i : AtomicLoadBinaryImm64<atomic_load_nand_64, 1508*9880d681SAndroid Build Coastguard Worker imm64lh16c>; 1509*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_NIHL64i : AtomicLoadBinaryImm64<atomic_load_nand_64, 1510*9880d681SAndroid Build Coastguard Worker imm64hl16c>; 1511*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_NIHH64i : AtomicLoadBinaryImm64<atomic_load_nand_64, 1512*9880d681SAndroid Build Coastguard Worker imm64hh16c>; 1513*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_NILF64i : AtomicLoadBinaryImm64<atomic_load_nand_64, 1514*9880d681SAndroid Build Coastguard Worker imm64lf32c>; 1515*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_NIHF64i : AtomicLoadBinaryImm64<atomic_load_nand_64, 1516*9880d681SAndroid Build Coastguard Worker imm64hf32c>; 1517*9880d681SAndroid Build Coastguard Worker 1518*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOADW_MIN : AtomicLoadWBinaryReg<z_atomic_loadw_min>; 1519*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_MIN_32 : AtomicLoadBinaryReg32<atomic_load_min_32>; 1520*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_MIN_64 : AtomicLoadBinaryReg64<atomic_load_min_64>; 1521*9880d681SAndroid Build Coastguard Worker 1522*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOADW_MAX : AtomicLoadWBinaryReg<z_atomic_loadw_max>; 1523*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_MAX_32 : AtomicLoadBinaryReg32<atomic_load_max_32>; 1524*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_MAX_64 : AtomicLoadBinaryReg64<atomic_load_max_64>; 1525*9880d681SAndroid Build Coastguard Worker 1526*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOADW_UMIN : AtomicLoadWBinaryReg<z_atomic_loadw_umin>; 1527*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_UMIN_32 : AtomicLoadBinaryReg32<atomic_load_umin_32>; 1528*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_UMIN_64 : AtomicLoadBinaryReg64<atomic_load_umin_64>; 1529*9880d681SAndroid Build Coastguard Worker 1530*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOADW_UMAX : AtomicLoadWBinaryReg<z_atomic_loadw_umax>; 1531*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_UMAX_32 : AtomicLoadBinaryReg32<atomic_load_umax_32>; 1532*9880d681SAndroid Build Coastguard Workerdef ATOMIC_LOAD_UMAX_64 : AtomicLoadBinaryReg64<atomic_load_umax_64>; 1533*9880d681SAndroid Build Coastguard Worker 1534*9880d681SAndroid Build Coastguard Workerdef ATOMIC_CMP_SWAPW 1535*9880d681SAndroid Build Coastguard Worker : Pseudo<(outs GR32:$dst), (ins bdaddr20only:$addr, GR32:$cmp, GR32:$swap, 1536*9880d681SAndroid Build Coastguard Worker ADDR32:$bitshift, ADDR32:$negbitshift, 1537*9880d681SAndroid Build Coastguard Worker uimm32:$bitsize), 1538*9880d681SAndroid Build Coastguard Worker [(set GR32:$dst, 1539*9880d681SAndroid Build Coastguard Worker (z_atomic_cmp_swapw bdaddr20only:$addr, GR32:$cmp, GR32:$swap, 1540*9880d681SAndroid Build Coastguard Worker ADDR32:$bitshift, ADDR32:$negbitshift, 1541*9880d681SAndroid Build Coastguard Worker uimm32:$bitsize))]> { 1542*9880d681SAndroid Build Coastguard Worker let Defs = [CC]; 1543*9880d681SAndroid Build Coastguard Worker let mayLoad = 1; 1544*9880d681SAndroid Build Coastguard Worker let mayStore = 1; 1545*9880d681SAndroid Build Coastguard Worker let usesCustomInserter = 1; 1546*9880d681SAndroid Build Coastguard Worker} 1547*9880d681SAndroid Build Coastguard Worker 1548*9880d681SAndroid Build Coastguard Workerlet Defs = [CC] in { 1549*9880d681SAndroid Build Coastguard Worker defm CS : CmpSwapRSPair<"cs", 0xBA, 0xEB14, atomic_cmp_swap_32, GR32>; 1550*9880d681SAndroid Build Coastguard Worker def CSG : CmpSwapRSY<"csg", 0xEB30, atomic_cmp_swap_64, GR64>; 1551*9880d681SAndroid Build Coastguard Worker} 1552*9880d681SAndroid Build Coastguard Worker 1553*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1554*9880d681SAndroid Build Coastguard Worker// Transactional execution 1555*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1556*9880d681SAndroid Build Coastguard Worker 1557*9880d681SAndroid Build Coastguard Workerlet Predicates = [FeatureTransactionalExecution] in { 1558*9880d681SAndroid Build Coastguard Worker // Transaction Begin 1559*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 1, mayStore = 1, 1560*9880d681SAndroid Build Coastguard Worker usesCustomInserter = 1, Defs = [CC] in { 1561*9880d681SAndroid Build Coastguard Worker def TBEGIN : InstSIL<0xE560, 1562*9880d681SAndroid Build Coastguard Worker (outs), (ins bdaddr12only:$BD1, imm32zx16:$I2), 1563*9880d681SAndroid Build Coastguard Worker "tbegin\t$BD1, $I2", 1564*9880d681SAndroid Build Coastguard Worker [(z_tbegin bdaddr12only:$BD1, imm32zx16:$I2)]>; 1565*9880d681SAndroid Build Coastguard Worker def TBEGIN_nofloat : Pseudo<(outs), (ins bdaddr12only:$BD1, imm32zx16:$I2), 1566*9880d681SAndroid Build Coastguard Worker [(z_tbegin_nofloat bdaddr12only:$BD1, 1567*9880d681SAndroid Build Coastguard Worker imm32zx16:$I2)]>; 1568*9880d681SAndroid Build Coastguard Worker def TBEGINC : InstSIL<0xE561, 1569*9880d681SAndroid Build Coastguard Worker (outs), (ins bdaddr12only:$BD1, imm32zx16:$I2), 1570*9880d681SAndroid Build Coastguard Worker "tbeginc\t$BD1, $I2", 1571*9880d681SAndroid Build Coastguard Worker [(int_s390_tbeginc bdaddr12only:$BD1, 1572*9880d681SAndroid Build Coastguard Worker imm32zx16:$I2)]>; 1573*9880d681SAndroid Build Coastguard Worker } 1574*9880d681SAndroid Build Coastguard Worker 1575*9880d681SAndroid Build Coastguard Worker // Transaction End 1576*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 1, Defs = [CC], BD2 = 0 in 1577*9880d681SAndroid Build Coastguard Worker def TEND : InstS<0xB2F8, (outs), (ins), "tend", [(z_tend)]>; 1578*9880d681SAndroid Build Coastguard Worker 1579*9880d681SAndroid Build Coastguard Worker // Transaction Abort 1580*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 1, isTerminator = 1, isBarrier = 1 in 1581*9880d681SAndroid Build Coastguard Worker def TABORT : InstS<0xB2FC, (outs), (ins bdaddr12only:$BD2), 1582*9880d681SAndroid Build Coastguard Worker "tabort\t$BD2", 1583*9880d681SAndroid Build Coastguard Worker [(int_s390_tabort bdaddr12only:$BD2)]>; 1584*9880d681SAndroid Build Coastguard Worker 1585*9880d681SAndroid Build Coastguard Worker // Nontransactional Store 1586*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 1 in 1587*9880d681SAndroid Build Coastguard Worker def NTSTG : StoreRXY<"ntstg", 0xE325, int_s390_ntstg, GR64, 8>; 1588*9880d681SAndroid Build Coastguard Worker 1589*9880d681SAndroid Build Coastguard Worker // Extract Transaction Nesting Depth 1590*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 1 in 1591*9880d681SAndroid Build Coastguard Worker def ETND : InherentRRE<"etnd", 0xB2EC, GR32, (int_s390_etnd)>; 1592*9880d681SAndroid Build Coastguard Worker} 1593*9880d681SAndroid Build Coastguard Worker 1594*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1595*9880d681SAndroid Build Coastguard Worker// Processor assist 1596*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1597*9880d681SAndroid Build Coastguard Worker 1598*9880d681SAndroid Build Coastguard Workerlet Predicates = [FeatureProcessorAssist] in { 1599*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 1, R4 = 0 in 1600*9880d681SAndroid Build Coastguard Worker def PPA : InstRRF<0xB2E8, (outs), (ins GR64:$R1, GR64:$R2, imm32zx4:$R3), 1601*9880d681SAndroid Build Coastguard Worker "ppa\t$R1, $R2, $R3", []>; 1602*9880d681SAndroid Build Coastguard Worker def : Pat<(int_s390_ppa_txassist GR32:$src), 1603*9880d681SAndroid Build Coastguard Worker (PPA (INSERT_SUBREG (i64 (IMPLICIT_DEF)), GR32:$src, subreg_l32), 1604*9880d681SAndroid Build Coastguard Worker 0, 1)>; 1605*9880d681SAndroid Build Coastguard Worker} 1606*9880d681SAndroid Build Coastguard Worker 1607*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1608*9880d681SAndroid Build Coastguard Worker// Miscellaneous Instructions. 1609*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1610*9880d681SAndroid Build Coastguard Worker 1611*9880d681SAndroid Build Coastguard Worker// Extract CC into bits 29 and 28 of a register. 1612*9880d681SAndroid Build Coastguard Workerlet Uses = [CC] in 1613*9880d681SAndroid Build Coastguard Worker def IPM : InherentRRE<"ipm", 0xB222, GR32, (z_ipm)>; 1614*9880d681SAndroid Build Coastguard Worker 1615*9880d681SAndroid Build Coastguard Worker// Read a 32-bit access register into a GR32. As with all GR32 operations, 1616*9880d681SAndroid Build Coastguard Worker// the upper 32 bits of the enclosing GR64 remain unchanged, which is useful 1617*9880d681SAndroid Build Coastguard Worker// when a 64-bit address is stored in a pair of access registers. 1618*9880d681SAndroid Build Coastguard Workerdef EAR : InstRRE<0xB24F, (outs GR32:$R1), (ins access_reg:$R2), 1619*9880d681SAndroid Build Coastguard Worker "ear\t$R1, $R2", 1620*9880d681SAndroid Build Coastguard Worker [(set GR32:$R1, (z_extract_access access_reg:$R2))]>; 1621*9880d681SAndroid Build Coastguard Worker 1622*9880d681SAndroid Build Coastguard Worker// Find leftmost one, AKA count leading zeros. The instruction actually 1623*9880d681SAndroid Build Coastguard Worker// returns a pair of GR64s, the first giving the number of leading zeros 1624*9880d681SAndroid Build Coastguard Worker// and the second giving a copy of the source with the leftmost one bit 1625*9880d681SAndroid Build Coastguard Worker// cleared. We only use the first result here. 1626*9880d681SAndroid Build Coastguard Workerlet Defs = [CC] in { 1627*9880d681SAndroid Build Coastguard Worker def FLOGR : UnaryRRE<"flog", 0xB983, null_frag, GR128, GR64>; 1628*9880d681SAndroid Build Coastguard Worker} 1629*9880d681SAndroid Build Coastguard Workerdef : Pat<(ctlz GR64:$src), 1630*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (FLOGR GR64:$src), subreg_h64)>; 1631*9880d681SAndroid Build Coastguard Worker 1632*9880d681SAndroid Build Coastguard Worker// Population count. Counts bits set per byte. 1633*9880d681SAndroid Build Coastguard Workerlet Predicates = [FeaturePopulationCount], Defs = [CC] in { 1634*9880d681SAndroid Build Coastguard Worker def POPCNT : InstRRE<0xB9E1, (outs GR64:$R1), (ins GR64:$R2), 1635*9880d681SAndroid Build Coastguard Worker "popcnt\t$R1, $R2", 1636*9880d681SAndroid Build Coastguard Worker [(set GR64:$R1, (z_popcnt GR64:$R2))]>; 1637*9880d681SAndroid Build Coastguard Worker} 1638*9880d681SAndroid Build Coastguard Worker 1639*9880d681SAndroid Build Coastguard Worker// Use subregs to populate the "don't care" bits in a 32-bit to 64-bit anyext. 1640*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (anyext GR32:$src)), 1641*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (i64 (IMPLICIT_DEF)), GR32:$src, subreg_l32)>; 1642*9880d681SAndroid Build Coastguard Worker 1643*9880d681SAndroid Build Coastguard Worker// Extend GR32s and GR64s to GR128s. 1644*9880d681SAndroid Build Coastguard Workerlet usesCustomInserter = 1 in { 1645*9880d681SAndroid Build Coastguard Worker def AEXT128_64 : Pseudo<(outs GR128:$dst), (ins GR64:$src), []>; 1646*9880d681SAndroid Build Coastguard Worker def ZEXT128_32 : Pseudo<(outs GR128:$dst), (ins GR32:$src), []>; 1647*9880d681SAndroid Build Coastguard Worker def ZEXT128_64 : Pseudo<(outs GR128:$dst), (ins GR64:$src), []>; 1648*9880d681SAndroid Build Coastguard Worker} 1649*9880d681SAndroid Build Coastguard Worker 1650*9880d681SAndroid Build Coastguard Worker// Search a block of memory for a character. 1651*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, Defs = [CC] in 1652*9880d681SAndroid Build Coastguard Worker defm SRST : StringRRE<"srst", 0xb25e, z_search_string>; 1653*9880d681SAndroid Build Coastguard Worker 1654*9880d681SAndroid Build Coastguard Worker// Other instructions for inline assembly 1655*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 1, Defs = [CC], isCall = 1 in 1656*9880d681SAndroid Build Coastguard Worker def SVC : InstI<0x0A, (outs), (ins imm32zx8:$I1), 1657*9880d681SAndroid Build Coastguard Worker "svc\t$I1", 1658*9880d681SAndroid Build Coastguard Worker []>; 1659*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 1, Defs = [CC], mayStore = 1 in 1660*9880d681SAndroid Build Coastguard Worker def STCK : InstS<0xB205, (outs), (ins bdaddr12only:$BD2), 1661*9880d681SAndroid Build Coastguard Worker "stck\t$BD2", 1662*9880d681SAndroid Build Coastguard Worker []>; 1663*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 1, Defs = [CC], mayStore = 1 in 1664*9880d681SAndroid Build Coastguard Worker def STCKF : InstS<0xB27C, (outs), (ins bdaddr12only:$BD2), 1665*9880d681SAndroid Build Coastguard Worker "stckf\t$BD2", 1666*9880d681SAndroid Build Coastguard Worker []>; 1667*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 1, Defs = [CC], mayStore = 1 in 1668*9880d681SAndroid Build Coastguard Worker def STCKE : InstS<0xB278, (outs), (ins bdaddr12only:$BD2), 1669*9880d681SAndroid Build Coastguard Worker "stcke\t$BD2", 1670*9880d681SAndroid Build Coastguard Worker []>; 1671*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 1, Defs = [CC], mayStore = 1 in 1672*9880d681SAndroid Build Coastguard Worker def STFLE : InstS<0xB2B0, (outs), (ins bdaddr12only:$BD2), 1673*9880d681SAndroid Build Coastguard Worker "stfle\t$BD2", 1674*9880d681SAndroid Build Coastguard Worker []>; 1675*9880d681SAndroid Build Coastguard Worker 1676*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 1 in { 1677*9880d681SAndroid Build Coastguard Worker def EX : InstRX<0x44, (outs), (ins GR64:$R1, bdxaddr12only:$XBD2), 1678*9880d681SAndroid Build Coastguard Worker "ex\t$R1, $XBD2", []>; 1679*9880d681SAndroid Build Coastguard Worker def EXRL : InstRIL<0xC60, (outs), (ins GR64:$R1, pcrel32:$I2), 1680*9880d681SAndroid Build Coastguard Worker "exrl\t$R1, $I2", []>; 1681*9880d681SAndroid Build Coastguard Worker} 1682*9880d681SAndroid Build Coastguard Worker 1683*9880d681SAndroid Build Coastguard Worker 1684*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1685*9880d681SAndroid Build Coastguard Worker// Peepholes. 1686*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1687*9880d681SAndroid Build Coastguard Worker 1688*9880d681SAndroid Build Coastguard Worker// Use AL* for GR64 additions of unsigned 32-bit values. 1689*9880d681SAndroid Build Coastguard Workerdefm : ZXB<add, GR64, ALGFR>; 1690*9880d681SAndroid Build Coastguard Workerdef : Pat<(add GR64:$src1, imm64zx32:$src2), 1691*9880d681SAndroid Build Coastguard Worker (ALGFI GR64:$src1, imm64zx32:$src2)>; 1692*9880d681SAndroid Build Coastguard Workerdef : Pat<(add GR64:$src1, (azextloadi32 bdxaddr20only:$addr)), 1693*9880d681SAndroid Build Coastguard Worker (ALGF GR64:$src1, bdxaddr20only:$addr)>; 1694*9880d681SAndroid Build Coastguard Worker 1695*9880d681SAndroid Build Coastguard Worker// Use SL* for GR64 subtractions of unsigned 32-bit values. 1696*9880d681SAndroid Build Coastguard Workerdefm : ZXB<sub, GR64, SLGFR>; 1697*9880d681SAndroid Build Coastguard Workerdef : Pat<(add GR64:$src1, imm64zx32n:$src2), 1698*9880d681SAndroid Build Coastguard Worker (SLGFI GR64:$src1, imm64zx32n:$src2)>; 1699*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GR64:$src1, (azextloadi32 bdxaddr20only:$addr)), 1700*9880d681SAndroid Build Coastguard Worker (SLGF GR64:$src1, bdxaddr20only:$addr)>; 1701*9880d681SAndroid Build Coastguard Worker 1702*9880d681SAndroid Build Coastguard Worker// Optimize sign-extended 1/0 selects to -1/0 selects. This is important 1703*9880d681SAndroid Build Coastguard Worker// for vector legalization. 1704*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra (shl (i32 (z_select_ccmask 1, 0, imm32zx4:$valid, imm32zx4:$cc)), 1705*9880d681SAndroid Build Coastguard Worker (i32 31)), 1706*9880d681SAndroid Build Coastguard Worker (i32 31)), 1707*9880d681SAndroid Build Coastguard Worker (Select32 (LHI -1), (LHI 0), imm32zx4:$valid, imm32zx4:$cc)>; 1708*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra (shl (i64 (anyext (i32 (z_select_ccmask 1, 0, imm32zx4:$valid, 1709*9880d681SAndroid Build Coastguard Worker imm32zx4:$cc)))), 1710*9880d681SAndroid Build Coastguard Worker (i32 63)), 1711*9880d681SAndroid Build Coastguard Worker (i32 63)), 1712*9880d681SAndroid Build Coastguard Worker (Select64 (LGHI -1), (LGHI 0), imm32zx4:$valid, imm32zx4:$cc)>; 1713*9880d681SAndroid Build Coastguard Worker 1714*9880d681SAndroid Build Coastguard Worker// Avoid generating 2 XOR instructions. (xor (and x, y), y) is 1715*9880d681SAndroid Build Coastguard Worker// equivalent to (and (xor x, -1), y) 1716*9880d681SAndroid Build Coastguard Workerdef : Pat<(and (xor GR64:$x, (i64 -1)), GR64:$y), 1717*9880d681SAndroid Build Coastguard Worker (XGR GR64:$y, (NGR GR64:$y, GR64:$x))>; 1718*9880d681SAndroid Build Coastguard Worker 1719*9880d681SAndroid Build Coastguard Worker// Shift/rotate instructions only use the last 6 bits of the second operand 1720*9880d681SAndroid Build Coastguard Worker// register, so we can safely use NILL (16 fewer bits than NILF) to only AND the 1721*9880d681SAndroid Build Coastguard Worker// last 16 bits. 1722*9880d681SAndroid Build Coastguard Worker// Complexity is added so that we match this before we match NILF on the AND 1723*9880d681SAndroid Build Coastguard Worker// operation alone. 1724*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 4 in { 1725*9880d681SAndroid Build Coastguard Worker def : Pat<(shl GR32:$val, (and GR32:$shift, uimm32:$imm)), 1726*9880d681SAndroid Build Coastguard Worker (SLL GR32:$val, (NILL GR32:$shift, uimm32:$imm), 0)>; 1727*9880d681SAndroid Build Coastguard Worker 1728*9880d681SAndroid Build Coastguard Worker def : Pat<(sra GR32:$val, (and GR32:$shift, uimm32:$imm)), 1729*9880d681SAndroid Build Coastguard Worker (SRA GR32:$val, (NILL GR32:$shift, uimm32:$imm), 0)>; 1730*9880d681SAndroid Build Coastguard Worker 1731*9880d681SAndroid Build Coastguard Worker def : Pat<(srl GR32:$val, (and GR32:$shift, uimm32:$imm)), 1732*9880d681SAndroid Build Coastguard Worker (SRL GR32:$val, (NILL GR32:$shift, uimm32:$imm), 0)>; 1733*9880d681SAndroid Build Coastguard Worker 1734*9880d681SAndroid Build Coastguard Worker def : Pat<(shl GR64:$val, (and GR32:$shift, uimm32:$imm)), 1735*9880d681SAndroid Build Coastguard Worker (SLLG GR64:$val, (NILL GR32:$shift, uimm32:$imm), 0)>; 1736*9880d681SAndroid Build Coastguard Worker 1737*9880d681SAndroid Build Coastguard Worker def : Pat<(sra GR64:$val, (and GR32:$shift, uimm32:$imm)), 1738*9880d681SAndroid Build Coastguard Worker (SRAG GR64:$val, (NILL GR32:$shift, uimm32:$imm), 0)>; 1739*9880d681SAndroid Build Coastguard Worker 1740*9880d681SAndroid Build Coastguard Worker def : Pat<(srl GR64:$val, (and GR32:$shift, uimm32:$imm)), 1741*9880d681SAndroid Build Coastguard Worker (SRLG GR64:$val, (NILL GR32:$shift, uimm32:$imm), 0)>; 1742*9880d681SAndroid Build Coastguard Worker 1743*9880d681SAndroid Build Coastguard Worker def : Pat<(rotl GR32:$val, (and GR32:$shift, uimm32:$imm)), 1744*9880d681SAndroid Build Coastguard Worker (RLL GR32:$val, (NILL GR32:$shift, uimm32:$imm), 0)>; 1745*9880d681SAndroid Build Coastguard Worker 1746*9880d681SAndroid Build Coastguard Worker def : Pat<(rotl GR64:$val, (and GR32:$shift, uimm32:$imm)), 1747*9880d681SAndroid Build Coastguard Worker (RLLG GR64:$val, (NILL GR32:$shift, uimm32:$imm), 0)>; 1748*9880d681SAndroid Build Coastguard Worker} 1749*9880d681SAndroid Build Coastguard Worker 1750*9880d681SAndroid Build Coastguard Worker// Peepholes for turning scalar operations into block operations. 1751*9880d681SAndroid Build Coastguard Workerdefm : BlockLoadStore<anyextloadi8, i32, MVCSequence, NCSequence, OCSequence, 1752*9880d681SAndroid Build Coastguard Worker XCSequence, 1>; 1753*9880d681SAndroid Build Coastguard Workerdefm : BlockLoadStore<anyextloadi16, i32, MVCSequence, NCSequence, OCSequence, 1754*9880d681SAndroid Build Coastguard Worker XCSequence, 2>; 1755*9880d681SAndroid Build Coastguard Workerdefm : BlockLoadStore<load, i32, MVCSequence, NCSequence, OCSequence, 1756*9880d681SAndroid Build Coastguard Worker XCSequence, 4>; 1757*9880d681SAndroid Build Coastguard Workerdefm : BlockLoadStore<anyextloadi8, i64, MVCSequence, NCSequence, 1758*9880d681SAndroid Build Coastguard Worker OCSequence, XCSequence, 1>; 1759*9880d681SAndroid Build Coastguard Workerdefm : BlockLoadStore<anyextloadi16, i64, MVCSequence, NCSequence, OCSequence, 1760*9880d681SAndroid Build Coastguard Worker XCSequence, 2>; 1761*9880d681SAndroid Build Coastguard Workerdefm : BlockLoadStore<anyextloadi32, i64, MVCSequence, NCSequence, OCSequence, 1762*9880d681SAndroid Build Coastguard Worker XCSequence, 4>; 1763*9880d681SAndroid Build Coastguard Workerdefm : BlockLoadStore<load, i64, MVCSequence, NCSequence, OCSequence, 1764*9880d681SAndroid Build Coastguard Worker XCSequence, 8>; 1765