spirv: Handle Op*MulExtended for non-32-bit types

Fixes: 58bcebd987 ("spirv: Allow [i/u]mulExtended to use new nir opcode")
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/6306
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16060>
This commit is contained in:
Jason Ekstrand 2022-04-20 11:37:19 -05:00 committed by Marge Bot
parent f329f67243
commit ef9d97ec1f
1 changed files with 16 additions and 6 deletions

View File

@ -530,17 +530,27 @@ vtn_handle_alu(struct vtn_builder *b, SpvOp opcode,
case SpvOpUMulExtended: {
vtn_assert(glsl_type_is_struct_or_ifc(dest_type));
nir_ssa_def *umul = nir_umul_2x32_64(&b->nb, src[0], src[1]);
dest->elems[0]->def = nir_unpack_64_2x32_split_x(&b->nb, umul);
dest->elems[1]->def = nir_unpack_64_2x32_split_y(&b->nb, umul);
if (src[0]->bit_size == 32) {
nir_ssa_def *umul = nir_umul_2x32_64(&b->nb, src[0], src[1]);
dest->elems[0]->def = nir_unpack_64_2x32_split_x(&b->nb, umul);
dest->elems[1]->def = nir_unpack_64_2x32_split_y(&b->nb, umul);
} else {
dest->elems[0]->def = nir_imul(&b->nb, src[0], src[1]);
dest->elems[1]->def = nir_umul_high(&b->nb, src[0], src[1]);
}
break;
}
case SpvOpSMulExtended: {
vtn_assert(glsl_type_is_struct_or_ifc(dest_type));
nir_ssa_def *smul = nir_imul_2x32_64(&b->nb, src[0], src[1]);
dest->elems[0]->def = nir_unpack_64_2x32_split_x(&b->nb, smul);
dest->elems[1]->def = nir_unpack_64_2x32_split_y(&b->nb, smul);
if (src[0]->bit_size == 32) {
nir_ssa_def *umul = nir_imul_2x32_64(&b->nb, src[0], src[1]);
dest->elems[0]->def = nir_unpack_64_2x32_split_x(&b->nb, umul);
dest->elems[1]->def = nir_unpack_64_2x32_split_y(&b->nb, umul);
} else {
dest->elems[0]->def = nir_imul(&b->nb, src[0], src[1]);
dest->elems[1]->def = nir_imul_high(&b->nb, src[0], src[1]);
}
break;
}