mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 09:08:10 +02:00
intel/fs: Fix lowering of dword multiplication by 16-bit constant
Existing code was ignoring whether the type of the immediate source
was signed or not. If the source was signed, it would ignore small
negative values but it also would wrongly accept values between
INT16_MAX and UINT16_MAX, causing the atual value to later be
reinterpreted as a negative number (under 16-bits).
Fixes tests/shaders/glsl-mul-const.shader_test in Piglit for platforms
that don't support MUL with 32x32 types, including ICL and TGL.
Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/2186
Cc: <mesa-stable@lists.freedesktop.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
(cherry picked from commit 2137be22fa)
This commit is contained in:
parent
2c8a37739b
commit
43edacbeb7
1 changed files with 4 additions and 2 deletions
|
|
@ -3997,7 +3997,10 @@ fs_visitor::lower_mul_dword_inst(fs_inst *inst, bblock_t *block)
|
|||
{
|
||||
const fs_builder ibld(this, block, inst);
|
||||
|
||||
if (inst->src[1].file == IMM && inst->src[1].ud < (1 << 16)) {
|
||||
const bool ud = (inst->src[1].type == BRW_REGISTER_TYPE_UD);
|
||||
if (inst->src[1].file == IMM &&
|
||||
(( ud && inst->src[1].ud <= UINT16_MAX) ||
|
||||
(!ud && inst->src[1].d <= INT16_MAX && inst->src[1].d >= INT16_MIN))) {
|
||||
/* The MUL instruction isn't commutative. On Gen <= 6, only the low
|
||||
* 16-bits of src0 are read, and on Gen >= 7 only the low 16-bits of
|
||||
* src1 are used.
|
||||
|
|
@ -4010,7 +4013,6 @@ fs_visitor::lower_mul_dword_inst(fs_inst *inst, bblock_t *block)
|
|||
ibld.MOV(imm, inst->src[1]);
|
||||
ibld.MUL(inst->dst, imm, inst->src[0]);
|
||||
} else {
|
||||
const bool ud = (inst->src[1].type == BRW_REGISTER_TYPE_UD);
|
||||
ibld.MUL(inst->dst, inst->src[0],
|
||||
ud ? brw_imm_uw(inst->src[1].ud)
|
||||
: brw_imm_w(inst->src[1].d));
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue