mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
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> (cherry picked from commitef9d97ec1f)
This commit is contained in:
parent
23930f4b00
commit
3906daee6e
2 changed files with 17 additions and 7 deletions
|
|
@ -4,7 +4,7 @@
|
|||
"description": "spirv: Handle Op*MulExtended for non-32-bit types",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"because_sha": "58bcebd987b7c4e7d741f42699d34b8189ab9e79"
|
||||
},
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue