vastly simplify indexing
authorZack Rusin <zack@tungstengraphics.com>
Fri, 15 Feb 2008 05:36:18 +0000 (00:36 -0500)
committerZack Rusin <zack@tungstengraphics.com>
Fri, 15 Feb 2008 06:17:17 +0000 (01:17 -0500)
src/mesa/pipe/llvm/instructionssoa.cpp
src/mesa/pipe/llvm/storagesoa.cpp
src/mesa/pipe/llvm/storagesoa.h
src/mesa/pipe/llvm/tgsitollvm.cpp

index 9c38c64bd10d44b22d7def99dbda75d4ca3648b3..a4d50466373c7e6a12d69065b507c1a59414ecc7 100644 (file)
@@ -47,22 +47,10 @@ std::vector<llvm::Value*> InstructionsSoa::arl(const std::vector<llvm::Value*> i
    llvm::Value *x1 = m_builder.CreateExtractElement(in[0],
                                                     m_storage->constantInt(0),
                                                     name("extractX"));
-   llvm::Value *x2 = m_builder.CreateExtractElement(in[0],
-                                                    m_storage->constantInt(1),
-                                                    name("extractX"));
-   llvm::Value *x3 = m_builder.CreateExtractElement(in[0],
-                                                    m_storage->constantInt(2),
-                                                    name("extractX"));
-   llvm::Value *x4 = m_builder.CreateExtractElement(in[0],
-                                                    m_storage->constantInt(3),
-                                                    name("extractX"));
    //cast it to an unsigned int
    x1 = m_builder.CreateFPToUI(x1, IntegerType::get(32), name("x1IntCast"));
-   x2 = m_builder.CreateFPToUI(x2, IntegerType::get(32), name("x2IntCast"));
-   x3 = m_builder.CreateFPToUI(x3, IntegerType::get(32), name("x3IntCast"));
-   x4 = m_builder.CreateFPToUI(x4, IntegerType::get(32), name("x4IntCast"));
 
-   res[0] = vectorFromVals(x1, x2, x3, x4);
+   res[0] = x1;//vectorFromVals(x1, x2, x3, x4);
    //only x is valid. the others shouldn't be necessary
    /*
    res[1] = Constant::getNullValue(m_floatVecType);
index 314ffe62dc37939148635587e4b584681bcd2d00..ed0674a96f089ee28c71c857f8ac06d09bd5cf3a 100644 (file)
@@ -132,40 +132,27 @@ llvm::Value *StorageSoa::addrElement(int idx) const
    return res;
 }
 
-std::vector<llvm::Value*> StorageSoa::inputElement(int idx, llvm::Value *indIdx)
+std::vector<llvm::Value*> StorageSoa::inputElement(llvm::Value *idx)
 {
    std::vector<llvm::Value*> res(4);
 
-   if (!indIdx) {
-      res[0] = element(m_input, idx, 0);
-      res[1] = element(m_input, idx, 1);
-      res[2] = element(m_input, idx, 2);
-      res[3] = element(m_input, idx, 3);
-   } else {
-      res[0] = indirectElement(m_input, indIdx, 0);
-      res[1] = indirectElement(m_input, indIdx, 1);
-      res[2] = indirectElement(m_input, indIdx, 2);
-      res[3] = indirectElement(m_input, indIdx, 3);
-   }
+   res[0] = element(m_input, idx, 0);
+   res[1] = element(m_input, idx, 1);
+   res[2] = element(m_input, idx, 2);
+   res[3] = element(m_input, idx, 3);
 
    return res;
 }
 
-std::vector<llvm::Value*> StorageSoa::constElement(int idx, llvm::Value *indIdx)
+std::vector<llvm::Value*> StorageSoa::constElement(llvm::Value *idx)
 {
    std::vector<llvm::Value*> res(4);
    llvm::Value *xChannel, *yChannel, *zChannel, *wChannel;
-   if (!indIdx) {
-      xChannel = elementPointer(m_consts, idx, 0);
-      yChannel = elementPointer(m_consts, idx, 1);
-      zChannel = elementPointer(m_consts, idx, 2);
-      wChannel = elementPointer(m_consts, idx, 3);
-   } else {
-      xChannel = indirectElementPointer(m_consts, indIdx, 0);
-      yChannel = indirectElementPointer(m_consts, indIdx, 1);
-      zChannel = indirectElementPointer(m_consts, indIdx, 2);
-      wChannel = indirectElementPointer(m_consts, indIdx, 3);
-   }
+
+   xChannel = elementPointer(m_consts, idx, 0);
+   yChannel = elementPointer(m_consts, idx, 1);
+   zChannel = elementPointer(m_consts, idx, 2);
+   wChannel = elementPointer(m_consts, idx, 3);
 
    res[0] = alignedArrayLoad(xChannel);
    res[1] = alignedArrayLoad(yChannel);
@@ -175,70 +162,49 @@ std::vector<llvm::Value*> StorageSoa::constElement(int idx, llvm::Value *indIdx)
    return res;
 }
 
-std::vector<llvm::Value*> StorageSoa::outputElement(int idx, llvm::Value *indIdx)
+std::vector<llvm::Value*> StorageSoa::outputElement(llvm::Value *idx)
 {
    std::vector<llvm::Value*> res(4);
 
-   if (!indIdx) {
-      res[0] = element(m_output, idx, 0);
-      res[1] = element(m_output, idx, 1);
-      res[2] = element(m_output, idx, 2);
-      res[3] = element(m_output, idx, 3);
-   } else {
-      res[0] = indirectElement(m_output, indIdx, 0);
-      res[1] = indirectElement(m_output, indIdx, 1);
-      res[2] = indirectElement(m_output, indIdx, 2);
-      res[3] = indirectElement(m_output, indIdx, 3);
-   }
+   res[0] = element(m_output, idx, 0);
+   res[1] = element(m_output, idx, 1);
+   res[2] = element(m_output, idx, 2);
+   res[3] = element(m_output, idx, 3);
 
    return res;
 }
 
-std::vector<llvm::Value*> StorageSoa::tempElement(int idx, llvm::Value *indIdx)
+std::vector<llvm::Value*> StorageSoa::tempElement(llvm::Value *idx)
 {
    std::vector<llvm::Value*> res(4);
 
-   if (!indIdx) {
-      res[0] = element(m_temps, idx, 0);
-      res[1] = element(m_temps, idx, 1);
-      res[2] = element(m_temps, idx, 2);
-      res[3] = element(m_temps, idx, 3);
-   } else {
-      res[0] = indirectElement(m_temps, indIdx, 0);
-      res[1] = indirectElement(m_temps, indIdx, 1);
-      res[2] = indirectElement(m_temps, indIdx, 2);
-      res[3] = indirectElement(m_temps, indIdx, 3);
-   }
+   res[0] = element(m_temps, idx, 0);
+   res[1] = element(m_temps, idx, 1);
+   res[2] = element(m_temps, idx, 2);
+   res[3] = element(m_temps, idx, 3);
 
    return res;
 }
 
-std::vector<llvm::Value*> StorageSoa::immediateElement(int idx, llvm::Value *indIdx)
+std::vector<llvm::Value*> StorageSoa::immediateElement(llvm::Value *idx)
 {
    std::vector<llvm::Value*> res(4);
 
-   if (!indIdx) {
-      res[0] = element(m_immediates, idx, 0);
-      res[1] = element(m_immediates, idx, 1);
-      res[2] = element(m_immediates, idx, 2);
-      res[3] = element(m_immediates, idx, 3);
-   } else {
-      res[0] = indirectElement(m_immediates, indIdx, 0);
-      res[1] = indirectElement(m_immediates, indIdx, 1);
-      res[2] = indirectElement(m_immediates, indIdx, 2);
-      res[3] = indirectElement(m_immediates, indIdx, 3);
-   }
+   res[0] = element(m_immediates, idx, 0);
+   res[1] = element(m_immediates, idx, 1);
+   res[2] = element(m_immediates, idx, 2);
+   res[3] = element(m_immediates, idx, 3);
 
    return res;
 }
 
-llvm::Value * StorageSoa::elementPointer(llvm::Value *ptr, int index,
+llvm::Value * StorageSoa::elementPointer(llvm::Value *ptr, llvm::Value *index,
                                          int channel) const
 {
    std::vector<Value*> indices;
    if (m_immediates == ptr)
       indices.push_back(constantInt(0));
-   indices.push_back(constantInt(index));
+   indices.push_back(index);
    indices.push_back(constantInt(channel));
 
    GetElementPtrInst *getElem = new GetElementPtrInst(ptr,
@@ -249,7 +215,7 @@ llvm::Value * StorageSoa::elementPointer(llvm::Value *ptr, int index,
    return getElem;
 }
 
-llvm::Value * StorageSoa::element(llvm::Value *ptr, int index,
+llvm::Value * StorageSoa::element(llvm::Value *ptr, llvm::Value *index,
                                   int channel) const
 {
    llvm::Value *res = elementPointer(ptr, index, channel);
@@ -315,23 +281,31 @@ std::vector<llvm::Value*> StorageSoa::load(Argument type, int idx, int swizzle,
                                            llvm::Value *indIdx)
 {
    std::vector<llvm::Value*> val(4);
-   debug_printf("XXXXXXXXX indIdx = %p\n", indIdx);
-   assert(!indIdx);
+
+   //if we have an indirect index, always use that
+   //   if not use the integer offset to create one
+   llvm::Value *realIndex = 0;
+   if (indIdx)
+      realIndex = indIdx;
+   else
+      realIndex = constantInt(idx);
+   debug_printf("XXXXXXXXX realIdx = %p, indIdx = %p\n", realIndex, indIdx);
+
    switch(type) {
    case Input:
-      val = inputElement(idx, indIdx);
+      val = inputElement(realIndex);
       break;
    case Output:
-      val = outputElement(idx, indIdx);
+      val = outputElement(realIndex);
       break;
    case Temp:
-      val = tempElement(idx, indIdx);
+      val = tempElement(realIndex);
       break;
    case Const:
-      val = constElement(idx, indIdx);
+      val = constElement(realIndex);
       break;
    case Immediate:
-      val = immediateElement(idx, indIdx);
+      val = immediateElement(realIndex);
       break;
    case Address:
       debug_printf("Address not handled in the load phase!\n");
@@ -380,64 +354,36 @@ void StorageSoa::store(Argument type, int idx, const std::vector<llvm::Value*> &
       assert(0);
       break;
    }
-
+   llvm::Value *realIndex = constantInt(idx);
    if ((mask & TGSI_WRITEMASK_X)) {
-      llvm::Value *xChannel = elementPointer(out, idx, 0);
+      llvm::Value *xChannel = elementPointer(out, realIndex, 0);
       new StoreInst(val[0], xChannel, false, m_block);
    }
    if ((mask & TGSI_WRITEMASK_Y)) {
-      llvm::Value *yChannel = elementPointer(out, idx, 1);
+      llvm::Value *yChannel = elementPointer(out, realIndex, 1);
       new StoreInst(val[1], yChannel, false, m_block);
    }
    if ((mask & TGSI_WRITEMASK_Z)) {
-      llvm::Value *zChannel = elementPointer(out, idx, 2);
+      llvm::Value *zChannel = elementPointer(out, realIndex, 2);
       new StoreInst(val[2], zChannel, false, m_block);
    }
    if ((mask & TGSI_WRITEMASK_W)) {
-      llvm::Value *wChannel = elementPointer(out, idx, 3);
+      llvm::Value *wChannel = elementPointer(out, realIndex, 3);
       new StoreInst(val[3], wChannel, false, m_block);
    }
 }
 
 void StorageSoa::addAddress(int idx)
 {
-   VectorType *vectorType = VectorType::get(Type::FloatTy, 4);
    GlobalVariable *val = new GlobalVariable(
-      /*Type=*/vectorType,
+      /*Type=*/IntegerType::get(32),
       /*isConstant=*/false,
       /*Linkage=*/GlobalValue::ExternalLinkage,
       /*Initializer=*/0, // has initializer, specified below
       /*Name=*/name("address"),
       currentModule());
