Ignore:
Timestamp:
Jul 25, 2018, 2:50:09 AM (12 months ago)
Author:
xwa163
Message:
  1. Add sourceCC in multiplexed CC
  2. Remove workaround FakeBasisBits? from ICGrep
  3. Implement Swizzled version of LZParabix
  4. Init checkin for SwizzleByGather? Kernel
File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/kernels/swizzle.cpp

    r6026 r6133  
    77#include <kernels/kernel_builder.h>
    88#include <string>
     9#include <vector>
    910
    1011using namespace llvm;
     
    7980
    8081
     82    SwizzleByGather::SwizzleByGather(const std::unique_ptr<KernelBuilder> &iBuilder)
     83    : BlockOrientedKernel("swizzleByGather", {}, {}, {}, {}, {}){
     84        for (unsigned i = 0; i < 2; i++) {
     85            mStreamSetInputs.push_back(Binding{iBuilder->getStreamSetTy(4, 1), "inputGroup" + std::to_string(i)});
     86        }
     87        for (unsigned i = 0; i < 1; i++) {
     88            mStreamSetOutputs.push_back(Binding{iBuilder->getStreamSetTy(8, 1), "outputGroup" + std::to_string(i), FixedRate(1)});
     89        }
     90    }
     91
     92    void SwizzleByGather::generateDoBlockMethod(const std::unique_ptr<kernel::KernelBuilder> &b) {
     93        Value* outputStreamPtr = b->getOutputStreamBlockPtr("outputGroup0", b->getSize(0));
     94
     95        for (unsigned i = 0; i < 2; i++) {
     96            std::vector<llvm::Value*> inputStream;
     97            Value* inputPtr = b->getInputStreamBlockPtr("inputGroup" + std::to_string(i), b->getSize(0));
     98
     99            Value* inputBytePtr = b->CreatePointerCast(inputPtr, b->getInt8PtrTy());
     100            Function *gatherFunc = Intrinsic::getDeclaration(b->getModule(), Intrinsic::x86_avx2_gather_d_q_256);
     101            Value *addresses = ConstantVector::get(
     102                    {b->getInt32(0), b->getInt32(32), b->getInt32(64), b->getInt32(96)});
     103
     104            for (unsigned j = 0; j < 4; j++) {
     105                Value *gather_result = b->CreateCall(
     106                        gatherFunc,
     107                        {
     108                                UndefValue::get(b->getBitBlockType()),
     109                                inputBytePtr,
     110                                addresses,
     111                                Constant::getAllOnesValue(b->getBitBlockType()),
     112                                b->getInt8(1)
     113                        }
     114                );
     115
     116                inputBytePtr = b->CreateGEP(inputBytePtr, b->getInt32(8));
     117
     118                b->CreateStore(gather_result, outputStreamPtr);
     119                outputStreamPtr = b->CreateGEP(outputStreamPtr, b->getSize(1));
     120            }
     121        }
     122    }
    81123}
Note: See TracChangeset for help on using the changeset viewer.