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

Last change on this file since 6042 was 6042, checked in by xwa163, 16 months ago

Improve the performance of output producing logic in LZ4IndexBuilderKernel

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