source: icGREP/icgrep-devel/icgrep/kernels/lz4/lz4_index_builder_new.h @ 6059

Last change on this file since 6059 was 6059, checked in by xwa163, 11 months ago
  1. Enable swizzled match copy in multiplexing lz4_grep for some special case
  2. Implement some lz4 AIO (all-in-one) pipeline and related kernel
File size: 5.4 KB
Line 
1
2#ifndef ICGREP_LZ4_INDEX_BUILDER_NEW_H
3#define ICGREP_LZ4_INDEX_BUILDER_NEW_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 LZ4IndexBuilderNewKernel final : public SegmentOrientedKernel {
21    public:
22        LZ4IndexBuilderNewKernel(const std::unique_ptr<kernel::KernelBuilder> &b);
23
24    protected:
25        void generateDoSegmentMethod(const std::unique_ptr<KernelBuilder> &b) override;
26
27    private:
28        const static unsigned int ACCELERATION_WIDTH = 64; // TODO for now, we only consider 64 or 32 since cttz only have i64 or i32 version
29
30        llvm::Value *
31        generateLoadInt64NumberInput(const std::unique_ptr<KernelBuilder> &iBuilder, std::string inputBufferName,
32                                     llvm::Value *globalOffset);
33
34        void generateProcessCompressedBlock(const std::unique_ptr<KernelBuilder> &b, llvm::Value *lz4BlockStart,
35                                            llvm::Value *lz4BlockEnd);
36
37        std::pair<std::pair<llvm::Value *, llvm::Value *>, llvm::Value *>
38        generateAcceleration(const std::unique_ptr<KernelBuilder> &b, llvm::Value *beginTokenPos,
39                             llvm::Value *blockEnd);
40
41        inline llvm::Value *
42        scanThru(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value *from, llvm::Value *thru);
43
44        llvm::Value *processBlockBoundary(const std::unique_ptr<KernelBuilder> &b,
45                                          llvm::Value *beginTokenPos, llvm::Value *lz4BlockEnd);
46
47        /**
48         * scanThru the LiteralLength part of an LZ4 sequence
49         * @param b
50         * @param currentTokenMarker
51         * @param currentExtenderValue
52         * @param tokenValue
53         * @param blockPosBase
54         * @param currentTokenLocalPos
55         * @return
56         *   literalLength
57         *   literalMarker  it will be the same as currentTokenMarker if there is no extend literal length, and will be the
58         *                  marker of last byte of LiteralLength part.
59         */
60        inline std::pair<llvm::Value *, llvm::Value *> scanThruLiteralLength(const std::unique_ptr<KernelBuilder> &b,
61                                                                             llvm::Value *currentTokenMarker,
62                                                                             llvm::Value *currentExtenderValue,
63                                                                             llvm::Value *tokenValue,
64                                                                             llvm::Value *blockPosBase,
65                                                                             llvm::Value *currentTokenLocalPos
66        );
67
68        inline std::pair<llvm::Value *, llvm::Value *> scanThruMatchLength(const std::unique_ptr<KernelBuilder> &b,
69                                                                           llvm::Value *matchOffsetEndMarker,
70                                                                           llvm::Value *currentExtenderValue,
71                                                                           llvm::Value *tokenValue,
72                                                                           llvm::Value *blockPosBase
73        );
74
75        // Deletion Marker Output
76        void storePendingLiteralMasksUntilPos(const std::unique_ptr<KernelBuilder> &iBuilder,
77                                              llvm::Value *targetGlobalPos);
78        void appendBoundaryLiteralMaskOutput(const std::unique_ptr<KernelBuilder> &b,
79                                             llvm::Value *globalLiteralStartPos, llvm::Value *globalLiteralEndPos,
80                                             llvm::Value *outputUntilPos);
81        void storeLiteralMask(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value *blockIndex,
82                              llvm::Value *value);
83        void storePendingLiteralMask(const std::unique_ptr<KernelBuilder> &iBuilder);
84
85/*
86        llvm::Value *generateLoadSourceInputByte(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value *offset);
87
88        void increaseScalarField(const std::unique_ptr<KernelBuilder> &iBuilder, const std::string &fieldName,
89                                 llvm::Value *value);
90
91        llvm::Value *
92        processLiteral(const std::unique_ptr<KernelBuilder> &b, llvm::Value *token, llvm::Value *tokenPos,
93                       llvm::Value *blockEnd);
94
95        llvm::Value *
96        processMatch(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value *offsetPos, llvm::Value *token,
97                     llvm::Value *blockEnd);
98
99        // MatchOffset Marker Output
100        void appendMatchOffsetMarkerOutput(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value *position);
101        void storeMatchOffsetMarker(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value* blockIndex, llvm::Value* value);
102        void storePendingMatchOffsetMarker(const std::unique_ptr<KernelBuilder> &iBuilder);
103
104
105
106        // M0 Output
107        void appendM0Output(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value *start, llvm::Value *end);
108        void storeM0(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value* blockIndex, llvm::Value* value);
109        void storePendingM0(const std::unique_ptr<KernelBuilder> &iBuilder);
110         */
111    };
112}
113
114#endif //ICGREP_LZ4_INDEX_BUILDER_NEW_H
Note: See TracBrowser for help on using the repository browser.