diff options
author | Boyan Ding <[email protected]> | 2017-04-10 22:55:58 +0800 |
---|---|---|
committer | Ilia Mirkin <[email protected]> | 2017-04-13 02:24:47 -0400 |
commit | d941ef38292dd86469a792c8359e0fc8c4fa154c (patch) | |
tree | ce771f0772abcf989d6b546a09a13ab42914ef51 | |
parent | 854554c314e556c158b0e2aa3911a43f58fd6d34 (diff) |
nvc0/ir: Properly handle a "split form" of predicate destination
GF100's ISA encoding has a weird form of predicate destination where its
3 bits are split across whole the instruction. Use a dedicated setPDSTL
function instead of original defId which is incorrect in this case.
v2: (Ilia Mirkin)
Change API of setPDSTL() to handle cases of no output
Fix setting of the highest bit in setPDSTL()
Cc: [email protected]
Signed-off-by: Boyan Ding <[email protected]>
Reviewed-by: Ilia Mirkin <[email protected]>
-rw-r--r-- | src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp | 15 |
1 files changed, 13 insertions, 2 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 5467447e354..a578e947ec6 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp @@ -58,6 +58,7 @@ private: void setImmediateS8(const ValueRef&); void setSUConst16(const Instruction *, const int s); void setSUPred(const Instruction *, const int s); + void setPDSTL(const Instruction *, const int d); void emitCondCode(CondCode cc, int pos); void emitInterpMode(const Instruction *); @@ -375,6 +376,16 @@ void CodeEmitterNVC0::setImmediateS8(const ValueRef &ref) code[0] |= (s8 >> 6) << 8; } +void CodeEmitterNVC0::setPDSTL(const Instruction *i, const int d) +{ + assert(d < 0 || (i->defExists(d) && i->def(d).getFile() == FILE_PREDICATE)); + + uint32_t pred = d >= 0 ? DDATA(i->def(d)).id : 7; + + code[0] |= (pred & 3) << 8; + code[1] |= (pred & 4) << (26 - 2); +} + void CodeEmitterNVC0::emitForm_A(const Instruction *i, uint64_t opc) { @@ -1873,7 +1884,7 @@ CodeEmitterNVC0::emitSTORE(const Instruction *i) if (i->src(0).getFile() == FILE_MEMORY_SHARED && i->subOp == NV50_IR_SUBOP_STORE_UNLOCKED) { assert(i->defExists(0)); - defId(i->def(0), 8); + setPDSTL(i, 0); } } @@ -1945,7 +1956,7 @@ CodeEmitterNVC0::emitLOAD(const Instruction *i) if (p >= 0) { if (targ->getChipset() >= NVISA_GK104_CHIPSET) - defId(i->def(p), 8); + setPDSTL(i, p); else defId(i->def(p), 32 + 18); } |