ac/nir: fix 64-bit shifts

NIR always makes the shift amount 32 bits, but LLVM asserts if the two
sources aren't the same type. Zero-extend the shift amount to make LLVM
happy.

Signed-off-by: Connor Abbott <cwabbott0@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
Connor Abbott
2017-06-30 19:10:43 -07:00
parent 7168425dd7
commit 2ec77f7a3c

View File

@@ -1621,13 +1621,22 @@ static void visit_alu(struct nir_to_llvm_context *ctx, const nir_alu_instr *inst
result = LLVMBuildXor(ctx->builder, src[0], src[1], "");
break;
case nir_op_ishl:
result = LLVMBuildShl(ctx->builder, src[0], src[1], "");
result = LLVMBuildShl(ctx->builder, src[0],
LLVMBuildZExt(ctx->builder, src[1],
LLVMTypeOf(src[0]), ""),
"");
break;
case nir_op_ishr:
result = LLVMBuildAShr(ctx->builder, src[0], src[1], "");
result = LLVMBuildAShr(ctx->builder, src[0],
LLVMBuildZExt(ctx->builder, src[1],
LLVMTypeOf(src[0]), ""),
"");
break;
case nir_op_ushr:
result = LLVMBuildLShr(ctx->builder, src[0], src[1], "");
result = LLVMBuildLShr(ctx->builder, src[0],
LLVMBuildZExt(ctx->builder, src[1],
LLVMTypeOf(src[0]), ""),
"");
break;
case nir_op_ilt:
result = emit_int_cmp(&ctx->ac, LLVMIntSLT, src[0], src[1]);