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

Last change on this file since 5923 was 5923, checked in by xwa163, 13 months ago

Fix some GEP instructions in lz4_index_builder and lz4_block_decoder_new

File size: 3.3 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 MultiBlockKernel {
24    public:
25        LZ4IndexBuilderKernel(const std::unique_ptr<kernel::KernelBuilder> &iBuilder);
26
27    protected:
28        void generateMultiBlockLogic(const std::unique_ptr<KernelBuilder> &iBuilder,
29                                     llvm::Value *const numOfStrides) override;
30
31    private:
32        llvm::Value *
33        generateLoadInt64NumberInput(const std::unique_ptr<KernelBuilder> &iBuilder, std::string inputBufferName,
34                                     llvm::Value *globalOffset);
35
36        void generateProcessCompressedBlock(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value *blockStart,
37                                            llvm::Value *blockEnd);
38
39        llvm::Value *generateLoadSourceInputByte(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value *offset);
40
41        llvm::Value *advanceUntilNextZero(const std::unique_ptr<KernelBuilder> &iBuilder, std::string inputName,
42                                          llvm::Value *startPos, llvm::Value *maxPos = nullptr);
43
44        llvm::Value *advanceUntilNextOne(const std::unique_ptr<KernelBuilder> &iBuilder, std::string inputName,
45                                         llvm::Value *startPos, llvm::Value *maxPos = nullptr);
46
47        llvm::Value *advanceUntilNextValue(const std::unique_ptr<KernelBuilder> &iBuilder, std::string inputName,
48                                           llvm::Value *startPos, bool isNextZero, llvm::Value *maxPos = nullptr);
49
50        void increaseScalarField(const std::unique_ptr<KernelBuilder> &iBuilder, const std::string &fieldName,
51                                 llvm::Value *value);
52
53        llvm::Value *
54        processLiteral(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value *token, llvm::Value *tokenPos,
55                       llvm::Value *blockEnd);
56
57        llvm::Value *
58        processMatch(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value *offsetPos, llvm::Value *token,
59                     llvm::Value *blockEnd);
60
61
62        size_t getOutputBufferSize(const std::unique_ptr<KernelBuilder> &iBuilder, std::string bufferName);
63
64        llvm::BasicBlock *markCircularOutputBitstream(const std::unique_ptr<KernelBuilder> &iBuilder,
65                                                      const std::string &bitstreamName,
66                                                      llvm::Value *start, llvm::Value *end, bool isOne,
67                                                      bool setProduced = true);
68
69        void generateStoreNumberOutput(const std::unique_ptr<KernelBuilder> &iBuilder,
70                                       const std::string &outputBufferName, llvm::Type *pointerType,
71                                       llvm::Value *value);
72
73        void resetPreviousProducedMap(const std::unique_ptr<KernelBuilder> &iBuilder, std::vector<std::string> outputList);
74        std::map<std::string, llvm::Value*> previousProducedMap;
75    };
76}
77
78
79#endif //ICGREP_LZ4_INDEX_BUILDER_H
Note: See TracBrowser for help on using the repository browser.