mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 15:48:36 +02:00
r300/compiler: Fix incorrect presubtract conversion
ADD instructions with constant swizzles can't be converted to
presubtract operations.
(cherry picked from commit 0fa81d6d05)
This commit is contained in:
parent
b8050add56
commit
ea95bf7d89
1 changed files with 24 additions and 0 deletions
|
|
@ -647,10 +647,34 @@ static int is_presub_candidate(
|
|||
{
|
||||
const struct rc_opcode_info * info = rc_get_opcode_info(inst->U.I.Opcode);
|
||||
unsigned int i;
|
||||
unsigned int is_constant[2] = {0, 0};
|
||||
|
||||
assert(inst->U.I.Opcode == RC_OPCODE_ADD);
|
||||
|
||||
if (inst->U.I.PreSub.Opcode != RC_PRESUB_NONE || inst->U.I.SaturateMode)
|
||||
return 0;
|
||||
|
||||
/* If both sources use a constant swizzle, then we can't convert it to
|
||||
* a presubtract operation. In fact for the ADD and SUB presubtract
|
||||
* operations neither source can contain a constant swizzle. This
|
||||
* specific case is checked in peephole_add_presub_add() when
|
||||
* we make sure the swizzles for both sources are equal, so we
|
||||
* don't need to worry about it here. */
|
||||
for (i = 0; i < 2; i++) {
|
||||
int chan;
|
||||
for (chan = 0; chan < 4; chan++) {
|
||||
rc_swizzle swz =
|
||||
get_swz(inst->U.I.SrcReg[i].Swizzle, chan);
|
||||
if (swz == RC_SWIZZLE_ONE
|
||||
|| swz == RC_SWIZZLE_ZERO
|
||||
|| swz == RC_SWIZZLE_HALF) {
|
||||
is_constant[i] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (is_constant[0] && is_constant[1])
|
||||
return 0;
|
||||
|
||||
for(i = 0; i < info->NumSrcRegs; i++) {
|
||||
struct rc_src_register src = inst->U.I.SrcReg[i];
|
||||
if (src_reads_dst_mask(src, inst->U.I.DstReg))
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue