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

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

Changes to support 3-operand form for all instructions. CSE disabled but partially redundant now.

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