-   //val->setInitializer(Constant::getNullValue(IntegerType::get(32)));
-   //val->setInitializer(constantInt(1));
+   val->setInitializer(Constant::getNullValue(IntegerType::get(32)));
 
    debug_printf("adding to %d\n", idx);
    m_addresses[idx] = val;
 }
-
-llvm::Value * StorageSoa::indirectElementPointer(llvm::Value *ptr, llvm::Value *indIdx,
-                                                 int channel) const
-{
-   std::vector<Value*> indices;
-   if (m_immediates == ptr)
-      indices.push_back(constantInt(0));
-   indices.push_back(indIdx);
-   indices.push_back(constantInt(channel));
-
-   GetElementPtrInst *getElem = new GetElementPtrInst(ptr,
-                                                      indices.begin(),
-                                                      indices.end(),
-                                                      name("ptr"),
-                                                      m_block);
-   return getElem;
-}
-
-llvm::Value * StorageSoa::indirectElement(llvm::Value *ptr, llvm::Value *indIdx,
-                                          int channel) const
-{
-   llvm::Value *res = indirectElementPointer(ptr, indIdx, channel);
-   LoadInst *load = new LoadInst(res, name("element"), false, m_block);
-   //load->setAlignment(8);
-   return load;
-}
index ca8fee63407570c79df9d777a291a342aa9ea4cf..6443351f270fb92e029220132da14362bd2f9443 100644 (file)
@@ -76,24 +76,20 @@ public:
 
    llvm::ConstantInt *constantInt(int) const;
 private:
