Signed-off-by: Karol Herbst <kher...@redhat.com>
---
 .../drivers/nouveau/codegen/nv50_ir_from_nir.cpp   | 47 ++++++++++++++++++++++
 1 file changed, 47 insertions(+)

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 f3cd22622d..6eaabef6cb 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp
@@ -72,6 +72,8 @@ public:
    bool assignSlots();
 
    uint32_t getSlotAddress(bool input, uint8_t idx, uint8_t slot, DataType ty 
= TYPE_U32, uint8_t f = 4);
+   Instruction *loadFrom(DataFile, uint8_t, DataType, Value *def, uint32_t 
base, uint8_t c, Value *indirect0 = nullptr, Value *indirect1 = nullptr, bool 
patch = false);
+   void storeTo(DataFile, operation, DataType, Value *src, uint8_t idx, 
uint8_t c, Value *indirect0 = nullptr, Value *indirect1 = nullptr);
 
    bool run();
 
@@ -876,6 +878,51 @@ Converter::getSlotAddress(bool input, uint8_t idx, uint8_t 
slot, DataType ty, ui
    return vary[idx].slot[slot] * f;
 }
 
+Instruction *
+Converter::loadFrom(DataFile file, uint8_t i, DataType ty, Value *def, 
uint32_t base, uint8_t c, Value *indirect0, Value *indirect1, bool patch)
+{
+   if (typeSizeof(ty) == 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 * typeSizeof(ty)), indirect0);
+      loi->setIndirect(0, 1, indirect1);
+      loi->perPatch = patch;
+      Instruction *hii = mkLoad(TYPE_U32, hi, mkSymbol(file, i, TYPE_U32, base 
+ c * typeSizeof(ty) + 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 * 
typeSizeof(ty)), indirect0);
+      ld->setIndirect(0, 1, indirect1);
+      ld->perPatch = patch;
+      return ld;
+   }
+}
+
+void
+Converter::storeTo(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(false, idx, c, ty, 4);
+
+   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()
 {
-- 
2.14.3

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to