source: icGREP/icgrep-devel/icgrep/kernels/lz4/lz4_bytestream_aio.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: 4.3 KB
Line 
1
2#ifndef ICGREP_LZ4_AIO_H
3#define ICGREP_LZ4_AIO_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
19
20namespace kernel {
21
22    class LZ4ByteStreamAioKernel : public SegmentOrientedKernel {
23
24    public:
25        LZ4ByteStreamAioKernel(const std::unique_ptr<kernel::KernelBuilder> &b);
26
27    protected:
28        void generateDoSegmentMethod(const std::unique_ptr<KernelBuilder> &b) override;
29
30    private:
31        const static unsigned int ACCELERATION_WIDTH = 64; // TODO for now, we only consider 64 or 32 since cttz only have i64 or i32 version
32
33        llvm::Value *
34        generateLoadInt64NumberInput(const std::unique_ptr<KernelBuilder> &iBuilder, std::string inputBufferName,
35                                     llvm::Value *globalOffset);
36
37        void generateProcessCompressedBlock(const std::unique_ptr<KernelBuilder> &b, llvm::Value *lz4BlockStart,
38                                            llvm::Value *lz4BlockEnd);
39
40        std::pair<std::pair<llvm::Value *, llvm::Value *>, llvm::Value *>
41        generateAcceleration(const std::unique_ptr<KernelBuilder> &b, llvm::Value *beginTokenPos,
42                             llvm::Value *blockEnd);
43
44        llvm::Value *processBlockBoundary(const std::unique_ptr<KernelBuilder> &b,
45                                          llvm::Value *beginTokenPos, llvm::Value *lz4BlockEnd);
46
47
48        inline std::pair<llvm::Value *, llvm::Value *> noExtensionLiteralLength(const std::unique_ptr<KernelBuilder> &b,
49                                                                             llvm::Value *currentTokenMarker,
50                                                                             llvm::Value *currentExtenderValue,
51                                                                             llvm::Value *tokenValue,
52                                                                             llvm::Value *blockPosBase,
53                                                                             llvm::Value *currentTokenLocalPos
54        );
55
56        inline std::pair<llvm::Value *, llvm::Value *> scanThruLiteralLength(const std::unique_ptr<KernelBuilder> &b,
57                                                                             llvm::Value *currentTokenMarker,
58                                                                             llvm::Value *currentExtenderValue,
59                                                                             llvm::Value *tokenValue,
60                                                                             llvm::Value *blockPosBase,
61                                                                             llvm::Value *currentTokenLocalPos
62        );
63
64        inline std::pair<llvm::Value *, llvm::Value *> noExtensionMatchLength(const std::unique_ptr<KernelBuilder> &b,
65                                                                           llvm::Value *matchOffsetEndMarker,
66                                                                           llvm::Value *currentExtenderValue,
67                                                                           llvm::Value *tokenValue,
68                                                                           llvm::Value *blockPosBase
69        );
70
71        inline std::pair<llvm::Value *, llvm::Value *> scanThruMatchLength(const std::unique_ptr<KernelBuilder> &b,
72                                                                           llvm::Value *matchOffsetEndMarker,
73                                                                           llvm::Value *currentExtenderValue,
74                                                                           llvm::Value *tokenValue,
75                                                                           llvm::Value *blockPosBase
76        );
77        inline llvm::Value *
78        scanThru(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value *from, llvm::Value *thru);
79
80
81
82        void handleLiteralCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value* literalStart, llvm::Value* literalLength);
83        void handleMatchCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value* matchOffset, llvm::Value* matchLength);
84    };
85
86}
87
88
89
90
91#endif //ICGREP_LZ4_AIO_H
Note: See TracBrowser for help on using the repository browser.