1*9880d681SAndroid Build Coastguard Worker//===-- SparcInstrFormats.td - Sparc Instruction Formats ---*- 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 Workerclass InstSP<dag outs, dag ins, string asmstr, list<dag> pattern, 11*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> 12*9880d681SAndroid Build Coastguard Worker : Instruction { 13*9880d681SAndroid Build Coastguard Worker field bits<32> Inst; 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker let Namespace = "SP"; 16*9880d681SAndroid Build Coastguard Worker let Size = 4; 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker bits<2> op; 19*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = op; // Top two bits are the 'op' field 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker dag OutOperandList = outs; 22*9880d681SAndroid Build Coastguard Worker dag InOperandList = ins; 23*9880d681SAndroid Build Coastguard Worker let AsmString = asmstr; 24*9880d681SAndroid Build Coastguard Worker let Pattern = pattern; 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "Sparc"; 27*9880d681SAndroid Build Coastguard Worker field bits<32> SoftFail = 0; 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker let Itinerary = itin; 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 33*9880d681SAndroid Build Coastguard Worker// Format #2 instruction classes in the Sparc 34*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker// Format 2 instructions 37*9880d681SAndroid Build Coastguard Workerclass F2<dag outs, dag ins, string asmstr, list<dag> pattern, 38*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> 39*9880d681SAndroid Build Coastguard Worker : InstSP<outs, ins, asmstr, pattern, itin> { 40*9880d681SAndroid Build Coastguard Worker bits<3> op2; 41*9880d681SAndroid Build Coastguard Worker bits<22> imm22; 42*9880d681SAndroid Build Coastguard Worker let op = 0; // op = 0 43*9880d681SAndroid Build Coastguard Worker let Inst{24-22} = op2; 44*9880d681SAndroid Build Coastguard Worker let Inst{21-0} = imm22; 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker// Specific F2 classes: SparcV8 manual, page 44 48*9880d681SAndroid Build Coastguard Worker// 49*9880d681SAndroid Build Coastguard Workerclass F2_1<bits<3> op2Val, dag outs, dag ins, string asmstr, list<dag> pattern, 50*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> 51*9880d681SAndroid Build Coastguard Worker : F2<outs, ins, asmstr, pattern, itin> { 52*9880d681SAndroid Build Coastguard Worker bits<5> rd; 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker let op2 = op2Val; 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker let Inst{29-25} = rd; 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerclass F2_2<bits<3> op2Val, bit annul, dag outs, dag ins, string asmstr, 60*9880d681SAndroid Build Coastguard Worker list<dag> pattern, InstrItinClass itin = NoItinerary> 61*9880d681SAndroid Build Coastguard Worker : F2<outs, ins, asmstr, pattern, itin> { 62*9880d681SAndroid Build Coastguard Worker bits<4> cond; 63*9880d681SAndroid Build Coastguard Worker let op2 = op2Val; 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker let Inst{29} = annul; 66*9880d681SAndroid Build Coastguard Worker let Inst{28-25} = cond; 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerclass F2_3<bits<3> op2Val, bit annul, bit pred, 70*9880d681SAndroid Build Coastguard Worker dag outs, dag ins, string asmstr, list<dag> pattern, 71*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> 72*9880d681SAndroid Build Coastguard Worker : InstSP<outs, ins, asmstr, pattern, itin> { 73*9880d681SAndroid Build Coastguard Worker bits<2> cc; 74*9880d681SAndroid Build Coastguard Worker bits<4> cond; 75*9880d681SAndroid Build Coastguard Worker bits<19> imm19; 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker let op = 0; // op = 0 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker let Inst{29} = annul; 80*9880d681SAndroid Build Coastguard Worker let Inst{28-25} = cond; 81*9880d681SAndroid Build Coastguard Worker let Inst{24-22} = op2Val; 82*9880d681SAndroid Build Coastguard Worker let Inst{21-20} = cc; 83*9880d681SAndroid Build Coastguard Worker let Inst{19} = pred; 84*9880d681SAndroid Build Coastguard Worker let Inst{18-0} = imm19; 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerclass F2_4<bits<3> cond, bit annul, bit pred, dag outs, dag ins, 88*9880d681SAndroid Build Coastguard Worker string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary> 89*9880d681SAndroid Build Coastguard Worker : InstSP<outs, ins, asmstr, pattern, itin> { 90*9880d681SAndroid Build Coastguard Worker bits<16> imm16; 91*9880d681SAndroid Build Coastguard Worker bits<5> rs1; 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker let op = 0; // op = 0 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker let Inst{29} = annul; 96*9880d681SAndroid Build Coastguard Worker let Inst{28} = 0; 97*9880d681SAndroid Build Coastguard Worker let Inst{27-25} = cond; 98*9880d681SAndroid Build Coastguard Worker let Inst{24-22} = 0b011; 99*9880d681SAndroid Build Coastguard Worker let Inst{21-20} = imm16{15-14}; 100*9880d681SAndroid Build Coastguard Worker let Inst{19} = pred; 101*9880d681SAndroid Build Coastguard Worker let Inst{18-14} = rs1; 102*9880d681SAndroid Build Coastguard Worker let Inst{13-0} = imm16{13-0}; 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 107*9880d681SAndroid Build Coastguard Worker// Format #3 instruction classes in the Sparc 108*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Workerclass F3<dag outs, dag ins, string asmstr, list<dag> pattern, 111*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> 112*9880d681SAndroid Build Coastguard Worker : InstSP<outs, ins, asmstr, pattern, itin> { 113*9880d681SAndroid Build Coastguard Worker bits<5> rd; 114*9880d681SAndroid Build Coastguard Worker bits<6> op3; 115*9880d681SAndroid Build Coastguard Worker bits<5> rs1; 116*9880d681SAndroid Build Coastguard Worker let op{1} = 1; // Op = 2 or 3 117*9880d681SAndroid Build Coastguard Worker let Inst{29-25} = rd; 118*9880d681SAndroid Build Coastguard Worker let Inst{24-19} = op3; 119*9880d681SAndroid Build Coastguard Worker let Inst{18-14} = rs1; 120*9880d681SAndroid Build Coastguard Worker} 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker// Specific F3 classes: SparcV8 manual, page 44 123*9880d681SAndroid Build Coastguard Worker// 124*9880d681SAndroid Build Coastguard Workerclass F3_1_asi<bits<2> opVal, bits<6> op3val, dag outs, dag ins, 125*9880d681SAndroid Build Coastguard Worker string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary> 126*9880d681SAndroid Build Coastguard Worker : F3<outs, ins, asmstr, pattern, itin> { 127*9880d681SAndroid Build Coastguard Worker bits<8> asi; 128*9880d681SAndroid Build Coastguard Worker bits<5> rs2; 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker let op = opVal; 131*9880d681SAndroid Build Coastguard Worker let op3 = op3val; 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0; // i field = 0 134*9880d681SAndroid Build Coastguard Worker let Inst{12-5} = asi; // address space identifier 135*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = rs2; 136*9880d681SAndroid Build Coastguard Worker} 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Workerclass F3_1<bits<2> opVal, bits<6> op3val, dag outs, dag ins, string asmstr, 139*9880d681SAndroid Build Coastguard Worker list<dag> pattern, InstrItinClass itin = IIC_iu_instr> 140*9880d681SAndroid Build Coastguard Worker : F3_1_asi<opVal, op3val, outs, ins, asmstr, pattern, itin> { 141*9880d681SAndroid Build Coastguard Worker let asi = 0; 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workerclass F3_2<bits<2> opVal, bits<6> op3val, dag outs, dag ins, 145*9880d681SAndroid Build Coastguard Worker string asmstr, list<dag> pattern, InstrItinClass itin = IIC_iu_instr> 146*9880d681SAndroid Build Coastguard Worker : F3<outs, ins, asmstr, pattern, itin> { 147*9880d681SAndroid Build Coastguard Worker bits<13> simm13; 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Worker let op = opVal; 150*9880d681SAndroid Build Coastguard Worker let op3 = op3val; 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker let Inst{13} = 1; // i field = 1 153*9880d681SAndroid Build Coastguard Worker let Inst{12-0} = simm13; 154*9880d681SAndroid Build Coastguard Worker} 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Worker// floating-point 157*9880d681SAndroid Build Coastguard Workerclass F3_3<bits<2> opVal, bits<6> op3val, bits<9> opfval, dag outs, dag ins, 158*9880d681SAndroid Build Coastguard Worker string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary> 159*9880d681SAndroid Build Coastguard Worker : F3<outs, ins, asmstr, pattern, itin> { 160*9880d681SAndroid Build Coastguard Worker bits<5> rs2; 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker let op = opVal; 163*9880d681SAndroid Build Coastguard Worker let op3 = op3val; 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker let Inst{13-5} = opfval; // fp opcode 166*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = rs2; 167*9880d681SAndroid Build Coastguard Worker} 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker// floating-point unary operations. 170*9880d681SAndroid Build Coastguard Workerclass F3_3u<bits<2> opVal, bits<6> op3val, bits<9> opfval, dag outs, dag ins, 171*9880d681SAndroid Build Coastguard Worker string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary> 172*9880d681SAndroid Build Coastguard Worker : F3<outs, ins, asmstr, pattern, itin> { 173*9880d681SAndroid Build Coastguard Worker bits<5> rs2; 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Worker let op = opVal; 176*9880d681SAndroid Build Coastguard Worker let op3 = op3val; 177*9880d681SAndroid Build Coastguard Worker let rs1 = 0; 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Worker let Inst{13-5} = opfval; // fp opcode 180*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = rs2; 181*9880d681SAndroid Build Coastguard Worker} 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Worker// floating-point compares. 184*9880d681SAndroid Build Coastguard Workerclass F3_3c<bits<2> opVal, bits<6> op3val, bits<9> opfval, dag outs, dag ins, 185*9880d681SAndroid Build Coastguard Worker string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary> 186*9880d681SAndroid Build Coastguard Worker : F3<outs, ins, asmstr, pattern, itin> { 187*9880d681SAndroid Build Coastguard Worker bits<5> rs2; 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Worker let op = opVal; 190*9880d681SAndroid Build Coastguard Worker let op3 = op3val; 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Worker let Inst{13-5} = opfval; // fp opcode 193*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = rs2; 194*9880d681SAndroid Build Coastguard Worker} 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Worker// Shift by register rs2. 197*9880d681SAndroid Build Coastguard Workerclass F3_Sr<bits<2> opVal, bits<6> op3val, bit xVal, dag outs, dag ins, 198*9880d681SAndroid Build Coastguard Worker string asmstr, list<dag> pattern, InstrItinClass itin = IIC_iu_instr> 199*9880d681SAndroid Build Coastguard Worker : F3<outs, ins, asmstr, pattern, itin> { 200*9880d681SAndroid Build Coastguard Worker bit x = xVal; // 1 for 64-bit shifts. 201*9880d681SAndroid Build Coastguard Worker bits<5> rs2; 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Worker let op = opVal; 204*9880d681SAndroid Build Coastguard Worker let op3 = op3val; 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0; // i field = 0 207*9880d681SAndroid Build Coastguard Worker let Inst{12} = x; // extended registers. 208*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = rs2; 209*9880d681SAndroid Build Coastguard Worker} 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard Worker// Shift by immediate. 212*9880d681SAndroid Build Coastguard Workerclass F3_Si<bits<2> opVal, bits<6> op3val, bit xVal, dag outs, dag ins, 213*9880d681SAndroid Build Coastguard Worker string asmstr, list<dag> pattern, InstrItinClass itin = IIC_iu_instr> 214*9880d681SAndroid Build Coastguard Worker : F3<outs, ins, asmstr, pattern, itin> { 215*9880d681SAndroid Build Coastguard Worker bit x = xVal; // 1 for 64-bit shifts. 216*9880d681SAndroid Build Coastguard Worker bits<6> shcnt; // shcnt32 / shcnt64. 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Worker let op = opVal; 219*9880d681SAndroid Build Coastguard Worker let op3 = op3val; 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Worker let Inst{13} = 1; // i field = 1 222*9880d681SAndroid Build Coastguard Worker let Inst{12} = x; // extended registers. 223*9880d681SAndroid Build Coastguard Worker let Inst{5-0} = shcnt; 224*9880d681SAndroid Build Coastguard Worker} 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Worker// Define rr and ri shift instructions with patterns. 227*9880d681SAndroid Build Coastguard Workermulticlass F3_S<string OpcStr, bits<6> Op3Val, bit XVal, SDNode OpNode, 228*9880d681SAndroid Build Coastguard Worker ValueType VT, RegisterClass RC, 229*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = IIC_iu_instr> { 230*9880d681SAndroid Build Coastguard Worker def rr : F3_Sr<2, Op3Val, XVal, (outs RC:$rd), (ins RC:$rs1, IntRegs:$rs2), 231*9880d681SAndroid Build Coastguard Worker !strconcat(OpcStr, " $rs1, $rs2, $rd"), 232*9880d681SAndroid Build Coastguard Worker [(set VT:$rd, (OpNode VT:$rs1, i32:$rs2))], 233*9880d681SAndroid Build Coastguard Worker itin>; 234*9880d681SAndroid Build Coastguard Worker def ri : F3_Si<2, Op3Val, XVal, (outs RC:$rd), (ins RC:$rs1, i32imm:$shcnt), 235*9880d681SAndroid Build Coastguard Worker !strconcat(OpcStr, " $rs1, $shcnt, $rd"), 236*9880d681SAndroid Build Coastguard Worker [(set VT:$rd, (OpNode VT:$rs1, (i32 imm:$shcnt)))], 237*9880d681SAndroid Build Coastguard Worker itin>; 238*9880d681SAndroid Build Coastguard Worker} 239*9880d681SAndroid Build Coastguard Worker 240*9880d681SAndroid Build Coastguard Workerclass F4<bits<6> op3, dag outs, dag ins, string asmstr, list<dag> pattern, 241*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> 242*9880d681SAndroid Build Coastguard Worker : InstSP<outs, ins, asmstr, pattern, itin> { 243*9880d681SAndroid Build Coastguard Worker bits<5> rd; 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Worker let op = 2; 246*9880d681SAndroid Build Coastguard Worker let Inst{29-25} = rd; 247*9880d681SAndroid Build Coastguard Worker let Inst{24-19} = op3; 248*9880d681SAndroid Build Coastguard Worker} 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Workerclass F4_1<bits<6> op3, dag outs, dag ins, 252*9880d681SAndroid Build Coastguard Worker string asmstr, list<dag> pattern, 253*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> 254*9880d681SAndroid Build Coastguard Worker : F4<op3, outs, ins, asmstr, pattern, itin> { 255*9880d681SAndroid Build Coastguard Worker bit intcc; 256*9880d681SAndroid Build Coastguard Worker bits<2> cc; 257*9880d681SAndroid Build Coastguard Worker bits<4> cond; 258*9880d681SAndroid Build Coastguard Worker bits<5> rs2; 259*9880d681SAndroid Build Coastguard Worker 260*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = rs2; 261*9880d681SAndroid Build Coastguard Worker let Inst{12-11} = cc; 262*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0; 263*9880d681SAndroid Build Coastguard Worker let Inst{17-14} = cond; 264*9880d681SAndroid Build Coastguard Worker let Inst{18} = intcc; 265*9880d681SAndroid Build Coastguard Worker} 266*9880d681SAndroid Build Coastguard Worker 267*9880d681SAndroid Build Coastguard Workerclass F4_2<bits<6> op3, dag outs, dag ins, 268*9880d681SAndroid Build Coastguard Worker string asmstr, list<dag> pattern, 269*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> 270*9880d681SAndroid Build Coastguard Worker : F4<op3, outs, ins, asmstr, pattern, itin> { 271*9880d681SAndroid Build Coastguard Worker bit intcc; 272*9880d681SAndroid Build Coastguard Worker bits<2> cc; 273*9880d681SAndroid Build Coastguard Worker bits<4> cond; 274*9880d681SAndroid Build Coastguard Worker bits<11> simm11; 275*9880d681SAndroid Build Coastguard Worker 276*9880d681SAndroid Build Coastguard Worker let Inst{10-0} = simm11; 277*9880d681SAndroid Build Coastguard Worker let Inst{12-11} = cc; 278*9880d681SAndroid Build Coastguard Worker let Inst{13} = 1; 279*9880d681SAndroid Build Coastguard Worker let Inst{17-14} = cond; 280*9880d681SAndroid Build Coastguard Worker let Inst{18} = intcc; 281*9880d681SAndroid Build Coastguard Worker} 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Workerclass F4_3<bits<6> op3, bits<6> opf_low, dag outs, dag ins, 284*9880d681SAndroid Build Coastguard Worker string asmstr, list<dag> pattern, 285*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> 286*9880d681SAndroid Build Coastguard Worker : F4<op3, outs, ins, asmstr, pattern, itin> { 287*9880d681SAndroid Build Coastguard Worker bits<4> cond; 288*9880d681SAndroid Build Coastguard Worker bit intcc; 289*9880d681SAndroid Build Coastguard Worker bits<2> opf_cc; 290*9880d681SAndroid Build Coastguard Worker bits<5> rs2; 291*9880d681SAndroid Build Coastguard Worker 292*9880d681SAndroid Build Coastguard Worker let Inst{18} = 0; 293*9880d681SAndroid Build Coastguard Worker let Inst{17-14} = cond; 294*9880d681SAndroid Build Coastguard Worker let Inst{13} = intcc; 295*9880d681SAndroid Build Coastguard Worker let Inst{12-11} = opf_cc; 296*9880d681SAndroid Build Coastguard Worker let Inst{10-5} = opf_low; 297*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = rs2; 298*9880d681SAndroid Build Coastguard Worker} 299*9880d681SAndroid Build Coastguard Worker 300*9880d681SAndroid Build Coastguard Workerclass F4_4r<bits<6> op3, bits<5> opf_low, bits<3> rcond, dag outs, dag ins, 301*9880d681SAndroid Build Coastguard Worker string asmstr, list<dag> pattern, 302*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> 303*9880d681SAndroid Build Coastguard Worker : F4<op3, outs, ins, asmstr, pattern, itin> { 304*9880d681SAndroid Build Coastguard Worker bits <5> rs1; 305*9880d681SAndroid Build Coastguard Worker bits <5> rs2; 306*9880d681SAndroid Build Coastguard Worker let Inst{18-14} = rs1; 307*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0; // IsImm 308*9880d681SAndroid Build Coastguard Worker let Inst{12-10} = rcond; 309*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = opf_low; 310*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = rs2; 311*9880d681SAndroid Build Coastguard Worker} 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Worker 314*9880d681SAndroid Build Coastguard Workerclass F4_4i<bits<6> op3, bits<3> rcond, dag outs, dag ins, 315*9880d681SAndroid Build Coastguard Worker string asmstr, list<dag> pattern, 316*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> 317*9880d681SAndroid Build Coastguard Worker : F4<op3, outs, ins, asmstr, pattern, itin> { 318*9880d681SAndroid Build Coastguard Worker bits<5> rs1; 319*9880d681SAndroid Build Coastguard Worker bits<10> simm10; 320*9880d681SAndroid Build Coastguard Worker let Inst{18-14} = rs1; 321*9880d681SAndroid Build Coastguard Worker let Inst{13} = 1; // IsImm 322*9880d681SAndroid Build Coastguard Worker let Inst{12-10} = rcond; 323*9880d681SAndroid Build Coastguard Worker let Inst{9-0} = simm10; 324*9880d681SAndroid Build Coastguard Worker} 325*9880d681SAndroid Build Coastguard Worker 326*9880d681SAndroid Build Coastguard Worker 327*9880d681SAndroid Build Coastguard Workerclass TRAPSP<bits<6> op3Val, bit isimm, dag outs, dag ins, 328*9880d681SAndroid Build Coastguard Worker string asmstr, list<dag> pattern, 329*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> 330*9880d681SAndroid Build Coastguard Worker : F3<outs, ins, asmstr, pattern, itin> { 331*9880d681SAndroid Build Coastguard Worker bits<4> cond; 332*9880d681SAndroid Build Coastguard Worker bits<2> cc; 333*9880d681SAndroid Build Coastguard Worker 334*9880d681SAndroid Build Coastguard Worker let op = 0b10; 335*9880d681SAndroid Build Coastguard Worker let rd{4} = 0; 336*9880d681SAndroid Build Coastguard Worker let rd{3-0} = cond; 337*9880d681SAndroid Build Coastguard Worker let op3 = op3Val; 338*9880d681SAndroid Build Coastguard Worker let Inst{13} = isimm; 339*9880d681SAndroid Build Coastguard Worker let Inst{12-11} = cc; 340*9880d681SAndroid Build Coastguard Worker 341*9880d681SAndroid Build Coastguard Worker} 342*9880d681SAndroid Build Coastguard Worker 343*9880d681SAndroid Build Coastguard Workerclass TRAPSPrr<bits<6> op3Val, dag outs, dag ins, 344*9880d681SAndroid Build Coastguard Worker string asmstr, list<dag> pattern, 345*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> 346*9880d681SAndroid Build Coastguard Worker : TRAPSP<op3Val, 0, outs, ins, asmstr, pattern, itin> { 347*9880d681SAndroid Build Coastguard Worker bits<5> rs2; 348*9880d681SAndroid Build Coastguard Worker 349*9880d681SAndroid Build Coastguard Worker let Inst{10-5} = 0; 350*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = rs2; 351*9880d681SAndroid Build Coastguard Worker} 352*9880d681SAndroid Build Coastguard Worker 353*9880d681SAndroid Build Coastguard Workerclass TRAPSPri<bits<6> op3Val, dag outs, dag ins, 354*9880d681SAndroid Build Coastguard Worker string asmstr, list<dag> pattern, 355*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> 356*9880d681SAndroid Build Coastguard Worker : TRAPSP<op3Val, 1, outs, ins, asmstr, pattern, itin> { 357*9880d681SAndroid Build Coastguard Worker bits<8> imm; 358*9880d681SAndroid Build Coastguard Worker 359*9880d681SAndroid Build Coastguard Worker let Inst{10-8} = 0; 360*9880d681SAndroid Build Coastguard Worker let Inst{7-0} = imm; 361*9880d681SAndroid Build Coastguard Worker} 362*9880d681SAndroid Build Coastguard Worker 363*9880d681SAndroid Build Coastguard Worker// Pseudo-instructions for alternate assembly syntax (never used by codegen). 364*9880d681SAndroid Build Coastguard Worker// These are aliases that require C++ handling to convert to the target 365*9880d681SAndroid Build Coastguard Worker// instruction, while InstAliases can be handled directly by tblgen. 366*9880d681SAndroid Build Coastguard Workerclass AsmPseudoInst<dag outs, dag ins, string asm> 367*9880d681SAndroid Build Coastguard Worker : InstSP<outs, ins, asm, []> { 368*9880d681SAndroid Build Coastguard Worker let isPseudo = 1; 369*9880d681SAndroid Build Coastguard Worker} 370