diff options
author | Samuel Pitoiset <[email protected]> | 2016-02-21 15:28:16 +0100 |
---|---|---|
committer | Samuel Pitoiset <[email protected]> | 2016-02-22 21:28:51 +0100 |
commit | 9f0d059d4bab97e334fb3fecc24a1421b562d9e5 (patch) | |
tree | 70ee044ec4db569b6a3fa082145a886a3f558d94 /src/gallium | |
parent | 6526225f888a08b301e8c39ec70b4e739081e490 (diff) |
nvc0/ir: add ld lock/st unlock emission on GK104
Signed-off-by: Samuel Pitoiset <[email protected]>
Reviewed-by: Ilia Mirkin <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp index 65fcd646286..e89b1291470 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp @@ -1779,11 +1779,14 @@ CodeEmitterNVC0::emitSTORE(const Instruction *i) case FILE_MEMORY_GLOBAL: opc = 0x90000000; break; case FILE_MEMORY_LOCAL: opc = 0xc8000000; break; case FILE_MEMORY_SHARED: - opc = 0xc8000000; - if (i->subOp == NV50_IR_SUBOP_STORE_UNLOCKED) - opc |= (1 << 26); - else - opc |= (1 << 24); + if (i->subOp == NV50_IR_SUBOP_STORE_UNLOCKED) { + if (targ->getChipset() >= NVISA_GK104_CHIPSET) + opc = 0xb8000000; + else + opc = 0xcc000000; + } else { + opc = 0xc9000000; + } break; default: assert(!"invalid memory file"); @@ -1793,6 +1796,15 @@ CodeEmitterNVC0::emitSTORE(const Instruction *i) code[0] = 0x00000005; code[1] = opc; + if (targ->getChipset() >= NVISA_GK104_CHIPSET) { + // Unlocked store on shared memory can fail. + if (i->src(0).getFile() == FILE_MEMORY_SHARED && + i->subOp == NV50_IR_SUBOP_STORE_UNLOCKED) { + assert(i->defExists(0)); + defId(i->def(0), 8); + } + } + setAddressByFile(i->src(0)); srcId(i->src(1), 14); srcId(i->src(0).getIndirect(0), 20); @@ -1816,11 +1828,14 @@ CodeEmitterNVC0::emitLOAD(const Instruction *i) case FILE_MEMORY_GLOBAL: opc = 0x80000000; break; case FILE_MEMORY_LOCAL: opc = 0xc0000000; break; case FILE_MEMORY_SHARED: - opc = 0xc0000000; - if (i->subOp == NV50_IR_SUBOP_LOAD_LOCKED) - opc |= (1 << 26); - else - opc |= (1 << 24); + if (i->subOp == NV50_IR_SUBOP_LOAD_LOCKED) { + if (targ->getChipset() >= NVISA_GK104_CHIPSET) + opc = 0xa8000000; + else + opc = 0xc4000000; + } else { + opc = 0xc1000000; + } break; case FILE_MEMORY_CONST: if (!i->src(0).isIndirect(0) && typeSizeof(i->dType) == 4) { |