summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Lejeune <vljn@ovi.com>2012-12-08 18:10:17 +0100
committerTom Stellard <thomas.stellard@amd.com>2012-12-11 16:41:02 +0000
commitd6406678155b4271120582d5cdacc91fb4319d48 (patch)
treea38b6fc9db0abe139a7926120bf57cc7afefd15d
parent606a5c641845d8d6397bdf9de2b20108b541a8cd (diff)
R600: Split Word0 and Word1 in Export instruction
Reviewed-by: Tom Stellard <thomas.stellard@amd.com>
-rw-r--r--lib/Target/AMDGPU/MCTargetDesc/R600MCCodeEmitter.cpp4
-rw-r--r--lib/Target/AMDGPU/R600ISelLowering.cpp6
-rw-r--r--lib/Target/AMDGPU/R600Instructions.td99
3 files changed, 60 insertions, 49 deletions
diff --git a/lib/Target/AMDGPU/MCTargetDesc/R600MCCodeEmitter.cpp b/lib/Target/AMDGPU/MCTargetDesc/R600MCCodeEmitter.cpp
index 837bd8109c0..463dbaf6877 100644
--- a/lib/Target/AMDGPU/MCTargetDesc/R600MCCodeEmitter.cpp
+++ b/lib/Target/AMDGPU/MCTargetDesc/R600MCCodeEmitter.cpp
@@ -173,8 +173,8 @@ void R600MCCodeEmitter::EncodeInstruction(const MCInst &MI, raw_ostream &OS,
Emit(InstWord2, OS);
break;
}
- case AMDGPU::EG_Export:
- case AMDGPU::R600_Export: {
+ case AMDGPU::EG_ExportSwz:
+ case AMDGPU::R600_ExportSwz:
uint64_t Inst = getBinaryCodeForInstr(MI, Fixups);
EmitByte(INSTR_EXPORT, OS);
Emit(Inst, OS);
diff --git a/lib/Target/AMDGPU/R600ISelLowering.cpp b/lib/Target/AMDGPU/R600ISelLowering.cpp
index d17aa051521..8444b74123e 100644
--- a/lib/Target/AMDGPU/R600ISelLowering.cpp
+++ b/lib/Target/AMDGPU/R600ISelLowering.cpp
@@ -269,12 +269,12 @@ MachineBasicBlock * R600TargetLowering::EmitInstrWithCustomInserter(
return BB;
}
- case AMDGPU::EG_Export:
- case AMDGPU::R600_Export: {
+ case AMDGPU::EG_ExportSwz:
+ case AMDGPU::R600_ExportSwz: {
bool EOP = (llvm::next(I)->getOpcode() == AMDGPU::RETURN)? 1 : 0;
if (!EOP)
return BB;
- unsigned CfInst = (MI->getOpcode() == AMDGPU::EG_Export)? 84 : 40;
+ unsigned CfInst = (MI->getOpcode() == AMDGPU::EG_ExportSwz)? 84 : 40;
BuildMI(*BB, I, BB->findDebugLoc(I), TII->get(MI->getOpcode()))
.addOperand(MI->getOperand(0))
.addOperand(MI->getOperand(1))
diff --git a/lib/Target/AMDGPU/R600Instructions.td b/lib/Target/AMDGPU/R600Instructions.td
index 4572e7c63e2..784d80b7afc 100644
--- a/lib/Target/AMDGPU/R600Instructions.td
+++ b/lib/Target/AMDGPU/R600Instructions.td
@@ -460,6 +460,38 @@ def ExportType : SDTypeProfile<0, 7, [SDTCisFP<0>, SDTCisInt<1>]>;
def EXPORT: SDNode<"AMDGPUISD::EXPORT", ExportType,
[SDNPHasChain, SDNPSideEffect]>;
+class ExportWord0 {
+ field bits<32> Word0;
+
+ bits<13> arraybase;
+ bits<2> type;
+ bits<7> gpr;
+ bits<2> elem_size;
+
+ let Word0{12-0} = arraybase;
+ let Word0{14-13} = type;
+ let Word0{21-15} = gpr;
+ let Word0{22} = 0; // RW_REL
+ let Word0{29-23} = 0; // INDEX_GPR
+ let Word0{31-30} = elem_size;
+}
+
+class ExportSwzWord1 {
+ field bits<32> Word1;
+
+ bits<3> sw_x;
+ bits<3> sw_y;
+ bits<3> sw_z;
+ bits<3> sw_w;
+ bits<1> eop;
+ bits<8> inst;
+
+ let Word1{2-0} = sw_x;
+ let Word1{5-3} = sw_y;
+ let Word1{8-6} = sw_z;
+ let Word1{11-9} = sw_w;
+}
+
multiclass ExportPattern<Instruction ExportInst, bits<8> cf_inst> {
def : Pat<(int_R600_store_pixel_depth R600_Reg32:$reg),
(ExportInst
@@ -488,35 +520,16 @@ multiclass ExportPattern<Instruction ExportInst, bits<8> cf_inst> {
let isTerminator = 1, usesCustomInserter = 1 in {
-class ExportInst : InstR600ISA<(
+class ExportSwzInst : InstR600ISA<(
outs),
- (ins R600_Reg128:$src, i32imm:$type, i32imm:$arraybase,
+ (ins R600_Reg128:$gpr, i32imm:$type, i32imm:$arraybase,
i32imm:$sw_x, i32imm:$sw_y, i32imm:$sw_z, i32imm:$sw_w, i32imm:$inst,
i32imm:$eop),
- !strconcat("EXPORT", " $src"),
- []> {
- bits<13> arraybase;
- bits<2> type;
- bits<7> src;
-
- bits<3> sw_x;
- bits<3> sw_y;
- bits<3> sw_z;
- bits<3> sw_w;
-
- bits<1> eop;
- bits<8> inst;
-
- let Inst{12-0} = arraybase;
- let Inst{14-13} = type;
- let Inst{21-15} = src;
- let Inst{22} = 0; // RW_REL
- let Inst{29-23} = 0; // INDEX_GPR
- let Inst{31-30} = 3; // ELEM_SIZE
- let Inst{34-32} = sw_x;
- let Inst{37-35} = sw_y;
- let Inst{40-38} = sw_z;
- let Inst{43-41} = sw_w;
+ !strconcat("EXPORT", " $gpr"),
+ []>, ExportWord0, ExportSwzWord1 {
+ let elem_size = 3;
+ let Inst{31-0} = Word0;
+ let Inst{63-32} = Word1;
}
} // End isTerminator = 1, usesCustomInserter = 1
@@ -960,18 +973,17 @@ let Predicates = [isR600] in {
defm DIV_r600 : DIV_Common<RECIP_IEEE_r600>;
def TGSI_LIT_Z_r600 : TGSI_LIT_Z_Common<MUL_LIT_r600, LOG_CLAMPED_r600, EXP_IEEE_r600>;
- def R600_Export : ExportInst {
- let Inst{52-49} = 1; // BURST_COUNT
- let Inst{53} = eop;
- let Inst{54} = 1; // VALID_PIXEL_MODE
- let Inst{62-55} = inst;
- let Inst{63} = 1; // BARRIER
- }
-
def : Pat<(fsqrt R600_Reg32:$src),
(MUL R600_Reg32:$src, (RECIPSQRT_CLAMPED_r600 R600_Reg32:$src))>;
- defm : ExportPattern<R600_Export, 39>;
+ def R600_ExportSwz : ExportSwzInst {
+ let Word1{20-17} = 1; // BURST_COUNT
+ let Word1{21} = eop;
+ let Word1{22} = 1; // VALID_PIXEL_MODE
+ let Word1{30-23} = inst;
+ let Word1{31} = 1; // BARRIER
+ }
+ defm : ExportPattern<R600_ExportSwz, 39>;
}
// Helper pattern for normalizing inputs to triginomic instructions for R700+
@@ -1102,16 +1114,15 @@ let Predicates = [isEGorCayman] in {
def : Pat<(fp_to_uint R600_Reg32:$src0),
(FLT_TO_UINT_eg (TRUNC R600_Reg32:$src0))>;
- def EG_Export : ExportInst {
- let Inst{51-48} = 1; // BURST_COUNT
- let Inst{52} = 1; // VALID_PIXEL_MODE
- let Inst{53} = eop;
- let Inst{61-54} = inst;
- let Inst{62} = 0; // MARK
- let Inst{63} = 1; // BARRIER
+ def EG_ExportSwz : ExportSwzInst {
+ let Word1{19-16} = 1; // BURST_COUNT
+ let Word1{20} = 1; // VALID_PIXEL_MODE
+ let Word1{21} = eop;
+ let Word1{29-22} = inst;
+ let Word1{30} = 0; // MARK
+ let Word1{31} = 1; // BARRIER
}
-
- defm : ExportPattern<EG_Export, 83>;
+ defm : ExportPattern<EG_ExportSwz, 83>;
//===----------------------------------------------------------------------===//
// Memory read/write instructions