Re: [Mesa-dev] [PATCH] ac/nir: implement emit_{imul, umul}_2x32_64 opcodes
On 3/5/19 2:01 PM, Bas Nieuwenhuizen wrote: On Tue, Mar 5, 2019 at 10:30 AM Samuel Pitoiset wrote: Fixes: 58bcebd987b ("spirv: Allow [i/u]mulExtended to use new nir opcode") Signed-off-by: Samuel Pitoiset --- 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); This tmp assignment is dead? I will send a v2 with that removed. + 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); If we do this lowering, why not just set options->lower_mul_2x32_64? does it result in better code from LLVM if we convert both args to 64 bit and do a 64-bit mul? No LLVM differences. + + LLVMValueRef tmp = LLVMGetUndef(ctx->v2i32); This tmp assignment is dead? + 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(>ac, src[1]); result = emit_imul_high(>ac, src[0], src[1]); break; + case nir_op_umul_2x32_64: + src[0] = ac_to_integer(>ac, src[0]); + src[1] = ac_to_integer(>ac, src[1]); + result = emit_umul_2x32_64(>ac, src[0], src[1]); + break; + case nir_op_imul_2x32_64: + src[0] = ac_to_integer(>ac, src[0]); + src[1] = ac_to_integer(>ac, src[1]); + result = emit_imul_2x32_64(>ac, src[0], src[1]); + break; case nir_op_pack_half_2x16: result = emit_pack_half_2x16(>ac, src[0]); break; -- 2.21.0 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
Re: [Mesa-dev] [PATCH] ac/nir: implement emit_{imul, umul}_2x32_64 opcodes
On Tue, Mar 5, 2019 at 10:30 AM Samuel Pitoiset wrote: > > Fixes: 58bcebd987b ("spirv: Allow [i/u]mulExtended to use new nir opcode") > Signed-off-by: Samuel Pitoiset > --- > 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); This tmp assignment is dead? > + 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); If we do this lowering, why not just set options->lower_mul_2x32_64? does it result in better code from LLVM if we convert both args to 64 bit and do a 64-bit mul? > + > + LLVMValueRef tmp = LLVMGetUndef(ctx->v2i32); This tmp assignment is dead? > + 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(>ac, src[1]); > result = emit_imul_high(>ac, src[0], src[1]); > break; > + case nir_op_umul_2x32_64: > + src[0] = ac_to_integer(>ac, src[0]); > + src[1] = ac_to_integer(>ac, src[1]); > + result = emit_umul_2x32_64(>ac, src[0], src[1]); > + break; > + case nir_op_imul_2x32_64: > + src[0] = ac_to_integer(>ac, src[0]); > + src[1] = ac_to_integer(>ac, src[1]); > + result = emit_imul_2x32_64(>ac, src[0], src[1]); > + break; > case nir_op_pack_half_2x16: > result = emit_pack_half_2x16(>ac, src[0]); > break; > -- > 2.21.0 > > ___ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
[Mesa-dev] [PATCH] ac/nir: implement emit_{imul, umul}_2x32_64 opcodes
Fixes: 58bcebd987b ("spirv: Allow [i/u]mulExtended to use new nir opcode") Signed-off-by: Samuel Pitoiset --- 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(>ac, src[1]); result = emit_imul_high(>ac, src[0], src[1]); break; + case nir_op_umul_2x32_64: + src[0] = ac_to_integer(>ac, src[0]); + src[1] = ac_to_integer(>ac, src[1]); + result = emit_umul_2x32_64(>ac, src[0], src[1]); + break; + case nir_op_imul_2x32_64: + src[0] = ac_to_integer(>ac, src[0]); + src[1] = ac_to_integer(>ac, src[1]); + result = emit_imul_2x32_64(>ac, src[0], src[1]); + break; case nir_op_pack_half_2x16: result = emit_pack_half_2x16(>ac, src[0]); break; -- 2.21.0 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev