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

Last change on this file since 4421 was 4421, checked in by cameron, 5 years ago

Support for multiblock shift; wrapped_print_register

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