source: icGREP/icgrep-devel/icgrep/kernels/lz4/lz4_index_builder.h @ 5958

Last change on this file since 5958 was 5958, checked in by nmedfort, 11 months ago

made LZ4IndexBuilderKernel a segment-oriented kernel + code clean up.

File size: 2.6 KB
Line 
1//
2// Created by wxy325 on 2018/3/16.
3//
4
5#ifndef ICGREP_LZ4_INDEX_BUILDER_H
6#define ICGREP_LZ4_INDEX_BUILDER_H
7
8#include "kernels/kernel.h"
9#include <string>
10#include <map>
11#include <vector>
12
13namespace llvm {
14    class Module;
15    class Function;
16    class BasicBlock;
17    class Value;
18}
19
20namespace IDISA { class IDISA_Builder; }
21
22namespace kernel {
23    class LZ4IndexBuilderKernel final : public SegmentOrientedKernel {
24    public:
25        LZ4IndexBuilderKernel(const std::unique_ptr<kernel::KernelBuilder> &iBuilder);
26
27    protected:
28        void generateDoSegmentMethod(const std::unique_ptr<KernelBuilder> & b) override;
29
30    private:
31        llvm::Value *
32        generateLoadInt64NumberInput(const std::unique_ptr<KernelBuilder> &iBuilder, std::string inputBufferName,
33                                     llvm::Value *globalOffset);
34
35        void generateProcessCompressedBlock(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value *blockStart,
36                                            llvm::Value *blockEnd);
37
38        llvm::Value *generateLoadSourceInputByte(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value *offset);
39
40        llvm::Value *advanceUntilNextZero(const std::unique_ptr<KernelBuilder> &iBuilder, std::string inputName,
41                                          llvm::Value *startPos, llvm::Value *maxPos = nullptr);
42
43        void increaseScalarField(const std::unique_ptr<KernelBuilder> &iBuilder, const std::string &fieldName,
44                                 llvm::Value *value);
45
46        llvm::Value *
47        processLiteral(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value *token, llvm::Value *tokenPos,
48                       llvm::Value *blockEnd);
49
50        llvm::Value *
51        processMatch(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value *offsetPos, llvm::Value *token,
52                     llvm::Value *blockEnd);
53
54
55        size_t getOutputBufferSize(const std::unique_ptr<KernelBuilder> &iBuilder, std::string bufferName);
56
57        llvm::BasicBlock *markCircularOutputBitstream(const std::unique_ptr<KernelBuilder> &iBuilder,
58                                                      const std::string &bitstreamName,
59                                                      llvm::Value *start, llvm::Value *end, bool isOne,
60                                                      bool setProduced = true);
61
62        void generateStoreNumberOutput(const std::unique_ptr<KernelBuilder> &iBuilder,
63                                       const std::string &outputBufferName,
64                                       llvm::Value *value);
65
66    };
67}
68
69
70#endif //ICGREP_LZ4_INDEX_BUILDER_H
Note: See TracBrowser for help on using the repository browser.