Index: lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp =================================================================== --- lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp +++ lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp @@ -672,11 +672,19 @@ 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); Index: test/CodeGen/AMDGPU/llvm.amdgcn.exp.compr.ll =================================================================== --- test/CodeGen/AMDGPU/llvm.amdgcn.exp.compr.ll +++ test/CodeGen/AMDGPU/llvm.amdgcn.exp.compr.ll @@ -16,27 +16,45 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 }