source: icGREP/icgrep-devel/icgrep/kernels/cc_kernel.cpp @ 5781

Last change on this file since 5781 was 5781, checked in by cameron, 7 months ago

Small fixes

File size: 3.9 KB
Line 
1/*
2 *  Copyright (c) 2016 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 */
5
6#include "cc_kernel.h"
7#include <re/re_cc.h>
8#include <cc/cc_compiler.h>
9#include <pablo/builder.hpp>
10#include <kernels/kernel_builder.h>
11
12using namespace cc;
13using namespace kernel;
14using namespace pablo;
15using namespace re;
16using namespace llvm;
17
18DirectCharacterClassKernelBuilder::DirectCharacterClassKernelBuilder(
19        const std::unique_ptr<kernel::KernelBuilder> & b, std::string ccSetName, std::vector<re::CC *> charClasses, unsigned codeUnitSize)
20: BlockOrientedKernel(std::move(ccSetName),
21              {Binding{b->getStreamSetTy(1, 8 * codeUnitSize), "codeUnitStream"}},
22              {Binding{b->getStreamSetTy(charClasses.size(), 1), "ccStream"}},
23              {}, {}, {})
24, mCharClasses(charClasses)
25, mCodeUnitSize(codeUnitSize) {
26
27}
28
29void DirectCharacterClassKernelBuilder::generateDoBlockMethod(const std::unique_ptr<KernelBuilder> & iBuilder) {
30    unsigned packCount = 8 * mCodeUnitSize; 
31    unsigned codeUnitWidth = 8 * mCodeUnitSize;
32    Value * codeUnitPack[packCount];
33    for (unsigned i = 0; i < packCount; i++) {
34        codeUnitPack[i] = iBuilder->loadInputStreamPack("codeUnitStream", iBuilder->getInt32(0), iBuilder->getInt32(i));
35    }
36    for (unsigned j = 0; j < mCharClasses.size();  j++) {
37        Value * theCCstream = iBuilder->allZeroes();
38        for (const auto & interval : *mCharClasses[j]) {
39            Value * strmPack[packCount];
40            unsigned lo = re::lo_codepoint(interval);
41            unsigned hi = re::hi_codepoint(interval);
42            if (lo == hi) {
43                Value * cp = ConstantInt::get(iBuilder->getIntNTy(codeUnitWidth), lo);
44                Value * cp_splat = iBuilder->simd_fill(codeUnitWidth, cp);
45                for (unsigned k = 0; k < packCount; k++) {
46                    strmPack[k] = iBuilder->simd_eq(codeUnitWidth, codeUnitPack[k], cp_splat);
47                }
48            }
49            else {
50                Value * v1 = ConstantInt::get(iBuilder->getIntNTy(codeUnitWidth), lo-1);
51                Value * lo_splat = iBuilder->simd_fill(codeUnitWidth, v1);
52                Value * v2 = ConstantInt::get(iBuilder->getIntNTy(codeUnitWidth), hi+1);
53                Value * hi_splat = iBuilder->simd_fill(codeUnitWidth, v2);
54                for (unsigned k = 0; k < packCount; k++) {
55                    Value * lo_test = iBuilder->simd_ugt(codeUnitWidth, codeUnitPack[k], lo_splat);
56                    Value * hi_test = iBuilder->simd_ult(codeUnitWidth, codeUnitPack[k], hi_splat);
57                    strmPack[k] = iBuilder->simd_and(lo_test, hi_test);
58                }
59            }
60            unsigned packFields = iBuilder->getBitBlockWidth()/packCount;
61            Value * pack = iBuilder->allZeroes();
62            for (unsigned k = 0; k < packCount; k++) {
63                pack = iBuilder->mvmd_insert(packFields, pack, iBuilder->CreateTrunc(iBuilder->hsimd_signmask(codeUnitWidth, strmPack[k]), iBuilder->getIntNTy(packFields)), k);
64            }
65
66            theCCstream = iBuilder->simd_or(theCCstream, pack);
67        }
68        iBuilder->storeOutputStreamBlock("ccStream", iBuilder->getInt32(j), theCCstream);
69    }
70}
71
72ParabixCharacterClassKernelBuilder::ParabixCharacterClassKernelBuilder (
73        const std::unique_ptr<kernel::KernelBuilder> & b, std::string ccSetName, const std::vector<CC *> & charClasses, unsigned codeUnitSize)
74: PabloKernel(b, ccSetName +"_kernel", {Binding{b->getStreamSetTy(codeUnitSize), "basis"}})
75, mCharClasses(charClasses) {
76    for (CC * cc : mCharClasses) {
77        addOutput(cc->canonicalName(re::CC_type::ByteClass), b->getStreamTy());
78    }
79}
80
81void ParabixCharacterClassKernelBuilder::generatePabloMethod() {
82    CC_Compiler ccc(this, getInput(0));
83    auto & builder = ccc.getBuilder();
84    for (unsigned i = 0; i < mCharClasses.size(); ++i) {
85        builder.createAssign(getOutput(i), ccc.compileCC("cc", mCharClasses[i], builder));
86    }
87}
Note: See TracBrowser for help on using the repository browser.