Ignore:
Timestamp:
Jul 30, 2018, 1:36:48 AM (6 months ago)
Author:
xwa163
Message:
  1. Implement twist_kernel and untwist_kernel by PEXT and PDEP
  2. Use twist form for multiplexing lz4 grep
File:
1 edited

Legend:

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

    r6132 r6135  
    4747
    4848
    49     P2S4StreamByPDEP::P2S4StreamByPDEP(const std::unique_ptr<kernel::KernelBuilder> & b)
    50             : BlockOrientedKernel("P2S4StreamByPDEP",
    51                                   {Binding{b->getStreamSetTy(4, 1), "basisBits"}},
    52                                   {Binding{b->getStreamSetTy(1, 4), "byteStream"}},
    53                                   {}, {}, {})
    54     {
    55     }
    56 
    57 
    58     void P2S4StreamByPDEP::generateDoBlockMethod(const std::unique_ptr<KernelBuilder> & b) {
    59         Function * PDEPFunc = Intrinsic::getDeclaration(getModule(), Intrinsic::x86_bmi_pdep_64);
    60         uint64_t pdepBaseMask = 0x1111111111111111;
    61 
    62         Value* inputBlocks[4];
    63 
    64         for (unsigned i = 0; i < 4; i++) {
    65             inputBlocks[i] = b->loadInputStreamBlock("basisBits", b->getInt32(i));
    66         }
    67         Value* outputBasePtr = b->CreatePointerCast(b->getOutputStreamBlockPtr("byteStream", b->getSize(0)), b->getInt64Ty()->getPointerTo());
    68 
    69         for (unsigned i = 0; i < b->getBitBlockWidth() / 64; i++) {
    70             Value* currentInput[4];
    71             for (unsigned iIndex = 0; iIndex < 4; iIndex++) {
    72                 currentInput[iIndex] = b->CreateExtractElement(inputBlocks[iIndex], i);
    73             }
    74 
    75             for (unsigned j = 0; j < 4; j++) {
    76                 unsigned outputIndex = i * 4 + j;
    77                 Value* retI64 = b->getInt64(0);
    78                 for (unsigned k = 0; k < 4; k++) {
    79                     Value* newBits = b->CreateCall(
    80                             PDEPFunc,{
    81                                     b->CreateLShr(currentInput[k], b->getInt64(j * 16)),
    82                                     b->getInt64(pdepBaseMask << k)
    83                             }
    84                     );
    85                     retI64 = b->CreateOr(retI64, newBits);
    86                 }
    87                 b->CreateStore(retI64, b->CreateGEP(outputBasePtr, b->getInt32(outputIndex)));
    88             }
    89         }
    90 
    91 //        for (unsigned i = 0; i < 4; i++) {
    92 //            b->CallPrintRegister("input" + std::to_string(i), inputBlocks[i]);
    93 //        }
    94 //
    95 //        Value* outputBaseBlockPtr = b->CreatePointerCast(b->getOutputStreamBlockPtr("byteStream", b->getSize(0)), b->getBitBlockType()->getPointerTo());
    96 //        for (unsigned i = 0; i < 4; i++) {
    97 //            b->CallPrintRegister("output" + std::to_string(i), b->CreateLoad(b->CreateGEP(outputBaseBlockPtr, b->getInt32(i))));
    98 //        }
    99 
    100     }
     49
    10150
    10251               
     
    269218    mBasisSetNumbering(numbering) {
    270219}
    271    
    272    
    273 }
     220
     221}
Note: See TracChangeset for help on using the changeset viewer.