[Mesa-dev] [PATCH] gk110/ir: do not overwrite def value with zero for EXCH ops
Ilia Mirkin
imirkin at alum.mit.edu
Wed Apr 20 17:49:48 UTC 2016
The SM20/SM30 logic does this for exch || cas. Are you *sure* this
shouldn't be the same? It's pretty silly to do a CAS without a dst,
but it's definitely possible (through DCE).
On Wed, Apr 20, 2016 at 1:47 PM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
> This is only valid for other atomic operations (including CAS). This
> fixes an invalid opcode error from dmesg. While we are it, make sure
> to initialize global addr to 0 for other atomic operations.
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> Cc: "11.1 11.2" <mesa-stable at lists.freedesktop.org>
> ---
> .../drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp | 21 +++++++++++++++------
> 1 file changed, 15 insertions(+), 6 deletions(-)
>
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp
> index 70f3c3f..e2c3b8e 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp
> @@ -1808,6 +1808,9 @@ uses64bitAddress(const Instruction *ldst)
> void
> CodeEmitterGK110::emitATOM(const Instruction *i)
> {
> + const bool hasDst = i->defExists(0);
> + const bool exch = i->subOp == NV50_IR_SUBOP_ATOM_EXCH;
> +
> code[0] = 0x00000002;
> if (i->subOp == NV50_IR_SUBOP_ATOM_CAS)
> code[1] = 0x77800000;
> @@ -1836,15 +1839,21 @@ CodeEmitterGK110::emitATOM(const Instruction *i)
> /* TODO: cas: flip bits if $r255 is used */
> srcId(i->src(1), 23);
>
> - if (i->defExists(0))
> + if (hasDst) {
> defId(i->def(0), 2);
> - else
> + } else
> + if (!exch) {
> code[0] |= 255 << 2;
> + }
>
> - const int32_t offset = SDATA(i->src(0)).offset;
> - assert(offset < 0x80000 && offset >= -0x80000);
> - code[0] |= (offset & 1) << 31;
> - code[1] |= (offset & 0xffffe) >> 1;
> + if (hasDst || !exch) {
> + const int32_t offset = SDATA(i->src(0)).offset;
> + assert(offset < 0x80000 && offset >= -0x80000);
> + code[0] |= (offset & 1) << 31;
> + code[1] |= (offset & 0xffffe) >> 1;
> + } else {
> + srcAddr32(i->src(0), 31);
> + }
>
> if (i->getIndirect(0, 0)) {
> srcId(i->getIndirect(0, 0), 10);
> --
> 2.8.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list