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

Last change on this file since 4416 was 4416, checked in by nmedfort, 5 years ago

Many use def info changes; removed dependency on boost system library. More work still needed on CSE.

File size: 4.5 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 <map>
23#include <algorithm>
24#include <llvm/ADT/Twine.h>
25#include <unordered_map>
26#include <string>
27
28namespace llvm {
29    class Value;
30    class Module;
31    class ExecutionEngine;
32    class VectorType;
33    class PointerType;
34    class ConstantAggregateZero;
35    class Constant;
36    class FunctionType;
37    class Function;
38    class BasicBlock;
39}
40
41namespace pablo {
42
43using namespace llvm;
44
45class PabloAST;
46class PabloBlock;
47class String;
48class Var;
49class Statement;
50class StatementList;
51
52struct LLVM_Gen_RetVal
53{
54    int carry_q_size;
55    int advance_q_size;
56    void *process_block_fptr;
57};
58
59class PabloCompiler {
60    #ifdef USE_UADD_OVERFLOW
61    struct SumWithOverflowPack {
62        Value * sum;
63        Value * obit;
64    };
65    #endif
66
67    typedef std::unordered_map<const pablo::PabloAST *, Value*>    ASTToValueMap;
68    typedef std::unordered_map<const pablo::String *, Value*>      StringToValueMap;
69    typedef std::vector<Value*>                                    CarryQueueVector;
70
71public:
72    PabloCompiler(const std::vector<Var *> & basisBitVars);
73    ~PabloCompiler();
74    void InstallExternalFunction(std::string C_fn_name, void * fn_ptr);
75    LLVM_Gen_RetVal compile(PabloBlock & pb);
76private:
77    void DefineTypes();
78    void DeclareFunctions();
79    void Examine(StatementList & stmts);
80    void Examine(PabloAST * expr);
81    void DeclareCallFunctions();
82    void SetOutputValue(Value * marker, const unsigned index);
83
84    void compileStatements(const StatementList & stmts);
85    void compileStatement(const Statement * stmt);
86    Value* compileExpression(const PabloAST * expr);
87    Value* genCarryInLoad(const unsigned index);
88    void   genCarryOutStore(Value* carryOut, const unsigned index);
89    Value* genAdvanceInLoad(const unsigned index);
90    void   genAdvanceOutStore(Value* advanceOut, const unsigned index);
91    Value* genAddWithCarry(Value* e1, Value* e2);
92    Value* genAdvanceWithCarry(Value* e1, int shift_amount);
93    Value* genBitBlockAny(Value* test);
94    Value* genShiftHighbitToLow(Value* e, const Twine & namehint = "");
95    Value* genShiftLeft64(Value* e, const Twine & namehint = "") ;
96    Value* genNot(Value* expr);
97
98    #ifdef USE_UADD_OVERFLOW
99    #ifdef USE_TWO_UADD_OVERFLOW
100    Function* mFunctionUaddOverflow;
101    SumWithOverflowPack callUaddOverflow(Value *e1, Value *e2);
102    #else
103    Function* mFunctionUaddOverflowCarryin;
104    SumWithOverflowPack callUaddOverflow(Value *e1, Value *e2, Value *cin);
105    #endif
106    #endif
107
108
109    ASTToValueMap                 mMarkerMap;
110    CarryQueueVector                    mCarryQueueVector;
111    std::vector<int>                    mCarryQueueSummaryIdx;
112    CarryQueueVector                    mAdvanceQueueVector;
113    std::vector<int>                    mAdvanceQueueSummaryIdx;
114
115    const std::vector<Var *> &          mBasisBits;
116
117    Module* const                       mMod;
118    BasicBlock*                         mBasicBlock;
119    ExecutionEngine*                    mExecutionEngine;
120
121    VectorType* const                   mBitBlockType;
122    PointerType*                        mBasisBitsInputPtr;
123
124    unsigned                            mCarryQueueIdx;
125    Value*                              mCarryQueuePtr;
126    unsigned                            mNestingDepth;
127    unsigned                            mCarryQueueSize;
128
129    unsigned                            mAdvanceQueueIdx;
130    Value*                              mAdvanceQueuePtr;
131    unsigned                            mAdvanceQueueSize;
132
133    ConstantAggregateZero* const        mZeroInitializer;
134    Constant* const                     mOneInitializer;
135
136    FunctionType*                       mFunctionType;
137    Function*                           mFunction;
138
139
140    Value*                              mBasisBitsAddr;
141    Value*                              mOutputAddrPtr;
142
143    unsigned                            mMaxNestingDepth;
144
145    std::map<std::string, void *>       mExternalMap;
146    StringToValueMap                    mCalleeMap;
147};
148
149}
150
151#endif // LLVM_GENERATOR_H
Note: See TracBrowser for help on using the repository browser.