Ignore:
Timestamp:
Jan 9, 2018, 12:01:46 PM (17 months ago)
Author:
cameron
Message:

Direct CC compiler

File:
1 edited

Legend:

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

    r5781 r5823  
    1919        const std::unique_ptr<kernel::KernelBuilder> & b, std::string ccSetName, std::vector<re::CC *> charClasses, unsigned codeUnitSize)
    2020: BlockOrientedKernel(std::move(ccSetName),
    21               {Binding{b->getStreamSetTy(1, 8 * codeUnitSize), "codeUnitStream"}},
     21              {Binding{b->getStreamSetTy(1, 8 * codeUnitSize), "codeUnitStream", FixedRate(), Principal()}},
    2222              {Binding{b->getStreamSetTy(charClasses.size(), 1), "ccStream"}},
    2323              {}, {}, {})
     
    3030    unsigned packCount = 8 * mCodeUnitSize; 
    3131    unsigned codeUnitWidth = 8 * mCodeUnitSize;
     32    unsigned topBit = 1 << codeUnitWidth;
     33    unsigned maxCodeVal = (topBit - 1) | topBit;
    3234    Value * codeUnitPack[packCount];
    3335    for (unsigned i = 0; i < packCount; i++) {
     
    4648                    strmPack[k] = iBuilder->simd_eq(codeUnitWidth, codeUnitPack[k], cp_splat);
    4749                }
    48             }
    49             else {
     50            } else if (lo == 0) {
     51                if (hi == maxCodeVal) {
     52                    for (unsigned k = 0; k < packCount; k++) {
     53                        strmPack[k] = iBuilder->allOnes();
     54                    }
     55                } else {
     56                    Value * cp = ConstantInt::get(iBuilder->getIntNTy(codeUnitWidth), hi + 1);
     57                    Value * cp_splat = iBuilder->simd_fill(codeUnitWidth, cp);
     58                    for (unsigned k = 0; k < packCount; k++) {
     59                        strmPack[k] = iBuilder->simd_ult(codeUnitWidth, codeUnitPack[k], cp_splat);
     60                    }
     61                }
     62            } else if (hi == maxCodeVal) {
     63                Value * cp = ConstantInt::get(iBuilder->getIntNTy(codeUnitWidth), lo - 1);
     64                Value * cp_splat = iBuilder->simd_fill(codeUnitWidth, cp);
     65                for (unsigned k = 0; k < packCount; k++) {
     66                    strmPack[k] = iBuilder->simd_ugt(codeUnitWidth, codeUnitPack[k], cp_splat);
     67                }
     68            } else {
    5069                Value * v1 = ConstantInt::get(iBuilder->getIntNTy(codeUnitWidth), lo-1);
    5170                Value * lo_splat = iBuilder->simd_fill(codeUnitWidth, v1);
Note: See TracChangeset for help on using the changeset viewer.