[Mesa-dev] [PATCH] ac/nir: implement emit_{imul, umul}_2x32_64 opcodes

Samuel Pitoiset samuel.pitoiset at gmail.com
Tue Mar 5 09:33:05 UTC 2019


Fixes: 58bcebd987b ("spirv: Allow [i/u]mulExtended to use new nir opcode")
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
---
 src/amd/common/ac_nir_to_llvm.c | 36 +++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index af7a95137c2..74ae690e845 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -423,6 +423,32 @@ static LLVMValueRef emit_imul_high(struct ac_llvm_context *ctx,
 	return result;
 }
 
+static LLVMValueRef emit_umul_2x32_64(struct ac_llvm_context *ctx,
+				      LLVMValueRef src0, LLVMValueRef src1)
+{
+	LLVMValueRef result[2];
+
+	result[0] = LLVMBuildMul(ctx->builder, src0, src1, "");
+	result[1] = emit_umul_high(ctx, src0, src1);
+
+	LLVMValueRef tmp = LLVMGetUndef(ctx->v2i32);
+	tmp = ac_build_gather_values(ctx, result, 2);
+	return LLVMBuildBitCast(ctx->builder, tmp, ctx->i64, "");
+}
+
+static LLVMValueRef emit_imul_2x32_64(struct ac_llvm_context *ctx,
+				      LLVMValueRef src0, LLVMValueRef src1)
+{
+	LLVMValueRef result[2];
+
+	result[0] = LLVMBuildMul(ctx->builder, src0, src1, "");
+	result[1] = emit_imul_high(ctx, src0, src1);
+
+	LLVMValueRef tmp = LLVMGetUndef(ctx->v2i32);
+	tmp = ac_build_gather_values(ctx, result, 2);
+	return LLVMBuildBitCast(ctx->builder, tmp, ctx->i64, "");
+}
+
 static LLVMValueRef emit_bitfield_extract(struct ac_llvm_context *ctx,
 					  bool is_signed,
 					  const LLVMValueRef srcs[3])
@@ -977,6 +1003,16 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr)
 		src[1] = ac_to_integer(&ctx->ac, src[1]);
 		result = emit_imul_high(&ctx->ac, src[0], src[1]);
 		break;
+	case nir_op_umul_2x32_64:
+		src[0] = ac_to_integer(&ctx->ac, src[0]);
+		src[1] = ac_to_integer(&ctx->ac, src[1]);
+		result = emit_umul_2x32_64(&ctx->ac, src[0], src[1]);
+		break;
+	case nir_op_imul_2x32_64:
+		src[0] = ac_to_integer(&ctx->ac, src[0]);
+		src[1] = ac_to_integer(&ctx->ac, src[1]);
+		result = emit_imul_2x32_64(&ctx->ac, src[0], src[1]);
+		break;
 	case nir_op_pack_half_2x16:
 		result = emit_pack_half_2x16(&ctx->ac, src[0]);
 		break;
-- 
2.21.0



More information about the mesa-dev mailing list