X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FR600%2FR600InstrFormats.td;h=ae3046d62e1e3d3a436017f30f25a818f959223e;hb=d08a9303614355cfdcac5f2c27c09ce809565423;hp=7cc48f454c974eac0685c879aaeb5830c847035a;hpb=2def95fc1e5537e5c156bd12027d41212e0b2fc2;p=oota-llvm.git diff --git a/lib/Target/R600/R600InstrFormats.td b/lib/Target/R600/R600InstrFormats.td index 7cc48f454c9..ae3046d62e1 100644 --- a/lib/Target/R600/R600InstrFormats.td +++ b/lib/Target/R600/R600InstrFormats.td @@ -23,9 +23,14 @@ class InstR600 pattern, bits<2> FlagOperandIdx = 0; bit Op1 = 0; bit Op2 = 0; + bit LDS_1A = 0; + bit LDS_1A1D = 0; bit HasNativeOperands = 0; bit VTXInst = 0; bit TEXInst = 0; + bit ALUInst = 0; + bit IsExport = 0; + bit LDS_1A2D = 0; let Namespace = "AMDGPU"; let OutOperandList = outs; @@ -47,21 +52,24 @@ class InstR600 pattern, let TSFlags{11} = Op2; let TSFlags{12} = VTXInst; let TSFlags{13} = TEXInst; + let TSFlags{14} = ALUInst; + let TSFlags{15} = LDS_1A; + let TSFlags{16} = LDS_1A1D; + let TSFlags{17} = IsExport; + let TSFlags{18} = LDS_1A2D; } //===----------------------------------------------------------------------===// // ALU instructions //===----------------------------------------------------------------------===// -class R600ALU_Word0 { +class R600_ALU_LDS_Word0 { field bits<32> Word0; bits<11> src0; - bits<1> src0_neg; bits<1> src0_rel; bits<11> src1; bits<1> src1_rel; - bits<1> src1_neg; bits<3> index_mode = 0; bits<2> pred_sel; bits<1> last; @@ -74,16 +82,23 @@ class R600ALU_Word0 { let Word0{8-0} = src0_sel; let Word0{9} = src0_rel; let Word0{11-10} = src0_chan; - let Word0{12} = src0_neg; let Word0{21-13} = src1_sel; let Word0{22} = src1_rel; let Word0{24-23} = src1_chan; - let Word0{25} = src1_neg; let Word0{28-26} = index_mode; let Word0{30-29} = pred_sel; let Word0{31} = last; } +class R600ALU_Word0 : R600_ALU_LDS_Word0 { + + bits<1> src0_neg; + bits<1> src1_neg; + + let Word0{12} = src0_neg; + let Word0{25} = src1_neg; +} + class R600ALU_Word1 { field bits<32> Word1; @@ -136,6 +151,30 @@ class R600ALU_Word1_OP3 alu_inst> : R600ALU_Word1{ let Word1{17-13} = alu_inst; } +class R600LDS_Word1 { + field bits<32> Word1; + + bits<11> src2; + bits<9> src2_sel = src2{8-0}; + bits<2> src2_chan = src2{10-9}; + bits<1> src2_rel; + // offset specifies the stride offset to the second set of data to be read + // from. This is a dword offset. + bits<5> alu_inst = 17; // OP3_INST_LDS_IDX_OP + bits<3> bank_swizzle; + bits<6> lds_op; + bits<2> dst_chan = 0; + + let Word1{8-0} = src2_sel; + let Word1{9} = src2_rel; + let Word1{11-10} = src2_chan; + let Word1{17-13} = alu_inst; + let Word1{20-18} = bank_swizzle; + let Word1{26-21} = lds_op; + let Word1{30-29} = dst_chan; +} + + /* XXX: R600 subtarget uses a slightly different encoding than the other subtargets. We currently handle this in R600MCCodeEmitter, but we may @@ -166,28 +205,46 @@ class R600ALU_Word1_OP2_r700 : R600ALU_Word1_OP2 { class VTX_WORD0 { field bits<32> Word0; - bits<7> SRC_GPR; + bits<7> src_gpr; bits<5> VC_INST; bits<2> FETCH_TYPE; bits<1> FETCH_WHOLE_QUAD; bits<8> BUFFER_ID; bits<1> SRC_REL; bits<2> SRC_SEL_X; - bits<6> MEGA_FETCH_COUNT; let Word0{4-0} = VC_INST; let Word0{6-5} = FETCH_TYPE; let Word0{7} = FETCH_WHOLE_QUAD; let Word0{15-8} = BUFFER_ID; - let Word0{22-16} = SRC_GPR; + let Word0{22-16} = src_gpr; let Word0{23} = SRC_REL; let Word0{25-24} = SRC_SEL_X; +} + +class VTX_WORD0_eg : VTX_WORD0 { + + bits<6> MEGA_FETCH_COUNT; + let Word0{31-26} = MEGA_FETCH_COUNT; } +class VTX_WORD0_cm : VTX_WORD0 { + + bits<2> SRC_SEL_Y; + bits<2> STRUCTURED_READ; + bits<1> LDS_REQ; + bits<1> COALESCED_READ; + + let Word0{27-26} = SRC_SEL_Y; + let Word0{29-28} = STRUCTURED_READ; + let Word0{30} = LDS_REQ; + let Word0{31} = COALESCED_READ; +} + class VTX_WORD1_GPR { field bits<32> Word1; - bits<7> DST_GPR; + bits<7> dst_gpr; bits<1> DST_REL; bits<3> DST_SEL_X; bits<3> DST_SEL_Y; @@ -199,7 +256,7 @@ class VTX_WORD1_GPR { bits<1> FORMAT_COMP_ALL; bits<1> SRF_MODE_ALL; - let Word1{6-0} = DST_GPR; + let Word1{6-0} = dst_gpr; let Word1{7} = DST_REL; let Word1{8} = 0; // Reserved let Word1{11-9} = DST_SEL_X; @@ -390,3 +447,48 @@ class CF_ALU_WORD1 { let Word1{30} = WHOLE_QUAD_MODE; let Word1{31} = BARRIER; } + +class CF_ALLOC_EXPORT_WORD0_RAT { + field bits<32> Word0; + + bits<4> rat_id; + bits<6> rat_inst; + bits<2> rim; + bits<2> type; + bits<7> rw_gpr; + bits<1> rw_rel; + bits<7> index_gpr; + bits<2> elem_size; + + let Word0{3-0} = rat_id; + let Word0{9-4} = rat_inst; + let Word0{10} = 0; // Reserved + let Word0{12-11} = rim; + let Word0{14-13} = type; + let Word0{21-15} = rw_gpr; + let Word0{22} = rw_rel; + let Word0{29-23} = index_gpr; + let Word0{31-30} = elem_size; +} + +class CF_ALLOC_EXPORT_WORD1_BUF { + field bits<32> Word1; + + bits<12> array_size; + bits<4> comp_mask; + bits<4> burst_count; + bits<1> vpm; + bits<1> eop; + bits<8> cf_inst; + bits<1> mark; + bits<1> barrier; + + let Word1{11-0} = array_size; + let Word1{15-12} = comp_mask; + let Word1{19-16} = burst_count; + let Word1{20} = vpm; + let Word1{21} = eop; + let Word1{29-22} = cf_inst; + let Word1{30} = mark; + let Word1{31} = barrier; +}