1*9880d681SAndroid Build Coastguard Worker//==- HexagonInstrInfo.td - Target Description for Hexagon -*- tablegen -*-===// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker// 10*9880d681SAndroid Build Coastguard Worker// This file describes the Hexagon instructions in TableGen format. 11*9880d681SAndroid Build Coastguard Worker// 12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerinclude "HexagonInstrFormats.td" 15*9880d681SAndroid Build Coastguard Workerinclude "HexagonOperands.td" 16*9880d681SAndroid Build Coastguard Workerinclude "HexagonInstrEnc.td" 17*9880d681SAndroid Build Coastguard Worker// Pattern fragment that combines the value type and the register class 18*9880d681SAndroid Build Coastguard Worker// into a single parameter. 19*9880d681SAndroid Build Coastguard Worker// The pat frags in the definitions below need to have a named register, 20*9880d681SAndroid Build Coastguard Worker// otherwise i32 will be assumed regardless of the register class. The 21*9880d681SAndroid Build Coastguard Worker// name of the register does not matter. 22*9880d681SAndroid Build Coastguard Workerdef I1 : PatLeaf<(i1 PredRegs:$R)>; 23*9880d681SAndroid Build Coastguard Workerdef I32 : PatLeaf<(i32 IntRegs:$R)>; 24*9880d681SAndroid Build Coastguard Workerdef I64 : PatLeaf<(i64 DoubleRegs:$R)>; 25*9880d681SAndroid Build Coastguard Workerdef F32 : PatLeaf<(f32 IntRegs:$R)>; 26*9880d681SAndroid Build Coastguard Workerdef F64 : PatLeaf<(f64 DoubleRegs:$R)>; 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker// Pattern fragments to extract the low and high subregisters from a 29*9880d681SAndroid Build Coastguard Worker// 64-bit value. 30*9880d681SAndroid Build Coastguard Workerdef LoReg: OutPatFrag<(ops node:$Rs), 31*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (i64 $Rs), subreg_loreg)>; 32*9880d681SAndroid Build Coastguard Workerdef HiReg: OutPatFrag<(ops node:$Rs), 33*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (i64 $Rs), subreg_hireg)>; 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker// SDNode for converting immediate C to C-1. 36*9880d681SAndroid Build Coastguard Workerdef DEC_CONST_SIGNED : SDNodeXForm<imm, [{ 37*9880d681SAndroid Build Coastguard Worker // Return the byte immediate const-1 as an SDNode. 38*9880d681SAndroid Build Coastguard Worker int32_t imm = N->getSExtValue(); 39*9880d681SAndroid Build Coastguard Worker return XformSToSM1Imm(imm, SDLoc(N)); 40*9880d681SAndroid Build Coastguard Worker}]>; 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker// SDNode for converting immediate C to C-2. 43*9880d681SAndroid Build Coastguard Workerdef DEC2_CONST_SIGNED : SDNodeXForm<imm, [{ 44*9880d681SAndroid Build Coastguard Worker // Return the byte immediate const-2 as an SDNode. 45*9880d681SAndroid Build Coastguard Worker int32_t imm = N->getSExtValue(); 46*9880d681SAndroid Build Coastguard Worker return XformSToSM2Imm(imm, SDLoc(N)); 47*9880d681SAndroid Build Coastguard Worker}]>; 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker// SDNode for converting immediate C to C-3. 50*9880d681SAndroid Build Coastguard Workerdef DEC3_CONST_SIGNED : SDNodeXForm<imm, [{ 51*9880d681SAndroid Build Coastguard Worker // Return the byte immediate const-3 as an SDNode. 52*9880d681SAndroid Build Coastguard Worker int32_t imm = N->getSExtValue(); 53*9880d681SAndroid Build Coastguard Worker return XformSToSM3Imm(imm, SDLoc(N)); 54*9880d681SAndroid Build Coastguard Worker}]>; 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker// SDNode for converting immediate C to C-1. 57*9880d681SAndroid Build Coastguard Workerdef DEC_CONST_UNSIGNED : SDNodeXForm<imm, [{ 58*9880d681SAndroid Build Coastguard Worker // Return the byte immediate const-1 as an SDNode. 59*9880d681SAndroid Build Coastguard Worker uint32_t imm = N->getZExtValue(); 60*9880d681SAndroid Build Coastguard Worker return XformUToUM1Imm(imm, SDLoc(N)); 61*9880d681SAndroid Build Coastguard Worker}]>; 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 64*9880d681SAndroid Build Coastguard Worker// Compare 65*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 66*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, isCompare = 1, InputType = "imm", isExtendable = 1, 67*9880d681SAndroid Build Coastguard Worker opExtendable = 2 in 68*9880d681SAndroid Build Coastguard Workerclass T_CMP <string mnemonic, bits<2> MajOp, bit isNot, Operand ImmOp> 69*9880d681SAndroid Build Coastguard Worker : ALU32Inst <(outs PredRegs:$dst), 70*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$src1, ImmOp:$src2), 71*9880d681SAndroid Build Coastguard Worker "$dst = "#!if(isNot, "!","")#mnemonic#"($src1, #$src2)", 72*9880d681SAndroid Build Coastguard Worker [], "",ALU32_2op_tc_2early_SLOT0123 >, ImmRegRel { 73*9880d681SAndroid Build Coastguard Worker bits<2> dst; 74*9880d681SAndroid Build Coastguard Worker bits<5> src1; 75*9880d681SAndroid Build Coastguard Worker bits<10> src2; 76*9880d681SAndroid Build Coastguard Worker let CextOpcode = mnemonic; 77*9880d681SAndroid Build Coastguard Worker let opExtentBits = !if(!eq(mnemonic, "cmp.gtu"), 9, 10); 78*9880d681SAndroid Build Coastguard Worker let isExtentSigned = !if(!eq(mnemonic, "cmp.gtu"), 0, 1); 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker let IClass = 0b0111; 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0101; 83*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = MajOp; 84*9880d681SAndroid Build Coastguard Worker let Inst{21} = !if(!eq(mnemonic, "cmp.gtu"), 0, src2{9}); 85*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src1; 86*9880d681SAndroid Build Coastguard Worker let Inst{13-5} = src2{8-0}; 87*9880d681SAndroid Build Coastguard Worker let Inst{4} = isNot; 88*9880d681SAndroid Build Coastguard Worker let Inst{3-2} = 0b00; 89*9880d681SAndroid Build Coastguard Worker let Inst{1-0} = dst; 90*9880d681SAndroid Build Coastguard Worker } 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerdef C2_cmpeqi : T_CMP <"cmp.eq", 0b00, 0, s10Ext>; 93*9880d681SAndroid Build Coastguard Workerdef C2_cmpgti : T_CMP <"cmp.gt", 0b01, 0, s10Ext>; 94*9880d681SAndroid Build Coastguard Workerdef C2_cmpgtui : T_CMP <"cmp.gtu", 0b10, 0, u9Ext>; 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Workerclass T_CMP_pat <InstHexagon MI, PatFrag OpNode, PatLeaf ImmPred> 97*9880d681SAndroid Build Coastguard Worker : Pat<(i1 (OpNode (i32 IntRegs:$src1), ImmPred:$src2)), 98*9880d681SAndroid Build Coastguard Worker (MI IntRegs:$src1, ImmPred:$src2)>; 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Workerdef : T_CMP_pat <C2_cmpeqi, seteq, s10ImmPred>; 101*9880d681SAndroid Build Coastguard Workerdef : T_CMP_pat <C2_cmpgti, setgt, s10ImmPred>; 102*9880d681SAndroid Build Coastguard Workerdef : T_CMP_pat <C2_cmpgtui, setugt, u9ImmPred>; 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 105*9880d681SAndroid Build Coastguard Worker// ALU32/ALU + 106*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 107*9880d681SAndroid Build Coastguard Worker// Add. 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Workerdef SDT_Int32Leaf : SDTypeProfile<1, 0, [SDTCisVT<0, i32>]>; 110*9880d681SAndroid Build Coastguard Workerdef SDT_Int32Unary : SDTypeProfile<1, 1, [SDTCisVT<0, i32>, SDTCisVT<1, i32>]>; 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Workerdef SDTHexagonI64I32I32 : SDTypeProfile<1, 2, 113*9880d681SAndroid Build Coastguard Worker [SDTCisVT<0, i64>, SDTCisVT<1, i32>, SDTCisSameAs<1, 2>]>; 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerdef HexagonCOMBINE : SDNode<"HexagonISD::COMBINE", SDTHexagonI64I32I32>; 116*9880d681SAndroid Build Coastguard Workerdef HexagonPACKHL : SDNode<"HexagonISD::PACKHL", SDTHexagonI64I32I32>; 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, hasNewValue = 1, InputType = "reg" in 119*9880d681SAndroid Build Coastguard Workerclass T_ALU32_3op<string mnemonic, bits<3> MajOp, bits<3> MinOp, bit OpsRev, 120*9880d681SAndroid Build Coastguard Worker bit IsComm> 121*9880d681SAndroid Build Coastguard Worker : ALU32_rr<(outs IntRegs:$Rd), (ins IntRegs:$Rs, IntRegs:$Rt), 122*9880d681SAndroid Build Coastguard Worker "$Rd = "#mnemonic#"($Rs, $Rt)", 123*9880d681SAndroid Build Coastguard Worker [], "", ALU32_3op_tc_1_SLOT0123>, ImmRegRel, PredRel { 124*9880d681SAndroid Build Coastguard Worker let isCommutable = IsComm; 125*9880d681SAndroid Build Coastguard Worker let BaseOpcode = mnemonic#_rr; 126*9880d681SAndroid Build Coastguard Worker let CextOpcode = mnemonic; 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 129*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 130*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker let IClass = 0b1111; 133*9880d681SAndroid Build Coastguard Worker let Inst{27} = 0b0; 134*9880d681SAndroid Build Coastguard Worker let Inst{26-24} = MajOp; 135*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MinOp; 136*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = !if(OpsRev,Rt,Rs); 137*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = !if(OpsRev,Rs,Rt); 138*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 139*9880d681SAndroid Build Coastguard Worker} 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, hasNewValue = 1 in 142*9880d681SAndroid Build Coastguard Workerclass T_ALU32_3op_pred<string mnemonic, bits<3> MajOp, bits<3> MinOp, 143*9880d681SAndroid Build Coastguard Worker bit OpsRev, bit PredNot, bit PredNew> 144*9880d681SAndroid Build Coastguard Worker : ALU32_rr<(outs IntRegs:$Rd), (ins PredRegs:$Pu, IntRegs:$Rs, IntRegs:$Rt), 145*9880d681SAndroid Build Coastguard Worker "if ("#!if(PredNot,"!","")#"$Pu"#!if(PredNew,".new","")#") "# 146*9880d681SAndroid Build Coastguard Worker "$Rd = "#mnemonic#"($Rs, $Rt)", 147*9880d681SAndroid Build Coastguard Worker [], "", ALU32_3op_tc_1_SLOT0123>, ImmRegRel, PredNewRel { 148*9880d681SAndroid Build Coastguard Worker let isPredicated = 1; 149*9880d681SAndroid Build Coastguard Worker let isPredicatedFalse = PredNot; 150*9880d681SAndroid Build Coastguard Worker let isPredicatedNew = PredNew; 151*9880d681SAndroid Build Coastguard Worker let BaseOpcode = mnemonic#_rr; 152*9880d681SAndroid Build Coastguard Worker let CextOpcode = mnemonic; 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker bits<2> Pu; 155*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 156*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 157*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Worker let IClass = 0b1111; 160*9880d681SAndroid Build Coastguard Worker let Inst{27} = 0b1; 161*9880d681SAndroid Build Coastguard Worker let Inst{26-24} = MajOp; 162*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MinOp; 163*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = !if(OpsRev,Rt,Rs); 164*9880d681SAndroid Build Coastguard Worker let Inst{13} = PredNew; 165*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = !if(OpsRev,Rs,Rt); 166*9880d681SAndroid Build Coastguard Worker let Inst{7} = PredNot; 167*9880d681SAndroid Build Coastguard Worker let Inst{6-5} = Pu; 168*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Workerclass T_ALU32_combineh<string Op1, string Op2, bits<3> MajOp, bits<3> MinOp, 172*9880d681SAndroid Build Coastguard Worker bit OpsRev> 173*9880d681SAndroid Build Coastguard Worker : T_ALU32_3op<"", MajOp, MinOp, OpsRev, 0> { 174*9880d681SAndroid Build Coastguard Worker let AsmString = "$Rd = combine($Rs"#Op1#", $Rt"#Op2#")"; 175*9880d681SAndroid Build Coastguard Worker} 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerdef A2_combine_hh : T_ALU32_combineh<".h", ".h", 0b011, 0b100, 1>; 178*9880d681SAndroid Build Coastguard Workerdef A2_combine_hl : T_ALU32_combineh<".h", ".l", 0b011, 0b101, 1>; 179*9880d681SAndroid Build Coastguard Workerdef A2_combine_lh : T_ALU32_combineh<".l", ".h", 0b011, 0b110, 1>; 180*9880d681SAndroid Build Coastguard Workerdef A2_combine_ll : T_ALU32_combineh<".l", ".l", 0b011, 0b111, 1>; 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Workerclass T_ALU32_3op_sfx<string mnemonic, string suffix, bits<3> MajOp, 183*9880d681SAndroid Build Coastguard Worker bits<3> MinOp, bit OpsRev, bit IsComm> 184*9880d681SAndroid Build Coastguard Worker : T_ALU32_3op<"", MajOp, MinOp, OpsRev, IsComm> { 185*9880d681SAndroid Build Coastguard Worker let AsmString = "$Rd = "#mnemonic#"($Rs, $Rt)"#suffix; 186*9880d681SAndroid Build Coastguard Worker} 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Workerdef A2_svaddh : T_ALU32_3op<"vaddh", 0b110, 0b000, 0, 1>; 189*9880d681SAndroid Build Coastguard Workerdef A2_svsubh : T_ALU32_3op<"vsubh", 0b110, 0b100, 1, 0>; 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Workerlet Defs = [USR_OVF], Itinerary = ALU32_3op_tc_2_SLOT0123 in { 192*9880d681SAndroid Build Coastguard Worker def A2_svaddhs : T_ALU32_3op_sfx<"vaddh", ":sat", 0b110, 0b001, 0, 1>; 193*9880d681SAndroid Build Coastguard Worker def A2_addsat : T_ALU32_3op_sfx<"add", ":sat", 0b110, 0b010, 0, 1>; 194*9880d681SAndroid Build Coastguard Worker def A2_svadduhs : T_ALU32_3op_sfx<"vadduh", ":sat", 0b110, 0b011, 0, 1>; 195*9880d681SAndroid Build Coastguard Worker def A2_svsubhs : T_ALU32_3op_sfx<"vsubh", ":sat", 0b110, 0b101, 1, 0>; 196*9880d681SAndroid Build Coastguard Worker def A2_subsat : T_ALU32_3op_sfx<"sub", ":sat", 0b110, 0b110, 1, 0>; 197*9880d681SAndroid Build Coastguard Worker def A2_svsubuhs : T_ALU32_3op_sfx<"vsubuh", ":sat", 0b110, 0b111, 1, 0>; 198*9880d681SAndroid Build Coastguard Worker} 199*9880d681SAndroid Build Coastguard Worker 200*9880d681SAndroid Build Coastguard Workerlet Itinerary = ALU32_3op_tc_2_SLOT0123 in 201*9880d681SAndroid Build Coastguard Workerdef A2_svavghs : T_ALU32_3op_sfx<"vavgh", ":rnd", 0b111, 0b001, 0, 1>; 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Workerdef A2_svavgh : T_ALU32_3op<"vavgh", 0b111, 0b000, 0, 1>; 204*9880d681SAndroid Build Coastguard Workerdef A2_svnavgh : T_ALU32_3op<"vnavgh", 0b111, 0b011, 1, 0>; 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Workermulticlass T_ALU32_3op_p<string mnemonic, bits<3> MajOp, bits<3> MinOp, 207*9880d681SAndroid Build Coastguard Worker bit OpsRev> { 208*9880d681SAndroid Build Coastguard Worker def t : T_ALU32_3op_pred<mnemonic, MajOp, MinOp, OpsRev, 0, 0>; 209*9880d681SAndroid Build Coastguard Worker def f : T_ALU32_3op_pred<mnemonic, MajOp, MinOp, OpsRev, 1, 0>; 210*9880d681SAndroid Build Coastguard Worker def tnew : T_ALU32_3op_pred<mnemonic, MajOp, MinOp, OpsRev, 0, 1>; 211*9880d681SAndroid Build Coastguard Worker def fnew : T_ALU32_3op_pred<mnemonic, MajOp, MinOp, OpsRev, 1, 1>; 212*9880d681SAndroid Build Coastguard Worker} 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Workermulticlass T_ALU32_3op_A2<string mnemonic, bits<3> MajOp, bits<3> MinOp, 215*9880d681SAndroid Build Coastguard Worker bit OpsRev, bit IsComm> { 216*9880d681SAndroid Build Coastguard Worker let isPredicable = 1 in 217*9880d681SAndroid Build Coastguard Worker def A2_#NAME : T_ALU32_3op <mnemonic, MajOp, MinOp, OpsRev, IsComm>; 218*9880d681SAndroid Build Coastguard Worker defm A2_p#NAME : T_ALU32_3op_p<mnemonic, MajOp, MinOp, OpsRev>; 219*9880d681SAndroid Build Coastguard Worker} 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Workerdefm add : T_ALU32_3op_A2<"add", 0b011, 0b000, 0, 1>; 222*9880d681SAndroid Build Coastguard Workerdefm and : T_ALU32_3op_A2<"and", 0b001, 0b000, 0, 1>; 223*9880d681SAndroid Build Coastguard Workerdefm or : T_ALU32_3op_A2<"or", 0b001, 0b001, 0, 1>; 224*9880d681SAndroid Build Coastguard Workerdefm sub : T_ALU32_3op_A2<"sub", 0b011, 0b001, 1, 0>; 225*9880d681SAndroid Build Coastguard Workerdefm xor : T_ALU32_3op_A2<"xor", 0b001, 0b011, 0, 1>; 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Worker// Pats for instruction selection. 228*9880d681SAndroid Build Coastguard Workerclass BinOp32_pat<SDNode Op, InstHexagon MI, ValueType ResT> 229*9880d681SAndroid Build Coastguard Worker : Pat<(ResT (Op (i32 IntRegs:$Rs), (i32 IntRegs:$Rt))), 230*9880d681SAndroid Build Coastguard Worker (ResT (MI IntRegs:$Rs, IntRegs:$Rt))>; 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Workerdef: BinOp32_pat<add, A2_add, i32>; 233*9880d681SAndroid Build Coastguard Workerdef: BinOp32_pat<and, A2_and, i32>; 234*9880d681SAndroid Build Coastguard Workerdef: BinOp32_pat<or, A2_or, i32>; 235*9880d681SAndroid Build Coastguard Workerdef: BinOp32_pat<sub, A2_sub, i32>; 236*9880d681SAndroid Build Coastguard Workerdef: BinOp32_pat<xor, A2_xor, i32>; 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Worker// A few special cases producing register pairs: 239*9880d681SAndroid Build Coastguard Workerlet OutOperandList = (outs DoubleRegs:$Rd), hasNewValue = 0 in { 240*9880d681SAndroid Build Coastguard Worker def S2_packhl : T_ALU32_3op <"packhl", 0b101, 0b100, 0, 0>; 241*9880d681SAndroid Build Coastguard Worker 242*9880d681SAndroid Build Coastguard Worker let isPredicable = 1 in 243*9880d681SAndroid Build Coastguard Worker def A2_combinew : T_ALU32_3op <"combine", 0b101, 0b000, 0, 0>; 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Worker // Conditional combinew uses "newt/f" instead of "t/fnew". 246*9880d681SAndroid Build Coastguard Worker def C2_ccombinewt : T_ALU32_3op_pred<"combine", 0b101, 0b000, 0, 0, 0>; 247*9880d681SAndroid Build Coastguard Worker def C2_ccombinewf : T_ALU32_3op_pred<"combine", 0b101, 0b000, 0, 1, 0>; 248*9880d681SAndroid Build Coastguard Worker def C2_ccombinewnewt : T_ALU32_3op_pred<"combine", 0b101, 0b000, 0, 0, 1>; 249*9880d681SAndroid Build Coastguard Worker def C2_ccombinewnewf : T_ALU32_3op_pred<"combine", 0b101, 0b000, 0, 1, 1>; 250*9880d681SAndroid Build Coastguard Worker} 251*9880d681SAndroid Build Coastguard Worker 252*9880d681SAndroid Build Coastguard Workerdef: BinOp32_pat<HexagonCOMBINE, A2_combinew, i64>; 253*9880d681SAndroid Build Coastguard Workerdef: BinOp32_pat<HexagonPACKHL, S2_packhl, i64>; 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, hasNewValue = 1, isCompare = 1, InputType = "reg" in 256*9880d681SAndroid Build Coastguard Workerclass T_ALU32_3op_cmp<string mnemonic, bits<2> MinOp, bit IsNeg, bit IsComm> 257*9880d681SAndroid Build Coastguard Worker : ALU32_rr<(outs PredRegs:$Pd), (ins IntRegs:$Rs, IntRegs:$Rt), 258*9880d681SAndroid Build Coastguard Worker "$Pd = "#mnemonic#"($Rs, $Rt)", 259*9880d681SAndroid Build Coastguard Worker [], "", ALU32_3op_tc_1_SLOT0123>, ImmRegRel { 260*9880d681SAndroid Build Coastguard Worker let CextOpcode = mnemonic; 261*9880d681SAndroid Build Coastguard Worker let isCommutable = IsComm; 262*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 263*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 264*9880d681SAndroid Build Coastguard Worker bits<2> Pd; 265*9880d681SAndroid Build Coastguard Worker 266*9880d681SAndroid Build Coastguard Worker let IClass = 0b1111; 267*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0010; 268*9880d681SAndroid Build Coastguard Worker let Inst{22-21} = MinOp; 269*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 270*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 271*9880d681SAndroid Build Coastguard Worker let Inst{4} = IsNeg; 272*9880d681SAndroid Build Coastguard Worker let Inst{3-2} = 0b00; 273*9880d681SAndroid Build Coastguard Worker let Inst{1-0} = Pd; 274*9880d681SAndroid Build Coastguard Worker} 275*9880d681SAndroid Build Coastguard Worker 276*9880d681SAndroid Build Coastguard Workerlet Itinerary = ALU32_3op_tc_2early_SLOT0123 in { 277*9880d681SAndroid Build Coastguard Worker def C2_cmpeq : T_ALU32_3op_cmp< "cmp.eq", 0b00, 0, 1>; 278*9880d681SAndroid Build Coastguard Worker def C2_cmpgt : T_ALU32_3op_cmp< "cmp.gt", 0b10, 0, 0>; 279*9880d681SAndroid Build Coastguard Worker def C2_cmpgtu : T_ALU32_3op_cmp< "cmp.gtu", 0b11, 0, 0>; 280*9880d681SAndroid Build Coastguard Worker} 281*9880d681SAndroid Build Coastguard Worker 282*9880d681SAndroid Build Coastguard Worker// Patfrag to convert the usual comparison patfrags (e.g. setlt) to ones 283*9880d681SAndroid Build Coastguard Worker// that reverse the order of the operands. 284*9880d681SAndroid Build Coastguard Workerclass RevCmp<PatFrag F> : PatFrag<(ops node:$rhs, node:$lhs), F.Fragment>; 285*9880d681SAndroid Build Coastguard Worker 286*9880d681SAndroid Build Coastguard Worker// Pats for compares. They use PatFrags as operands, not SDNodes, 287*9880d681SAndroid Build Coastguard Worker// since seteq/setgt/etc. are defined as ParFrags. 288*9880d681SAndroid Build Coastguard Workerclass T_cmp32_rr_pat<InstHexagon MI, PatFrag Op, ValueType VT> 289*9880d681SAndroid Build Coastguard Worker : Pat<(VT (Op (i32 IntRegs:$Rs), (i32 IntRegs:$Rt))), 290*9880d681SAndroid Build Coastguard Worker (VT (MI IntRegs:$Rs, IntRegs:$Rt))>; 291*9880d681SAndroid Build Coastguard Worker 292*9880d681SAndroid Build Coastguard Workerdef: T_cmp32_rr_pat<C2_cmpeq, seteq, i1>; 293*9880d681SAndroid Build Coastguard Workerdef: T_cmp32_rr_pat<C2_cmpgt, setgt, i1>; 294*9880d681SAndroid Build Coastguard Workerdef: T_cmp32_rr_pat<C2_cmpgtu, setugt, i1>; 295*9880d681SAndroid Build Coastguard Worker 296*9880d681SAndroid Build Coastguard Workerdef: T_cmp32_rr_pat<C2_cmpgt, RevCmp<setlt>, i1>; 297*9880d681SAndroid Build Coastguard Workerdef: T_cmp32_rr_pat<C2_cmpgtu, RevCmp<setult>, i1>; 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Workerlet CextOpcode = "MUX", InputType = "reg", hasNewValue = 1 in 300*9880d681SAndroid Build Coastguard Workerdef C2_mux: ALU32_rr<(outs IntRegs:$Rd), 301*9880d681SAndroid Build Coastguard Worker (ins PredRegs:$Pu, IntRegs:$Rs, IntRegs:$Rt), 302*9880d681SAndroid Build Coastguard Worker "$Rd = mux($Pu, $Rs, $Rt)", [], "", ALU32_3op_tc_1_SLOT0123>, ImmRegRel { 303*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 304*9880d681SAndroid Build Coastguard Worker bits<2> Pu; 305*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 306*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 307*9880d681SAndroid Build Coastguard Worker 308*9880d681SAndroid Build Coastguard Worker let CextOpcode = "mux"; 309*9880d681SAndroid Build Coastguard Worker let InputType = "reg"; 310*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0; 311*9880d681SAndroid Build Coastguard Worker let IClass = 0b1111; 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0100; 314*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 315*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 316*9880d681SAndroid Build Coastguard Worker let Inst{6-5} = Pu; 317*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 318*9880d681SAndroid Build Coastguard Worker} 319*9880d681SAndroid Build Coastguard Worker 320*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (select (i1 PredRegs:$Pu), (i32 IntRegs:$Rs), (i32 IntRegs:$Rt))), 321*9880d681SAndroid Build Coastguard Worker (C2_mux PredRegs:$Pu, IntRegs:$Rs, IntRegs:$Rt)>; 322*9880d681SAndroid Build Coastguard Worker 323*9880d681SAndroid Build Coastguard Worker// Combines the two immediates into a double register. 324*9880d681SAndroid Build Coastguard Worker// Increase complexity to make it greater than any complexity of a combine 325*9880d681SAndroid Build Coastguard Worker// that involves a register. 326*9880d681SAndroid Build Coastguard Worker 327*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isMoveImm = 1, isAsCheapAsAMove = 1, 328*9880d681SAndroid Build Coastguard Worker isExtentSigned = 1, isExtendable = 1, opExtentBits = 8, opExtendable = 1, 329*9880d681SAndroid Build Coastguard Worker AddedComplexity = 75 in 330*9880d681SAndroid Build Coastguard Workerdef A2_combineii: ALU32Inst <(outs DoubleRegs:$Rdd), (ins s8Ext:$s8, s8Imm:$S8), 331*9880d681SAndroid Build Coastguard Worker "$Rdd = combine(#$s8, #$S8)", 332*9880d681SAndroid Build Coastguard Worker [(set (i64 DoubleRegs:$Rdd), 333*9880d681SAndroid Build Coastguard Worker (i64 (HexagonCOMBINE(i32 s32ImmPred:$s8), (i32 s8ImmPred:$S8))))]> { 334*9880d681SAndroid Build Coastguard Worker bits<5> Rdd; 335*9880d681SAndroid Build Coastguard Worker bits<8> s8; 336*9880d681SAndroid Build Coastguard Worker bits<8> S8; 337*9880d681SAndroid Build Coastguard Worker 338*9880d681SAndroid Build Coastguard Worker let IClass = 0b0111; 339*9880d681SAndroid Build Coastguard Worker let Inst{27-23} = 0b11000; 340*9880d681SAndroid Build Coastguard Worker let Inst{22-16} = S8{7-1}; 341*9880d681SAndroid Build Coastguard Worker let Inst{13} = S8{0}; 342*9880d681SAndroid Build Coastguard Worker let Inst{12-5} = s8; 343*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rdd; 344*9880d681SAndroid Build Coastguard Worker } 345*9880d681SAndroid Build Coastguard Worker 346*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 347*9880d681SAndroid Build Coastguard Worker// Template class for predicated ADD of a reg and an Immediate value. 348*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 349*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, hasSideEffects = 0 in 350*9880d681SAndroid Build Coastguard Workerclass T_Addri_Pred <bit PredNot, bit PredNew> 351*9880d681SAndroid Build Coastguard Worker : ALU32_ri <(outs IntRegs:$Rd), 352*9880d681SAndroid Build Coastguard Worker (ins PredRegs:$Pu, IntRegs:$Rs, s8Ext:$s8), 353*9880d681SAndroid Build Coastguard Worker !if(PredNot, "if (!$Pu", "if ($Pu")#!if(PredNew,".new) $Rd = ", 354*9880d681SAndroid Build Coastguard Worker ") $Rd = ")#"add($Rs, #$s8)"> { 355*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 356*9880d681SAndroid Build Coastguard Worker bits<2> Pu; 357*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 358*9880d681SAndroid Build Coastguard Worker bits<8> s8; 359*9880d681SAndroid Build Coastguard Worker 360*9880d681SAndroid Build Coastguard Worker let isPredicatedNew = PredNew; 361*9880d681SAndroid Build Coastguard Worker let IClass = 0b0111; 362*9880d681SAndroid Build Coastguard Worker 363*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0100; 364*9880d681SAndroid Build Coastguard Worker let Inst{23} = PredNot; 365*9880d681SAndroid Build Coastguard Worker let Inst{22-21} = Pu; 366*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 367*9880d681SAndroid Build Coastguard Worker let Inst{13} = PredNew; 368*9880d681SAndroid Build Coastguard Worker let Inst{12-5} = s8; 369*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 370*9880d681SAndroid Build Coastguard Worker } 371*9880d681SAndroid Build Coastguard Worker 372*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 373*9880d681SAndroid Build Coastguard Worker// A2_addi: Add a signed immediate to a register. 374*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 375*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, hasSideEffects = 0 in 376*9880d681SAndroid Build Coastguard Workerclass T_Addri <Operand immOp> 377*9880d681SAndroid Build Coastguard Worker : ALU32_ri <(outs IntRegs:$Rd), 378*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$Rs, immOp:$s16), 379*9880d681SAndroid Build Coastguard Worker "$Rd = add($Rs, #$s16)", [], "", ALU32_ADDI_tc_1_SLOT0123> { 380*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 381*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 382*9880d681SAndroid Build Coastguard Worker bits<16> s16; 383*9880d681SAndroid Build Coastguard Worker 384*9880d681SAndroid Build Coastguard Worker let IClass = 0b1011; 385*9880d681SAndroid Build Coastguard Worker 386*9880d681SAndroid Build Coastguard Worker let Inst{27-21} = s16{15-9}; 387*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 388*9880d681SAndroid Build Coastguard Worker let Inst{13-5} = s16{8-0}; 389*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 390*9880d681SAndroid Build Coastguard Worker } 391*9880d681SAndroid Build Coastguard Worker 392*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 393*9880d681SAndroid Build Coastguard Worker// Multiclass for ADD of a register and an immediate value. 394*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 395*9880d681SAndroid Build Coastguard Workermulticlass Addri_Pred<string mnemonic, bit PredNot> { 396*9880d681SAndroid Build Coastguard Worker let isPredicatedFalse = PredNot in { 397*9880d681SAndroid Build Coastguard Worker def NAME : T_Addri_Pred<PredNot, 0>; 398*9880d681SAndroid Build Coastguard Worker // Predicate new 399*9880d681SAndroid Build Coastguard Worker def NAME#new : T_Addri_Pred<PredNot, 1>; 400*9880d681SAndroid Build Coastguard Worker } 401*9880d681SAndroid Build Coastguard Worker} 402*9880d681SAndroid Build Coastguard Worker 403*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, isExtentSigned = 1, InputType = "imm" in 404*9880d681SAndroid Build Coastguard Workermulticlass Addri_base<string mnemonic, SDNode OpNode> { 405*9880d681SAndroid Build Coastguard Worker let CextOpcode = mnemonic, BaseOpcode = mnemonic#_ri in { 406*9880d681SAndroid Build Coastguard Worker let opExtendable = 2, opExtentBits = 16, isPredicable = 1 in 407*9880d681SAndroid Build Coastguard Worker def A2_#NAME : T_Addri<s16Ext>; 408*9880d681SAndroid Build Coastguard Worker 409*9880d681SAndroid Build Coastguard Worker let opExtendable = 3, opExtentBits = 8, isPredicated = 1 in { 410*9880d681SAndroid Build Coastguard Worker defm A2_p#NAME#t : Addri_Pred<mnemonic, 0>; 411*9880d681SAndroid Build Coastguard Worker defm A2_p#NAME#f : Addri_Pred<mnemonic, 1>; 412*9880d681SAndroid Build Coastguard Worker } 413*9880d681SAndroid Build Coastguard Worker } 414*9880d681SAndroid Build Coastguard Worker} 415*9880d681SAndroid Build Coastguard Worker 416*9880d681SAndroid Build Coastguard Workerdefm addi : Addri_base<"add", add>, ImmRegRel, PredNewRel; 417*9880d681SAndroid Build Coastguard Worker 418*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (add I32:$Rs, s32ImmPred:$s16)), 419*9880d681SAndroid Build Coastguard Worker (i32 (A2_addi I32:$Rs, imm:$s16))>; 420*9880d681SAndroid Build Coastguard Worker 421*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, hasSideEffects = 0, isPseudo = 1 in 422*9880d681SAndroid Build Coastguard Workerdef A2_iconst 423*9880d681SAndroid Build Coastguard Worker : ALU32_ri <(outs IntRegs:$Rd), 424*9880d681SAndroid Build Coastguard Worker (ins s23_2Imm:$s23_2), 425*9880d681SAndroid Build Coastguard Worker "$Rd = iconst(#$s23_2)"> {} 426*9880d681SAndroid Build Coastguard Worker 427*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 428*9880d681SAndroid Build Coastguard Worker// Template class used for the following ALU32 instructions. 429*9880d681SAndroid Build Coastguard Worker// Rd=and(Rs,#s10) 430*9880d681SAndroid Build Coastguard Worker// Rd=or(Rs,#s10) 431*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 432*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, opExtendable = 2, isExtentSigned = 1, opExtentBits = 10, 433*9880d681SAndroid Build Coastguard WorkerInputType = "imm", hasNewValue = 1 in 434*9880d681SAndroid Build Coastguard Workerclass T_ALU32ri_logical <string mnemonic, SDNode OpNode, bits<2> MinOp> 435*9880d681SAndroid Build Coastguard Worker : ALU32_ri <(outs IntRegs:$Rd), 436*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$Rs, s10Ext:$s10), 437*9880d681SAndroid Build Coastguard Worker "$Rd = "#mnemonic#"($Rs, #$s10)" , 438*9880d681SAndroid Build Coastguard Worker [(set (i32 IntRegs:$Rd), (OpNode (i32 IntRegs:$Rs), s32ImmPred:$s10))]> { 439*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 440*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 441*9880d681SAndroid Build Coastguard Worker bits<10> s10; 442*9880d681SAndroid Build Coastguard Worker let CextOpcode = mnemonic; 443*9880d681SAndroid Build Coastguard Worker 444*9880d681SAndroid Build Coastguard Worker let IClass = 0b0111; 445*9880d681SAndroid Build Coastguard Worker 446*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0110; 447*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = MinOp; 448*9880d681SAndroid Build Coastguard Worker let Inst{21} = s10{9}; 449*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 450*9880d681SAndroid Build Coastguard Worker let Inst{13-5} = s10{8-0}; 451*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 452*9880d681SAndroid Build Coastguard Worker } 453*9880d681SAndroid Build Coastguard Worker 454*9880d681SAndroid Build Coastguard Workerdef A2_orir : T_ALU32ri_logical<"or", or, 0b10>, ImmRegRel; 455*9880d681SAndroid Build Coastguard Workerdef A2_andir : T_ALU32ri_logical<"and", and, 0b00>, ImmRegRel; 456*9880d681SAndroid Build Coastguard Worker 457*9880d681SAndroid Build Coastguard Worker// Subtract register from immediate 458*9880d681SAndroid Build Coastguard Worker// Rd32=sub(#s10,Rs32) 459*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, CextOpcode = "sub", opExtendable = 1, isExtentSigned = 1, 460*9880d681SAndroid Build Coastguard Worker opExtentBits = 10, InputType = "imm", hasNewValue = 1, hasSideEffects = 0 in 461*9880d681SAndroid Build Coastguard Workerdef A2_subri: ALU32_ri <(outs IntRegs:$Rd), (ins s10Ext:$s10, IntRegs:$Rs), 462*9880d681SAndroid Build Coastguard Worker "$Rd = sub(#$s10, $Rs)", []>, ImmRegRel { 463*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 464*9880d681SAndroid Build Coastguard Worker bits<10> s10; 465*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 466*9880d681SAndroid Build Coastguard Worker 467*9880d681SAndroid Build Coastguard Worker let IClass = 0b0111; 468*9880d681SAndroid Build Coastguard Worker 469*9880d681SAndroid Build Coastguard Worker let Inst{27-22} = 0b011001; 470*9880d681SAndroid Build Coastguard Worker let Inst{21} = s10{9}; 471*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 472*9880d681SAndroid Build Coastguard Worker let Inst{13-5} = s10{8-0}; 473*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 474*9880d681SAndroid Build Coastguard Worker } 475*9880d681SAndroid Build Coastguard Worker 476*9880d681SAndroid Build Coastguard Worker// Nop. 477*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 478*9880d681SAndroid Build Coastguard Workerdef A2_nop: ALU32Inst <(outs), (ins), "nop" > { 479*9880d681SAndroid Build Coastguard Worker let IClass = 0b0111; 480*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1111; 481*9880d681SAndroid Build Coastguard Worker} 482*9880d681SAndroid Build Coastguard Worker 483*9880d681SAndroid Build Coastguard Workerdef: Pat<(sub s32ImmPred:$s10, IntRegs:$Rs), 484*9880d681SAndroid Build Coastguard Worker (A2_subri imm:$s10, IntRegs:$Rs)>; 485*9880d681SAndroid Build Coastguard Worker 486*9880d681SAndroid Build Coastguard Worker// Rd = not(Rs) gets mapped to Rd=sub(#-1, Rs). 487*9880d681SAndroid Build Coastguard Workerdef: Pat<(not (i32 IntRegs:$src1)), 488*9880d681SAndroid Build Coastguard Worker (A2_subri -1, IntRegs:$src1)>; 489*9880d681SAndroid Build Coastguard Worker 490*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, hasNewValue = 1 in 491*9880d681SAndroid Build Coastguard Workerclass T_tfr16<bit isHi> 492*9880d681SAndroid Build Coastguard Worker : ALU32Inst <(outs IntRegs:$Rx), (ins IntRegs:$src1, u16Imm:$u16), 493*9880d681SAndroid Build Coastguard Worker "$Rx"#!if(isHi, ".h", ".l")#" = #$u16", 494*9880d681SAndroid Build Coastguard Worker [], "$src1 = $Rx" > { 495*9880d681SAndroid Build Coastguard Worker bits<5> Rx; 496*9880d681SAndroid Build Coastguard Worker bits<16> u16; 497*9880d681SAndroid Build Coastguard Worker 498*9880d681SAndroid Build Coastguard Worker let IClass = 0b0111; 499*9880d681SAndroid Build Coastguard Worker let Inst{27-26} = 0b00; 500*9880d681SAndroid Build Coastguard Worker let Inst{25-24} = !if(isHi, 0b10, 0b01); 501*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = u16{15-14}; 502*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0b1; 503*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rx; 504*9880d681SAndroid Build Coastguard Worker let Inst{13-0} = u16{13-0}; 505*9880d681SAndroid Build Coastguard Worker } 506*9880d681SAndroid Build Coastguard Worker 507*9880d681SAndroid Build Coastguard Workerdef A2_tfril: T_tfr16<0>; 508*9880d681SAndroid Build Coastguard Workerdef A2_tfrih: T_tfr16<1>; 509*9880d681SAndroid Build Coastguard Worker 510*9880d681SAndroid Build Coastguard Worker// Conditional transfer is an alias to conditional "Rd = add(Rs, #0)". 511*9880d681SAndroid Build Coastguard Workerlet isPredicated = 1, hasNewValue = 1, opNewValue = 0 in 512*9880d681SAndroid Build Coastguard Workerclass T_tfr_pred<bit isPredNot, bit isPredNew> 513*9880d681SAndroid Build Coastguard Worker : ALU32Inst<(outs IntRegs:$dst), 514*9880d681SAndroid Build Coastguard Worker (ins PredRegs:$src1, IntRegs:$src2), 515*9880d681SAndroid Build Coastguard Worker "if ("#!if(isPredNot, "!", "")# 516*9880d681SAndroid Build Coastguard Worker "$src1"#!if(isPredNew, ".new", "")# 517*9880d681SAndroid Build Coastguard Worker ") $dst = $src2"> { 518*9880d681SAndroid Build Coastguard Worker bits<5> dst; 519*9880d681SAndroid Build Coastguard Worker bits<2> src1; 520*9880d681SAndroid Build Coastguard Worker bits<5> src2; 521*9880d681SAndroid Build Coastguard Worker 522*9880d681SAndroid Build Coastguard Worker let isPredicatedFalse = isPredNot; 523*9880d681SAndroid Build Coastguard Worker let isPredicatedNew = isPredNew; 524*9880d681SAndroid Build Coastguard Worker let IClass = 0b0111; 525*9880d681SAndroid Build Coastguard Worker 526*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0100; 527*9880d681SAndroid Build Coastguard Worker let Inst{23} = isPredNot; 528*9880d681SAndroid Build Coastguard Worker let Inst{13} = isPredNew; 529*9880d681SAndroid Build Coastguard Worker let Inst{12-5} = 0; 530*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 531*9880d681SAndroid Build Coastguard Worker let Inst{22-21} = src1; 532*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src2; 533*9880d681SAndroid Build Coastguard Worker } 534*9880d681SAndroid Build Coastguard Worker 535*9880d681SAndroid Build Coastguard Workerlet isPredicable = 1 in 536*9880d681SAndroid Build Coastguard Workerclass T_tfr : ALU32Inst<(outs IntRegs:$dst), (ins IntRegs:$src), 537*9880d681SAndroid Build Coastguard Worker "$dst = $src"> { 538*9880d681SAndroid Build Coastguard Worker bits<5> dst; 539*9880d681SAndroid Build Coastguard Worker bits<5> src; 540*9880d681SAndroid Build Coastguard Worker 541*9880d681SAndroid Build Coastguard Worker let IClass = 0b0111; 542*9880d681SAndroid Build Coastguard Worker 543*9880d681SAndroid Build Coastguard Worker let Inst{27-21} = 0b0000011; 544*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src; 545*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 546*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 547*9880d681SAndroid Build Coastguard Worker } 548*9880d681SAndroid Build Coastguard Worker 549*9880d681SAndroid Build Coastguard Workerlet InputType = "reg", hasNewValue = 1, hasSideEffects = 0 in 550*9880d681SAndroid Build Coastguard Workermulticlass tfr_base<string CextOp> { 551*9880d681SAndroid Build Coastguard Worker let CextOpcode = CextOp, BaseOpcode = CextOp in { 552*9880d681SAndroid Build Coastguard Worker def NAME : T_tfr; 553*9880d681SAndroid Build Coastguard Worker 554*9880d681SAndroid Build Coastguard Worker // Predicate 555*9880d681SAndroid Build Coastguard Worker def t : T_tfr_pred<0, 0>; 556*9880d681SAndroid Build Coastguard Worker def f : T_tfr_pred<1, 0>; 557*9880d681SAndroid Build Coastguard Worker // Predicate new 558*9880d681SAndroid Build Coastguard Worker def tnew : T_tfr_pred<0, 1>; 559*9880d681SAndroid Build Coastguard Worker def fnew : T_tfr_pred<1, 1>; 560*9880d681SAndroid Build Coastguard Worker } 561*9880d681SAndroid Build Coastguard Worker} 562*9880d681SAndroid Build Coastguard Worker 563*9880d681SAndroid Build Coastguard Worker// Assembler mapped to C2_ccombinew[t|f|newt|newf]. 564*9880d681SAndroid Build Coastguard Worker// Please don't add bits to this instruction as it'll be converted into 565*9880d681SAndroid Build Coastguard Worker// 'combine' before object code emission. 566*9880d681SAndroid Build Coastguard Workerlet isPredicated = 1 in 567*9880d681SAndroid Build Coastguard Workerclass T_tfrp_pred<bit PredNot, bit PredNew> 568*9880d681SAndroid Build Coastguard Worker : ALU32_rr <(outs DoubleRegs:$dst), 569*9880d681SAndroid Build Coastguard Worker (ins PredRegs:$src1, DoubleRegs:$src2), 570*9880d681SAndroid Build Coastguard Worker "if ("#!if(PredNot, "!", "")#"$src1" 571*9880d681SAndroid Build Coastguard Worker #!if(PredNew, ".new", "")#") $dst = $src2" > { 572*9880d681SAndroid Build Coastguard Worker let isPredicatedFalse = PredNot; 573*9880d681SAndroid Build Coastguard Worker let isPredicatedNew = PredNew; 574*9880d681SAndroid Build Coastguard Worker } 575*9880d681SAndroid Build Coastguard Worker 576*9880d681SAndroid Build Coastguard Worker// Assembler mapped to A2_combinew. 577*9880d681SAndroid Build Coastguard Worker// Please don't add bits to this instruction as it'll be converted into 578*9880d681SAndroid Build Coastguard Worker// 'combine' before object code emission. 579*9880d681SAndroid Build Coastguard Workerclass T_tfrp : ALU32Inst <(outs DoubleRegs:$dst), 580*9880d681SAndroid Build Coastguard Worker (ins DoubleRegs:$src), 581*9880d681SAndroid Build Coastguard Worker "$dst = $src">; 582*9880d681SAndroid Build Coastguard Worker 583*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 584*9880d681SAndroid Build Coastguard Workermulticlass TFR64_base<string BaseName> { 585*9880d681SAndroid Build Coastguard Worker let BaseOpcode = BaseName in { 586*9880d681SAndroid Build Coastguard Worker let isPredicable = 1 in 587*9880d681SAndroid Build Coastguard Worker def NAME : T_tfrp; 588*9880d681SAndroid Build Coastguard Worker // Predicate 589*9880d681SAndroid Build Coastguard Worker def t : T_tfrp_pred <0, 0>; 590*9880d681SAndroid Build Coastguard Worker def f : T_tfrp_pred <1, 0>; 591*9880d681SAndroid Build Coastguard Worker // Predicate new 592*9880d681SAndroid Build Coastguard Worker def tnew : T_tfrp_pred <0, 1>; 593*9880d681SAndroid Build Coastguard Worker def fnew : T_tfrp_pred <1, 1>; 594*9880d681SAndroid Build Coastguard Worker } 595*9880d681SAndroid Build Coastguard Worker} 596*9880d681SAndroid Build Coastguard Worker 597*9880d681SAndroid Build Coastguard Workerlet InputType = "imm", isExtendable = 1, isExtentSigned = 1, opExtentBits = 12, 598*9880d681SAndroid Build Coastguard Worker isMoveImm = 1, opExtendable = 2, BaseOpcode = "TFRI", CextOpcode = "TFR", 599*9880d681SAndroid Build Coastguard Worker hasSideEffects = 0, isPredicated = 1, hasNewValue = 1 in 600*9880d681SAndroid Build Coastguard Workerclass T_TFRI_Pred<bit PredNot, bit PredNew> 601*9880d681SAndroid Build Coastguard Worker : ALU32_ri<(outs IntRegs:$Rd), (ins PredRegs:$Pu, s12Ext:$s12), 602*9880d681SAndroid Build Coastguard Worker "if ("#!if(PredNot,"!","")#"$Pu"#!if(PredNew,".new","")#") $Rd = #$s12", 603*9880d681SAndroid Build Coastguard Worker [], "", ALU32_2op_tc_1_SLOT0123>, ImmRegRel, PredNewRel { 604*9880d681SAndroid Build Coastguard Worker let isPredicatedFalse = PredNot; 605*9880d681SAndroid Build Coastguard Worker let isPredicatedNew = PredNew; 606*9880d681SAndroid Build Coastguard Worker 607*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 608*9880d681SAndroid Build Coastguard Worker bits<2> Pu; 609*9880d681SAndroid Build Coastguard Worker bits<12> s12; 610*9880d681SAndroid Build Coastguard Worker 611*9880d681SAndroid Build Coastguard Worker let IClass = 0b0111; 612*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1110; 613*9880d681SAndroid Build Coastguard Worker let Inst{23} = PredNot; 614*9880d681SAndroid Build Coastguard Worker let Inst{22-21} = Pu; 615*9880d681SAndroid Build Coastguard Worker let Inst{20} = 0b0; 616*9880d681SAndroid Build Coastguard Worker let Inst{19-16,12-5} = s12; 617*9880d681SAndroid Build Coastguard Worker let Inst{13} = PredNew; 618*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 619*9880d681SAndroid Build Coastguard Worker} 620*9880d681SAndroid Build Coastguard Worker 621*9880d681SAndroid Build Coastguard Workerdef C2_cmoveit : T_TFRI_Pred<0, 0>; 622*9880d681SAndroid Build Coastguard Workerdef C2_cmoveif : T_TFRI_Pred<1, 0>; 623*9880d681SAndroid Build Coastguard Workerdef C2_cmovenewit : T_TFRI_Pred<0, 1>; 624*9880d681SAndroid Build Coastguard Workerdef C2_cmovenewif : T_TFRI_Pred<1, 1>; 625*9880d681SAndroid Build Coastguard Worker 626*9880d681SAndroid Build Coastguard Workerlet InputType = "imm", isExtendable = 1, isExtentSigned = 1, 627*9880d681SAndroid Build Coastguard Worker CextOpcode = "TFR", BaseOpcode = "TFRI", hasNewValue = 1, opNewValue = 0, 628*9880d681SAndroid Build Coastguard Worker isAsCheapAsAMove = 1 , opExtendable = 1, opExtentBits = 16, isMoveImm = 1, 629*9880d681SAndroid Build Coastguard Worker isPredicated = 0, isPredicable = 1, isReMaterializable = 1 in 630*9880d681SAndroid Build Coastguard Workerdef A2_tfrsi : ALU32Inst<(outs IntRegs:$Rd), (ins s16Ext:$s16), "$Rd = #$s16", 631*9880d681SAndroid Build Coastguard Worker [(set (i32 IntRegs:$Rd), s32ImmPred:$s16)], "", ALU32_2op_tc_1_SLOT0123>, 632*9880d681SAndroid Build Coastguard Worker ImmRegRel, PredRel { 633*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 634*9880d681SAndroid Build Coastguard Worker bits<16> s16; 635*9880d681SAndroid Build Coastguard Worker 636*9880d681SAndroid Build Coastguard Worker let IClass = 0b0111; 637*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1000; 638*9880d681SAndroid Build Coastguard Worker let Inst{23-22,20-16,13-5} = s16; 639*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 640*9880d681SAndroid Build Coastguard Worker} 641*9880d681SAndroid Build Coastguard Worker 642*9880d681SAndroid Build Coastguard Workerdefm A2_tfr : tfr_base<"TFR">, ImmRegRel, PredNewRel; 643*9880d681SAndroid Build Coastguard Workerlet isAsmParserOnly = 1 in 644*9880d681SAndroid Build Coastguard Workerdefm A2_tfrp : TFR64_base<"TFR64">, PredNewRel; 645*9880d681SAndroid Build Coastguard Worker 646*9880d681SAndroid Build Coastguard Worker// Assembler mapped 647*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isMoveImm = 1, isAsCheapAsAMove = 1, 648*9880d681SAndroid Build Coastguard Worker isAsmParserOnly = 1 in 649*9880d681SAndroid Build Coastguard Workerdef A2_tfrpi : ALU64_rr<(outs DoubleRegs:$dst), (ins s8Imm64:$src1), 650*9880d681SAndroid Build Coastguard Worker "$dst = #$src1", 651*9880d681SAndroid Build Coastguard Worker [(set (i64 DoubleRegs:$dst), s8Imm64Pred:$src1)]>; 652*9880d681SAndroid Build Coastguard Worker 653*9880d681SAndroid Build Coastguard Worker// TODO: see if this instruction can be deleted.. 654*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, opExtendable = 1, opExtentBits = 6, 655*9880d681SAndroid Build Coastguard Worker isAsmParserOnly = 1 in { 656*9880d681SAndroid Build Coastguard Workerdef TFRI64_V4 : ALU64_rr<(outs DoubleRegs:$dst), (ins u64Imm:$src1), 657*9880d681SAndroid Build Coastguard Worker "$dst = #$src1">; 658*9880d681SAndroid Build Coastguard Workerdef TFRI64_V2_ext : ALU64_rr<(outs DoubleRegs:$dst), 659*9880d681SAndroid Build Coastguard Worker (ins s8Ext:$src1, s8Imm:$src2), 660*9880d681SAndroid Build Coastguard Worker "$dst = combine(##$src1, #$src2)">; 661*9880d681SAndroid Build Coastguard Worker} 662*9880d681SAndroid Build Coastguard Worker 663*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 664*9880d681SAndroid Build Coastguard Worker// ALU32/ALU - 665*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 666*9880d681SAndroid Build Coastguard Worker 667*9880d681SAndroid Build Coastguard Worker 668*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 669*9880d681SAndroid Build Coastguard Worker// ALU32/PERM + 670*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 671*9880d681SAndroid Build Coastguard Worker// Scalar mux register immediate. 672*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, isExtentSigned = 1, CextOpcode = "MUX", 673*9880d681SAndroid Build Coastguard Worker InputType = "imm", hasNewValue = 1, isExtendable = 1, opExtentBits = 8 in 674*9880d681SAndroid Build Coastguard Workerclass T_MUX1 <bit MajOp, dag ins, string AsmStr> 675*9880d681SAndroid Build Coastguard Worker : ALU32Inst <(outs IntRegs:$Rd), ins, AsmStr>, ImmRegRel { 676*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 677*9880d681SAndroid Build Coastguard Worker bits<2> Pu; 678*9880d681SAndroid Build Coastguard Worker bits<8> s8; 679*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 680*9880d681SAndroid Build Coastguard Worker 681*9880d681SAndroid Build Coastguard Worker let IClass = 0b0111; 682*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0011; 683*9880d681SAndroid Build Coastguard Worker let Inst{23} = MajOp; 684*9880d681SAndroid Build Coastguard Worker let Inst{22-21} = Pu; 685*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 686*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 687*9880d681SAndroid Build Coastguard Worker let Inst{12-5} = s8; 688*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 689*9880d681SAndroid Build Coastguard Worker} 690*9880d681SAndroid Build Coastguard Worker 691*9880d681SAndroid Build Coastguard Workerlet opExtendable = 2 in 692*9880d681SAndroid Build Coastguard Workerdef C2_muxri : T_MUX1<0b1, (ins PredRegs:$Pu, s8Ext:$s8, IntRegs:$Rs), 693*9880d681SAndroid Build Coastguard Worker "$Rd = mux($Pu, #$s8, $Rs)">; 694*9880d681SAndroid Build Coastguard Worker 695*9880d681SAndroid Build Coastguard Workerlet opExtendable = 3 in 696*9880d681SAndroid Build Coastguard Workerdef C2_muxir : T_MUX1<0b0, (ins PredRegs:$Pu, IntRegs:$Rs, s8Ext:$s8), 697*9880d681SAndroid Build Coastguard Worker "$Rd = mux($Pu, $Rs, #$s8)">; 698*9880d681SAndroid Build Coastguard Worker 699*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (select I1:$Pu, s32ImmPred:$s8, I32:$Rs)), 700*9880d681SAndroid Build Coastguard Worker (C2_muxri I1:$Pu, s32ImmPred:$s8, I32:$Rs)>; 701*9880d681SAndroid Build Coastguard Worker 702*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (select I1:$Pu, I32:$Rs, s32ImmPred:$s8)), 703*9880d681SAndroid Build Coastguard Worker (C2_muxir I1:$Pu, I32:$Rs, s32ImmPred:$s8)>; 704*9880d681SAndroid Build Coastguard Worker 705*9880d681SAndroid Build Coastguard Worker// C2_muxii: Scalar mux immediates. 706*9880d681SAndroid Build Coastguard Workerlet isExtentSigned = 1, hasNewValue = 1, isExtendable = 1, 707*9880d681SAndroid Build Coastguard Worker opExtentBits = 8, opExtendable = 2 in 708*9880d681SAndroid Build Coastguard Workerdef C2_muxii: ALU32Inst <(outs IntRegs:$Rd), 709*9880d681SAndroid Build Coastguard Worker (ins PredRegs:$Pu, s8Ext:$s8, s8Imm:$S8), 710*9880d681SAndroid Build Coastguard Worker "$Rd = mux($Pu, #$s8, #$S8)" , 711*9880d681SAndroid Build Coastguard Worker [(set (i32 IntRegs:$Rd), 712*9880d681SAndroid Build Coastguard Worker (i32 (select I1:$Pu, s32ImmPred:$s8, s8ImmPred:$S8)))] > { 713*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 714*9880d681SAndroid Build Coastguard Worker bits<2> Pu; 715*9880d681SAndroid Build Coastguard Worker bits<8> s8; 716*9880d681SAndroid Build Coastguard Worker bits<8> S8; 717*9880d681SAndroid Build Coastguard Worker 718*9880d681SAndroid Build Coastguard Worker let IClass = 0b0111; 719*9880d681SAndroid Build Coastguard Worker 720*9880d681SAndroid Build Coastguard Worker let Inst{27-25} = 0b101; 721*9880d681SAndroid Build Coastguard Worker let Inst{24-23} = Pu; 722*9880d681SAndroid Build Coastguard Worker let Inst{22-16} = S8{7-1}; 723*9880d681SAndroid Build Coastguard Worker let Inst{13} = S8{0}; 724*9880d681SAndroid Build Coastguard Worker let Inst{12-5} = s8; 725*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 726*9880d681SAndroid Build Coastguard Worker } 727*9880d681SAndroid Build Coastguard Worker 728*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, isPseudo = 1 in 729*9880d681SAndroid Build Coastguard Workerdef MUX64_rr : ALU64_rr<(outs DoubleRegs:$Rd), 730*9880d681SAndroid Build Coastguard Worker (ins PredRegs:$Pu, DoubleRegs:$Rs, DoubleRegs:$Rt), 731*9880d681SAndroid Build Coastguard Worker ".error \"should not emit\" ", []>; 732*9880d681SAndroid Build Coastguard Worker 733*9880d681SAndroid Build Coastguard Worker 734*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 735*9880d681SAndroid Build Coastguard Worker// template class for non-predicated alu32_2op instructions 736*9880d681SAndroid Build Coastguard Worker// - aslh, asrh, sxtb, sxth, zxth 737*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 738*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, opNewValue = 0 in 739*9880d681SAndroid Build Coastguard Workerclass T_ALU32_2op <string mnemonic, bits<3> minOp> : 740*9880d681SAndroid Build Coastguard Worker ALU32Inst <(outs IntRegs:$Rd), (ins IntRegs:$Rs), 741*9880d681SAndroid Build Coastguard Worker "$Rd = "#mnemonic#"($Rs)", [] > { 742*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 743*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 744*9880d681SAndroid Build Coastguard Worker 745*9880d681SAndroid Build Coastguard Worker let IClass = 0b0111; 746*9880d681SAndroid Build Coastguard Worker 747*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0000; 748*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = minOp; 749*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 750*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 751*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 752*9880d681SAndroid Build Coastguard Worker} 753*9880d681SAndroid Build Coastguard Worker 754*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 755*9880d681SAndroid Build Coastguard Worker// template class for predicated alu32_2op instructions 756*9880d681SAndroid Build Coastguard Worker// - aslh, asrh, sxtb, sxth, zxtb, zxth 757*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 758*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in 759*9880d681SAndroid Build Coastguard Workerclass T_ALU32_2op_Pred <string mnemonic, bits<3> minOp, bit isPredNot, 760*9880d681SAndroid Build Coastguard Worker bit isPredNew > : 761*9880d681SAndroid Build Coastguard Worker ALU32Inst <(outs IntRegs:$Rd), (ins PredRegs:$Pu, IntRegs:$Rs), 762*9880d681SAndroid Build Coastguard Worker !if(isPredNot, "if (!$Pu", "if ($Pu") 763*9880d681SAndroid Build Coastguard Worker #!if(isPredNew, ".new) ",") ")#"$Rd = "#mnemonic#"($Rs)"> { 764*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 765*9880d681SAndroid Build Coastguard Worker bits<2> Pu; 766*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 767*9880d681SAndroid Build Coastguard Worker 768*9880d681SAndroid Build Coastguard Worker let IClass = 0b0111; 769*9880d681SAndroid Build Coastguard Worker 770*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0000; 771*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = minOp; 772*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b1; 773*9880d681SAndroid Build Coastguard Worker let Inst{11} = isPredNot; 774*9880d681SAndroid Build Coastguard Worker let Inst{10} = isPredNew; 775*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 776*9880d681SAndroid Build Coastguard Worker let Inst{9-8} = Pu; 777*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 778*9880d681SAndroid Build Coastguard Worker} 779*9880d681SAndroid Build Coastguard Worker 780*9880d681SAndroid Build Coastguard Workermulticlass ALU32_2op_Pred<string mnemonic, bits<3> minOp, bit PredNot> { 781*9880d681SAndroid Build Coastguard Worker let isPredicatedFalse = PredNot in { 782*9880d681SAndroid Build Coastguard Worker def NAME : T_ALU32_2op_Pred<mnemonic, minOp, PredNot, 0>; 783*9880d681SAndroid Build Coastguard Worker 784*9880d681SAndroid Build Coastguard Worker // Predicate new 785*9880d681SAndroid Build Coastguard Worker let isPredicatedNew = 1 in 786*9880d681SAndroid Build Coastguard Worker def NAME#new : T_ALU32_2op_Pred<mnemonic, minOp, PredNot, 1>; 787*9880d681SAndroid Build Coastguard Worker } 788*9880d681SAndroid Build Coastguard Worker} 789*9880d681SAndroid Build Coastguard Worker 790*9880d681SAndroid Build Coastguard Workermulticlass ALU32_2op_base<string mnemonic, bits<3> minOp> { 791*9880d681SAndroid Build Coastguard Worker let BaseOpcode = mnemonic in { 792*9880d681SAndroid Build Coastguard Worker let isPredicable = 1, hasSideEffects = 0 in 793*9880d681SAndroid Build Coastguard Worker def A2_#NAME : T_ALU32_2op<mnemonic, minOp>; 794*9880d681SAndroid Build Coastguard Worker 795*9880d681SAndroid Build Coastguard Worker let isPredicated = 1, hasSideEffects = 0 in { 796*9880d681SAndroid Build Coastguard Worker defm A4_p#NAME#t : ALU32_2op_Pred<mnemonic, minOp, 0>; 797*9880d681SAndroid Build Coastguard Worker defm A4_p#NAME#f : ALU32_2op_Pred<mnemonic, minOp, 1>; 798*9880d681SAndroid Build Coastguard Worker } 799*9880d681SAndroid Build Coastguard Worker } 800*9880d681SAndroid Build Coastguard Worker} 801*9880d681SAndroid Build Coastguard Worker 802*9880d681SAndroid Build Coastguard Workerdefm aslh : ALU32_2op_base<"aslh", 0b000>, PredNewRel; 803*9880d681SAndroid Build Coastguard Workerdefm asrh : ALU32_2op_base<"asrh", 0b001>, PredNewRel; 804*9880d681SAndroid Build Coastguard Workerdefm sxtb : ALU32_2op_base<"sxtb", 0b101>, PredNewRel; 805*9880d681SAndroid Build Coastguard Workerdefm sxth : ALU32_2op_base<"sxth", 0b111>, PredNewRel; 806*9880d681SAndroid Build Coastguard Workerdefm zxth : ALU32_2op_base<"zxth", 0b110>, PredNewRel; 807*9880d681SAndroid Build Coastguard Worker 808*9880d681SAndroid Build Coastguard Worker// Rd=zxtb(Rs): assembler mapped to Rd=and(Rs,#255). 809*9880d681SAndroid Build Coastguard Worker// Compiler would want to generate 'zxtb' instead of 'and' becuase 'zxtb' has 810*9880d681SAndroid Build Coastguard Worker// predicated forms while 'and' doesn't. Since integrated assembler can't 811*9880d681SAndroid Build Coastguard Worker// handle 'mapped' instructions, we need to encode 'zxtb' same as 'and' where 812*9880d681SAndroid Build Coastguard Worker// immediate operand is set to '255'. 813*9880d681SAndroid Build Coastguard Worker 814*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, opNewValue = 0 in 815*9880d681SAndroid Build Coastguard Workerclass T_ZXTB: ALU32Inst < (outs IntRegs:$Rd), (ins IntRegs:$Rs), 816*9880d681SAndroid Build Coastguard Worker "$Rd = zxtb($Rs)", [] > { // Rd = and(Rs,255) 817*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 818*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 819*9880d681SAndroid Build Coastguard Worker bits<10> s10 = 255; 820*9880d681SAndroid Build Coastguard Worker 821*9880d681SAndroid Build Coastguard Worker let IClass = 0b0111; 822*9880d681SAndroid Build Coastguard Worker 823*9880d681SAndroid Build Coastguard Worker let Inst{27-22} = 0b011000; 824*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 825*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 826*9880d681SAndroid Build Coastguard Worker let Inst{21} = s10{9}; 827*9880d681SAndroid Build Coastguard Worker let Inst{13-5} = s10{8-0}; 828*9880d681SAndroid Build Coastguard Worker} 829*9880d681SAndroid Build Coastguard Worker 830*9880d681SAndroid Build Coastguard Worker//Rd=zxtb(Rs): assembler mapped to "Rd=and(Rs,#255) 831*9880d681SAndroid Build Coastguard Workermulticlass ZXTB_base <string mnemonic, bits<3> minOp> { 832*9880d681SAndroid Build Coastguard Worker let BaseOpcode = mnemonic in { 833*9880d681SAndroid Build Coastguard Worker let isPredicable = 1, hasSideEffects = 0 in 834*9880d681SAndroid Build Coastguard Worker def A2_#NAME : T_ZXTB; 835*9880d681SAndroid Build Coastguard Worker 836*9880d681SAndroid Build Coastguard Worker let isPredicated = 1, hasSideEffects = 0 in { 837*9880d681SAndroid Build Coastguard Worker defm A4_p#NAME#t : ALU32_2op_Pred<mnemonic, minOp, 0>; 838*9880d681SAndroid Build Coastguard Worker defm A4_p#NAME#f : ALU32_2op_Pred<mnemonic, minOp, 1>; 839*9880d681SAndroid Build Coastguard Worker } 840*9880d681SAndroid Build Coastguard Worker } 841*9880d681SAndroid Build Coastguard Worker} 842*9880d681SAndroid Build Coastguard Worker 843*9880d681SAndroid Build Coastguard Workerdefm zxtb : ZXTB_base<"zxtb",0b100>, PredNewRel; 844*9880d681SAndroid Build Coastguard Worker 845*9880d681SAndroid Build Coastguard Workerdef: Pat<(shl I32:$src1, (i32 16)), (A2_aslh I32:$src1)>; 846*9880d681SAndroid Build Coastguard Workerdef: Pat<(sra I32:$src1, (i32 16)), (A2_asrh I32:$src1)>; 847*9880d681SAndroid Build Coastguard Workerdef: Pat<(sext_inreg I32:$src1, i8), (A2_sxtb I32:$src1)>; 848*9880d681SAndroid Build Coastguard Workerdef: Pat<(sext_inreg I32:$src1, i16), (A2_sxth I32:$src1)>; 849*9880d681SAndroid Build Coastguard Worker 850*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 851*9880d681SAndroid Build Coastguard Worker// Template class for vector add and avg 852*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 853*9880d681SAndroid Build Coastguard Worker 854*9880d681SAndroid Build Coastguard Workerclass T_VectALU_64 <string opc, bits<3> majOp, bits<3> minOp, 855*9880d681SAndroid Build Coastguard Worker bit isSat, bit isRnd, bit isCrnd, bit SwapOps > 856*9880d681SAndroid Build Coastguard Worker : ALU64_rr < (outs DoubleRegs:$Rdd), 857*9880d681SAndroid Build Coastguard Worker (ins DoubleRegs:$Rss, DoubleRegs:$Rtt), 858*9880d681SAndroid Build Coastguard Worker "$Rdd = "#opc#"($Rss, $Rtt)"#!if(isRnd, ":rnd", "") 859*9880d681SAndroid Build Coastguard Worker #!if(isCrnd,":crnd","") 860*9880d681SAndroid Build Coastguard Worker #!if(isSat, ":sat", ""), 861*9880d681SAndroid Build Coastguard Worker [], "", ALU64_tc_2_SLOT23 > { 862*9880d681SAndroid Build Coastguard Worker bits<5> Rdd; 863*9880d681SAndroid Build Coastguard Worker bits<5> Rss; 864*9880d681SAndroid Build Coastguard Worker bits<5> Rtt; 865*9880d681SAndroid Build Coastguard Worker 866*9880d681SAndroid Build Coastguard Worker let IClass = 0b1101; 867*9880d681SAndroid Build Coastguard Worker 868*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0011; 869*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = majOp; 870*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = !if (SwapOps, Rtt, Rss); 871*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = !if (SwapOps, Rss, Rtt); 872*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = minOp; 873*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rdd; 874*9880d681SAndroid Build Coastguard Worker } 875*9880d681SAndroid Build Coastguard Worker 876*9880d681SAndroid Build Coastguard Worker// ALU64 - Vector add 877*9880d681SAndroid Build Coastguard Worker// Rdd=vadd[u][bhw](Rss,Rtt) 878*9880d681SAndroid Build Coastguard Workerlet Itinerary = ALU64_tc_1_SLOT23 in { 879*9880d681SAndroid Build Coastguard Worker def A2_vaddub : T_VectALU_64 < "vaddub", 0b000, 0b000, 0, 0, 0, 0>; 880*9880d681SAndroid Build Coastguard Worker def A2_vaddh : T_VectALU_64 < "vaddh", 0b000, 0b010, 0, 0, 0, 0>; 881*9880d681SAndroid Build Coastguard Worker def A2_vaddw : T_VectALU_64 < "vaddw", 0b000, 0b101, 0, 0, 0, 0>; 882*9880d681SAndroid Build Coastguard Worker} 883*9880d681SAndroid Build Coastguard Worker 884*9880d681SAndroid Build Coastguard Worker// Rdd=vadd[u][bhw](Rss,Rtt):sat 885*9880d681SAndroid Build Coastguard Workerlet Defs = [USR_OVF] in { 886*9880d681SAndroid Build Coastguard Worker def A2_vaddubs : T_VectALU_64 < "vaddub", 0b000, 0b001, 1, 0, 0, 0>; 887*9880d681SAndroid Build Coastguard Worker def A2_vaddhs : T_VectALU_64 < "vaddh", 0b000, 0b011, 1, 0, 0, 0>; 888*9880d681SAndroid Build Coastguard Worker def A2_vadduhs : T_VectALU_64 < "vadduh", 0b000, 0b100, 1, 0, 0, 0>; 889*9880d681SAndroid Build Coastguard Worker def A2_vaddws : T_VectALU_64 < "vaddw", 0b000, 0b110, 1, 0, 0, 0>; 890*9880d681SAndroid Build Coastguard Worker} 891*9880d681SAndroid Build Coastguard Worker 892*9880d681SAndroid Build Coastguard Worker// ALU64 - Vector average 893*9880d681SAndroid Build Coastguard Worker// Rdd=vavg[u][bhw](Rss,Rtt) 894*9880d681SAndroid Build Coastguard Workerlet Itinerary = ALU64_tc_1_SLOT23 in { 895*9880d681SAndroid Build Coastguard Worker def A2_vavgub : T_VectALU_64 < "vavgub", 0b010, 0b000, 0, 0, 0, 0>; 896*9880d681SAndroid Build Coastguard Worker def A2_vavgh : T_VectALU_64 < "vavgh", 0b010, 0b010, 0, 0, 0, 0>; 897*9880d681SAndroid Build Coastguard Worker def A2_vavguh : T_VectALU_64 < "vavguh", 0b010, 0b101, 0, 0, 0, 0>; 898*9880d681SAndroid Build Coastguard Worker def A2_vavgw : T_VectALU_64 < "vavgw", 0b011, 0b000, 0, 0, 0, 0>; 899*9880d681SAndroid Build Coastguard Worker def A2_vavguw : T_VectALU_64 < "vavguw", 0b011, 0b011, 0, 0, 0, 0>; 900*9880d681SAndroid Build Coastguard Worker} 901*9880d681SAndroid Build Coastguard Worker 902*9880d681SAndroid Build Coastguard Worker// Rdd=vavg[u][bhw](Rss,Rtt)[:rnd|:crnd] 903*9880d681SAndroid Build Coastguard Workerdef A2_vavgubr : T_VectALU_64 < "vavgub", 0b010, 0b001, 0, 1, 0, 0>; 904*9880d681SAndroid Build Coastguard Workerdef A2_vavghr : T_VectALU_64 < "vavgh", 0b010, 0b011, 0, 1, 0, 0>; 905*9880d681SAndroid Build Coastguard Workerdef A2_vavghcr : T_VectALU_64 < "vavgh", 0b010, 0b100, 0, 0, 1, 0>; 906*9880d681SAndroid Build Coastguard Workerdef A2_vavguhr : T_VectALU_64 < "vavguh", 0b010, 0b110, 0, 1, 0, 0>; 907*9880d681SAndroid Build Coastguard Worker 908*9880d681SAndroid Build Coastguard Workerdef A2_vavgwr : T_VectALU_64 < "vavgw", 0b011, 0b001, 0, 1, 0, 0>; 909*9880d681SAndroid Build Coastguard Workerdef A2_vavgwcr : T_VectALU_64 < "vavgw", 0b011, 0b010, 0, 0, 1, 0>; 910*9880d681SAndroid Build Coastguard Workerdef A2_vavguwr : T_VectALU_64 < "vavguw", 0b011, 0b100, 0, 1, 0, 0>; 911*9880d681SAndroid Build Coastguard Worker 912*9880d681SAndroid Build Coastguard Worker// Rdd=vnavg[bh](Rss,Rtt) 913*9880d681SAndroid Build Coastguard Workerlet Itinerary = ALU64_tc_1_SLOT23 in { 914*9880d681SAndroid Build Coastguard Worker def A2_vnavgh : T_VectALU_64 < "vnavgh", 0b100, 0b000, 0, 0, 0, 1>; 915*9880d681SAndroid Build Coastguard Worker def A2_vnavgw : T_VectALU_64 < "vnavgw", 0b100, 0b011, 0, 0, 0, 1>; 916*9880d681SAndroid Build Coastguard Worker} 917*9880d681SAndroid Build Coastguard Worker 918*9880d681SAndroid Build Coastguard Worker// Rdd=vnavg[bh](Rss,Rtt)[:rnd|:crnd]:sat 919*9880d681SAndroid Build Coastguard Workerlet Defs = [USR_OVF] in { 920*9880d681SAndroid Build Coastguard Worker def A2_vnavghr : T_VectALU_64 < "vnavgh", 0b100, 0b001, 1, 1, 0, 1>; 921*9880d681SAndroid Build Coastguard Worker def A2_vnavghcr : T_VectALU_64 < "vnavgh", 0b100, 0b010, 1, 0, 1, 1>; 922*9880d681SAndroid Build Coastguard Worker def A2_vnavgwr : T_VectALU_64 < "vnavgw", 0b100, 0b100, 1, 1, 0, 1>; 923*9880d681SAndroid Build Coastguard Worker def A2_vnavgwcr : T_VectALU_64 < "vnavgw", 0b100, 0b110, 1, 0, 1, 1>; 924*9880d681SAndroid Build Coastguard Worker} 925*9880d681SAndroid Build Coastguard Worker 926*9880d681SAndroid Build Coastguard Worker// Rdd=vsub[u][bh](Rss,Rtt) 927*9880d681SAndroid Build Coastguard Workerlet Itinerary = ALU64_tc_1_SLOT23 in { 928*9880d681SAndroid Build Coastguard Worker def A2_vsubub : T_VectALU_64 < "vsubub", 0b001, 0b000, 0, 0, 0, 1>; 929*9880d681SAndroid Build Coastguard Worker def A2_vsubh : T_VectALU_64 < "vsubh", 0b001, 0b010, 0, 0, 0, 1>; 930*9880d681SAndroid Build Coastguard Worker def A2_vsubw : T_VectALU_64 < "vsubw", 0b001, 0b101, 0, 0, 0, 1>; 931*9880d681SAndroid Build Coastguard Worker} 932*9880d681SAndroid Build Coastguard Worker 933*9880d681SAndroid Build Coastguard Worker// Rdd=vsub[u][bh](Rss,Rtt):sat 934*9880d681SAndroid Build Coastguard Workerlet Defs = [USR_OVF] in { 935*9880d681SAndroid Build Coastguard Worker def A2_vsububs : T_VectALU_64 < "vsubub", 0b001, 0b001, 1, 0, 0, 1>; 936*9880d681SAndroid Build Coastguard Worker def A2_vsubhs : T_VectALU_64 < "vsubh", 0b001, 0b011, 1, 0, 0, 1>; 937*9880d681SAndroid Build Coastguard Worker def A2_vsubuhs : T_VectALU_64 < "vsubuh", 0b001, 0b100, 1, 0, 0, 1>; 938*9880d681SAndroid Build Coastguard Worker def A2_vsubws : T_VectALU_64 < "vsubw", 0b001, 0b110, 1, 0, 0, 1>; 939*9880d681SAndroid Build Coastguard Worker} 940*9880d681SAndroid Build Coastguard Worker 941*9880d681SAndroid Build Coastguard Worker// Rdd=vmax[u][bhw](Rss,Rtt) 942*9880d681SAndroid Build Coastguard Workerdef A2_vmaxb : T_VectALU_64 < "vmaxb", 0b110, 0b110, 0, 0, 0, 1>; 943*9880d681SAndroid Build Coastguard Workerdef A2_vmaxub : T_VectALU_64 < "vmaxub", 0b110, 0b000, 0, 0, 0, 1>; 944*9880d681SAndroid Build Coastguard Workerdef A2_vmaxh : T_VectALU_64 < "vmaxh", 0b110, 0b001, 0, 0, 0, 1>; 945*9880d681SAndroid Build Coastguard Workerdef A2_vmaxuh : T_VectALU_64 < "vmaxuh", 0b110, 0b010, 0, 0, 0, 1>; 946*9880d681SAndroid Build Coastguard Workerdef A2_vmaxw : T_VectALU_64 < "vmaxw", 0b110, 0b011, 0, 0, 0, 1>; 947*9880d681SAndroid Build Coastguard Workerdef A2_vmaxuw : T_VectALU_64 < "vmaxuw", 0b101, 0b101, 0, 0, 0, 1>; 948*9880d681SAndroid Build Coastguard Worker 949*9880d681SAndroid Build Coastguard Worker// Rdd=vmin[u][bhw](Rss,Rtt) 950*9880d681SAndroid Build Coastguard Workerdef A2_vminb : T_VectALU_64 < "vminb", 0b110, 0b111, 0, 0, 0, 1>; 951*9880d681SAndroid Build Coastguard Workerdef A2_vminub : T_VectALU_64 < "vminub", 0b101, 0b000, 0, 0, 0, 1>; 952*9880d681SAndroid Build Coastguard Workerdef A2_vminh : T_VectALU_64 < "vminh", 0b101, 0b001, 0, 0, 0, 1>; 953*9880d681SAndroid Build Coastguard Workerdef A2_vminuh : T_VectALU_64 < "vminuh", 0b101, 0b010, 0, 0, 0, 1>; 954*9880d681SAndroid Build Coastguard Workerdef A2_vminw : T_VectALU_64 < "vminw", 0b101, 0b011, 0, 0, 0, 1>; 955*9880d681SAndroid Build Coastguard Workerdef A2_vminuw : T_VectALU_64 < "vminuw", 0b101, 0b100, 0, 0, 0, 1>; 956*9880d681SAndroid Build Coastguard Worker 957*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 958*9880d681SAndroid Build Coastguard Worker// Template class for vector compare 959*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 960*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 961*9880d681SAndroid Build Coastguard Workerclass T_vcmp <string Str, bits<4> minOp> 962*9880d681SAndroid Build Coastguard Worker : ALU64_rr <(outs PredRegs:$Pd), 963*9880d681SAndroid Build Coastguard Worker (ins DoubleRegs:$Rss, DoubleRegs:$Rtt), 964*9880d681SAndroid Build Coastguard Worker "$Pd = "#Str#"($Rss, $Rtt)", [], 965*9880d681SAndroid Build Coastguard Worker "", ALU64_tc_2early_SLOT23> { 966*9880d681SAndroid Build Coastguard Worker bits<2> Pd; 967*9880d681SAndroid Build Coastguard Worker bits<5> Rss; 968*9880d681SAndroid Build Coastguard Worker bits<5> Rtt; 969*9880d681SAndroid Build Coastguard Worker 970*9880d681SAndroid Build Coastguard Worker let IClass = 0b1101; 971*9880d681SAndroid Build Coastguard Worker 972*9880d681SAndroid Build Coastguard Worker let Inst{27-23} = 0b00100; 973*9880d681SAndroid Build Coastguard Worker let Inst{13} = minOp{3}; 974*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = minOp{2-0}; 975*9880d681SAndroid Build Coastguard Worker let Inst{1-0} = Pd; 976*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rss; 977*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rtt; 978*9880d681SAndroid Build Coastguard Worker } 979*9880d681SAndroid Build Coastguard Worker 980*9880d681SAndroid Build Coastguard Workerclass T_vcmp_pat<InstHexagon MI, PatFrag Op, ValueType T> 981*9880d681SAndroid Build Coastguard Worker : Pat<(i1 (Op (T DoubleRegs:$Rss), (T DoubleRegs:$Rtt))), 982*9880d681SAndroid Build Coastguard Worker (i1 (MI DoubleRegs:$Rss, DoubleRegs:$Rtt))>; 983*9880d681SAndroid Build Coastguard Worker 984*9880d681SAndroid Build Coastguard Worker// Vector compare bytes 985*9880d681SAndroid Build Coastguard Workerdef A2_vcmpbeq : T_vcmp <"vcmpb.eq", 0b0110>; 986*9880d681SAndroid Build Coastguard Workerdef A2_vcmpbgtu : T_vcmp <"vcmpb.gtu", 0b0111>; 987*9880d681SAndroid Build Coastguard Worker 988*9880d681SAndroid Build Coastguard Worker// Vector compare halfwords 989*9880d681SAndroid Build Coastguard Workerdef A2_vcmpheq : T_vcmp <"vcmph.eq", 0b0011>; 990*9880d681SAndroid Build Coastguard Workerdef A2_vcmphgt : T_vcmp <"vcmph.gt", 0b0100>; 991*9880d681SAndroid Build Coastguard Workerdef A2_vcmphgtu : T_vcmp <"vcmph.gtu", 0b0101>; 992*9880d681SAndroid Build Coastguard Worker 993*9880d681SAndroid Build Coastguard Worker// Vector compare words 994*9880d681SAndroid Build Coastguard Workerdef A2_vcmpweq : T_vcmp <"vcmpw.eq", 0b0000>; 995*9880d681SAndroid Build Coastguard Workerdef A2_vcmpwgt : T_vcmp <"vcmpw.gt", 0b0001>; 996*9880d681SAndroid Build Coastguard Workerdef A2_vcmpwgtu : T_vcmp <"vcmpw.gtu", 0b0010>; 997*9880d681SAndroid Build Coastguard Worker 998*9880d681SAndroid Build Coastguard Workerdef: T_vcmp_pat<A2_vcmpbeq, seteq, v8i8>; 999*9880d681SAndroid Build Coastguard Workerdef: T_vcmp_pat<A2_vcmpbgtu, setugt, v8i8>; 1000*9880d681SAndroid Build Coastguard Workerdef: T_vcmp_pat<A2_vcmpheq, seteq, v4i16>; 1001*9880d681SAndroid Build Coastguard Workerdef: T_vcmp_pat<A2_vcmphgt, setgt, v4i16>; 1002*9880d681SAndroid Build Coastguard Workerdef: T_vcmp_pat<A2_vcmphgtu, setugt, v4i16>; 1003*9880d681SAndroid Build Coastguard Workerdef: T_vcmp_pat<A2_vcmpweq, seteq, v2i32>; 1004*9880d681SAndroid Build Coastguard Workerdef: T_vcmp_pat<A2_vcmpwgt, setgt, v2i32>; 1005*9880d681SAndroid Build Coastguard Workerdef: T_vcmp_pat<A2_vcmpwgtu, setugt, v2i32>; 1006*9880d681SAndroid Build Coastguard Worker 1007*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1008*9880d681SAndroid Build Coastguard Worker// ALU32/PERM - 1009*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1010*9880d681SAndroid Build Coastguard Worker 1011*9880d681SAndroid Build Coastguard Worker 1012*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1013*9880d681SAndroid Build Coastguard Worker// ALU32/PRED + 1014*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1015*9880d681SAndroid Build Coastguard Worker// No bits needed. If cmp.ge is found the assembler parser will 1016*9880d681SAndroid Build Coastguard Worker// transform it to cmp.gt subtracting 1 from the immediate. 1017*9880d681SAndroid Build Coastguard Workerlet isPseudo = 1 in { 1018*9880d681SAndroid Build Coastguard Workerdef C2_cmpgei: ALU32Inst < 1019*9880d681SAndroid Build Coastguard Worker (outs PredRegs:$Pd), (ins IntRegs:$Rs, s8Ext:$s8), 1020*9880d681SAndroid Build Coastguard Worker "$Pd = cmp.ge($Rs, #$s8)">; 1021*9880d681SAndroid Build Coastguard Workerdef C2_cmpgeui: ALU32Inst < 1022*9880d681SAndroid Build Coastguard Worker (outs PredRegs:$Pd), (ins IntRegs:$Rs, u8Ext:$s8), 1023*9880d681SAndroid Build Coastguard Worker "$Pd = cmp.geu($Rs, #$s8)">; 1024*9880d681SAndroid Build Coastguard Worker} 1025*9880d681SAndroid Build Coastguard Worker 1026*9880d681SAndroid Build Coastguard Worker 1027*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1028*9880d681SAndroid Build Coastguard Worker// ALU32/PRED - 1029*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1030*9880d681SAndroid Build Coastguard Worker 1031*9880d681SAndroid Build Coastguard Worker 1032*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1033*9880d681SAndroid Build Coastguard Worker// ALU64/ALU + 1034*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1035*9880d681SAndroid Build Coastguard Worker// Add. 1036*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1037*9880d681SAndroid Build Coastguard Worker// Template Class 1038*9880d681SAndroid Build Coastguard Worker// Add/Subtract halfword 1039*9880d681SAndroid Build Coastguard Worker// Rd=add(Rt.L,Rs.[HL])[:sat] 1040*9880d681SAndroid Build Coastguard Worker// Rd=sub(Rt.L,Rs.[HL])[:sat] 1041*9880d681SAndroid Build Coastguard Worker// Rd=add(Rt.[LH],Rs.[HL])[:sat][:<16] 1042*9880d681SAndroid Build Coastguard Worker// Rd=sub(Rt.[LH],Rs.[HL])[:sat][:<16] 1043*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1044*9880d681SAndroid Build Coastguard Worker 1045*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, opNewValue = 0 in 1046*9880d681SAndroid Build Coastguard Workerclass T_XTYPE_ADD_SUB <bits<2> LHbits, bit isSat, bit hasShift, bit isSub> 1047*9880d681SAndroid Build Coastguard Worker : ALU64Inst <(outs IntRegs:$Rd), (ins IntRegs:$Rt, IntRegs:$Rs), 1048*9880d681SAndroid Build Coastguard Worker "$Rd = "#!if(isSub,"sub","add")#"($Rt." 1049*9880d681SAndroid Build Coastguard Worker #!if(hasShift, !if(LHbits{1},"h","l"),"l") #", $Rs." 1050*9880d681SAndroid Build Coastguard Worker #!if(hasShift, !if(LHbits{0},"h)","l)"), !if(LHbits{1},"h)","l)")) 1051*9880d681SAndroid Build Coastguard Worker #!if(isSat,":sat","") 1052*9880d681SAndroid Build Coastguard Worker #!if(hasShift,":<<16",""), [], "", ALU64_tc_1_SLOT23> { 1053*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 1054*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 1055*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 1056*9880d681SAndroid Build Coastguard Worker let IClass = 0b1101; 1057*9880d681SAndroid Build Coastguard Worker 1058*9880d681SAndroid Build Coastguard Worker let Inst{27-23} = 0b01010; 1059*9880d681SAndroid Build Coastguard Worker let Inst{22} = hasShift; 1060*9880d681SAndroid Build Coastguard Worker let Inst{21} = isSub; 1061*9880d681SAndroid Build Coastguard Worker let Inst{7} = isSat; 1062*9880d681SAndroid Build Coastguard Worker let Inst{6-5} = LHbits; 1063*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 1064*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 1065*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 1066*9880d681SAndroid Build Coastguard Worker } 1067*9880d681SAndroid Build Coastguard Worker 1068*9880d681SAndroid Build Coastguard Worker//Rd=sub(Rt.L,Rs.[LH]) 1069*9880d681SAndroid Build Coastguard Workerdef A2_subh_l16_ll : T_XTYPE_ADD_SUB <0b00, 0, 0, 1>; 1070*9880d681SAndroid Build Coastguard Workerdef A2_subh_l16_hl : T_XTYPE_ADD_SUB <0b10, 0, 0, 1>; 1071*9880d681SAndroid Build Coastguard Worker 1072*9880d681SAndroid Build Coastguard Worker//Rd=add(Rt.L,Rs.[LH]) 1073*9880d681SAndroid Build Coastguard Workerdef A2_addh_l16_ll : T_XTYPE_ADD_SUB <0b00, 0, 0, 0>; 1074*9880d681SAndroid Build Coastguard Workerdef A2_addh_l16_hl : T_XTYPE_ADD_SUB <0b10, 0, 0, 0>; 1075*9880d681SAndroid Build Coastguard Worker 1076*9880d681SAndroid Build Coastguard Workerlet Itinerary = ALU64_tc_2_SLOT23, Defs = [USR_OVF] in { 1077*9880d681SAndroid Build Coastguard Worker //Rd=sub(Rt.L,Rs.[LH]):sat 1078*9880d681SAndroid Build Coastguard Worker def A2_subh_l16_sat_ll : T_XTYPE_ADD_SUB <0b00, 1, 0, 1>; 1079*9880d681SAndroid Build Coastguard Worker def A2_subh_l16_sat_hl : T_XTYPE_ADD_SUB <0b10, 1, 0, 1>; 1080*9880d681SAndroid Build Coastguard Worker 1081*9880d681SAndroid Build Coastguard Worker //Rd=add(Rt.L,Rs.[LH]):sat 1082*9880d681SAndroid Build Coastguard Worker def A2_addh_l16_sat_ll : T_XTYPE_ADD_SUB <0b00, 1, 0, 0>; 1083*9880d681SAndroid Build Coastguard Worker def A2_addh_l16_sat_hl : T_XTYPE_ADD_SUB <0b10, 1, 0, 0>; 1084*9880d681SAndroid Build Coastguard Worker} 1085*9880d681SAndroid Build Coastguard Worker 1086*9880d681SAndroid Build Coastguard Worker//Rd=sub(Rt.[LH],Rs.[LH]):<<16 1087*9880d681SAndroid Build Coastguard Workerdef A2_subh_h16_ll : T_XTYPE_ADD_SUB <0b00, 0, 1, 1>; 1088*9880d681SAndroid Build Coastguard Workerdef A2_subh_h16_lh : T_XTYPE_ADD_SUB <0b01, 0, 1, 1>; 1089*9880d681SAndroid Build Coastguard Workerdef A2_subh_h16_hl : T_XTYPE_ADD_SUB <0b10, 0, 1, 1>; 1090*9880d681SAndroid Build Coastguard Workerdef A2_subh_h16_hh : T_XTYPE_ADD_SUB <0b11, 0, 1, 1>; 1091*9880d681SAndroid Build Coastguard Worker 1092*9880d681SAndroid Build Coastguard Worker//Rd=add(Rt.[LH],Rs.[LH]):<<16 1093*9880d681SAndroid Build Coastguard Workerdef A2_addh_h16_ll : T_XTYPE_ADD_SUB <0b00, 0, 1, 0>; 1094*9880d681SAndroid Build Coastguard Workerdef A2_addh_h16_lh : T_XTYPE_ADD_SUB <0b01, 0, 1, 0>; 1095*9880d681SAndroid Build Coastguard Workerdef A2_addh_h16_hl : T_XTYPE_ADD_SUB <0b10, 0, 1, 0>; 1096*9880d681SAndroid Build Coastguard Workerdef A2_addh_h16_hh : T_XTYPE_ADD_SUB <0b11, 0, 1, 0>; 1097*9880d681SAndroid Build Coastguard Worker 1098*9880d681SAndroid Build Coastguard Workerlet Itinerary = ALU64_tc_2_SLOT23, Defs = [USR_OVF] in { 1099*9880d681SAndroid Build Coastguard Worker //Rd=sub(Rt.[LH],Rs.[LH]):sat:<<16 1100*9880d681SAndroid Build Coastguard Worker def A2_subh_h16_sat_ll : T_XTYPE_ADD_SUB <0b00, 1, 1, 1>; 1101*9880d681SAndroid Build Coastguard Worker def A2_subh_h16_sat_lh : T_XTYPE_ADD_SUB <0b01, 1, 1, 1>; 1102*9880d681SAndroid Build Coastguard Worker def A2_subh_h16_sat_hl : T_XTYPE_ADD_SUB <0b10, 1, 1, 1>; 1103*9880d681SAndroid Build Coastguard Worker def A2_subh_h16_sat_hh : T_XTYPE_ADD_SUB <0b11, 1, 1, 1>; 1104*9880d681SAndroid Build Coastguard Worker 1105*9880d681SAndroid Build Coastguard Worker //Rd=add(Rt.[LH],Rs.[LH]):sat:<<16 1106*9880d681SAndroid Build Coastguard Worker def A2_addh_h16_sat_ll : T_XTYPE_ADD_SUB <0b00, 1, 1, 0>; 1107*9880d681SAndroid Build Coastguard Worker def A2_addh_h16_sat_lh : T_XTYPE_ADD_SUB <0b01, 1, 1, 0>; 1108*9880d681SAndroid Build Coastguard Worker def A2_addh_h16_sat_hl : T_XTYPE_ADD_SUB <0b10, 1, 1, 0>; 1109*9880d681SAndroid Build Coastguard Worker def A2_addh_h16_sat_hh : T_XTYPE_ADD_SUB <0b11, 1, 1, 0>; 1110*9880d681SAndroid Build Coastguard Worker} 1111*9880d681SAndroid Build Coastguard Worker 1112*9880d681SAndroid Build Coastguard Worker// Add halfword. 1113*9880d681SAndroid Build Coastguard Workerdef: Pat<(sext_inreg (add I32:$src1, I32:$src2), i16), 1114*9880d681SAndroid Build Coastguard Worker (A2_addh_l16_ll I32:$src1, I32:$src2)>; 1115*9880d681SAndroid Build Coastguard Worker 1116*9880d681SAndroid Build Coastguard Workerdef: Pat<(sra (add (shl I32:$src1, (i32 16)), I32:$src2), (i32 16)), 1117*9880d681SAndroid Build Coastguard Worker (A2_addh_l16_hl I32:$src1, I32:$src2)>; 1118*9880d681SAndroid Build Coastguard Worker 1119*9880d681SAndroid Build Coastguard Workerdef: Pat<(shl (add I32:$src1, I32:$src2), (i32 16)), 1120*9880d681SAndroid Build Coastguard Worker (A2_addh_h16_ll I32:$src1, I32:$src2)>; 1121*9880d681SAndroid Build Coastguard Worker 1122*9880d681SAndroid Build Coastguard Worker// Subtract halfword. 1123*9880d681SAndroid Build Coastguard Workerdef: Pat<(sext_inreg (sub I32:$src1, I32:$src2), i16), 1124*9880d681SAndroid Build Coastguard Worker (A2_subh_l16_ll I32:$src1, I32:$src2)>; 1125*9880d681SAndroid Build Coastguard Worker 1126*9880d681SAndroid Build Coastguard Workerdef: Pat<(shl (sub I32:$src1, I32:$src2), (i32 16)), 1127*9880d681SAndroid Build Coastguard Worker (A2_subh_h16_ll I32:$src1, I32:$src2)>; 1128*9880d681SAndroid Build Coastguard Worker 1129*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, hasNewValue = 1 in 1130*9880d681SAndroid Build Coastguard Workerdef S2_parityp: ALU64Inst<(outs IntRegs:$Rd), 1131*9880d681SAndroid Build Coastguard Worker (ins DoubleRegs:$Rs, DoubleRegs:$Rt), 1132*9880d681SAndroid Build Coastguard Worker "$Rd = parity($Rs, $Rt)", [], "", ALU64_tc_2_SLOT23> { 1133*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 1134*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 1135*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 1136*9880d681SAndroid Build Coastguard Worker 1137*9880d681SAndroid Build Coastguard Worker let IClass = 0b1101; 1138*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0000; 1139*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 1140*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 1141*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 1142*9880d681SAndroid Build Coastguard Worker} 1143*9880d681SAndroid Build Coastguard Worker 1144*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, opNewValue = 0, hasSideEffects = 0 in 1145*9880d681SAndroid Build Coastguard Workerclass T_XTYPE_MIN_MAX < bit isMax, bit isUnsigned > 1146*9880d681SAndroid Build Coastguard Worker : ALU64Inst < (outs IntRegs:$Rd), (ins IntRegs:$Rt, IntRegs:$Rs), 1147*9880d681SAndroid Build Coastguard Worker "$Rd = "#!if(isMax,"max","min")#!if(isUnsigned,"u","") 1148*9880d681SAndroid Build Coastguard Worker #"($Rt, $Rs)", [], "", ALU64_tc_2_SLOT23> { 1149*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 1150*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 1151*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 1152*9880d681SAndroid Build Coastguard Worker 1153*9880d681SAndroid Build Coastguard Worker let IClass = 0b1101; 1154*9880d681SAndroid Build Coastguard Worker 1155*9880d681SAndroid Build Coastguard Worker let Inst{27-23} = 0b01011; 1156*9880d681SAndroid Build Coastguard Worker let Inst{22-21} = !if(isMax, 0b10, 0b01); 1157*9880d681SAndroid Build Coastguard Worker let Inst{7} = isUnsigned; 1158*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 1159*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = !if(isMax, Rs, Rt); 1160*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = !if(isMax, Rt, Rs); 1161*9880d681SAndroid Build Coastguard Worker } 1162*9880d681SAndroid Build Coastguard Worker 1163*9880d681SAndroid Build Coastguard Workerdef A2_min : T_XTYPE_MIN_MAX < 0, 0 >; 1164*9880d681SAndroid Build Coastguard Workerdef A2_minu : T_XTYPE_MIN_MAX < 0, 1 >; 1165*9880d681SAndroid Build Coastguard Workerdef A2_max : T_XTYPE_MIN_MAX < 1, 0 >; 1166*9880d681SAndroid Build Coastguard Workerdef A2_maxu : T_XTYPE_MIN_MAX < 1, 1 >; 1167*9880d681SAndroid Build Coastguard Worker 1168*9880d681SAndroid Build Coastguard Worker// Here, depending on the operand being selected, we'll either generate a 1169*9880d681SAndroid Build Coastguard Worker// min or max instruction. 1170*9880d681SAndroid Build Coastguard Worker// Ex: 1171*9880d681SAndroid Build Coastguard Worker// (a>b)?a:b --> max(a,b) => Here check performed is '>' and the value selected 1172*9880d681SAndroid Build Coastguard Worker// is the larger of two. So, the corresponding HexagonInst is passed in 'Inst'. 1173*9880d681SAndroid Build Coastguard Worker// (a>b)?b:a --> min(a,b) => Here check performed is '>' but the smaller value 1174*9880d681SAndroid Build Coastguard Worker// is selected and the corresponding HexagonInst is passed in 'SwapInst'. 1175*9880d681SAndroid Build Coastguard Worker 1176*9880d681SAndroid Build Coastguard Workermulticlass T_MinMax_pats <PatFrag Op, RegisterClass RC, ValueType VT, 1177*9880d681SAndroid Build Coastguard Worker InstHexagon Inst, InstHexagon SwapInst> { 1178*9880d681SAndroid Build Coastguard Worker def: Pat<(select (i1 (Op (VT RC:$src1), (VT RC:$src2))), 1179*9880d681SAndroid Build Coastguard Worker (VT RC:$src1), (VT RC:$src2)), 1180*9880d681SAndroid Build Coastguard Worker (Inst RC:$src1, RC:$src2)>; 1181*9880d681SAndroid Build Coastguard Worker def: Pat<(select (i1 (Op (VT RC:$src1), (VT RC:$src2))), 1182*9880d681SAndroid Build Coastguard Worker (VT RC:$src2), (VT RC:$src1)), 1183*9880d681SAndroid Build Coastguard Worker (SwapInst RC:$src1, RC:$src2)>; 1184*9880d681SAndroid Build Coastguard Worker} 1185*9880d681SAndroid Build Coastguard Worker 1186*9880d681SAndroid Build Coastguard Worker 1187*9880d681SAndroid Build Coastguard Workermulticlass MinMax_pats <PatFrag Op, InstHexagon Inst, InstHexagon SwapInst> { 1188*9880d681SAndroid Build Coastguard Worker defm: T_MinMax_pats<Op, IntRegs, i32, Inst, SwapInst>; 1189*9880d681SAndroid Build Coastguard Worker 1190*9880d681SAndroid Build Coastguard Worker def: Pat<(sext_inreg (i32 (select (i1 (Op (i32 PositiveHalfWord:$src1), 1191*9880d681SAndroid Build Coastguard Worker (i32 PositiveHalfWord:$src2))), 1192*9880d681SAndroid Build Coastguard Worker (i32 PositiveHalfWord:$src1), 1193*9880d681SAndroid Build Coastguard Worker (i32 PositiveHalfWord:$src2))), i16), 1194*9880d681SAndroid Build Coastguard Worker (Inst IntRegs:$src1, IntRegs:$src2)>; 1195*9880d681SAndroid Build Coastguard Worker 1196*9880d681SAndroid Build Coastguard Worker def: Pat<(sext_inreg (i32 (select (i1 (Op (i32 PositiveHalfWord:$src1), 1197*9880d681SAndroid Build Coastguard Worker (i32 PositiveHalfWord:$src2))), 1198*9880d681SAndroid Build Coastguard Worker (i32 PositiveHalfWord:$src2), 1199*9880d681SAndroid Build Coastguard Worker (i32 PositiveHalfWord:$src1))), i16), 1200*9880d681SAndroid Build Coastguard Worker (SwapInst IntRegs:$src1, IntRegs:$src2)>; 1201*9880d681SAndroid Build Coastguard Worker} 1202*9880d681SAndroid Build Coastguard Worker 1203*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 200 in { 1204*9880d681SAndroid Build Coastguard Worker defm: MinMax_pats<setge, A2_max, A2_min>; 1205*9880d681SAndroid Build Coastguard Worker defm: MinMax_pats<setgt, A2_max, A2_min>; 1206*9880d681SAndroid Build Coastguard Worker defm: MinMax_pats<setle, A2_min, A2_max>; 1207*9880d681SAndroid Build Coastguard Worker defm: MinMax_pats<setlt, A2_min, A2_max>; 1208*9880d681SAndroid Build Coastguard Worker defm: MinMax_pats<setuge, A2_maxu, A2_minu>; 1209*9880d681SAndroid Build Coastguard Worker defm: MinMax_pats<setugt, A2_maxu, A2_minu>; 1210*9880d681SAndroid Build Coastguard Worker defm: MinMax_pats<setule, A2_minu, A2_maxu>; 1211*9880d681SAndroid Build Coastguard Worker defm: MinMax_pats<setult, A2_minu, A2_maxu>; 1212*9880d681SAndroid Build Coastguard Worker} 1213*9880d681SAndroid Build Coastguard Worker 1214*9880d681SAndroid Build Coastguard Workerclass T_cmp64_rr<string mnemonic, bits<3> MinOp, bit IsComm> 1215*9880d681SAndroid Build Coastguard Worker : ALU64_rr<(outs PredRegs:$Pd), (ins DoubleRegs:$Rs, DoubleRegs:$Rt), 1216*9880d681SAndroid Build Coastguard Worker "$Pd = "#mnemonic#"($Rs, $Rt)", [], "", ALU64_tc_2early_SLOT23> { 1217*9880d681SAndroid Build Coastguard Worker let isCompare = 1; 1218*9880d681SAndroid Build Coastguard Worker let isCommutable = IsComm; 1219*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0; 1220*9880d681SAndroid Build Coastguard Worker 1221*9880d681SAndroid Build Coastguard Worker bits<2> Pd; 1222*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 1223*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 1224*9880d681SAndroid Build Coastguard Worker 1225*9880d681SAndroid Build Coastguard Worker let IClass = 0b1101; 1226*9880d681SAndroid Build Coastguard Worker let Inst{27-21} = 0b0010100; 1227*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 1228*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 1229*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = MinOp; 1230*9880d681SAndroid Build Coastguard Worker let Inst{1-0} = Pd; 1231*9880d681SAndroid Build Coastguard Worker} 1232*9880d681SAndroid Build Coastguard Worker 1233*9880d681SAndroid Build Coastguard Workerdef C2_cmpeqp : T_cmp64_rr<"cmp.eq", 0b000, 1>; 1234*9880d681SAndroid Build Coastguard Workerdef C2_cmpgtp : T_cmp64_rr<"cmp.gt", 0b010, 0>; 1235*9880d681SAndroid Build Coastguard Workerdef C2_cmpgtup : T_cmp64_rr<"cmp.gtu", 0b100, 0>; 1236*9880d681SAndroid Build Coastguard Worker 1237*9880d681SAndroid Build Coastguard Workerclass T_cmp64_rr_pat<InstHexagon MI, PatFrag CmpOp> 1238*9880d681SAndroid Build Coastguard Worker : Pat<(i1 (CmpOp (i64 DoubleRegs:$Rs), (i64 DoubleRegs:$Rt))), 1239*9880d681SAndroid Build Coastguard Worker (i1 (MI DoubleRegs:$Rs, DoubleRegs:$Rt))>; 1240*9880d681SAndroid Build Coastguard Worker 1241*9880d681SAndroid Build Coastguard Workerdef: T_cmp64_rr_pat<C2_cmpeqp, seteq>; 1242*9880d681SAndroid Build Coastguard Workerdef: T_cmp64_rr_pat<C2_cmpgtp, setgt>; 1243*9880d681SAndroid Build Coastguard Workerdef: T_cmp64_rr_pat<C2_cmpgtup, setugt>; 1244*9880d681SAndroid Build Coastguard Workerdef: T_cmp64_rr_pat<C2_cmpgtp, RevCmp<setlt>>; 1245*9880d681SAndroid Build Coastguard Workerdef: T_cmp64_rr_pat<C2_cmpgtup, RevCmp<setult>>; 1246*9880d681SAndroid Build Coastguard Worker 1247*9880d681SAndroid Build Coastguard Workerdef C2_vmux : ALU64_rr<(outs DoubleRegs:$Rd), 1248*9880d681SAndroid Build Coastguard Worker (ins PredRegs:$Pu, DoubleRegs:$Rs, DoubleRegs:$Rt), 1249*9880d681SAndroid Build Coastguard Worker "$Rd = vmux($Pu, $Rs, $Rt)", [], "", ALU64_tc_1_SLOT23> { 1250*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0; 1251*9880d681SAndroid Build Coastguard Worker 1252*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 1253*9880d681SAndroid Build Coastguard Worker bits<2> Pu; 1254*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 1255*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 1256*9880d681SAndroid Build Coastguard Worker 1257*9880d681SAndroid Build Coastguard Worker let IClass = 0b1101; 1258*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0001; 1259*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 1260*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 1261*9880d681SAndroid Build Coastguard Worker let Inst{6-5} = Pu; 1262*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 1263*9880d681SAndroid Build Coastguard Worker} 1264*9880d681SAndroid Build Coastguard Worker 1265*9880d681SAndroid Build Coastguard Workerclass T_ALU64_rr<string mnemonic, string suffix, bits<4> RegType, 1266*9880d681SAndroid Build Coastguard Worker bits<3> MajOp, bits<3> MinOp, bit OpsRev, bit IsComm, 1267*9880d681SAndroid Build Coastguard Worker string Op2Pfx> 1268*9880d681SAndroid Build Coastguard Worker : ALU64_rr<(outs DoubleRegs:$Rd), (ins DoubleRegs:$Rs, DoubleRegs:$Rt), 1269*9880d681SAndroid Build Coastguard Worker "$Rd = " #mnemonic# "($Rs, " #Op2Pfx# "$Rt)" #suffix, [], 1270*9880d681SAndroid Build Coastguard Worker "", ALU64_tc_1_SLOT23> { 1271*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0; 1272*9880d681SAndroid Build Coastguard Worker let isCommutable = IsComm; 1273*9880d681SAndroid Build Coastguard Worker 1274*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 1275*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 1276*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 1277*9880d681SAndroid Build Coastguard Worker 1278*9880d681SAndroid Build Coastguard Worker let IClass = 0b1101; 1279*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = RegType; 1280*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MajOp; 1281*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = !if (OpsRev,Rt,Rs); 1282*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = !if (OpsRev,Rs,Rt); 1283*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = MinOp; 1284*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 1285*9880d681SAndroid Build Coastguard Worker} 1286*9880d681SAndroid Build Coastguard Worker 1287*9880d681SAndroid Build Coastguard Workerclass T_ALU64_arith<string mnemonic, bits<3> MajOp, bits<3> MinOp, bit IsSat, 1288*9880d681SAndroid Build Coastguard Worker bit OpsRev, bit IsComm> 1289*9880d681SAndroid Build Coastguard Worker : T_ALU64_rr<mnemonic, !if(IsSat,":sat",""), 0b0011, MajOp, MinOp, OpsRev, 1290*9880d681SAndroid Build Coastguard Worker IsComm, "">; 1291*9880d681SAndroid Build Coastguard Worker 1292*9880d681SAndroid Build Coastguard Workerdef A2_addp : T_ALU64_arith<"add", 0b000, 0b111, 0, 0, 1>; 1293*9880d681SAndroid Build Coastguard Workerdef A2_subp : T_ALU64_arith<"sub", 0b001, 0b111, 0, 1, 0>; 1294*9880d681SAndroid Build Coastguard Worker 1295*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (add I64:$Rs, I64:$Rt)), (A2_addp I64:$Rs, I64:$Rt)>; 1296*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (sub I64:$Rs, I64:$Rt)), (A2_subp I64:$Rs, I64:$Rt)>; 1297*9880d681SAndroid Build Coastguard Worker 1298*9880d681SAndroid Build Coastguard Workerclass T_ALU64_logical<string mnemonic, bits<3> MinOp, bit OpsRev, bit IsComm, 1299*9880d681SAndroid Build Coastguard Worker bit IsNeg> 1300*9880d681SAndroid Build Coastguard Worker : T_ALU64_rr<mnemonic, "", 0b0011, 0b111, MinOp, OpsRev, IsComm, 1301*9880d681SAndroid Build Coastguard Worker !if(IsNeg,"~","")>; 1302*9880d681SAndroid Build Coastguard Worker 1303*9880d681SAndroid Build Coastguard Workerdef A2_andp : T_ALU64_logical<"and", 0b000, 0, 1, 0>; 1304*9880d681SAndroid Build Coastguard Workerdef A2_orp : T_ALU64_logical<"or", 0b010, 0, 1, 0>; 1305*9880d681SAndroid Build Coastguard Workerdef A2_xorp : T_ALU64_logical<"xor", 0b100, 0, 1, 0>; 1306*9880d681SAndroid Build Coastguard Worker 1307*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (and I64:$Rs, I64:$Rt)), (A2_andp I64:$Rs, I64:$Rt)>; 1308*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (or I64:$Rs, I64:$Rt)), (A2_orp I64:$Rs, I64:$Rt)>; 1309*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (xor I64:$Rs, I64:$Rt)), (A2_xorp I64:$Rs, I64:$Rt)>; 1310*9880d681SAndroid Build Coastguard Worker 1311*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1312*9880d681SAndroid Build Coastguard Worker// ALU64/ALU - 1313*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1314*9880d681SAndroid Build Coastguard Worker 1315*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1316*9880d681SAndroid Build Coastguard Worker// ALU64/BIT + 1317*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1318*9880d681SAndroid Build Coastguard Worker// 1319*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1320*9880d681SAndroid Build Coastguard Worker// ALU64/BIT - 1321*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1322*9880d681SAndroid Build Coastguard Worker 1323*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1324*9880d681SAndroid Build Coastguard Worker// ALU64/PERM + 1325*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1326*9880d681SAndroid Build Coastguard Worker// 1327*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1328*9880d681SAndroid Build Coastguard Worker// ALU64/PERM - 1329*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1330*9880d681SAndroid Build Coastguard Worker 1331*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1332*9880d681SAndroid Build Coastguard Worker// CR + 1333*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1334*9880d681SAndroid Build Coastguard Worker// Logical reductions on predicates. 1335*9880d681SAndroid Build Coastguard Worker 1336*9880d681SAndroid Build Coastguard Worker// Looping instructions. 1337*9880d681SAndroid Build Coastguard Worker 1338*9880d681SAndroid Build Coastguard Worker// Pipelined looping instructions. 1339*9880d681SAndroid Build Coastguard Worker 1340*9880d681SAndroid Build Coastguard Worker// Logical operations on predicates. 1341*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 1342*9880d681SAndroid Build Coastguard Workerclass T_LOGICAL_1OP<string MnOp, bits<2> OpBits> 1343*9880d681SAndroid Build Coastguard Worker : CRInst<(outs PredRegs:$Pd), (ins PredRegs:$Ps), 1344*9880d681SAndroid Build Coastguard Worker "$Pd = " # MnOp # "($Ps)", [], "", CR_tc_2early_SLOT23> { 1345*9880d681SAndroid Build Coastguard Worker bits<2> Pd; 1346*9880d681SAndroid Build Coastguard Worker bits<2> Ps; 1347*9880d681SAndroid Build Coastguard Worker 1348*9880d681SAndroid Build Coastguard Worker let IClass = 0b0110; 1349*9880d681SAndroid Build Coastguard Worker let Inst{27-23} = 0b10111; 1350*9880d681SAndroid Build Coastguard Worker let Inst{22-21} = OpBits; 1351*9880d681SAndroid Build Coastguard Worker let Inst{20} = 0b0; 1352*9880d681SAndroid Build Coastguard Worker let Inst{17-16} = Ps; 1353*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 1354*9880d681SAndroid Build Coastguard Worker let Inst{1-0} = Pd; 1355*9880d681SAndroid Build Coastguard Worker} 1356*9880d681SAndroid Build Coastguard Worker 1357*9880d681SAndroid Build Coastguard Workerdef C2_any8 : T_LOGICAL_1OP<"any8", 0b00>; 1358*9880d681SAndroid Build Coastguard Workerdef C2_all8 : T_LOGICAL_1OP<"all8", 0b01>; 1359*9880d681SAndroid Build Coastguard Workerdef C2_not : T_LOGICAL_1OP<"not", 0b10>; 1360*9880d681SAndroid Build Coastguard Worker 1361*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (not (i1 PredRegs:$Ps))), 1362*9880d681SAndroid Build Coastguard Worker (C2_not PredRegs:$Ps)>; 1363*9880d681SAndroid Build Coastguard Worker 1364*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 1365*9880d681SAndroid Build Coastguard Workerclass T_LOGICAL_2OP<string MnOp, bits<3> OpBits, bit IsNeg, bit Rev> 1366*9880d681SAndroid Build Coastguard Worker : CRInst<(outs PredRegs:$Pd), (ins PredRegs:$Ps, PredRegs:$Pt), 1367*9880d681SAndroid Build Coastguard Worker "$Pd = " # MnOp # "($Ps, " # !if (IsNeg,"!","") # "$Pt)", 1368*9880d681SAndroid Build Coastguard Worker [], "", CR_tc_2early_SLOT23> { 1369*9880d681SAndroid Build Coastguard Worker bits<2> Pd; 1370*9880d681SAndroid Build Coastguard Worker bits<2> Ps; 1371*9880d681SAndroid Build Coastguard Worker bits<2> Pt; 1372*9880d681SAndroid Build Coastguard Worker 1373*9880d681SAndroid Build Coastguard Worker let IClass = 0b0110; 1374*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1011; 1375*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = OpBits; 1376*9880d681SAndroid Build Coastguard Worker let Inst{20} = 0b0; 1377*9880d681SAndroid Build Coastguard Worker let Inst{17-16} = !if(Rev,Pt,Ps); // Rs and Rt are reversed for some 1378*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; // instructions. 1379*9880d681SAndroid Build Coastguard Worker let Inst{9-8} = !if(Rev,Ps,Pt); 1380*9880d681SAndroid Build Coastguard Worker let Inst{1-0} = Pd; 1381*9880d681SAndroid Build Coastguard Worker} 1382*9880d681SAndroid Build Coastguard Worker 1383*9880d681SAndroid Build Coastguard Workerdef C2_and : T_LOGICAL_2OP<"and", 0b000, 0, 1>; 1384*9880d681SAndroid Build Coastguard Workerdef C2_or : T_LOGICAL_2OP<"or", 0b001, 0, 1>; 1385*9880d681SAndroid Build Coastguard Workerdef C2_xor : T_LOGICAL_2OP<"xor", 0b010, 0, 0>; 1386*9880d681SAndroid Build Coastguard Workerdef C2_andn : T_LOGICAL_2OP<"and", 0b011, 1, 1>; 1387*9880d681SAndroid Build Coastguard Workerdef C2_orn : T_LOGICAL_2OP<"or", 0b111, 1, 1>; 1388*9880d681SAndroid Build Coastguard Worker 1389*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (and I1:$Ps, I1:$Pt)), (C2_and I1:$Ps, I1:$Pt)>; 1390*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (or I1:$Ps, I1:$Pt)), (C2_or I1:$Ps, I1:$Pt)>; 1391*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (xor I1:$Ps, I1:$Pt)), (C2_xor I1:$Ps, I1:$Pt)>; 1392*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (and I1:$Ps, (not I1:$Pt))), (C2_andn I1:$Ps, I1:$Pt)>; 1393*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (or I1:$Ps, (not I1:$Pt))), (C2_orn I1:$Ps, I1:$Pt)>; 1394*9880d681SAndroid Build Coastguard Worker 1395*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, hasNewValue = 1 in 1396*9880d681SAndroid Build Coastguard Workerdef C2_vitpack : SInst<(outs IntRegs:$Rd), (ins PredRegs:$Ps, PredRegs:$Pt), 1397*9880d681SAndroid Build Coastguard Worker "$Rd = vitpack($Ps, $Pt)", [], "", S_2op_tc_1_SLOT23> { 1398*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 1399*9880d681SAndroid Build Coastguard Worker bits<2> Ps; 1400*9880d681SAndroid Build Coastguard Worker bits<2> Pt; 1401*9880d681SAndroid Build Coastguard Worker 1402*9880d681SAndroid Build Coastguard Worker let IClass = 0b1000; 1403*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1001; 1404*9880d681SAndroid Build Coastguard Worker let Inst{22-21} = 0b00; 1405*9880d681SAndroid Build Coastguard Worker let Inst{17-16} = Ps; 1406*9880d681SAndroid Build Coastguard Worker let Inst{9-8} = Pt; 1407*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 1408*9880d681SAndroid Build Coastguard Worker} 1409*9880d681SAndroid Build Coastguard Worker 1410*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 1411*9880d681SAndroid Build Coastguard Workerdef C2_mask : SInst<(outs DoubleRegs:$Rd), (ins PredRegs:$Pt), 1412*9880d681SAndroid Build Coastguard Worker "$Rd = mask($Pt)", [], "", S_2op_tc_1_SLOT23> { 1413*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 1414*9880d681SAndroid Build Coastguard Worker bits<2> Pt; 1415*9880d681SAndroid Build Coastguard Worker 1416*9880d681SAndroid Build Coastguard Worker let IClass = 0b1000; 1417*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0110; 1418*9880d681SAndroid Build Coastguard Worker let Inst{9-8} = Pt; 1419*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 1420*9880d681SAndroid Build Coastguard Worker} 1421*9880d681SAndroid Build Coastguard Worker 1422*9880d681SAndroid Build Coastguard Worker// User control register transfer. 1423*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1424*9880d681SAndroid Build Coastguard Worker// CR - 1425*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1426*9880d681SAndroid Build Coastguard Worker 1427*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1428*9880d681SAndroid Build Coastguard Worker// JR + 1429*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1430*9880d681SAndroid Build Coastguard Worker 1431*9880d681SAndroid Build Coastguard Workerdef retflag : SDNode<"HexagonISD::RET_FLAG", SDTNone, 1432*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>; 1433*9880d681SAndroid Build Coastguard Workerdef eh_return: SDNode<"HexagonISD::EH_RETURN", SDTNone, [SDNPHasChain]>; 1434*9880d681SAndroid Build Coastguard Worker 1435*9880d681SAndroid Build Coastguard Workerclass CondStr<string CReg, bit True, bit New> { 1436*9880d681SAndroid Build Coastguard Worker string S = "if (" # !if(True,"","!") # CReg # !if(New,".new","") # ") "; 1437*9880d681SAndroid Build Coastguard Worker} 1438*9880d681SAndroid Build Coastguard Workerclass JumpOpcStr<string Mnemonic, bit New, bit Taken> { 1439*9880d681SAndroid Build Coastguard Worker string S = Mnemonic # !if(Taken, ":t", ":nt"); 1440*9880d681SAndroid Build Coastguard Worker} 1441*9880d681SAndroid Build Coastguard Worker 1442*9880d681SAndroid Build Coastguard Workerlet isBranch = 1, isBarrier = 1, Defs = [PC], hasSideEffects = 0, 1443*9880d681SAndroid Build Coastguard Worker isPredicable = 1, 1444*9880d681SAndroid Build Coastguard Worker isExtendable = 1, opExtendable = 0, isExtentSigned = 1, 1445*9880d681SAndroid Build Coastguard Worker opExtentBits = 24, opExtentAlign = 2, InputType = "imm" in 1446*9880d681SAndroid Build Coastguard Workerclass T_JMP<string ExtStr> 1447*9880d681SAndroid Build Coastguard Worker : JInst<(outs), (ins brtarget:$dst), 1448*9880d681SAndroid Build Coastguard Worker "jump " # ExtStr # "$dst", 1449*9880d681SAndroid Build Coastguard Worker [], "", J_tc_2early_SLOT23> { 1450*9880d681SAndroid Build Coastguard Worker bits<24> dst; 1451*9880d681SAndroid Build Coastguard Worker let IClass = 0b0101; 1452*9880d681SAndroid Build Coastguard Worker 1453*9880d681SAndroid Build Coastguard Worker let Inst{27-25} = 0b100; 1454*9880d681SAndroid Build Coastguard Worker let Inst{24-16} = dst{23-15}; 1455*9880d681SAndroid Build Coastguard Worker let Inst{13-1} = dst{14-2}; 1456*9880d681SAndroid Build Coastguard Worker} 1457*9880d681SAndroid Build Coastguard Worker 1458*9880d681SAndroid Build Coastguard Workerlet isBranch = 1, Defs = [PC], hasSideEffects = 0, isPredicated = 1, 1459*9880d681SAndroid Build Coastguard Worker isExtendable = 1, opExtendable = 1, isExtentSigned = 1, 1460*9880d681SAndroid Build Coastguard Worker opExtentBits = 17, opExtentAlign = 2, InputType = "imm" in 1461*9880d681SAndroid Build Coastguard Workerclass T_JMP_c<bit PredNot, bit isPredNew, bit isTak, string ExtStr> 1462*9880d681SAndroid Build Coastguard Worker : JInst<(outs), (ins PredRegs:$src, brtarget:$dst), 1463*9880d681SAndroid Build Coastguard Worker CondStr<"$src", !if(PredNot,0,1), isPredNew>.S # 1464*9880d681SAndroid Build Coastguard Worker JumpOpcStr<"jump", isPredNew, isTak>.S # " " # 1465*9880d681SAndroid Build Coastguard Worker ExtStr # "$dst", 1466*9880d681SAndroid Build Coastguard Worker [], "", J_tc_2early_SLOT23>, ImmRegRel { 1467*9880d681SAndroid Build Coastguard Worker let isTaken = isTak; 1468*9880d681SAndroid Build Coastguard Worker let isPredicatedFalse = PredNot; 1469*9880d681SAndroid Build Coastguard Worker let isPredicatedNew = isPredNew; 1470*9880d681SAndroid Build Coastguard Worker bits<2> src; 1471*9880d681SAndroid Build Coastguard Worker bits<17> dst; 1472*9880d681SAndroid Build Coastguard Worker 1473*9880d681SAndroid Build Coastguard Worker let IClass = 0b0101; 1474*9880d681SAndroid Build Coastguard Worker 1475*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1100; 1476*9880d681SAndroid Build Coastguard Worker let Inst{21} = PredNot; 1477*9880d681SAndroid Build Coastguard Worker let Inst{12} = isTak; 1478*9880d681SAndroid Build Coastguard Worker let Inst{11} = isPredNew; 1479*9880d681SAndroid Build Coastguard Worker let Inst{9-8} = src; 1480*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = dst{16-15}; 1481*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = dst{14-10}; 1482*9880d681SAndroid Build Coastguard Worker let Inst{13} = dst{9}; 1483*9880d681SAndroid Build Coastguard Worker let Inst{7-1} = dst{8-2}; 1484*9880d681SAndroid Build Coastguard Worker } 1485*9880d681SAndroid Build Coastguard Worker 1486*9880d681SAndroid Build Coastguard Workermulticlass JMP_Pred<bit PredNot, string ExtStr> { 1487*9880d681SAndroid Build Coastguard Worker def NAME : T_JMP_c<PredNot, 0, 0, ExtStr>; // not taken 1488*9880d681SAndroid Build Coastguard Worker // Predicate new 1489*9880d681SAndroid Build Coastguard Worker def NAME#newpt : T_JMP_c<PredNot, 1, 1, ExtStr>; // taken 1490*9880d681SAndroid Build Coastguard Worker def NAME#new : T_JMP_c<PredNot, 1, 0, ExtStr>; // not taken 1491*9880d681SAndroid Build Coastguard Worker} 1492*9880d681SAndroid Build Coastguard Worker 1493*9880d681SAndroid Build Coastguard Workermulticlass JMP_base<string BaseOp, string ExtStr> { 1494*9880d681SAndroid Build Coastguard Worker let BaseOpcode = BaseOp in { 1495*9880d681SAndroid Build Coastguard Worker def NAME : T_JMP<ExtStr>; 1496*9880d681SAndroid Build Coastguard Worker defm t : JMP_Pred<0, ExtStr>; 1497*9880d681SAndroid Build Coastguard Worker defm f : JMP_Pred<1, ExtStr>; 1498*9880d681SAndroid Build Coastguard Worker } 1499*9880d681SAndroid Build Coastguard Worker} 1500*9880d681SAndroid Build Coastguard Worker 1501*9880d681SAndroid Build Coastguard Worker// Jumps to address stored in a register, JUMPR_MISC 1502*9880d681SAndroid Build Coastguard Worker// if ([[!]P[.new]]) jumpr[:t/nt] Rs 1503*9880d681SAndroid Build Coastguard Workerlet isBranch = 1, isIndirectBranch = 1, isBarrier = 1, Defs = [PC], 1504*9880d681SAndroid Build Coastguard Worker isPredicable = 1, hasSideEffects = 0, InputType = "reg" in 1505*9880d681SAndroid Build Coastguard Workerclass T_JMPr 1506*9880d681SAndroid Build Coastguard Worker : JRInst<(outs), (ins IntRegs:$dst), 1507*9880d681SAndroid Build Coastguard Worker "jumpr $dst", [], "", J_tc_2early_SLOT2> { 1508*9880d681SAndroid Build Coastguard Worker bits<5> dst; 1509*9880d681SAndroid Build Coastguard Worker 1510*9880d681SAndroid Build Coastguard Worker let IClass = 0b0101; 1511*9880d681SAndroid Build Coastguard Worker let Inst{27-21} = 0b0010100; 1512*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = dst; 1513*9880d681SAndroid Build Coastguard Worker} 1514*9880d681SAndroid Build Coastguard Worker 1515*9880d681SAndroid Build Coastguard Workerlet isBranch = 1, isIndirectBranch = 1, Defs = [PC], isPredicated = 1, 1516*9880d681SAndroid Build Coastguard Worker hasSideEffects = 0, InputType = "reg" in 1517*9880d681SAndroid Build Coastguard Workerclass T_JMPr_c <bit PredNot, bit isPredNew, bit isTak> 1518*9880d681SAndroid Build Coastguard Worker : JRInst <(outs), (ins PredRegs:$src, IntRegs:$dst), 1519*9880d681SAndroid Build Coastguard Worker CondStr<"$src", !if(PredNot,0,1), isPredNew>.S # 1520*9880d681SAndroid Build Coastguard Worker JumpOpcStr<"jumpr", isPredNew, isTak>.S # " $dst", [], 1521*9880d681SAndroid Build Coastguard Worker "", J_tc_2early_SLOT2> { 1522*9880d681SAndroid Build Coastguard Worker 1523*9880d681SAndroid Build Coastguard Worker let isTaken = isTak; 1524*9880d681SAndroid Build Coastguard Worker let isPredicatedFalse = PredNot; 1525*9880d681SAndroid Build Coastguard Worker let isPredicatedNew = isPredNew; 1526*9880d681SAndroid Build Coastguard Worker bits<2> src; 1527*9880d681SAndroid Build Coastguard Worker bits<5> dst; 1528*9880d681SAndroid Build Coastguard Worker 1529*9880d681SAndroid Build Coastguard Worker let IClass = 0b0101; 1530*9880d681SAndroid Build Coastguard Worker 1531*9880d681SAndroid Build Coastguard Worker let Inst{27-22} = 0b001101; 1532*9880d681SAndroid Build Coastguard Worker let Inst{21} = PredNot; 1533*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = dst; 1534*9880d681SAndroid Build Coastguard Worker let Inst{12} = isTak; 1535*9880d681SAndroid Build Coastguard Worker let Inst{11} = isPredNew; 1536*9880d681SAndroid Build Coastguard Worker let Inst{9-8} = src; 1537*9880d681SAndroid Build Coastguard Worker} 1538*9880d681SAndroid Build Coastguard Worker 1539*9880d681SAndroid Build Coastguard Workermulticlass JMPR_Pred<bit PredNot> { 1540*9880d681SAndroid Build Coastguard Worker def NAME : T_JMPr_c<PredNot, 0, 0>; // not taken 1541*9880d681SAndroid Build Coastguard Worker // Predicate new 1542*9880d681SAndroid Build Coastguard Worker def NAME#newpt : T_JMPr_c<PredNot, 1, 1>; // taken 1543*9880d681SAndroid Build Coastguard Worker def NAME#new : T_JMPr_c<PredNot, 1, 0>; // not taken 1544*9880d681SAndroid Build Coastguard Worker} 1545*9880d681SAndroid Build Coastguard Worker 1546*9880d681SAndroid Build Coastguard Workermulticlass JMPR_base<string BaseOp> { 1547*9880d681SAndroid Build Coastguard Worker let BaseOpcode = BaseOp in { 1548*9880d681SAndroid Build Coastguard Worker def NAME : T_JMPr; 1549*9880d681SAndroid Build Coastguard Worker defm t : JMPR_Pred<0>; 1550*9880d681SAndroid Build Coastguard Worker defm f : JMPR_Pred<1>; 1551*9880d681SAndroid Build Coastguard Worker } 1552*9880d681SAndroid Build Coastguard Worker} 1553*9880d681SAndroid Build Coastguard Worker 1554*9880d681SAndroid Build Coastguard Workerlet isCall = 1, hasSideEffects = 1 in 1555*9880d681SAndroid Build Coastguard Workerclass JUMPR_MISC_CALLR<bit isPred, bit isPredNot, 1556*9880d681SAndroid Build Coastguard Worker dag InputDag = (ins IntRegs:$Rs)> 1557*9880d681SAndroid Build Coastguard Worker : JRInst<(outs), InputDag, 1558*9880d681SAndroid Build Coastguard Worker !if(isPred, !if(isPredNot, "if (!$Pu) callr $Rs", 1559*9880d681SAndroid Build Coastguard Worker "if ($Pu) callr $Rs"), 1560*9880d681SAndroid Build Coastguard Worker "callr $Rs"), 1561*9880d681SAndroid Build Coastguard Worker [], "", J_tc_2early_SLOT2> { 1562*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 1563*9880d681SAndroid Build Coastguard Worker bits<2> Pu; 1564*9880d681SAndroid Build Coastguard Worker let isPredicated = isPred; 1565*9880d681SAndroid Build Coastguard Worker let isPredicatedFalse = isPredNot; 1566*9880d681SAndroid Build Coastguard Worker 1567*9880d681SAndroid Build Coastguard Worker let IClass = 0b0101; 1568*9880d681SAndroid Build Coastguard Worker let Inst{27-25} = 0b000; 1569*9880d681SAndroid Build Coastguard Worker let Inst{24-23} = !if (isPred, 0b10, 0b01); 1570*9880d681SAndroid Build Coastguard Worker let Inst{22} = 0; 1571*9880d681SAndroid Build Coastguard Worker let Inst{21} = isPredNot; 1572*9880d681SAndroid Build Coastguard Worker let Inst{9-8} = !if (isPred, Pu, 0b00); 1573*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 1574*9880d681SAndroid Build Coastguard Worker 1575*9880d681SAndroid Build Coastguard Worker } 1576*9880d681SAndroid Build Coastguard Worker 1577*9880d681SAndroid Build Coastguard Workerlet Defs = VolatileV3.Regs in { 1578*9880d681SAndroid Build Coastguard Worker def J2_callrt : JUMPR_MISC_CALLR<1, 0, (ins PredRegs:$Pu, IntRegs:$Rs)>; 1579*9880d681SAndroid Build Coastguard Worker def J2_callrf : JUMPR_MISC_CALLR<1, 1, (ins PredRegs:$Pu, IntRegs:$Rs)>; 1580*9880d681SAndroid Build Coastguard Worker} 1581*9880d681SAndroid Build Coastguard Worker 1582*9880d681SAndroid Build Coastguard Workerlet isTerminator = 1, hasSideEffects = 0 in { 1583*9880d681SAndroid Build Coastguard Worker defm J2_jump : JMP_base<"JMP", "">, PredNewRel; 1584*9880d681SAndroid Build Coastguard Worker 1585*9880d681SAndroid Build Coastguard Worker defm J2_jumpr : JMPR_base<"JMPr">, PredNewRel; 1586*9880d681SAndroid Build Coastguard Worker 1587*9880d681SAndroid Build Coastguard Worker let isReturn = 1, isCodeGenOnly = 1 in 1588*9880d681SAndroid Build Coastguard Worker defm JMPret : JMPR_base<"JMPret">, PredNewRel; 1589*9880d681SAndroid Build Coastguard Worker} 1590*9880d681SAndroid Build Coastguard Worker 1591*9880d681SAndroid Build Coastguard Workerlet validSubTargets = HasV60SubT in 1592*9880d681SAndroid Build Coastguard Workermulticlass JMPpt_base<string BaseOp> { 1593*9880d681SAndroid Build Coastguard Worker let BaseOpcode = BaseOp in { 1594*9880d681SAndroid Build Coastguard Worker def tpt : T_JMP_c <0, 0, 1, "">; // Predicate true - taken 1595*9880d681SAndroid Build Coastguard Worker def fpt : T_JMP_c <1, 0, 1, "">; // Predicate false - taken 1596*9880d681SAndroid Build Coastguard Worker } 1597*9880d681SAndroid Build Coastguard Worker} 1598*9880d681SAndroid Build Coastguard Worker 1599*9880d681SAndroid Build Coastguard Workerlet validSubTargets = HasV60SubT in 1600*9880d681SAndroid Build Coastguard Workermulticlass JMPRpt_base<string BaseOp> { 1601*9880d681SAndroid Build Coastguard Worker let BaseOpcode = BaseOp in { 1602*9880d681SAndroid Build Coastguard Worker def tpt : T_JMPr_c<0, 0, 1>; // predicate true - taken 1603*9880d681SAndroid Build Coastguard Worker def fpt : T_JMPr_c<1, 0, 1>; // predicate false - taken 1604*9880d681SAndroid Build Coastguard Worker } 1605*9880d681SAndroid Build Coastguard Worker} 1606*9880d681SAndroid Build Coastguard Worker 1607*9880d681SAndroid Build Coastguard Workerdefm J2_jumpr : JMPRpt_base<"JMPr">; 1608*9880d681SAndroid Build Coastguard Workerdefm J2_jump : JMPpt_base<"JMP">; 1609*9880d681SAndroid Build Coastguard Worker 1610*9880d681SAndroid Build Coastguard Workerdef: Pat<(br bb:$dst), 1611*9880d681SAndroid Build Coastguard Worker (J2_jump brtarget:$dst)>; 1612*9880d681SAndroid Build Coastguard Workerdef: Pat<(retflag), 1613*9880d681SAndroid Build Coastguard Worker (JMPret (i32 R31))>; 1614*9880d681SAndroid Build Coastguard Workerdef: Pat<(brcond (i1 PredRegs:$src1), bb:$offset), 1615*9880d681SAndroid Build Coastguard Worker (J2_jumpt PredRegs:$src1, bb:$offset)>; 1616*9880d681SAndroid Build Coastguard Worker 1617*9880d681SAndroid Build Coastguard Worker// A return through builtin_eh_return. 1618*9880d681SAndroid Build Coastguard Workerlet isReturn = 1, isTerminator = 1, isBarrier = 1, hasSideEffects = 0, 1619*9880d681SAndroid Build Coastguard Worker isCodeGenOnly = 1, Defs = [PC], Uses = [R28], isPredicable = 0 in 1620*9880d681SAndroid Build Coastguard Workerdef EH_RETURN_JMPR : T_JMPr; 1621*9880d681SAndroid Build Coastguard Worker 1622*9880d681SAndroid Build Coastguard Workerdef: Pat<(eh_return), 1623*9880d681SAndroid Build Coastguard Worker (EH_RETURN_JMPR (i32 R31))>; 1624*9880d681SAndroid Build Coastguard Workerdef: Pat<(brind (i32 IntRegs:$dst)), 1625*9880d681SAndroid Build Coastguard Worker (J2_jumpr IntRegs:$dst)>; 1626*9880d681SAndroid Build Coastguard Worker 1627*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1628*9880d681SAndroid Build Coastguard Worker// JR - 1629*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1630*9880d681SAndroid Build Coastguard Worker 1631*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1632*9880d681SAndroid Build Coastguard Worker// LD + 1633*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1634*9880d681SAndroid Build Coastguard Worker 1635*9880d681SAndroid Build Coastguard Worker// Load - Base with Immediate offset addressing mode 1636*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, opExtendable = 2, isExtentSigned = 1, AddedComplexity = 20 in 1637*9880d681SAndroid Build Coastguard Workerclass T_load_io <string mnemonic, RegisterClass RC, bits<4> MajOp, 1638*9880d681SAndroid Build Coastguard Worker Operand ImmOp> 1639*9880d681SAndroid Build Coastguard Worker : LDInst<(outs RC:$dst), (ins IntRegs:$src1, ImmOp:$offset), 1640*9880d681SAndroid Build Coastguard Worker "$dst = "#mnemonic#"($src1 + #$offset)", []>, AddrModeRel { 1641*9880d681SAndroid Build Coastguard Worker bits<4> name; 1642*9880d681SAndroid Build Coastguard Worker bits<5> dst; 1643*9880d681SAndroid Build Coastguard Worker bits<5> src1; 1644*9880d681SAndroid Build Coastguard Worker bits<14> offset; 1645*9880d681SAndroid Build Coastguard Worker bits<11> offsetBits; 1646*9880d681SAndroid Build Coastguard Worker 1647*9880d681SAndroid Build Coastguard Worker string ImmOpStr = !cast<string>(ImmOp); 1648*9880d681SAndroid Build Coastguard Worker let offsetBits = !if (!eq(ImmOpStr, "s11_3Ext"), offset{13-3}, 1649*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "s11_2Ext"), offset{12-2}, 1650*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "s11_1Ext"), offset{11-1}, 1651*9880d681SAndroid Build Coastguard Worker /* s11_0Ext */ offset{10-0}))); 1652*9880d681SAndroid Build Coastguard Worker let opExtentBits = !if (!eq(ImmOpStr, "s11_3Ext"), 14, 1653*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "s11_2Ext"), 13, 1654*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "s11_1Ext"), 12, 1655*9880d681SAndroid Build Coastguard Worker /* s11_0Ext */ 11))); 1656*9880d681SAndroid Build Coastguard Worker let hasNewValue = !if (!eq(!cast<string>(RC), "DoubleRegs"), 0, 1); 1657*9880d681SAndroid Build Coastguard Worker 1658*9880d681SAndroid Build Coastguard Worker let IClass = 0b1001; 1659*9880d681SAndroid Build Coastguard Worker 1660*9880d681SAndroid Build Coastguard Worker let Inst{27} = 0b0; 1661*9880d681SAndroid Build Coastguard Worker let Inst{26-25} = offsetBits{10-9}; 1662*9880d681SAndroid Build Coastguard Worker let Inst{24-21} = MajOp; 1663*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src1; 1664*9880d681SAndroid Build Coastguard Worker let Inst{13-5} = offsetBits{8-0}; 1665*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 1666*9880d681SAndroid Build Coastguard Worker } 1667*9880d681SAndroid Build Coastguard Worker 1668*9880d681SAndroid Build Coastguard Workerlet opExtendable = 3, isExtentSigned = 0, isPredicated = 1 in 1669*9880d681SAndroid Build Coastguard Workerclass T_pload_io <string mnemonic, RegisterClass RC, bits<4>MajOp, 1670*9880d681SAndroid Build Coastguard Worker Operand ImmOp, bit isNot, bit isPredNew> 1671*9880d681SAndroid Build Coastguard Worker : LDInst<(outs RC:$dst), 1672*9880d681SAndroid Build Coastguard Worker (ins PredRegs:$src1, IntRegs:$src2, ImmOp:$offset), 1673*9880d681SAndroid Build Coastguard Worker "if ("#!if(isNot, "!$src1", "$src1") 1674*9880d681SAndroid Build Coastguard Worker #!if(isPredNew, ".new", "") 1675*9880d681SAndroid Build Coastguard Worker #") $dst = "#mnemonic#"($src2 + #$offset)", 1676*9880d681SAndroid Build Coastguard Worker [],"", V2LDST_tc_ld_SLOT01> , AddrModeRel { 1677*9880d681SAndroid Build Coastguard Worker bits<5> dst; 1678*9880d681SAndroid Build Coastguard Worker bits<2> src1; 1679*9880d681SAndroid Build Coastguard Worker bits<5> src2; 1680*9880d681SAndroid Build Coastguard Worker bits<9> offset; 1681*9880d681SAndroid Build Coastguard Worker bits<6> offsetBits; 1682*9880d681SAndroid Build Coastguard Worker string ImmOpStr = !cast<string>(ImmOp); 1683*9880d681SAndroid Build Coastguard Worker 1684*9880d681SAndroid Build Coastguard Worker let offsetBits = !if (!eq(ImmOpStr, "u6_3Ext"), offset{8-3}, 1685*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "u6_2Ext"), offset{7-2}, 1686*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "u6_1Ext"), offset{6-1}, 1687*9880d681SAndroid Build Coastguard Worker /* u6_0Ext */ offset{5-0}))); 1688*9880d681SAndroid Build Coastguard Worker let opExtentBits = !if (!eq(ImmOpStr, "u6_3Ext"), 9, 1689*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "u6_2Ext"), 8, 1690*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "u6_1Ext"), 7, 1691*9880d681SAndroid Build Coastguard Worker /* u6_0Ext */ 6))); 1692*9880d681SAndroid Build Coastguard Worker let hasNewValue = !if (!eq(ImmOpStr, "u6_3Ext"), 0, 1); 1693*9880d681SAndroid Build Coastguard Worker let isPredicatedNew = isPredNew; 1694*9880d681SAndroid Build Coastguard Worker let isPredicatedFalse = isNot; 1695*9880d681SAndroid Build Coastguard Worker 1696*9880d681SAndroid Build Coastguard Worker let IClass = 0b0100; 1697*9880d681SAndroid Build Coastguard Worker 1698*9880d681SAndroid Build Coastguard Worker let Inst{27} = 0b0; 1699*9880d681SAndroid Build Coastguard Worker let Inst{27} = 0b0; 1700*9880d681SAndroid Build Coastguard Worker let Inst{26} = isNot; 1701*9880d681SAndroid Build Coastguard Worker let Inst{25} = isPredNew; 1702*9880d681SAndroid Build Coastguard Worker let Inst{24-21} = MajOp; 1703*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src2; 1704*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 1705*9880d681SAndroid Build Coastguard Worker let Inst{12-11} = src1; 1706*9880d681SAndroid Build Coastguard Worker let Inst{10-5} = offsetBits; 1707*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 1708*9880d681SAndroid Build Coastguard Worker } 1709*9880d681SAndroid Build Coastguard Worker 1710*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, hasSideEffects = 0, addrMode = BaseImmOffset in 1711*9880d681SAndroid Build Coastguard Workermulticlass LD_Idxd<string mnemonic, string CextOp, RegisterClass RC, 1712*9880d681SAndroid Build Coastguard Worker Operand ImmOp, Operand predImmOp, bits<4>MajOp> { 1713*9880d681SAndroid Build Coastguard Worker let CextOpcode = CextOp, BaseOpcode = CextOp#_indexed in { 1714*9880d681SAndroid Build Coastguard Worker let isPredicable = 1 in 1715*9880d681SAndroid Build Coastguard Worker def L2_#NAME#_io : T_load_io <mnemonic, RC, MajOp, ImmOp>; 1716*9880d681SAndroid Build Coastguard Worker 1717*9880d681SAndroid Build Coastguard Worker // Predicated 1718*9880d681SAndroid Build Coastguard Worker def L2_p#NAME#t_io : T_pload_io <mnemonic, RC, MajOp, predImmOp, 0, 0>; 1719*9880d681SAndroid Build Coastguard Worker def L2_p#NAME#f_io : T_pload_io <mnemonic, RC, MajOp, predImmOp, 1, 0>; 1720*9880d681SAndroid Build Coastguard Worker 1721*9880d681SAndroid Build Coastguard Worker // Predicated new 1722*9880d681SAndroid Build Coastguard Worker def L2_p#NAME#tnew_io : T_pload_io <mnemonic, RC, MajOp, predImmOp, 0, 1>; 1723*9880d681SAndroid Build Coastguard Worker def L2_p#NAME#fnew_io : T_pload_io <mnemonic, RC, MajOp, predImmOp, 1, 1>; 1724*9880d681SAndroid Build Coastguard Worker } 1725*9880d681SAndroid Build Coastguard Worker} 1726*9880d681SAndroid Build Coastguard Worker 1727*9880d681SAndroid Build Coastguard Workerlet accessSize = ByteAccess in { 1728*9880d681SAndroid Build Coastguard Worker defm loadrb: LD_Idxd <"memb", "LDrib", IntRegs, s11_0Ext, u6_0Ext, 0b1000>; 1729*9880d681SAndroid Build Coastguard Worker defm loadrub: LD_Idxd <"memub", "LDriub", IntRegs, s11_0Ext, u6_0Ext, 0b1001>; 1730*9880d681SAndroid Build Coastguard Worker} 1731*9880d681SAndroid Build Coastguard Worker 1732*9880d681SAndroid Build Coastguard Workerlet accessSize = HalfWordAccess, opExtentAlign = 1 in { 1733*9880d681SAndroid Build Coastguard Worker defm loadrh: LD_Idxd <"memh", "LDrih", IntRegs, s11_1Ext, u6_1Ext, 0b1010>; 1734*9880d681SAndroid Build Coastguard Worker defm loadruh: LD_Idxd <"memuh", "LDriuh", IntRegs, s11_1Ext, u6_1Ext, 0b1011>; 1735*9880d681SAndroid Build Coastguard Worker} 1736*9880d681SAndroid Build Coastguard Worker 1737*9880d681SAndroid Build Coastguard Workerlet accessSize = WordAccess, opExtentAlign = 2 in 1738*9880d681SAndroid Build Coastguard Workerdefm loadri: LD_Idxd <"memw", "LDriw", IntRegs, s11_2Ext, u6_2Ext, 0b1100>; 1739*9880d681SAndroid Build Coastguard Worker 1740*9880d681SAndroid Build Coastguard Workerlet accessSize = DoubleWordAccess, opExtentAlign = 3 in 1741*9880d681SAndroid Build Coastguard Workerdefm loadrd: LD_Idxd <"memd", "LDrid", DoubleRegs, s11_3Ext, u6_3Ext, 0b1110>; 1742*9880d681SAndroid Build Coastguard Worker 1743*9880d681SAndroid Build Coastguard Workerlet accessSize = HalfWordAccess, opExtentAlign = 1 in { 1744*9880d681SAndroid Build Coastguard Worker def L2_loadbsw2_io: T_load_io<"membh", IntRegs, 0b0001, s11_1Ext>; 1745*9880d681SAndroid Build Coastguard Worker def L2_loadbzw2_io: T_load_io<"memubh", IntRegs, 0b0011, s11_1Ext>; 1746*9880d681SAndroid Build Coastguard Worker} 1747*9880d681SAndroid Build Coastguard Worker 1748*9880d681SAndroid Build Coastguard Workerlet accessSize = WordAccess, opExtentAlign = 2 in { 1749*9880d681SAndroid Build Coastguard Worker def L2_loadbzw4_io: T_load_io<"memubh", DoubleRegs, 0b0101, s11_2Ext>; 1750*9880d681SAndroid Build Coastguard Worker def L2_loadbsw4_io: T_load_io<"membh", DoubleRegs, 0b0111, s11_2Ext>; 1751*9880d681SAndroid Build Coastguard Worker} 1752*9880d681SAndroid Build Coastguard Worker 1753*9880d681SAndroid Build Coastguard Workerlet addrMode = BaseImmOffset, isExtendable = 1, hasSideEffects = 0, 1754*9880d681SAndroid Build Coastguard Worker opExtendable = 3, isExtentSigned = 1 in 1755*9880d681SAndroid Build Coastguard Workerclass T_loadalign_io <string str, bits<4> MajOp, Operand ImmOp> 1756*9880d681SAndroid Build Coastguard Worker : LDInst<(outs DoubleRegs:$dst), 1757*9880d681SAndroid Build Coastguard Worker (ins DoubleRegs:$src1, IntRegs:$src2, ImmOp:$offset), 1758*9880d681SAndroid Build Coastguard Worker "$dst = "#str#"($src2 + #$offset)", [], 1759*9880d681SAndroid Build Coastguard Worker "$src1 = $dst">, AddrModeRel { 1760*9880d681SAndroid Build Coastguard Worker bits<4> name; 1761*9880d681SAndroid Build Coastguard Worker bits<5> dst; 1762*9880d681SAndroid Build Coastguard Worker bits<5> src2; 1763*9880d681SAndroid Build Coastguard Worker bits<12> offset; 1764*9880d681SAndroid Build Coastguard Worker bits<11> offsetBits; 1765*9880d681SAndroid Build Coastguard Worker 1766*9880d681SAndroid Build Coastguard Worker let offsetBits = !if (!eq(!cast<string>(ImmOp), "s11_1Ext"), offset{11-1}, 1767*9880d681SAndroid Build Coastguard Worker /* s11_0Ext */ offset{10-0}); 1768*9880d681SAndroid Build Coastguard Worker let IClass = 0b1001; 1769*9880d681SAndroid Build Coastguard Worker 1770*9880d681SAndroid Build Coastguard Worker let Inst{27} = 0b0; 1771*9880d681SAndroid Build Coastguard Worker let Inst{26-25} = offsetBits{10-9}; 1772*9880d681SAndroid Build Coastguard Worker let Inst{24-21} = MajOp; 1773*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src2; 1774*9880d681SAndroid Build Coastguard Worker let Inst{13-5} = offsetBits{8-0}; 1775*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 1776*9880d681SAndroid Build Coastguard Worker } 1777*9880d681SAndroid Build Coastguard Worker 1778*9880d681SAndroid Build Coastguard Workerlet accessSize = HalfWordAccess, opExtentBits = 12, opExtentAlign = 1 in 1779*9880d681SAndroid Build Coastguard Workerdef L2_loadalignh_io: T_loadalign_io <"memh_fifo", 0b0010, s11_1Ext>; 1780*9880d681SAndroid Build Coastguard Worker 1781*9880d681SAndroid Build Coastguard Workerlet accessSize = ByteAccess, opExtentBits = 11 in 1782*9880d681SAndroid Build Coastguard Workerdef L2_loadalignb_io: T_loadalign_io <"memb_fifo", 0b0100, s11_0Ext>; 1783*9880d681SAndroid Build Coastguard Worker 1784*9880d681SAndroid Build Coastguard Worker// Patterns to select load-indexed (i.e. load from base+offset). 1785*9880d681SAndroid Build Coastguard Workermulticlass Loadx_pat<PatFrag Load, ValueType VT, PatLeaf ImmPred, 1786*9880d681SAndroid Build Coastguard Worker InstHexagon MI> { 1787*9880d681SAndroid Build Coastguard Worker def: Pat<(VT (Load AddrFI:$fi)), (VT (MI AddrFI:$fi, 0))>; 1788*9880d681SAndroid Build Coastguard Worker def: Pat<(VT (Load (add (i32 AddrFI:$fi), ImmPred:$Off))), 1789*9880d681SAndroid Build Coastguard Worker (VT (MI AddrFI:$fi, imm:$Off))>; 1790*9880d681SAndroid Build Coastguard Worker def: Pat<(VT (Load (add (i32 IntRegs:$Rs), ImmPred:$Off))), 1791*9880d681SAndroid Build Coastguard Worker (VT (MI IntRegs:$Rs, imm:$Off))>; 1792*9880d681SAndroid Build Coastguard Worker def: Pat<(VT (Load (i32 IntRegs:$Rs))), (VT (MI IntRegs:$Rs, 0))>; 1793*9880d681SAndroid Build Coastguard Worker} 1794*9880d681SAndroid Build Coastguard Worker 1795*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 20 in { 1796*9880d681SAndroid Build Coastguard Worker defm: Loadx_pat<load, i32, s30_2ImmPred, L2_loadri_io>; 1797*9880d681SAndroid Build Coastguard Worker defm: Loadx_pat<load, i64, s29_3ImmPred, L2_loadrd_io>; 1798*9880d681SAndroid Build Coastguard Worker defm: Loadx_pat<atomic_load_8 , i32, s32_0ImmPred, L2_loadrub_io>; 1799*9880d681SAndroid Build Coastguard Worker defm: Loadx_pat<atomic_load_16, i32, s31_1ImmPred, L2_loadruh_io>; 1800*9880d681SAndroid Build Coastguard Worker defm: Loadx_pat<atomic_load_32, i32, s30_2ImmPred, L2_loadri_io>; 1801*9880d681SAndroid Build Coastguard Worker defm: Loadx_pat<atomic_load_64, i64, s29_3ImmPred, L2_loadrd_io>; 1802*9880d681SAndroid Build Coastguard Worker 1803*9880d681SAndroid Build Coastguard Worker defm: Loadx_pat<extloadi1, i32, s32_0ImmPred, L2_loadrub_io>; 1804*9880d681SAndroid Build Coastguard Worker defm: Loadx_pat<extloadi8, i32, s32_0ImmPred, L2_loadrub_io>; 1805*9880d681SAndroid Build Coastguard Worker defm: Loadx_pat<extloadi16, i32, s31_1ImmPred, L2_loadruh_io>; 1806*9880d681SAndroid Build Coastguard Worker defm: Loadx_pat<sextloadi8, i32, s32_0ImmPred, L2_loadrb_io>; 1807*9880d681SAndroid Build Coastguard Worker defm: Loadx_pat<sextloadi16, i32, s31_1ImmPred, L2_loadrh_io>; 1808*9880d681SAndroid Build Coastguard Worker defm: Loadx_pat<zextloadi1, i32, s32_0ImmPred, L2_loadrub_io>; 1809*9880d681SAndroid Build Coastguard Worker defm: Loadx_pat<zextloadi8, i32, s32_0ImmPred, L2_loadrub_io>; 1810*9880d681SAndroid Build Coastguard Worker defm: Loadx_pat<zextloadi16, i32, s31_1ImmPred, L2_loadruh_io>; 1811*9880d681SAndroid Build Coastguard Worker // No sextloadi1. 1812*9880d681SAndroid Build Coastguard Worker} 1813*9880d681SAndroid Build Coastguard Worker 1814*9880d681SAndroid Build Coastguard Worker// Sign-extending loads of i1 need to replicate the lowest bit throughout 1815*9880d681SAndroid Build Coastguard Worker// the 32-bit value. Since the loaded value can only be 0 or 1, 0-v should 1816*9880d681SAndroid Build Coastguard Worker// do the trick. 1817*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 20 in 1818*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (sextloadi1 (i32 IntRegs:$Rs))), 1819*9880d681SAndroid Build Coastguard Worker (A2_subri 0, (L2_loadrub_io IntRegs:$Rs, 0))>; 1820*9880d681SAndroid Build Coastguard Worker 1821*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1822*9880d681SAndroid Build Coastguard Worker// Post increment load 1823*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1824*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1825*9880d681SAndroid Build Coastguard Worker// Template class for non-predicated post increment loads with immediate offset. 1826*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1827*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, addrMode = PostInc in 1828*9880d681SAndroid Build Coastguard Workerclass T_load_pi <string mnemonic, RegisterClass RC, Operand ImmOp, 1829*9880d681SAndroid Build Coastguard Worker bits<4> MajOp > 1830*9880d681SAndroid Build Coastguard Worker : LDInstPI <(outs RC:$dst, IntRegs:$dst2), 1831*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$src1, ImmOp:$offset), 1832*9880d681SAndroid Build Coastguard Worker "$dst = "#mnemonic#"($src1++#$offset)" , 1833*9880d681SAndroid Build Coastguard Worker [], 1834*9880d681SAndroid Build Coastguard Worker "$src1 = $dst2" > , 1835*9880d681SAndroid Build Coastguard Worker PredNewRel { 1836*9880d681SAndroid Build Coastguard Worker bits<5> dst; 1837*9880d681SAndroid Build Coastguard Worker bits<5> src1; 1838*9880d681SAndroid Build Coastguard Worker bits<7> offset; 1839*9880d681SAndroid Build Coastguard Worker bits<4> offsetBits; 1840*9880d681SAndroid Build Coastguard Worker 1841*9880d681SAndroid Build Coastguard Worker string ImmOpStr = !cast<string>(ImmOp); 1842*9880d681SAndroid Build Coastguard Worker let offsetBits = !if (!eq(ImmOpStr, "s4_3Imm"), offset{6-3}, 1843*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "s4_2Imm"), offset{5-2}, 1844*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "s4_1Imm"), offset{4-1}, 1845*9880d681SAndroid Build Coastguard Worker /* s4_0Imm */ offset{3-0}))); 1846*9880d681SAndroid Build Coastguard Worker let hasNewValue = !if (!eq(ImmOpStr, "s4_3Imm"), 0, 1); 1847*9880d681SAndroid Build Coastguard Worker 1848*9880d681SAndroid Build Coastguard Worker let IClass = 0b1001; 1849*9880d681SAndroid Build Coastguard Worker 1850*9880d681SAndroid Build Coastguard Worker let Inst{27-25} = 0b101; 1851*9880d681SAndroid Build Coastguard Worker let Inst{24-21} = MajOp; 1852*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src1; 1853*9880d681SAndroid Build Coastguard Worker let Inst{13-12} = 0b00; 1854*9880d681SAndroid Build Coastguard Worker let Inst{8-5} = offsetBits; 1855*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 1856*9880d681SAndroid Build Coastguard Worker } 1857*9880d681SAndroid Build Coastguard Worker 1858*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1859*9880d681SAndroid Build Coastguard Worker// Template class for predicated post increment loads with immediate offset. 1860*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1861*9880d681SAndroid Build Coastguard Workerlet isPredicated = 1, hasSideEffects = 0, addrMode = PostInc in 1862*9880d681SAndroid Build Coastguard Workerclass T_pload_pi <string mnemonic, RegisterClass RC, Operand ImmOp, 1863*9880d681SAndroid Build Coastguard Worker bits<4> MajOp, bit isPredNot, bit isPredNew > 1864*9880d681SAndroid Build Coastguard Worker : LDInst <(outs RC:$dst, IntRegs:$dst2), 1865*9880d681SAndroid Build Coastguard Worker (ins PredRegs:$src1, IntRegs:$src2, ImmOp:$offset), 1866*9880d681SAndroid Build Coastguard Worker !if(isPredNot, "if (!$src1", "if ($src1")#!if(isPredNew, ".new) ", 1867*9880d681SAndroid Build Coastguard Worker ") ")#"$dst = "#mnemonic#"($src2++#$offset)", 1868*9880d681SAndroid Build Coastguard Worker [] , 1869*9880d681SAndroid Build Coastguard Worker "$src2 = $dst2" > , 1870*9880d681SAndroid Build Coastguard Worker PredNewRel { 1871*9880d681SAndroid Build Coastguard Worker bits<5> dst; 1872*9880d681SAndroid Build Coastguard Worker bits<2> src1; 1873*9880d681SAndroid Build Coastguard Worker bits<5> src2; 1874*9880d681SAndroid Build Coastguard Worker bits<7> offset; 1875*9880d681SAndroid Build Coastguard Worker bits<4> offsetBits; 1876*9880d681SAndroid Build Coastguard Worker 1877*9880d681SAndroid Build Coastguard Worker let isPredicatedNew = isPredNew; 1878*9880d681SAndroid Build Coastguard Worker let isPredicatedFalse = isPredNot; 1879*9880d681SAndroid Build Coastguard Worker 1880*9880d681SAndroid Build Coastguard Worker string ImmOpStr = !cast<string>(ImmOp); 1881*9880d681SAndroid Build Coastguard Worker let offsetBits = !if (!eq(ImmOpStr, "s4_3Imm"), offset{6-3}, 1882*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "s4_2Imm"), offset{5-2}, 1883*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "s4_1Imm"), offset{4-1}, 1884*9880d681SAndroid Build Coastguard Worker /* s4_0Imm */ offset{3-0}))); 1885*9880d681SAndroid Build Coastguard Worker let hasNewValue = !if (!eq(ImmOpStr, "s4_3Imm"), 0, 1); 1886*9880d681SAndroid Build Coastguard Worker 1887*9880d681SAndroid Build Coastguard Worker let IClass = 0b1001; 1888*9880d681SAndroid Build Coastguard Worker 1889*9880d681SAndroid Build Coastguard Worker let Inst{27-25} = 0b101; 1890*9880d681SAndroid Build Coastguard Worker let Inst{24-21} = MajOp; 1891*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src2; 1892*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b1; 1893*9880d681SAndroid Build Coastguard Worker let Inst{12} = isPredNew; 1894*9880d681SAndroid Build Coastguard Worker let Inst{11} = isPredNot; 1895*9880d681SAndroid Build Coastguard Worker let Inst{10-9} = src1; 1896*9880d681SAndroid Build Coastguard Worker let Inst{8-5} = offsetBits; 1897*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 1898*9880d681SAndroid Build Coastguard Worker } 1899*9880d681SAndroid Build Coastguard Worker 1900*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1901*9880d681SAndroid Build Coastguard Worker// Multiclass for post increment loads with immediate offset. 1902*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1903*9880d681SAndroid Build Coastguard Worker 1904*9880d681SAndroid Build Coastguard Workermulticlass LD_PostInc <string mnemonic, string BaseOp, RegisterClass RC, 1905*9880d681SAndroid Build Coastguard Worker Operand ImmOp, bits<4> MajOp> { 1906*9880d681SAndroid Build Coastguard Worker let BaseOpcode = "POST_"#BaseOp in { 1907*9880d681SAndroid Build Coastguard Worker let isPredicable = 1 in 1908*9880d681SAndroid Build Coastguard Worker def L2_#NAME#_pi : T_load_pi < mnemonic, RC, ImmOp, MajOp>; 1909*9880d681SAndroid Build Coastguard Worker 1910*9880d681SAndroid Build Coastguard Worker // Predicated 1911*9880d681SAndroid Build Coastguard Worker def L2_p#NAME#t_pi : T_pload_pi < mnemonic, RC, ImmOp, MajOp, 0, 0>; 1912*9880d681SAndroid Build Coastguard Worker def L2_p#NAME#f_pi : T_pload_pi < mnemonic, RC, ImmOp, MajOp, 1, 0>; 1913*9880d681SAndroid Build Coastguard Worker 1914*9880d681SAndroid Build Coastguard Worker // Predicated new 1915*9880d681SAndroid Build Coastguard Worker def L2_p#NAME#tnew_pi : T_pload_pi < mnemonic, RC, ImmOp, MajOp, 0, 1>; 1916*9880d681SAndroid Build Coastguard Worker def L2_p#NAME#fnew_pi : T_pload_pi < mnemonic, RC, ImmOp, MajOp, 1, 1>; 1917*9880d681SAndroid Build Coastguard Worker } 1918*9880d681SAndroid Build Coastguard Worker} 1919*9880d681SAndroid Build Coastguard Worker 1920*9880d681SAndroid Build Coastguard Worker// post increment byte loads with immediate offset 1921*9880d681SAndroid Build Coastguard Workerlet accessSize = ByteAccess in { 1922*9880d681SAndroid Build Coastguard Worker defm loadrb : LD_PostInc <"memb", "LDrib", IntRegs, s4_0Imm, 0b1000>; 1923*9880d681SAndroid Build Coastguard Worker defm loadrub : LD_PostInc <"memub", "LDriub", IntRegs, s4_0Imm, 0b1001>; 1924*9880d681SAndroid Build Coastguard Worker} 1925*9880d681SAndroid Build Coastguard Worker 1926*9880d681SAndroid Build Coastguard Worker// post increment halfword loads with immediate offset 1927*9880d681SAndroid Build Coastguard Workerlet accessSize = HalfWordAccess, opExtentAlign = 1 in { 1928*9880d681SAndroid Build Coastguard Worker defm loadrh : LD_PostInc <"memh", "LDrih", IntRegs, s4_1Imm, 0b1010>; 1929*9880d681SAndroid Build Coastguard Worker defm loadruh : LD_PostInc <"memuh", "LDriuh", IntRegs, s4_1Imm, 0b1011>; 1930*9880d681SAndroid Build Coastguard Worker} 1931*9880d681SAndroid Build Coastguard Worker 1932*9880d681SAndroid Build Coastguard Worker// post increment word loads with immediate offset 1933*9880d681SAndroid Build Coastguard Workerlet accessSize = WordAccess, opExtentAlign = 2 in 1934*9880d681SAndroid Build Coastguard Workerdefm loadri : LD_PostInc <"memw", "LDriw", IntRegs, s4_2Imm, 0b1100>; 1935*9880d681SAndroid Build Coastguard Worker 1936*9880d681SAndroid Build Coastguard Worker// post increment doubleword loads with immediate offset 1937*9880d681SAndroid Build Coastguard Workerlet accessSize = DoubleWordAccess, opExtentAlign = 3 in 1938*9880d681SAndroid Build Coastguard Workerdefm loadrd : LD_PostInc <"memd", "LDrid", DoubleRegs, s4_3Imm, 0b1110>; 1939*9880d681SAndroid Build Coastguard Worker 1940*9880d681SAndroid Build Coastguard Worker// Rd=memb[u]h(Rx++#s4:1) 1941*9880d681SAndroid Build Coastguard Worker// Rdd=memb[u]h(Rx++#s4:2) 1942*9880d681SAndroid Build Coastguard Workerlet accessSize = HalfWordAccess, opExtentAlign = 1 in { 1943*9880d681SAndroid Build Coastguard Worker def L2_loadbsw2_pi : T_load_pi <"membh", IntRegs, s4_1Imm, 0b0001>; 1944*9880d681SAndroid Build Coastguard Worker def L2_loadbzw2_pi : T_load_pi <"memubh", IntRegs, s4_1Imm, 0b0011>; 1945*9880d681SAndroid Build Coastguard Worker} 1946*9880d681SAndroid Build Coastguard Workerlet accessSize = WordAccess, opExtentAlign = 2, hasNewValue = 0 in { 1947*9880d681SAndroid Build Coastguard Worker def L2_loadbsw4_pi : T_load_pi <"membh", DoubleRegs, s4_2Imm, 0b0111>; 1948*9880d681SAndroid Build Coastguard Worker def L2_loadbzw4_pi : T_load_pi <"memubh", DoubleRegs, s4_2Imm, 0b0101>; 1949*9880d681SAndroid Build Coastguard Worker} 1950*9880d681SAndroid Build Coastguard Worker 1951*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1952*9880d681SAndroid Build Coastguard Worker// Template class for post increment fifo loads with immediate offset. 1953*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1954*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, addrMode = PostInc in 1955*9880d681SAndroid Build Coastguard Workerclass T_loadalign_pi <string mnemonic, Operand ImmOp, bits<4> MajOp > 1956*9880d681SAndroid Build Coastguard Worker : LDInstPI <(outs DoubleRegs:$dst, IntRegs:$dst2), 1957*9880d681SAndroid Build Coastguard Worker (ins DoubleRegs:$src1, IntRegs:$src2, ImmOp:$offset), 1958*9880d681SAndroid Build Coastguard Worker "$dst = "#mnemonic#"($src2++#$offset)" , 1959*9880d681SAndroid Build Coastguard Worker [], "$src2 = $dst2, $src1 = $dst" > , 1960*9880d681SAndroid Build Coastguard Worker PredNewRel { 1961*9880d681SAndroid Build Coastguard Worker bits<5> dst; 1962*9880d681SAndroid Build Coastguard Worker bits<5> src2; 1963*9880d681SAndroid Build Coastguard Worker bits<5> offset; 1964*9880d681SAndroid Build Coastguard Worker bits<4> offsetBits; 1965*9880d681SAndroid Build Coastguard Worker 1966*9880d681SAndroid Build Coastguard Worker let offsetBits = !if (!eq(!cast<string>(ImmOp), "s4_1Imm"), offset{4-1}, 1967*9880d681SAndroid Build Coastguard Worker /* s4_0Imm */ offset{3-0}); 1968*9880d681SAndroid Build Coastguard Worker let IClass = 0b1001; 1969*9880d681SAndroid Build Coastguard Worker 1970*9880d681SAndroid Build Coastguard Worker let Inst{27-25} = 0b101; 1971*9880d681SAndroid Build Coastguard Worker let Inst{24-21} = MajOp; 1972*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src2; 1973*9880d681SAndroid Build Coastguard Worker let Inst{13-12} = 0b00; 1974*9880d681SAndroid Build Coastguard Worker let Inst{8-5} = offsetBits; 1975*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 1976*9880d681SAndroid Build Coastguard Worker } 1977*9880d681SAndroid Build Coastguard Worker 1978*9880d681SAndroid Build Coastguard Worker// Ryy=memh_fifo(Rx++#s4:1) 1979*9880d681SAndroid Build Coastguard Worker// Ryy=memb_fifo(Rx++#s4:0) 1980*9880d681SAndroid Build Coastguard Workerlet accessSize = ByteAccess in 1981*9880d681SAndroid Build Coastguard Workerdef L2_loadalignb_pi : T_loadalign_pi <"memb_fifo", s4_0Imm, 0b0100>; 1982*9880d681SAndroid Build Coastguard Worker 1983*9880d681SAndroid Build Coastguard Workerlet accessSize = HalfWordAccess, opExtentAlign = 1 in 1984*9880d681SAndroid Build Coastguard Workerdef L2_loadalignh_pi : T_loadalign_pi <"memh_fifo", s4_1Imm, 0b0010>; 1985*9880d681SAndroid Build Coastguard Worker 1986*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1987*9880d681SAndroid Build Coastguard Worker// Template class for post increment loads with register offset. 1988*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1989*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, addrMode = PostInc in 1990*9880d681SAndroid Build Coastguard Workerclass T_load_pr <string mnemonic, RegisterClass RC, bits<4> MajOp, 1991*9880d681SAndroid Build Coastguard Worker MemAccessSize AccessSz> 1992*9880d681SAndroid Build Coastguard Worker : LDInstPI <(outs RC:$dst, IntRegs:$_dst_), 1993*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$src1, ModRegs:$src2), 1994*9880d681SAndroid Build Coastguard Worker "$dst = "#mnemonic#"($src1++$src2)" , 1995*9880d681SAndroid Build Coastguard Worker [], "$src1 = $_dst_" > { 1996*9880d681SAndroid Build Coastguard Worker bits<5> dst; 1997*9880d681SAndroid Build Coastguard Worker bits<5> src1; 1998*9880d681SAndroid Build Coastguard Worker bits<1> src2; 1999*9880d681SAndroid Build Coastguard Worker 2000*9880d681SAndroid Build Coastguard Worker let accessSize = AccessSz; 2001*9880d681SAndroid Build Coastguard Worker let IClass = 0b1001; 2002*9880d681SAndroid Build Coastguard Worker 2003*9880d681SAndroid Build Coastguard Worker let Inst{27-25} = 0b110; 2004*9880d681SAndroid Build Coastguard Worker let Inst{24-21} = MajOp; 2005*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src1; 2006*9880d681SAndroid Build Coastguard Worker let Inst{13} = src2; 2007*9880d681SAndroid Build Coastguard Worker let Inst{12} = 0b0; 2008*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0b0; 2009*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 2010*9880d681SAndroid Build Coastguard Worker } 2011*9880d681SAndroid Build Coastguard Worker 2012*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1 in { 2013*9880d681SAndroid Build Coastguard Worker def L2_loadrb_pr : T_load_pr <"memb", IntRegs, 0b1000, ByteAccess>; 2014*9880d681SAndroid Build Coastguard Worker def L2_loadrub_pr : T_load_pr <"memub", IntRegs, 0b1001, ByteAccess>; 2015*9880d681SAndroid Build Coastguard Worker def L2_loadrh_pr : T_load_pr <"memh", IntRegs, 0b1010, HalfWordAccess>; 2016*9880d681SAndroid Build Coastguard Worker def L2_loadruh_pr : T_load_pr <"memuh", IntRegs, 0b1011, HalfWordAccess>; 2017*9880d681SAndroid Build Coastguard Worker def L2_loadri_pr : T_load_pr <"memw", IntRegs, 0b1100, WordAccess>; 2018*9880d681SAndroid Build Coastguard Worker 2019*9880d681SAndroid Build Coastguard Worker def L2_loadbzw2_pr : T_load_pr <"memubh", IntRegs, 0b0011, HalfWordAccess>; 2020*9880d681SAndroid Build Coastguard Worker} 2021*9880d681SAndroid Build Coastguard Worker 2022*9880d681SAndroid Build Coastguard Workerdef L2_loadrd_pr : T_load_pr <"memd", DoubleRegs, 0b1110, DoubleWordAccess>; 2023*9880d681SAndroid Build Coastguard Workerdef L2_loadbzw4_pr : T_load_pr <"memubh", DoubleRegs, 0b0101, WordAccess>; 2024*9880d681SAndroid Build Coastguard Worker 2025*9880d681SAndroid Build Coastguard Worker// Load predicate. 2026*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, opExtendable = 2, isExtentSigned = 1, opExtentBits = 13, 2027*9880d681SAndroid Build Coastguard Worker isCodeGenOnly = 1, isPseudo = 1, hasSideEffects = 0 in 2028*9880d681SAndroid Build Coastguard Workerdef LDriw_pred : LDInst<(outs PredRegs:$dst), 2029*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$addr, s11_2Ext:$off), 2030*9880d681SAndroid Build Coastguard Worker ".error \"should not emit\"", []>; 2031*9880d681SAndroid Build Coastguard Worker// Load modifier. 2032*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, opExtendable = 2, isExtentSigned = 1, opExtentBits = 13, 2033*9880d681SAndroid Build Coastguard Worker isCodeGenOnly = 1, isPseudo = 1, hasSideEffects = 0 in 2034*9880d681SAndroid Build Coastguard Workerdef LDriw_mod : LDInst<(outs ModRegs:$dst), 2035*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$addr, s11_2Ext:$off), 2036*9880d681SAndroid Build Coastguard Worker ".error \"should not emit\"", []>; 2037*9880d681SAndroid Build Coastguard Worker 2038*9880d681SAndroid Build Coastguard Workerlet Defs = [R29, R30, R31], Uses = [R30], hasSideEffects = 0 in 2039*9880d681SAndroid Build Coastguard Worker def L2_deallocframe : LDInst<(outs), (ins), 2040*9880d681SAndroid Build Coastguard Worker "deallocframe", 2041*9880d681SAndroid Build Coastguard Worker []> { 2042*9880d681SAndroid Build Coastguard Worker let IClass = 0b1001; 2043*9880d681SAndroid Build Coastguard Worker 2044*9880d681SAndroid Build Coastguard Worker let Inst{27-16} = 0b000000011110; 2045*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 2046*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = 0b11110; 2047*9880d681SAndroid Build Coastguard Worker} 2048*9880d681SAndroid Build Coastguard Worker 2049*9880d681SAndroid Build Coastguard Worker// Load / Post increment circular addressing mode. 2050*9880d681SAndroid Build Coastguard Workerlet Uses = [CS], hasSideEffects = 0 in 2051*9880d681SAndroid Build Coastguard Workerclass T_load_pcr<string mnemonic, RegisterClass RC, bits<4> MajOp> 2052*9880d681SAndroid Build Coastguard Worker : LDInst <(outs RC:$dst, IntRegs:$_dst_), 2053*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$Rz, ModRegs:$Mu), 2054*9880d681SAndroid Build Coastguard Worker "$dst = "#mnemonic#"($Rz ++ I:circ($Mu))", [], 2055*9880d681SAndroid Build Coastguard Worker "$Rz = $_dst_" > { 2056*9880d681SAndroid Build Coastguard Worker bits<5> dst; 2057*9880d681SAndroid Build Coastguard Worker bits<5> Rz; 2058*9880d681SAndroid Build Coastguard Worker bit Mu; 2059*9880d681SAndroid Build Coastguard Worker 2060*9880d681SAndroid Build Coastguard Worker let hasNewValue = !if (!eq(!cast<string>(RC), "DoubleRegs"), 0, 1); 2061*9880d681SAndroid Build Coastguard Worker let IClass = 0b1001; 2062*9880d681SAndroid Build Coastguard Worker 2063*9880d681SAndroid Build Coastguard Worker let Inst{27-25} = 0b100; 2064*9880d681SAndroid Build Coastguard Worker let Inst{24-21} = MajOp; 2065*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rz; 2066*9880d681SAndroid Build Coastguard Worker let Inst{13} = Mu; 2067*9880d681SAndroid Build Coastguard Worker let Inst{12} = 0b0; 2068*9880d681SAndroid Build Coastguard Worker let Inst{9} = 0b1; 2069*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0b0; 2070*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 2071*9880d681SAndroid Build Coastguard Worker } 2072*9880d681SAndroid Build Coastguard Worker 2073*9880d681SAndroid Build Coastguard Workerlet accessSize = ByteAccess in { 2074*9880d681SAndroid Build Coastguard Worker def L2_loadrb_pcr : T_load_pcr <"memb", IntRegs, 0b1000>; 2075*9880d681SAndroid Build Coastguard Worker def L2_loadrub_pcr : T_load_pcr <"memub", IntRegs, 0b1001>; 2076*9880d681SAndroid Build Coastguard Worker} 2077*9880d681SAndroid Build Coastguard Worker 2078*9880d681SAndroid Build Coastguard Workerlet accessSize = HalfWordAccess in { 2079*9880d681SAndroid Build Coastguard Worker def L2_loadrh_pcr : T_load_pcr <"memh", IntRegs, 0b1010>; 2080*9880d681SAndroid Build Coastguard Worker def L2_loadruh_pcr : T_load_pcr <"memuh", IntRegs, 0b1011>; 2081*9880d681SAndroid Build Coastguard Worker def L2_loadbsw2_pcr : T_load_pcr <"membh", IntRegs, 0b0001>; 2082*9880d681SAndroid Build Coastguard Worker def L2_loadbzw2_pcr : T_load_pcr <"memubh", IntRegs, 0b0011>; 2083*9880d681SAndroid Build Coastguard Worker} 2084*9880d681SAndroid Build Coastguard Worker 2085*9880d681SAndroid Build Coastguard Workerlet accessSize = WordAccess in { 2086*9880d681SAndroid Build Coastguard Worker def L2_loadri_pcr : T_load_pcr <"memw", IntRegs, 0b1100>; 2087*9880d681SAndroid Build Coastguard Worker let hasNewValue = 0 in { 2088*9880d681SAndroid Build Coastguard Worker def L2_loadbzw4_pcr : T_load_pcr <"memubh", DoubleRegs, 0b0101>; 2089*9880d681SAndroid Build Coastguard Worker def L2_loadbsw4_pcr : T_load_pcr <"membh", DoubleRegs, 0b0111>; 2090*9880d681SAndroid Build Coastguard Worker } 2091*9880d681SAndroid Build Coastguard Worker} 2092*9880d681SAndroid Build Coastguard Worker 2093*9880d681SAndroid Build Coastguard Workerlet accessSize = DoubleWordAccess in 2094*9880d681SAndroid Build Coastguard Workerdef L2_loadrd_pcr : T_load_pcr <"memd", DoubleRegs, 0b1110>; 2095*9880d681SAndroid Build Coastguard Worker 2096*9880d681SAndroid Build Coastguard Worker// Load / Post increment circular addressing mode. 2097*9880d681SAndroid Build Coastguard Workerlet Uses = [CS], hasSideEffects = 0 in 2098*9880d681SAndroid Build Coastguard Workerclass T_loadalign_pcr<string mnemonic, bits<4> MajOp, MemAccessSize AccessSz > 2099*9880d681SAndroid Build Coastguard Worker : LDInst <(outs DoubleRegs:$dst, IntRegs:$_dst_), 2100*9880d681SAndroid Build Coastguard Worker (ins DoubleRegs:$_src_, IntRegs:$Rz, ModRegs:$Mu), 2101*9880d681SAndroid Build Coastguard Worker "$dst = "#mnemonic#"($Rz ++ I:circ($Mu))", [], 2102*9880d681SAndroid Build Coastguard Worker "$Rz = $_dst_, $dst = $_src_" > { 2103*9880d681SAndroid Build Coastguard Worker bits<5> dst; 2104*9880d681SAndroid Build Coastguard Worker bits<5> Rz; 2105*9880d681SAndroid Build Coastguard Worker bit Mu; 2106*9880d681SAndroid Build Coastguard Worker 2107*9880d681SAndroid Build Coastguard Worker let accessSize = AccessSz; 2108*9880d681SAndroid Build Coastguard Worker let IClass = 0b1001; 2109*9880d681SAndroid Build Coastguard Worker 2110*9880d681SAndroid Build Coastguard Worker let Inst{27-25} = 0b100; 2111*9880d681SAndroid Build Coastguard Worker let Inst{24-21} = MajOp; 2112*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rz; 2113*9880d681SAndroid Build Coastguard Worker let Inst{13} = Mu; 2114*9880d681SAndroid Build Coastguard Worker let Inst{12} = 0b0; 2115*9880d681SAndroid Build Coastguard Worker let Inst{9} = 0b1; 2116*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0b0; 2117*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 2118*9880d681SAndroid Build Coastguard Worker } 2119*9880d681SAndroid Build Coastguard Worker 2120*9880d681SAndroid Build Coastguard Workerdef L2_loadalignb_pcr : T_loadalign_pcr <"memb_fifo", 0b0100, ByteAccess>; 2121*9880d681SAndroid Build Coastguard Workerdef L2_loadalignh_pcr : T_loadalign_pcr <"memh_fifo", 0b0010, HalfWordAccess>; 2122*9880d681SAndroid Build Coastguard Worker 2123*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2124*9880d681SAndroid Build Coastguard Worker// Circular loads with immediate offset. 2125*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2126*9880d681SAndroid Build Coastguard Workerlet Uses = [CS], mayLoad = 1, hasSideEffects = 0 in 2127*9880d681SAndroid Build Coastguard Workerclass T_load_pci <string mnemonic, RegisterClass RC, 2128*9880d681SAndroid Build Coastguard Worker Operand ImmOp, bits<4> MajOp> 2129*9880d681SAndroid Build Coastguard Worker : LDInstPI<(outs RC:$dst, IntRegs:$_dst_), 2130*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$Rz, ImmOp:$offset, ModRegs:$Mu), 2131*9880d681SAndroid Build Coastguard Worker "$dst = "#mnemonic#"($Rz ++ #$offset:circ($Mu))", [], 2132*9880d681SAndroid Build Coastguard Worker "$Rz = $_dst_"> { 2133*9880d681SAndroid Build Coastguard Worker bits<5> dst; 2134*9880d681SAndroid Build Coastguard Worker bits<5> Rz; 2135*9880d681SAndroid Build Coastguard Worker bits<1> Mu; 2136*9880d681SAndroid Build Coastguard Worker bits<7> offset; 2137*9880d681SAndroid Build Coastguard Worker bits<4> offsetBits; 2138*9880d681SAndroid Build Coastguard Worker 2139*9880d681SAndroid Build Coastguard Worker string ImmOpStr = !cast<string>(ImmOp); 2140*9880d681SAndroid Build Coastguard Worker let hasNewValue = !if (!eq(!cast<string>(RC), "DoubleRegs"), 0, 1); 2141*9880d681SAndroid Build Coastguard Worker let offsetBits = !if (!eq(ImmOpStr, "s4_3Imm"), offset{6-3}, 2142*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "s4_2Imm"), offset{5-2}, 2143*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "s4_1Imm"), offset{4-1}, 2144*9880d681SAndroid Build Coastguard Worker /* s4_0Imm */ offset{3-0}))); 2145*9880d681SAndroid Build Coastguard Worker let IClass = 0b1001; 2146*9880d681SAndroid Build Coastguard Worker let Inst{27-25} = 0b100; 2147*9880d681SAndroid Build Coastguard Worker let Inst{24-21} = MajOp; 2148*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rz; 2149*9880d681SAndroid Build Coastguard Worker let Inst{13} = Mu; 2150*9880d681SAndroid Build Coastguard Worker let Inst{12} = 0b0; 2151*9880d681SAndroid Build Coastguard Worker let Inst{9} = 0b0; 2152*9880d681SAndroid Build Coastguard Worker let Inst{8-5} = offsetBits; 2153*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 2154*9880d681SAndroid Build Coastguard Worker } 2155*9880d681SAndroid Build Coastguard Worker 2156*9880d681SAndroid Build Coastguard Worker// Byte variants of circ load 2157*9880d681SAndroid Build Coastguard Workerlet accessSize = ByteAccess in { 2158*9880d681SAndroid Build Coastguard Worker def L2_loadrb_pci : T_load_pci <"memb", IntRegs, s4_0Imm, 0b1000>; 2159*9880d681SAndroid Build Coastguard Worker def L2_loadrub_pci : T_load_pci <"memub", IntRegs, s4_0Imm, 0b1001>; 2160*9880d681SAndroid Build Coastguard Worker} 2161*9880d681SAndroid Build Coastguard Worker 2162*9880d681SAndroid Build Coastguard Worker// Half word variants of circ load 2163*9880d681SAndroid Build Coastguard Workerlet accessSize = HalfWordAccess in { 2164*9880d681SAndroid Build Coastguard Worker def L2_loadrh_pci : T_load_pci <"memh", IntRegs, s4_1Imm, 0b1010>; 2165*9880d681SAndroid Build Coastguard Worker def L2_loadruh_pci : T_load_pci <"memuh", IntRegs, s4_1Imm, 0b1011>; 2166*9880d681SAndroid Build Coastguard Worker def L2_loadbzw2_pci : T_load_pci <"memubh", IntRegs, s4_1Imm, 0b0011>; 2167*9880d681SAndroid Build Coastguard Worker def L2_loadbsw2_pci : T_load_pci <"membh", IntRegs, s4_1Imm, 0b0001>; 2168*9880d681SAndroid Build Coastguard Worker} 2169*9880d681SAndroid Build Coastguard Worker 2170*9880d681SAndroid Build Coastguard Worker// Word variants of circ load 2171*9880d681SAndroid Build Coastguard Workerlet accessSize = WordAccess in 2172*9880d681SAndroid Build Coastguard Workerdef L2_loadri_pci : T_load_pci <"memw", IntRegs, s4_2Imm, 0b1100>; 2173*9880d681SAndroid Build Coastguard Worker 2174*9880d681SAndroid Build Coastguard Workerlet accessSize = WordAccess, hasNewValue = 0 in { 2175*9880d681SAndroid Build Coastguard Worker def L2_loadbzw4_pci : T_load_pci <"memubh", DoubleRegs, s4_2Imm, 0b0101>; 2176*9880d681SAndroid Build Coastguard Worker def L2_loadbsw4_pci : T_load_pci <"membh", DoubleRegs, s4_2Imm, 0b0111>; 2177*9880d681SAndroid Build Coastguard Worker} 2178*9880d681SAndroid Build Coastguard Worker 2179*9880d681SAndroid Build Coastguard Workerlet accessSize = DoubleWordAccess, hasNewValue = 0 in 2180*9880d681SAndroid Build Coastguard Workerdef L2_loadrd_pci : T_load_pci <"memd", DoubleRegs, s4_3Imm, 0b1110>; 2181*9880d681SAndroid Build Coastguard Worker 2182*9880d681SAndroid Build Coastguard Worker 2183*9880d681SAndroid Build Coastguard Worker// TODO: memb_fifo and memh_fifo must take destination register as input. 2184*9880d681SAndroid Build Coastguard Worker// One-off circ loads - not enough in common to break into a class. 2185*9880d681SAndroid Build Coastguard Workerlet accessSize = ByteAccess in 2186*9880d681SAndroid Build Coastguard Workerdef L2_loadalignb_pci : T_load_pci <"memb_fifo", DoubleRegs, s4_0Imm, 0b0100>; 2187*9880d681SAndroid Build Coastguard Worker 2188*9880d681SAndroid Build Coastguard Workerlet accessSize = HalfWordAccess, opExtentAlign = 1 in 2189*9880d681SAndroid Build Coastguard Workerdef L2_loadalignh_pci : T_load_pci <"memh_fifo", DoubleRegs, s4_1Imm, 0b0010>; 2190*9880d681SAndroid Build Coastguard Worker 2191*9880d681SAndroid Build Coastguard Worker// L[24]_load[wd]_locked: Load word/double with lock. 2192*9880d681SAndroid Build Coastguard Workerlet isSoloAX = 1 in 2193*9880d681SAndroid Build Coastguard Workerclass T_load_locked <string mnemonic, RegisterClass RC> 2194*9880d681SAndroid Build Coastguard Worker : LD0Inst <(outs RC:$dst), 2195*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$src), 2196*9880d681SAndroid Build Coastguard Worker "$dst = "#mnemonic#"($src)"> { 2197*9880d681SAndroid Build Coastguard Worker bits<5> dst; 2198*9880d681SAndroid Build Coastguard Worker bits<5> src; 2199*9880d681SAndroid Build Coastguard Worker let IClass = 0b1001; 2200*9880d681SAndroid Build Coastguard Worker let Inst{27-21} = 0b0010000; 2201*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src; 2202*9880d681SAndroid Build Coastguard Worker let Inst{13-12} = !if (!eq(mnemonic, "memd_locked"), 0b01, 0b00); 2203*9880d681SAndroid Build Coastguard Worker let Inst{5} = 0; 2204*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 2205*9880d681SAndroid Build Coastguard Worker} 2206*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, accessSize = WordAccess, opNewValue = 0 in 2207*9880d681SAndroid Build Coastguard Worker def L2_loadw_locked : T_load_locked <"memw_locked", IntRegs>; 2208*9880d681SAndroid Build Coastguard Workerlet accessSize = DoubleWordAccess in 2209*9880d681SAndroid Build Coastguard Worker def L4_loadd_locked : T_load_locked <"memd_locked", DoubleRegs>; 2210*9880d681SAndroid Build Coastguard Worker 2211*9880d681SAndroid Build Coastguard Worker// S[24]_store[wd]_locked: Store word/double conditionally. 2212*9880d681SAndroid Build Coastguard Workerlet isSoloAX = 1, isPredicateLate = 1 in 2213*9880d681SAndroid Build Coastguard Workerclass T_store_locked <string mnemonic, RegisterClass RC> 2214*9880d681SAndroid Build Coastguard Worker : ST0Inst <(outs PredRegs:$Pd), (ins IntRegs:$Rs, RC:$Rt), 2215*9880d681SAndroid Build Coastguard Worker mnemonic#"($Rs, $Pd) = $Rt"> { 2216*9880d681SAndroid Build Coastguard Worker bits<2> Pd; 2217*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 2218*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 2219*9880d681SAndroid Build Coastguard Worker 2220*9880d681SAndroid Build Coastguard Worker let IClass = 0b1010; 2221*9880d681SAndroid Build Coastguard Worker let Inst{27-23} = 0b00001; 2222*9880d681SAndroid Build Coastguard Worker let Inst{22} = !if (!eq(mnemonic, "memw_locked"), 0b0, 0b1); 2223*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0b1; 2224*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 2225*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 2226*9880d681SAndroid Build Coastguard Worker let Inst{1-0} = Pd; 2227*9880d681SAndroid Build Coastguard Worker} 2228*9880d681SAndroid Build Coastguard Worker 2229*9880d681SAndroid Build Coastguard Workerlet accessSize = WordAccess in 2230*9880d681SAndroid Build Coastguard Workerdef S2_storew_locked : T_store_locked <"memw_locked", IntRegs>; 2231*9880d681SAndroid Build Coastguard Worker 2232*9880d681SAndroid Build Coastguard Workerlet accessSize = DoubleWordAccess in 2233*9880d681SAndroid Build Coastguard Workerdef S4_stored_locked : T_store_locked <"memd_locked", DoubleRegs>; 2234*9880d681SAndroid Build Coastguard Worker 2235*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2236*9880d681SAndroid Build Coastguard Worker// Bit-reversed loads with auto-increment register 2237*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2238*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 2239*9880d681SAndroid Build Coastguard Workerclass T_load_pbr<string mnemonic, RegisterClass RC, 2240*9880d681SAndroid Build Coastguard Worker MemAccessSize addrSize, bits<4> majOp> 2241*9880d681SAndroid Build Coastguard Worker : LDInst 2242*9880d681SAndroid Build Coastguard Worker <(outs RC:$dst, IntRegs:$_dst_), 2243*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$Rz, ModRegs:$Mu), 2244*9880d681SAndroid Build Coastguard Worker "$dst = "#mnemonic#"($Rz ++ $Mu:brev)" , 2245*9880d681SAndroid Build Coastguard Worker [] , "$Rz = $_dst_" > { 2246*9880d681SAndroid Build Coastguard Worker 2247*9880d681SAndroid Build Coastguard Worker let accessSize = addrSize; 2248*9880d681SAndroid Build Coastguard Worker 2249*9880d681SAndroid Build Coastguard Worker bits<5> dst; 2250*9880d681SAndroid Build Coastguard Worker bits<5> Rz; 2251*9880d681SAndroid Build Coastguard Worker bits<1> Mu; 2252*9880d681SAndroid Build Coastguard Worker 2253*9880d681SAndroid Build Coastguard Worker let IClass = 0b1001; 2254*9880d681SAndroid Build Coastguard Worker 2255*9880d681SAndroid Build Coastguard Worker let Inst{27-25} = 0b111; 2256*9880d681SAndroid Build Coastguard Worker let Inst{24-21} = majOp; 2257*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rz; 2258*9880d681SAndroid Build Coastguard Worker let Inst{13} = Mu; 2259*9880d681SAndroid Build Coastguard Worker let Inst{12} = 0b0; 2260*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0b0; 2261*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 2262*9880d681SAndroid Build Coastguard Worker } 2263*9880d681SAndroid Build Coastguard Worker 2264*9880d681SAndroid Build Coastguard Workerlet hasNewValue =1, opNewValue = 0 in { 2265*9880d681SAndroid Build Coastguard Worker def L2_loadrb_pbr : T_load_pbr <"memb", IntRegs, ByteAccess, 0b1000>; 2266*9880d681SAndroid Build Coastguard Worker def L2_loadrub_pbr : T_load_pbr <"memub", IntRegs, ByteAccess, 0b1001>; 2267*9880d681SAndroid Build Coastguard Worker def L2_loadrh_pbr : T_load_pbr <"memh", IntRegs, HalfWordAccess, 0b1010>; 2268*9880d681SAndroid Build Coastguard Worker def L2_loadruh_pbr : T_load_pbr <"memuh", IntRegs, HalfWordAccess, 0b1011>; 2269*9880d681SAndroid Build Coastguard Worker def L2_loadbsw2_pbr : T_load_pbr <"membh", IntRegs, HalfWordAccess, 0b0001>; 2270*9880d681SAndroid Build Coastguard Worker def L2_loadbzw2_pbr : T_load_pbr <"memubh", IntRegs, HalfWordAccess, 0b0011>; 2271*9880d681SAndroid Build Coastguard Worker def L2_loadri_pbr : T_load_pbr <"memw", IntRegs, WordAccess, 0b1100>; 2272*9880d681SAndroid Build Coastguard Worker} 2273*9880d681SAndroid Build Coastguard Worker 2274*9880d681SAndroid Build Coastguard Workerdef L2_loadbzw4_pbr : T_load_pbr <"memubh", DoubleRegs, WordAccess, 0b0101>; 2275*9880d681SAndroid Build Coastguard Workerdef L2_loadbsw4_pbr : T_load_pbr <"membh", DoubleRegs, WordAccess, 0b0111>; 2276*9880d681SAndroid Build Coastguard Workerdef L2_loadrd_pbr : T_load_pbr <"memd", DoubleRegs, DoubleWordAccess, 0b1110>; 2277*9880d681SAndroid Build Coastguard Worker 2278*9880d681SAndroid Build Coastguard Workerdef L2_loadalignb_pbr :T_load_pbr <"memb_fifo", DoubleRegs, ByteAccess, 0b0100>; 2279*9880d681SAndroid Build Coastguard Workerdef L2_loadalignh_pbr :T_load_pbr <"memh_fifo", DoubleRegs, 2280*9880d681SAndroid Build Coastguard Worker HalfWordAccess, 0b0010>; 2281*9880d681SAndroid Build Coastguard Worker 2282*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2283*9880d681SAndroid Build Coastguard Worker// LD - 2284*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2285*9880d681SAndroid Build Coastguard Worker 2286*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2287*9880d681SAndroid Build Coastguard Worker// MTYPE/ALU + 2288*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2289*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2290*9880d681SAndroid Build Coastguard Worker// MTYPE/ALU - 2291*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2292*9880d681SAndroid Build Coastguard Worker 2293*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2294*9880d681SAndroid Build Coastguard Worker// MTYPE/COMPLEX + 2295*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2296*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2297*9880d681SAndroid Build Coastguard Worker// MTYPE/COMPLEX - 2298*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2299*9880d681SAndroid Build Coastguard Worker 2300*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2301*9880d681SAndroid Build Coastguard Worker// MTYPE/MPYH + 2302*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2303*9880d681SAndroid Build Coastguard Worker 2304*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2305*9880d681SAndroid Build Coastguard Worker// Template Class 2306*9880d681SAndroid Build Coastguard Worker// MPYS / Multipy signed/unsigned halfwords 2307*9880d681SAndroid Build Coastguard Worker//Rd=mpy[u](Rs.[H|L],Rt.[H|L])[:<<1][:rnd][:sat] 2308*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2309*9880d681SAndroid Build Coastguard Worker 2310*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, opNewValue = 0 in 2311*9880d681SAndroid Build Coastguard Workerclass T_M2_mpy < bits<2> LHbits, bit isSat, bit isRnd, 2312*9880d681SAndroid Build Coastguard Worker bit hasShift, bit isUnsigned> 2313*9880d681SAndroid Build Coastguard Worker : MInst < (outs IntRegs:$Rd), (ins IntRegs:$Rs, IntRegs:$Rt), 2314*9880d681SAndroid Build Coastguard Worker "$Rd = "#!if(isUnsigned,"mpyu","mpy")#"($Rs."#!if(LHbits{1},"h","l") 2315*9880d681SAndroid Build Coastguard Worker #", $Rt."#!if(LHbits{0},"h)","l)") 2316*9880d681SAndroid Build Coastguard Worker #!if(hasShift,":<<1","") 2317*9880d681SAndroid Build Coastguard Worker #!if(isRnd,":rnd","") 2318*9880d681SAndroid Build Coastguard Worker #!if(isSat,":sat",""), 2319*9880d681SAndroid Build Coastguard Worker [], "", M_tc_3x_SLOT23 > { 2320*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 2321*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 2322*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 2323*9880d681SAndroid Build Coastguard Worker 2324*9880d681SAndroid Build Coastguard Worker let IClass = 0b1110; 2325*9880d681SAndroid Build Coastguard Worker 2326*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1100; 2327*9880d681SAndroid Build Coastguard Worker let Inst{23} = hasShift; 2328*9880d681SAndroid Build Coastguard Worker let Inst{22} = isUnsigned; 2329*9880d681SAndroid Build Coastguard Worker let Inst{21} = isRnd; 2330*9880d681SAndroid Build Coastguard Worker let Inst{7} = isSat; 2331*9880d681SAndroid Build Coastguard Worker let Inst{6-5} = LHbits; 2332*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 2333*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 2334*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 2335*9880d681SAndroid Build Coastguard Worker } 2336*9880d681SAndroid Build Coastguard Worker 2337*9880d681SAndroid Build Coastguard Worker//Rd=mpy(Rs.[H|L],Rt.[H|L])[:<<1] 2338*9880d681SAndroid Build Coastguard Workerdef M2_mpy_ll_s1: T_M2_mpy<0b00, 0, 0, 1, 0>; 2339*9880d681SAndroid Build Coastguard Workerdef M2_mpy_ll_s0: T_M2_mpy<0b00, 0, 0, 0, 0>; 2340*9880d681SAndroid Build Coastguard Workerdef M2_mpy_lh_s1: T_M2_mpy<0b01, 0, 0, 1, 0>; 2341*9880d681SAndroid Build Coastguard Workerdef M2_mpy_lh_s0: T_M2_mpy<0b01, 0, 0, 0, 0>; 2342*9880d681SAndroid Build Coastguard Workerdef M2_mpy_hl_s1: T_M2_mpy<0b10, 0, 0, 1, 0>; 2343*9880d681SAndroid Build Coastguard Workerdef M2_mpy_hl_s0: T_M2_mpy<0b10, 0, 0, 0, 0>; 2344*9880d681SAndroid Build Coastguard Workerdef M2_mpy_hh_s1: T_M2_mpy<0b11, 0, 0, 1, 0>; 2345*9880d681SAndroid Build Coastguard Workerdef M2_mpy_hh_s0: T_M2_mpy<0b11, 0, 0, 0, 0>; 2346*9880d681SAndroid Build Coastguard Worker 2347*9880d681SAndroid Build Coastguard Worker//Rd=mpyu(Rs.[H|L],Rt.[H|L])[:<<1] 2348*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_ll_s1: T_M2_mpy<0b00, 0, 0, 1, 1>; 2349*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_ll_s0: T_M2_mpy<0b00, 0, 0, 0, 1>; 2350*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_lh_s1: T_M2_mpy<0b01, 0, 0, 1, 1>; 2351*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_lh_s0: T_M2_mpy<0b01, 0, 0, 0, 1>; 2352*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_hl_s1: T_M2_mpy<0b10, 0, 0, 1, 1>; 2353*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_hl_s0: T_M2_mpy<0b10, 0, 0, 0, 1>; 2354*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_hh_s1: T_M2_mpy<0b11, 0, 0, 1, 1>; 2355*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_hh_s0: T_M2_mpy<0b11, 0, 0, 0, 1>; 2356*9880d681SAndroid Build Coastguard Worker 2357*9880d681SAndroid Build Coastguard Worker//Rd=mpy(Rs.[H|L],Rt.[H|L])[:<<1]:rnd 2358*9880d681SAndroid Build Coastguard Workerdef M2_mpy_rnd_ll_s1: T_M2_mpy <0b00, 0, 1, 1, 0>; 2359*9880d681SAndroid Build Coastguard Workerdef M2_mpy_rnd_ll_s0: T_M2_mpy <0b00, 0, 1, 0, 0>; 2360*9880d681SAndroid Build Coastguard Workerdef M2_mpy_rnd_lh_s1: T_M2_mpy <0b01, 0, 1, 1, 0>; 2361*9880d681SAndroid Build Coastguard Workerdef M2_mpy_rnd_lh_s0: T_M2_mpy <0b01, 0, 1, 0, 0>; 2362*9880d681SAndroid Build Coastguard Workerdef M2_mpy_rnd_hl_s1: T_M2_mpy <0b10, 0, 1, 1, 0>; 2363*9880d681SAndroid Build Coastguard Workerdef M2_mpy_rnd_hl_s0: T_M2_mpy <0b10, 0, 1, 0, 0>; 2364*9880d681SAndroid Build Coastguard Workerdef M2_mpy_rnd_hh_s1: T_M2_mpy <0b11, 0, 1, 1, 0>; 2365*9880d681SAndroid Build Coastguard Workerdef M2_mpy_rnd_hh_s0: T_M2_mpy <0b11, 0, 1, 0, 0>; 2366*9880d681SAndroid Build Coastguard Worker 2367*9880d681SAndroid Build Coastguard Worker//Rd=mpy(Rs.[H|L],Rt.[H|L])[:<<1][:sat] 2368*9880d681SAndroid Build Coastguard Worker//Rd=mpy(Rs.[H|L],Rt.[H|L])[:<<1][:rnd][:sat] 2369*9880d681SAndroid Build Coastguard Workerlet Defs = [USR_OVF] in { 2370*9880d681SAndroid Build Coastguard Worker def M2_mpy_sat_ll_s1: T_M2_mpy <0b00, 1, 0, 1, 0>; 2371*9880d681SAndroid Build Coastguard Worker def M2_mpy_sat_ll_s0: T_M2_mpy <0b00, 1, 0, 0, 0>; 2372*9880d681SAndroid Build Coastguard Worker def M2_mpy_sat_lh_s1: T_M2_mpy <0b01, 1, 0, 1, 0>; 2373*9880d681SAndroid Build Coastguard Worker def M2_mpy_sat_lh_s0: T_M2_mpy <0b01, 1, 0, 0, 0>; 2374*9880d681SAndroid Build Coastguard Worker def M2_mpy_sat_hl_s1: T_M2_mpy <0b10, 1, 0, 1, 0>; 2375*9880d681SAndroid Build Coastguard Worker def M2_mpy_sat_hl_s0: T_M2_mpy <0b10, 1, 0, 0, 0>; 2376*9880d681SAndroid Build Coastguard Worker def M2_mpy_sat_hh_s1: T_M2_mpy <0b11, 1, 0, 1, 0>; 2377*9880d681SAndroid Build Coastguard Worker def M2_mpy_sat_hh_s0: T_M2_mpy <0b11, 1, 0, 0, 0>; 2378*9880d681SAndroid Build Coastguard Worker 2379*9880d681SAndroid Build Coastguard Worker def M2_mpy_sat_rnd_ll_s1: T_M2_mpy <0b00, 1, 1, 1, 0>; 2380*9880d681SAndroid Build Coastguard Worker def M2_mpy_sat_rnd_ll_s0: T_M2_mpy <0b00, 1, 1, 0, 0>; 2381*9880d681SAndroid Build Coastguard Worker def M2_mpy_sat_rnd_lh_s1: T_M2_mpy <0b01, 1, 1, 1, 0>; 2382*9880d681SAndroid Build Coastguard Worker def M2_mpy_sat_rnd_lh_s0: T_M2_mpy <0b01, 1, 1, 0, 0>; 2383*9880d681SAndroid Build Coastguard Worker def M2_mpy_sat_rnd_hl_s1: T_M2_mpy <0b10, 1, 1, 1, 0>; 2384*9880d681SAndroid Build Coastguard Worker def M2_mpy_sat_rnd_hl_s0: T_M2_mpy <0b10, 1, 1, 0, 0>; 2385*9880d681SAndroid Build Coastguard Worker def M2_mpy_sat_rnd_hh_s1: T_M2_mpy <0b11, 1, 1, 1, 0>; 2386*9880d681SAndroid Build Coastguard Worker def M2_mpy_sat_rnd_hh_s0: T_M2_mpy <0b11, 1, 1, 0, 0>; 2387*9880d681SAndroid Build Coastguard Worker} 2388*9880d681SAndroid Build Coastguard Worker 2389*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2390*9880d681SAndroid Build Coastguard Worker// Template Class 2391*9880d681SAndroid Build Coastguard Worker// MPYS / Multipy signed/unsigned halfwords and add/subtract the 2392*9880d681SAndroid Build Coastguard Worker// result from the accumulator. 2393*9880d681SAndroid Build Coastguard Worker//Rx [-+]= mpy[u](Rs.[H|L],Rt.[H|L])[:<<1][:sat] 2394*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2395*9880d681SAndroid Build Coastguard Worker 2396*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, opNewValue = 0 in 2397*9880d681SAndroid Build Coastguard Workerclass T_M2_mpy_acc < bits<2> LHbits, bit isSat, bit isNac, 2398*9880d681SAndroid Build Coastguard Worker bit hasShift, bit isUnsigned > 2399*9880d681SAndroid Build Coastguard Worker : MInst_acc<(outs IntRegs:$Rx), (ins IntRegs:$dst2, IntRegs:$Rs, IntRegs:$Rt), 2400*9880d681SAndroid Build Coastguard Worker "$Rx "#!if(isNac,"-= ","+= ")#!if(isUnsigned,"mpyu","mpy") 2401*9880d681SAndroid Build Coastguard Worker #"($Rs."#!if(LHbits{1},"h","l") 2402*9880d681SAndroid Build Coastguard Worker #", $Rt."#!if(LHbits{0},"h)","l)") 2403*9880d681SAndroid Build Coastguard Worker #!if(hasShift,":<<1","") 2404*9880d681SAndroid Build Coastguard Worker #!if(isSat,":sat",""), 2405*9880d681SAndroid Build Coastguard Worker [], "$dst2 = $Rx", M_tc_3x_SLOT23 > { 2406*9880d681SAndroid Build Coastguard Worker bits<5> Rx; 2407*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 2408*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 2409*9880d681SAndroid Build Coastguard Worker 2410*9880d681SAndroid Build Coastguard Worker let IClass = 0b1110; 2411*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1110; 2412*9880d681SAndroid Build Coastguard Worker let Inst{23} = hasShift; 2413*9880d681SAndroid Build Coastguard Worker let Inst{22} = isUnsigned; 2414*9880d681SAndroid Build Coastguard Worker let Inst{21} = isNac; 2415*9880d681SAndroid Build Coastguard Worker let Inst{7} = isSat; 2416*9880d681SAndroid Build Coastguard Worker let Inst{6-5} = LHbits; 2417*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rx; 2418*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 2419*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 2420*9880d681SAndroid Build Coastguard Worker } 2421*9880d681SAndroid Build Coastguard Worker 2422*9880d681SAndroid Build Coastguard Worker//Rx += mpy(Rs.[H|L],Rt.[H|L])[:<<1] 2423*9880d681SAndroid Build Coastguard Workerdef M2_mpy_acc_ll_s1: T_M2_mpy_acc <0b00, 0, 0, 1, 0>; 2424*9880d681SAndroid Build Coastguard Workerdef M2_mpy_acc_ll_s0: T_M2_mpy_acc <0b00, 0, 0, 0, 0>; 2425*9880d681SAndroid Build Coastguard Workerdef M2_mpy_acc_lh_s1: T_M2_mpy_acc <0b01, 0, 0, 1, 0>; 2426*9880d681SAndroid Build Coastguard Workerdef M2_mpy_acc_lh_s0: T_M2_mpy_acc <0b01, 0, 0, 0, 0>; 2427*9880d681SAndroid Build Coastguard Workerdef M2_mpy_acc_hl_s1: T_M2_mpy_acc <0b10, 0, 0, 1, 0>; 2428*9880d681SAndroid Build Coastguard Workerdef M2_mpy_acc_hl_s0: T_M2_mpy_acc <0b10, 0, 0, 0, 0>; 2429*9880d681SAndroid Build Coastguard Workerdef M2_mpy_acc_hh_s1: T_M2_mpy_acc <0b11, 0, 0, 1, 0>; 2430*9880d681SAndroid Build Coastguard Workerdef M2_mpy_acc_hh_s0: T_M2_mpy_acc <0b11, 0, 0, 0, 0>; 2431*9880d681SAndroid Build Coastguard Worker 2432*9880d681SAndroid Build Coastguard Worker//Rx += mpyu(Rs.[H|L],Rt.[H|L])[:<<1] 2433*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_acc_ll_s1: T_M2_mpy_acc <0b00, 0, 0, 1, 1>; 2434*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_acc_ll_s0: T_M2_mpy_acc <0b00, 0, 0, 0, 1>; 2435*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_acc_lh_s1: T_M2_mpy_acc <0b01, 0, 0, 1, 1>; 2436*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_acc_lh_s0: T_M2_mpy_acc <0b01, 0, 0, 0, 1>; 2437*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_acc_hl_s1: T_M2_mpy_acc <0b10, 0, 0, 1, 1>; 2438*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_acc_hl_s0: T_M2_mpy_acc <0b10, 0, 0, 0, 1>; 2439*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_acc_hh_s1: T_M2_mpy_acc <0b11, 0, 0, 1, 1>; 2440*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_acc_hh_s0: T_M2_mpy_acc <0b11, 0, 0, 0, 1>; 2441*9880d681SAndroid Build Coastguard Worker 2442*9880d681SAndroid Build Coastguard Worker//Rx -= mpy(Rs.[H|L],Rt.[H|L])[:<<1] 2443*9880d681SAndroid Build Coastguard Workerdef M2_mpy_nac_ll_s1: T_M2_mpy_acc <0b00, 0, 1, 1, 0>; 2444*9880d681SAndroid Build Coastguard Workerdef M2_mpy_nac_ll_s0: T_M2_mpy_acc <0b00, 0, 1, 0, 0>; 2445*9880d681SAndroid Build Coastguard Workerdef M2_mpy_nac_lh_s1: T_M2_mpy_acc <0b01, 0, 1, 1, 0>; 2446*9880d681SAndroid Build Coastguard Workerdef M2_mpy_nac_lh_s0: T_M2_mpy_acc <0b01, 0, 1, 0, 0>; 2447*9880d681SAndroid Build Coastguard Workerdef M2_mpy_nac_hl_s1: T_M2_mpy_acc <0b10, 0, 1, 1, 0>; 2448*9880d681SAndroid Build Coastguard Workerdef M2_mpy_nac_hl_s0: T_M2_mpy_acc <0b10, 0, 1, 0, 0>; 2449*9880d681SAndroid Build Coastguard Workerdef M2_mpy_nac_hh_s1: T_M2_mpy_acc <0b11, 0, 1, 1, 0>; 2450*9880d681SAndroid Build Coastguard Workerdef M2_mpy_nac_hh_s0: T_M2_mpy_acc <0b11, 0, 1, 0, 0>; 2451*9880d681SAndroid Build Coastguard Worker 2452*9880d681SAndroid Build Coastguard Worker//Rx -= mpyu(Rs.[H|L],Rt.[H|L])[:<<1] 2453*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_nac_ll_s1: T_M2_mpy_acc <0b00, 0, 1, 1, 1>; 2454*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_nac_ll_s0: T_M2_mpy_acc <0b00, 0, 1, 0, 1>; 2455*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_nac_lh_s1: T_M2_mpy_acc <0b01, 0, 1, 1, 1>; 2456*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_nac_lh_s0: T_M2_mpy_acc <0b01, 0, 1, 0, 1>; 2457*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_nac_hl_s1: T_M2_mpy_acc <0b10, 0, 1, 1, 1>; 2458*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_nac_hl_s0: T_M2_mpy_acc <0b10, 0, 1, 0, 1>; 2459*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_nac_hh_s1: T_M2_mpy_acc <0b11, 0, 1, 1, 1>; 2460*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_nac_hh_s0: T_M2_mpy_acc <0b11, 0, 1, 0, 1>; 2461*9880d681SAndroid Build Coastguard Worker 2462*9880d681SAndroid Build Coastguard Worker//Rx += mpy(Rs.[H|L],Rt.[H|L])[:<<1]:sat 2463*9880d681SAndroid Build Coastguard Workerdef M2_mpy_acc_sat_ll_s1: T_M2_mpy_acc <0b00, 1, 0, 1, 0>; 2464*9880d681SAndroid Build Coastguard Workerdef M2_mpy_acc_sat_ll_s0: T_M2_mpy_acc <0b00, 1, 0, 0, 0>; 2465*9880d681SAndroid Build Coastguard Workerdef M2_mpy_acc_sat_lh_s1: T_M2_mpy_acc <0b01, 1, 0, 1, 0>; 2466*9880d681SAndroid Build Coastguard Workerdef M2_mpy_acc_sat_lh_s0: T_M2_mpy_acc <0b01, 1, 0, 0, 0>; 2467*9880d681SAndroid Build Coastguard Workerdef M2_mpy_acc_sat_hl_s1: T_M2_mpy_acc <0b10, 1, 0, 1, 0>; 2468*9880d681SAndroid Build Coastguard Workerdef M2_mpy_acc_sat_hl_s0: T_M2_mpy_acc <0b10, 1, 0, 0, 0>; 2469*9880d681SAndroid Build Coastguard Workerdef M2_mpy_acc_sat_hh_s1: T_M2_mpy_acc <0b11, 1, 0, 1, 0>; 2470*9880d681SAndroid Build Coastguard Workerdef M2_mpy_acc_sat_hh_s0: T_M2_mpy_acc <0b11, 1, 0, 0, 0>; 2471*9880d681SAndroid Build Coastguard Worker 2472*9880d681SAndroid Build Coastguard Worker//Rx -= mpy(Rs.[H|L],Rt.[H|L])[:<<1]:sat 2473*9880d681SAndroid Build Coastguard Workerdef M2_mpy_nac_sat_ll_s1: T_M2_mpy_acc <0b00, 1, 1, 1, 0>; 2474*9880d681SAndroid Build Coastguard Workerdef M2_mpy_nac_sat_ll_s0: T_M2_mpy_acc <0b00, 1, 1, 0, 0>; 2475*9880d681SAndroid Build Coastguard Workerdef M2_mpy_nac_sat_lh_s1: T_M2_mpy_acc <0b01, 1, 1, 1, 0>; 2476*9880d681SAndroid Build Coastguard Workerdef M2_mpy_nac_sat_lh_s0: T_M2_mpy_acc <0b01, 1, 1, 0, 0>; 2477*9880d681SAndroid Build Coastguard Workerdef M2_mpy_nac_sat_hl_s1: T_M2_mpy_acc <0b10, 1, 1, 1, 0>; 2478*9880d681SAndroid Build Coastguard Workerdef M2_mpy_nac_sat_hl_s0: T_M2_mpy_acc <0b10, 1, 1, 0, 0>; 2479*9880d681SAndroid Build Coastguard Workerdef M2_mpy_nac_sat_hh_s1: T_M2_mpy_acc <0b11, 1, 1, 1, 0>; 2480*9880d681SAndroid Build Coastguard Workerdef M2_mpy_nac_sat_hh_s0: T_M2_mpy_acc <0b11, 1, 1, 0, 0>; 2481*9880d681SAndroid Build Coastguard Worker 2482*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2483*9880d681SAndroid Build Coastguard Worker// Template Class 2484*9880d681SAndroid Build Coastguard Worker// MPYS / Multipy signed/unsigned halfwords and add/subtract the 2485*9880d681SAndroid Build Coastguard Worker// result from the 64-bit destination register. 2486*9880d681SAndroid Build Coastguard Worker//Rxx [-+]= mpy[u](Rs.[H|L],Rt.[H|L])[:<<1][:sat] 2487*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2488*9880d681SAndroid Build Coastguard Worker 2489*9880d681SAndroid Build Coastguard Workerclass T_M2_mpyd_acc < bits<2> LHbits, bit isNac, bit hasShift, bit isUnsigned> 2490*9880d681SAndroid Build Coastguard Worker : MInst_acc<(outs DoubleRegs:$Rxx), 2491*9880d681SAndroid Build Coastguard Worker (ins DoubleRegs:$dst2, IntRegs:$Rs, IntRegs:$Rt), 2492*9880d681SAndroid Build Coastguard Worker "$Rxx "#!if(isNac,"-= ","+= ")#!if(isUnsigned,"mpyu","mpy") 2493*9880d681SAndroid Build Coastguard Worker #"($Rs."#!if(LHbits{1},"h","l") 2494*9880d681SAndroid Build Coastguard Worker #", $Rt."#!if(LHbits{0},"h)","l)") 2495*9880d681SAndroid Build Coastguard Worker #!if(hasShift,":<<1",""), 2496*9880d681SAndroid Build Coastguard Worker [], "$dst2 = $Rxx", M_tc_3x_SLOT23 > { 2497*9880d681SAndroid Build Coastguard Worker bits<5> Rxx; 2498*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 2499*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 2500*9880d681SAndroid Build Coastguard Worker 2501*9880d681SAndroid Build Coastguard Worker let IClass = 0b1110; 2502*9880d681SAndroid Build Coastguard Worker 2503*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0110; 2504*9880d681SAndroid Build Coastguard Worker let Inst{23} = hasShift; 2505*9880d681SAndroid Build Coastguard Worker let Inst{22} = isUnsigned; 2506*9880d681SAndroid Build Coastguard Worker let Inst{21} = isNac; 2507*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0; 2508*9880d681SAndroid Build Coastguard Worker let Inst{6-5} = LHbits; 2509*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rxx; 2510*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 2511*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 2512*9880d681SAndroid Build Coastguard Worker } 2513*9880d681SAndroid Build Coastguard Worker 2514*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_acc_hh_s0: T_M2_mpyd_acc <0b11, 0, 0, 0>; 2515*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_acc_hl_s0: T_M2_mpyd_acc <0b10, 0, 0, 0>; 2516*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_acc_lh_s0: T_M2_mpyd_acc <0b01, 0, 0, 0>; 2517*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_acc_ll_s0: T_M2_mpyd_acc <0b00, 0, 0, 0>; 2518*9880d681SAndroid Build Coastguard Worker 2519*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_acc_hh_s1: T_M2_mpyd_acc <0b11, 0, 1, 0>; 2520*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_acc_hl_s1: T_M2_mpyd_acc <0b10, 0, 1, 0>; 2521*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_acc_lh_s1: T_M2_mpyd_acc <0b01, 0, 1, 0>; 2522*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_acc_ll_s1: T_M2_mpyd_acc <0b00, 0, 1, 0>; 2523*9880d681SAndroid Build Coastguard Worker 2524*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_nac_hh_s0: T_M2_mpyd_acc <0b11, 1, 0, 0>; 2525*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_nac_hl_s0: T_M2_mpyd_acc <0b10, 1, 0, 0>; 2526*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_nac_lh_s0: T_M2_mpyd_acc <0b01, 1, 0, 0>; 2527*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_nac_ll_s0: T_M2_mpyd_acc <0b00, 1, 0, 0>; 2528*9880d681SAndroid Build Coastguard Worker 2529*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_nac_hh_s1: T_M2_mpyd_acc <0b11, 1, 1, 0>; 2530*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_nac_hl_s1: T_M2_mpyd_acc <0b10, 1, 1, 0>; 2531*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_nac_lh_s1: T_M2_mpyd_acc <0b01, 1, 1, 0>; 2532*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_nac_ll_s1: T_M2_mpyd_acc <0b00, 1, 1, 0>; 2533*9880d681SAndroid Build Coastguard Worker 2534*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_acc_hh_s0: T_M2_mpyd_acc <0b11, 0, 0, 1>; 2535*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_acc_hl_s0: T_M2_mpyd_acc <0b10, 0, 0, 1>; 2536*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_acc_lh_s0: T_M2_mpyd_acc <0b01, 0, 0, 1>; 2537*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_acc_ll_s0: T_M2_mpyd_acc <0b00, 0, 0, 1>; 2538*9880d681SAndroid Build Coastguard Worker 2539*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_acc_hh_s1: T_M2_mpyd_acc <0b11, 0, 1, 1>; 2540*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_acc_hl_s1: T_M2_mpyd_acc <0b10, 0, 1, 1>; 2541*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_acc_lh_s1: T_M2_mpyd_acc <0b01, 0, 1, 1>; 2542*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_acc_ll_s1: T_M2_mpyd_acc <0b00, 0, 1, 1>; 2543*9880d681SAndroid Build Coastguard Worker 2544*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_nac_hh_s0: T_M2_mpyd_acc <0b11, 1, 0, 1>; 2545*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_nac_hl_s0: T_M2_mpyd_acc <0b10, 1, 0, 1>; 2546*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_nac_lh_s0: T_M2_mpyd_acc <0b01, 1, 0, 1>; 2547*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_nac_ll_s0: T_M2_mpyd_acc <0b00, 1, 0, 1>; 2548*9880d681SAndroid Build Coastguard Worker 2549*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_nac_hh_s1: T_M2_mpyd_acc <0b11, 1, 1, 1>; 2550*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_nac_hl_s1: T_M2_mpyd_acc <0b10, 1, 1, 1>; 2551*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_nac_lh_s1: T_M2_mpyd_acc <0b01, 1, 1, 1>; 2552*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_nac_ll_s1: T_M2_mpyd_acc <0b00, 1, 1, 1>; 2553*9880d681SAndroid Build Coastguard Worker 2554*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2555*9880d681SAndroid Build Coastguard Worker// Template Class -- Vector Multipy 2556*9880d681SAndroid Build Coastguard Worker// Used for complex multiply real or imaginary, dual multiply and even halfwords 2557*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2558*9880d681SAndroid Build Coastguard Workerclass T_M2_vmpy < string opc, bits<3> MajOp, bits<3> MinOp, bit hasShift, 2559*9880d681SAndroid Build Coastguard Worker bit isRnd, bit isSat > 2560*9880d681SAndroid Build Coastguard Worker : MInst <(outs DoubleRegs:$Rdd), (ins DoubleRegs:$Rss, DoubleRegs:$Rtt), 2561*9880d681SAndroid Build Coastguard Worker "$Rdd = "#opc#"($Rss, $Rtt)"#!if(hasShift,":<<1","") 2562*9880d681SAndroid Build Coastguard Worker #!if(isRnd,":rnd","") 2563*9880d681SAndroid Build Coastguard Worker #!if(isSat,":sat",""), 2564*9880d681SAndroid Build Coastguard Worker [] > { 2565*9880d681SAndroid Build Coastguard Worker bits<5> Rdd; 2566*9880d681SAndroid Build Coastguard Worker bits<5> Rss; 2567*9880d681SAndroid Build Coastguard Worker bits<5> Rtt; 2568*9880d681SAndroid Build Coastguard Worker 2569*9880d681SAndroid Build Coastguard Worker let IClass = 0b1110; 2570*9880d681SAndroid Build Coastguard Worker 2571*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1000; 2572*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MajOp; 2573*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = MinOp; 2574*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rdd; 2575*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rss; 2576*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rtt; 2577*9880d681SAndroid Build Coastguard Worker } 2578*9880d681SAndroid Build Coastguard Worker 2579*9880d681SAndroid Build Coastguard Worker// Vector complex multiply imaginary: Rdd=vcmpyi(Rss,Rtt)[:<<1]:sat 2580*9880d681SAndroid Build Coastguard Workerlet Defs = [USR_OVF] in { 2581*9880d681SAndroid Build Coastguard Workerdef M2_vcmpy_s1_sat_i: T_M2_vmpy <"vcmpyi", 0b110, 0b110, 1, 0, 1>; 2582*9880d681SAndroid Build Coastguard Workerdef M2_vcmpy_s0_sat_i: T_M2_vmpy <"vcmpyi", 0b010, 0b110, 0, 0, 1>; 2583*9880d681SAndroid Build Coastguard Worker 2584*9880d681SAndroid Build Coastguard Worker// Vector complex multiply real: Rdd=vcmpyr(Rss,Rtt)[:<<1]:sat 2585*9880d681SAndroid Build Coastguard Workerdef M2_vcmpy_s1_sat_r: T_M2_vmpy <"vcmpyr", 0b101, 0b110, 1, 0, 1>; 2586*9880d681SAndroid Build Coastguard Workerdef M2_vcmpy_s0_sat_r: T_M2_vmpy <"vcmpyr", 0b001, 0b110, 0, 0, 1>; 2587*9880d681SAndroid Build Coastguard Worker 2588*9880d681SAndroid Build Coastguard Worker// Vector dual multiply: Rdd=vdmpy(Rss,Rtt)[:<<1]:sat 2589*9880d681SAndroid Build Coastguard Workerdef M2_vdmpys_s1: T_M2_vmpy <"vdmpy", 0b100, 0b100, 1, 0, 1>; 2590*9880d681SAndroid Build Coastguard Workerdef M2_vdmpys_s0: T_M2_vmpy <"vdmpy", 0b000, 0b100, 0, 0, 1>; 2591*9880d681SAndroid Build Coastguard Worker 2592*9880d681SAndroid Build Coastguard Worker// Vector multiply even halfwords: Rdd=vmpyeh(Rss,Rtt)[:<<1]:sat 2593*9880d681SAndroid Build Coastguard Workerdef M2_vmpy2es_s1: T_M2_vmpy <"vmpyeh", 0b100, 0b110, 1, 0, 1>; 2594*9880d681SAndroid Build Coastguard Workerdef M2_vmpy2es_s0: T_M2_vmpy <"vmpyeh", 0b000, 0b110, 0, 0, 1>; 2595*9880d681SAndroid Build Coastguard Worker 2596*9880d681SAndroid Build Coastguard Worker//Rdd=vmpywoh(Rss,Rtt)[:<<1][:rnd]:sat 2597*9880d681SAndroid Build Coastguard Workerdef M2_mmpyh_s0: T_M2_vmpy <"vmpywoh", 0b000, 0b111, 0, 0, 1>; 2598*9880d681SAndroid Build Coastguard Workerdef M2_mmpyh_s1: T_M2_vmpy <"vmpywoh", 0b100, 0b111, 1, 0, 1>; 2599*9880d681SAndroid Build Coastguard Workerdef M2_mmpyh_rs0: T_M2_vmpy <"vmpywoh", 0b001, 0b111, 0, 1, 1>; 2600*9880d681SAndroid Build Coastguard Workerdef M2_mmpyh_rs1: T_M2_vmpy <"vmpywoh", 0b101, 0b111, 1, 1, 1>; 2601*9880d681SAndroid Build Coastguard Worker 2602*9880d681SAndroid Build Coastguard Worker//Rdd=vmpyweh(Rss,Rtt)[:<<1][:rnd]:sat 2603*9880d681SAndroid Build Coastguard Workerdef M2_mmpyl_s0: T_M2_vmpy <"vmpyweh", 0b000, 0b101, 0, 0, 1>; 2604*9880d681SAndroid Build Coastguard Workerdef M2_mmpyl_s1: T_M2_vmpy <"vmpyweh", 0b100, 0b101, 1, 0, 1>; 2605*9880d681SAndroid Build Coastguard Workerdef M2_mmpyl_rs0: T_M2_vmpy <"vmpyweh", 0b001, 0b101, 0, 1, 1>; 2606*9880d681SAndroid Build Coastguard Workerdef M2_mmpyl_rs1: T_M2_vmpy <"vmpyweh", 0b101, 0b101, 1, 1, 1>; 2607*9880d681SAndroid Build Coastguard Worker 2608*9880d681SAndroid Build Coastguard Worker//Rdd=vmpywouh(Rss,Rtt)[:<<1][:rnd]:sat 2609*9880d681SAndroid Build Coastguard Workerdef M2_mmpyuh_s0: T_M2_vmpy <"vmpywouh", 0b010, 0b111, 0, 0, 1>; 2610*9880d681SAndroid Build Coastguard Workerdef M2_mmpyuh_s1: T_M2_vmpy <"vmpywouh", 0b110, 0b111, 1, 0, 1>; 2611*9880d681SAndroid Build Coastguard Workerdef M2_mmpyuh_rs0: T_M2_vmpy <"vmpywouh", 0b011, 0b111, 0, 1, 1>; 2612*9880d681SAndroid Build Coastguard Workerdef M2_mmpyuh_rs1: T_M2_vmpy <"vmpywouh", 0b111, 0b111, 1, 1, 1>; 2613*9880d681SAndroid Build Coastguard Worker 2614*9880d681SAndroid Build Coastguard Worker//Rdd=vmpyweuh(Rss,Rtt)[:<<1][:rnd]:sat 2615*9880d681SAndroid Build Coastguard Workerdef M2_mmpyul_s0: T_M2_vmpy <"vmpyweuh", 0b010, 0b101, 0, 0, 1>; 2616*9880d681SAndroid Build Coastguard Workerdef M2_mmpyul_s1: T_M2_vmpy <"vmpyweuh", 0b110, 0b101, 1, 0, 1>; 2617*9880d681SAndroid Build Coastguard Workerdef M2_mmpyul_rs0: T_M2_vmpy <"vmpyweuh", 0b011, 0b101, 0, 1, 1>; 2618*9880d681SAndroid Build Coastguard Workerdef M2_mmpyul_rs1: T_M2_vmpy <"vmpyweuh", 0b111, 0b101, 1, 1, 1>; 2619*9880d681SAndroid Build Coastguard Worker} 2620*9880d681SAndroid Build Coastguard Worker 2621*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, opNewValue = 0 in 2622*9880d681SAndroid Build Coastguard Workerclass T_MType_mpy <string mnemonic, bits<4> RegTyBits, RegisterClass RC, 2623*9880d681SAndroid Build Coastguard Worker bits<3> MajOp, bits<3> MinOp, bit isSat = 0, bit isRnd = 0, 2624*9880d681SAndroid Build Coastguard Worker string op2Suffix = "", bit isRaw = 0, bit isHi = 0 > 2625*9880d681SAndroid Build Coastguard Worker : MInst <(outs IntRegs:$dst), (ins RC:$src1, RC:$src2), 2626*9880d681SAndroid Build Coastguard Worker "$dst = "#mnemonic 2627*9880d681SAndroid Build Coastguard Worker #"($src1, $src2"#op2Suffix#")" 2628*9880d681SAndroid Build Coastguard Worker #!if(MajOp{2}, ":<<1", "") 2629*9880d681SAndroid Build Coastguard Worker #!if(isRnd, ":rnd", "") 2630*9880d681SAndroid Build Coastguard Worker #!if(isSat, ":sat", "") 2631*9880d681SAndroid Build Coastguard Worker #!if(isRaw, !if(isHi, ":raw:hi", ":raw:lo"), ""), [] > { 2632*9880d681SAndroid Build Coastguard Worker bits<5> dst; 2633*9880d681SAndroid Build Coastguard Worker bits<5> src1; 2634*9880d681SAndroid Build Coastguard Worker bits<5> src2; 2635*9880d681SAndroid Build Coastguard Worker 2636*9880d681SAndroid Build Coastguard Worker let IClass = 0b1110; 2637*9880d681SAndroid Build Coastguard Worker 2638*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = RegTyBits; 2639*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MajOp; 2640*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src1; 2641*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 2642*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = src2; 2643*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = MinOp; 2644*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 2645*9880d681SAndroid Build Coastguard Worker } 2646*9880d681SAndroid Build Coastguard Worker 2647*9880d681SAndroid Build Coastguard Workerclass T_MType_vrcmpy <string mnemonic, bits<3> MajOp, bits<3> MinOp, bit isHi> 2648*9880d681SAndroid Build Coastguard Worker : T_MType_mpy <mnemonic, 0b1001, DoubleRegs, MajOp, MinOp, 1, 1, "", 1, isHi>; 2649*9880d681SAndroid Build Coastguard Worker 2650*9880d681SAndroid Build Coastguard Workerclass T_MType_dd <string mnemonic, bits<3> MajOp, bits<3> MinOp, 2651*9880d681SAndroid Build Coastguard Worker bit isSat = 0, bit isRnd = 0 > 2652*9880d681SAndroid Build Coastguard Worker : T_MType_mpy <mnemonic, 0b1001, DoubleRegs, MajOp, MinOp, isSat, isRnd>; 2653*9880d681SAndroid Build Coastguard Worker 2654*9880d681SAndroid Build Coastguard Workerclass T_MType_rr1 <string mnemonic, bits<3> MajOp, bits<3> MinOp, 2655*9880d681SAndroid Build Coastguard Worker bit isSat = 0, bit isRnd = 0 > 2656*9880d681SAndroid Build Coastguard Worker : T_MType_mpy<mnemonic, 0b1101, IntRegs, MajOp, MinOp, isSat, isRnd>; 2657*9880d681SAndroid Build Coastguard Worker 2658*9880d681SAndroid Build Coastguard Workerclass T_MType_rr2 <string mnemonic, bits<3> MajOp, bits<3> MinOp, 2659*9880d681SAndroid Build Coastguard Worker bit isSat = 0, bit isRnd = 0, string op2str = "" > 2660*9880d681SAndroid Build Coastguard Worker : T_MType_mpy<mnemonic, 0b1101, IntRegs, MajOp, MinOp, isSat, isRnd, op2str>; 2661*9880d681SAndroid Build Coastguard Worker 2662*9880d681SAndroid Build Coastguard Workerdef M2_vradduh : T_MType_dd <"vradduh", 0b000, 0b001, 0, 0>; 2663*9880d681SAndroid Build Coastguard Workerdef M2_vdmpyrs_s0 : T_MType_dd <"vdmpy", 0b000, 0b000, 1, 1>; 2664*9880d681SAndroid Build Coastguard Workerdef M2_vdmpyrs_s1 : T_MType_dd <"vdmpy", 0b100, 0b000, 1, 1>; 2665*9880d681SAndroid Build Coastguard Worker 2666*9880d681SAndroid Build Coastguard Workerlet CextOpcode = "mpyi", InputType = "reg" in 2667*9880d681SAndroid Build Coastguard Workerdef M2_mpyi : T_MType_rr1 <"mpyi", 0b000, 0b000>, ImmRegRel; 2668*9880d681SAndroid Build Coastguard Worker 2669*9880d681SAndroid Build Coastguard Workerdef M2_mpy_up : T_MType_rr1 <"mpy", 0b000, 0b001>; 2670*9880d681SAndroid Build Coastguard Workerdef M2_mpyu_up : T_MType_rr1 <"mpyu", 0b010, 0b001>; 2671*9880d681SAndroid Build Coastguard Worker 2672*9880d681SAndroid Build Coastguard Workerdef M2_dpmpyss_rnd_s0 : T_MType_rr1 <"mpy", 0b001, 0b001, 0, 1>; 2673*9880d681SAndroid Build Coastguard Worker 2674*9880d681SAndroid Build Coastguard Workerdef M2_vmpy2s_s0pack : T_MType_rr1 <"vmpyh", 0b001, 0b111, 1, 1>; 2675*9880d681SAndroid Build Coastguard Workerdef M2_vmpy2s_s1pack : T_MType_rr1 <"vmpyh", 0b101, 0b111, 1, 1>; 2676*9880d681SAndroid Build Coastguard Worker 2677*9880d681SAndroid Build Coastguard Workerdef M2_hmmpyh_rs1 : T_MType_rr2 <"mpy", 0b101, 0b100, 1, 1, ".h">; 2678*9880d681SAndroid Build Coastguard Workerdef M2_hmmpyl_rs1 : T_MType_rr2 <"mpy", 0b111, 0b100, 1, 1, ".l">; 2679*9880d681SAndroid Build Coastguard Worker 2680*9880d681SAndroid Build Coastguard Workerdef M2_cmpyrs_s0 : T_MType_rr2 <"cmpy", 0b001, 0b110, 1, 1>; 2681*9880d681SAndroid Build Coastguard Workerdef M2_cmpyrs_s1 : T_MType_rr2 <"cmpy", 0b101, 0b110, 1, 1>; 2682*9880d681SAndroid Build Coastguard Workerdef M2_cmpyrsc_s0 : T_MType_rr2 <"cmpy", 0b011, 0b110, 1, 1, "*">; 2683*9880d681SAndroid Build Coastguard Workerdef M2_cmpyrsc_s1 : T_MType_rr2 <"cmpy", 0b111, 0b110, 1, 1, "*">; 2684*9880d681SAndroid Build Coastguard Worker 2685*9880d681SAndroid Build Coastguard Worker// V4 Instructions 2686*9880d681SAndroid Build Coastguard Workerdef M2_vraddh : T_MType_dd <"vraddh", 0b001, 0b111, 0>; 2687*9880d681SAndroid Build Coastguard Workerdef M2_mpysu_up : T_MType_rr1 <"mpysu", 0b011, 0b001, 0>; 2688*9880d681SAndroid Build Coastguard Workerdef M2_mpy_up_s1 : T_MType_rr1 <"mpy", 0b101, 0b010, 0>; 2689*9880d681SAndroid Build Coastguard Workerdef M2_mpy_up_s1_sat : T_MType_rr1 <"mpy", 0b111, 0b000, 1>; 2690*9880d681SAndroid Build Coastguard Worker 2691*9880d681SAndroid Build Coastguard Workerdef M2_hmmpyh_s1 : T_MType_rr2 <"mpy", 0b101, 0b000, 1, 0, ".h">; 2692*9880d681SAndroid Build Coastguard Workerdef M2_hmmpyl_s1 : T_MType_rr2 <"mpy", 0b101, 0b001, 1, 0, ".l">; 2693*9880d681SAndroid Build Coastguard Worker 2694*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (mul I32:$src1, I32:$src2)), (M2_mpyi I32:$src1, I32:$src2)>; 2695*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (mulhs I32:$src1, I32:$src2)), (M2_mpy_up I32:$src1, I32:$src2)>; 2696*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (mulhu I32:$src1, I32:$src2)), (M2_mpyu_up I32:$src1, I32:$src2)>; 2697*9880d681SAndroid Build Coastguard Worker 2698*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, opNewValue = 0 in 2699*9880d681SAndroid Build Coastguard Workerclass T_MType_mpy_ri <bit isNeg, Operand ImmOp, list<dag> pattern> 2700*9880d681SAndroid Build Coastguard Worker : MInst < (outs IntRegs:$Rd), (ins IntRegs:$Rs, ImmOp:$u8), 2701*9880d681SAndroid Build Coastguard Worker "$Rd ="#!if(isNeg, "- ", "+ ")#"mpyi($Rs, #$u8)" , 2702*9880d681SAndroid Build Coastguard Worker pattern, "", M_tc_3x_SLOT23> { 2703*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 2704*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 2705*9880d681SAndroid Build Coastguard Worker bits<8> u8; 2706*9880d681SAndroid Build Coastguard Worker 2707*9880d681SAndroid Build Coastguard Worker let IClass = 0b1110; 2708*9880d681SAndroid Build Coastguard Worker 2709*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0000; 2710*9880d681SAndroid Build Coastguard Worker let Inst{23} = isNeg; 2711*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 2712*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 2713*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 2714*9880d681SAndroid Build Coastguard Worker let Inst{12-5} = u8; 2715*9880d681SAndroid Build Coastguard Worker } 2716*9880d681SAndroid Build Coastguard Worker 2717*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, opExtentBits = 8, opExtendable = 2 in 2718*9880d681SAndroid Build Coastguard Workerdef M2_mpysip : T_MType_mpy_ri <0, u8Ext, 2719*9880d681SAndroid Build Coastguard Worker [(set (i32 IntRegs:$Rd), (mul IntRegs:$Rs, u32ImmPred:$u8))]>; 2720*9880d681SAndroid Build Coastguard Worker 2721*9880d681SAndroid Build Coastguard Workerdef M2_mpysin : T_MType_mpy_ri <1, u8Imm, 2722*9880d681SAndroid Build Coastguard Worker [(set (i32 IntRegs:$Rd), (ineg (mul IntRegs:$Rs, 2723*9880d681SAndroid Build Coastguard Worker u8ImmPred:$u8)))]>; 2724*9880d681SAndroid Build Coastguard Worker 2725*9880d681SAndroid Build Coastguard Worker// Assember mapped to M2_mpyi 2726*9880d681SAndroid Build Coastguard Workerlet isAsmParserOnly = 1 in 2727*9880d681SAndroid Build Coastguard Workerdef M2_mpyui : MInst<(outs IntRegs:$dst), 2728*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$src1, IntRegs:$src2), 2729*9880d681SAndroid Build Coastguard Worker "$dst = mpyui($src1, $src2)">; 2730*9880d681SAndroid Build Coastguard Worker 2731*9880d681SAndroid Build Coastguard Worker// Rd=mpyi(Rs,#m9) 2732*9880d681SAndroid Build Coastguard Worker// s9 is NOT the same as m9 - but it works.. so far. 2733*9880d681SAndroid Build Coastguard Worker// Assembler maps to either Rd=+mpyi(Rs,#u8) or Rd=-mpyi(Rs,#u8) 2734*9880d681SAndroid Build Coastguard Worker// depending on the value of m9. See Arch Spec. 2735*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, opExtendable = 2, isExtentSigned = 1, opExtentBits = 9, 2736*9880d681SAndroid Build Coastguard Worker CextOpcode = "mpyi", InputType = "imm", hasNewValue = 1, 2737*9880d681SAndroid Build Coastguard Worker isAsmParserOnly = 1 in 2738*9880d681SAndroid Build Coastguard Workerdef M2_mpysmi : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, s9Ext:$src2), 2739*9880d681SAndroid Build Coastguard Worker "$dst = mpyi($src1, #$src2)", 2740*9880d681SAndroid Build Coastguard Worker [(set (i32 IntRegs:$dst), (mul (i32 IntRegs:$src1), 2741*9880d681SAndroid Build Coastguard Worker s32ImmPred:$src2))]>, ImmRegRel; 2742*9880d681SAndroid Build Coastguard Worker 2743*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, isExtendable = 1, opExtentBits = 8, opExtendable = 3, 2744*9880d681SAndroid Build Coastguard Worker InputType = "imm" in 2745*9880d681SAndroid Build Coastguard Workerclass T_MType_acc_ri <string mnemonic, bits<3> MajOp, Operand ImmOp, 2746*9880d681SAndroid Build Coastguard Worker list<dag> pattern = []> 2747*9880d681SAndroid Build Coastguard Worker : MInst < (outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2, ImmOp:$src3), 2748*9880d681SAndroid Build Coastguard Worker "$dst "#mnemonic#"($src2, #$src3)", 2749*9880d681SAndroid Build Coastguard Worker pattern, "$src1 = $dst", M_tc_2_SLOT23> { 2750*9880d681SAndroid Build Coastguard Worker bits<5> dst; 2751*9880d681SAndroid Build Coastguard Worker bits<5> src2; 2752*9880d681SAndroid Build Coastguard Worker bits<8> src3; 2753*9880d681SAndroid Build Coastguard Worker 2754*9880d681SAndroid Build Coastguard Worker let IClass = 0b1110; 2755*9880d681SAndroid Build Coastguard Worker 2756*9880d681SAndroid Build Coastguard Worker let Inst{27-26} = 0b00; 2757*9880d681SAndroid Build Coastguard Worker let Inst{25-23} = MajOp; 2758*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src2; 2759*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 2760*9880d681SAndroid Build Coastguard Worker let Inst{12-5} = src3; 2761*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 2762*9880d681SAndroid Build Coastguard Worker } 2763*9880d681SAndroid Build Coastguard Worker 2764*9880d681SAndroid Build Coastguard Workerlet InputType = "reg", hasNewValue = 1 in 2765*9880d681SAndroid Build Coastguard Workerclass T_MType_acc_rr <string mnemonic, bits<3> MajOp, bits<3> MinOp, 2766*9880d681SAndroid Build Coastguard Worker bit isSwap = 0, list<dag> pattern = [], bit hasNot = 0, 2767*9880d681SAndroid Build Coastguard Worker bit isSat = 0, bit isShift = 0> 2768*9880d681SAndroid Build Coastguard Worker : MInst < (outs IntRegs:$dst), 2769*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$src1, IntRegs:$src2, IntRegs:$src3), 2770*9880d681SAndroid Build Coastguard Worker "$dst "#mnemonic#"($src2, "#!if(hasNot, "~$src3)","$src3)") 2771*9880d681SAndroid Build Coastguard Worker #!if(isShift, ":<<1", "") 2772*9880d681SAndroid Build Coastguard Worker #!if(isSat, ":sat", ""), 2773*9880d681SAndroid Build Coastguard Worker pattern, "$src1 = $dst", M_tc_2_SLOT23 > { 2774*9880d681SAndroid Build Coastguard Worker bits<5> dst; 2775*9880d681SAndroid Build Coastguard Worker bits<5> src2; 2776*9880d681SAndroid Build Coastguard Worker bits<5> src3; 2777*9880d681SAndroid Build Coastguard Worker 2778*9880d681SAndroid Build Coastguard Worker let IClass = 0b1110; 2779*9880d681SAndroid Build Coastguard Worker 2780*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1111; 2781*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MajOp; 2782*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = !if(isSwap, src3, src2); 2783*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 2784*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = !if(isSwap, src2, src3); 2785*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = MinOp; 2786*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 2787*9880d681SAndroid Build Coastguard Worker } 2788*9880d681SAndroid Build Coastguard Worker 2789*9880d681SAndroid Build Coastguard Workerlet CextOpcode = "MPYI_acc", Itinerary = M_tc_3x_SLOT23 in { 2790*9880d681SAndroid Build Coastguard Worker def M2_macsip : T_MType_acc_ri <"+= mpyi", 0b010, u8Ext, 2791*9880d681SAndroid Build Coastguard Worker [(set (i32 IntRegs:$dst), 2792*9880d681SAndroid Build Coastguard Worker (add (mul IntRegs:$src2, u32ImmPred:$src3), 2793*9880d681SAndroid Build Coastguard Worker IntRegs:$src1))]>, ImmRegRel; 2794*9880d681SAndroid Build Coastguard Worker 2795*9880d681SAndroid Build Coastguard Worker def M2_maci : T_MType_acc_rr <"+= mpyi", 0b000, 0b000, 0, 2796*9880d681SAndroid Build Coastguard Worker [(set (i32 IntRegs:$dst), 2797*9880d681SAndroid Build Coastguard Worker (add (mul IntRegs:$src2, IntRegs:$src3), 2798*9880d681SAndroid Build Coastguard Worker IntRegs:$src1))]>, ImmRegRel; 2799*9880d681SAndroid Build Coastguard Worker} 2800*9880d681SAndroid Build Coastguard Worker 2801*9880d681SAndroid Build Coastguard Workerlet CextOpcode = "ADD_acc" in { 2802*9880d681SAndroid Build Coastguard Worker let isExtentSigned = 1 in 2803*9880d681SAndroid Build Coastguard Worker def M2_accii : T_MType_acc_ri <"+= add", 0b100, s8Ext, 2804*9880d681SAndroid Build Coastguard Worker [(set (i32 IntRegs:$dst), 2805*9880d681SAndroid Build Coastguard Worker (add (add (i32 IntRegs:$src2), s32ImmPred:$src3), 2806*9880d681SAndroid Build Coastguard Worker (i32 IntRegs:$src1)))]>, ImmRegRel; 2807*9880d681SAndroid Build Coastguard Worker 2808*9880d681SAndroid Build Coastguard Worker def M2_acci : T_MType_acc_rr <"+= add", 0b000, 0b001, 0, 2809*9880d681SAndroid Build Coastguard Worker [(set (i32 IntRegs:$dst), 2810*9880d681SAndroid Build Coastguard Worker (add (add (i32 IntRegs:$src2), (i32 IntRegs:$src3)), 2811*9880d681SAndroid Build Coastguard Worker (i32 IntRegs:$src1)))]>, ImmRegRel; 2812*9880d681SAndroid Build Coastguard Worker} 2813*9880d681SAndroid Build Coastguard Worker 2814*9880d681SAndroid Build Coastguard Workerlet CextOpcode = "SUB_acc" in { 2815*9880d681SAndroid Build Coastguard Worker let isExtentSigned = 1 in 2816*9880d681SAndroid Build Coastguard Worker def M2_naccii : T_MType_acc_ri <"-= add", 0b101, s8Ext>, ImmRegRel; 2817*9880d681SAndroid Build Coastguard Worker 2818*9880d681SAndroid Build Coastguard Worker def M2_nacci : T_MType_acc_rr <"-= add", 0b100, 0b001, 0>, ImmRegRel; 2819*9880d681SAndroid Build Coastguard Worker} 2820*9880d681SAndroid Build Coastguard Worker 2821*9880d681SAndroid Build Coastguard Workerlet Itinerary = M_tc_3x_SLOT23 in 2822*9880d681SAndroid Build Coastguard Workerdef M2_macsin : T_MType_acc_ri <"-= mpyi", 0b011, u8Ext>; 2823*9880d681SAndroid Build Coastguard Worker 2824*9880d681SAndroid Build Coastguard Workerdef M2_xor_xacc : T_MType_acc_rr < "^= xor", 0b100, 0b011, 0>; 2825*9880d681SAndroid Build Coastguard Workerdef M2_subacc : T_MType_acc_rr <"+= sub", 0b000, 0b011, 1>; 2826*9880d681SAndroid Build Coastguard Worker 2827*9880d681SAndroid Build Coastguard Workerclass T_MType_acc_pat1 <InstHexagon MI, SDNode firstOp, SDNode secOp, 2828*9880d681SAndroid Build Coastguard Worker PatLeaf ImmPred> 2829*9880d681SAndroid Build Coastguard Worker : Pat <(secOp IntRegs:$src1, (firstOp IntRegs:$src2, ImmPred:$src3)), 2830*9880d681SAndroid Build Coastguard Worker (MI IntRegs:$src1, IntRegs:$src2, ImmPred:$src3)>; 2831*9880d681SAndroid Build Coastguard Worker 2832*9880d681SAndroid Build Coastguard Workerclass T_MType_acc_pat2 <InstHexagon MI, SDNode firstOp, SDNode secOp> 2833*9880d681SAndroid Build Coastguard Worker : Pat <(i32 (secOp IntRegs:$src1, (firstOp IntRegs:$src2, IntRegs:$src3))), 2834*9880d681SAndroid Build Coastguard Worker (MI IntRegs:$src1, IntRegs:$src2, IntRegs:$src3)>; 2835*9880d681SAndroid Build Coastguard Worker 2836*9880d681SAndroid Build Coastguard Workerdef : T_MType_acc_pat2 <M2_xor_xacc, xor, xor>; 2837*9880d681SAndroid Build Coastguard Workerdef : T_MType_acc_pat1 <M2_macsin, mul, sub, u32ImmPred>; 2838*9880d681SAndroid Build Coastguard Worker 2839*9880d681SAndroid Build Coastguard Workerdef : T_MType_acc_pat1 <M2_naccii, add, sub, s32ImmPred>; 2840*9880d681SAndroid Build Coastguard Workerdef : T_MType_acc_pat2 <M2_nacci, add, sub>; 2841*9880d681SAndroid Build Coastguard Worker 2842*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2843*9880d681SAndroid Build Coastguard Worker// Template Class -- XType Vector Instructions 2844*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2845*9880d681SAndroid Build Coastguard Workerclass T_XTYPE_Vect < string opc, bits<3> MajOp, bits<3> MinOp, bit isConj > 2846*9880d681SAndroid Build Coastguard Worker : MInst <(outs DoubleRegs:$Rdd), (ins DoubleRegs:$Rss, DoubleRegs:$Rtt), 2847*9880d681SAndroid Build Coastguard Worker "$Rdd = "#opc#"($Rss, $Rtt"#!if(isConj,"*)",")"), 2848*9880d681SAndroid Build Coastguard Worker [] > { 2849*9880d681SAndroid Build Coastguard Worker bits<5> Rdd; 2850*9880d681SAndroid Build Coastguard Worker bits<5> Rss; 2851*9880d681SAndroid Build Coastguard Worker bits<5> Rtt; 2852*9880d681SAndroid Build Coastguard Worker 2853*9880d681SAndroid Build Coastguard Worker let IClass = 0b1110; 2854*9880d681SAndroid Build Coastguard Worker 2855*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1000; 2856*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MajOp; 2857*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = MinOp; 2858*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rdd; 2859*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rss; 2860*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rtt; 2861*9880d681SAndroid Build Coastguard Worker } 2862*9880d681SAndroid Build Coastguard Worker 2863*9880d681SAndroid Build Coastguard Workerclass T_XTYPE_Vect_acc < string opc, bits<3> MajOp, bits<3> MinOp, bit isConj > 2864*9880d681SAndroid Build Coastguard Worker : MInst <(outs DoubleRegs:$Rdd), 2865*9880d681SAndroid Build Coastguard Worker (ins DoubleRegs:$dst2, DoubleRegs:$Rss, DoubleRegs:$Rtt), 2866*9880d681SAndroid Build Coastguard Worker "$Rdd += "#opc#"($Rss, $Rtt"#!if(isConj,"*)",")"), 2867*9880d681SAndroid Build Coastguard Worker [], "$dst2 = $Rdd",M_tc_3x_SLOT23 > { 2868*9880d681SAndroid Build Coastguard Worker bits<5> Rdd; 2869*9880d681SAndroid Build Coastguard Worker bits<5> Rss; 2870*9880d681SAndroid Build Coastguard Worker bits<5> Rtt; 2871*9880d681SAndroid Build Coastguard Worker 2872*9880d681SAndroid Build Coastguard Worker let IClass = 0b1110; 2873*9880d681SAndroid Build Coastguard Worker 2874*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1010; 2875*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MajOp; 2876*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = MinOp; 2877*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rdd; 2878*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rss; 2879*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rtt; 2880*9880d681SAndroid Build Coastguard Worker } 2881*9880d681SAndroid Build Coastguard Worker 2882*9880d681SAndroid Build Coastguard Workerclass T_XTYPE_Vect_diff < bits<3> MajOp, string opc > 2883*9880d681SAndroid Build Coastguard Worker : MInst <(outs DoubleRegs:$Rdd), (ins DoubleRegs:$Rtt, DoubleRegs:$Rss), 2884*9880d681SAndroid Build Coastguard Worker "$Rdd = "#opc#"($Rtt, $Rss)", 2885*9880d681SAndroid Build Coastguard Worker [], "",M_tc_2_SLOT23 > { 2886*9880d681SAndroid Build Coastguard Worker bits<5> Rdd; 2887*9880d681SAndroid Build Coastguard Worker bits<5> Rss; 2888*9880d681SAndroid Build Coastguard Worker bits<5> Rtt; 2889*9880d681SAndroid Build Coastguard Worker 2890*9880d681SAndroid Build Coastguard Worker let IClass = 0b1110; 2891*9880d681SAndroid Build Coastguard Worker 2892*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1000; 2893*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MajOp; 2894*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = 0b000; 2895*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rdd; 2896*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rss; 2897*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rtt; 2898*9880d681SAndroid Build Coastguard Worker } 2899*9880d681SAndroid Build Coastguard Worker 2900*9880d681SAndroid Build Coastguard Worker// Vector reduce add unsigned bytes: Rdd32=vrmpybu(Rss32,Rtt32) 2901*9880d681SAndroid Build Coastguard Workerdef A2_vraddub: T_XTYPE_Vect <"vraddub", 0b010, 0b001, 0>; 2902*9880d681SAndroid Build Coastguard Workerdef A2_vraddub_acc: T_XTYPE_Vect_acc <"vraddub", 0b010, 0b001, 0>; 2903*9880d681SAndroid Build Coastguard Worker 2904*9880d681SAndroid Build Coastguard Worker// Vector sum of absolute differences unsigned bytes: Rdd=vrsadub(Rss,Rtt) 2905*9880d681SAndroid Build Coastguard Workerdef A2_vrsadub: T_XTYPE_Vect <"vrsadub", 0b010, 0b010, 0>; 2906*9880d681SAndroid Build Coastguard Workerdef A2_vrsadub_acc: T_XTYPE_Vect_acc <"vrsadub", 0b010, 0b010, 0>; 2907*9880d681SAndroid Build Coastguard Worker 2908*9880d681SAndroid Build Coastguard Worker// Vector absolute difference: Rdd=vabsdiffh(Rtt,Rss) 2909*9880d681SAndroid Build Coastguard Workerdef M2_vabsdiffh: T_XTYPE_Vect_diff<0b011, "vabsdiffh">; 2910*9880d681SAndroid Build Coastguard Worker 2911*9880d681SAndroid Build Coastguard Worker// Vector absolute difference words: Rdd=vabsdiffw(Rtt,Rss) 2912*9880d681SAndroid Build Coastguard Workerdef M2_vabsdiffw: T_XTYPE_Vect_diff<0b001, "vabsdiffw">; 2913*9880d681SAndroid Build Coastguard Worker 2914*9880d681SAndroid Build Coastguard Worker// Vector reduce complex multiply real or imaginary: 2915*9880d681SAndroid Build Coastguard Worker// Rdd[+]=vrcmpy[ir](Rss,Rtt[*]) 2916*9880d681SAndroid Build Coastguard Workerdef M2_vrcmpyi_s0: T_XTYPE_Vect <"vrcmpyi", 0b000, 0b000, 0>; 2917*9880d681SAndroid Build Coastguard Workerdef M2_vrcmpyi_s0c: T_XTYPE_Vect <"vrcmpyi", 0b010, 0b000, 1>; 2918*9880d681SAndroid Build Coastguard Workerdef M2_vrcmaci_s0: T_XTYPE_Vect_acc <"vrcmpyi", 0b000, 0b000, 0>; 2919*9880d681SAndroid Build Coastguard Workerdef M2_vrcmaci_s0c: T_XTYPE_Vect_acc <"vrcmpyi", 0b010, 0b000, 1>; 2920*9880d681SAndroid Build Coastguard Worker 2921*9880d681SAndroid Build Coastguard Workerdef M2_vrcmpyr_s0: T_XTYPE_Vect <"vrcmpyr", 0b000, 0b001, 0>; 2922*9880d681SAndroid Build Coastguard Workerdef M2_vrcmpyr_s0c: T_XTYPE_Vect <"vrcmpyr", 0b011, 0b001, 1>; 2923*9880d681SAndroid Build Coastguard Workerdef M2_vrcmacr_s0: T_XTYPE_Vect_acc <"vrcmpyr", 0b000, 0b001, 0>; 2924*9880d681SAndroid Build Coastguard Workerdef M2_vrcmacr_s0c: T_XTYPE_Vect_acc <"vrcmpyr", 0b011, 0b001, 1>; 2925*9880d681SAndroid Build Coastguard Worker 2926*9880d681SAndroid Build Coastguard Worker// Vector reduce halfwords: 2927*9880d681SAndroid Build Coastguard Worker// Rdd[+]=vrmpyh(Rss,Rtt) 2928*9880d681SAndroid Build Coastguard Workerdef M2_vrmpy_s0: T_XTYPE_Vect <"vrmpyh", 0b000, 0b010, 0>; 2929*9880d681SAndroid Build Coastguard Workerdef M2_vrmac_s0: T_XTYPE_Vect_acc <"vrmpyh", 0b000, 0b010, 0>; 2930*9880d681SAndroid Build Coastguard Worker 2931*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2932*9880d681SAndroid Build Coastguard Worker// Template Class -- Vector Multipy with accumulation. 2933*9880d681SAndroid Build Coastguard Worker// Used for complex multiply real or imaginary, dual multiply and even halfwords 2934*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2935*9880d681SAndroid Build Coastguard Workerlet Defs = [USR_OVF] in 2936*9880d681SAndroid Build Coastguard Workerclass T_M2_vmpy_acc_sat < string opc, bits<3> MajOp, bits<3> MinOp, 2937*9880d681SAndroid Build Coastguard Worker bit hasShift, bit isRnd > 2938*9880d681SAndroid Build Coastguard Worker : MInst <(outs DoubleRegs:$Rxx), 2939*9880d681SAndroid Build Coastguard Worker (ins DoubleRegs:$dst2, DoubleRegs:$Rss, DoubleRegs:$Rtt), 2940*9880d681SAndroid Build Coastguard Worker "$Rxx += "#opc#"($Rss, $Rtt)"#!if(hasShift,":<<1","") 2941*9880d681SAndroid Build Coastguard Worker #!if(isRnd,":rnd","")#":sat", 2942*9880d681SAndroid Build Coastguard Worker [], "$dst2 = $Rxx",M_tc_3x_SLOT23 > { 2943*9880d681SAndroid Build Coastguard Worker bits<5> Rxx; 2944*9880d681SAndroid Build Coastguard Worker bits<5> Rss; 2945*9880d681SAndroid Build Coastguard Worker bits<5> Rtt; 2946*9880d681SAndroid Build Coastguard Worker 2947*9880d681SAndroid Build Coastguard Worker let IClass = 0b1110; 2948*9880d681SAndroid Build Coastguard Worker 2949*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1010; 2950*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MajOp; 2951*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = MinOp; 2952*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rxx; 2953*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rss; 2954*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rtt; 2955*9880d681SAndroid Build Coastguard Worker } 2956*9880d681SAndroid Build Coastguard Worker 2957*9880d681SAndroid Build Coastguard Workerclass T_M2_vmpy_acc < string opc, bits<3> MajOp, bits<3> MinOp, 2958*9880d681SAndroid Build Coastguard Worker bit hasShift, bit isRnd > 2959*9880d681SAndroid Build Coastguard Worker : MInst <(outs DoubleRegs:$Rxx), 2960*9880d681SAndroid Build Coastguard Worker (ins DoubleRegs:$dst2, DoubleRegs:$Rss, DoubleRegs:$Rtt), 2961*9880d681SAndroid Build Coastguard Worker "$Rxx += "#opc#"($Rss, $Rtt)"#!if(hasShift,":<<1","") 2962*9880d681SAndroid Build Coastguard Worker #!if(isRnd,":rnd",""), 2963*9880d681SAndroid Build Coastguard Worker [], "$dst2 = $Rxx",M_tc_3x_SLOT23 > { 2964*9880d681SAndroid Build Coastguard Worker bits<5> Rxx; 2965*9880d681SAndroid Build Coastguard Worker bits<5> Rss; 2966*9880d681SAndroid Build Coastguard Worker bits<5> Rtt; 2967*9880d681SAndroid Build Coastguard Worker 2968*9880d681SAndroid Build Coastguard Worker let IClass = 0b1110; 2969*9880d681SAndroid Build Coastguard Worker 2970*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1010; 2971*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MajOp; 2972*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = MinOp; 2973*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rxx; 2974*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rss; 2975*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rtt; 2976*9880d681SAndroid Build Coastguard Worker } 2977*9880d681SAndroid Build Coastguard Worker 2978*9880d681SAndroid Build Coastguard Worker// Vector multiply word by signed half with accumulation 2979*9880d681SAndroid Build Coastguard Worker// Rxx+=vmpyw[eo]h(Rss,Rtt)[:<<1][:rnd]:sat 2980*9880d681SAndroid Build Coastguard Workerdef M2_mmacls_s1: T_M2_vmpy_acc_sat <"vmpyweh", 0b100, 0b101, 1, 0>; 2981*9880d681SAndroid Build Coastguard Workerdef M2_mmacls_s0: T_M2_vmpy_acc_sat <"vmpyweh", 0b000, 0b101, 0, 0>; 2982*9880d681SAndroid Build Coastguard Workerdef M2_mmacls_rs1: T_M2_vmpy_acc_sat <"vmpyweh", 0b101, 0b101, 1, 1>; 2983*9880d681SAndroid Build Coastguard Workerdef M2_mmacls_rs0: T_M2_vmpy_acc_sat <"vmpyweh", 0b001, 0b101, 0, 1>; 2984*9880d681SAndroid Build Coastguard Worker 2985*9880d681SAndroid Build Coastguard Workerdef M2_mmachs_s1: T_M2_vmpy_acc_sat <"vmpywoh", 0b100, 0b111, 1, 0>; 2986*9880d681SAndroid Build Coastguard Workerdef M2_mmachs_s0: T_M2_vmpy_acc_sat <"vmpywoh", 0b000, 0b111, 0, 0>; 2987*9880d681SAndroid Build Coastguard Workerdef M2_mmachs_rs1: T_M2_vmpy_acc_sat <"vmpywoh", 0b101, 0b111, 1, 1>; 2988*9880d681SAndroid Build Coastguard Workerdef M2_mmachs_rs0: T_M2_vmpy_acc_sat <"vmpywoh", 0b001, 0b111, 0, 1>; 2989*9880d681SAndroid Build Coastguard Worker 2990*9880d681SAndroid Build Coastguard Worker// Vector multiply word by unsigned half with accumulation 2991*9880d681SAndroid Build Coastguard Worker// Rxx+=vmpyw[eo]uh(Rss,Rtt)[:<<1][:rnd]:sat 2992*9880d681SAndroid Build Coastguard Workerdef M2_mmaculs_s1: T_M2_vmpy_acc_sat <"vmpyweuh", 0b110, 0b101, 1, 0>; 2993*9880d681SAndroid Build Coastguard Workerdef M2_mmaculs_s0: T_M2_vmpy_acc_sat <"vmpyweuh", 0b010, 0b101, 0, 0>; 2994*9880d681SAndroid Build Coastguard Workerdef M2_mmaculs_rs1: T_M2_vmpy_acc_sat <"vmpyweuh", 0b111, 0b101, 1, 1>; 2995*9880d681SAndroid Build Coastguard Workerdef M2_mmaculs_rs0: T_M2_vmpy_acc_sat <"vmpyweuh", 0b011, 0b101, 0, 1>; 2996*9880d681SAndroid Build Coastguard Worker 2997*9880d681SAndroid Build Coastguard Workerdef M2_mmacuhs_s1: T_M2_vmpy_acc_sat <"vmpywouh", 0b110, 0b111, 1, 0>; 2998*9880d681SAndroid Build Coastguard Workerdef M2_mmacuhs_s0: T_M2_vmpy_acc_sat <"vmpywouh", 0b010, 0b111, 0, 0>; 2999*9880d681SAndroid Build Coastguard Workerdef M2_mmacuhs_rs1: T_M2_vmpy_acc_sat <"vmpywouh", 0b111, 0b111, 1, 1>; 3000*9880d681SAndroid Build Coastguard Workerdef M2_mmacuhs_rs0: T_M2_vmpy_acc_sat <"vmpywouh", 0b011, 0b111, 0, 1>; 3001*9880d681SAndroid Build Coastguard Worker 3002*9880d681SAndroid Build Coastguard Worker// Vector multiply even halfwords with accumulation 3003*9880d681SAndroid Build Coastguard Worker// Rxx+=vmpyeh(Rss,Rtt)[:<<1][:sat] 3004*9880d681SAndroid Build Coastguard Workerdef M2_vmac2es: T_M2_vmpy_acc <"vmpyeh", 0b001, 0b010, 0, 0>; 3005*9880d681SAndroid Build Coastguard Workerdef M2_vmac2es_s1: T_M2_vmpy_acc_sat <"vmpyeh", 0b100, 0b110, 1, 0>; 3006*9880d681SAndroid Build Coastguard Workerdef M2_vmac2es_s0: T_M2_vmpy_acc_sat <"vmpyeh", 0b000, 0b110, 0, 0>; 3007*9880d681SAndroid Build Coastguard Worker 3008*9880d681SAndroid Build Coastguard Worker// Vector dual multiply with accumulation 3009*9880d681SAndroid Build Coastguard Worker// Rxx+=vdmpy(Rss,Rtt)[:sat] 3010*9880d681SAndroid Build Coastguard Workerdef M2_vdmacs_s1: T_M2_vmpy_acc_sat <"vdmpy", 0b100, 0b100, 1, 0>; 3011*9880d681SAndroid Build Coastguard Workerdef M2_vdmacs_s0: T_M2_vmpy_acc_sat <"vdmpy", 0b000, 0b100, 0, 0>; 3012*9880d681SAndroid Build Coastguard Worker 3013*9880d681SAndroid Build Coastguard Worker// Vector complex multiply real or imaginary with accumulation 3014*9880d681SAndroid Build Coastguard Worker// Rxx+=vcmpy[ir](Rss,Rtt):sat 3015*9880d681SAndroid Build Coastguard Workerdef M2_vcmac_s0_sat_r: T_M2_vmpy_acc_sat <"vcmpyr", 0b001, 0b100, 0, 0>; 3016*9880d681SAndroid Build Coastguard Workerdef M2_vcmac_s0_sat_i: T_M2_vmpy_acc_sat <"vcmpyi", 0b010, 0b100, 0, 0>; 3017*9880d681SAndroid Build Coastguard Worker 3018*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3019*9880d681SAndroid Build Coastguard Worker// Template Class -- Multiply signed/unsigned halfwords with and without 3020*9880d681SAndroid Build Coastguard Worker// saturation and rounding 3021*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3022*9880d681SAndroid Build Coastguard Workerclass T_M2_mpyd < bits<2> LHbits, bit isRnd, bit hasShift, bit isUnsigned > 3023*9880d681SAndroid Build Coastguard Worker : MInst < (outs DoubleRegs:$Rdd), (ins IntRegs:$Rs, IntRegs:$Rt), 3024*9880d681SAndroid Build Coastguard Worker "$Rdd = "#!if(isUnsigned,"mpyu","mpy")#"($Rs."#!if(LHbits{1},"h","l") 3025*9880d681SAndroid Build Coastguard Worker #", $Rt."#!if(LHbits{0},"h)","l)") 3026*9880d681SAndroid Build Coastguard Worker #!if(hasShift,":<<1","") 3027*9880d681SAndroid Build Coastguard Worker #!if(isRnd,":rnd",""), 3028*9880d681SAndroid Build Coastguard Worker [] > { 3029*9880d681SAndroid Build Coastguard Worker bits<5> Rdd; 3030*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 3031*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 3032*9880d681SAndroid Build Coastguard Worker 3033*9880d681SAndroid Build Coastguard Worker let IClass = 0b1110; 3034*9880d681SAndroid Build Coastguard Worker 3035*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0100; 3036*9880d681SAndroid Build Coastguard Worker let Inst{23} = hasShift; 3037*9880d681SAndroid Build Coastguard Worker let Inst{22} = isUnsigned; 3038*9880d681SAndroid Build Coastguard Worker let Inst{21} = isRnd; 3039*9880d681SAndroid Build Coastguard Worker let Inst{6-5} = LHbits; 3040*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rdd; 3041*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 3042*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 3043*9880d681SAndroid Build Coastguard Worker} 3044*9880d681SAndroid Build Coastguard Worker 3045*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_hh_s0: T_M2_mpyd<0b11, 0, 0, 0>; 3046*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_hl_s0: T_M2_mpyd<0b10, 0, 0, 0>; 3047*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_lh_s0: T_M2_mpyd<0b01, 0, 0, 0>; 3048*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_ll_s0: T_M2_mpyd<0b00, 0, 0, 0>; 3049*9880d681SAndroid Build Coastguard Worker 3050*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_hh_s1: T_M2_mpyd<0b11, 0, 1, 0>; 3051*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_hl_s1: T_M2_mpyd<0b10, 0, 1, 0>; 3052*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_lh_s1: T_M2_mpyd<0b01, 0, 1, 0>; 3053*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_ll_s1: T_M2_mpyd<0b00, 0, 1, 0>; 3054*9880d681SAndroid Build Coastguard Worker 3055*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_rnd_hh_s0: T_M2_mpyd<0b11, 1, 0, 0>; 3056*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_rnd_hl_s0: T_M2_mpyd<0b10, 1, 0, 0>; 3057*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_rnd_lh_s0: T_M2_mpyd<0b01, 1, 0, 0>; 3058*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_rnd_ll_s0: T_M2_mpyd<0b00, 1, 0, 0>; 3059*9880d681SAndroid Build Coastguard Worker 3060*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_rnd_hh_s1: T_M2_mpyd<0b11, 1, 1, 0>; 3061*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_rnd_hl_s1: T_M2_mpyd<0b10, 1, 1, 0>; 3062*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_rnd_lh_s1: T_M2_mpyd<0b01, 1, 1, 0>; 3063*9880d681SAndroid Build Coastguard Workerdef M2_mpyd_rnd_ll_s1: T_M2_mpyd<0b00, 1, 1, 0>; 3064*9880d681SAndroid Build Coastguard Worker 3065*9880d681SAndroid Build Coastguard Worker//Rdd=mpyu(Rs.[HL],Rt.[HL])[:<<1] 3066*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_hh_s0: T_M2_mpyd<0b11, 0, 0, 1>; 3067*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_hl_s0: T_M2_mpyd<0b10, 0, 0, 1>; 3068*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_lh_s0: T_M2_mpyd<0b01, 0, 0, 1>; 3069*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_ll_s0: T_M2_mpyd<0b00, 0, 0, 1>; 3070*9880d681SAndroid Build Coastguard Worker 3071*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_hh_s1: T_M2_mpyd<0b11, 0, 1, 1>; 3072*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_hl_s1: T_M2_mpyd<0b10, 0, 1, 1>; 3073*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_lh_s1: T_M2_mpyd<0b01, 0, 1, 1>; 3074*9880d681SAndroid Build Coastguard Workerdef M2_mpyud_ll_s1: T_M2_mpyd<0b00, 0, 1, 1>; 3075*9880d681SAndroid Build Coastguard Worker 3076*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3077*9880d681SAndroid Build Coastguard Worker// Template Class for xtype mpy: 3078*9880d681SAndroid Build Coastguard Worker// Vector multiply 3079*9880d681SAndroid Build Coastguard Worker// Complex multiply 3080*9880d681SAndroid Build Coastguard Worker// multiply 32X32 and use full result 3081*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3082*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 3083*9880d681SAndroid Build Coastguard Workerclass T_XTYPE_mpy64 <string mnemonic, bits<3> MajOp, bits<3> MinOp, 3084*9880d681SAndroid Build Coastguard Worker bit isSat, bit hasShift, bit isConj> 3085*9880d681SAndroid Build Coastguard Worker : MInst <(outs DoubleRegs:$Rdd), 3086*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$Rs, IntRegs:$Rt), 3087*9880d681SAndroid Build Coastguard Worker "$Rdd = "#mnemonic#"($Rs, $Rt"#!if(isConj,"*)",")") 3088*9880d681SAndroid Build Coastguard Worker #!if(hasShift,":<<1","") 3089*9880d681SAndroid Build Coastguard Worker #!if(isSat,":sat",""), 3090*9880d681SAndroid Build Coastguard Worker [] > { 3091*9880d681SAndroid Build Coastguard Worker bits<5> Rdd; 3092*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 3093*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 3094*9880d681SAndroid Build Coastguard Worker 3095*9880d681SAndroid Build Coastguard Worker let IClass = 0b1110; 3096*9880d681SAndroid Build Coastguard Worker 3097*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0101; 3098*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MajOp; 3099*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 3100*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 3101*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = MinOp; 3102*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rdd; 3103*9880d681SAndroid Build Coastguard Worker } 3104*9880d681SAndroid Build Coastguard Worker 3105*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3106*9880d681SAndroid Build Coastguard Worker// Template Class for xtype mpy with accumulation into 64-bit: 3107*9880d681SAndroid Build Coastguard Worker// Vector multiply 3108*9880d681SAndroid Build Coastguard Worker// Complex multiply 3109*9880d681SAndroid Build Coastguard Worker// multiply 32X32 and use full result 3110*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3111*9880d681SAndroid Build Coastguard Workerclass T_XTYPE_mpy64_acc <string op1, string op2, bits<3> MajOp, bits<3> MinOp, 3112*9880d681SAndroid Build Coastguard Worker bit isSat, bit hasShift, bit isConj> 3113*9880d681SAndroid Build Coastguard Worker : MInst <(outs DoubleRegs:$Rxx), 3114*9880d681SAndroid Build Coastguard Worker (ins DoubleRegs:$dst2, IntRegs:$Rs, IntRegs:$Rt), 3115*9880d681SAndroid Build Coastguard Worker "$Rxx "#op2#"= "#op1#"($Rs, $Rt"#!if(isConj,"*)",")") 3116*9880d681SAndroid Build Coastguard Worker #!if(hasShift,":<<1","") 3117*9880d681SAndroid Build Coastguard Worker #!if(isSat,":sat",""), 3118*9880d681SAndroid Build Coastguard Worker 3119*9880d681SAndroid Build Coastguard Worker [] , "$dst2 = $Rxx" > { 3120*9880d681SAndroid Build Coastguard Worker bits<5> Rxx; 3121*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 3122*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 3123*9880d681SAndroid Build Coastguard Worker 3124*9880d681SAndroid Build Coastguard Worker let IClass = 0b1110; 3125*9880d681SAndroid Build Coastguard Worker 3126*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0111; 3127*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MajOp; 3128*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 3129*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 3130*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = MinOp; 3131*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rxx; 3132*9880d681SAndroid Build Coastguard Worker } 3133*9880d681SAndroid Build Coastguard Worker 3134*9880d681SAndroid Build Coastguard Worker// MPY - Multiply and use full result 3135*9880d681SAndroid Build Coastguard Worker// Rdd = mpy[u](Rs,Rt) 3136*9880d681SAndroid Build Coastguard Workerdef M2_dpmpyss_s0 : T_XTYPE_mpy64 < "mpy", 0b000, 0b000, 0, 0, 0>; 3137*9880d681SAndroid Build Coastguard Workerdef M2_dpmpyuu_s0 : T_XTYPE_mpy64 < "mpyu", 0b010, 0b000, 0, 0, 0>; 3138*9880d681SAndroid Build Coastguard Worker 3139*9880d681SAndroid Build Coastguard Worker// Rxx[+-]= mpy[u](Rs,Rt) 3140*9880d681SAndroid Build Coastguard Workerdef M2_dpmpyss_acc_s0 : T_XTYPE_mpy64_acc < "mpy", "+", 0b000, 0b000, 0, 0, 0>; 3141*9880d681SAndroid Build Coastguard Workerdef M2_dpmpyss_nac_s0 : T_XTYPE_mpy64_acc < "mpy", "-", 0b001, 0b000, 0, 0, 0>; 3142*9880d681SAndroid Build Coastguard Workerdef M2_dpmpyuu_acc_s0 : T_XTYPE_mpy64_acc < "mpyu", "+", 0b010, 0b000, 0, 0, 0>; 3143*9880d681SAndroid Build Coastguard Workerdef M2_dpmpyuu_nac_s0 : T_XTYPE_mpy64_acc < "mpyu", "-", 0b011, 0b000, 0, 0, 0>; 3144*9880d681SAndroid Build Coastguard Worker 3145*9880d681SAndroid Build Coastguard Worker// Complex multiply real or imaginary 3146*9880d681SAndroid Build Coastguard Worker// Rxx=cmpy[ir](Rs,Rt) 3147*9880d681SAndroid Build Coastguard Workerdef M2_cmpyi_s0 : T_XTYPE_mpy64 < "cmpyi", 0b000, 0b001, 0, 0, 0>; 3148*9880d681SAndroid Build Coastguard Workerdef M2_cmpyr_s0 : T_XTYPE_mpy64 < "cmpyr", 0b000, 0b010, 0, 0, 0>; 3149*9880d681SAndroid Build Coastguard Worker 3150*9880d681SAndroid Build Coastguard Worker// Rxx+=cmpy[ir](Rs,Rt) 3151*9880d681SAndroid Build Coastguard Workerdef M2_cmaci_s0 : T_XTYPE_mpy64_acc < "cmpyi", "+", 0b000, 0b001, 0, 0, 0>; 3152*9880d681SAndroid Build Coastguard Workerdef M2_cmacr_s0 : T_XTYPE_mpy64_acc < "cmpyr", "+", 0b000, 0b010, 0, 0, 0>; 3153*9880d681SAndroid Build Coastguard Worker 3154*9880d681SAndroid Build Coastguard Worker// Complex multiply 3155*9880d681SAndroid Build Coastguard Worker// Rdd=cmpy(Rs,Rt)[:<<]:sat 3156*9880d681SAndroid Build Coastguard Workerdef M2_cmpys_s0 : T_XTYPE_mpy64 < "cmpy", 0b000, 0b110, 1, 0, 0>; 3157*9880d681SAndroid Build Coastguard Workerdef M2_cmpys_s1 : T_XTYPE_mpy64 < "cmpy", 0b100, 0b110, 1, 1, 0>; 3158*9880d681SAndroid Build Coastguard Worker 3159*9880d681SAndroid Build Coastguard Worker// Rdd=cmpy(Rs,Rt*)[:<<]:sat 3160*9880d681SAndroid Build Coastguard Workerdef M2_cmpysc_s0 : T_XTYPE_mpy64 < "cmpy", 0b010, 0b110, 1, 0, 1>; 3161*9880d681SAndroid Build Coastguard Workerdef M2_cmpysc_s1 : T_XTYPE_mpy64 < "cmpy", 0b110, 0b110, 1, 1, 1>; 3162*9880d681SAndroid Build Coastguard Worker 3163*9880d681SAndroid Build Coastguard Worker// Rxx[-+]=cmpy(Rs,Rt)[:<<1]:sat 3164*9880d681SAndroid Build Coastguard Workerdef M2_cmacs_s0 : T_XTYPE_mpy64_acc < "cmpy", "+", 0b000, 0b110, 1, 0, 0>; 3165*9880d681SAndroid Build Coastguard Workerdef M2_cnacs_s0 : T_XTYPE_mpy64_acc < "cmpy", "-", 0b000, 0b111, 1, 0, 0>; 3166*9880d681SAndroid Build Coastguard Workerdef M2_cmacs_s1 : T_XTYPE_mpy64_acc < "cmpy", "+", 0b100, 0b110, 1, 1, 0>; 3167*9880d681SAndroid Build Coastguard Workerdef M2_cnacs_s1 : T_XTYPE_mpy64_acc < "cmpy", "-", 0b100, 0b111, 1, 1, 0>; 3168*9880d681SAndroid Build Coastguard Worker 3169*9880d681SAndroid Build Coastguard Worker// Rxx[-+]=cmpy(Rs,Rt*)[:<<1]:sat 3170*9880d681SAndroid Build Coastguard Workerdef M2_cmacsc_s0 : T_XTYPE_mpy64_acc < "cmpy", "+", 0b010, 0b110, 1, 0, 1>; 3171*9880d681SAndroid Build Coastguard Workerdef M2_cnacsc_s0 : T_XTYPE_mpy64_acc < "cmpy", "-", 0b010, 0b111, 1, 0, 1>; 3172*9880d681SAndroid Build Coastguard Workerdef M2_cmacsc_s1 : T_XTYPE_mpy64_acc < "cmpy", "+", 0b110, 0b110, 1, 1, 1>; 3173*9880d681SAndroid Build Coastguard Workerdef M2_cnacsc_s1 : T_XTYPE_mpy64_acc < "cmpy", "-", 0b110, 0b111, 1, 1, 1>; 3174*9880d681SAndroid Build Coastguard Worker 3175*9880d681SAndroid Build Coastguard Worker// Vector multiply halfwords 3176*9880d681SAndroid Build Coastguard Worker// Rdd=vmpyh(Rs,Rt)[:<<]:sat 3177*9880d681SAndroid Build Coastguard Worker//let Defs = [USR_OVF] in { 3178*9880d681SAndroid Build Coastguard Worker def M2_vmpy2s_s1 : T_XTYPE_mpy64 < "vmpyh", 0b100, 0b101, 1, 1, 0>; 3179*9880d681SAndroid Build Coastguard Worker def M2_vmpy2s_s0 : T_XTYPE_mpy64 < "vmpyh", 0b000, 0b101, 1, 0, 0>; 3180*9880d681SAndroid Build Coastguard Worker//} 3181*9880d681SAndroid Build Coastguard Worker 3182*9880d681SAndroid Build Coastguard Worker// Rxx+=vmpyh(Rs,Rt)[:<<1][:sat] 3183*9880d681SAndroid Build Coastguard Workerdef M2_vmac2 : T_XTYPE_mpy64_acc < "vmpyh", "+", 0b001, 0b001, 0, 0, 0>; 3184*9880d681SAndroid Build Coastguard Workerdef M2_vmac2s_s1 : T_XTYPE_mpy64_acc < "vmpyh", "+", 0b100, 0b101, 1, 1, 0>; 3185*9880d681SAndroid Build Coastguard Workerdef M2_vmac2s_s0 : T_XTYPE_mpy64_acc < "vmpyh", "+", 0b000, 0b101, 1, 0, 0>; 3186*9880d681SAndroid Build Coastguard Worker 3187*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (mul (i64 (anyext (i32 IntRegs:$src1))), 3188*9880d681SAndroid Build Coastguard Worker (i64 (anyext (i32 IntRegs:$src2))))), 3189*9880d681SAndroid Build Coastguard Worker (M2_dpmpyuu_s0 IntRegs:$src1, IntRegs:$src2)>; 3190*9880d681SAndroid Build Coastguard Worker 3191*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (mul (i64 (sext (i32 IntRegs:$src1))), 3192*9880d681SAndroid Build Coastguard Worker (i64 (sext (i32 IntRegs:$src2))))), 3193*9880d681SAndroid Build Coastguard Worker (M2_dpmpyss_s0 IntRegs:$src1, IntRegs:$src2)>; 3194*9880d681SAndroid Build Coastguard Worker 3195*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (mul (is_sext_i32:$src1), 3196*9880d681SAndroid Build Coastguard Worker (is_sext_i32:$src2))), 3197*9880d681SAndroid Build Coastguard Worker (M2_dpmpyss_s0 (LoReg DoubleRegs:$src1), (LoReg DoubleRegs:$src2))>; 3198*9880d681SAndroid Build Coastguard Worker 3199*9880d681SAndroid Build Coastguard Worker// Multiply and accumulate, use full result. 3200*9880d681SAndroid Build Coastguard Worker// Rxx[+-]=mpy(Rs,Rt) 3201*9880d681SAndroid Build Coastguard Worker 3202*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (add (i64 DoubleRegs:$src1), 3203*9880d681SAndroid Build Coastguard Worker (mul (i64 (sext (i32 IntRegs:$src2))), 3204*9880d681SAndroid Build Coastguard Worker (i64 (sext (i32 IntRegs:$src3)))))), 3205*9880d681SAndroid Build Coastguard Worker (M2_dpmpyss_acc_s0 DoubleRegs:$src1, IntRegs:$src2, IntRegs:$src3)>; 3206*9880d681SAndroid Build Coastguard Worker 3207*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (sub (i64 DoubleRegs:$src1), 3208*9880d681SAndroid Build Coastguard Worker (mul (i64 (sext (i32 IntRegs:$src2))), 3209*9880d681SAndroid Build Coastguard Worker (i64 (sext (i32 IntRegs:$src3)))))), 3210*9880d681SAndroid Build Coastguard Worker (M2_dpmpyss_nac_s0 DoubleRegs:$src1, IntRegs:$src2, IntRegs:$src3)>; 3211*9880d681SAndroid Build Coastguard Worker 3212*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (add (i64 DoubleRegs:$src1), 3213*9880d681SAndroid Build Coastguard Worker (mul (i64 (anyext (i32 IntRegs:$src2))), 3214*9880d681SAndroid Build Coastguard Worker (i64 (anyext (i32 IntRegs:$src3)))))), 3215*9880d681SAndroid Build Coastguard Worker (M2_dpmpyuu_acc_s0 DoubleRegs:$src1, IntRegs:$src2, IntRegs:$src3)>; 3216*9880d681SAndroid Build Coastguard Worker 3217*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (add (i64 DoubleRegs:$src1), 3218*9880d681SAndroid Build Coastguard Worker (mul (i64 (zext (i32 IntRegs:$src2))), 3219*9880d681SAndroid Build Coastguard Worker (i64 (zext (i32 IntRegs:$src3)))))), 3220*9880d681SAndroid Build Coastguard Worker (M2_dpmpyuu_acc_s0 DoubleRegs:$src1, IntRegs:$src2, IntRegs:$src3)>; 3221*9880d681SAndroid Build Coastguard Worker 3222*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (sub (i64 DoubleRegs:$src1), 3223*9880d681SAndroid Build Coastguard Worker (mul (i64 (anyext (i32 IntRegs:$src2))), 3224*9880d681SAndroid Build Coastguard Worker (i64 (anyext (i32 IntRegs:$src3)))))), 3225*9880d681SAndroid Build Coastguard Worker (M2_dpmpyuu_nac_s0 DoubleRegs:$src1, IntRegs:$src2, IntRegs:$src3)>; 3226*9880d681SAndroid Build Coastguard Worker 3227*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (sub (i64 DoubleRegs:$src1), 3228*9880d681SAndroid Build Coastguard Worker (mul (i64 (zext (i32 IntRegs:$src2))), 3229*9880d681SAndroid Build Coastguard Worker (i64 (zext (i32 IntRegs:$src3)))))), 3230*9880d681SAndroid Build Coastguard Worker (M2_dpmpyuu_nac_s0 DoubleRegs:$src1, IntRegs:$src2, IntRegs:$src3)>; 3231*9880d681SAndroid Build Coastguard Worker 3232*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3233*9880d681SAndroid Build Coastguard Worker// MTYPE/MPYH - 3234*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3235*9880d681SAndroid Build Coastguard Worker 3236*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3237*9880d681SAndroid Build Coastguard Worker// MTYPE/MPYS + 3238*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3239*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3240*9880d681SAndroid Build Coastguard Worker// MTYPE/MPYS - 3241*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3242*9880d681SAndroid Build Coastguard Worker 3243*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3244*9880d681SAndroid Build Coastguard Worker// MTYPE/VB + 3245*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3246*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3247*9880d681SAndroid Build Coastguard Worker// MTYPE/VB - 3248*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3249*9880d681SAndroid Build Coastguard Worker 3250*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3251*9880d681SAndroid Build Coastguard Worker// MTYPE/VH + 3252*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3253*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3254*9880d681SAndroid Build Coastguard Worker// MTYPE/VH - 3255*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3256*9880d681SAndroid Build Coastguard Worker 3257*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3258*9880d681SAndroid Build Coastguard Worker// ST + 3259*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3260*9880d681SAndroid Build Coastguard Worker/// 3261*9880d681SAndroid Build Coastguard Worker// Store doubleword. 3262*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3263*9880d681SAndroid Build Coastguard Worker// Template class for non-predicated post increment stores with immediate offset 3264*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3265*9880d681SAndroid Build Coastguard Workerlet isPredicable = 1, hasSideEffects = 0, addrMode = PostInc in 3266*9880d681SAndroid Build Coastguard Workerclass T_store_pi <string mnemonic, RegisterClass RC, Operand ImmOp, 3267*9880d681SAndroid Build Coastguard Worker bits<4> MajOp, bit isHalf > 3268*9880d681SAndroid Build Coastguard Worker : STInst <(outs IntRegs:$_dst_), 3269*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$src1, ImmOp:$offset, RC:$src2), 3270*9880d681SAndroid Build Coastguard Worker mnemonic#"($src1++#$offset) = $src2"#!if(isHalf, ".h", ""), 3271*9880d681SAndroid Build Coastguard Worker [], "$src1 = $_dst_" >, 3272*9880d681SAndroid Build Coastguard Worker AddrModeRel { 3273*9880d681SAndroid Build Coastguard Worker bits<5> src1; 3274*9880d681SAndroid Build Coastguard Worker bits<5> src2; 3275*9880d681SAndroid Build Coastguard Worker bits<7> offset; 3276*9880d681SAndroid Build Coastguard Worker bits<4> offsetBits; 3277*9880d681SAndroid Build Coastguard Worker 3278*9880d681SAndroid Build Coastguard Worker string ImmOpStr = !cast<string>(ImmOp); 3279*9880d681SAndroid Build Coastguard Worker let offsetBits = !if (!eq(ImmOpStr, "s4_3Imm"), offset{6-3}, 3280*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "s4_2Imm"), offset{5-2}, 3281*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "s4_1Imm"), offset{4-1}, 3282*9880d681SAndroid Build Coastguard Worker /* s4_0Imm */ offset{3-0}))); 3283*9880d681SAndroid Build Coastguard Worker // Store upper-half and store doubleword cannot be NV. 3284*9880d681SAndroid Build Coastguard Worker let isNVStorable = !if (!eq(ImmOpStr, "s4_3Imm"), 0, !if(isHalf,0,1)); 3285*9880d681SAndroid Build Coastguard Worker 3286*9880d681SAndroid Build Coastguard Worker let IClass = 0b1010; 3287*9880d681SAndroid Build Coastguard Worker 3288*9880d681SAndroid Build Coastguard Worker let Inst{27-25} = 0b101; 3289*9880d681SAndroid Build Coastguard Worker let Inst{24-21} = MajOp; 3290*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src1; 3291*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 3292*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = src2; 3293*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0b0; 3294*9880d681SAndroid Build Coastguard Worker let Inst{6-3} = offsetBits; 3295*9880d681SAndroid Build Coastguard Worker let Inst{1} = 0b0; 3296*9880d681SAndroid Build Coastguard Worker } 3297*9880d681SAndroid Build Coastguard Worker 3298*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3299*9880d681SAndroid Build Coastguard Worker// Template class for predicated post increment stores with immediate offset 3300*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3301*9880d681SAndroid Build Coastguard Workerlet isPredicated = 1, hasSideEffects = 0, addrMode = PostInc in 3302*9880d681SAndroid Build Coastguard Workerclass T_pstore_pi <string mnemonic, RegisterClass RC, Operand ImmOp, 3303*9880d681SAndroid Build Coastguard Worker bits<4> MajOp, bit isHalf, bit isPredNot, bit isPredNew> 3304*9880d681SAndroid Build Coastguard Worker : STInst <(outs IntRegs:$_dst_), 3305*9880d681SAndroid Build Coastguard Worker (ins PredRegs:$src1, IntRegs:$src2, ImmOp:$offset, RC:$src3), 3306*9880d681SAndroid Build Coastguard Worker !if(isPredNot, "if (!$src1", "if ($src1")#!if(isPredNew, ".new) ", 3307*9880d681SAndroid Build Coastguard Worker ") ")#mnemonic#"($src2++#$offset) = $src3"#!if(isHalf, ".h", ""), 3308*9880d681SAndroid Build Coastguard Worker [], "$src2 = $_dst_" >, 3309*9880d681SAndroid Build Coastguard Worker AddrModeRel { 3310*9880d681SAndroid Build Coastguard Worker bits<2> src1; 3311*9880d681SAndroid Build Coastguard Worker bits<5> src2; 3312*9880d681SAndroid Build Coastguard Worker bits<7> offset; 3313*9880d681SAndroid Build Coastguard Worker bits<5> src3; 3314*9880d681SAndroid Build Coastguard Worker bits<4> offsetBits; 3315*9880d681SAndroid Build Coastguard Worker 3316*9880d681SAndroid Build Coastguard Worker string ImmOpStr = !cast<string>(ImmOp); 3317*9880d681SAndroid Build Coastguard Worker let offsetBits = !if (!eq(ImmOpStr, "s4_3Imm"), offset{6-3}, 3318*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "s4_2Imm"), offset{5-2}, 3319*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "s4_1Imm"), offset{4-1}, 3320*9880d681SAndroid Build Coastguard Worker /* s4_0Imm */ offset{3-0}))); 3321*9880d681SAndroid Build Coastguard Worker 3322*9880d681SAndroid Build Coastguard Worker // Store upper-half and store doubleword cannot be NV. 3323*9880d681SAndroid Build Coastguard Worker let isNVStorable = !if (!eq(ImmOpStr, "s4_3Imm"), 0, !if(isHalf,0,1)); 3324*9880d681SAndroid Build Coastguard Worker let isPredicatedNew = isPredNew; 3325*9880d681SAndroid Build Coastguard Worker let isPredicatedFalse = isPredNot; 3326*9880d681SAndroid Build Coastguard Worker 3327*9880d681SAndroid Build Coastguard Worker let IClass = 0b1010; 3328*9880d681SAndroid Build Coastguard Worker 3329*9880d681SAndroid Build Coastguard Worker let Inst{27-25} = 0b101; 3330*9880d681SAndroid Build Coastguard Worker let Inst{24-21} = MajOp; 3331*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src2; 3332*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b1; 3333*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = src3; 3334*9880d681SAndroid Build Coastguard Worker let Inst{7} = isPredNew; 3335*9880d681SAndroid Build Coastguard Worker let Inst{6-3} = offsetBits; 3336*9880d681SAndroid Build Coastguard Worker let Inst{2} = isPredNot; 3337*9880d681SAndroid Build Coastguard Worker let Inst{1-0} = src1; 3338*9880d681SAndroid Build Coastguard Worker } 3339*9880d681SAndroid Build Coastguard Worker 3340*9880d681SAndroid Build Coastguard Workermulticlass ST_PostInc<string mnemonic, string BaseOp, RegisterClass RC, 3341*9880d681SAndroid Build Coastguard Worker Operand ImmOp, bits<4> MajOp, bit isHalf = 0 > { 3342*9880d681SAndroid Build Coastguard Worker 3343*9880d681SAndroid Build Coastguard Worker let BaseOpcode = "POST_"#BaseOp in { 3344*9880d681SAndroid Build Coastguard Worker def S2_#NAME#_pi : T_store_pi <mnemonic, RC, ImmOp, MajOp, isHalf>; 3345*9880d681SAndroid Build Coastguard Worker 3346*9880d681SAndroid Build Coastguard Worker // Predicated 3347*9880d681SAndroid Build Coastguard Worker def S2_p#NAME#t_pi : T_pstore_pi <mnemonic, RC, ImmOp, MajOp, isHalf, 0, 0>; 3348*9880d681SAndroid Build Coastguard Worker def S2_p#NAME#f_pi : T_pstore_pi <mnemonic, RC, ImmOp, MajOp, isHalf, 1, 0>; 3349*9880d681SAndroid Build Coastguard Worker 3350*9880d681SAndroid Build Coastguard Worker // Predicated new 3351*9880d681SAndroid Build Coastguard Worker def S2_p#NAME#tnew_pi : T_pstore_pi <mnemonic, RC, ImmOp, MajOp, 3352*9880d681SAndroid Build Coastguard Worker isHalf, 0, 1>; 3353*9880d681SAndroid Build Coastguard Worker def S2_p#NAME#fnew_pi : T_pstore_pi <mnemonic, RC, ImmOp, MajOp, 3354*9880d681SAndroid Build Coastguard Worker isHalf, 1, 1>; 3355*9880d681SAndroid Build Coastguard Worker } 3356*9880d681SAndroid Build Coastguard Worker} 3357*9880d681SAndroid Build Coastguard Worker 3358*9880d681SAndroid Build Coastguard Workerlet accessSize = ByteAccess in 3359*9880d681SAndroid Build Coastguard Workerdefm storerb: ST_PostInc <"memb", "STrib", IntRegs, s4_0Imm, 0b1000>; 3360*9880d681SAndroid Build Coastguard Worker 3361*9880d681SAndroid Build Coastguard Workerlet accessSize = HalfWordAccess in 3362*9880d681SAndroid Build Coastguard Workerdefm storerh: ST_PostInc <"memh", "STrih", IntRegs, s4_1Imm, 0b1010>; 3363*9880d681SAndroid Build Coastguard Worker 3364*9880d681SAndroid Build Coastguard Workerlet accessSize = WordAccess in 3365*9880d681SAndroid Build Coastguard Workerdefm storeri: ST_PostInc <"memw", "STriw", IntRegs, s4_2Imm, 0b1100>; 3366*9880d681SAndroid Build Coastguard Worker 3367*9880d681SAndroid Build Coastguard Workerlet accessSize = DoubleWordAccess in 3368*9880d681SAndroid Build Coastguard Workerdefm storerd: ST_PostInc <"memd", "STrid", DoubleRegs, s4_3Imm, 0b1110>; 3369*9880d681SAndroid Build Coastguard Worker 3370*9880d681SAndroid Build Coastguard Workerlet accessSize = HalfWordAccess, isNVStorable = 0 in 3371*9880d681SAndroid Build Coastguard Workerdefm storerf: ST_PostInc <"memh", "STrih_H", IntRegs, s4_1Imm, 0b1011, 1>; 3372*9880d681SAndroid Build Coastguard Worker 3373*9880d681SAndroid Build Coastguard Workerclass Storepi_pat<PatFrag Store, PatFrag Value, PatFrag Offset, 3374*9880d681SAndroid Build Coastguard Worker InstHexagon MI> 3375*9880d681SAndroid Build Coastguard Worker : Pat<(Store Value:$src1, I32:$src2, Offset:$offset), 3376*9880d681SAndroid Build Coastguard Worker (MI I32:$src2, imm:$offset, Value:$src1)>; 3377*9880d681SAndroid Build Coastguard Worker 3378*9880d681SAndroid Build Coastguard Workerdef: Storepi_pat<post_truncsti8, I32, s4_0ImmPred, S2_storerb_pi>; 3379*9880d681SAndroid Build Coastguard Workerdef: Storepi_pat<post_truncsti16, I32, s4_1ImmPred, S2_storerh_pi>; 3380*9880d681SAndroid Build Coastguard Workerdef: Storepi_pat<post_store, I32, s4_2ImmPred, S2_storeri_pi>; 3381*9880d681SAndroid Build Coastguard Workerdef: Storepi_pat<post_store, I64, s4_3ImmPred, S2_storerd_pi>; 3382*9880d681SAndroid Build Coastguard Worker 3383*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3384*9880d681SAndroid Build Coastguard Worker// Template class for post increment stores with register offset. 3385*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3386*9880d681SAndroid Build Coastguard Workerclass T_store_pr <string mnemonic, RegisterClass RC, bits<3> MajOp, 3387*9880d681SAndroid Build Coastguard Worker MemAccessSize AccessSz, bit isHalf = 0> 3388*9880d681SAndroid Build Coastguard Worker : STInst <(outs IntRegs:$_dst_), 3389*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$src1, ModRegs:$src2, RC:$src3), 3390*9880d681SAndroid Build Coastguard Worker mnemonic#"($src1++$src2) = $src3"#!if(isHalf, ".h", ""), 3391*9880d681SAndroid Build Coastguard Worker [], "$src1 = $_dst_" > { 3392*9880d681SAndroid Build Coastguard Worker bits<5> src1; 3393*9880d681SAndroid Build Coastguard Worker bits<1> src2; 3394*9880d681SAndroid Build Coastguard Worker bits<5> src3; 3395*9880d681SAndroid Build Coastguard Worker let accessSize = AccessSz; 3396*9880d681SAndroid Build Coastguard Worker 3397*9880d681SAndroid Build Coastguard Worker // Store upper-half and store doubleword cannot be NV. 3398*9880d681SAndroid Build Coastguard Worker let isNVStorable = !if(!eq(mnemonic,"memd"), 0, !if(isHalf,0,1)); 3399*9880d681SAndroid Build Coastguard Worker 3400*9880d681SAndroid Build Coastguard Worker let IClass = 0b1010; 3401*9880d681SAndroid Build Coastguard Worker 3402*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1101; 3403*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MajOp; 3404*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src1; 3405*9880d681SAndroid Build Coastguard Worker let Inst{13} = src2; 3406*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = src3; 3407*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0b0; 3408*9880d681SAndroid Build Coastguard Worker } 3409*9880d681SAndroid Build Coastguard Worker 3410*9880d681SAndroid Build Coastguard Workerdef S2_storerb_pr : T_store_pr<"memb", IntRegs, 0b000, ByteAccess>; 3411*9880d681SAndroid Build Coastguard Workerdef S2_storerh_pr : T_store_pr<"memh", IntRegs, 0b010, HalfWordAccess>; 3412*9880d681SAndroid Build Coastguard Workerdef S2_storeri_pr : T_store_pr<"memw", IntRegs, 0b100, WordAccess>; 3413*9880d681SAndroid Build Coastguard Workerdef S2_storerd_pr : T_store_pr<"memd", DoubleRegs, 0b110, DoubleWordAccess>; 3414*9880d681SAndroid Build Coastguard Workerdef S2_storerf_pr : T_store_pr<"memh", IntRegs, 0b011, HalfWordAccess, 1>; 3415*9880d681SAndroid Build Coastguard Worker 3416*9880d681SAndroid Build Coastguard Workerlet opExtendable = 1, isExtentSigned = 1, isPredicable = 1 in 3417*9880d681SAndroid Build Coastguard Workerclass T_store_io <string mnemonic, RegisterClass RC, Operand ImmOp, 3418*9880d681SAndroid Build Coastguard Worker bits<3> MajOp, bit isH = 0> 3419*9880d681SAndroid Build Coastguard Worker : STInst <(outs), 3420*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$src1, ImmOp:$src2, RC:$src3), 3421*9880d681SAndroid Build Coastguard Worker mnemonic#"($src1+#$src2) = $src3"#!if(isH,".h","")>, 3422*9880d681SAndroid Build Coastguard Worker AddrModeRel, ImmRegRel { 3423*9880d681SAndroid Build Coastguard Worker bits<5> src1; 3424*9880d681SAndroid Build Coastguard Worker bits<14> src2; // Actual address offset 3425*9880d681SAndroid Build Coastguard Worker bits<5> src3; 3426*9880d681SAndroid Build Coastguard Worker bits<11> offsetBits; // Represents offset encoding 3427*9880d681SAndroid Build Coastguard Worker 3428*9880d681SAndroid Build Coastguard Worker string ImmOpStr = !cast<string>(ImmOp); 3429*9880d681SAndroid Build Coastguard Worker 3430*9880d681SAndroid Build Coastguard Worker let opExtentBits = !if (!eq(ImmOpStr, "s11_3Ext"), 14, 3431*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "s11_2Ext"), 13, 3432*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "s11_1Ext"), 12, 3433*9880d681SAndroid Build Coastguard Worker /* s11_0Ext */ 11))); 3434*9880d681SAndroid Build Coastguard Worker let offsetBits = !if (!eq(ImmOpStr, "s11_3Ext"), src2{13-3}, 3435*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "s11_2Ext"), src2{12-2}, 3436*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "s11_1Ext"), src2{11-1}, 3437*9880d681SAndroid Build Coastguard Worker /* s11_0Ext */ src2{10-0}))); 3438*9880d681SAndroid Build Coastguard Worker // Store upper-half and store doubleword cannot be NV. 3439*9880d681SAndroid Build Coastguard Worker let isNVStorable = !if (!eq(mnemonic, "memd"), 0, !if(isH,0,1)); 3440*9880d681SAndroid Build Coastguard Worker let IClass = 0b1010; 3441*9880d681SAndroid Build Coastguard Worker 3442*9880d681SAndroid Build Coastguard Worker let Inst{27} = 0b0; 3443*9880d681SAndroid Build Coastguard Worker let Inst{26-25} = offsetBits{10-9}; 3444*9880d681SAndroid Build Coastguard Worker let Inst{24} = 0b1; 3445*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MajOp; 3446*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src1; 3447*9880d681SAndroid Build Coastguard Worker let Inst{13} = offsetBits{8}; 3448*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = src3; 3449*9880d681SAndroid Build Coastguard Worker let Inst{7-0} = offsetBits{7-0}; 3450*9880d681SAndroid Build Coastguard Worker } 3451*9880d681SAndroid Build Coastguard Worker 3452*9880d681SAndroid Build Coastguard Workerlet opExtendable = 2, isPredicated = 1 in 3453*9880d681SAndroid Build Coastguard Workerclass T_pstore_io <string mnemonic, RegisterClass RC, Operand ImmOp, 3454*9880d681SAndroid Build Coastguard Worker bits<3>MajOp, bit PredNot, bit isPredNew, bit isH = 0> 3455*9880d681SAndroid Build Coastguard Worker : STInst <(outs), 3456*9880d681SAndroid Build Coastguard Worker (ins PredRegs:$src1, IntRegs:$src2, ImmOp:$src3, RC:$src4), 3457*9880d681SAndroid Build Coastguard Worker !if(PredNot, "if (!$src1", "if ($src1")#!if(isPredNew, ".new) ", 3458*9880d681SAndroid Build Coastguard Worker ") ")#mnemonic#"($src2+#$src3) = $src4"#!if(isH,".h",""), 3459*9880d681SAndroid Build Coastguard Worker [],"",V2LDST_tc_st_SLOT01 >, 3460*9880d681SAndroid Build Coastguard Worker AddrModeRel, ImmRegRel { 3461*9880d681SAndroid Build Coastguard Worker bits<2> src1; 3462*9880d681SAndroid Build Coastguard Worker bits<5> src2; 3463*9880d681SAndroid Build Coastguard Worker bits<9> src3; // Actual address offset 3464*9880d681SAndroid Build Coastguard Worker bits<5> src4; 3465*9880d681SAndroid Build Coastguard Worker bits<6> offsetBits; // Represents offset encoding 3466*9880d681SAndroid Build Coastguard Worker 3467*9880d681SAndroid Build Coastguard Worker let isPredicatedNew = isPredNew; 3468*9880d681SAndroid Build Coastguard Worker let isPredicatedFalse = PredNot; 3469*9880d681SAndroid Build Coastguard Worker 3470*9880d681SAndroid Build Coastguard Worker string ImmOpStr = !cast<string>(ImmOp); 3471*9880d681SAndroid Build Coastguard Worker let opExtentBits = !if (!eq(ImmOpStr, "u6_3Ext"), 9, 3472*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "u6_2Ext"), 8, 3473*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "u6_1Ext"), 7, 3474*9880d681SAndroid Build Coastguard Worker /* u6_0Ext */ 6))); 3475*9880d681SAndroid Build Coastguard Worker let offsetBits = !if (!eq(ImmOpStr, "u6_3Ext"), src3{8-3}, 3476*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "u6_2Ext"), src3{7-2}, 3477*9880d681SAndroid Build Coastguard Worker !if (!eq(ImmOpStr, "u6_1Ext"), src3{6-1}, 3478*9880d681SAndroid Build Coastguard Worker /* u6_0Ext */ src3{5-0}))); 3479*9880d681SAndroid Build Coastguard Worker // Store upper-half and store doubleword cannot be NV. 3480*9880d681SAndroid Build Coastguard Worker let isNVStorable = !if (!eq(mnemonic, "memd"), 0, !if(isH,0,1)); 3481*9880d681SAndroid Build Coastguard Worker 3482*9880d681SAndroid Build Coastguard Worker let IClass = 0b0100; 3483*9880d681SAndroid Build Coastguard Worker 3484*9880d681SAndroid Build Coastguard Worker let Inst{27} = 0b0; 3485*9880d681SAndroid Build Coastguard Worker let Inst{26} = PredNot; 3486*9880d681SAndroid Build Coastguard Worker let Inst{25} = isPredNew; 3487*9880d681SAndroid Build Coastguard Worker let Inst{24} = 0b0; 3488*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MajOp; 3489*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src2; 3490*9880d681SAndroid Build Coastguard Worker let Inst{13} = offsetBits{5}; 3491*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = src4; 3492*9880d681SAndroid Build Coastguard Worker let Inst{7-3} = offsetBits{4-0}; 3493*9880d681SAndroid Build Coastguard Worker let Inst{1-0} = src1; 3494*9880d681SAndroid Build Coastguard Worker } 3495*9880d681SAndroid Build Coastguard Worker 3496*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, hasSideEffects = 0 in 3497*9880d681SAndroid Build Coastguard Workermulticlass ST_Idxd<string mnemonic, string CextOp, RegisterClass RC, 3498*9880d681SAndroid Build Coastguard Worker Operand ImmOp, Operand predImmOp, bits<3> MajOp, bit isH = 0> { 3499*9880d681SAndroid Build Coastguard Worker let CextOpcode = CextOp, BaseOpcode = CextOp#_indexed in { 3500*9880d681SAndroid Build Coastguard Worker def S2_#NAME#_io : T_store_io <mnemonic, RC, ImmOp, MajOp, isH>; 3501*9880d681SAndroid Build Coastguard Worker 3502*9880d681SAndroid Build Coastguard Worker // Predicated 3503*9880d681SAndroid Build Coastguard Worker def S2_p#NAME#t_io : T_pstore_io<mnemonic, RC, predImmOp, MajOp, 0, 0, isH>; 3504*9880d681SAndroid Build Coastguard Worker def S2_p#NAME#f_io : T_pstore_io<mnemonic, RC, predImmOp, MajOp, 1, 0, isH>; 3505*9880d681SAndroid Build Coastguard Worker 3506*9880d681SAndroid Build Coastguard Worker // Predicated new 3507*9880d681SAndroid Build Coastguard Worker def S4_p#NAME#tnew_io : T_pstore_io <mnemonic, RC, predImmOp, 3508*9880d681SAndroid Build Coastguard Worker MajOp, 0, 1, isH>; 3509*9880d681SAndroid Build Coastguard Worker def S4_p#NAME#fnew_io : T_pstore_io <mnemonic, RC, predImmOp, 3510*9880d681SAndroid Build Coastguard Worker MajOp, 1, 1, isH>; 3511*9880d681SAndroid Build Coastguard Worker } 3512*9880d681SAndroid Build Coastguard Worker} 3513*9880d681SAndroid Build Coastguard Worker 3514*9880d681SAndroid Build Coastguard Workerlet addrMode = BaseImmOffset, InputType = "imm" in { 3515*9880d681SAndroid Build Coastguard Worker let accessSize = ByteAccess in 3516*9880d681SAndroid Build Coastguard Worker defm storerb: ST_Idxd < "memb", "STrib", IntRegs, s11_0Ext, u6_0Ext, 0b000>; 3517*9880d681SAndroid Build Coastguard Worker 3518*9880d681SAndroid Build Coastguard Worker let accessSize = HalfWordAccess, opExtentAlign = 1 in 3519*9880d681SAndroid Build Coastguard Worker defm storerh: ST_Idxd < "memh", "STrih", IntRegs, s11_1Ext, u6_1Ext, 0b010>; 3520*9880d681SAndroid Build Coastguard Worker 3521*9880d681SAndroid Build Coastguard Worker let accessSize = WordAccess, opExtentAlign = 2 in 3522*9880d681SAndroid Build Coastguard Worker defm storeri: ST_Idxd < "memw", "STriw", IntRegs, s11_2Ext, u6_2Ext, 0b100>; 3523*9880d681SAndroid Build Coastguard Worker 3524*9880d681SAndroid Build Coastguard Worker let accessSize = DoubleWordAccess, isNVStorable = 0, opExtentAlign = 3 in 3525*9880d681SAndroid Build Coastguard Worker defm storerd: ST_Idxd < "memd", "STrid", DoubleRegs, s11_3Ext, 3526*9880d681SAndroid Build Coastguard Worker u6_3Ext, 0b110>; 3527*9880d681SAndroid Build Coastguard Worker 3528*9880d681SAndroid Build Coastguard Worker let accessSize = HalfWordAccess, opExtentAlign = 1 in 3529*9880d681SAndroid Build Coastguard Worker defm storerf: ST_Idxd < "memh", "STrif", IntRegs, s11_1Ext, 3530*9880d681SAndroid Build Coastguard Worker u6_1Ext, 0b011, 1>; 3531*9880d681SAndroid Build Coastguard Worker} 3532*9880d681SAndroid Build Coastguard Worker 3533*9880d681SAndroid Build Coastguard Worker// Patterns for generating stores, where the address takes different forms: 3534*9880d681SAndroid Build Coastguard Worker// - frameindex, 3535*9880d681SAndroid Build Coastguard Worker// - frameindex + offset, 3536*9880d681SAndroid Build Coastguard Worker// - base + offset, 3537*9880d681SAndroid Build Coastguard Worker// - simple (base address without offset). 3538*9880d681SAndroid Build Coastguard Worker// These would usually be used together (via Storex_pat defined below), but 3539*9880d681SAndroid Build Coastguard Worker// in some cases one may want to apply different properties (such as 3540*9880d681SAndroid Build Coastguard Worker// AddedComplexity) to the individual patterns. 3541*9880d681SAndroid Build Coastguard Workerclass Storex_fi_pat<PatFrag Store, PatFrag Value, InstHexagon MI> 3542*9880d681SAndroid Build Coastguard Worker : Pat<(Store Value:$Rs, AddrFI:$fi), (MI AddrFI:$fi, 0, Value:$Rs)>; 3543*9880d681SAndroid Build Coastguard Workerclass Storex_fi_add_pat<PatFrag Store, PatFrag Value, PatFrag ImmPred, 3544*9880d681SAndroid Build Coastguard Worker InstHexagon MI> 3545*9880d681SAndroid Build Coastguard Worker : Pat<(Store Value:$Rs, (add (i32 AddrFI:$fi), ImmPred:$Off)), 3546*9880d681SAndroid Build Coastguard Worker (MI AddrFI:$fi, imm:$Off, Value:$Rs)>; 3547*9880d681SAndroid Build Coastguard Workerclass Storex_add_pat<PatFrag Store, PatFrag Value, PatFrag ImmPred, 3548*9880d681SAndroid Build Coastguard Worker InstHexagon MI> 3549*9880d681SAndroid Build Coastguard Worker : Pat<(Store Value:$Rt, (add (i32 IntRegs:$Rs), ImmPred:$Off)), 3550*9880d681SAndroid Build Coastguard Worker (MI IntRegs:$Rs, imm:$Off, Value:$Rt)>; 3551*9880d681SAndroid Build Coastguard Workerclass Storex_simple_pat<PatFrag Store, PatFrag Value, InstHexagon MI> 3552*9880d681SAndroid Build Coastguard Worker : Pat<(Store Value:$Rt, (i32 IntRegs:$Rs)), 3553*9880d681SAndroid Build Coastguard Worker (MI IntRegs:$Rs, 0, Value:$Rt)>; 3554*9880d681SAndroid Build Coastguard Worker 3555*9880d681SAndroid Build Coastguard Worker// Patterns for generating stores, where the address takes different forms, 3556*9880d681SAndroid Build Coastguard Worker// and where the value being stored is transformed through the value modifier 3557*9880d681SAndroid Build Coastguard Worker// ValueMod. The address forms are same as above. 3558*9880d681SAndroid Build Coastguard Workerclass Storexm_fi_pat<PatFrag Store, PatFrag Value, PatFrag ValueMod, 3559*9880d681SAndroid Build Coastguard Worker InstHexagon MI> 3560*9880d681SAndroid Build Coastguard Worker : Pat<(Store Value:$Rs, AddrFI:$fi), 3561*9880d681SAndroid Build Coastguard Worker (MI AddrFI:$fi, 0, (ValueMod Value:$Rs))>; 3562*9880d681SAndroid Build Coastguard Workerclass Storexm_fi_add_pat<PatFrag Store, PatFrag Value, PatFrag ImmPred, 3563*9880d681SAndroid Build Coastguard Worker PatFrag ValueMod, InstHexagon MI> 3564*9880d681SAndroid Build Coastguard Worker : Pat<(Store Value:$Rs, (add (i32 AddrFI:$fi), ImmPred:$Off)), 3565*9880d681SAndroid Build Coastguard Worker (MI AddrFI:$fi, imm:$Off, (ValueMod Value:$Rs))>; 3566*9880d681SAndroid Build Coastguard Workerclass Storexm_add_pat<PatFrag Store, PatFrag Value, PatFrag ImmPred, 3567*9880d681SAndroid Build Coastguard Worker PatFrag ValueMod, InstHexagon MI> 3568*9880d681SAndroid Build Coastguard Worker : Pat<(Store Value:$Rt, (add (i32 IntRegs:$Rs), ImmPred:$Off)), 3569*9880d681SAndroid Build Coastguard Worker (MI IntRegs:$Rs, imm:$Off, (ValueMod Value:$Rt))>; 3570*9880d681SAndroid Build Coastguard Workerclass Storexm_simple_pat<PatFrag Store, PatFrag Value, PatFrag ValueMod, 3571*9880d681SAndroid Build Coastguard Worker InstHexagon MI> 3572*9880d681SAndroid Build Coastguard Worker : Pat<(Store Value:$Rt, (i32 IntRegs:$Rs)), 3573*9880d681SAndroid Build Coastguard Worker (MI IntRegs:$Rs, 0, (ValueMod Value:$Rt))>; 3574*9880d681SAndroid Build Coastguard Worker 3575*9880d681SAndroid Build Coastguard Workermulticlass Storex_pat<PatFrag Store, PatFrag Value, PatLeaf ImmPred, 3576*9880d681SAndroid Build Coastguard Worker InstHexagon MI> { 3577*9880d681SAndroid Build Coastguard Worker def: Storex_fi_pat <Store, Value, MI>; 3578*9880d681SAndroid Build Coastguard Worker def: Storex_fi_add_pat <Store, Value, ImmPred, MI>; 3579*9880d681SAndroid Build Coastguard Worker def: Storex_add_pat <Store, Value, ImmPred, MI>; 3580*9880d681SAndroid Build Coastguard Worker} 3581*9880d681SAndroid Build Coastguard Worker 3582*9880d681SAndroid Build Coastguard Workermulticlass Storexm_pat<PatFrag Store, PatFrag Value, PatLeaf ImmPred, 3583*9880d681SAndroid Build Coastguard Worker PatFrag ValueMod, InstHexagon MI> { 3584*9880d681SAndroid Build Coastguard Worker def: Storexm_fi_pat <Store, Value, ValueMod, MI>; 3585*9880d681SAndroid Build Coastguard Worker def: Storexm_fi_add_pat <Store, Value, ImmPred, ValueMod, MI>; 3586*9880d681SAndroid Build Coastguard Worker def: Storexm_add_pat <Store, Value, ImmPred, ValueMod, MI>; 3587*9880d681SAndroid Build Coastguard Worker} 3588*9880d681SAndroid Build Coastguard Worker 3589*9880d681SAndroid Build Coastguard Worker// Regular stores in the DAG have two operands: value and address. 3590*9880d681SAndroid Build Coastguard Worker// Atomic stores also have two, but they are reversed: address, value. 3591*9880d681SAndroid Build Coastguard Worker// To use atomic stores with the patterns, they need to have their operands 3592*9880d681SAndroid Build Coastguard Worker// swapped. This relies on the knowledge that the F.Fragment uses names 3593*9880d681SAndroid Build Coastguard Worker// "ptr" and "val". 3594*9880d681SAndroid Build Coastguard Workerclass SwapSt<PatFrag F> 3595*9880d681SAndroid Build Coastguard Worker : PatFrag<(ops node:$val, node:$ptr), F.Fragment>; 3596*9880d681SAndroid Build Coastguard Worker 3597*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 20 in { 3598*9880d681SAndroid Build Coastguard Worker defm: Storex_pat<truncstorei8, I32, s32_0ImmPred, S2_storerb_io>; 3599*9880d681SAndroid Build Coastguard Worker defm: Storex_pat<truncstorei16, I32, s31_1ImmPred, S2_storerh_io>; 3600*9880d681SAndroid Build Coastguard Worker defm: Storex_pat<store, I32, s30_2ImmPred, S2_storeri_io>; 3601*9880d681SAndroid Build Coastguard Worker defm: Storex_pat<store, I64, s29_3ImmPred, S2_storerd_io>; 3602*9880d681SAndroid Build Coastguard Worker 3603*9880d681SAndroid Build Coastguard Worker defm: Storex_pat<SwapSt<atomic_store_8>, I32, s32_0ImmPred, S2_storerb_io>; 3604*9880d681SAndroid Build Coastguard Worker defm: Storex_pat<SwapSt<atomic_store_16>, I32, s31_1ImmPred, S2_storerh_io>; 3605*9880d681SAndroid Build Coastguard Worker defm: Storex_pat<SwapSt<atomic_store_32>, I32, s30_2ImmPred, S2_storeri_io>; 3606*9880d681SAndroid Build Coastguard Worker defm: Storex_pat<SwapSt<atomic_store_64>, I64, s29_3ImmPred, S2_storerd_io>; 3607*9880d681SAndroid Build Coastguard Worker} 3608*9880d681SAndroid Build Coastguard Worker 3609*9880d681SAndroid Build Coastguard Worker// Simple patterns should be tried with the least priority. 3610*9880d681SAndroid Build Coastguard Workerdef: Storex_simple_pat<truncstorei8, I32, S2_storerb_io>; 3611*9880d681SAndroid Build Coastguard Workerdef: Storex_simple_pat<truncstorei16, I32, S2_storerh_io>; 3612*9880d681SAndroid Build Coastguard Workerdef: Storex_simple_pat<store, I32, S2_storeri_io>; 3613*9880d681SAndroid Build Coastguard Workerdef: Storex_simple_pat<store, I64, S2_storerd_io>; 3614*9880d681SAndroid Build Coastguard Worker 3615*9880d681SAndroid Build Coastguard Workerdef: Storex_simple_pat<SwapSt<atomic_store_8>, I32, S2_storerb_io>; 3616*9880d681SAndroid Build Coastguard Workerdef: Storex_simple_pat<SwapSt<atomic_store_16>, I32, S2_storerh_io>; 3617*9880d681SAndroid Build Coastguard Workerdef: Storex_simple_pat<SwapSt<atomic_store_32>, I32, S2_storeri_io>; 3618*9880d681SAndroid Build Coastguard Workerdef: Storex_simple_pat<SwapSt<atomic_store_64>, I64, S2_storerd_io>; 3619*9880d681SAndroid Build Coastguard Worker 3620*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 20 in { 3621*9880d681SAndroid Build Coastguard Worker defm: Storexm_pat<truncstorei8, I64, s32_0ImmPred, LoReg, S2_storerb_io>; 3622*9880d681SAndroid Build Coastguard Worker defm: Storexm_pat<truncstorei16, I64, s31_1ImmPred, LoReg, S2_storerh_io>; 3623*9880d681SAndroid Build Coastguard Worker defm: Storexm_pat<truncstorei32, I64, s30_2ImmPred, LoReg, S2_storeri_io>; 3624*9880d681SAndroid Build Coastguard Worker} 3625*9880d681SAndroid Build Coastguard Worker 3626*9880d681SAndroid Build Coastguard Workerdef: Storexm_simple_pat<truncstorei8, I64, LoReg, S2_storerb_io>; 3627*9880d681SAndroid Build Coastguard Workerdef: Storexm_simple_pat<truncstorei16, I64, LoReg, S2_storerh_io>; 3628*9880d681SAndroid Build Coastguard Workerdef: Storexm_simple_pat<truncstorei32, I64, LoReg, S2_storeri_io>; 3629*9880d681SAndroid Build Coastguard Worker 3630*9880d681SAndroid Build Coastguard Worker// Store predicate. 3631*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, opExtendable = 1, isExtentSigned = 1, opExtentBits = 13, 3632*9880d681SAndroid Build Coastguard Worker isCodeGenOnly = 1, isPseudo = 1, hasSideEffects = 0 in 3633*9880d681SAndroid Build Coastguard Workerdef STriw_pred : STInst<(outs), 3634*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$addr, s11_2Ext:$off, PredRegs:$src1), 3635*9880d681SAndroid Build Coastguard Worker ".error \"should not emit\"", []>; 3636*9880d681SAndroid Build Coastguard Worker// Store modifier. 3637*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, opExtendable = 1, isExtentSigned = 1, opExtentBits = 13, 3638*9880d681SAndroid Build Coastguard Worker isCodeGenOnly = 1, isPseudo = 1, hasSideEffects = 0 in 3639*9880d681SAndroid Build Coastguard Workerdef STriw_mod : STInst<(outs), 3640*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$addr, s11_2Ext:$off, ModRegs:$src1), 3641*9880d681SAndroid Build Coastguard Worker ".error \"should not emit\"", []>; 3642*9880d681SAndroid Build Coastguard Worker 3643*9880d681SAndroid Build Coastguard Worker// S2_allocframe: Allocate stack frame. 3644*9880d681SAndroid Build Coastguard Workerlet Defs = [R29, R30], Uses = [R29, R31, R30], 3645*9880d681SAndroid Build Coastguard Worker hasSideEffects = 0, accessSize = DoubleWordAccess in 3646*9880d681SAndroid Build Coastguard Workerdef S2_allocframe: ST0Inst < 3647*9880d681SAndroid Build Coastguard Worker (outs), (ins u11_3Imm:$u11_3), 3648*9880d681SAndroid Build Coastguard Worker "allocframe(#$u11_3)" > { 3649*9880d681SAndroid Build Coastguard Worker bits<14> u11_3; 3650*9880d681SAndroid Build Coastguard Worker 3651*9880d681SAndroid Build Coastguard Worker let IClass = 0b1010; 3652*9880d681SAndroid Build Coastguard Worker let Inst{27-16} = 0b000010011101; 3653*9880d681SAndroid Build Coastguard Worker let Inst{13-11} = 0b000; 3654*9880d681SAndroid Build Coastguard Worker let Inst{10-0} = u11_3{13-3}; 3655*9880d681SAndroid Build Coastguard Worker } 3656*9880d681SAndroid Build Coastguard Worker 3657*9880d681SAndroid Build Coastguard Worker// S2_storer[bhwdf]_pci: Store byte/half/word/double. 3658*9880d681SAndroid Build Coastguard Worker// S2_storer[bhwdf]_pci -> S2_storerbnew_pci 3659*9880d681SAndroid Build Coastguard Workerlet Uses = [CS] in 3660*9880d681SAndroid Build Coastguard Workerclass T_store_pci <string mnemonic, RegisterClass RC, 3661*9880d681SAndroid Build Coastguard Worker Operand Imm, bits<4>MajOp, 3662*9880d681SAndroid Build Coastguard Worker MemAccessSize AlignSize, string RegSrc = "Rt"> 3663*9880d681SAndroid Build Coastguard Worker : STInst <(outs IntRegs:$_dst_), 3664*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$Rz, Imm:$offset, ModRegs:$Mu, RC:$Rt), 3665*9880d681SAndroid Build Coastguard Worker #mnemonic#"($Rz ++ #$offset:circ($Mu)) = $"#RegSrc#"", 3666*9880d681SAndroid Build Coastguard Worker [] , 3667*9880d681SAndroid Build Coastguard Worker "$Rz = $_dst_" > { 3668*9880d681SAndroid Build Coastguard Worker bits<5> Rz; 3669*9880d681SAndroid Build Coastguard Worker bits<7> offset; 3670*9880d681SAndroid Build Coastguard Worker bits<1> Mu; 3671*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 3672*9880d681SAndroid Build Coastguard Worker let accessSize = AlignSize; 3673*9880d681SAndroid Build Coastguard Worker let isNVStorable = !if(!eq(mnemonic,"memd"), 0, 3674*9880d681SAndroid Build Coastguard Worker !if(!eq(RegSrc,"Rt.h"), 0, 1)); 3675*9880d681SAndroid Build Coastguard Worker 3676*9880d681SAndroid Build Coastguard Worker let IClass = 0b1010; 3677*9880d681SAndroid Build Coastguard Worker let Inst{27-25} = 0b100; 3678*9880d681SAndroid Build Coastguard Worker let Inst{24-21} = MajOp; 3679*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rz; 3680*9880d681SAndroid Build Coastguard Worker let Inst{13} = Mu; 3681*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 3682*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0b0; 3683*9880d681SAndroid Build Coastguard Worker let Inst{6-3} = 3684*9880d681SAndroid Build Coastguard Worker !if (!eq(!cast<string>(AlignSize), "DoubleWordAccess"), offset{6-3}, 3685*9880d681SAndroid Build Coastguard Worker !if (!eq(!cast<string>(AlignSize), "WordAccess"), offset{5-2}, 3686*9880d681SAndroid Build Coastguard Worker !if (!eq(!cast<string>(AlignSize), "HalfWordAccess"), offset{4-1}, 3687*9880d681SAndroid Build Coastguard Worker /* ByteAccess */ offset{3-0}))); 3688*9880d681SAndroid Build Coastguard Worker let Inst{1} = 0b0; 3689*9880d681SAndroid Build Coastguard Worker } 3690*9880d681SAndroid Build Coastguard Worker 3691*9880d681SAndroid Build Coastguard Workerdef S2_storerb_pci : T_store_pci<"memb", IntRegs, s4_0Imm, 0b1000, 3692*9880d681SAndroid Build Coastguard Worker ByteAccess>; 3693*9880d681SAndroid Build Coastguard Workerdef S2_storerh_pci : T_store_pci<"memh", IntRegs, s4_1Imm, 0b1010, 3694*9880d681SAndroid Build Coastguard Worker HalfWordAccess>; 3695*9880d681SAndroid Build Coastguard Workerdef S2_storerf_pci : T_store_pci<"memh", IntRegs, s4_1Imm, 0b1011, 3696*9880d681SAndroid Build Coastguard Worker HalfWordAccess, "Rt.h">; 3697*9880d681SAndroid Build Coastguard Workerdef S2_storeri_pci : T_store_pci<"memw", IntRegs, s4_2Imm, 0b1100, 3698*9880d681SAndroid Build Coastguard Worker WordAccess>; 3699*9880d681SAndroid Build Coastguard Workerdef S2_storerd_pci : T_store_pci<"memd", DoubleRegs, s4_3Imm, 0b1110, 3700*9880d681SAndroid Build Coastguard Worker DoubleWordAccess>; 3701*9880d681SAndroid Build Coastguard Worker 3702*9880d681SAndroid Build Coastguard Workerlet Uses = [CS], isNewValue = 1, mayStore = 1, isNVStore = 1, opNewValue = 4 in 3703*9880d681SAndroid Build Coastguard Workerclass T_storenew_pci <string mnemonic, Operand Imm, 3704*9880d681SAndroid Build Coastguard Worker bits<2>MajOp, MemAccessSize AlignSize> 3705*9880d681SAndroid Build Coastguard Worker : NVInst < (outs IntRegs:$_dst_), 3706*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$Rz, Imm:$offset, ModRegs:$Mu, IntRegs:$Nt), 3707*9880d681SAndroid Build Coastguard Worker #mnemonic#"($Rz ++ #$offset:circ($Mu)) = $Nt.new", 3708*9880d681SAndroid Build Coastguard Worker [], 3709*9880d681SAndroid Build Coastguard Worker "$Rz = $_dst_"> { 3710*9880d681SAndroid Build Coastguard Worker bits<5> Rz; 3711*9880d681SAndroid Build Coastguard Worker bits<6> offset; 3712*9880d681SAndroid Build Coastguard Worker bits<1> Mu; 3713*9880d681SAndroid Build Coastguard Worker bits<3> Nt; 3714*9880d681SAndroid Build Coastguard Worker 3715*9880d681SAndroid Build Coastguard Worker let accessSize = AlignSize; 3716*9880d681SAndroid Build Coastguard Worker 3717*9880d681SAndroid Build Coastguard Worker let IClass = 0b1010; 3718*9880d681SAndroid Build Coastguard Worker let Inst{27-21} = 0b1001101; 3719*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rz; 3720*9880d681SAndroid Build Coastguard Worker let Inst{13} = Mu; 3721*9880d681SAndroid Build Coastguard Worker let Inst{12-11} = MajOp; 3722*9880d681SAndroid Build Coastguard Worker let Inst{10-8} = Nt; 3723*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0b0; 3724*9880d681SAndroid Build Coastguard Worker let Inst{6-3} = 3725*9880d681SAndroid Build Coastguard Worker !if (!eq(!cast<string>(AlignSize), "WordAccess"), offset{5-2}, 3726*9880d681SAndroid Build Coastguard Worker !if (!eq(!cast<string>(AlignSize), "HalfWordAccess"), offset{4-1}, 3727*9880d681SAndroid Build Coastguard Worker /* ByteAccess */ offset{3-0})); 3728*9880d681SAndroid Build Coastguard Worker let Inst{1} = 0b0; 3729*9880d681SAndroid Build Coastguard Worker } 3730*9880d681SAndroid Build Coastguard Worker 3731*9880d681SAndroid Build Coastguard Workerdef S2_storerbnew_pci : T_storenew_pci <"memb", s4_0Imm, 0b00, ByteAccess>; 3732*9880d681SAndroid Build Coastguard Workerdef S2_storerhnew_pci : T_storenew_pci <"memh", s4_1Imm, 0b01, HalfWordAccess>; 3733*9880d681SAndroid Build Coastguard Workerdef S2_storerinew_pci : T_storenew_pci <"memw", s4_2Imm, 0b10, WordAccess>; 3734*9880d681SAndroid Build Coastguard Worker 3735*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3736*9880d681SAndroid Build Coastguard Worker// Circular stores with auto-increment register 3737*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3738*9880d681SAndroid Build Coastguard Workerlet Uses = [CS] in 3739*9880d681SAndroid Build Coastguard Workerclass T_store_pcr <string mnemonic, RegisterClass RC, bits<4>MajOp, 3740*9880d681SAndroid Build Coastguard Worker MemAccessSize AlignSize, string RegSrc = "Rt"> 3741*9880d681SAndroid Build Coastguard Worker : STInst <(outs IntRegs:$_dst_), 3742*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$Rz, ModRegs:$Mu, RC:$Rt), 3743*9880d681SAndroid Build Coastguard Worker #mnemonic#"($Rz ++ I:circ($Mu)) = $"#RegSrc#"", 3744*9880d681SAndroid Build Coastguard Worker [], 3745*9880d681SAndroid Build Coastguard Worker "$Rz = $_dst_" > { 3746*9880d681SAndroid Build Coastguard Worker bits<5> Rz; 3747*9880d681SAndroid Build Coastguard Worker bits<1> Mu; 3748*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 3749*9880d681SAndroid Build Coastguard Worker 3750*9880d681SAndroid Build Coastguard Worker let accessSize = AlignSize; 3751*9880d681SAndroid Build Coastguard Worker let isNVStorable = !if(!eq(mnemonic,"memd"), 0, 3752*9880d681SAndroid Build Coastguard Worker !if(!eq(RegSrc,"Rt.h"), 0, 1)); 3753*9880d681SAndroid Build Coastguard Worker 3754*9880d681SAndroid Build Coastguard Worker let IClass = 0b1010; 3755*9880d681SAndroid Build Coastguard Worker let Inst{27-25} = 0b100; 3756*9880d681SAndroid Build Coastguard Worker let Inst{24-21} = MajOp; 3757*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rz; 3758*9880d681SAndroid Build Coastguard Worker let Inst{13} = Mu; 3759*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 3760*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0b0; 3761*9880d681SAndroid Build Coastguard Worker let Inst{1} = 0b1; 3762*9880d681SAndroid Build Coastguard Worker } 3763*9880d681SAndroid Build Coastguard Worker 3764*9880d681SAndroid Build Coastguard Workerdef S2_storerb_pcr : T_store_pcr<"memb", IntRegs, 0b1000, ByteAccess>; 3765*9880d681SAndroid Build Coastguard Workerdef S2_storerh_pcr : T_store_pcr<"memh", IntRegs, 0b1010, HalfWordAccess>; 3766*9880d681SAndroid Build Coastguard Workerdef S2_storeri_pcr : T_store_pcr<"memw", IntRegs, 0b1100, WordAccess>; 3767*9880d681SAndroid Build Coastguard Workerdef S2_storerd_pcr : T_store_pcr<"memd", DoubleRegs, 0b1110, DoubleWordAccess>; 3768*9880d681SAndroid Build Coastguard Workerdef S2_storerf_pcr : T_store_pcr<"memh", IntRegs, 0b1011, 3769*9880d681SAndroid Build Coastguard Worker HalfWordAccess, "Rt.h">; 3770*9880d681SAndroid Build Coastguard Worker 3771*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3772*9880d681SAndroid Build Coastguard Worker// Circular .new stores with auto-increment register 3773*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3774*9880d681SAndroid Build Coastguard Workerlet Uses = [CS], isNewValue = 1, mayStore = 1, isNVStore = 1, opNewValue = 3 in 3775*9880d681SAndroid Build Coastguard Workerclass T_storenew_pcr <string mnemonic, bits<2>MajOp, 3776*9880d681SAndroid Build Coastguard Worker MemAccessSize AlignSize> 3777*9880d681SAndroid Build Coastguard Worker : NVInst <(outs IntRegs:$_dst_), 3778*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$Rz, ModRegs:$Mu, IntRegs:$Nt), 3779*9880d681SAndroid Build Coastguard Worker #mnemonic#"($Rz ++ I:circ($Mu)) = $Nt.new" , 3780*9880d681SAndroid Build Coastguard Worker [] , 3781*9880d681SAndroid Build Coastguard Worker "$Rz = $_dst_"> { 3782*9880d681SAndroid Build Coastguard Worker bits<5> Rz; 3783*9880d681SAndroid Build Coastguard Worker bits<1> Mu; 3784*9880d681SAndroid Build Coastguard Worker bits<3> Nt; 3785*9880d681SAndroid Build Coastguard Worker 3786*9880d681SAndroid Build Coastguard Worker let accessSize = AlignSize; 3787*9880d681SAndroid Build Coastguard Worker 3788*9880d681SAndroid Build Coastguard Worker let IClass = 0b1010; 3789*9880d681SAndroid Build Coastguard Worker let Inst{27-21} = 0b1001101; 3790*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rz; 3791*9880d681SAndroid Build Coastguard Worker let Inst{13} = Mu; 3792*9880d681SAndroid Build Coastguard Worker let Inst{12-11} = MajOp; 3793*9880d681SAndroid Build Coastguard Worker let Inst{10-8} = Nt; 3794*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0b0; 3795*9880d681SAndroid Build Coastguard Worker let Inst{1} = 0b1; 3796*9880d681SAndroid Build Coastguard Worker } 3797*9880d681SAndroid Build Coastguard Worker 3798*9880d681SAndroid Build Coastguard Workerdef S2_storerbnew_pcr : T_storenew_pcr <"memb", 0b00, ByteAccess>; 3799*9880d681SAndroid Build Coastguard Workerdef S2_storerhnew_pcr : T_storenew_pcr <"memh", 0b01, HalfWordAccess>; 3800*9880d681SAndroid Build Coastguard Workerdef S2_storerinew_pcr : T_storenew_pcr <"memw", 0b10, WordAccess>; 3801*9880d681SAndroid Build Coastguard Worker 3802*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3803*9880d681SAndroid Build Coastguard Worker// Bit-reversed stores with auto-increment register 3804*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3805*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 3806*9880d681SAndroid Build Coastguard Workerclass T_store_pbr<string mnemonic, RegisterClass RC, 3807*9880d681SAndroid Build Coastguard Worker MemAccessSize addrSize, bits<3> majOp, 3808*9880d681SAndroid Build Coastguard Worker bit isHalf = 0> 3809*9880d681SAndroid Build Coastguard Worker : STInst 3810*9880d681SAndroid Build Coastguard Worker <(outs IntRegs:$_dst_), 3811*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$Rz, ModRegs:$Mu, RC:$src), 3812*9880d681SAndroid Build Coastguard Worker #mnemonic#"($Rz ++ $Mu:brev) = $src"#!if (!eq(isHalf, 1), ".h", ""), 3813*9880d681SAndroid Build Coastguard Worker [], "$Rz = $_dst_" > { 3814*9880d681SAndroid Build Coastguard Worker 3815*9880d681SAndroid Build Coastguard Worker let accessSize = addrSize; 3816*9880d681SAndroid Build Coastguard Worker 3817*9880d681SAndroid Build Coastguard Worker bits<5> Rz; 3818*9880d681SAndroid Build Coastguard Worker bits<1> Mu; 3819*9880d681SAndroid Build Coastguard Worker bits<5> src; 3820*9880d681SAndroid Build Coastguard Worker 3821*9880d681SAndroid Build Coastguard Worker let IClass = 0b1010; 3822*9880d681SAndroid Build Coastguard Worker 3823*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1111; 3824*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = majOp; 3825*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0b0; 3826*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rz; 3827*9880d681SAndroid Build Coastguard Worker let Inst{13} = Mu; 3828*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = src; 3829*9880d681SAndroid Build Coastguard Worker } 3830*9880d681SAndroid Build Coastguard Worker 3831*9880d681SAndroid Build Coastguard Workerlet isNVStorable = 1 in { 3832*9880d681SAndroid Build Coastguard Worker let BaseOpcode = "S2_storerb_pbr" in 3833*9880d681SAndroid Build Coastguard Worker def S2_storerb_pbr : T_store_pbr<"memb", IntRegs, ByteAccess, 3834*9880d681SAndroid Build Coastguard Worker 0b000>, NewValueRel; 3835*9880d681SAndroid Build Coastguard Worker let BaseOpcode = "S2_storerh_pbr" in 3836*9880d681SAndroid Build Coastguard Worker def S2_storerh_pbr : T_store_pbr<"memh", IntRegs, HalfWordAccess, 3837*9880d681SAndroid Build Coastguard Worker 0b010>, NewValueRel; 3838*9880d681SAndroid Build Coastguard Worker let BaseOpcode = "S2_storeri_pbr" in 3839*9880d681SAndroid Build Coastguard Worker def S2_storeri_pbr : T_store_pbr<"memw", IntRegs, WordAccess, 3840*9880d681SAndroid Build Coastguard Worker 0b100>, NewValueRel; 3841*9880d681SAndroid Build Coastguard Worker} 3842*9880d681SAndroid Build Coastguard Worker 3843*9880d681SAndroid Build Coastguard Workerdef S2_storerf_pbr : T_store_pbr<"memh", IntRegs, HalfWordAccess, 0b011, 1>; 3844*9880d681SAndroid Build Coastguard Workerdef S2_storerd_pbr : T_store_pbr<"memd", DoubleRegs, DoubleWordAccess, 0b110>; 3845*9880d681SAndroid Build Coastguard Worker 3846*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3847*9880d681SAndroid Build Coastguard Worker// Bit-reversed .new stores with auto-increment register 3848*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3849*9880d681SAndroid Build Coastguard Workerlet isNewValue = 1, mayStore = 1, isNVStore = 1, opNewValue = 3, 3850*9880d681SAndroid Build Coastguard Worker hasSideEffects = 0 in 3851*9880d681SAndroid Build Coastguard Workerclass T_storenew_pbr<string mnemonic, MemAccessSize addrSize, bits<2> majOp> 3852*9880d681SAndroid Build Coastguard Worker : NVInst <(outs IntRegs:$_dst_), 3853*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$Rz, ModRegs:$Mu, IntRegs:$Nt), 3854*9880d681SAndroid Build Coastguard Worker #mnemonic#"($Rz ++ $Mu:brev) = $Nt.new", [], 3855*9880d681SAndroid Build Coastguard Worker "$Rz = $_dst_">, NewValueRel { 3856*9880d681SAndroid Build Coastguard Worker let accessSize = addrSize; 3857*9880d681SAndroid Build Coastguard Worker bits<5> Rz; 3858*9880d681SAndroid Build Coastguard Worker bits<1> Mu; 3859*9880d681SAndroid Build Coastguard Worker bits<3> Nt; 3860*9880d681SAndroid Build Coastguard Worker 3861*9880d681SAndroid Build Coastguard Worker let IClass = 0b1010; 3862*9880d681SAndroid Build Coastguard Worker 3863*9880d681SAndroid Build Coastguard Worker let Inst{27-21} = 0b1111101; 3864*9880d681SAndroid Build Coastguard Worker let Inst{12-11} = majOp; 3865*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0b0; 3866*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rz; 3867*9880d681SAndroid Build Coastguard Worker let Inst{13} = Mu; 3868*9880d681SAndroid Build Coastguard Worker let Inst{10-8} = Nt; 3869*9880d681SAndroid Build Coastguard Worker } 3870*9880d681SAndroid Build Coastguard Worker 3871*9880d681SAndroid Build Coastguard Workerlet BaseOpcode = "S2_storerb_pbr" in 3872*9880d681SAndroid Build Coastguard Workerdef S2_storerbnew_pbr : T_storenew_pbr<"memb", ByteAccess, 0b00>; 3873*9880d681SAndroid Build Coastguard Worker 3874*9880d681SAndroid Build Coastguard Workerlet BaseOpcode = "S2_storerh_pbr" in 3875*9880d681SAndroid Build Coastguard Workerdef S2_storerhnew_pbr : T_storenew_pbr<"memh", HalfWordAccess, 0b01>; 3876*9880d681SAndroid Build Coastguard Worker 3877*9880d681SAndroid Build Coastguard Workerlet BaseOpcode = "S2_storeri_pbr" in 3878*9880d681SAndroid Build Coastguard Workerdef S2_storerinew_pbr : T_storenew_pbr<"memw", WordAccess, 0b10>; 3879*9880d681SAndroid Build Coastguard Worker 3880*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3881*9880d681SAndroid Build Coastguard Worker// ST - 3882*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3883*9880d681SAndroid Build Coastguard Worker 3884*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3885*9880d681SAndroid Build Coastguard Worker// Template class for S_2op instructions. 3886*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3887*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 3888*9880d681SAndroid Build Coastguard Workerclass T_S2op_1 <string mnemonic, bits<4> RegTyBits, RegisterClass RCOut, 3889*9880d681SAndroid Build Coastguard Worker RegisterClass RCIn, bits<2> MajOp, bits<3> MinOp, bit isSat> 3890*9880d681SAndroid Build Coastguard Worker : SInst <(outs RCOut:$dst), (ins RCIn:$src), 3891*9880d681SAndroid Build Coastguard Worker "$dst = "#mnemonic#"($src)"#!if(isSat, ":sat", ""), 3892*9880d681SAndroid Build Coastguard Worker [], "", S_2op_tc_1_SLOT23 > { 3893*9880d681SAndroid Build Coastguard Worker bits<5> dst; 3894*9880d681SAndroid Build Coastguard Worker bits<5> src; 3895*9880d681SAndroid Build Coastguard Worker 3896*9880d681SAndroid Build Coastguard Worker let IClass = 0b1000; 3897*9880d681SAndroid Build Coastguard Worker 3898*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = RegTyBits; 3899*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = MajOp; 3900*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0b0; 3901*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src; 3902*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = MinOp; 3903*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 3904*9880d681SAndroid Build Coastguard Worker } 3905*9880d681SAndroid Build Coastguard Worker 3906*9880d681SAndroid Build Coastguard Workerclass T_S2op_1_di <string mnemonic, bits<2> MajOp, bits<3> MinOp> 3907*9880d681SAndroid Build Coastguard Worker : T_S2op_1 <mnemonic, 0b0100, DoubleRegs, IntRegs, MajOp, MinOp, 0>; 3908*9880d681SAndroid Build Coastguard Worker 3909*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1 in 3910*9880d681SAndroid Build Coastguard Workerclass T_S2op_1_id <string mnemonic, bits<2> MajOp, bits<3> MinOp, bit isSat = 0> 3911*9880d681SAndroid Build Coastguard Worker : T_S2op_1 <mnemonic, 0b1000, IntRegs, DoubleRegs, MajOp, MinOp, isSat>; 3912*9880d681SAndroid Build Coastguard Worker 3913*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1 in 3914*9880d681SAndroid Build Coastguard Workerclass T_S2op_1_ii <string mnemonic, bits<2> MajOp, bits<3> MinOp, bit isSat = 0> 3915*9880d681SAndroid Build Coastguard Worker : T_S2op_1 <mnemonic, 0b1100, IntRegs, IntRegs, MajOp, MinOp, isSat>; 3916*9880d681SAndroid Build Coastguard Worker 3917*9880d681SAndroid Build Coastguard Worker// Vector sign/zero extend 3918*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isAsCheapAsAMove = 1 in { 3919*9880d681SAndroid Build Coastguard Worker def S2_vsxtbh : T_S2op_1_di <"vsxtbh", 0b00, 0b000>; 3920*9880d681SAndroid Build Coastguard Worker def S2_vsxthw : T_S2op_1_di <"vsxthw", 0b00, 0b100>; 3921*9880d681SAndroid Build Coastguard Worker def S2_vzxtbh : T_S2op_1_di <"vzxtbh", 0b00, 0b010>; 3922*9880d681SAndroid Build Coastguard Worker def S2_vzxthw : T_S2op_1_di <"vzxthw", 0b00, 0b110>; 3923*9880d681SAndroid Build Coastguard Worker} 3924*9880d681SAndroid Build Coastguard Worker 3925*9880d681SAndroid Build Coastguard Worker// Vector splat bytes/halfwords 3926*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isAsCheapAsAMove = 1 in { 3927*9880d681SAndroid Build Coastguard Worker def S2_vsplatrb : T_S2op_1_ii <"vsplatb", 0b01, 0b111>; 3928*9880d681SAndroid Build Coastguard Worker def S2_vsplatrh : T_S2op_1_di <"vsplath", 0b01, 0b010>; 3929*9880d681SAndroid Build Coastguard Worker} 3930*9880d681SAndroid Build Coastguard Worker 3931*9880d681SAndroid Build Coastguard Worker// Sign extend word to doubleword 3932*9880d681SAndroid Build Coastguard Workerdef A2_sxtw : T_S2op_1_di <"sxtw", 0b01, 0b000>; 3933*9880d681SAndroid Build Coastguard Worker 3934*9880d681SAndroid Build Coastguard Workerdef: Pat <(i64 (sext I32:$src)), (A2_sxtw I32:$src)>; 3935*9880d681SAndroid Build Coastguard Worker 3936*9880d681SAndroid Build Coastguard Worker// Vector saturate and pack 3937*9880d681SAndroid Build Coastguard Workerlet Defs = [USR_OVF] in { 3938*9880d681SAndroid Build Coastguard Worker def S2_svsathb : T_S2op_1_ii <"vsathb", 0b10, 0b000>; 3939*9880d681SAndroid Build Coastguard Worker def S2_svsathub : T_S2op_1_ii <"vsathub", 0b10, 0b010>; 3940*9880d681SAndroid Build Coastguard Worker def S2_vsathb : T_S2op_1_id <"vsathb", 0b00, 0b110>; 3941*9880d681SAndroid Build Coastguard Worker def S2_vsathub : T_S2op_1_id <"vsathub", 0b00, 0b000>; 3942*9880d681SAndroid Build Coastguard Worker def S2_vsatwh : T_S2op_1_id <"vsatwh", 0b00, 0b010>; 3943*9880d681SAndroid Build Coastguard Worker def S2_vsatwuh : T_S2op_1_id <"vsatwuh", 0b00, 0b100>; 3944*9880d681SAndroid Build Coastguard Worker} 3945*9880d681SAndroid Build Coastguard Worker 3946*9880d681SAndroid Build Coastguard Worker// Vector truncate 3947*9880d681SAndroid Build Coastguard Workerdef S2_vtrunohb : T_S2op_1_id <"vtrunohb", 0b10, 0b000>; 3948*9880d681SAndroid Build Coastguard Workerdef S2_vtrunehb : T_S2op_1_id <"vtrunehb", 0b10, 0b010>; 3949*9880d681SAndroid Build Coastguard Worker 3950*9880d681SAndroid Build Coastguard Worker// Swizzle the bytes of a word 3951*9880d681SAndroid Build Coastguard Workerdef A2_swiz : T_S2op_1_ii <"swiz", 0b10, 0b111>; 3952*9880d681SAndroid Build Coastguard Worker 3953*9880d681SAndroid Build Coastguard Worker// Saturate 3954*9880d681SAndroid Build Coastguard Workerlet Defs = [USR_OVF] in { 3955*9880d681SAndroid Build Coastguard Worker def A2_sat : T_S2op_1_id <"sat", 0b11, 0b000>; 3956*9880d681SAndroid Build Coastguard Worker def A2_satb : T_S2op_1_ii <"satb", 0b11, 0b111>; 3957*9880d681SAndroid Build Coastguard Worker def A2_satub : T_S2op_1_ii <"satub", 0b11, 0b110>; 3958*9880d681SAndroid Build Coastguard Worker def A2_sath : T_S2op_1_ii <"sath", 0b11, 0b100>; 3959*9880d681SAndroid Build Coastguard Worker def A2_satuh : T_S2op_1_ii <"satuh", 0b11, 0b101>; 3960*9880d681SAndroid Build Coastguard Worker def A2_roundsat : T_S2op_1_id <"round", 0b11, 0b001, 0b1>; 3961*9880d681SAndroid Build Coastguard Worker} 3962*9880d681SAndroid Build Coastguard Worker 3963*9880d681SAndroid Build Coastguard Workerlet Itinerary = S_2op_tc_2_SLOT23 in { 3964*9880d681SAndroid Build Coastguard Worker // Vector round and pack 3965*9880d681SAndroid Build Coastguard Worker def S2_vrndpackwh : T_S2op_1_id <"vrndwh", 0b10, 0b100>; 3966*9880d681SAndroid Build Coastguard Worker 3967*9880d681SAndroid Build Coastguard Worker let Defs = [USR_OVF] in 3968*9880d681SAndroid Build Coastguard Worker def S2_vrndpackwhs : T_S2op_1_id <"vrndwh", 0b10, 0b110, 1>; 3969*9880d681SAndroid Build Coastguard Worker 3970*9880d681SAndroid Build Coastguard Worker // Bit reverse 3971*9880d681SAndroid Build Coastguard Worker def S2_brev : T_S2op_1_ii <"brev", 0b01, 0b110>; 3972*9880d681SAndroid Build Coastguard Worker 3973*9880d681SAndroid Build Coastguard Worker // Absolute value word 3974*9880d681SAndroid Build Coastguard Worker def A2_abs : T_S2op_1_ii <"abs", 0b10, 0b100>; 3975*9880d681SAndroid Build Coastguard Worker 3976*9880d681SAndroid Build Coastguard Worker let Defs = [USR_OVF] in 3977*9880d681SAndroid Build Coastguard Worker def A2_abssat : T_S2op_1_ii <"abs", 0b10, 0b101, 1>; 3978*9880d681SAndroid Build Coastguard Worker 3979*9880d681SAndroid Build Coastguard Worker // Negate with saturation 3980*9880d681SAndroid Build Coastguard Worker let Defs = [USR_OVF] in 3981*9880d681SAndroid Build Coastguard Worker def A2_negsat : T_S2op_1_ii <"neg", 0b10, 0b110, 1>; 3982*9880d681SAndroid Build Coastguard Worker} 3983*9880d681SAndroid Build Coastguard Worker 3984*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (select (i1 (setlt (i32 IntRegs:$src), 0)), 3985*9880d681SAndroid Build Coastguard Worker (i32 (sub 0, (i32 IntRegs:$src))), 3986*9880d681SAndroid Build Coastguard Worker (i32 IntRegs:$src))), 3987*9880d681SAndroid Build Coastguard Worker (A2_abs IntRegs:$src)>; 3988*9880d681SAndroid Build Coastguard Worker 3989*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 50 in 3990*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (xor (add (sra (i32 IntRegs:$src), (i32 31)), 3991*9880d681SAndroid Build Coastguard Worker (i32 IntRegs:$src)), 3992*9880d681SAndroid Build Coastguard Worker (sra (i32 IntRegs:$src), (i32 31)))), 3993*9880d681SAndroid Build Coastguard Worker (A2_abs IntRegs:$src)>; 3994*9880d681SAndroid Build Coastguard Worker 3995*9880d681SAndroid Build Coastguard Workerclass T_S2op_2 <string mnemonic, bits<4> RegTyBits, RegisterClass RCOut, 3996*9880d681SAndroid Build Coastguard Worker RegisterClass RCIn, bits<3> MajOp, bits<3> MinOp, 3997*9880d681SAndroid Build Coastguard Worker bit isSat, bit isRnd, list<dag> pattern = []> 3998*9880d681SAndroid Build Coastguard Worker : SInst <(outs RCOut:$dst), 3999*9880d681SAndroid Build Coastguard Worker (ins RCIn:$src, u5Imm:$u5), 4000*9880d681SAndroid Build Coastguard Worker "$dst = "#mnemonic#"($src, #$u5)"#!if(isSat, ":sat", "") 4001*9880d681SAndroid Build Coastguard Worker #!if(isRnd, ":rnd", ""), 4002*9880d681SAndroid Build Coastguard Worker pattern, "", S_2op_tc_2_SLOT23> { 4003*9880d681SAndroid Build Coastguard Worker bits<5> dst; 4004*9880d681SAndroid Build Coastguard Worker bits<5> src; 4005*9880d681SAndroid Build Coastguard Worker bits<5> u5; 4006*9880d681SAndroid Build Coastguard Worker 4007*9880d681SAndroid Build Coastguard Worker let IClass = 0b1000; 4008*9880d681SAndroid Build Coastguard Worker 4009*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = RegTyBits; 4010*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MajOp; 4011*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src; 4012*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 4013*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = u5; 4014*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = MinOp; 4015*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 4016*9880d681SAndroid Build Coastguard Worker } 4017*9880d681SAndroid Build Coastguard Worker 4018*9880d681SAndroid Build Coastguard Workerclass T_S2op_2_di <string mnemonic, bits<3> MajOp, bits<3> MinOp> 4019*9880d681SAndroid Build Coastguard Worker : T_S2op_2 <mnemonic, 0b1000, DoubleRegs, IntRegs, MajOp, MinOp, 0, 0>; 4020*9880d681SAndroid Build Coastguard Worker 4021*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1 in 4022*9880d681SAndroid Build Coastguard Workerclass T_S2op_2_id <string mnemonic, bits<3> MajOp, bits<3> MinOp> 4023*9880d681SAndroid Build Coastguard Worker : T_S2op_2 <mnemonic, 0b1000, IntRegs, DoubleRegs, MajOp, MinOp, 0, 0>; 4024*9880d681SAndroid Build Coastguard Worker 4025*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1 in 4026*9880d681SAndroid Build Coastguard Workerclass T_S2op_2_ii <string mnemonic, bits<3> MajOp, bits<3> MinOp, 4027*9880d681SAndroid Build Coastguard Worker bit isSat = 0, bit isRnd = 0, list<dag> pattern = []> 4028*9880d681SAndroid Build Coastguard Worker : T_S2op_2 <mnemonic, 0b1100, IntRegs, IntRegs, MajOp, MinOp, 4029*9880d681SAndroid Build Coastguard Worker isSat, isRnd, pattern>; 4030*9880d681SAndroid Build Coastguard Worker 4031*9880d681SAndroid Build Coastguard Workerclass T_S2op_shift <string mnemonic, bits<3> MajOp, bits<3> MinOp, SDNode OpNd> 4032*9880d681SAndroid Build Coastguard Worker : T_S2op_2_ii <mnemonic, MajOp, MinOp, 0, 0, 4033*9880d681SAndroid Build Coastguard Worker [(set (i32 IntRegs:$dst), (OpNd (i32 IntRegs:$src), 4034*9880d681SAndroid Build Coastguard Worker (u5ImmPred:$u5)))]>; 4035*9880d681SAndroid Build Coastguard Worker 4036*9880d681SAndroid Build Coastguard Worker// Vector arithmetic shift right by immediate with truncate and pack 4037*9880d681SAndroid Build Coastguard Workerdef S2_asr_i_svw_trun : T_S2op_2_id <"vasrw", 0b110, 0b010>; 4038*9880d681SAndroid Build Coastguard Worker 4039*9880d681SAndroid Build Coastguard Worker// Arithmetic/logical shift right/left by immediate 4040*9880d681SAndroid Build Coastguard Workerlet Itinerary = S_2op_tc_1_SLOT23 in { 4041*9880d681SAndroid Build Coastguard Worker def S2_asr_i_r : T_S2op_shift <"asr", 0b000, 0b000, sra>; 4042*9880d681SAndroid Build Coastguard Worker def S2_lsr_i_r : T_S2op_shift <"lsr", 0b000, 0b001, srl>; 4043*9880d681SAndroid Build Coastguard Worker def S2_asl_i_r : T_S2op_shift <"asl", 0b000, 0b010, shl>; 4044*9880d681SAndroid Build Coastguard Worker} 4045*9880d681SAndroid Build Coastguard Worker 4046*9880d681SAndroid Build Coastguard Worker// Shift left by immediate with saturation 4047*9880d681SAndroid Build Coastguard Workerlet Defs = [USR_OVF] in 4048*9880d681SAndroid Build Coastguard Workerdef S2_asl_i_r_sat : T_S2op_2_ii <"asl", 0b010, 0b010, 1>; 4049*9880d681SAndroid Build Coastguard Worker 4050*9880d681SAndroid Build Coastguard Worker// Shift right with round 4051*9880d681SAndroid Build Coastguard Workerdef S2_asr_i_r_rnd : T_S2op_2_ii <"asr", 0b010, 0b000, 0, 1>; 4052*9880d681SAndroid Build Coastguard Worker 4053*9880d681SAndroid Build Coastguard Workerlet isAsmParserOnly = 1 in 4054*9880d681SAndroid Build Coastguard Workerdef S2_asr_i_r_rnd_goodsyntax 4055*9880d681SAndroid Build Coastguard Worker : SInst <(outs IntRegs:$dst), (ins IntRegs:$src, u5Imm:$u5), 4056*9880d681SAndroid Build Coastguard Worker "$dst = asrrnd($src, #$u5)", 4057*9880d681SAndroid Build Coastguard Worker [], "", S_2op_tc_1_SLOT23>; 4058*9880d681SAndroid Build Coastguard Worker 4059*9880d681SAndroid Build Coastguard Workerlet isAsmParserOnly = 1 in 4060*9880d681SAndroid Build Coastguard Workerdef A2_not: ALU32_rr<(outs IntRegs:$dst),(ins IntRegs:$src), 4061*9880d681SAndroid Build Coastguard Worker "$dst = not($src)">; 4062*9880d681SAndroid Build Coastguard Worker 4063*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (sra (i32 (add (i32 (sra I32:$src1, u5ImmPred:$src2)), 4064*9880d681SAndroid Build Coastguard Worker (i32 1))), 4065*9880d681SAndroid Build Coastguard Worker (i32 1))), 4066*9880d681SAndroid Build Coastguard Worker (S2_asr_i_r_rnd IntRegs:$src1, u5ImmPred:$src2)>; 4067*9880d681SAndroid Build Coastguard Worker 4068*9880d681SAndroid Build Coastguard Workerclass T_S2op_3<string opc, bits<2>MajOp, bits<3>minOp, bits<1> sat = 0> 4069*9880d681SAndroid Build Coastguard Worker : SInst<(outs DoubleRegs:$Rdd), (ins DoubleRegs:$Rss), 4070*9880d681SAndroid Build Coastguard Worker "$Rdd = "#opc#"($Rss)"#!if(!eq(sat, 1),":sat","")> { 4071*9880d681SAndroid Build Coastguard Worker bits<5> Rss; 4072*9880d681SAndroid Build Coastguard Worker bits<5> Rdd; 4073*9880d681SAndroid Build Coastguard Worker let IClass = 0b1000; 4074*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0; 4075*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = MajOp; 4076*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rss; 4077*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = minOp; 4078*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rdd; 4079*9880d681SAndroid Build Coastguard Worker} 4080*9880d681SAndroid Build Coastguard Worker 4081*9880d681SAndroid Build Coastguard Workerdef A2_absp : T_S2op_3 <"abs", 0b10, 0b110>; 4082*9880d681SAndroid Build Coastguard Workerdef A2_negp : T_S2op_3 <"neg", 0b10, 0b101>; 4083*9880d681SAndroid Build Coastguard Workerdef A2_notp : T_S2op_3 <"not", 0b10, 0b100>; 4084*9880d681SAndroid Build Coastguard Worker 4085*9880d681SAndroid Build Coastguard Worker// Innterleave/deinterleave 4086*9880d681SAndroid Build Coastguard Workerdef S2_interleave : T_S2op_3 <"interleave", 0b11, 0b101>; 4087*9880d681SAndroid Build Coastguard Workerdef S2_deinterleave : T_S2op_3 <"deinterleave", 0b11, 0b100>; 4088*9880d681SAndroid Build Coastguard Worker 4089*9880d681SAndroid Build Coastguard Worker// Vector Complex conjugate 4090*9880d681SAndroid Build Coastguard Workerdef A2_vconj : T_S2op_3 <"vconj", 0b10, 0b111, 1>; 4091*9880d681SAndroid Build Coastguard Worker 4092*9880d681SAndroid Build Coastguard Worker// Vector saturate without pack 4093*9880d681SAndroid Build Coastguard Workerdef S2_vsathb_nopack : T_S2op_3 <"vsathb", 0b00, 0b111>; 4094*9880d681SAndroid Build Coastguard Workerdef S2_vsathub_nopack : T_S2op_3 <"vsathub", 0b00, 0b100>; 4095*9880d681SAndroid Build Coastguard Workerdef S2_vsatwh_nopack : T_S2op_3 <"vsatwh", 0b00, 0b110>; 4096*9880d681SAndroid Build Coastguard Workerdef S2_vsatwuh_nopack : T_S2op_3 <"vsatwuh", 0b00, 0b101>; 4097*9880d681SAndroid Build Coastguard Worker 4098*9880d681SAndroid Build Coastguard Worker// Vector absolute value halfwords with and without saturation 4099*9880d681SAndroid Build Coastguard Worker// Rdd64=vabsh(Rss64)[:sat] 4100*9880d681SAndroid Build Coastguard Workerdef A2_vabsh : T_S2op_3 <"vabsh", 0b01, 0b100>; 4101*9880d681SAndroid Build Coastguard Workerdef A2_vabshsat : T_S2op_3 <"vabsh", 0b01, 0b101, 1>; 4102*9880d681SAndroid Build Coastguard Worker 4103*9880d681SAndroid Build Coastguard Worker// Vector absolute value words with and without saturation 4104*9880d681SAndroid Build Coastguard Workerdef A2_vabsw : T_S2op_3 <"vabsw", 0b01, 0b110>; 4105*9880d681SAndroid Build Coastguard Workerdef A2_vabswsat : T_S2op_3 <"vabsw", 0b01, 0b111, 1>; 4106*9880d681SAndroid Build Coastguard Worker 4107*9880d681SAndroid Build Coastguard Workerdef : Pat<(not (i64 DoubleRegs:$src1)), 4108*9880d681SAndroid Build Coastguard Worker (A2_notp DoubleRegs:$src1)>; 4109*9880d681SAndroid Build Coastguard Worker 4110*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4111*9880d681SAndroid Build Coastguard Worker// STYPE/BIT + 4112*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4113*9880d681SAndroid Build Coastguard Worker// Bit count 4114*9880d681SAndroid Build Coastguard Worker 4115*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, hasNewValue = 1 in 4116*9880d681SAndroid Build Coastguard Workerclass T_COUNT_LEADING<string MnOp, bits<3> MajOp, bits<3> MinOp, bit Is32, 4117*9880d681SAndroid Build Coastguard Worker dag Out, dag Inp> 4118*9880d681SAndroid Build Coastguard Worker : SInst<Out, Inp, "$Rd = "#MnOp#"($Rs)", [], "", S_2op_tc_1_SLOT23> { 4119*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 4120*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 4121*9880d681SAndroid Build Coastguard Worker let IClass = 0b1000; 4122*9880d681SAndroid Build Coastguard Worker let Inst{27} = 0b1; 4123*9880d681SAndroid Build Coastguard Worker let Inst{26} = Is32; 4124*9880d681SAndroid Build Coastguard Worker let Inst{25-24} = 0b00; 4125*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MajOp; 4126*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 4127*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = MinOp; 4128*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 4129*9880d681SAndroid Build Coastguard Worker} 4130*9880d681SAndroid Build Coastguard Worker 4131*9880d681SAndroid Build Coastguard Workerclass T_COUNT_LEADING_32<string MnOp, bits<3> MajOp, bits<3> MinOp> 4132*9880d681SAndroid Build Coastguard Worker : T_COUNT_LEADING<MnOp, MajOp, MinOp, 0b1, 4133*9880d681SAndroid Build Coastguard Worker (outs IntRegs:$Rd), (ins IntRegs:$Rs)>; 4134*9880d681SAndroid Build Coastguard Worker 4135*9880d681SAndroid Build Coastguard Workerclass T_COUNT_LEADING_64<string MnOp, bits<3> MajOp, bits<3> MinOp> 4136*9880d681SAndroid Build Coastguard Worker : T_COUNT_LEADING<MnOp, MajOp, MinOp, 0b0, 4137*9880d681SAndroid Build Coastguard Worker (outs IntRegs:$Rd), (ins DoubleRegs:$Rs)>; 4138*9880d681SAndroid Build Coastguard Worker 4139*9880d681SAndroid Build Coastguard Workerdef S2_cl0 : T_COUNT_LEADING_32<"cl0", 0b000, 0b101>; 4140*9880d681SAndroid Build Coastguard Workerdef S2_cl1 : T_COUNT_LEADING_32<"cl1", 0b000, 0b110>; 4141*9880d681SAndroid Build Coastguard Workerdef S2_ct0 : T_COUNT_LEADING_32<"ct0", 0b010, 0b100>; 4142*9880d681SAndroid Build Coastguard Workerdef S2_ct1 : T_COUNT_LEADING_32<"ct1", 0b010, 0b101>; 4143*9880d681SAndroid Build Coastguard Workerdef S2_cl0p : T_COUNT_LEADING_64<"cl0", 0b010, 0b010>; 4144*9880d681SAndroid Build Coastguard Workerdef S2_cl1p : T_COUNT_LEADING_64<"cl1", 0b010, 0b100>; 4145*9880d681SAndroid Build Coastguard Workerdef S2_clb : T_COUNT_LEADING_32<"clb", 0b000, 0b100>; 4146*9880d681SAndroid Build Coastguard Workerdef S2_clbp : T_COUNT_LEADING_64<"clb", 0b010, 0b000>; 4147*9880d681SAndroid Build Coastguard Workerdef S2_clbnorm : T_COUNT_LEADING_32<"normamt", 0b000, 0b111>; 4148*9880d681SAndroid Build Coastguard Worker 4149*9880d681SAndroid Build Coastguard Worker// Count leading zeros. 4150*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (ctlz I32:$Rs)), (S2_cl0 I32:$Rs)>; 4151*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (trunc (ctlz I64:$Rss))), (S2_cl0p I64:$Rss)>; 4152*9880d681SAndroid Build Coastguard Worker 4153*9880d681SAndroid Build Coastguard Worker// Count trailing zeros: 32-bit. 4154*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (cttz I32:$Rs)), (S2_ct0 I32:$Rs)>; 4155*9880d681SAndroid Build Coastguard Worker 4156*9880d681SAndroid Build Coastguard Worker// Count leading ones. 4157*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (ctlz (not I32:$Rs))), (S2_cl1 I32:$Rs)>; 4158*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (trunc (ctlz (not I64:$Rss)))), (S2_cl1p I64:$Rss)>; 4159*9880d681SAndroid Build Coastguard Worker 4160*9880d681SAndroid Build Coastguard Worker// Count trailing ones: 32-bit. 4161*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (cttz (not I32:$Rs))), (S2_ct1 I32:$Rs)>; 4162*9880d681SAndroid Build Coastguard Worker 4163*9880d681SAndroid Build Coastguard Worker// The 64-bit counts leading/trailing are defined in HexagonInstrInfoV4.td. 4164*9880d681SAndroid Build Coastguard Worker 4165*9880d681SAndroid Build Coastguard Worker// Bit set/clear/toggle 4166*9880d681SAndroid Build Coastguard Worker 4167*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, hasNewValue = 1 in 4168*9880d681SAndroid Build Coastguard Workerclass T_SCT_BIT_IMM<string MnOp, bits<3> MinOp> 4169*9880d681SAndroid Build Coastguard Worker : SInst<(outs IntRegs:$Rd), (ins IntRegs:$Rs, u5Imm:$u5), 4170*9880d681SAndroid Build Coastguard Worker "$Rd = "#MnOp#"($Rs, #$u5)", [], "", S_2op_tc_1_SLOT23> { 4171*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 4172*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 4173*9880d681SAndroid Build Coastguard Worker bits<5> u5; 4174*9880d681SAndroid Build Coastguard Worker let IClass = 0b1000; 4175*9880d681SAndroid Build Coastguard Worker let Inst{27-21} = 0b1100110; 4176*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 4177*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 4178*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = u5; 4179*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = MinOp; 4180*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 4181*9880d681SAndroid Build Coastguard Worker} 4182*9880d681SAndroid Build Coastguard Worker 4183*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, hasNewValue = 1 in 4184*9880d681SAndroid Build Coastguard Workerclass T_SCT_BIT_REG<string MnOp, bits<2> MinOp> 4185*9880d681SAndroid Build Coastguard Worker : SInst<(outs IntRegs:$Rd), (ins IntRegs:$Rs, IntRegs:$Rt), 4186*9880d681SAndroid Build Coastguard Worker "$Rd = "#MnOp#"($Rs, $Rt)", [], "", S_3op_tc_1_SLOT23> { 4187*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 4188*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 4189*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 4190*9880d681SAndroid Build Coastguard Worker let IClass = 0b1100; 4191*9880d681SAndroid Build Coastguard Worker let Inst{27-22} = 0b011010; 4192*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 4193*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 4194*9880d681SAndroid Build Coastguard Worker let Inst{7-6} = MinOp; 4195*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 4196*9880d681SAndroid Build Coastguard Worker} 4197*9880d681SAndroid Build Coastguard Worker 4198*9880d681SAndroid Build Coastguard Workerdef S2_clrbit_i : T_SCT_BIT_IMM<"clrbit", 0b001>; 4199*9880d681SAndroid Build Coastguard Workerdef S2_setbit_i : T_SCT_BIT_IMM<"setbit", 0b000>; 4200*9880d681SAndroid Build Coastguard Workerdef S2_togglebit_i : T_SCT_BIT_IMM<"togglebit", 0b010>; 4201*9880d681SAndroid Build Coastguard Workerdef S2_clrbit_r : T_SCT_BIT_REG<"clrbit", 0b01>; 4202*9880d681SAndroid Build Coastguard Workerdef S2_setbit_r : T_SCT_BIT_REG<"setbit", 0b00>; 4203*9880d681SAndroid Build Coastguard Workerdef S2_togglebit_r : T_SCT_BIT_REG<"togglebit", 0b10>; 4204*9880d681SAndroid Build Coastguard Worker 4205*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (and (i32 IntRegs:$Rs), (not (shl 1, u5ImmPred:$u5)))), 4206*9880d681SAndroid Build Coastguard Worker (S2_clrbit_i IntRegs:$Rs, u5ImmPred:$u5)>; 4207*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (or (i32 IntRegs:$Rs), (shl 1, u5ImmPred:$u5))), 4208*9880d681SAndroid Build Coastguard Worker (S2_setbit_i IntRegs:$Rs, u5ImmPred:$u5)>; 4209*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (xor (i32 IntRegs:$Rs), (shl 1, u5ImmPred:$u5))), 4210*9880d681SAndroid Build Coastguard Worker (S2_togglebit_i IntRegs:$Rs, u5ImmPred:$u5)>; 4211*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (and (i32 IntRegs:$Rs), (not (shl 1, (i32 IntRegs:$Rt))))), 4212*9880d681SAndroid Build Coastguard Worker (S2_clrbit_r IntRegs:$Rs, IntRegs:$Rt)>; 4213*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (or (i32 IntRegs:$Rs), (shl 1, (i32 IntRegs:$Rt)))), 4214*9880d681SAndroid Build Coastguard Worker (S2_setbit_r IntRegs:$Rs, IntRegs:$Rt)>; 4215*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (xor (i32 IntRegs:$Rs), (shl 1, (i32 IntRegs:$Rt)))), 4216*9880d681SAndroid Build Coastguard Worker (S2_togglebit_r IntRegs:$Rs, IntRegs:$Rt)>; 4217*9880d681SAndroid Build Coastguard Worker 4218*9880d681SAndroid Build Coastguard Worker// Bit test 4219*9880d681SAndroid Build Coastguard Worker 4220*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 4221*9880d681SAndroid Build Coastguard Workerclass T_TEST_BIT_IMM<string MnOp, bits<3> MajOp> 4222*9880d681SAndroid Build Coastguard Worker : SInst<(outs PredRegs:$Pd), (ins IntRegs:$Rs, u5Imm:$u5), 4223*9880d681SAndroid Build Coastguard Worker "$Pd = "#MnOp#"($Rs, #$u5)", 4224*9880d681SAndroid Build Coastguard Worker [], "", S_2op_tc_2early_SLOT23> { 4225*9880d681SAndroid Build Coastguard Worker bits<2> Pd; 4226*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 4227*9880d681SAndroid Build Coastguard Worker bits<5> u5; 4228*9880d681SAndroid Build Coastguard Worker let IClass = 0b1000; 4229*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0101; 4230*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MajOp; 4231*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 4232*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0; 4233*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = u5; 4234*9880d681SAndroid Build Coastguard Worker let Inst{1-0} = Pd; 4235*9880d681SAndroid Build Coastguard Worker} 4236*9880d681SAndroid Build Coastguard Worker 4237*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 4238*9880d681SAndroid Build Coastguard Workerclass T_TEST_BIT_REG<string MnOp, bit IsNeg> 4239*9880d681SAndroid Build Coastguard Worker : SInst<(outs PredRegs:$Pd), (ins IntRegs:$Rs, IntRegs:$Rt), 4240*9880d681SAndroid Build Coastguard Worker "$Pd = "#MnOp#"($Rs, $Rt)", 4241*9880d681SAndroid Build Coastguard Worker [], "", S_3op_tc_2early_SLOT23> { 4242*9880d681SAndroid Build Coastguard Worker bits<2> Pd; 4243*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 4244*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 4245*9880d681SAndroid Build Coastguard Worker let IClass = 0b1100; 4246*9880d681SAndroid Build Coastguard Worker let Inst{27-22} = 0b011100; 4247*9880d681SAndroid Build Coastguard Worker let Inst{21} = IsNeg; 4248*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 4249*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 4250*9880d681SAndroid Build Coastguard Worker let Inst{1-0} = Pd; 4251*9880d681SAndroid Build Coastguard Worker} 4252*9880d681SAndroid Build Coastguard Worker 4253*9880d681SAndroid Build Coastguard Workerdef S2_tstbit_i : T_TEST_BIT_IMM<"tstbit", 0b000>; 4254*9880d681SAndroid Build Coastguard Workerdef S2_tstbit_r : T_TEST_BIT_REG<"tstbit", 0>; 4255*9880d681SAndroid Build Coastguard Worker 4256*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 20 in { // Complexity greater than cmp reg-imm. 4257*9880d681SAndroid Build Coastguard Worker def: Pat<(i1 (setne (and (shl 1, u5ImmPred:$u5), (i32 IntRegs:$Rs)), 0)), 4258*9880d681SAndroid Build Coastguard Worker (S2_tstbit_i IntRegs:$Rs, u5ImmPred:$u5)>; 4259*9880d681SAndroid Build Coastguard Worker def: Pat<(i1 (setne (and (shl 1, (i32 IntRegs:$Rt)), (i32 IntRegs:$Rs)), 0)), 4260*9880d681SAndroid Build Coastguard Worker (S2_tstbit_r IntRegs:$Rs, IntRegs:$Rt)>; 4261*9880d681SAndroid Build Coastguard Worker def: Pat<(i1 (trunc (i32 IntRegs:$Rs))), 4262*9880d681SAndroid Build Coastguard Worker (S2_tstbit_i IntRegs:$Rs, 0)>; 4263*9880d681SAndroid Build Coastguard Worker def: Pat<(i1 (trunc (i64 DoubleRegs:$Rs))), 4264*9880d681SAndroid Build Coastguard Worker (S2_tstbit_i (LoReg DoubleRegs:$Rs), 0)>; 4265*9880d681SAndroid Build Coastguard Worker} 4266*9880d681SAndroid Build Coastguard Worker 4267*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 4268*9880d681SAndroid Build Coastguard Workerclass T_TEST_BITS_IMM<string MnOp, bits<2> MajOp, bit IsNeg> 4269*9880d681SAndroid Build Coastguard Worker : SInst<(outs PredRegs:$Pd), (ins IntRegs:$Rs, u6Imm:$u6), 4270*9880d681SAndroid Build Coastguard Worker "$Pd = "#MnOp#"($Rs, #$u6)", 4271*9880d681SAndroid Build Coastguard Worker [], "", S_2op_tc_2early_SLOT23> { 4272*9880d681SAndroid Build Coastguard Worker bits<2> Pd; 4273*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 4274*9880d681SAndroid Build Coastguard Worker bits<6> u6; 4275*9880d681SAndroid Build Coastguard Worker let IClass = 0b1000; 4276*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0101; 4277*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = MajOp; 4278*9880d681SAndroid Build Coastguard Worker let Inst{21} = IsNeg; 4279*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 4280*9880d681SAndroid Build Coastguard Worker let Inst{13-8} = u6; 4281*9880d681SAndroid Build Coastguard Worker let Inst{1-0} = Pd; 4282*9880d681SAndroid Build Coastguard Worker} 4283*9880d681SAndroid Build Coastguard Worker 4284*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 4285*9880d681SAndroid Build Coastguard Workerclass T_TEST_BITS_REG<string MnOp, bits<2> MajOp, bit IsNeg> 4286*9880d681SAndroid Build Coastguard Worker : SInst<(outs PredRegs:$Pd), (ins IntRegs:$Rs, IntRegs:$Rt), 4287*9880d681SAndroid Build Coastguard Worker "$Pd = "#MnOp#"($Rs, $Rt)", 4288*9880d681SAndroid Build Coastguard Worker [], "", S_3op_tc_2early_SLOT23> { 4289*9880d681SAndroid Build Coastguard Worker bits<2> Pd; 4290*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 4291*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 4292*9880d681SAndroid Build Coastguard Worker let IClass = 0b1100; 4293*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0111; 4294*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = MajOp; 4295*9880d681SAndroid Build Coastguard Worker let Inst{21} = IsNeg; 4296*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 4297*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 4298*9880d681SAndroid Build Coastguard Worker let Inst{1-0} = Pd; 4299*9880d681SAndroid Build Coastguard Worker} 4300*9880d681SAndroid Build Coastguard Worker 4301*9880d681SAndroid Build Coastguard Workerdef C2_bitsclri : T_TEST_BITS_IMM<"bitsclr", 0b10, 0>; 4302*9880d681SAndroid Build Coastguard Workerdef C2_bitsclr : T_TEST_BITS_REG<"bitsclr", 0b10, 0>; 4303*9880d681SAndroid Build Coastguard Workerdef C2_bitsset : T_TEST_BITS_REG<"bitsset", 0b01, 0>; 4304*9880d681SAndroid Build Coastguard Worker 4305*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 20 in { // Complexity greater than compare reg-imm. 4306*9880d681SAndroid Build Coastguard Worker def: Pat<(i1 (seteq (and (i32 IntRegs:$Rs), u6ImmPred:$u6), 0)), 4307*9880d681SAndroid Build Coastguard Worker (C2_bitsclri IntRegs:$Rs, u6ImmPred:$u6)>; 4308*9880d681SAndroid Build Coastguard Worker def: Pat<(i1 (seteq (and (i32 IntRegs:$Rs), (i32 IntRegs:$Rt)), 0)), 4309*9880d681SAndroid Build Coastguard Worker (C2_bitsclr IntRegs:$Rs, IntRegs:$Rt)>; 4310*9880d681SAndroid Build Coastguard Worker} 4311*9880d681SAndroid Build Coastguard Worker 4312*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 10 in // Complexity greater than compare reg-reg. 4313*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (seteq (and (i32 IntRegs:$Rs), (i32 IntRegs:$Rt)), IntRegs:$Rt)), 4314*9880d681SAndroid Build Coastguard Worker (C2_bitsset IntRegs:$Rs, IntRegs:$Rt)>; 4315*9880d681SAndroid Build Coastguard Worker 4316*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4317*9880d681SAndroid Build Coastguard Worker// STYPE/BIT - 4318*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4319*9880d681SAndroid Build Coastguard Worker 4320*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4321*9880d681SAndroid Build Coastguard Worker// STYPE/COMPLEX + 4322*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4323*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4324*9880d681SAndroid Build Coastguard Worker// STYPE/COMPLEX - 4325*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4326*9880d681SAndroid Build Coastguard Worker 4327*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4328*9880d681SAndroid Build Coastguard Worker// XTYPE/PERM + 4329*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4330*9880d681SAndroid Build Coastguard Worker 4331*9880d681SAndroid Build Coastguard Workerdef: Pat<(or (or (shl (or (shl (i32 (extloadi8 (add (i32 IntRegs:$b), 3))), 4332*9880d681SAndroid Build Coastguard Worker (i32 8)), 4333*9880d681SAndroid Build Coastguard Worker (i32 (zextloadi8 (add (i32 IntRegs:$b), 2)))), 4334*9880d681SAndroid Build Coastguard Worker (i32 16)), 4335*9880d681SAndroid Build Coastguard Worker (shl (i32 (zextloadi8 (add (i32 IntRegs:$b), 1))), (i32 8))), 4336*9880d681SAndroid Build Coastguard Worker (zextloadi8 (i32 IntRegs:$b))), 4337*9880d681SAndroid Build Coastguard Worker (A2_swiz (L2_loadri_io IntRegs:$b, 0))>; 4338*9880d681SAndroid Build Coastguard Worker 4339*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4340*9880d681SAndroid Build Coastguard Worker// XTYPE/PERM - 4341*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4342*9880d681SAndroid Build Coastguard Worker 4343*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4344*9880d681SAndroid Build Coastguard Worker// STYPE/PRED + 4345*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4346*9880d681SAndroid Build Coastguard Worker 4347*9880d681SAndroid Build Coastguard Worker// Predicate transfer. 4348*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, hasNewValue = 1 in 4349*9880d681SAndroid Build Coastguard Workerdef C2_tfrpr : SInst<(outs IntRegs:$Rd), (ins PredRegs:$Ps), 4350*9880d681SAndroid Build Coastguard Worker "$Rd = $Ps", [], "", S_2op_tc_1_SLOT23> { 4351*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 4352*9880d681SAndroid Build Coastguard Worker bits<2> Ps; 4353*9880d681SAndroid Build Coastguard Worker 4354*9880d681SAndroid Build Coastguard Worker let IClass = 0b1000; 4355*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1001; 4356*9880d681SAndroid Build Coastguard Worker let Inst{22} = 0b1; 4357*9880d681SAndroid Build Coastguard Worker let Inst{17-16} = Ps; 4358*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 4359*9880d681SAndroid Build Coastguard Worker} 4360*9880d681SAndroid Build Coastguard Worker 4361*9880d681SAndroid Build Coastguard Worker// Transfer general register to predicate. 4362*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 4363*9880d681SAndroid Build Coastguard Workerdef C2_tfrrp: SInst<(outs PredRegs:$Pd), (ins IntRegs:$Rs), 4364*9880d681SAndroid Build Coastguard Worker "$Pd = $Rs", [], "", S_2op_tc_2early_SLOT23> { 4365*9880d681SAndroid Build Coastguard Worker bits<2> Pd; 4366*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 4367*9880d681SAndroid Build Coastguard Worker 4368*9880d681SAndroid Build Coastguard Worker let IClass = 0b1000; 4369*9880d681SAndroid Build Coastguard Worker let Inst{27-21} = 0b0101010; 4370*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 4371*9880d681SAndroid Build Coastguard Worker let Inst{1-0} = Pd; 4372*9880d681SAndroid Build Coastguard Worker} 4373*9880d681SAndroid Build Coastguard Worker 4374*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, isCodeGenOnly = 1 in 4375*9880d681SAndroid Build Coastguard Workerdef C2_pxfer_map: SInst<(outs PredRegs:$dst), (ins PredRegs:$src), 4376*9880d681SAndroid Build Coastguard Worker "$dst = $src">; 4377*9880d681SAndroid Build Coastguard Worker 4378*9880d681SAndroid Build Coastguard Worker 4379*9880d681SAndroid Build Coastguard Worker// Patterns for loads of i1: 4380*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (load AddrFI:$fi)), 4381*9880d681SAndroid Build Coastguard Worker (C2_tfrrp (L2_loadrub_io AddrFI:$fi, 0))>; 4382*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (load (add (i32 IntRegs:$Rs), s32ImmPred:$Off))), 4383*9880d681SAndroid Build Coastguard Worker (C2_tfrrp (L2_loadrub_io IntRegs:$Rs, imm:$Off))>; 4384*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (load (i32 IntRegs:$Rs))), 4385*9880d681SAndroid Build Coastguard Worker (C2_tfrrp (L2_loadrub_io IntRegs:$Rs, 0))>; 4386*9880d681SAndroid Build Coastguard Worker 4387*9880d681SAndroid Build Coastguard Workerdef I1toI32: OutPatFrag<(ops node:$Rs), 4388*9880d681SAndroid Build Coastguard Worker (C2_muxii (i1 $Rs), 1, 0)>; 4389*9880d681SAndroid Build Coastguard Worker 4390*9880d681SAndroid Build Coastguard Workerdef I32toI1: OutPatFrag<(ops node:$Rs), 4391*9880d681SAndroid Build Coastguard Worker (i1 (C2_tfrrp (i32 $Rs)))>; 4392*9880d681SAndroid Build Coastguard Worker 4393*9880d681SAndroid Build Coastguard Workerdefm: Storexm_pat<store, I1, s32ImmPred, I1toI32, S2_storerb_io>; 4394*9880d681SAndroid Build Coastguard Workerdef: Storexm_simple_pat<store, I1, I1toI32, S2_storerb_io>; 4395*9880d681SAndroid Build Coastguard Worker 4396*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4397*9880d681SAndroid Build Coastguard Worker// STYPE/PRED - 4398*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4399*9880d681SAndroid Build Coastguard Worker 4400*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4401*9880d681SAndroid Build Coastguard Worker// STYPE/SHIFT + 4402*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4403*9880d681SAndroid Build Coastguard Workerclass S_2OpInstImm<string Mnemonic, bits<3>MajOp, bits<3>MinOp, 4404*9880d681SAndroid Build Coastguard Worker Operand Imm, list<dag> pattern = [], bit isRnd = 0> 4405*9880d681SAndroid Build Coastguard Worker : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, Imm:$src2), 4406*9880d681SAndroid Build Coastguard Worker "$dst = "#Mnemonic#"($src1, #$src2)"#!if(isRnd, ":rnd", ""), 4407*9880d681SAndroid Build Coastguard Worker pattern> { 4408*9880d681SAndroid Build Coastguard Worker bits<5> src1; 4409*9880d681SAndroid Build Coastguard Worker bits<5> dst; 4410*9880d681SAndroid Build Coastguard Worker let IClass = 0b1000; 4411*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0; 4412*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MajOp; 4413*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src1; 4414*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = MinOp; 4415*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 4416*9880d681SAndroid Build Coastguard Worker} 4417*9880d681SAndroid Build Coastguard Worker 4418*9880d681SAndroid Build Coastguard Workerclass S_2OpInstImmI6<string Mnemonic, SDNode OpNode, bits<3>MinOp> 4419*9880d681SAndroid Build Coastguard Worker : S_2OpInstImm<Mnemonic, 0b000, MinOp, u6Imm, 4420*9880d681SAndroid Build Coastguard Worker [(set (i64 DoubleRegs:$dst), (OpNode (i64 DoubleRegs:$src1), 4421*9880d681SAndroid Build Coastguard Worker u6ImmPred:$src2))]> { 4422*9880d681SAndroid Build Coastguard Worker bits<6> src2; 4423*9880d681SAndroid Build Coastguard Worker let Inst{13-8} = src2; 4424*9880d681SAndroid Build Coastguard Worker} 4425*9880d681SAndroid Build Coastguard Worker 4426*9880d681SAndroid Build Coastguard Worker// Shift by immediate. 4427*9880d681SAndroid Build Coastguard Workerdef S2_asr_i_p : S_2OpInstImmI6<"asr", sra, 0b000>; 4428*9880d681SAndroid Build Coastguard Workerdef S2_asl_i_p : S_2OpInstImmI6<"asl", shl, 0b010>; 4429*9880d681SAndroid Build Coastguard Workerdef S2_lsr_i_p : S_2OpInstImmI6<"lsr", srl, 0b001>; 4430*9880d681SAndroid Build Coastguard Worker 4431*9880d681SAndroid Build Coastguard Worker// Shift left by small amount and add. 4432*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 100, hasNewValue = 1, hasSideEffects = 0 in 4433*9880d681SAndroid Build Coastguard Workerdef S2_addasl_rrri: SInst <(outs IntRegs:$Rd), 4434*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$Rt, IntRegs:$Rs, u3Imm:$u3), 4435*9880d681SAndroid Build Coastguard Worker "$Rd = addasl($Rt, $Rs, #$u3)" , 4436*9880d681SAndroid Build Coastguard Worker [(set (i32 IntRegs:$Rd), (add (i32 IntRegs:$Rt), 4437*9880d681SAndroid Build Coastguard Worker (shl (i32 IntRegs:$Rs), u3ImmPred:$u3)))], 4438*9880d681SAndroid Build Coastguard Worker "", S_3op_tc_2_SLOT23> { 4439*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 4440*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 4441*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 4442*9880d681SAndroid Build Coastguard Worker bits<3> u3; 4443*9880d681SAndroid Build Coastguard Worker 4444*9880d681SAndroid Build Coastguard Worker let IClass = 0b1100; 4445*9880d681SAndroid Build Coastguard Worker 4446*9880d681SAndroid Build Coastguard Worker let Inst{27-21} = 0b0100000; 4447*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 4448*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 4449*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 4450*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = u3; 4451*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 4452*9880d681SAndroid Build Coastguard Worker } 4453*9880d681SAndroid Build Coastguard Worker 4454*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4455*9880d681SAndroid Build Coastguard Worker// STYPE/SHIFT - 4456*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4457*9880d681SAndroid Build Coastguard Worker 4458*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4459*9880d681SAndroid Build Coastguard Worker// STYPE/VH + 4460*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4461*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4462*9880d681SAndroid Build Coastguard Worker// STYPE/VH - 4463*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4464*9880d681SAndroid Build Coastguard Worker 4465*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4466*9880d681SAndroid Build Coastguard Worker// STYPE/VW + 4467*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4468*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4469*9880d681SAndroid Build Coastguard Worker// STYPE/VW - 4470*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4471*9880d681SAndroid Build Coastguard Worker 4472*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4473*9880d681SAndroid Build Coastguard Worker// SYSTEM/SUPER + 4474*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4475*9880d681SAndroid Build Coastguard Worker 4476*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4477*9880d681SAndroid Build Coastguard Worker// SYSTEM/USER + 4478*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4479*9880d681SAndroid Build Coastguard Workerdef HexagonBARRIER: SDNode<"HexagonISD::BARRIER", SDTNone, [SDNPHasChain]>; 4480*9880d681SAndroid Build Coastguard Worker 4481*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 1, isSoloAX = 1 in 4482*9880d681SAndroid Build Coastguard Workerdef Y2_barrier : SYSInst<(outs), (ins), 4483*9880d681SAndroid Build Coastguard Worker "barrier", 4484*9880d681SAndroid Build Coastguard Worker [(HexagonBARRIER)],"",ST_tc_st_SLOT0> { 4485*9880d681SAndroid Build Coastguard Worker let Inst{31-28} = 0b1010; 4486*9880d681SAndroid Build Coastguard Worker let Inst{27-21} = 0b1000000; 4487*9880d681SAndroid Build Coastguard Worker} 4488*9880d681SAndroid Build Coastguard Worker 4489*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4490*9880d681SAndroid Build Coastguard Worker// SYSTEM/SUPER - 4491*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4492*9880d681SAndroid Build Coastguard Worker 4493*9880d681SAndroid Build Coastguard Worker// Generate frameindex addresses. The main reason for the offset operand is 4494*9880d681SAndroid Build Coastguard Worker// that every instruction that is allowed to have frame index as an operand 4495*9880d681SAndroid Build Coastguard Worker// will then have that operand followed by an immediate operand (the offset). 4496*9880d681SAndroid Build Coastguard Worker// This simplifies the frame-index elimination code. 4497*9880d681SAndroid Build Coastguard Worker// 4498*9880d681SAndroid Build Coastguard Workerlet isMoveImm = 1, isAsCheapAsAMove = 1, isReMaterializable = 1, 4499*9880d681SAndroid Build Coastguard Worker isPseudo = 1, isCodeGenOnly = 1, hasSideEffects = 0 in { 4500*9880d681SAndroid Build Coastguard Worker def TFR_FI : ALU32_ri<(outs IntRegs:$Rd), 4501*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$fi, s32Imm:$off), "">; 4502*9880d681SAndroid Build Coastguard Worker def TFR_FIA : ALU32_ri<(outs IntRegs:$Rd), 4503*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$Rs, IntRegs:$fi, s32Imm:$off), "">; 4504*9880d681SAndroid Build Coastguard Worker} 4505*9880d681SAndroid Build Coastguard Worker 4506*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4507*9880d681SAndroid Build Coastguard Worker// CRUSER - Type. 4508*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4509*9880d681SAndroid Build Coastguard Worker// HW loop 4510*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, isExtentSigned = 1, opExtentBits = 9, opExtentAlign = 2, 4511*9880d681SAndroid Build Coastguard Worker opExtendable = 0, hasSideEffects = 0 in 4512*9880d681SAndroid Build Coastguard Workerclass LOOP_iBase<string mnemonic, Operand brOp, bit mustExtend = 0> 4513*9880d681SAndroid Build Coastguard Worker : CRInst<(outs), (ins brOp:$offset, u10Imm:$src2), 4514*9880d681SAndroid Build Coastguard Worker #mnemonic#"($offset, #$src2)", 4515*9880d681SAndroid Build Coastguard Worker [], "" , CR_tc_3x_SLOT3> { 4516*9880d681SAndroid Build Coastguard Worker bits<9> offset; 4517*9880d681SAndroid Build Coastguard Worker bits<10> src2; 4518*9880d681SAndroid Build Coastguard Worker 4519*9880d681SAndroid Build Coastguard Worker let IClass = 0b0110; 4520*9880d681SAndroid Build Coastguard Worker 4521*9880d681SAndroid Build Coastguard Worker let Inst{27-22} = 0b100100; 4522*9880d681SAndroid Build Coastguard Worker let Inst{21} = !if (!eq(mnemonic, "loop0"), 0b0, 0b1); 4523*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src2{9-5}; 4524*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = offset{8-4}; 4525*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = src2{4-2}; 4526*9880d681SAndroid Build Coastguard Worker let Inst{4-3} = offset{3-2}; 4527*9880d681SAndroid Build Coastguard Worker let Inst{1-0} = src2{1-0}; 4528*9880d681SAndroid Build Coastguard Worker} 4529*9880d681SAndroid Build Coastguard Worker 4530*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, isExtentSigned = 1, opExtentBits = 9, opExtentAlign = 2, 4531*9880d681SAndroid Build Coastguard Worker opExtendable = 0, hasSideEffects = 0 in 4532*9880d681SAndroid Build Coastguard Workerclass LOOP_rBase<string mnemonic, Operand brOp, bit mustExtend = 0> 4533*9880d681SAndroid Build Coastguard Worker : CRInst<(outs), (ins brOp:$offset, IntRegs:$src2), 4534*9880d681SAndroid Build Coastguard Worker #mnemonic#"($offset, $src2)", 4535*9880d681SAndroid Build Coastguard Worker [], "" ,CR_tc_3x_SLOT3> { 4536*9880d681SAndroid Build Coastguard Worker bits<9> offset; 4537*9880d681SAndroid Build Coastguard Worker bits<5> src2; 4538*9880d681SAndroid Build Coastguard Worker 4539*9880d681SAndroid Build Coastguard Worker let IClass = 0b0110; 4540*9880d681SAndroid Build Coastguard Worker 4541*9880d681SAndroid Build Coastguard Worker let Inst{27-22} = 0b000000; 4542*9880d681SAndroid Build Coastguard Worker let Inst{21} = !if (!eq(mnemonic, "loop0"), 0b0, 0b1); 4543*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src2; 4544*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = offset{8-4}; 4545*9880d681SAndroid Build Coastguard Worker let Inst{4-3} = offset{3-2}; 4546*9880d681SAndroid Build Coastguard Worker } 4547*9880d681SAndroid Build Coastguard Worker 4548*9880d681SAndroid Build Coastguard Workermulticlass LOOP_ri<string mnemonic> { 4549*9880d681SAndroid Build Coastguard Worker def i : LOOP_iBase<mnemonic, brtarget>; 4550*9880d681SAndroid Build Coastguard Worker def r : LOOP_rBase<mnemonic, brtarget>; 4551*9880d681SAndroid Build Coastguard Worker 4552*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1, isExtended = 1, opExtendable = 0 in { 4553*9880d681SAndroid Build Coastguard Worker def iext: LOOP_iBase<mnemonic, brtargetExt, 1>; 4554*9880d681SAndroid Build Coastguard Worker def rext: LOOP_rBase<mnemonic, brtargetExt, 1>; 4555*9880d681SAndroid Build Coastguard Worker } 4556*9880d681SAndroid Build Coastguard Worker} 4557*9880d681SAndroid Build Coastguard Worker 4558*9880d681SAndroid Build Coastguard Worker 4559*9880d681SAndroid Build Coastguard Workerlet Defs = [SA0, LC0, USR] in 4560*9880d681SAndroid Build Coastguard Workerdefm J2_loop0 : LOOP_ri<"loop0">; 4561*9880d681SAndroid Build Coastguard Worker 4562*9880d681SAndroid Build Coastguard Worker// Interestingly only loop0's appear to set usr.lpcfg 4563*9880d681SAndroid Build Coastguard Workerlet Defs = [SA1, LC1] in 4564*9880d681SAndroid Build Coastguard Workerdefm J2_loop1 : LOOP_ri<"loop1">; 4565*9880d681SAndroid Build Coastguard Worker 4566*9880d681SAndroid Build Coastguard Workerlet isBranch = 1, isTerminator = 1, hasSideEffects = 0, 4567*9880d681SAndroid Build Coastguard Worker Defs = [PC, LC0], Uses = [SA0, LC0] in { 4568*9880d681SAndroid Build Coastguard Workerdef ENDLOOP0 : Endloop<(outs), (ins brtarget:$offset), 4569*9880d681SAndroid Build Coastguard Worker ":endloop0", 4570*9880d681SAndroid Build Coastguard Worker []>; 4571*9880d681SAndroid Build Coastguard Worker} 4572*9880d681SAndroid Build Coastguard Worker 4573*9880d681SAndroid Build Coastguard Workerlet isBranch = 1, isTerminator = 1, hasSideEffects = 0, 4574*9880d681SAndroid Build Coastguard Worker Defs = [PC, LC1], Uses = [SA1, LC1] in { 4575*9880d681SAndroid Build Coastguard Workerdef ENDLOOP1 : Endloop<(outs), (ins brtarget:$offset), 4576*9880d681SAndroid Build Coastguard Worker ":endloop1", 4577*9880d681SAndroid Build Coastguard Worker []>; 4578*9880d681SAndroid Build Coastguard Worker} 4579*9880d681SAndroid Build Coastguard Worker 4580*9880d681SAndroid Build Coastguard Worker// Pipelined loop instructions, sp[123]loop0 4581*9880d681SAndroid Build Coastguard Workerlet Defs = [LC0, SA0, P3, USR], hasSideEffects = 0, 4582*9880d681SAndroid Build Coastguard Worker isExtentSigned = 1, isExtendable = 1, opExtentBits = 9, opExtentAlign = 2, 4583*9880d681SAndroid Build Coastguard Worker opExtendable = 0, isPredicateLate = 1 in 4584*9880d681SAndroid Build Coastguard Workerclass SPLOOP_iBase<string SP, bits<2> op> 4585*9880d681SAndroid Build Coastguard Worker : CRInst <(outs), (ins brtarget:$r7_2, u10Imm:$U10), 4586*9880d681SAndroid Build Coastguard Worker "p3 = sp"#SP#"loop0($r7_2, #$U10)" > { 4587*9880d681SAndroid Build Coastguard Worker bits<9> r7_2; 4588*9880d681SAndroid Build Coastguard Worker bits<10> U10; 4589*9880d681SAndroid Build Coastguard Worker 4590*9880d681SAndroid Build Coastguard Worker let IClass = 0b0110; 4591*9880d681SAndroid Build Coastguard Worker 4592*9880d681SAndroid Build Coastguard Worker let Inst{22-21} = op; 4593*9880d681SAndroid Build Coastguard Worker let Inst{27-23} = 0b10011; 4594*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = U10{9-5}; 4595*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = r7_2{8-4}; 4596*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = U10{4-2}; 4597*9880d681SAndroid Build Coastguard Worker let Inst{4-3} = r7_2{3-2}; 4598*9880d681SAndroid Build Coastguard Worker let Inst{1-0} = U10{1-0}; 4599*9880d681SAndroid Build Coastguard Worker } 4600*9880d681SAndroid Build Coastguard Worker 4601*9880d681SAndroid Build Coastguard Workerlet Defs = [LC0, SA0, P3, USR], hasSideEffects = 0, 4602*9880d681SAndroid Build Coastguard Worker isExtentSigned = 1, isExtendable = 1, opExtentBits = 9, opExtentAlign = 2, 4603*9880d681SAndroid Build Coastguard Worker opExtendable = 0, isPredicateLate = 1 in 4604*9880d681SAndroid Build Coastguard Workerclass SPLOOP_rBase<string SP, bits<2> op> 4605*9880d681SAndroid Build Coastguard Worker : CRInst <(outs), (ins brtarget:$r7_2, IntRegs:$Rs), 4606*9880d681SAndroid Build Coastguard Worker "p3 = sp"#SP#"loop0($r7_2, $Rs)" > { 4607*9880d681SAndroid Build Coastguard Worker bits<9> r7_2; 4608*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 4609*9880d681SAndroid Build Coastguard Worker 4610*9880d681SAndroid Build Coastguard Worker let IClass = 0b0110; 4611*9880d681SAndroid Build Coastguard Worker 4612*9880d681SAndroid Build Coastguard Worker let Inst{22-21} = op; 4613*9880d681SAndroid Build Coastguard Worker let Inst{27-23} = 0b00001; 4614*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 4615*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = r7_2{8-4}; 4616*9880d681SAndroid Build Coastguard Worker let Inst{4-3} = r7_2{3-2}; 4617*9880d681SAndroid Build Coastguard Worker } 4618*9880d681SAndroid Build Coastguard Worker 4619*9880d681SAndroid Build Coastguard Workermulticlass SPLOOP_ri<string mnemonic, bits<2> op> { 4620*9880d681SAndroid Build Coastguard Worker def i : SPLOOP_iBase<mnemonic, op>; 4621*9880d681SAndroid Build Coastguard Worker def r : SPLOOP_rBase<mnemonic, op>; 4622*9880d681SAndroid Build Coastguard Worker} 4623*9880d681SAndroid Build Coastguard Worker 4624*9880d681SAndroid Build Coastguard Workerdefm J2_ploop1s : SPLOOP_ri<"1", 0b01>; 4625*9880d681SAndroid Build Coastguard Workerdefm J2_ploop2s : SPLOOP_ri<"2", 0b10>; 4626*9880d681SAndroid Build Coastguard Workerdefm J2_ploop3s : SPLOOP_ri<"3", 0b11>; 4627*9880d681SAndroid Build Coastguard Worker 4628*9880d681SAndroid Build Coastguard Worker// if (Rs[!>=<]=#0) jump:[t/nt] 4629*9880d681SAndroid Build Coastguard Workerlet Defs = [PC], isPredicated = 1, isBranch = 1, hasSideEffects = 0, 4630*9880d681SAndroid Build Coastguard Worker hasSideEffects = 0 in 4631*9880d681SAndroid Build Coastguard Workerclass J2_jump_0_Base<string compare, bit isTak, bits<2> op> 4632*9880d681SAndroid Build Coastguard Worker : CRInst <(outs), (ins IntRegs:$Rs, brtarget:$r13_2), 4633*9880d681SAndroid Build Coastguard Worker "if ($Rs"#compare#"#0) jump"#!if(isTak, ":t", ":nt")#" $r13_2" > { 4634*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 4635*9880d681SAndroid Build Coastguard Worker bits<15> r13_2; 4636*9880d681SAndroid Build Coastguard Worker 4637*9880d681SAndroid Build Coastguard Worker let IClass = 0b0110; 4638*9880d681SAndroid Build Coastguard Worker 4639*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0001; 4640*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = op; 4641*9880d681SAndroid Build Coastguard Worker let Inst{12} = isTak; 4642*9880d681SAndroid Build Coastguard Worker let Inst{21} = r13_2{14}; 4643*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 4644*9880d681SAndroid Build Coastguard Worker let Inst{11-1} = r13_2{12-2}; 4645*9880d681SAndroid Build Coastguard Worker let Inst{13} = r13_2{13}; 4646*9880d681SAndroid Build Coastguard Worker } 4647*9880d681SAndroid Build Coastguard Worker 4648*9880d681SAndroid Build Coastguard Workermulticlass J2_jump_compare_0<string compare, bits<2> op> { 4649*9880d681SAndroid Build Coastguard Worker def NAME : J2_jump_0_Base<compare, 0, op>; 4650*9880d681SAndroid Build Coastguard Worker def NAME#pt : J2_jump_0_Base<compare, 1, op>; 4651*9880d681SAndroid Build Coastguard Worker} 4652*9880d681SAndroid Build Coastguard Worker 4653*9880d681SAndroid Build Coastguard Workerdefm J2_jumprz : J2_jump_compare_0<"!=", 0b00>; 4654*9880d681SAndroid Build Coastguard Workerdefm J2_jumprgtez : J2_jump_compare_0<">=", 0b01>; 4655*9880d681SAndroid Build Coastguard Workerdefm J2_jumprnz : J2_jump_compare_0<"==", 0b10>; 4656*9880d681SAndroid Build Coastguard Workerdefm J2_jumprltez : J2_jump_compare_0<"<=", 0b11>; 4657*9880d681SAndroid Build Coastguard Worker 4658*9880d681SAndroid Build Coastguard Worker// Transfer to/from Control/GPR Guest/GPR 4659*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 4660*9880d681SAndroid Build Coastguard Workerclass TFR_CR_RS_base<RegisterClass CTRC, RegisterClass RC, bit isDouble> 4661*9880d681SAndroid Build Coastguard Worker : CRInst <(outs CTRC:$dst), (ins RC:$src), 4662*9880d681SAndroid Build Coastguard Worker "$dst = $src", [], "", CR_tc_3x_SLOT3> { 4663*9880d681SAndroid Build Coastguard Worker bits<5> dst; 4664*9880d681SAndroid Build Coastguard Worker bits<5> src; 4665*9880d681SAndroid Build Coastguard Worker 4666*9880d681SAndroid Build Coastguard Worker let IClass = 0b0110; 4667*9880d681SAndroid Build Coastguard Worker 4668*9880d681SAndroid Build Coastguard Worker let Inst{27-25} = 0b001; 4669*9880d681SAndroid Build Coastguard Worker let Inst{24} = isDouble; 4670*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = 0b001; 4671*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src; 4672*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 4673*9880d681SAndroid Build Coastguard Worker } 4674*9880d681SAndroid Build Coastguard Worker 4675*9880d681SAndroid Build Coastguard Workerdef A2_tfrrcr : TFR_CR_RS_base<CtrRegs, IntRegs, 0b0>; 4676*9880d681SAndroid Build Coastguard Workerdef A4_tfrpcp : TFR_CR_RS_base<CtrRegs64, DoubleRegs, 0b1>; 4677*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"m0 = $Rs", (A2_tfrrcr C6, IntRegs:$Rs)>; 4678*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"m1 = $Rs", (A2_tfrrcr C7, IntRegs:$Rs)>; 4679*9880d681SAndroid Build Coastguard Worker 4680*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 4681*9880d681SAndroid Build Coastguard Workerclass TFR_RD_CR_base<RegisterClass RC, RegisterClass CTRC, bit isSingle> 4682*9880d681SAndroid Build Coastguard Worker : CRInst <(outs RC:$dst), (ins CTRC:$src), 4683*9880d681SAndroid Build Coastguard Worker "$dst = $src", [], "", CR_tc_3x_SLOT3> { 4684*9880d681SAndroid Build Coastguard Worker bits<5> dst; 4685*9880d681SAndroid Build Coastguard Worker bits<5> src; 4686*9880d681SAndroid Build Coastguard Worker 4687*9880d681SAndroid Build Coastguard Worker let IClass = 0b0110; 4688*9880d681SAndroid Build Coastguard Worker 4689*9880d681SAndroid Build Coastguard Worker let Inst{27-26} = 0b10; 4690*9880d681SAndroid Build Coastguard Worker let Inst{25} = isSingle; 4691*9880d681SAndroid Build Coastguard Worker let Inst{24-21} = 0b0000; 4692*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src; 4693*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 4694*9880d681SAndroid Build Coastguard Worker } 4695*9880d681SAndroid Build Coastguard Worker 4696*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, opNewValue = 0 in 4697*9880d681SAndroid Build Coastguard Workerdef A2_tfrcrr : TFR_RD_CR_base<IntRegs, CtrRegs, 1>; 4698*9880d681SAndroid Build Coastguard Workerdef A4_tfrcpp : TFR_RD_CR_base<DoubleRegs, CtrRegs64, 0>; 4699*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"$Rd = m0", (A2_tfrcrr IntRegs:$Rd, C6)>; 4700*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"$Rd = m1", (A2_tfrcrr IntRegs:$Rd, C7)>; 4701*9880d681SAndroid Build Coastguard Worker 4702*9880d681SAndroid Build Coastguard Worker// Y4_trace: Send value to etm trace. 4703*9880d681SAndroid Build Coastguard Workerlet isSoloAX = 1, hasSideEffects = 0 in 4704*9880d681SAndroid Build Coastguard Workerdef Y4_trace: CRInst <(outs), (ins IntRegs:$Rs), 4705*9880d681SAndroid Build Coastguard Worker "trace($Rs)"> { 4706*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 4707*9880d681SAndroid Build Coastguard Worker 4708*9880d681SAndroid Build Coastguard Worker let IClass = 0b0110; 4709*9880d681SAndroid Build Coastguard Worker let Inst{27-21} = 0b0010010; 4710*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 4711*9880d681SAndroid Build Coastguard Worker } 4712*9880d681SAndroid Build Coastguard Worker 4713*9880d681SAndroid Build Coastguard Worker// Support for generating global address. 4714*9880d681SAndroid Build Coastguard Worker// Taken from X86InstrInfo.td. 4715*9880d681SAndroid Build Coastguard Workerdef SDTHexagonCONST32 : SDTypeProfile<1, 1, [SDTCisVT<0, i32>, 4716*9880d681SAndroid Build Coastguard Worker SDTCisVT<1, i32>, 4717*9880d681SAndroid Build Coastguard Worker SDTCisPtrTy<0>]>; 4718*9880d681SAndroid Build Coastguard Workerdef HexagonCONST32 : SDNode<"HexagonISD::CONST32", SDTHexagonCONST32>; 4719*9880d681SAndroid Build Coastguard Workerdef HexagonCONST32_GP : SDNode<"HexagonISD::CONST32_GP", SDTHexagonCONST32>; 4720*9880d681SAndroid Build Coastguard Worker 4721*9880d681SAndroid Build Coastguard Worker// HI/LO Instructions 4722*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isMoveImm = 1, hasSideEffects = 0, 4723*9880d681SAndroid Build Coastguard Worker hasNewValue = 1, opNewValue = 0 in 4724*9880d681SAndroid Build Coastguard Workerclass REG_IMMED<string RegHalf, string Op, bit Rs, bits<3> MajOp, bit MinOp> 4725*9880d681SAndroid Build Coastguard Worker : ALU32_ri<(outs IntRegs:$dst), 4726*9880d681SAndroid Build Coastguard Worker (ins i32imm:$imm_value), 4727*9880d681SAndroid Build Coastguard Worker "$dst"#RegHalf#" = #"#Op#"($imm_value)", []> { 4728*9880d681SAndroid Build Coastguard Worker bits<5> dst; 4729*9880d681SAndroid Build Coastguard Worker bits<32> imm_value; 4730*9880d681SAndroid Build Coastguard Worker let IClass = 0b0111; 4731*9880d681SAndroid Build Coastguard Worker 4732*9880d681SAndroid Build Coastguard Worker let Inst{27} = Rs; 4733*9880d681SAndroid Build Coastguard Worker let Inst{26-24} = MajOp; 4734*9880d681SAndroid Build Coastguard Worker let Inst{21} = MinOp; 4735*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = dst; 4736*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = !if (!eq(Op, "LO"), imm_value{15-14}, imm_value{31-30}); 4737*9880d681SAndroid Build Coastguard Worker let Inst{13-0} = !if (!eq(Op, "LO"), imm_value{13-0}, imm_value{29-16}); 4738*9880d681SAndroid Build Coastguard Worker} 4739*9880d681SAndroid Build Coastguard Worker 4740*9880d681SAndroid Build Coastguard Workerlet isAsmParserOnly = 1 in { 4741*9880d681SAndroid Build Coastguard Worker def LO : REG_IMMED<".l", "LO", 0b0, 0b001, 0b1>; 4742*9880d681SAndroid Build Coastguard Worker def LO_H : REG_IMMED<".l", "HI", 0b0, 0b001, 0b1>; 4743*9880d681SAndroid Build Coastguard Worker def HI : REG_IMMED<".h", "HI", 0b0, 0b010, 0b1>; 4744*9880d681SAndroid Build Coastguard Worker def HI_L : REG_IMMED<".h", "LO", 0b0, 0b010, 0b1>; 4745*9880d681SAndroid Build Coastguard Worker} 4746*9880d681SAndroid Build Coastguard Worker 4747*9880d681SAndroid Build Coastguard Workerlet isMoveImm = 1, isCodeGenOnly = 1 in 4748*9880d681SAndroid Build Coastguard Workerdef LO_PIC : ALU32_ri<(outs IntRegs:$dst), (ins bblabel:$label), 4749*9880d681SAndroid Build Coastguard Worker "$dst.l = #LO($label@GOTREL)", 4750*9880d681SAndroid Build Coastguard Worker []>; 4751*9880d681SAndroid Build Coastguard Worker 4752*9880d681SAndroid Build Coastguard Workerlet isMoveImm = 1, isCodeGenOnly = 1 in 4753*9880d681SAndroid Build Coastguard Workerdef HI_PIC : ALU32_ri<(outs IntRegs:$dst), (ins bblabel:$label), 4754*9880d681SAndroid Build Coastguard Worker "$dst.h = #HI($label@GOTREL)", 4755*9880d681SAndroid Build Coastguard Worker []>; 4756*9880d681SAndroid Build Coastguard Worker 4757*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isMoveImm = 1, 4758*9880d681SAndroid Build Coastguard Worker isCodeGenOnly = 1, hasSideEffects = 0 in 4759*9880d681SAndroid Build Coastguard Workerdef HI_GOT : ALU32_ri<(outs IntRegs:$dst), (ins globaladdress:$global), 4760*9880d681SAndroid Build Coastguard Worker "$dst.h = #HI($global@GOT)", 4761*9880d681SAndroid Build Coastguard Worker []>; 4762*9880d681SAndroid Build Coastguard Worker 4763*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isMoveImm = 1, 4764*9880d681SAndroid Build Coastguard Worker isCodeGenOnly = 1, hasSideEffects = 0 in 4765*9880d681SAndroid Build Coastguard Workerdef LO_GOT : ALU32_ri<(outs IntRegs:$dst), (ins globaladdress:$global), 4766*9880d681SAndroid Build Coastguard Worker "$dst.l = #LO($global@GOT)", 4767*9880d681SAndroid Build Coastguard Worker []>; 4768*9880d681SAndroid Build Coastguard Worker 4769*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isMoveImm = 1, 4770*9880d681SAndroid Build Coastguard Worker isCodeGenOnly = 1, hasSideEffects = 0 in 4771*9880d681SAndroid Build Coastguard Workerdef HI_GOTREL : ALU32_ri<(outs IntRegs:$dst), (ins globaladdress:$global), 4772*9880d681SAndroid Build Coastguard Worker "$dst.h = #HI($global@GOTREL)", 4773*9880d681SAndroid Build Coastguard Worker []>; 4774*9880d681SAndroid Build Coastguard Worker 4775*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isMoveImm = 1, 4776*9880d681SAndroid Build Coastguard Worker isCodeGenOnly = 1, hasSideEffects = 0 in 4777*9880d681SAndroid Build Coastguard Workerdef LO_GOTREL : ALU32_ri<(outs IntRegs:$dst), (ins globaladdress:$global), 4778*9880d681SAndroid Build Coastguard Worker "$dst.l = #LO($global@GOTREL)", 4779*9880d681SAndroid Build Coastguard Worker []>; 4780*9880d681SAndroid Build Coastguard Worker 4781*9880d681SAndroid Build Coastguard Worker// This pattern is incorrect. When we add small data, we should change 4782*9880d681SAndroid Build Coastguard Worker// this pattern to use memw(#foo). 4783*9880d681SAndroid Build Coastguard Worker// This is for sdata. 4784*9880d681SAndroid Build Coastguard Workerlet isMoveImm = 1, isAsmParserOnly = 1 in 4785*9880d681SAndroid Build Coastguard Workerdef CONST32 : CONSTLDInst<(outs IntRegs:$dst), (ins globaladdress:$global), 4786*9880d681SAndroid Build Coastguard Worker "$dst = CONST32(#$global)", 4787*9880d681SAndroid Build Coastguard Worker [(set (i32 IntRegs:$dst), 4788*9880d681SAndroid Build Coastguard Worker (load (HexagonCONST32 tglobaltlsaddr:$global)))]>; 4789*9880d681SAndroid Build Coastguard Worker 4790*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isMoveImm = 1, isAsmParserOnly = 1 in 4791*9880d681SAndroid Build Coastguard Workerdef CONST32_Int_Real : CONSTLDInst<(outs IntRegs:$dst), (ins i32imm:$global), 4792*9880d681SAndroid Build Coastguard Worker "$dst = CONST32(#$global)", 4793*9880d681SAndroid Build Coastguard Worker [(set (i32 IntRegs:$dst), imm:$global) ]>; 4794*9880d681SAndroid Build Coastguard Worker 4795*9880d681SAndroid Build Coastguard Worker// Map TLS addressses to a CONST32 instruction 4796*9880d681SAndroid Build Coastguard Workerdef: Pat<(HexagonCONST32 tglobaltlsaddr:$addr), (A2_tfrsi s16Ext:$addr)>; 4797*9880d681SAndroid Build Coastguard Workerdef: Pat<(HexagonCONST32 bbl:$label), (A2_tfrsi s16Ext:$label)>; 4798*9880d681SAndroid Build Coastguard Worker 4799*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isMoveImm = 1, isAsmParserOnly = 1 in 4800*9880d681SAndroid Build Coastguard Workerdef CONST64_Int_Real : CONSTLDInst<(outs DoubleRegs:$dst), (ins i64imm:$global), 4801*9880d681SAndroid Build Coastguard Worker "$dst = CONST64(#$global)", 4802*9880d681SAndroid Build Coastguard Worker [(set (i64 DoubleRegs:$dst), imm:$global)]>; 4803*9880d681SAndroid Build Coastguard Worker 4804*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, isReMaterializable = 1, isPseudo = 1, 4805*9880d681SAndroid Build Coastguard Worker isCodeGenOnly = 1 in 4806*9880d681SAndroid Build Coastguard Workerdef TFR_PdTrue : SInst<(outs PredRegs:$dst), (ins), "", 4807*9880d681SAndroid Build Coastguard Worker [(set (i1 PredRegs:$dst), 1)]>; 4808*9880d681SAndroid Build Coastguard Worker 4809*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, isReMaterializable = 1, isPseudo = 1, 4810*9880d681SAndroid Build Coastguard Worker isCodeGenOnly = 1 in 4811*9880d681SAndroid Build Coastguard Workerdef TFR_PdFalse : SInst<(outs PredRegs:$dst), (ins), "$dst = xor($dst, $dst)", 4812*9880d681SAndroid Build Coastguard Worker [(set (i1 PredRegs:$dst), 0)]>; 4813*9880d681SAndroid Build Coastguard Worker 4814*9880d681SAndroid Build Coastguard Worker// Pseudo instructions. 4815*9880d681SAndroid Build Coastguard Workerdef SDT_SPCallSeqStart : SDCallSeqStart<[ SDTCisVT<0, i32> ]>; 4816*9880d681SAndroid Build Coastguard Workerdef SDT_SPCallSeqEnd : SDCallSeqEnd<[ SDTCisVT<0, i32>, 4817*9880d681SAndroid Build Coastguard Worker SDTCisVT<1, i32> ]>; 4818*9880d681SAndroid Build Coastguard Worker 4819*9880d681SAndroid Build Coastguard Workerdef callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_SPCallSeqStart, 4820*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPOutGlue]>; 4821*9880d681SAndroid Build Coastguard Workerdef callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_SPCallSeqEnd, 4822*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>; 4823*9880d681SAndroid Build Coastguard Worker 4824*9880d681SAndroid Build Coastguard Workerdef SDT_SPCall : SDTypeProfile<0, 1, [SDTCisVT<0, i32>]>; 4825*9880d681SAndroid Build Coastguard Worker 4826*9880d681SAndroid Build Coastguard Worker// For tailcalls a HexagonTCRet SDNode has 3 SDNode Properties - a chain, 4827*9880d681SAndroid Build Coastguard Worker// Optional Flag and Variable Arguments. 4828*9880d681SAndroid Build Coastguard Worker// Its 1 Operand has pointer type. 4829*9880d681SAndroid Build Coastguard Workerdef HexagonTCRet : SDNode<"HexagonISD::TC_RETURN", SDT_SPCall, 4830*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>; 4831*9880d681SAndroid Build Coastguard Worker 4832*9880d681SAndroid Build Coastguard Workerlet Defs = [R29, R30], Uses = [R31, R30, R29], isPseudo = 1 in 4833*9880d681SAndroid Build Coastguard Workerdef ADJCALLSTACKDOWN : Pseudo<(outs), (ins i32imm:$amt), 4834*9880d681SAndroid Build Coastguard Worker ".error \"should not emit\" ", 4835*9880d681SAndroid Build Coastguard Worker [(callseq_start timm:$amt)]>; 4836*9880d681SAndroid Build Coastguard Worker 4837*9880d681SAndroid Build Coastguard Workerlet Defs = [R29, R30, R31], Uses = [R29], isPseudo = 1 in 4838*9880d681SAndroid Build Coastguard Workerdef ADJCALLSTACKUP : Pseudo<(outs), (ins i32imm:$amt1, i32imm:$amt2), 4839*9880d681SAndroid Build Coastguard Worker ".error \"should not emit\" ", 4840*9880d681SAndroid Build Coastguard Worker [(callseq_end timm:$amt1, timm:$amt2)]>; 4841*9880d681SAndroid Build Coastguard Worker 4842*9880d681SAndroid Build Coastguard Worker// Call subroutine indirectly. 4843*9880d681SAndroid Build Coastguard Workerlet Defs = VolatileV3.Regs in 4844*9880d681SAndroid Build Coastguard Workerdef J2_callr : JUMPR_MISC_CALLR<0, 1>; 4845*9880d681SAndroid Build Coastguard Worker 4846*9880d681SAndroid Build Coastguard Worker// Indirect tail-call. 4847*9880d681SAndroid Build Coastguard Workerlet isPseudo = 1, isCall = 1, isReturn = 1, isBarrier = 1, isPredicable = 0, 4848*9880d681SAndroid Build Coastguard Worker isTerminator = 1, isCodeGenOnly = 1 in 4849*9880d681SAndroid Build Coastguard Workerdef TCRETURNr : T_JMPr; 4850*9880d681SAndroid Build Coastguard Worker 4851*9880d681SAndroid Build Coastguard Worker// Direct tail-calls. 4852*9880d681SAndroid Build Coastguard Workerlet isPseudo = 1, isCall = 1, isReturn = 1, isBarrier = 1, isPredicable = 0, 4853*9880d681SAndroid Build Coastguard Worker isTerminator = 1, isCodeGenOnly = 1 in 4854*9880d681SAndroid Build Coastguard Workerdef TCRETURNi : JInst<(outs), (ins calltarget:$dst), "", []>; 4855*9880d681SAndroid Build Coastguard Worker 4856*9880d681SAndroid Build Coastguard Worker//Tail calls. 4857*9880d681SAndroid Build Coastguard Workerdef: Pat<(HexagonTCRet tglobaladdr:$dst), 4858*9880d681SAndroid Build Coastguard Worker (TCRETURNi tglobaladdr:$dst)>; 4859*9880d681SAndroid Build Coastguard Workerdef: Pat<(HexagonTCRet texternalsym:$dst), 4860*9880d681SAndroid Build Coastguard Worker (TCRETURNi texternalsym:$dst)>; 4861*9880d681SAndroid Build Coastguard Workerdef: Pat<(HexagonTCRet (i32 IntRegs:$dst)), 4862*9880d681SAndroid Build Coastguard Worker (TCRETURNr IntRegs:$dst)>; 4863*9880d681SAndroid Build Coastguard Worker 4864*9880d681SAndroid Build Coastguard Worker// Map from r0 = and(r1, 65535) to r0 = zxth(r1) 4865*9880d681SAndroid Build Coastguard Workerdef: Pat<(and (i32 IntRegs:$src1), 65535), 4866*9880d681SAndroid Build Coastguard Worker (A2_zxth IntRegs:$src1)>; 4867*9880d681SAndroid Build Coastguard Worker 4868*9880d681SAndroid Build Coastguard Worker// Map from r0 = and(r1, 255) to r0 = zxtb(r1). 4869*9880d681SAndroid Build Coastguard Workerdef: Pat<(and (i32 IntRegs:$src1), 255), 4870*9880d681SAndroid Build Coastguard Worker (A2_zxtb IntRegs:$src1)>; 4871*9880d681SAndroid Build Coastguard Worker 4872*9880d681SAndroid Build Coastguard Worker// Map Add(p1, true) to p1 = not(p1). 4873*9880d681SAndroid Build Coastguard Worker// Add(p1, false) should never be produced, 4874*9880d681SAndroid Build Coastguard Worker// if it does, it got to be mapped to NOOP. 4875*9880d681SAndroid Build Coastguard Workerdef: Pat<(add (i1 PredRegs:$src1), -1), 4876*9880d681SAndroid Build Coastguard Worker (C2_not PredRegs:$src1)>; 4877*9880d681SAndroid Build Coastguard Worker 4878*9880d681SAndroid Build Coastguard Worker// Map from p0 = pnot(p0); r0 = mux(p0, #i, #j) => r0 = mux(p0, #j, #i). 4879*9880d681SAndroid Build Coastguard Workerdef: Pat<(select (not (i1 PredRegs:$src1)), s8ImmPred:$src2, s32ImmPred:$src3), 4880*9880d681SAndroid Build Coastguard Worker (C2_muxii PredRegs:$src1, s32ImmPred:$src3, s8ImmPred:$src2)>; 4881*9880d681SAndroid Build Coastguard Worker 4882*9880d681SAndroid Build Coastguard Worker// Map from p0 = pnot(p0); r0 = select(p0, #i, r1) 4883*9880d681SAndroid Build Coastguard Worker// => r0 = C2_muxir(p0, r1, #i) 4884*9880d681SAndroid Build Coastguard Workerdef: Pat<(select (not (i1 PredRegs:$src1)), s32ImmPred:$src2, 4885*9880d681SAndroid Build Coastguard Worker (i32 IntRegs:$src3)), 4886*9880d681SAndroid Build Coastguard Worker (C2_muxir PredRegs:$src1, IntRegs:$src3, s32ImmPred:$src2)>; 4887*9880d681SAndroid Build Coastguard Worker 4888*9880d681SAndroid Build Coastguard Worker// Map from p0 = pnot(p0); r0 = mux(p0, r1, #i) 4889*9880d681SAndroid Build Coastguard Worker// => r0 = C2_muxri (p0, #i, r1) 4890*9880d681SAndroid Build Coastguard Workerdef: Pat<(select (not (i1 PredRegs:$src1)), IntRegs:$src2, s32ImmPred:$src3), 4891*9880d681SAndroid Build Coastguard Worker (C2_muxri PredRegs:$src1, s32ImmPred:$src3, IntRegs:$src2)>; 4892*9880d681SAndroid Build Coastguard Worker 4893*9880d681SAndroid Build Coastguard Worker// Map from p0 = pnot(p0); if (p0) jump => if (!p0) jump. 4894*9880d681SAndroid Build Coastguard Workerdef: Pat<(brcond (not (i1 PredRegs:$src1)), bb:$offset), 4895*9880d681SAndroid Build Coastguard Worker (J2_jumpf PredRegs:$src1, bb:$offset)>; 4896*9880d681SAndroid Build Coastguard Worker 4897*9880d681SAndroid Build Coastguard Worker// Map from Rdd = sign_extend_inreg(Rss, i32) -> Rdd = A2_sxtw(Rss.lo). 4898*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (sext_inreg (i64 DoubleRegs:$src1), i32)), 4899*9880d681SAndroid Build Coastguard Worker (A2_sxtw (LoReg DoubleRegs:$src1))>; 4900*9880d681SAndroid Build Coastguard Worker 4901*9880d681SAndroid Build Coastguard Worker// Map from Rdd = sign_extend_inreg(Rss, i16) -> Rdd = A2_sxtw(A2_sxth(Rss.lo)). 4902*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (sext_inreg (i64 DoubleRegs:$src1), i16)), 4903*9880d681SAndroid Build Coastguard Worker (A2_sxtw (A2_sxth (LoReg DoubleRegs:$src1)))>; 4904*9880d681SAndroid Build Coastguard Worker 4905*9880d681SAndroid Build Coastguard Worker// Map from Rdd = sign_extend_inreg(Rss, i8) -> Rdd = A2_sxtw(A2_sxtb(Rss.lo)). 4906*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (sext_inreg (i64 DoubleRegs:$src1), i8)), 4907*9880d681SAndroid Build Coastguard Worker (A2_sxtw (A2_sxtb (LoReg DoubleRegs:$src1)))>; 4908*9880d681SAndroid Build Coastguard Worker 4909*9880d681SAndroid Build Coastguard Worker// We want to prevent emitting pnot's as much as possible. 4910*9880d681SAndroid Build Coastguard Worker// Map brcond with an unsupported setcc to a J2_jumpf. 4911*9880d681SAndroid Build Coastguard Workerdef : Pat <(brcond (i1 (setne (i32 IntRegs:$src1), (i32 IntRegs:$src2))), 4912*9880d681SAndroid Build Coastguard Worker bb:$offset), 4913*9880d681SAndroid Build Coastguard Worker (J2_jumpf (C2_cmpeq (i32 IntRegs:$src1), (i32 IntRegs:$src2)), 4914*9880d681SAndroid Build Coastguard Worker bb:$offset)>; 4915*9880d681SAndroid Build Coastguard Worker 4916*9880d681SAndroid Build Coastguard Workerdef : Pat <(brcond (i1 (setne (i32 IntRegs:$src1), s10ImmPred:$src2)), 4917*9880d681SAndroid Build Coastguard Worker bb:$offset), 4918*9880d681SAndroid Build Coastguard Worker (J2_jumpf (C2_cmpeqi (i32 IntRegs:$src1), s10ImmPred:$src2), bb:$offset)>; 4919*9880d681SAndroid Build Coastguard Worker 4920*9880d681SAndroid Build Coastguard Workerdef: Pat<(brcond (i1 (setne (i1 PredRegs:$src1), (i1 -1))), bb:$offset), 4921*9880d681SAndroid Build Coastguard Worker (J2_jumpf PredRegs:$src1, bb:$offset)>; 4922*9880d681SAndroid Build Coastguard Worker 4923*9880d681SAndroid Build Coastguard Workerdef: Pat<(brcond (i1 (setne (i1 PredRegs:$src1), (i1 0))), bb:$offset), 4924*9880d681SAndroid Build Coastguard Worker (J2_jumpt PredRegs:$src1, bb:$offset)>; 4925*9880d681SAndroid Build Coastguard Worker 4926*9880d681SAndroid Build Coastguard Worker// cmp.lt(Rs, Imm) -> !cmp.ge(Rs, Imm) -> !cmp.gt(Rs, Imm-1) 4927*9880d681SAndroid Build Coastguard Workerdef: Pat<(brcond (i1 (setlt (i32 IntRegs:$src1), s8ImmPred:$src2)), bb:$offset), 4928*9880d681SAndroid Build Coastguard Worker (J2_jumpf (C2_cmpgti IntRegs:$src1, (DEC_CONST_SIGNED s8ImmPred:$src2)), 4929*9880d681SAndroid Build Coastguard Worker bb:$offset)>; 4930*9880d681SAndroid Build Coastguard Worker 4931*9880d681SAndroid Build Coastguard Worker// Map from a 64-bit select to an emulated 64-bit mux. 4932*9880d681SAndroid Build Coastguard Worker// Hexagon does not support 64-bit MUXes; so emulate with combines. 4933*9880d681SAndroid Build Coastguard Workerdef: Pat<(select (i1 PredRegs:$src1), (i64 DoubleRegs:$src2), 4934*9880d681SAndroid Build Coastguard Worker (i64 DoubleRegs:$src3)), 4935*9880d681SAndroid Build Coastguard Worker (A2_combinew (C2_mux PredRegs:$src1, (HiReg DoubleRegs:$src2), 4936*9880d681SAndroid Build Coastguard Worker (HiReg DoubleRegs:$src3)), 4937*9880d681SAndroid Build Coastguard Worker (C2_mux PredRegs:$src1, (LoReg DoubleRegs:$src2), 4938*9880d681SAndroid Build Coastguard Worker (LoReg DoubleRegs:$src3)))>; 4939*9880d681SAndroid Build Coastguard Worker 4940*9880d681SAndroid Build Coastguard Worker// Map from a 1-bit select to logical ops. 4941*9880d681SAndroid Build Coastguard Worker// From LegalizeDAG.cpp: (B1 ? B2 : B3) <=> (B1 & B2)|(!B1&B3). 4942*9880d681SAndroid Build Coastguard Workerdef: Pat<(select (i1 PredRegs:$src1), (i1 PredRegs:$src2), (i1 PredRegs:$src3)), 4943*9880d681SAndroid Build Coastguard Worker (C2_or (C2_and PredRegs:$src1, PredRegs:$src2), 4944*9880d681SAndroid Build Coastguard Worker (C2_and (C2_not PredRegs:$src1), PredRegs:$src3))>; 4945*9880d681SAndroid Build Coastguard Worker 4946*9880d681SAndroid Build Coastguard Worker// Map for truncating from 64 immediates to 32 bit immediates. 4947*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (trunc (i64 DoubleRegs:$src))), 4948*9880d681SAndroid Build Coastguard Worker (LoReg DoubleRegs:$src)>; 4949*9880d681SAndroid Build Coastguard Worker 4950*9880d681SAndroid Build Coastguard Worker// Map for truncating from i64 immediates to i1 bit immediates. 4951*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (trunc (i64 DoubleRegs:$src))), 4952*9880d681SAndroid Build Coastguard Worker (C2_tfrrp (LoReg DoubleRegs:$src))>; 4953*9880d681SAndroid Build Coastguard Worker 4954*9880d681SAndroid Build Coastguard Worker// rs <= rt -> !(rs > rt). 4955*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 30 in 4956*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setle (i32 IntRegs:$src1), s32ImmPred:$src2)), 4957*9880d681SAndroid Build Coastguard Worker (C2_not (C2_cmpgti IntRegs:$src1, s32ImmPred:$src2))>; 4958*9880d681SAndroid Build Coastguard Worker 4959*9880d681SAndroid Build Coastguard Worker// rs <= rt -> !(rs > rt). 4960*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setle (i32 IntRegs:$src1), (i32 IntRegs:$src2))), 4961*9880d681SAndroid Build Coastguard Worker (i1 (C2_not (C2_cmpgt (i32 IntRegs:$src1), (i32 IntRegs:$src2))))>; 4962*9880d681SAndroid Build Coastguard Worker 4963*9880d681SAndroid Build Coastguard Worker// Rss <= Rtt -> !(Rss > Rtt). 4964*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setle (i64 DoubleRegs:$src1), (i64 DoubleRegs:$src2))), 4965*9880d681SAndroid Build Coastguard Worker (C2_not (C2_cmpgtp DoubleRegs:$src1, DoubleRegs:$src2))>; 4966*9880d681SAndroid Build Coastguard Worker 4967*9880d681SAndroid Build Coastguard Worker// Map cmpne -> cmpeq. 4968*9880d681SAndroid Build Coastguard Worker// Hexagon_TODO: We should improve on this. 4969*9880d681SAndroid Build Coastguard Worker// rs != rt -> !(rs == rt). 4970*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 30 in 4971*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setne (i32 IntRegs:$src1), s32ImmPred:$src2)), 4972*9880d681SAndroid Build Coastguard Worker (C2_not (C2_cmpeqi IntRegs:$src1, s32ImmPred:$src2))>; 4973*9880d681SAndroid Build Coastguard Worker 4974*9880d681SAndroid Build Coastguard Worker// Convert setne back to xor for hexagon since we compute w/ pred registers. 4975*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setne (i1 PredRegs:$src1), (i1 PredRegs:$src2))), 4976*9880d681SAndroid Build Coastguard Worker (C2_xor PredRegs:$src1, PredRegs:$src2)>; 4977*9880d681SAndroid Build Coastguard Worker 4978*9880d681SAndroid Build Coastguard Worker// Map cmpne(Rss) -> !cmpew(Rss). 4979*9880d681SAndroid Build Coastguard Worker// rs != rt -> !(rs == rt). 4980*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setne (i64 DoubleRegs:$src1), (i64 DoubleRegs:$src2))), 4981*9880d681SAndroid Build Coastguard Worker (C2_not (C2_cmpeqp DoubleRegs:$src1, DoubleRegs:$src2))>; 4982*9880d681SAndroid Build Coastguard Worker 4983*9880d681SAndroid Build Coastguard Worker// Map cmpge(Rs, Rt) -> !(cmpgt(Rs, Rt). 4984*9880d681SAndroid Build Coastguard Worker// rs >= rt -> !(rt > rs). 4985*9880d681SAndroid Build Coastguard Workerdef : Pat <(i1 (setge (i32 IntRegs:$src1), (i32 IntRegs:$src2))), 4986*9880d681SAndroid Build Coastguard Worker (i1 (C2_not (i1 (C2_cmpgt (i32 IntRegs:$src2), (i32 IntRegs:$src1)))))>; 4987*9880d681SAndroid Build Coastguard Worker 4988*9880d681SAndroid Build Coastguard Worker// cmpge(Rs, Imm) -> cmpgt(Rs, Imm-1) 4989*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 30 in 4990*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setge (i32 IntRegs:$src1), s32ImmPred:$src2)), 4991*9880d681SAndroid Build Coastguard Worker (C2_cmpgti IntRegs:$src1, (DEC_CONST_SIGNED s32ImmPred:$src2))>; 4992*9880d681SAndroid Build Coastguard Worker 4993*9880d681SAndroid Build Coastguard Worker// Map cmpge(Rss, Rtt) -> !cmpgt(Rtt, Rss). 4994*9880d681SAndroid Build Coastguard Worker// rss >= rtt -> !(rtt > rss). 4995*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setge (i64 DoubleRegs:$src1), (i64 DoubleRegs:$src2))), 4996*9880d681SAndroid Build Coastguard Worker (C2_not (C2_cmpgtp DoubleRegs:$src2, DoubleRegs:$src1))>; 4997*9880d681SAndroid Build Coastguard Worker 4998*9880d681SAndroid Build Coastguard Worker// Map cmplt(Rs, Imm) -> !cmpge(Rs, Imm). 4999*9880d681SAndroid Build Coastguard Worker// !cmpge(Rs, Imm) -> !cmpgt(Rs, Imm-1). 5000*9880d681SAndroid Build Coastguard Worker// rs < rt -> !(rs >= rt). 5001*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 30 in 5002*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setlt (i32 IntRegs:$src1), s32ImmPred:$src2)), 5003*9880d681SAndroid Build Coastguard Worker (C2_not (C2_cmpgti IntRegs:$src1, 5004*9880d681SAndroid Build Coastguard Worker (DEC_CONST_SIGNED s32ImmPred:$src2)))>; 5005*9880d681SAndroid Build Coastguard Worker 5006*9880d681SAndroid Build Coastguard Worker// Generate cmpgeu(Rs, #0) -> cmpeq(Rs, Rs) 5007*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setuge (i32 IntRegs:$src1), 0)), 5008*9880d681SAndroid Build Coastguard Worker (C2_cmpeq IntRegs:$src1, IntRegs:$src1)>; 5009*9880d681SAndroid Build Coastguard Worker 5010*9880d681SAndroid Build Coastguard Worker// Generate cmpgeu(Rs, #u8) -> cmpgtu(Rs, #u8 -1) 5011*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setuge (i32 IntRegs:$src1), u32ImmPred:$src2)), 5012*9880d681SAndroid Build Coastguard Worker (C2_cmpgtui IntRegs:$src1, (DEC_CONST_UNSIGNED u32ImmPred:$src2))>; 5013*9880d681SAndroid Build Coastguard Worker 5014*9880d681SAndroid Build Coastguard Worker// Generate cmpgtu(Rs, #u9) 5015*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setugt (i32 IntRegs:$src1), u32ImmPred:$src2)), 5016*9880d681SAndroid Build Coastguard Worker (C2_cmpgtui IntRegs:$src1, u32ImmPred:$src2)>; 5017*9880d681SAndroid Build Coastguard Worker 5018*9880d681SAndroid Build Coastguard Worker// Map from Rs >= Rt -> !(Rt > Rs). 5019*9880d681SAndroid Build Coastguard Worker// rs >= rt -> !(rt > rs). 5020*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setuge (i64 DoubleRegs:$src1), (i64 DoubleRegs:$src2))), 5021*9880d681SAndroid Build Coastguard Worker (C2_not (C2_cmpgtup DoubleRegs:$src2, DoubleRegs:$src1))>; 5022*9880d681SAndroid Build Coastguard Worker 5023*9880d681SAndroid Build Coastguard Worker// Map from cmpleu(Rss, Rtt) -> !cmpgtu(Rss, Rtt-1). 5024*9880d681SAndroid Build Coastguard Worker// Map from (Rs <= Rt) -> !(Rs > Rt). 5025*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setule (i64 DoubleRegs:$src1), (i64 DoubleRegs:$src2))), 5026*9880d681SAndroid Build Coastguard Worker (C2_not (C2_cmpgtup DoubleRegs:$src1, DoubleRegs:$src2))>; 5027*9880d681SAndroid Build Coastguard Worker 5028*9880d681SAndroid Build Coastguard Worker// Sign extends. 5029*9880d681SAndroid Build Coastguard Worker// i1 -> i32 5030*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (sext (i1 PredRegs:$src1))), 5031*9880d681SAndroid Build Coastguard Worker (C2_muxii PredRegs:$src1, -1, 0)>; 5032*9880d681SAndroid Build Coastguard Worker 5033*9880d681SAndroid Build Coastguard Worker// i1 -> i64 5034*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (sext (i1 PredRegs:$src1))), 5035*9880d681SAndroid Build Coastguard Worker (A2_combinew (A2_tfrsi -1), (C2_muxii PredRegs:$src1, -1, 0))>; 5036*9880d681SAndroid Build Coastguard Worker 5037*9880d681SAndroid Build Coastguard Worker// Zero extends. 5038*9880d681SAndroid Build Coastguard Worker// i1 -> i32 5039*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (zext (i1 PredRegs:$src1))), 5040*9880d681SAndroid Build Coastguard Worker (C2_muxii PredRegs:$src1, 1, 0)>; 5041*9880d681SAndroid Build Coastguard Worker 5042*9880d681SAndroid Build Coastguard Worker// Map from Rs = Pd to Pd = mux(Pd, #1, #0) 5043*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (anyext (i1 PredRegs:$src1))), 5044*9880d681SAndroid Build Coastguard Worker (C2_muxii PredRegs:$src1, 1, 0)>; 5045*9880d681SAndroid Build Coastguard Worker 5046*9880d681SAndroid Build Coastguard Worker// Map from Rss = Pd to Rdd = sxtw (mux(Pd, #1, #0)) 5047*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (anyext (i1 PredRegs:$src1))), 5048*9880d681SAndroid Build Coastguard Worker (A2_sxtw (C2_muxii PredRegs:$src1, 1, 0))>; 5049*9880d681SAndroid Build Coastguard Worker 5050*9880d681SAndroid Build Coastguard Worker// Multiply 64-bit unsigned and use upper result. 5051*9880d681SAndroid Build Coastguard Workerdef : Pat <(mulhu (i64 DoubleRegs:$src1), (i64 DoubleRegs:$src2)), 5052*9880d681SAndroid Build Coastguard Worker (A2_addp 5053*9880d681SAndroid Build Coastguard Worker (M2_dpmpyuu_acc_s0 5054*9880d681SAndroid Build Coastguard Worker (S2_lsr_i_p 5055*9880d681SAndroid Build Coastguard Worker (A2_addp 5056*9880d681SAndroid Build Coastguard Worker (M2_dpmpyuu_acc_s0 5057*9880d681SAndroid Build Coastguard Worker (S2_lsr_i_p (M2_dpmpyuu_s0 (LoReg $src1), (LoReg $src2)), 32), 5058*9880d681SAndroid Build Coastguard Worker (HiReg $src1), 5059*9880d681SAndroid Build Coastguard Worker (LoReg $src2)), 5060*9880d681SAndroid Build Coastguard Worker (A2_combinew (A2_tfrsi 0), 5061*9880d681SAndroid Build Coastguard Worker (LoReg (M2_dpmpyuu_s0 (LoReg $src1), (HiReg $src2))))), 5062*9880d681SAndroid Build Coastguard Worker 32), 5063*9880d681SAndroid Build Coastguard Worker (HiReg $src1), 5064*9880d681SAndroid Build Coastguard Worker (HiReg $src2)), 5065*9880d681SAndroid Build Coastguard Worker (S2_lsr_i_p (M2_dpmpyuu_s0 (LoReg $src1), (HiReg $src2)), 32) 5066*9880d681SAndroid Build Coastguard Worker)>; 5067*9880d681SAndroid Build Coastguard Worker 5068*9880d681SAndroid Build Coastguard Worker// Hexagon specific ISD nodes. 5069*9880d681SAndroid Build Coastguard Workerdef SDTHexagonALLOCA : SDTypeProfile<1, 2, 5070*9880d681SAndroid Build Coastguard Worker [SDTCisVT<0, i32>, SDTCisVT<1, i32>]>; 5071*9880d681SAndroid Build Coastguard Workerdef HexagonALLOCA : SDNode<"HexagonISD::ALLOCA", SDTHexagonALLOCA, 5072*9880d681SAndroid Build Coastguard Worker [SDNPHasChain]>; 5073*9880d681SAndroid Build Coastguard Worker 5074*9880d681SAndroid Build Coastguard Worker// The reason for the custom inserter is to record all ALLOCA instructions 5075*9880d681SAndroid Build Coastguard Worker// in MachineFunctionInfo. 5076*9880d681SAndroid Build Coastguard Workerlet Defs = [R29], isCodeGenOnly = 1, isPseudo = 1, hasSideEffects = 1, 5077*9880d681SAndroid Build Coastguard Worker usesCustomInserter = 1 in 5078*9880d681SAndroid Build Coastguard Workerdef ALLOCA: ALU32Inst<(outs IntRegs:$Rd), 5079*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$Rs, u32Imm:$A), "", 5080*9880d681SAndroid Build Coastguard Worker [(set (i32 IntRegs:$Rd), 5081*9880d681SAndroid Build Coastguard Worker (HexagonALLOCA (i32 IntRegs:$Rs), (i32 imm:$A)))]>; 5082*9880d681SAndroid Build Coastguard Worker 5083*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, isPseudo = 1, Uses = [R30], hasSideEffects = 0 in 5084*9880d681SAndroid Build Coastguard Workerdef ALIGNA : ALU32Inst<(outs IntRegs:$Rd), (ins u32Imm:$A), "", []>; 5085*9880d681SAndroid Build Coastguard Worker 5086*9880d681SAndroid Build Coastguard Workerdef SDTHexagonARGEXTEND : SDTypeProfile<1, 1, [SDTCisVT<0, i32>]>; 5087*9880d681SAndroid Build Coastguard Workerdef Hexagon_ARGEXTEND : SDNode<"HexagonISD::ARGEXTEND", SDTHexagonARGEXTEND>; 5088*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in 5089*9880d681SAndroid Build Coastguard Workerdef ARGEXTEND : ALU32_rr <(outs IntRegs:$dst), (ins IntRegs:$src1), 5090*9880d681SAndroid Build Coastguard Worker "$dst = $src1", 5091*9880d681SAndroid Build Coastguard Worker [(set (i32 IntRegs:$dst), 5092*9880d681SAndroid Build Coastguard Worker (Hexagon_ARGEXTEND (i32 IntRegs:$src1)))]>; 5093*9880d681SAndroid Build Coastguard Worker 5094*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 100 in 5095*9880d681SAndroid Build Coastguard Workerdef: Pat<(i32 (sext_inreg (Hexagon_ARGEXTEND (i32 IntRegs:$src1)), i16)), 5096*9880d681SAndroid Build Coastguard Worker (i32 IntRegs:$src1)>; 5097*9880d681SAndroid Build Coastguard Worker 5098*9880d681SAndroid Build Coastguard Workerdef HexagonJT: SDNode<"HexagonISD::JT", SDTIntUnaryOp>; 5099*9880d681SAndroid Build Coastguard Workerdef HexagonCP: SDNode<"HexagonISD::CP", SDTIntUnaryOp>; 5100*9880d681SAndroid Build Coastguard Worker 5101*9880d681SAndroid Build Coastguard Workerdef: Pat<(HexagonJT tjumptable:$dst), (A2_tfrsi s16Ext:$dst)>; 5102*9880d681SAndroid Build Coastguard Workerdef: Pat<(HexagonCP tconstpool:$dst), (A2_tfrsi s16Ext:$dst)>; 5103*9880d681SAndroid Build Coastguard Worker 5104*9880d681SAndroid Build Coastguard Worker// XTYPE/SHIFT 5105*9880d681SAndroid Build Coastguard Worker// 5106*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5107*9880d681SAndroid Build Coastguard Worker// Template Class 5108*9880d681SAndroid Build Coastguard Worker// Shift by immediate/register and accumulate/logical 5109*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5110*9880d681SAndroid Build Coastguard Worker 5111*9880d681SAndroid Build Coastguard Worker// Rx[+-&|]=asr(Rs,#u5) 5112*9880d681SAndroid Build Coastguard Worker// Rx[+-&|^]=lsr(Rs,#u5) 5113*9880d681SAndroid Build Coastguard Worker// Rx[+-&|^]=asl(Rs,#u5) 5114*9880d681SAndroid Build Coastguard Worker 5115*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, opNewValue = 0 in 5116*9880d681SAndroid Build Coastguard Workerclass T_shift_imm_acc_r <string opc1, string opc2, SDNode OpNode1, 5117*9880d681SAndroid Build Coastguard Worker SDNode OpNode2, bits<3> majOp, bits<2> minOp> 5118*9880d681SAndroid Build Coastguard Worker : SInst_acc<(outs IntRegs:$Rx), 5119*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$src1, IntRegs:$Rs, u5Imm:$u5), 5120*9880d681SAndroid Build Coastguard Worker "$Rx "#opc2#opc1#"($Rs, #$u5)", 5121*9880d681SAndroid Build Coastguard Worker [(set (i32 IntRegs:$Rx), 5122*9880d681SAndroid Build Coastguard Worker (OpNode2 (i32 IntRegs:$src1), 5123*9880d681SAndroid Build Coastguard Worker (OpNode1 (i32 IntRegs:$Rs), u5ImmPred:$u5)))], 5124*9880d681SAndroid Build Coastguard Worker "$src1 = $Rx", S_2op_tc_2_SLOT23> { 5125*9880d681SAndroid Build Coastguard Worker bits<5> Rx; 5126*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 5127*9880d681SAndroid Build Coastguard Worker bits<5> u5; 5128*9880d681SAndroid Build Coastguard Worker 5129*9880d681SAndroid Build Coastguard Worker let IClass = 0b1000; 5130*9880d681SAndroid Build Coastguard Worker 5131*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1110; 5132*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = majOp{2-1}; 5133*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 5134*9880d681SAndroid Build Coastguard Worker let Inst{7} = majOp{0}; 5135*9880d681SAndroid Build Coastguard Worker let Inst{6-5} = minOp; 5136*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rx; 5137*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 5138*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = u5; 5139*9880d681SAndroid Build Coastguard Worker } 5140*9880d681SAndroid Build Coastguard Worker 5141*9880d681SAndroid Build Coastguard Worker// Rx[+-&|]=asr(Rs,Rt) 5142*9880d681SAndroid Build Coastguard Worker// Rx[+-&|^]=lsr(Rs,Rt) 5143*9880d681SAndroid Build Coastguard Worker// Rx[+-&|^]=asl(Rs,Rt) 5144*9880d681SAndroid Build Coastguard Worker 5145*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, opNewValue = 0 in 5146*9880d681SAndroid Build Coastguard Workerclass T_shift_reg_acc_r <string opc1, string opc2, SDNode OpNode1, 5147*9880d681SAndroid Build Coastguard Worker SDNode OpNode2, bits<2> majOp, bits<2> minOp> 5148*9880d681SAndroid Build Coastguard Worker : SInst_acc<(outs IntRegs:$Rx), 5149*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$src1, IntRegs:$Rs, IntRegs:$Rt), 5150*9880d681SAndroid Build Coastguard Worker "$Rx "#opc2#opc1#"($Rs, $Rt)", 5151*9880d681SAndroid Build Coastguard Worker [(set (i32 IntRegs:$Rx), 5152*9880d681SAndroid Build Coastguard Worker (OpNode2 (i32 IntRegs:$src1), 5153*9880d681SAndroid Build Coastguard Worker (OpNode1 (i32 IntRegs:$Rs), (i32 IntRegs:$Rt))))], 5154*9880d681SAndroid Build Coastguard Worker "$src1 = $Rx", S_3op_tc_2_SLOT23 > { 5155*9880d681SAndroid Build Coastguard Worker bits<5> Rx; 5156*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 5157*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 5158*9880d681SAndroid Build Coastguard Worker 5159*9880d681SAndroid Build Coastguard Worker let IClass = 0b1100; 5160*9880d681SAndroid Build Coastguard Worker 5161*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1100; 5162*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = majOp; 5163*9880d681SAndroid Build Coastguard Worker let Inst{7-6} = minOp; 5164*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rx; 5165*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 5166*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 5167*9880d681SAndroid Build Coastguard Worker } 5168*9880d681SAndroid Build Coastguard Worker 5169*9880d681SAndroid Build Coastguard Worker// Rxx[+-&|]=asr(Rss,#u6) 5170*9880d681SAndroid Build Coastguard Worker// Rxx[+-&|^]=lsr(Rss,#u6) 5171*9880d681SAndroid Build Coastguard Worker// Rxx[+-&|^]=asl(Rss,#u6) 5172*9880d681SAndroid Build Coastguard Worker 5173*9880d681SAndroid Build Coastguard Workerclass T_shift_imm_acc_p <string opc1, string opc2, SDNode OpNode1, 5174*9880d681SAndroid Build Coastguard Worker SDNode OpNode2, bits<3> majOp, bits<2> minOp> 5175*9880d681SAndroid Build Coastguard Worker : SInst_acc<(outs DoubleRegs:$Rxx), 5176*9880d681SAndroid Build Coastguard Worker (ins DoubleRegs:$src1, DoubleRegs:$Rss, u6Imm:$u6), 5177*9880d681SAndroid Build Coastguard Worker "$Rxx "#opc2#opc1#"($Rss, #$u6)", 5178*9880d681SAndroid Build Coastguard Worker [(set (i64 DoubleRegs:$Rxx), 5179*9880d681SAndroid Build Coastguard Worker (OpNode2 (i64 DoubleRegs:$src1), 5180*9880d681SAndroid Build Coastguard Worker (OpNode1 (i64 DoubleRegs:$Rss), u6ImmPred:$u6)))], 5181*9880d681SAndroid Build Coastguard Worker "$src1 = $Rxx", S_2op_tc_2_SLOT23> { 5182*9880d681SAndroid Build Coastguard Worker bits<5> Rxx; 5183*9880d681SAndroid Build Coastguard Worker bits<5> Rss; 5184*9880d681SAndroid Build Coastguard Worker bits<6> u6; 5185*9880d681SAndroid Build Coastguard Worker 5186*9880d681SAndroid Build Coastguard Worker let IClass = 0b1000; 5187*9880d681SAndroid Build Coastguard Worker 5188*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0010; 5189*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = majOp{2-1}; 5190*9880d681SAndroid Build Coastguard Worker let Inst{7} = majOp{0}; 5191*9880d681SAndroid Build Coastguard Worker let Inst{6-5} = minOp; 5192*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rxx; 5193*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rss; 5194*9880d681SAndroid Build Coastguard Worker let Inst{13-8} = u6; 5195*9880d681SAndroid Build Coastguard Worker } 5196*9880d681SAndroid Build Coastguard Worker 5197*9880d681SAndroid Build Coastguard Worker 5198*9880d681SAndroid Build Coastguard Worker// Rxx[+-&|]=asr(Rss,Rt) 5199*9880d681SAndroid Build Coastguard Worker// Rxx[+-&|^]=lsr(Rss,Rt) 5200*9880d681SAndroid Build Coastguard Worker// Rxx[+-&|^]=asl(Rss,Rt) 5201*9880d681SAndroid Build Coastguard Worker// Rxx[+-&|^]=lsl(Rss,Rt) 5202*9880d681SAndroid Build Coastguard Worker 5203*9880d681SAndroid Build Coastguard Workerclass T_shift_reg_acc_p <string opc1, string opc2, SDNode OpNode1, 5204*9880d681SAndroid Build Coastguard Worker SDNode OpNode2, bits<3> majOp, bits<2> minOp> 5205*9880d681SAndroid Build Coastguard Worker : SInst_acc<(outs DoubleRegs:$Rxx), 5206*9880d681SAndroid Build Coastguard Worker (ins DoubleRegs:$src1, DoubleRegs:$Rss, IntRegs:$Rt), 5207*9880d681SAndroid Build Coastguard Worker "$Rxx "#opc2#opc1#"($Rss, $Rt)", 5208*9880d681SAndroid Build Coastguard Worker [(set (i64 DoubleRegs:$Rxx), 5209*9880d681SAndroid Build Coastguard Worker (OpNode2 (i64 DoubleRegs:$src1), 5210*9880d681SAndroid Build Coastguard Worker (OpNode1 (i64 DoubleRegs:$Rss), (i32 IntRegs:$Rt))))], 5211*9880d681SAndroid Build Coastguard Worker "$src1 = $Rxx", S_3op_tc_2_SLOT23> { 5212*9880d681SAndroid Build Coastguard Worker bits<5> Rxx; 5213*9880d681SAndroid Build Coastguard Worker bits<5> Rss; 5214*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 5215*9880d681SAndroid Build Coastguard Worker 5216*9880d681SAndroid Build Coastguard Worker let IClass = 0b1100; 5217*9880d681SAndroid Build Coastguard Worker 5218*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1011; 5219*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = majOp; 5220*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rss; 5221*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 5222*9880d681SAndroid Build Coastguard Worker let Inst{7-6} = minOp; 5223*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rxx; 5224*9880d681SAndroid Build Coastguard Worker } 5225*9880d681SAndroid Build Coastguard Worker 5226*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5227*9880d681SAndroid Build Coastguard Worker// Multi-class for the shift instructions with logical/arithmetic operators. 5228*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5229*9880d681SAndroid Build Coastguard Worker 5230*9880d681SAndroid Build Coastguard Workermulticlass xtype_imm_base<string OpcStr1, string OpcStr2, SDNode OpNode1, 5231*9880d681SAndroid Build Coastguard Worker SDNode OpNode2, bits<3> majOp, bits<2> minOp > { 5232*9880d681SAndroid Build Coastguard Worker def _i_r#NAME : T_shift_imm_acc_r< OpcStr1, OpcStr2, OpNode1, 5233*9880d681SAndroid Build Coastguard Worker OpNode2, majOp, minOp >; 5234*9880d681SAndroid Build Coastguard Worker def _i_p#NAME : T_shift_imm_acc_p< OpcStr1, OpcStr2, OpNode1, 5235*9880d681SAndroid Build Coastguard Worker OpNode2, majOp, minOp >; 5236*9880d681SAndroid Build Coastguard Worker} 5237*9880d681SAndroid Build Coastguard Worker 5238*9880d681SAndroid Build Coastguard Workermulticlass xtype_imm_acc<string opc1, SDNode OpNode, bits<2>minOp> { 5239*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 100 in 5240*9880d681SAndroid Build Coastguard Worker defm _acc : xtype_imm_base< opc1, "+= ", OpNode, add, 0b001, minOp>; 5241*9880d681SAndroid Build Coastguard Worker 5242*9880d681SAndroid Build Coastguard Worker defm _nac : xtype_imm_base< opc1, "-= ", OpNode, sub, 0b000, minOp>; 5243*9880d681SAndroid Build Coastguard Worker defm _and : xtype_imm_base< opc1, "&= ", OpNode, and, 0b010, minOp>; 5244*9880d681SAndroid Build Coastguard Worker defm _or : xtype_imm_base< opc1, "|= ", OpNode, or, 0b011, minOp>; 5245*9880d681SAndroid Build Coastguard Worker} 5246*9880d681SAndroid Build Coastguard Worker 5247*9880d681SAndroid Build Coastguard Workermulticlass xtype_xor_imm_acc<string opc1, SDNode OpNode, bits<2>minOp> { 5248*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 100 in 5249*9880d681SAndroid Build Coastguard Worker defm _xacc : xtype_imm_base< opc1, "^= ", OpNode, xor, 0b100, minOp>; 5250*9880d681SAndroid Build Coastguard Worker} 5251*9880d681SAndroid Build Coastguard Worker 5252*9880d681SAndroid Build Coastguard Workerdefm S2_asr : xtype_imm_acc<"asr", sra, 0b00>; 5253*9880d681SAndroid Build Coastguard Worker 5254*9880d681SAndroid Build Coastguard Workerdefm S2_lsr : xtype_imm_acc<"lsr", srl, 0b01>, 5255*9880d681SAndroid Build Coastguard Worker xtype_xor_imm_acc<"lsr", srl, 0b01>; 5256*9880d681SAndroid Build Coastguard Worker 5257*9880d681SAndroid Build Coastguard Workerdefm S2_asl : xtype_imm_acc<"asl", shl, 0b10>, 5258*9880d681SAndroid Build Coastguard Worker xtype_xor_imm_acc<"asl", shl, 0b10>; 5259*9880d681SAndroid Build Coastguard Worker 5260*9880d681SAndroid Build Coastguard Workermulticlass xtype_reg_acc_r<string opc1, SDNode OpNode, bits<2>minOp> { 5261*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 100 in 5262*9880d681SAndroid Build Coastguard Worker def _acc : T_shift_reg_acc_r <opc1, "+= ", OpNode, add, 0b11, minOp>; 5263*9880d681SAndroid Build Coastguard Worker 5264*9880d681SAndroid Build Coastguard Worker def _nac : T_shift_reg_acc_r <opc1, "-= ", OpNode, sub, 0b10, minOp>; 5265*9880d681SAndroid Build Coastguard Worker def _and : T_shift_reg_acc_r <opc1, "&= ", OpNode, and, 0b01, minOp>; 5266*9880d681SAndroid Build Coastguard Worker def _or : T_shift_reg_acc_r <opc1, "|= ", OpNode, or, 0b00, minOp>; 5267*9880d681SAndroid Build Coastguard Worker} 5268*9880d681SAndroid Build Coastguard Worker 5269*9880d681SAndroid Build Coastguard Workermulticlass xtype_reg_acc_p<string opc1, SDNode OpNode, bits<2>minOp> { 5270*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 100 in 5271*9880d681SAndroid Build Coastguard Worker def _acc : T_shift_reg_acc_p <opc1, "+= ", OpNode, add, 0b110, minOp>; 5272*9880d681SAndroid Build Coastguard Worker 5273*9880d681SAndroid Build Coastguard Worker def _nac : T_shift_reg_acc_p <opc1, "-= ", OpNode, sub, 0b100, minOp>; 5274*9880d681SAndroid Build Coastguard Worker def _and : T_shift_reg_acc_p <opc1, "&= ", OpNode, and, 0b010, minOp>; 5275*9880d681SAndroid Build Coastguard Worker def _or : T_shift_reg_acc_p <opc1, "|= ", OpNode, or, 0b000, minOp>; 5276*9880d681SAndroid Build Coastguard Worker def _xor : T_shift_reg_acc_p <opc1, "^= ", OpNode, xor, 0b011, minOp>; 5277*9880d681SAndroid Build Coastguard Worker} 5278*9880d681SAndroid Build Coastguard Worker 5279*9880d681SAndroid Build Coastguard Workermulticlass xtype_reg_acc<string OpcStr, SDNode OpNode, bits<2> minOp > { 5280*9880d681SAndroid Build Coastguard Worker defm _r_r : xtype_reg_acc_r <OpcStr, OpNode, minOp>; 5281*9880d681SAndroid Build Coastguard Worker defm _r_p : xtype_reg_acc_p <OpcStr, OpNode, minOp>; 5282*9880d681SAndroid Build Coastguard Worker} 5283*9880d681SAndroid Build Coastguard Worker 5284*9880d681SAndroid Build Coastguard Workerdefm S2_asl : xtype_reg_acc<"asl", shl, 0b10>; 5285*9880d681SAndroid Build Coastguard Workerdefm S2_asr : xtype_reg_acc<"asr", sra, 0b00>; 5286*9880d681SAndroid Build Coastguard Workerdefm S2_lsr : xtype_reg_acc<"lsr", srl, 0b01>; 5287*9880d681SAndroid Build Coastguard Workerdefm S2_lsl : xtype_reg_acc<"lsl", shl, 0b11>; 5288*9880d681SAndroid Build Coastguard Worker 5289*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5290*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 5291*9880d681SAndroid Build Coastguard Workerclass T_S3op_1 <string mnemonic, RegisterClass RC, bits<2> MajOp, bits<3> MinOp, 5292*9880d681SAndroid Build Coastguard Worker bit SwapOps, bit isSat = 0, bit isRnd = 0, bit hasShift = 0> 5293*9880d681SAndroid Build Coastguard Worker : SInst <(outs RC:$dst), 5294*9880d681SAndroid Build Coastguard Worker (ins DoubleRegs:$src1, DoubleRegs:$src2), 5295*9880d681SAndroid Build Coastguard Worker "$dst = "#mnemonic#"($src1, $src2)"#!if(isRnd, ":rnd", "") 5296*9880d681SAndroid Build Coastguard Worker #!if(hasShift,":>>1","") 5297*9880d681SAndroid Build Coastguard Worker #!if(isSat, ":sat", ""), 5298*9880d681SAndroid Build Coastguard Worker [], "", S_3op_tc_2_SLOT23 > { 5299*9880d681SAndroid Build Coastguard Worker bits<5> dst; 5300*9880d681SAndroid Build Coastguard Worker bits<5> src1; 5301*9880d681SAndroid Build Coastguard Worker bits<5> src2; 5302*9880d681SAndroid Build Coastguard Worker 5303*9880d681SAndroid Build Coastguard Worker let IClass = 0b1100; 5304*9880d681SAndroid Build Coastguard Worker 5305*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0001; 5306*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = MajOp; 5307*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = !if (SwapOps, src2, src1); 5308*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = !if (SwapOps, src1, src2); 5309*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = MinOp; 5310*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 5311*9880d681SAndroid Build Coastguard Worker } 5312*9880d681SAndroid Build Coastguard Worker 5313*9880d681SAndroid Build Coastguard Workerclass T_S3op_64 <string mnemonic, bits<2> MajOp, bits<3> MinOp, bit SwapOps, 5314*9880d681SAndroid Build Coastguard Worker bit isSat = 0, bit isRnd = 0, bit hasShift = 0 > 5315*9880d681SAndroid Build Coastguard Worker : T_S3op_1 <mnemonic, DoubleRegs, MajOp, MinOp, SwapOps, 5316*9880d681SAndroid Build Coastguard Worker isSat, isRnd, hasShift>; 5317*9880d681SAndroid Build Coastguard Worker 5318*9880d681SAndroid Build Coastguard Workerlet Itinerary = S_3op_tc_1_SLOT23 in { 5319*9880d681SAndroid Build Coastguard Worker def S2_shuffeb : T_S3op_64 < "shuffeb", 0b00, 0b010, 0>; 5320*9880d681SAndroid Build Coastguard Worker def S2_shuffeh : T_S3op_64 < "shuffeh", 0b00, 0b110, 0>; 5321*9880d681SAndroid Build Coastguard Worker def S2_shuffob : T_S3op_64 < "shuffob", 0b00, 0b100, 1>; 5322*9880d681SAndroid Build Coastguard Worker def S2_shuffoh : T_S3op_64 < "shuffoh", 0b10, 0b000, 1>; 5323*9880d681SAndroid Build Coastguard Worker 5324*9880d681SAndroid Build Coastguard Worker def S2_vtrunewh : T_S3op_64 < "vtrunewh", 0b10, 0b010, 0>; 5325*9880d681SAndroid Build Coastguard Worker def S2_vtrunowh : T_S3op_64 < "vtrunowh", 0b10, 0b100, 0>; 5326*9880d681SAndroid Build Coastguard Worker} 5327*9880d681SAndroid Build Coastguard Worker 5328*9880d681SAndroid Build Coastguard Workerdef S2_lfsp : T_S3op_64 < "lfs", 0b10, 0b110, 0>; 5329*9880d681SAndroid Build Coastguard Worker 5330*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 5331*9880d681SAndroid Build Coastguard Workerclass T_S3op_2 <string mnemonic, bits<3> MajOp, bit SwapOps> 5332*9880d681SAndroid Build Coastguard Worker : SInst < (outs DoubleRegs:$Rdd), 5333*9880d681SAndroid Build Coastguard Worker (ins DoubleRegs:$Rss, DoubleRegs:$Rtt, PredRegs:$Pu), 5334*9880d681SAndroid Build Coastguard Worker "$Rdd = "#mnemonic#"($Rss, $Rtt, $Pu)", 5335*9880d681SAndroid Build Coastguard Worker [], "", S_3op_tc_1_SLOT23 > { 5336*9880d681SAndroid Build Coastguard Worker bits<5> Rdd; 5337*9880d681SAndroid Build Coastguard Worker bits<5> Rss; 5338*9880d681SAndroid Build Coastguard Worker bits<5> Rtt; 5339*9880d681SAndroid Build Coastguard Worker bits<2> Pu; 5340*9880d681SAndroid Build Coastguard Worker 5341*9880d681SAndroid Build Coastguard Worker let IClass = 0b1100; 5342*9880d681SAndroid Build Coastguard Worker 5343*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0010; 5344*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = MajOp; 5345*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = !if (SwapOps, Rtt, Rss); 5346*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = !if (SwapOps, Rss, Rtt); 5347*9880d681SAndroid Build Coastguard Worker let Inst{6-5} = Pu; 5348*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rdd; 5349*9880d681SAndroid Build Coastguard Worker } 5350*9880d681SAndroid Build Coastguard Worker 5351*9880d681SAndroid Build Coastguard Workerdef S2_valignrb : T_S3op_2 < "valignb", 0b000, 1>; 5352*9880d681SAndroid Build Coastguard Workerdef S2_vsplicerb : T_S3op_2 < "vspliceb", 0b100, 0>; 5353*9880d681SAndroid Build Coastguard Worker 5354*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5355*9880d681SAndroid Build Coastguard Worker// Template class used by vector shift, vector rotate, vector neg, 5356*9880d681SAndroid Build Coastguard Worker// 32-bit shift, 64-bit shifts, etc. 5357*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5358*9880d681SAndroid Build Coastguard Worker 5359*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 5360*9880d681SAndroid Build Coastguard Workerclass T_S3op_3 <string mnemonic, RegisterClass RC, bits<2> MajOp, 5361*9880d681SAndroid Build Coastguard Worker bits<2> MinOp, bit isSat = 0, list<dag> pattern = [] > 5362*9880d681SAndroid Build Coastguard Worker : SInst <(outs RC:$dst), 5363*9880d681SAndroid Build Coastguard Worker (ins RC:$src1, IntRegs:$src2), 5364*9880d681SAndroid Build Coastguard Worker "$dst = "#mnemonic#"($src1, $src2)"#!if(isSat, ":sat", ""), 5365*9880d681SAndroid Build Coastguard Worker pattern, "", S_3op_tc_1_SLOT23> { 5366*9880d681SAndroid Build Coastguard Worker bits<5> dst; 5367*9880d681SAndroid Build Coastguard Worker bits<5> src1; 5368*9880d681SAndroid Build Coastguard Worker bits<5> src2; 5369*9880d681SAndroid Build Coastguard Worker 5370*9880d681SAndroid Build Coastguard Worker let IClass = 0b1100; 5371*9880d681SAndroid Build Coastguard Worker 5372*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = !if(!eq(!cast<string>(RC), "IntRegs"), 0b0110, 0b0011); 5373*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = MajOp; 5374*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src1; 5375*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = src2; 5376*9880d681SAndroid Build Coastguard Worker let Inst{7-6} = MinOp; 5377*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 5378*9880d681SAndroid Build Coastguard Worker } 5379*9880d681SAndroid Build Coastguard Worker 5380*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1 in 5381*9880d681SAndroid Build Coastguard Workerclass T_S3op_shift32 <string mnemonic, SDNode OpNode, bits<2> MinOp> 5382*9880d681SAndroid Build Coastguard Worker : T_S3op_3 <mnemonic, IntRegs, 0b01, MinOp, 0, 5383*9880d681SAndroid Build Coastguard Worker [(set (i32 IntRegs:$dst), (OpNode (i32 IntRegs:$src1), 5384*9880d681SAndroid Build Coastguard Worker (i32 IntRegs:$src2)))]>; 5385*9880d681SAndroid Build Coastguard Worker 5386*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, Itinerary = S_3op_tc_2_SLOT23 in 5387*9880d681SAndroid Build Coastguard Workerclass T_S3op_shift32_Sat <string mnemonic, bits<2> MinOp> 5388*9880d681SAndroid Build Coastguard Worker : T_S3op_3 <mnemonic, IntRegs, 0b00, MinOp, 1, []>; 5389*9880d681SAndroid Build Coastguard Worker 5390*9880d681SAndroid Build Coastguard Worker 5391*9880d681SAndroid Build Coastguard Workerclass T_S3op_shift64 <string mnemonic, SDNode OpNode, bits<2> MinOp> 5392*9880d681SAndroid Build Coastguard Worker : T_S3op_3 <mnemonic, DoubleRegs, 0b10, MinOp, 0, 5393*9880d681SAndroid Build Coastguard Worker [(set (i64 DoubleRegs:$dst), (OpNode (i64 DoubleRegs:$src1), 5394*9880d681SAndroid Build Coastguard Worker (i32 IntRegs:$src2)))]>; 5395*9880d681SAndroid Build Coastguard Worker 5396*9880d681SAndroid Build Coastguard Worker 5397*9880d681SAndroid Build Coastguard Workerclass T_S3op_shiftVect <string mnemonic, bits<2> MajOp, bits<2> MinOp> 5398*9880d681SAndroid Build Coastguard Worker : T_S3op_3 <mnemonic, DoubleRegs, MajOp, MinOp, 0, []>; 5399*9880d681SAndroid Build Coastguard Worker 5400*9880d681SAndroid Build Coastguard Worker 5401*9880d681SAndroid Build Coastguard Worker// Shift by register 5402*9880d681SAndroid Build Coastguard Worker// Rdd=[asr|lsr|asl|lsl](Rss,Rt) 5403*9880d681SAndroid Build Coastguard Worker 5404*9880d681SAndroid Build Coastguard Workerdef S2_asr_r_p : T_S3op_shift64 < "asr", sra, 0b00>; 5405*9880d681SAndroid Build Coastguard Workerdef S2_lsr_r_p : T_S3op_shift64 < "lsr", srl, 0b01>; 5406*9880d681SAndroid Build Coastguard Workerdef S2_asl_r_p : T_S3op_shift64 < "asl", shl, 0b10>; 5407*9880d681SAndroid Build Coastguard Workerdef S2_lsl_r_p : T_S3op_shift64 < "lsl", shl, 0b11>; 5408*9880d681SAndroid Build Coastguard Worker 5409*9880d681SAndroid Build Coastguard Worker// Rd=[asr|lsr|asl|lsl](Rs,Rt) 5410*9880d681SAndroid Build Coastguard Worker 5411*9880d681SAndroid Build Coastguard Workerdef S2_asr_r_r : T_S3op_shift32<"asr", sra, 0b00>; 5412*9880d681SAndroid Build Coastguard Workerdef S2_lsr_r_r : T_S3op_shift32<"lsr", srl, 0b01>; 5413*9880d681SAndroid Build Coastguard Workerdef S2_asl_r_r : T_S3op_shift32<"asl", shl, 0b10>; 5414*9880d681SAndroid Build Coastguard Workerdef S2_lsl_r_r : T_S3op_shift32<"lsl", shl, 0b11>; 5415*9880d681SAndroid Build Coastguard Worker 5416*9880d681SAndroid Build Coastguard Worker// Shift by register with saturation 5417*9880d681SAndroid Build Coastguard Worker// Rd=asr(Rs,Rt):sat 5418*9880d681SAndroid Build Coastguard Worker// Rd=asl(Rs,Rt):sat 5419*9880d681SAndroid Build Coastguard Worker 5420*9880d681SAndroid Build Coastguard Workerlet Defs = [USR_OVF] in { 5421*9880d681SAndroid Build Coastguard Worker def S2_asr_r_r_sat : T_S3op_shift32_Sat<"asr", 0b00>; 5422*9880d681SAndroid Build Coastguard Worker def S2_asl_r_r_sat : T_S3op_shift32_Sat<"asl", 0b10>; 5423*9880d681SAndroid Build Coastguard Worker} 5424*9880d681SAndroid Build Coastguard Worker 5425*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, hasSideEffects = 0 in 5426*9880d681SAndroid Build Coastguard Workerclass T_S3op_8 <string opc, bits<3> MinOp, bit isSat, bit isRnd, bit hasShift, bit hasSplat = 0> 5427*9880d681SAndroid Build Coastguard Worker : SInst < (outs IntRegs:$Rd), 5428*9880d681SAndroid Build Coastguard Worker (ins DoubleRegs:$Rss, IntRegs:$Rt), 5429*9880d681SAndroid Build Coastguard Worker "$Rd = "#opc#"($Rss, $Rt"#!if(hasSplat, "*", "")#")" 5430*9880d681SAndroid Build Coastguard Worker #!if(hasShift, ":<<1", "") 5431*9880d681SAndroid Build Coastguard Worker #!if(isRnd, ":rnd", "") 5432*9880d681SAndroid Build Coastguard Worker #!if(isSat, ":sat", ""), 5433*9880d681SAndroid Build Coastguard Worker [], "", S_3op_tc_1_SLOT23 > { 5434*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 5435*9880d681SAndroid Build Coastguard Worker bits<5> Rss; 5436*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 5437*9880d681SAndroid Build Coastguard Worker 5438*9880d681SAndroid Build Coastguard Worker let IClass = 0b1100; 5439*9880d681SAndroid Build Coastguard Worker 5440*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0101; 5441*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rss; 5442*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rt; 5443*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = MinOp; 5444*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 5445*9880d681SAndroid Build Coastguard Worker } 5446*9880d681SAndroid Build Coastguard Worker 5447*9880d681SAndroid Build Coastguard Workerdef S2_asr_r_svw_trun : T_S3op_8<"vasrw", 0b010, 0, 0, 0>; 5448*9880d681SAndroid Build Coastguard Worker 5449*9880d681SAndroid Build Coastguard Workerlet Defs = [USR_OVF], Itinerary = S_3op_tc_2_SLOT23 in 5450*9880d681SAndroid Build Coastguard Workerdef S2_vcrotate : T_S3op_shiftVect < "vcrotate", 0b11, 0b00>; 5451*9880d681SAndroid Build Coastguard Worker 5452*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 5453*9880d681SAndroid Build Coastguard Workerclass T_S3op_7 <string mnemonic, bit MajOp > 5454*9880d681SAndroid Build Coastguard Worker : SInst <(outs DoubleRegs:$Rdd), 5455*9880d681SAndroid Build Coastguard Worker (ins DoubleRegs:$Rss, DoubleRegs:$Rtt, u3Imm:$u3), 5456*9880d681SAndroid Build Coastguard Worker "$Rdd = "#mnemonic#"($Rss, $Rtt, #$u3)" , 5457*9880d681SAndroid Build Coastguard Worker [], "", S_3op_tc_1_SLOT23 > { 5458*9880d681SAndroid Build Coastguard Worker bits<5> Rdd; 5459*9880d681SAndroid Build Coastguard Worker bits<5> Rss; 5460*9880d681SAndroid Build Coastguard Worker bits<5> Rtt; 5461*9880d681SAndroid Build Coastguard Worker bits<3> u3; 5462*9880d681SAndroid Build Coastguard Worker 5463*9880d681SAndroid Build Coastguard Worker let IClass = 0b1100; 5464*9880d681SAndroid Build Coastguard Worker 5465*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0000; 5466*9880d681SAndroid Build Coastguard Worker let Inst{23} = MajOp; 5467*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = !if(MajOp, Rss, Rtt); 5468*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = !if(MajOp, Rtt, Rss); 5469*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = u3; 5470*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rdd; 5471*9880d681SAndroid Build Coastguard Worker } 5472*9880d681SAndroid Build Coastguard Worker 5473*9880d681SAndroid Build Coastguard Workerdef S2_valignib : T_S3op_7 < "valignb", 0>; 5474*9880d681SAndroid Build Coastguard Workerdef S2_vspliceib : T_S3op_7 < "vspliceb", 1>; 5475*9880d681SAndroid Build Coastguard Worker 5476*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5477*9880d681SAndroid Build Coastguard Worker// Template class for 'insert bitfield' instructions 5478*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5479*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 5480*9880d681SAndroid Build Coastguard Workerclass T_S3op_insert <string mnemonic, RegisterClass RC> 5481*9880d681SAndroid Build Coastguard Worker : SInst <(outs RC:$dst), 5482*9880d681SAndroid Build Coastguard Worker (ins RC:$src1, RC:$src2, DoubleRegs:$src3), 5483*9880d681SAndroid Build Coastguard Worker "$dst = "#mnemonic#"($src2, $src3)" , 5484*9880d681SAndroid Build Coastguard Worker [], "$src1 = $dst", S_3op_tc_1_SLOT23 > { 5485*9880d681SAndroid Build Coastguard Worker bits<5> dst; 5486*9880d681SAndroid Build Coastguard Worker bits<5> src2; 5487*9880d681SAndroid Build Coastguard Worker bits<5> src3; 5488*9880d681SAndroid Build Coastguard Worker 5489*9880d681SAndroid Build Coastguard Worker let IClass = 0b1100; 5490*9880d681SAndroid Build Coastguard Worker 5491*9880d681SAndroid Build Coastguard Worker let Inst{27-26} = 0b10; 5492*9880d681SAndroid Build Coastguard Worker let Inst{25-24} = !if(!eq(!cast<string>(RC), "IntRegs"), 0b00, 0b10); 5493*9880d681SAndroid Build Coastguard Worker let Inst{23} = 0b0; 5494*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src2; 5495*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = src3; 5496*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 5497*9880d681SAndroid Build Coastguard Worker } 5498*9880d681SAndroid Build Coastguard Worker 5499*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 5500*9880d681SAndroid Build Coastguard Workerclass T_S2op_insert <bits<4> RegTyBits, RegisterClass RC, Operand ImmOp> 5501*9880d681SAndroid Build Coastguard Worker : SInst <(outs RC:$dst), (ins RC:$dst2, RC:$src1, ImmOp:$src2, ImmOp:$src3), 5502*9880d681SAndroid Build Coastguard Worker "$dst = insert($src1, #$src2, #$src3)", 5503*9880d681SAndroid Build Coastguard Worker [], "$dst2 = $dst", S_2op_tc_2_SLOT23> { 5504*9880d681SAndroid Build Coastguard Worker bits<5> dst; 5505*9880d681SAndroid Build Coastguard Worker bits<5> src1; 5506*9880d681SAndroid Build Coastguard Worker bits<6> src2; 5507*9880d681SAndroid Build Coastguard Worker bits<6> src3; 5508*9880d681SAndroid Build Coastguard Worker bit bit23; 5509*9880d681SAndroid Build Coastguard Worker bit bit13; 5510*9880d681SAndroid Build Coastguard Worker string ImmOpStr = !cast<string>(ImmOp); 5511*9880d681SAndroid Build Coastguard Worker 5512*9880d681SAndroid Build Coastguard Worker let bit23 = !if (!eq(ImmOpStr, "u6Imm"), src3{5}, 0); 5513*9880d681SAndroid Build Coastguard Worker let bit13 = !if (!eq(ImmOpStr, "u6Imm"), src2{5}, 0); 5514*9880d681SAndroid Build Coastguard Worker 5515*9880d681SAndroid Build Coastguard Worker let IClass = 0b1000; 5516*9880d681SAndroid Build Coastguard Worker 5517*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = RegTyBits; 5518*9880d681SAndroid Build Coastguard Worker let Inst{23} = bit23; 5519*9880d681SAndroid Build Coastguard Worker let Inst{22-21} = src3{4-3}; 5520*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src1; 5521*9880d681SAndroid Build Coastguard Worker let Inst{13} = bit13; 5522*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = src2{4-0}; 5523*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = src3{2-0}; 5524*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 5525*9880d681SAndroid Build Coastguard Worker } 5526*9880d681SAndroid Build Coastguard Worker 5527*9880d681SAndroid Build Coastguard Worker// Rx=insert(Rs,Rtt) 5528*9880d681SAndroid Build Coastguard Worker// Rx=insert(Rs,#u5,#U5) 5529*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1 in { 5530*9880d681SAndroid Build Coastguard Worker def S2_insert_rp : T_S3op_insert <"insert", IntRegs>; 5531*9880d681SAndroid Build Coastguard Worker def S2_insert : T_S2op_insert <0b1111, IntRegs, u5Imm>; 5532*9880d681SAndroid Build Coastguard Worker} 5533*9880d681SAndroid Build Coastguard Worker 5534*9880d681SAndroid Build Coastguard Worker// Rxx=insert(Rss,Rtt) 5535*9880d681SAndroid Build Coastguard Worker// Rxx=insert(Rss,#u6,#U6) 5536*9880d681SAndroid Build Coastguard Workerdef S2_insertp_rp : T_S3op_insert<"insert", DoubleRegs>; 5537*9880d681SAndroid Build Coastguard Workerdef S2_insertp : T_S2op_insert <0b0011, DoubleRegs, u6Imm>; 5538*9880d681SAndroid Build Coastguard Worker 5539*9880d681SAndroid Build Coastguard Worker 5540*9880d681SAndroid Build Coastguard Workerdef SDTHexagonINSERT: 5541*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 4, [SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, 5542*9880d681SAndroid Build Coastguard Worker SDTCisInt<0>, SDTCisVT<3, i32>, SDTCisVT<4, i32>]>; 5543*9880d681SAndroid Build Coastguard Workerdef SDTHexagonINSERTRP: 5544*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 3, [SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, 5545*9880d681SAndroid Build Coastguard Worker SDTCisInt<0>, SDTCisVT<3, i64>]>; 5546*9880d681SAndroid Build Coastguard Worker 5547*9880d681SAndroid Build Coastguard Workerdef HexagonINSERT : SDNode<"HexagonISD::INSERT", SDTHexagonINSERT>; 5548*9880d681SAndroid Build Coastguard Workerdef HexagonINSERTRP : SDNode<"HexagonISD::INSERTRP", SDTHexagonINSERTRP>; 5549*9880d681SAndroid Build Coastguard Worker 5550*9880d681SAndroid Build Coastguard Workerdef: Pat<(HexagonINSERT I32:$Rs, I32:$Rt, u5ImmPred:$u1, u5ImmPred:$u2), 5551*9880d681SAndroid Build Coastguard Worker (S2_insert I32:$Rs, I32:$Rt, u5ImmPred:$u1, u5ImmPred:$u2)>; 5552*9880d681SAndroid Build Coastguard Workerdef: Pat<(HexagonINSERT I64:$Rs, I64:$Rt, u6ImmPred:$u1, u6ImmPred:$u2), 5553*9880d681SAndroid Build Coastguard Worker (S2_insertp I64:$Rs, I64:$Rt, u6ImmPred:$u1, u6ImmPred:$u2)>; 5554*9880d681SAndroid Build Coastguard Workerdef: Pat<(HexagonINSERTRP I32:$Rs, I32:$Rt, I64:$Ru), 5555*9880d681SAndroid Build Coastguard Worker (S2_insert_rp I32:$Rs, I32:$Rt, I64:$Ru)>; 5556*9880d681SAndroid Build Coastguard Workerdef: Pat<(HexagonINSERTRP I64:$Rs, I64:$Rt, I64:$Ru), 5557*9880d681SAndroid Build Coastguard Worker (S2_insertp_rp I64:$Rs, I64:$Rt, I64:$Ru)>; 5558*9880d681SAndroid Build Coastguard Worker 5559*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 100 in 5560*9880d681SAndroid Build Coastguard Workerdef: Pat<(or (or (shl (HexagonINSERT (i32 (zextloadi8 (add I32:$b, 2))), 5561*9880d681SAndroid Build Coastguard Worker (i32 (extloadi8 (add I32:$b, 3))), 5562*9880d681SAndroid Build Coastguard Worker 24, 8), 5563*9880d681SAndroid Build Coastguard Worker (i32 16)), 5564*9880d681SAndroid Build Coastguard Worker (shl (i32 (zextloadi8 (add I32:$b, 1))), (i32 8))), 5565*9880d681SAndroid Build Coastguard Worker (zextloadi8 I32:$b)), 5566*9880d681SAndroid Build Coastguard Worker (A2_swiz (L2_loadri_io I32:$b, 0))>; 5567*9880d681SAndroid Build Coastguard Worker 5568*9880d681SAndroid Build Coastguard Worker 5569*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5570*9880d681SAndroid Build Coastguard Worker// Template class for 'extract bitfield' instructions 5571*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5572*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, hasSideEffects = 0 in 5573*9880d681SAndroid Build Coastguard Workerclass T_S3op_extract <string mnemonic, bits<2> MinOp> 5574*9880d681SAndroid Build Coastguard Worker : SInst <(outs IntRegs:$Rd), (ins IntRegs:$Rs, DoubleRegs:$Rtt), 5575*9880d681SAndroid Build Coastguard Worker "$Rd = "#mnemonic#"($Rs, $Rtt)", 5576*9880d681SAndroid Build Coastguard Worker [], "", S_3op_tc_2_SLOT23 > { 5577*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 5578*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 5579*9880d681SAndroid Build Coastguard Worker bits<5> Rtt; 5580*9880d681SAndroid Build Coastguard Worker 5581*9880d681SAndroid Build Coastguard Worker let IClass = 0b1100; 5582*9880d681SAndroid Build Coastguard Worker 5583*9880d681SAndroid Build Coastguard Worker let Inst{27-22} = 0b100100; 5584*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 5585*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = Rtt; 5586*9880d681SAndroid Build Coastguard Worker let Inst{7-6} = MinOp; 5587*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 5588*9880d681SAndroid Build Coastguard Worker } 5589*9880d681SAndroid Build Coastguard Worker 5590*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 5591*9880d681SAndroid Build Coastguard Workerclass T_S2op_extract <string mnemonic, bits<4> RegTyBits, 5592*9880d681SAndroid Build Coastguard Worker RegisterClass RC, Operand ImmOp> 5593*9880d681SAndroid Build Coastguard Worker : SInst <(outs RC:$dst), (ins RC:$src1, ImmOp:$src2, ImmOp:$src3), 5594*9880d681SAndroid Build Coastguard Worker "$dst = "#mnemonic#"($src1, #$src2, #$src3)", 5595*9880d681SAndroid Build Coastguard Worker [], "", S_2op_tc_2_SLOT23> { 5596*9880d681SAndroid Build Coastguard Worker bits<5> dst; 5597*9880d681SAndroid Build Coastguard Worker bits<5> src1; 5598*9880d681SAndroid Build Coastguard Worker bits<6> src2; 5599*9880d681SAndroid Build Coastguard Worker bits<6> src3; 5600*9880d681SAndroid Build Coastguard Worker bit bit23; 5601*9880d681SAndroid Build Coastguard Worker bit bit13; 5602*9880d681SAndroid Build Coastguard Worker string ImmOpStr = !cast<string>(ImmOp); 5603*9880d681SAndroid Build Coastguard Worker 5604*9880d681SAndroid Build Coastguard Worker let bit23 = !if (!eq(ImmOpStr, "u6Imm"), src3{5}, 5605*9880d681SAndroid Build Coastguard Worker !if (!eq(mnemonic, "extractu"), 0, 1)); 5606*9880d681SAndroid Build Coastguard Worker 5607*9880d681SAndroid Build Coastguard Worker let bit13 = !if (!eq(ImmOpStr, "u6Imm"), src2{5}, 0); 5608*9880d681SAndroid Build Coastguard Worker 5609*9880d681SAndroid Build Coastguard Worker let IClass = 0b1000; 5610*9880d681SAndroid Build Coastguard Worker 5611*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = RegTyBits; 5612*9880d681SAndroid Build Coastguard Worker let Inst{23} = bit23; 5613*9880d681SAndroid Build Coastguard Worker let Inst{22-21} = src3{4-3}; 5614*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src1; 5615*9880d681SAndroid Build Coastguard Worker let Inst{13} = bit13; 5616*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = src2{4-0}; 5617*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = src3{2-0}; 5618*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 5619*9880d681SAndroid Build Coastguard Worker } 5620*9880d681SAndroid Build Coastguard Worker 5621*9880d681SAndroid Build Coastguard Worker// Extract bitfield 5622*9880d681SAndroid Build Coastguard Worker 5623*9880d681SAndroid Build Coastguard Worker// Rdd=extractu(Rss,Rtt) 5624*9880d681SAndroid Build Coastguard Worker// Rdd=extractu(Rss,#u6,#U6) 5625*9880d681SAndroid Build Coastguard Workerdef S2_extractup_rp : T_S3op_64 < "extractu", 0b00, 0b000, 0>; 5626*9880d681SAndroid Build Coastguard Workerdef S2_extractup : T_S2op_extract <"extractu", 0b0001, DoubleRegs, u6Imm>; 5627*9880d681SAndroid Build Coastguard Worker 5628*9880d681SAndroid Build Coastguard Worker// Rd=extractu(Rs,Rtt) 5629*9880d681SAndroid Build Coastguard Worker// Rd=extractu(Rs,#u5,#U5) 5630*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1 in { 5631*9880d681SAndroid Build Coastguard Worker def S2_extractu_rp : T_S3op_extract<"extractu", 0b00>; 5632*9880d681SAndroid Build Coastguard Worker def S2_extractu : T_S2op_extract <"extractu", 0b1101, IntRegs, u5Imm>; 5633*9880d681SAndroid Build Coastguard Worker} 5634*9880d681SAndroid Build Coastguard Worker 5635*9880d681SAndroid Build Coastguard Workerdef SDTHexagonEXTRACTU: 5636*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 3, [SDTCisSameAs<0, 1>, SDTCisInt<0>, SDTCisInt<1>, 5637*9880d681SAndroid Build Coastguard Worker SDTCisVT<2, i32>, SDTCisVT<3, i32>]>; 5638*9880d681SAndroid Build Coastguard Workerdef SDTHexagonEXTRACTURP: 5639*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCisSameAs<0, 1>, SDTCisInt<0>, SDTCisInt<1>, 5640*9880d681SAndroid Build Coastguard Worker SDTCisVT<2, i64>]>; 5641*9880d681SAndroid Build Coastguard Worker 5642*9880d681SAndroid Build Coastguard Workerdef HexagonEXTRACTU : SDNode<"HexagonISD::EXTRACTU", SDTHexagonEXTRACTU>; 5643*9880d681SAndroid Build Coastguard Workerdef HexagonEXTRACTURP : SDNode<"HexagonISD::EXTRACTURP", SDTHexagonEXTRACTURP>; 5644*9880d681SAndroid Build Coastguard Worker 5645*9880d681SAndroid Build Coastguard Workerdef: Pat<(HexagonEXTRACTU I32:$src1, u5ImmPred:$src2, u5ImmPred:$src3), 5646*9880d681SAndroid Build Coastguard Worker (S2_extractu I32:$src1, u5ImmPred:$src2, u5ImmPred:$src3)>; 5647*9880d681SAndroid Build Coastguard Workerdef: Pat<(HexagonEXTRACTU I64:$src1, u6ImmPred:$src2, u6ImmPred:$src3), 5648*9880d681SAndroid Build Coastguard Worker (S2_extractup I64:$src1, u6ImmPred:$src2, u6ImmPred:$src3)>; 5649*9880d681SAndroid Build Coastguard Workerdef: Pat<(HexagonEXTRACTURP I32:$src1, I64:$src2), 5650*9880d681SAndroid Build Coastguard Worker (S2_extractu_rp I32:$src1, I64:$src2)>; 5651*9880d681SAndroid Build Coastguard Workerdef: Pat<(HexagonEXTRACTURP I64:$src1, I64:$src2), 5652*9880d681SAndroid Build Coastguard Worker (S2_extractup_rp I64:$src1, I64:$src2)>; 5653*9880d681SAndroid Build Coastguard Worker 5654*9880d681SAndroid Build Coastguard Worker// Change the sign of the immediate for Rd=-mpyi(Rs,#u8) 5655*9880d681SAndroid Build Coastguard Workerdef: Pat<(mul (i32 IntRegs:$src1), (ineg n8ImmPred:$src2)), 5656*9880d681SAndroid Build Coastguard Worker (M2_mpysin IntRegs:$src1, u8ImmPred:$src2)>; 5657*9880d681SAndroid Build Coastguard Worker 5658*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5659*9880d681SAndroid Build Coastguard Worker// :raw for of tableindx[bdhw] insns 5660*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5661*9880d681SAndroid Build Coastguard Worker 5662*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in 5663*9880d681SAndroid Build Coastguard Workerclass tableidxRaw<string OpStr, bits<2>MinOp> 5664*9880d681SAndroid Build Coastguard Worker : SInst <(outs IntRegs:$Rx), 5665*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$_dst_, IntRegs:$Rs, u4Imm:$u4, s6Imm:$S6), 5666*9880d681SAndroid Build Coastguard Worker "$Rx = "#OpStr#"($Rs, #$u4, #$S6):raw", 5667*9880d681SAndroid Build Coastguard Worker [], "$Rx = $_dst_" > { 5668*9880d681SAndroid Build Coastguard Worker bits<5> Rx; 5669*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 5670*9880d681SAndroid Build Coastguard Worker bits<4> u4; 5671*9880d681SAndroid Build Coastguard Worker bits<6> S6; 5672*9880d681SAndroid Build Coastguard Worker 5673*9880d681SAndroid Build Coastguard Worker let IClass = 0b1000; 5674*9880d681SAndroid Build Coastguard Worker 5675*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b0111; 5676*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = MinOp; 5677*9880d681SAndroid Build Coastguard Worker let Inst{21} = u4{3}; 5678*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 5679*9880d681SAndroid Build Coastguard Worker let Inst{13-8} = S6; 5680*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = u4{2-0}; 5681*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rx; 5682*9880d681SAndroid Build Coastguard Worker } 5683*9880d681SAndroid Build Coastguard Worker 5684*9880d681SAndroid Build Coastguard Workerdef S2_tableidxb : tableidxRaw<"tableidxb", 0b00>; 5685*9880d681SAndroid Build Coastguard Workerdef S2_tableidxh : tableidxRaw<"tableidxh", 0b01>; 5686*9880d681SAndroid Build Coastguard Workerdef S2_tableidxw : tableidxRaw<"tableidxw", 0b10>; 5687*9880d681SAndroid Build Coastguard Workerdef S2_tableidxd : tableidxRaw<"tableidxd", 0b11>; 5688*9880d681SAndroid Build Coastguard Worker 5689*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5690*9880d681SAndroid Build Coastguard Worker// Template class for 'table index' instructions which are assembler mapped 5691*9880d681SAndroid Build Coastguard Worker// to their :raw format. 5692*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5693*9880d681SAndroid Build Coastguard Workerlet isPseudo = 1 in 5694*9880d681SAndroid Build Coastguard Workerclass tableidx_goodsyntax <string mnemonic> 5695*9880d681SAndroid Build Coastguard Worker : SInst <(outs IntRegs:$Rx), 5696*9880d681SAndroid Build Coastguard Worker (ins IntRegs:$_dst_, IntRegs:$Rs, u4Imm:$u4, u5Imm:$u5), 5697*9880d681SAndroid Build Coastguard Worker "$Rx = "#mnemonic#"($Rs, #$u4, #$u5)", 5698*9880d681SAndroid Build Coastguard Worker [], "$Rx = $_dst_" >; 5699*9880d681SAndroid Build Coastguard Worker 5700*9880d681SAndroid Build Coastguard Workerdef S2_tableidxb_goodsyntax : tableidx_goodsyntax<"tableidxb">; 5701*9880d681SAndroid Build Coastguard Workerdef S2_tableidxh_goodsyntax : tableidx_goodsyntax<"tableidxh">; 5702*9880d681SAndroid Build Coastguard Workerdef S2_tableidxw_goodsyntax : tableidx_goodsyntax<"tableidxw">; 5703*9880d681SAndroid Build Coastguard Workerdef S2_tableidxd_goodsyntax : tableidx_goodsyntax<"tableidxd">; 5704*9880d681SAndroid Build Coastguard Worker 5705*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5706*9880d681SAndroid Build Coastguard Worker// V3 Instructions + 5707*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5708*9880d681SAndroid Build Coastguard Worker 5709*9880d681SAndroid Build Coastguard Workerinclude "HexagonInstrInfoV3.td" 5710*9880d681SAndroid Build Coastguard Worker 5711*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5712*9880d681SAndroid Build Coastguard Worker// V3 Instructions - 5713*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5714*9880d681SAndroid Build Coastguard Worker 5715*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5716*9880d681SAndroid Build Coastguard Worker// V4 Instructions + 5717*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5718*9880d681SAndroid Build Coastguard Worker 5719*9880d681SAndroid Build Coastguard Workerinclude "HexagonInstrInfoV4.td" 5720*9880d681SAndroid Build Coastguard Worker 5721*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5722*9880d681SAndroid Build Coastguard Worker// V4 Instructions - 5723*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5724*9880d681SAndroid Build Coastguard Worker 5725*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5726*9880d681SAndroid Build Coastguard Worker// V5 Instructions + 5727*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5728*9880d681SAndroid Build Coastguard Worker 5729*9880d681SAndroid Build Coastguard Workerinclude "HexagonInstrInfoV5.td" 5730*9880d681SAndroid Build Coastguard Worker 5731*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5732*9880d681SAndroid Build Coastguard Worker// V5 Instructions - 5733*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5734*9880d681SAndroid Build Coastguard Worker 5735*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5736*9880d681SAndroid Build Coastguard Worker// V60 Instructions + 5737*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5738*9880d681SAndroid Build Coastguard Worker 5739*9880d681SAndroid Build Coastguard Workerinclude "HexagonInstrInfoV60.td" 5740*9880d681SAndroid Build Coastguard Worker 5741*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5742*9880d681SAndroid Build Coastguard Worker// V60 Instructions - 5743*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5744*9880d681SAndroid Build Coastguard Worker 5745*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5746*9880d681SAndroid Build Coastguard Worker// ALU32/64/Vector + 5747*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===/// 5748*9880d681SAndroid Build Coastguard Worker 5749*9880d681SAndroid Build Coastguard Workerinclude "HexagonInstrInfoVector.td" 5750*9880d681SAndroid Build Coastguard Worker 5751*9880d681SAndroid Build Coastguard Workerinclude "HexagonInstrAlias.td" 5752*9880d681SAndroid Build Coastguard Workerinclude "HexagonSystemInst.td" 5753*9880d681SAndroid Build Coastguard Worker 5754