| Tom Stellard | 3d0823f | 2013-06-14 22:12:09 +0000 | [diff] [blame] | 1 | //===-- R600InstrFormats.td - R600 Instruction Encodings ------------------===// |
| 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 | // R600 Instruction format definitions. |
| 11 | // |
| 12 | //===----------------------------------------------------------------------===// |
| 13 | |
| 14 | class InstR600 <dag outs, dag ins, string asm, list<dag> pattern, |
| 15 | InstrItinClass itin> |
| 16 | : AMDGPUInst <outs, ins, asm, pattern> { |
| 17 | |
| 18 | field bits<64> Inst; |
| 19 | bit TransOnly = 0; |
| 20 | bit Trig = 0; |
| 21 | bit Op3 = 0; |
| 22 | bit isVector = 0; |
| 23 | bits<2> FlagOperandIdx = 0; |
| 24 | bit Op1 = 0; |
| 25 | bit Op2 = 0; |
| 26 | bit HasNativeOperands = 0; |
| 27 | bit VTXInst = 0; |
| 28 | bit TEXInst = 0; |
| 29 | |
| 30 | let Namespace = "AMDGPU"; |
| 31 | let OutOperandList = outs; |
| 32 | let InOperandList = ins; |
| 33 | let AsmString = asm; |
| 34 | let Pattern = pattern; |
| 35 | let Itinerary = itin; |
| 36 | |
| 37 | let TSFlags{0} = TransOnly; |
| 38 | let TSFlags{4} = Trig; |
| 39 | let TSFlags{5} = Op3; |
| 40 | |
| 41 | // Vector instructions are instructions that must fill all slots in an |
| 42 | // instruction group |
| 43 | let TSFlags{6} = isVector; |
| 44 | let TSFlags{8-7} = FlagOperandIdx; |
| 45 | let TSFlags{9} = HasNativeOperands; |
| 46 | let TSFlags{10} = Op1; |
| 47 | let TSFlags{11} = Op2; |
| 48 | let TSFlags{12} = VTXInst; |
| 49 | let TSFlags{13} = TEXInst; |
| 50 | } |
| 51 | |
| 52 | //===----------------------------------------------------------------------===// |
| 53 | // ALU instructions |
| 54 | //===----------------------------------------------------------------------===// |
| 55 | |
| 56 | class R600ALU_Word0 { |
| 57 | field bits<32> Word0; |
| 58 | |
| 59 | bits<11> src0; |
| 60 | bits<1> src0_neg; |
| 61 | bits<1> src0_rel; |
| 62 | bits<11> src1; |
| 63 | bits<1> src1_rel; |
| 64 | bits<1> src1_neg; |
| 65 | bits<3> index_mode = 0; |
| 66 | bits<2> pred_sel; |
| 67 | bits<1> last; |
| 68 | |
| 69 | bits<9> src0_sel = src0{8-0}; |
| 70 | bits<2> src0_chan = src0{10-9}; |
| 71 | bits<9> src1_sel = src1{8-0}; |
| 72 | bits<2> src1_chan = src1{10-9}; |
| 73 | |
| 74 | let Word0{8-0} = src0_sel; |
| 75 | let Word0{9} = src0_rel; |
| 76 | let Word0{11-10} = src0_chan; |
| 77 | let Word0{12} = src0_neg; |
| 78 | let Word0{21-13} = src1_sel; |
| 79 | let Word0{22} = src1_rel; |
| 80 | let Word0{24-23} = src1_chan; |
| 81 | let Word0{25} = src1_neg; |
| 82 | let Word0{28-26} = index_mode; |
| 83 | let Word0{30-29} = pred_sel; |
| 84 | let Word0{31} = last; |
| 85 | } |
| 86 | |
| 87 | class R600ALU_Word1 { |
| 88 | field bits<32> Word1; |
| 89 | |
| 90 | bits<11> dst; |
| 91 | bits<3> bank_swizzle; |
| 92 | bits<1> dst_rel; |
| 93 | bits<1> clamp; |
| 94 | |
| 95 | bits<7> dst_sel = dst{6-0}; |
| 96 | bits<2> dst_chan = dst{10-9}; |
| 97 | |
| 98 | let Word1{20-18} = bank_swizzle; |
| 99 | let Word1{27-21} = dst_sel; |
| 100 | let Word1{28} = dst_rel; |
| 101 | let Word1{30-29} = dst_chan; |
| 102 | let Word1{31} = clamp; |
| 103 | } |
| 104 | |
| 105 | class R600ALU_Word1_OP2 <bits<11> alu_inst> : R600ALU_Word1{ |
| 106 | |
| 107 | bits<1> src0_abs; |
| 108 | bits<1> src1_abs; |
| 109 | bits<1> update_exec_mask; |
| 110 | bits<1> update_pred; |
| 111 | bits<1> write; |
| 112 | bits<2> omod; |
| 113 | |
| 114 | let Word1{0} = src0_abs; |
| 115 | let Word1{1} = src1_abs; |
| 116 | let Word1{2} = update_exec_mask; |
| 117 | let Word1{3} = update_pred; |
| 118 | let Word1{4} = write; |
| 119 | let Word1{6-5} = omod; |
| 120 | let Word1{17-7} = alu_inst; |
| 121 | } |
| 122 | |
| 123 | class R600ALU_Word1_OP3 <bits<5> alu_inst> : R600ALU_Word1{ |
| 124 | |
| 125 | bits<11> src2; |
| 126 | bits<1> src2_rel; |
| 127 | bits<1> src2_neg; |
| 128 | |
| 129 | bits<9> src2_sel = src2{8-0}; |
| 130 | bits<2> src2_chan = src2{10-9}; |
| 131 | |
| 132 | let Word1{8-0} = src2_sel; |
| 133 | let Word1{9} = src2_rel; |
| 134 | let Word1{11-10} = src2_chan; |
| 135 | let Word1{12} = src2_neg; |
| 136 | let Word1{17-13} = alu_inst; |
| 137 | } |
| 138 | |
| 139 | /* |
| 140 | XXX: R600 subtarget uses a slightly different encoding than the other |
| 141 | subtargets. We currently handle this in R600MCCodeEmitter, but we may |
| 142 | want to use these instruction classes in the future. |
| 143 | |
| 144 | class R600ALU_Word1_OP2_r600 : R600ALU_Word1_OP2 { |
| 145 | |
| 146 | bits<1> fog_merge; |
| 147 | bits<10> alu_inst; |
| 148 | |
| 149 | let Inst{37} = fog_merge; |
| 150 | let Inst{39-38} = omod; |
| 151 | let Inst{49-40} = alu_inst; |
| 152 | } |
| 153 | |
| 154 | class R600ALU_Word1_OP2_r700 : R600ALU_Word1_OP2 { |
| 155 | |
| 156 | bits<11> alu_inst; |
| 157 | |
| 158 | let Inst{38-37} = omod; |
| 159 | let Inst{49-39} = alu_inst; |
| 160 | } |
| 161 | */ |
| 162 | |
| 163 | //===----------------------------------------------------------------------===// |
| 164 | // Vertex Fetch instructions |
| 165 | //===----------------------------------------------------------------------===// |
| 166 | |
| 167 | class VTX_WORD0 { |
| 168 | field bits<32> Word0; |
| 169 | bits<7> SRC_GPR; |
| 170 | bits<5> VC_INST; |
| 171 | bits<2> FETCH_TYPE; |
| 172 | bits<1> FETCH_WHOLE_QUAD; |
| 173 | bits<8> BUFFER_ID; |
| 174 | bits<1> SRC_REL; |
| 175 | bits<2> SRC_SEL_X; |
| 176 | bits<6> MEGA_FETCH_COUNT; |
| 177 | |
| 178 | let Word0{4-0} = VC_INST; |
| 179 | let Word0{6-5} = FETCH_TYPE; |
| 180 | let Word0{7} = FETCH_WHOLE_QUAD; |
| 181 | let Word0{15-8} = BUFFER_ID; |
| 182 | let Word0{22-16} = SRC_GPR; |
| 183 | let Word0{23} = SRC_REL; |
| 184 | let Word0{25-24} = SRC_SEL_X; |
| 185 | let Word0{31-26} = MEGA_FETCH_COUNT; |
| 186 | } |
| 187 | |
| 188 | class VTX_WORD1_GPR { |
| 189 | field bits<32> Word1; |
| 190 | bits<7> DST_GPR; |
| 191 | bits<1> DST_REL; |
| 192 | bits<3> DST_SEL_X; |
| 193 | bits<3> DST_SEL_Y; |
| 194 | bits<3> DST_SEL_Z; |
| 195 | bits<3> DST_SEL_W; |
| 196 | bits<1> USE_CONST_FIELDS; |
| 197 | bits<6> DATA_FORMAT; |
| 198 | bits<2> NUM_FORMAT_ALL; |
| 199 | bits<1> FORMAT_COMP_ALL; |
| 200 | bits<1> SRF_MODE_ALL; |
| 201 | |
| 202 | let Word1{6-0} = DST_GPR; |
| 203 | let Word1{7} = DST_REL; |
| 204 | let Word1{8} = 0; // Reserved |
| 205 | let Word1{11-9} = DST_SEL_X; |
| 206 | let Word1{14-12} = DST_SEL_Y; |
| 207 | let Word1{17-15} = DST_SEL_Z; |
| 208 | let Word1{20-18} = DST_SEL_W; |
| 209 | let Word1{21} = USE_CONST_FIELDS; |
| 210 | let Word1{27-22} = DATA_FORMAT; |
| 211 | let Word1{29-28} = NUM_FORMAT_ALL; |
| 212 | let Word1{30} = FORMAT_COMP_ALL; |
| 213 | let Word1{31} = SRF_MODE_ALL; |
| 214 | } |
| 215 | |
| 216 | //===----------------------------------------------------------------------===// |
| 217 | // Texture fetch instructions |
| 218 | //===----------------------------------------------------------------------===// |
| 219 | |
| 220 | class TEX_WORD0 { |
| 221 | field bits<32> Word0; |
| 222 | |
| 223 | bits<5> TEX_INST; |
| 224 | bits<2> INST_MOD; |
| 225 | bits<1> FETCH_WHOLE_QUAD; |
| 226 | bits<8> RESOURCE_ID; |
| 227 | bits<7> SRC_GPR; |
| 228 | bits<1> SRC_REL; |
| 229 | bits<1> ALT_CONST; |
| 230 | bits<2> RESOURCE_INDEX_MODE; |
| 231 | bits<2> SAMPLER_INDEX_MODE; |
| 232 | |
| 233 | let Word0{4-0} = TEX_INST; |
| 234 | let Word0{6-5} = INST_MOD; |
| 235 | let Word0{7} = FETCH_WHOLE_QUAD; |
| 236 | let Word0{15-8} = RESOURCE_ID; |
| 237 | let Word0{22-16} = SRC_GPR; |
| 238 | let Word0{23} = SRC_REL; |
| 239 | let Word0{24} = ALT_CONST; |
| 240 | let Word0{26-25} = RESOURCE_INDEX_MODE; |
| 241 | let Word0{28-27} = SAMPLER_INDEX_MODE; |
| 242 | } |
| 243 | |
| 244 | class TEX_WORD1 { |
| 245 | field bits<32> Word1; |
| 246 | |
| 247 | bits<7> DST_GPR; |
| 248 | bits<1> DST_REL; |
| 249 | bits<3> DST_SEL_X; |
| 250 | bits<3> DST_SEL_Y; |
| 251 | bits<3> DST_SEL_Z; |
| 252 | bits<3> DST_SEL_W; |
| 253 | bits<7> LOD_BIAS; |
| 254 | bits<1> COORD_TYPE_X; |
| 255 | bits<1> COORD_TYPE_Y; |
| 256 | bits<1> COORD_TYPE_Z; |
| 257 | bits<1> COORD_TYPE_W; |
| 258 | |
| 259 | let Word1{6-0} = DST_GPR; |
| 260 | let Word1{7} = DST_REL; |
| 261 | let Word1{11-9} = DST_SEL_X; |
| 262 | let Word1{14-12} = DST_SEL_Y; |
| 263 | let Word1{17-15} = DST_SEL_Z; |
| 264 | let Word1{20-18} = DST_SEL_W; |
| 265 | let Word1{27-21} = LOD_BIAS; |
| 266 | let Word1{28} = COORD_TYPE_X; |
| 267 | let Word1{29} = COORD_TYPE_Y; |
| 268 | let Word1{30} = COORD_TYPE_Z; |
| 269 | let Word1{31} = COORD_TYPE_W; |
| 270 | } |
| 271 | |
| 272 | class TEX_WORD2 { |
| 273 | field bits<32> Word2; |
| 274 | |
| 275 | bits<5> OFFSET_X; |
| 276 | bits<5> OFFSET_Y; |
| 277 | bits<5> OFFSET_Z; |
| 278 | bits<5> SAMPLER_ID; |
| 279 | bits<3> SRC_SEL_X; |
| 280 | bits<3> SRC_SEL_Y; |
| 281 | bits<3> SRC_SEL_Z; |
| 282 | bits<3> SRC_SEL_W; |
| 283 | |
| 284 | let Word2{4-0} = OFFSET_X; |
| 285 | let Word2{9-5} = OFFSET_Y; |
| 286 | let Word2{14-10} = OFFSET_Z; |
| 287 | let Word2{19-15} = SAMPLER_ID; |
| 288 | let Word2{22-20} = SRC_SEL_X; |
| 289 | let Word2{25-23} = SRC_SEL_Y; |
| 290 | let Word2{28-26} = SRC_SEL_Z; |
| 291 | let Word2{31-29} = SRC_SEL_W; |
| 292 | } |
| 293 | |
| 294 | //===----------------------------------------------------------------------===// |
| 295 | // Control Flow Instructions |
| 296 | //===----------------------------------------------------------------------===// |
| 297 | |
| 298 | class CF_WORD1_R600 { |
| 299 | field bits<32> Word1; |
| 300 | |
| 301 | bits<3> POP_COUNT; |
| 302 | bits<5> CF_CONST; |
| 303 | bits<2> COND; |
| 304 | bits<3> COUNT; |
| 305 | bits<6> CALL_COUNT; |
| 306 | bits<1> COUNT_3; |
| 307 | bits<1> END_OF_PROGRAM; |
| 308 | bits<1> VALID_PIXEL_MODE; |
| 309 | bits<7> CF_INST; |
| 310 | bits<1> WHOLE_QUAD_MODE; |
| 311 | bits<1> BARRIER; |
| 312 | |
| 313 | let Word1{2-0} = POP_COUNT; |
| 314 | let Word1{7-3} = CF_CONST; |
| 315 | let Word1{9-8} = COND; |
| 316 | let Word1{12-10} = COUNT; |
| 317 | let Word1{18-13} = CALL_COUNT; |
| 318 | let Word1{19} = COUNT_3; |
| 319 | let Word1{21} = END_OF_PROGRAM; |
| 320 | let Word1{22} = VALID_PIXEL_MODE; |
| 321 | let Word1{29-23} = CF_INST; |
| 322 | let Word1{30} = WHOLE_QUAD_MODE; |
| 323 | let Word1{31} = BARRIER; |
| 324 | } |
| 325 | |
| 326 | class CF_WORD0_EG { |
| 327 | field bits<32> Word0; |
| 328 | |
| 329 | bits<24> ADDR; |
| 330 | bits<3> JUMPTABLE_SEL; |
| 331 | |
| 332 | let Word0{23-0} = ADDR; |
| 333 | let Word0{26-24} = JUMPTABLE_SEL; |
| 334 | } |
| 335 | |
| 336 | class CF_WORD1_EG { |
| 337 | field bits<32> Word1; |
| 338 | |
| 339 | bits<3> POP_COUNT; |
| 340 | bits<5> CF_CONST; |
| 341 | bits<2> COND; |
| 342 | bits<6> COUNT; |
| 343 | bits<1> VALID_PIXEL_MODE; |
| 344 | bits<1> END_OF_PROGRAM; |
| 345 | bits<8> CF_INST; |
| 346 | bits<1> BARRIER; |
| 347 | |
| 348 | let Word1{2-0} = POP_COUNT; |
| 349 | let Word1{7-3} = CF_CONST; |
| 350 | let Word1{9-8} = COND; |
| 351 | let Word1{15-10} = COUNT; |
| 352 | let Word1{20} = VALID_PIXEL_MODE; |
| 353 | let Word1{21} = END_OF_PROGRAM; |
| 354 | let Word1{29-22} = CF_INST; |
| 355 | let Word1{31} = BARRIER; |
| 356 | } |
| 357 | |
| 358 | class CF_ALU_WORD0 { |
| 359 | field bits<32> Word0; |
| 360 | |
| 361 | bits<22> ADDR; |
| 362 | bits<4> KCACHE_BANK0; |
| 363 | bits<4> KCACHE_BANK1; |
| 364 | bits<2> KCACHE_MODE0; |
| 365 | |
| 366 | let Word0{21-0} = ADDR; |
| 367 | let Word0{25-22} = KCACHE_BANK0; |
| 368 | let Word0{29-26} = KCACHE_BANK1; |
| 369 | let Word0{31-30} = KCACHE_MODE0; |
| 370 | } |
| 371 | |
| 372 | class CF_ALU_WORD1 { |
| 373 | field bits<32> Word1; |
| 374 | |
| 375 | bits<2> KCACHE_MODE1; |
| 376 | bits<8> KCACHE_ADDR0; |
| 377 | bits<8> KCACHE_ADDR1; |
| 378 | bits<7> COUNT; |
| 379 | bits<1> ALT_CONST; |
| 380 | bits<4> CF_INST; |
| 381 | bits<1> WHOLE_QUAD_MODE; |
| 382 | bits<1> BARRIER; |
| 383 | |
| 384 | let Word1{1-0} = KCACHE_MODE1; |
| 385 | let Word1{9-2} = KCACHE_ADDR0; |
| 386 | let Word1{17-10} = KCACHE_ADDR1; |
| 387 | let Word1{24-18} = COUNT; |
| 388 | let Word1{25} = ALT_CONST; |
| 389 | let Word1{29-26} = CF_INST; |
| 390 | let Word1{30} = WHOLE_QUAD_MODE; |
| 391 | let Word1{31} = BARRIER; |
| 392 | } |
| Tom Stellard | d99b793 | 2013-06-14 22:12:19 +0000 | [diff] [blame^] | 393 | |
| 394 | class CF_ALLOC_EXPORT_WORD0_RAT { |
| 395 | field bits<32> Word0; |
| 396 | |
| 397 | bits<4> rat_id; |
| 398 | bits<6> rat_inst; |
| 399 | bits<2> rim; |
| 400 | bits<2> type; |
| 401 | bits<7> rw_gpr; |
| 402 | bits<1> rw_rel; |
| 403 | bits<7> index_gpr; |
| 404 | bits<2> elem_size; |
| 405 | |
| 406 | let Word0{3-0} = rat_id; |
| 407 | let Word0{9-4} = rat_inst; |
| 408 | let Word0{10} = 0; // Reserved |
| 409 | let Word0{12-11} = rim; |
| 410 | let Word0{14-13} = type; |
| 411 | let Word0{21-15} = rw_gpr; |
| 412 | let Word0{22} = rw_rel; |
| 413 | let Word0{29-23} = index_gpr; |
| 414 | let Word0{31-30} = elem_size; |
| 415 | } |
| 416 | |
| 417 | class CF_ALLOC_EXPORT_WORD1_BUF { |
| 418 | field bits<32> Word1; |
| 419 | |
| 420 | bits<12> array_size; |
| 421 | bits<4> comp_mask; |
| 422 | bits<4> burst_count; |
| 423 | bits<1> vpm; |
| 424 | bits<1> eop; |
| 425 | bits<8> cf_inst; |
| 426 | bits<1> mark; |
| 427 | bits<1> barrier; |
| 428 | |
| 429 | let Word1{11-0} = array_size; |
| 430 | let Word1{15-12} = comp_mask; |
| 431 | let Word1{19-16} = burst_count; |
| 432 | let Word1{20} = vpm; |
| 433 | let Word1{21} = eop; |
| 434 | let Word1{29-22} = cf_inst; |
| 435 | let Word1{30} = mark; |
| 436 | let Word1{31} = barrier; |
| 437 | } |