1 //===-- MBlazeInstrFormats.td - MB Instruction defs --------*- tablegen -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // Format specifies the encoding used by the instruction. This is part of the 11 // ad-hoc solution used to emit machine instruction encodings by our machine 12 // code emitter. 13 class Format<bits<6> val> { 14 bits<6> Value = val; 15 } 16 17 def FPseudo : Format<0>; 18 def FRRR : Format<1>; // ADD, OR, etc. 19 def FRRI : Format<2>; // ADDI, ORI, etc. 20 def FCRR : Format<3>; // PUTD, WDC, WIC, BEQ, BNE, BGE, etc. 21 def FCRI : Format<4>; // RTID, RTED, RTSD, BEQI, BNEI, BGEI, etc. 22 def FRCR : Format<5>; // BRLD, BRALD, GETD 23 def FRCI : Format<6>; // BRLID, BRALID, MSRCLR, MSRSET 24 def FCCR : Format<7>; // BR, BRA, BRD, etc. 25 def FCCI : Format<8>; // IMM, BRI, BRAI, BRID, etc. 26 def FRRCI : Format<9>; // BSRLI, BSRAI, BSLLI 27 def FRRC : Format<10>; // SEXT8, SEXT16, SRA, SRC, SRL, FLT, FINT, FSQRT 28 def FRCX : Format<11>; // GET 29 def FRCS : Format<12>; // MFS 30 def FCRCS : Format<13>; // MTS 31 def FCRCX : Format<14>; // PUT 32 def FCX : Format<15>; // TPUT 33 def FCR : Format<16>; // TPUTD 34 def FRIR : Format<17>; // RSUBI 35 def FRRRR : Format<18>; // RSUB, FRSUB 36 def FRI : Format<19>; // RSUB, FRSUB 37 def FC : Format<20>; // NOP 38 def FRR : Format<21>; // CLZ 39 40 //===----------------------------------------------------------------------===// 41 // Describe MBlaze instructions format 42 // 43 // CPU INSTRUCTION FORMATS 44 // 45 // opcode - operation code. 46 // rd - dst reg. 47 // ra - first src. reg. 48 // rb - second src. reg. 49 // imm16 - 16-bit immediate value. 50 // 51 //===----------------------------------------------------------------------===// 52 53 // Generic MBlaze Format 54 class MBlazeInst<bits<6> op, Format form, dag outs, dag ins, string asmstr, 55 list<dag> pattern, InstrItinClass itin> : Instruction { 56 let Namespace = "MBlaze"; 57 field bits<32> Inst; 58 59 bits<6> opcode = op; 60 Format Form = form; 61 bits<6> FormBits = Form.Value; 62 63 // Top 6 bits are the 'opcode' field 64 let Inst{0-5} = opcode; 65 66 // If the instruction is marked as a pseudo, set isCodeGenOnly so that the 67 // assembler and disassmbler ignore it. 68 let isCodeGenOnly = !eq(!cast<string>(form), "FPseudo"); 69 70 dag OutOperandList = outs; 71 dag InOperandList = ins; 72 73 let AsmString = asmstr; 74 let Pattern = pattern; 75 let Itinerary = itin; 76 77 // TSFlags layout should be kept in sync with MBlazeInstrInfo.h. 78 let TSFlags{5-0} = FormBits; 79 } 80 81 //===----------------------------------------------------------------------===// 82 // Pseudo instruction class 83 //===----------------------------------------------------------------------===// 84 class MBlazePseudo<dag outs, dag ins, string asmstr, list<dag> pattern>: 85 MBlazeInst<0x0, FPseudo, outs, ins, asmstr, pattern, IIC_Pseudo>; 86 87 //===----------------------------------------------------------------------===// 88 // Type A instruction class in MBlaze : <|opcode|rd|ra|rb|flags|> 89 //===----------------------------------------------------------------------===// 90 91 class TA<bits<6> op, bits<11> flags, dag outs, dag ins, string asmstr, 92 list<dag> pattern, InstrItinClass itin> : 93 MBlazeInst<op,FRRR,outs, ins, asmstr, pattern, itin> 94 { 95 bits<5> rd; 96 bits<5> ra; 97 bits<5> rb; 98 99 let Inst{6-10} = rd; 100 let Inst{11-15} = ra; 101 let Inst{16-20} = rb; 102 let Inst{21-31} = flags; 103 } 104 105 //===----------------------------------------------------------------------===// 106 // Type B instruction class in MBlaze : <|opcode|rd|ra|immediate|> 107 //===----------------------------------------------------------------------===// 108 109 class TB<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern, 110 InstrItinClass itin> : 111 MBlazeInst<op, FRRI, outs, ins, asmstr, pattern, itin> 112 { 113 bits<5> rd; 114 bits<5> ra; 115 bits<16> imm16; 116 117 let Inst{6-10} = rd; 118 let Inst{11-15} = ra; 119 let Inst{16-31} = imm16; 120 } 121 122 //===----------------------------------------------------------------------===// 123 // Type A instruction class in MBlaze but with the operands reversed 124 // in the LLVM DAG : <|opcode|rd|ra|rb|flags|> 125 //===----------------------------------------------------------------------===// 126 127 class TAR<bits<6> op, bits<11> flags, dag outs, dag ins, string asmstr, 128 list<dag> pattern, InstrItinClass itin> : 129 TA<op, flags, outs, ins, asmstr, pattern, itin> 130 { 131 bits<5> rrd; 132 bits<5> rrb; 133 bits<5> rra; 134 135 let Form = FRRRR; 136 137 let rd = rrd; 138 let ra = rra; 139 let rb = rrb; 140 } 141 142 //===----------------------------------------------------------------------===// 143 // Type B instruction class in MBlaze but with the operands reversed in 144 // the LLVM DAG : <|opcode|rd|ra|immediate|> 145 //===----------------------------------------------------------------------===// 146 class TBR<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern, 147 InstrItinClass itin> : 148 TB<op, outs, ins, asmstr, pattern, itin> { 149 bits<5> rrd; 150 bits<16> rimm16; 151 bits<5> rra; 152 153 let Form = FRIR; 154 155 let rd = rrd; 156 let ra = rra; 157 let imm16 = rimm16; 158 } 159 160 //===----------------------------------------------------------------------===// 161 // Shift immediate instruction class in MBlaze : <|opcode|rd|ra|immediate|> 162 //===----------------------------------------------------------------------===// 163 class SHT<bits<6> op, bits<2> flags, dag outs, dag ins, string asmstr, 164 list<dag> pattern, InstrItinClass itin> : 165 MBlazeInst<op, FRRI, outs, ins, asmstr, pattern, itin> { 166 bits<5> rd; 167 bits<5> ra; 168 bits<5> imm5; 169 170 let Inst{6-10} = rd; 171 let Inst{11-15} = ra; 172 let Inst{16-20} = 0x0; 173 let Inst{21-22} = flags; 174 let Inst{23-26} = 0x0; 175 let Inst{27-31} = imm5; 176 } 177 178 //===----------------------------------------------------------------------===// 179 // Special instruction class in MBlaze : <|opcode|rd|imm14|> 180 //===----------------------------------------------------------------------===// 181 class SPC<bits<6> op, bits<2> flags, dag outs, dag ins, string asmstr, 182 list<dag> pattern, InstrItinClass itin> : 183 MBlazeInst<op, FRI, outs, ins, asmstr, pattern, itin> { 184 bits<5> rd; 185 bits<14> imm14; 186 187 let Inst{6-10} = rd; 188 let Inst{11-15} = 0x0; 189 let Inst{16-17} = flags; 190 let Inst{18-31} = imm14; 191 } 192 193 //===----------------------------------------------------------------------===// 194 // MSR instruction class in MBlaze : <|opcode|rd|imm15|> 195 //===----------------------------------------------------------------------===// 196 class MSR<bits<6> op, bits<6> flags, dag outs, dag ins, string asmstr, 197 list<dag> pattern, InstrItinClass itin> : 198 MBlazeInst<op, FRI, outs, ins, asmstr, pattern, itin> { 199 bits<5> rd; 200 bits<15> imm15; 201 202 let Inst{6-10} = rd; 203 let Inst{11-16} = flags; 204 let Inst{17-31} = imm15; 205 } 206 207 //===----------------------------------------------------------------------===// 208 // TCLZ instruction class in MBlaze : <|opcode|rd|imm15|> 209 //===----------------------------------------------------------------------===// 210 class TCLZ<bits<6> op, bits<16> flags, dag outs, dag ins, string asmstr, 211 list<dag> pattern, InstrItinClass itin> : 212 MBlazeInst<op, FRR, outs, ins, asmstr, pattern, itin> { 213 bits<5> rd; 214 bits<5> ra; 215 216 let Inst{6-10} = rd; 217 let Inst{11-15} = ra; 218 let Inst{16-31} = flags; 219 } 220 221 //===----------------------------------------------------------------------===// 222 // MBAR instruction class in MBlaze : <|opcode|rd|imm15|> 223 //===----------------------------------------------------------------------===// 224 class MBAR<bits<6> op, bits<26> flags, dag outs, dag ins, string asmstr, 225 list<dag> pattern, InstrItinClass itin> : 226 MBlazeInst<op, FC, outs, ins, asmstr, pattern, itin> { 227 let Inst{6-31} = flags; 228 } 229