aco: fix p_bpermute_gfx6's exec save/restore with wave32
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Daniel Schürmann <daniel@schuermann.dev> Reviewed-by: Timur Kristóf <timur.kristof@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24693>
This commit is contained in:
@@ -1093,7 +1093,7 @@ emit_gfx6_bpermute(Program* program, aco_ptr<Instruction>& instr, Builder& bld)
|
|||||||
assert(input.physReg() != dst.physReg());
|
assert(input.physReg() != dst.physReg());
|
||||||
|
|
||||||
/* Save original EXEC */
|
/* Save original EXEC */
|
||||||
bld.sop1(aco_opcode::s_mov_b64, temp_exec, Operand(exec, s2));
|
bld.sop1(Builder::s_mov, temp_exec, Operand(exec, bld.lm));
|
||||||
|
|
||||||
/* An "unrolled loop" that is executed per each lane.
|
/* An "unrolled loop" that is executed per each lane.
|
||||||
* This takes only a few instructions per lane, as opposed to a "real" loop
|
* This takes only a few instructions per lane, as opposed to a "real" loop
|
||||||
@@ -1108,7 +1108,7 @@ emit_gfx6_bpermute(Program* program, aco_ptr<Instruction>& instr, Builder& bld)
|
|||||||
/* On the active lane, move the data we read from lane N to the destination VGPR */
|
/* On the active lane, move the data we read from lane N to the destination VGPR */
|
||||||
bld.vop1(aco_opcode::v_mov_b32, dst, Operand(vcc, s1));
|
bld.vop1(aco_opcode::v_mov_b32, dst, Operand(vcc, s1));
|
||||||
/* Restore original EXEC */
|
/* Restore original EXEC */
|
||||||
bld.sop1(aco_opcode::s_mov_b64, Definition(exec, s2), Operand(temp_exec.physReg(), s2));
|
bld.sop1(Builder::s_mov, Definition(exec, bld.lm), Operand(temp_exec.physReg(), bld.lm));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* RA assumes that the result is always in the low part of the register, so we have to shift,
|
/* RA assumes that the result is always in the low part of the register, so we have to shift,
|
||||||
|
Reference in New Issue
Block a user