source: icGREP/icgrep-devel/icgrep/pablo/pablo_compiler.h @ 4537

Last change on this file since 4537 was 4537, checked in by cameron, 4 years ago

Set up for necessary AVX2 #defines

File size: 5.4 KB
Line 
1/*
2 *  Copyright (c) 2014 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icgrep is a trademark of International Characters.
5 */
6
7#ifndef PABLO_COMPILER_H
8#define PABLO_COMPILER_H
9
10//indicates that we use llvm.uadd.with.overflow.carryin for genAddWithCarry
11//#define USE_UADD_OVERFLOW
12//#define USE_LONG_INTEGER_SHIFT
13//#define USE_TWO_UADD_OVERFLOW
14
15#if defined(USE_TWO_UADD_OVERFLOW) && !defined(USE_UADD_OVERFLOW)
16static_assert(false, "Need to turn on them together.");
17#endif
18
19//Pablo Expressions
20#include <string>
21#include <list>
22#include <vector>
23#include <map>
24#include <algorithm>
25#include <unordered_map>
26#include <pablo/pe_string.h>
27#include <llvm/ADT/Twine.h>
28
29namespace llvm {
30    class Value;
31    class Module;
32    class ExecutionEngine;
33    class VectorType;
34    class PointerType;
35    class ConstantAggregateZero;
36    class Constant;
37    class FunctionType;
38    class Function;
39    class BasicBlock;
40}
41
42namespace pablo {
43
44using namespace llvm;
45
46class PabloAST;
47class PabloBlock;
48class String;
49class Var;
50class Statement;
51class StatementList;
52class If;
53class While;
54
55struct CompiledPabloFunction {
56    const unsigned      CarryQueueSize;
57    const unsigned      AdvanceQueueSize;
58    void * const        FunctionPointer;
59private:
60    Function *          mFunction;
61    ExecutionEngine *   mExecutionEngine;
62public:
63    CompiledPabloFunction(unsigned carryQSize, unsigned advanceQSize, Function * function, ExecutionEngine * executionEngine);
64
65    inline CompiledPabloFunction(CompiledPabloFunction && cpf)
66    : CarryQueueSize(cpf.CarryQueueSize)
67    , AdvanceQueueSize(cpf.AdvanceQueueSize)
68    , FunctionPointer(cpf.FunctionPointer)
69    , mFunction(cpf.mFunction)
70    , mExecutionEngine(cpf.mExecutionEngine)
71    {
72        cpf.mFunction = nullptr;
73        cpf.mExecutionEngine = nullptr;
74    }
75
76    ~CompiledPabloFunction();
77
78};
79#if (BLOCK_SIZE==256)
80#define USE_UADD_OVERFLOW
81#define USE_TWO_UADD_OVERFLOW
82#endif
83
84class PabloCompiler {
85    #ifdef USE_UADD_OVERFLOW
86    struct SumWithOverflowPack {
87        Value * sum;
88        Value * obit;
89    };
90    #endif
91
92    typedef std::unordered_map<const pablo::PabloAST *, Value*>    ASTToValueMap;
93    typedef std::unordered_map<const pablo::String *, Value*>      StringToValueMap;
94    typedef std::vector<Value*>                                    CarryQueueVector;
95
96public:
97    PabloCompiler(const std::vector<Var *> & basisBitVars);
98    ~PabloCompiler();
99    void InstallExternalFunction(std::string C_fn_name, void * fn_ptr);
100    CompiledPabloFunction compile(PabloBlock & pb);
101private:
102    void DefineTypes();
103    void DeclareFunctions();
104    void Examine(StatementList & stmts);
105    void DeclareCallFunctions();
106    void SetOutputValue(Value * marker, const unsigned index);
107
108    void compileStatements(const StatementList & stmts);
109    void compileStatement(const Statement * stmt);
110    void compileIf(const If * ifStmt);
111    void compileWhile(const While * whileStmt);
112    Value* compileExpression(const PabloAST * expr);
113    Value* genCarryInLoad(const unsigned index);
114    void   genCarryOutStore(Value* carryOut, const unsigned index);
115    Value* genAdvanceInLoad(const unsigned index);
116    void   genAdvanceOutStore(Value* advanceOut, const unsigned index);
117    Value* genAddWithCarry(Value* e1, Value* e2);
118    Value* genAdvanceWithCarry(Value* e1, int shift_amount);
119    Value* genBitBlockAny(Value* test);
120    Value* genShiftHighbitToLow(Value* e, const Twine & namehint = "");
121    Value* genShiftLeft64(Value* e, const Twine & namehint = "") ;
122    Value* genNot(Value* expr);
123
124    #ifdef USE_UADD_OVERFLOW
125    #ifdef USE_TWO_UADD_OVERFLOW
126    Function* mFunctionUaddOverflow;
127    SumWithOverflowPack callUaddOverflow(Value *e1, Value *e2);
128    #else
129    Function* mFunctionUaddOverflowCarryin;
130    SumWithOverflowPack callUaddOverflow(Value *e1, Value *e2, Value *cin);
131    #endif
132    #endif
133
134
135    ASTToValueMap                       mMarkerMap;
136    CarryQueueVector                    mCarryQueueVector;
137    std::vector<int>                    mCarryQueueSummaryIdx;
138    CarryQueueVector                    mAdvanceQueueVector;
139    std::vector<int>                    mAdvanceQueueSummaryIdx;
140
141    const std::vector<Var *> &          mBasisBits;
142
143    Module* const                       mMod;
144    BasicBlock*                         mBasicBlock;
145    ExecutionEngine*                    mExecutionEngine;
146
147    VectorType* const                   mBitBlockType;
148    PointerType*                        mBasisBitsInputPtr;
149
150    unsigned                            mCarryQueueIdx;
151    Value*                              mCarryQueuePtr;
152    unsigned                            mNestingDepth;
153    unsigned                            mCarryQueueSize;
154
155    unsigned                            mAdvanceQueueIdx;
156    Value*                              mAdvanceQueuePtr;
157    unsigned                            mAdvanceQueueSize;
158
159    ConstantAggregateZero* const        mZeroInitializer;
160    Constant* const                     mOneInitializer;
161
162    FunctionType*                       mFunctionType;
163    Function*                           mFunction;
164
165
166    Value*                              mBasisBitsAddr;
167    Value*                              mOutputAddrPtr;
168
169    unsigned                            mMaxNestingDepth;
170
171    std::map<std::string, void *>       mExternalMap;
172    StringToValueMap                    mCalleeMap;
173
174    Constant *                          mPrintRegisterFunction;
175};
176
177}
178
179#endif // LLVM_GENERATOR_H
Note: See TracBrowser for help on using the repository browser.