diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 7bb3a2491b9..328b565a68b 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -9012,6 +9012,12 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr) } break; } + case nir_intrinsic_sendmsg_amd: { + unsigned imm = nir_intrinsic_base(instr); + Temp m0_content = bld.as_uniform(get_ssa_temp(ctx, instr->src[0].ssa)); + bld.sopp(aco_opcode::s_sendmsg, bld.m0(m0_content), -1, imm); + break; + } case nir_intrinsic_is_subgroup_invocation_lt_amd: { Temp src = bld.as_uniform(get_ssa_temp(ctx, instr->src[0].ssa)); bld.copy(Definition(get_ssa_temp(ctx, &instr->dest.ssa)), lanecount_to_mask(ctx, src)); diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c index 000033b4e7a..92e7795ea7e 100644 --- a/src/amd/llvm/ac_nir_to_llvm.c +++ b/src/amd/llvm/ac_nir_to_llvm.c @@ -3842,6 +3842,12 @@ static bool visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins case nir_intrinsic_end_primitive_with_counter: ctx->abi->emit_primitive(ctx->abi, nir_intrinsic_stream_id(instr)); break; + case nir_intrinsic_sendmsg_amd: { + unsigned imm = nir_intrinsic_base(instr); + LLVMValueRef m0_content = get_src(ctx, instr->src[0]); + ac_build_sendmsg(&ctx->ac, imm, m0_content); + break; + } case nir_intrinsic_load_tess_coord: { LLVMValueRef coord[] = { ctx->abi->tes_u_replaced ? ctx->abi->tes_u_replaced : ac_get_arg(&ctx->ac, ctx->args->tes_u), diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index 1b0da459fde..68e1a586f0a 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -1478,6 +1478,8 @@ intrinsic("load_cull_small_prim_precision_amd", dest_comp=1, bit_sizes=[32], fla intrinsic("load_initial_edgeflags_amd", src_comp=[], dest_comp=1, bit_sizes=[32], indices=[]) # Allocates export space for vertices and primitives. src[] = {num_vertices, num_primitives}. intrinsic("alloc_vertices_and_primitives_amd", src_comp=[1, 1], indices=[]) +# Corresponds to s_sendmsg in the GCN/RDNA ISA, src[] = { m0_content }, BASE = imm +intrinsic("sendmsg_amd", src_comp=[1], indices=[BASE]) # Overwrites VS input registers, for use with vertex compaction after culling. src = {vertex_id, instance_id}. intrinsic("overwrite_vs_arguments_amd", src_comp=[1, 1], indices=[]) # Overwrites TES input registers, for use with vertex compaction after culling. src = {tes_u, tes_v, rel_patch_id, patch_id}.