-   llvm::Value *elementPointer(llvm::Value *ptr, int index,
+   llvm::Value *elementPointer(llvm::Value *ptr, llvm::Value *indIdx,
                                int channel) const;
-   llvm::Value *element(llvm::Value *ptr, int index,
+   llvm::Value *element(llvm::Value *ptr, llvm::Value *idx,
                         int channel) const;
-   llvm::Value *indirectElementPointer(llvm::Value *ptr, llvm::Value *indIdx,
-                                       int channel) const;
-   llvm::Value *indirectElement(llvm::Value *ptr, llvm::Value *indIdx,
-                                int channel) const;
    const char *name(const char *prefix) const;
    llvm::Value  *alignedArrayLoad(llvm::Value *val);
    llvm::Module *currentModule() const;
    llvm::Constant  *createConstGlobalVector(const std::vector<float> &vec);
 
-   std::vector<llvm::Value*> inputElement(int idx, llvm::Value *indIdx =0);
-   std::vector<llvm::Value*> constElement(int idx, llvm::Value *indIdx =0);
-   std::vector<llvm::Value*> outputElement(int idx, llvm::Value *indIdx =0);
-   std::vector<llvm::Value*> tempElement(int idx, llvm::Value *indIdx =0);
-   std::vector<llvm::Value*> immediateElement(int idx, llvm::Value *indIdx =0);
+   std::vector<llvm::Value*> inputElement(llvm::Value *indIdx);
+   std::vector<llvm::Value*> constElement(llvm::Value *indIdx);
+   std::vector<llvm::Value*> outputElement(llvm::Value *indIdx);
+   std::vector<llvm::Value*> tempElement(llvm::Value *indIdx);
+   std::vector<llvm::Value*> immediateElement(llvm::Value *indIdx);
 private:
    llvm::BasicBlock *m_block;
 
index 071b7d112e42df91a9017344a5a8c70946210972..0de595e6789da23e113f28fcaca154828b04744c 100644 (file)
@@ -707,7 +707,6 @@ translate_instructionir(llvm::Module *module,
 
       if (src->SrcRegister.Indirect) {
          indIdx = storage->addrElement(src->SrcRegisterInd.Index);
-         debug_printf("AAAAAAAAAAAAAAA INDIRECT %p\n", indIdx);
       }
       if (src->SrcRegister.File == TGSI_FILE_CONSTANT) {
          val = storage->load(StorageSoa::Const,