diff options
author | Karol Herbst <[email protected]> | 2018-01-09 03:22:00 +0100 |
---|---|---|
committer | Karol Herbst <[email protected]> | 2019-03-17 10:33:28 +0100 |
commit | e8d9be40cbaf4922adec34a2e8106c04e2c7660d (patch) | |
tree | dafe57c69966dc3850a57f82b348804681750940 /src | |
parent | 39929a81645e3f27c3a65faf355f11826043e50b (diff) |
nv50/ir/nir: add loadFrom and storeTo helpler
v8: don't require C++11 features
Signed-off-by: Karol Herbst <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp index a0a36d95b41..d3cba9a63c3 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp @@ -93,6 +93,13 @@ private: bool centroid, unsigned semantics); + Instruction *loadFrom(DataFile, uint8_t, DataType, Value *def, uint32_t base, + uint8_t c, Value *indirect0 = NULL, + Value *indirect1 = NULL, bool patch = false); + void storeTo(nir_intrinsic_instr *, DataFile, operation, DataType, + Value *src, uint8_t idx, uint8_t c, Value *indirect0 = NULL, + Value *indirect1 = NULL); + bool isFloatType(nir_alu_type); bool isSignedType(nir_alu_type); bool isResultFloat(nir_op); @@ -969,6 +976,71 @@ Converter::getSlotAddress(nir_intrinsic_instr *insn, uint8_t idx, uint8_t slot) return vary[idx].slot[slot] * 4; } +Instruction * +Converter::loadFrom(DataFile file, uint8_t i, DataType ty, Value *def, + uint32_t base, uint8_t c, Value *indirect0, + Value *indirect1, bool patch) +{ + unsigned int tySize = typeSizeof(ty); + + if (tySize == 8 && + (file == FILE_MEMORY_CONST || file == FILE_MEMORY_BUFFER || indirect0)) { + Value *lo = getSSA(); + Value *hi = getSSA(); + + Instruction *loi = + mkLoad(TYPE_U32, lo, + mkSymbol(file, i, TYPE_U32, base + c * tySize), + indirect0); + loi->setIndirect(0, 1, indirect1); + loi->perPatch = patch; + + Instruction *hii = + mkLoad(TYPE_U32, hi, + mkSymbol(file, i, TYPE_U32, base + c * tySize + 4), + indirect0); + hii->setIndirect(0, 1, indirect1); + hii->perPatch = patch; + + return mkOp2(OP_MERGE, ty, def, lo, hi); + } else { + Instruction *ld = + mkLoad(ty, def, mkSymbol(file, i, ty, base + c * tySize), indirect0); + ld->setIndirect(0, 1, indirect1); + ld->perPatch = patch; + return ld; + } +} + +void +Converter::storeTo(nir_intrinsic_instr *insn, DataFile file, operation op, + DataType ty, Value *src, uint8_t idx, uint8_t c, + Value *indirect0, Value *indirect1) +{ + uint8_t size = typeSizeof(ty); + uint32_t address = getSlotAddress(insn, idx, c); + + if (size == 8 && indirect0) { + Value *split[2]; + mkSplit(split, 4, src); + + if (op == OP_EXPORT) { + split[0] = mkMov(getSSA(), split[0], ty)->getDef(0); + split[1] = mkMov(getSSA(), split[1], ty)->getDef(0); + } + + mkStore(op, TYPE_U32, mkSymbol(file, 0, TYPE_U32, address), indirect0, + split[0])->perPatch = info->out[idx].patch; + mkStore(op, TYPE_U32, mkSymbol(file, 0, TYPE_U32, address + 4), indirect0, + split[1])->perPatch = info->out[idx].patch; + } else { + if (op == OP_EXPORT) + src = mkMov(getSSA(size), src, ty)->getDef(0); + mkStore(op, ty, mkSymbol(file, 0, ty, address), indirect0, + src)->perPatch = info->out[idx].patch; + } +} + bool Converter::run() { |