From: Matt Arsenault Date: Wed, 22 Feb 2017 20:37:12 +0000 (+0000) Subject: AMDGPU: Change exp with compr bit printing X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1b020b3be56e5c1bbbd80748b0e3a558ce8d25ce;p=llvm AMDGPU: Change exp with compr bit printing git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295873 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp b/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp index 208b5e22162..3aea3d6f361 100644 --- a/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp +++ b/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp @@ -672,11 +672,19 @@ template void AMDGPUInstPrinter::printExpSrcN(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O) { - int EnIdx = AMDGPU::getNamedOperandIdx(MI->getOpcode(), AMDGPU::OpName::en); + unsigned Opc = MI->getOpcode(); + int EnIdx = AMDGPU::getNamedOperandIdx(Opc, AMDGPU::OpName::en); unsigned En = MI->getOperand(EnIdx).getImm(); - // FIXME: What do we do with compr? The meaning of en changes depending on if - // compr is set. + int ComprIdx = AMDGPU::getNamedOperandIdx(Opc, AMDGPU::OpName::compr); + + // If compr is set, print as src0, src0, src1, src1 + if (MI->getOperand(ComprIdx).getImm()) { + if (N == 1 || N == 2) + --OpNo; + else if (N == 3) + OpNo -= 2; + } if (En & (1 << N)) printRegOperand(MI->getOperand(OpNo).getReg(), O, MRI); diff --git a/test/CodeGen/AMDGPU/llvm.amdgcn.exp.compr.ll b/test/CodeGen/AMDGPU/llvm.amdgcn.exp.compr.ll index 0b5b20be334..37ad164b773 100644 --- a/test/CodeGen/AMDGPU/llvm.amdgcn.exp.compr.ll +++ b/test/CodeGen/AMDGPU/llvm.amdgcn.exp.compr.ll @@ -16,27 +16,45 @@ define void @test_export_compr_zeroes_v2f16() #0 { ; GCN-LABEL: {{^}}test_export_compr_en_src0_v2f16: ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 0x40003c00 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 0x44003800 -; GCN: exp mrt0 [[SRC0]], off, off, off done compr{{$}} +; GCN: exp mrt0 [[SRC0]], [[SRC0]], off, off done compr{{$}} define void @test_export_compr_en_src0_v2f16() #0 { - call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 1, <2 x half> , <2 x half> , i1 true, i1 false) + call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 3, <2 x half> , <2 x half> , i1 true, i1 false) ret void } ; GCN-LABEL: {{^}}test_export_compr_en_src1_v2f16: ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 0x40003c00 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 0x44003800 -; GCN: exp mrt0 off, [[SRC1]], off, off done compr{{$}} +; GCN: exp mrt0 off, off, [[SRC1]], [[SRC1]] done compr{{$}} define void @test_export_compr_en_src1_v2f16() #0 { - call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 2, <2 x half> , <2 x half> , i1 true, i1 false) + call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 12, <2 x half> , <2 x half> , i1 true, i1 false) ret void } ; GCN-LABEL: {{^}}test_export_compr_en_src0_src1_v2f16: ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 0x40003c00 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 0x44003800 -; GCN: exp mrt0 [[SRC0]], [[SRC1]], off, off done compr{{$}} +; GCN: exp mrt0 [[SRC0]], [[SRC0]], [[SRC1]], [[SRC1]] done compr{{$}} define void @test_export_compr_en_src0_src1_v2f16() #0 { - call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 3, <2 x half> , <2 x half> , i1 true, i1 false) + call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 15, <2 x half> , <2 x half> , i1 true, i1 false) + ret void +} + +; GCN-LABEL: {{^}}test_export_compr_en_invalid2_v2f16: +; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 0x40003c00 +; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 0x44003800 +; GCN: exp mrt0 off, [[SRC0]], off, off done compr{{$}} +define void @test_export_compr_en_invalid2_v2f16() #0 { + call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 2, <2 x half> , <2 x half> , i1 true, i1 false) + ret void +} + +; GCN-LABEL: {{^}}test_export_compr_en_invalid10_v2f16: +; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 0x40003c00 +; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 0x44003800 +; GCN: exp mrt0 off, [[SRC0]], off, [[SRC1]] done compr{{$}} +define void @test_export_compr_en_invalid10_v2f16() #0 { + call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 10, <2 x half> , <2 x half> , i1 true, i1 false) ret void } @@ -53,22 +71,22 @@ define void @test_export_compr_mrt7_v2f16() #0 { ; GCN-LABEL: {{^}}test_export_compr_z_v2f16: ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 0x40003c00 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 0x44003800 -; GCN: exp mrtz [[SRC0]], [[SRC1]], off, off compr{{$}} -; GCN: exp mrtz [[SRC0]], [[SRC1]], off, off done compr{{$}} +; GCN: exp mrtz [[SRC0]], [[SRC0]], [[SRC1]], [[SRC1]] compr{{$}} +; GCN: exp mrtz [[SRC0]], [[SRC0]], [[SRC1]], [[SRC1]] done compr{{$}} define void @test_export_compr_z_v2f16() #0 { - call void @llvm.amdgcn.exp.compr.v2f16(i32 8, i32 3, <2 x half> , <2 x half> , i1 false, i1 false) - call void @llvm.amdgcn.exp.compr.v2f16(i32 8, i32 3, <2 x half> , <2 x half> , i1 true, i1 false) + call void @llvm.amdgcn.exp.compr.v2f16(i32 8, i32 15, <2 x half> , <2 x half> , i1 false, i1 false) + call void @llvm.amdgcn.exp.compr.v2f16(i32 8, i32 15, <2 x half> , <2 x half> , i1 true, i1 false) ret void } ; GCN-LABEL: {{^}}test_export_compr_vm_v2f16: ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 0x40003c00 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 0x44003800 -; GCN: exp mrt0 [[SRC0]], [[SRC1]], off, off compr vm{{$}} -; GCN: exp mrt0 [[SRC0]], [[SRC1]], off, off done compr vm{{$}} +; GCN: exp mrt0 [[SRC0]], [[SRC0]], [[SRC1]], [[SRC1]] compr vm{{$}} +; GCN: exp mrt0 [[SRC0]], [[SRC0]], [[SRC1]], [[SRC1]] done compr vm{{$}} define void @test_export_compr_vm_v2f16() #0 { - call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 3, <2 x half> , <2 x half> , i1 false, i1 true) - call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 3, <2 x half> , <2 x half> , i1 true, i1 true) + call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 15, <2 x half> , <2 x half> , i1 false, i1 true) + call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 15, <2 x half> , <2 x half> , i1 true, i1 true) ret void } @@ -93,18 +111,18 @@ define void @test_export_compr_en_src0_v2i16() #0 { ; GCN-LABEL: {{^}}test_export_compr_en_src1_v2i16: ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 0x20001 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 0x40005 -; GCN: exp mrt0 off, [[SRC1]], off, off done compr{{$}} +; GCN: exp mrt0 off, off, [[SRC1]], [[SRC1]] done compr{{$}} define void @test_export_compr_en_src1_v2i16() #0 { - call void @llvm.amdgcn.exp.compr.v2i16(i32 0, i32 2, <2 x i16> , <2 x i16> , i1 true, i1 false) + call void @llvm.amdgcn.exp.compr.v2i16(i32 0, i32 12, <2 x i16> , <2 x i16> , i1 true, i1 false) ret void } ; GCN-LABEL: {{^}}test_export_compr_en_src0_src1_v2i16: ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 0x20001 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 0x40005 -; GCN: exp mrt0 [[SRC0]], [[SRC1]], off, off done compr{{$}} +; GCN: exp mrt0 [[SRC0]], [[SRC0]], [[SRC1]], [[SRC1]] done compr{{$}} define void @test_export_compr_en_src0_src1_v2i16() #0 { - call void @llvm.amdgcn.exp.compr.v2i16(i32 0, i32 3, <2 x i16> , <2 x i16> , i1 true, i1 false) + call void @llvm.amdgcn.exp.compr.v2i16(i32 0, i32 15, <2 x i16> , <2 x i16> , i1 true, i1 false) ret void } @@ -121,22 +139,22 @@ define void @test_export_compr_mrt7_v2i16() #0 { ; GCN-LABEL: {{^}}test_export_compr_z_v2i16: ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 0x20001 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 0x40005 -; GCN: exp mrtz [[SRC0]], [[SRC1]], off, off compr{{$}} -; GCN: exp mrtz [[SRC0]], [[SRC1]], off, off done compr{{$}} +; GCN: exp mrtz [[SRC0]], [[SRC0]], [[SRC1]], [[SRC1]] compr{{$}} +; GCN: exp mrtz [[SRC0]], [[SRC0]], [[SRC1]], [[SRC1]] done compr{{$}} define void @test_export_compr_z_v2i16() #0 { - call void @llvm.amdgcn.exp.compr.v2i16(i32 8, i32 3, <2 x i16> , <2 x i16> , i1 false, i1 false) - call void @llvm.amdgcn.exp.compr.v2i16(i32 8, i32 3, <2 x i16> , <2 x i16> , i1 true, i1 false) + call void @llvm.amdgcn.exp.compr.v2i16(i32 8, i32 15, <2 x i16> , <2 x i16> , i1 false, i1 false) + call void @llvm.amdgcn.exp.compr.v2i16(i32 8, i32 15, <2 x i16> , <2 x i16> , i1 true, i1 false) ret void } ; GCN-LABEL: {{^}}test_export_compr_vm_v2i16: ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 0x20001 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 0x40005 -; GCN: exp mrt0 [[SRC0]], [[SRC1]], off, off compr vm{{$}} -; GCN: exp mrt0 [[SRC0]], [[SRC1]], off, off done compr vm{{$}} +; GCN: exp mrt0 [[SRC0]], [[SRC0]], [[SRC1]], [[SRC1]] compr vm{{$}} +; GCN: exp mrt0 [[SRC0]], [[SRC0]], [[SRC1]], [[SRC1]] done compr vm{{$}} define void @test_export_compr_vm_v2i16() #0 { - call void @llvm.amdgcn.exp.compr.v2i16(i32 0, i32 3, <2 x i16> , <2 x i16> , i1 false, i1 true) - call void @llvm.amdgcn.exp.compr.v2i16(i32 0, i32 3, <2 x i16> , <2 x i16> , i1 true, i1 true) + call void @llvm.amdgcn.exp.compr.v2i16(i32 0, i32 15, <2 x i16> , <2 x i16> , i1 false, i1 true) + call void @llvm.amdgcn.exp.compr.v2i16(i32 0, i32 15, <2 x i16> , <2 x i16> , i1 true, i1 true) ret void }