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

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

Created an "insertion friendly" Pablo AST structure similar to LLVM; fixed engine builder bug when creating a unicode class.

File size: 3.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
13//Pablo Expressions
14#include <pablo/codegenstate.h>
15#include <pablo/pabloAST.h>
16#include "unicode_categories.h"
17#include <string>
18#include <list>
19#include <map>
20#include <algorithm>
21#include <llvm/ADT/Twine.h>
22
23namespace llvm {
24    class Value;
25    class Module;
26    class ExecutionEngine;
27    class VectorType;
28    class PointerType;
29    class ConstantAggregateZero;
30    class Constant;
31    class FunctionType;
32    class Function;
33}
34
35using namespace llvm;
36
37namespace pablo {
38
39struct LLVM_Gen_RetVal
40{
41    int carry_q_size;
42    void *process_block_fptr;
43};
44
45class PabloCompiler {
46    #ifdef USE_UADD_OVERFLOW
47    struct SumWithOverflowPack {
48        Value * sum;
49        Value * obit;
50    };
51    #endif
52
53    typedef std::unordered_map<const pablo::String *, Value*>   StringToValueMap;
54    typedef std::vector<Value*>                                 CarryQueueVector;
55
56public:
57    PabloCompiler(const std::vector<Var *> & basisBitVars);
58    ~PabloCompiler();
59    LLVM_Gen_RetVal compile(PabloBlock & pb);
60private:
61    void DefineTypes();
62    void DeclareFunctions();
63    void Examine(StatementList & stmts);
64    void Examine(PabloAST * expr);
65    void DeclareCallFunctions();
66    void SetOutputValue(Value * marker, const unsigned index);
67
68    Value* compileStatements(const StatementList & stmts);
69    Value* compileStatement(const PabloAST * stmt);
70    Value* compileExpression(const PabloAST * expr);
71    Value* genCarryInLoad(const unsigned index);
72    void   genCarryOutStore(Value* carryOut, const unsigned index);
73    Value* genAddWithCarry(Value* e1, Value* e2);
74    Value* genAdvanceWithCarry(Value* e1, int shift_amount);
75    Value* genBitBlockAny(Value* test);
76    Value* genShiftHighbitToLow(Value* e, const Twine & namehint = "");
77    Value* genShiftLeft64(Value* e, const Twine & namehint = "") ;
78    Value* genNot(Value* expr);
79
80    #ifdef USE_UADD_OVERFLOW
81    SumWithOverflowPack callUaddOverflow(Value *e1, Value *e2, Value *cin);
82    Function* mFunctionUaddOverflow;
83    #endif
84
85    StringToValueMap                    mMarkerMap;
86    CarryQueueVector                    mCarryQueueVector;
87
88    const std::vector<Var *> &          mBasisBits;
89
90    Module* const                       mMod;
91    BasicBlock*                         mBasicBlock;
92    ExecutionEngine*                    mExecutionEngine;
93
94    VectorType* const                   mBitBlockType;
95    PointerType*                        mBasisBitsInputPtr;
96
97    unsigned                            mCarryQueueIdx;
98    Value*                              mCarryQueuePtr;
99    unsigned                            mNestingDepth;
100    unsigned                            mCarryQueueSize;
101
102    ConstantAggregateZero* const        mZeroInitializer;
103    Constant* const                     mOneInitializer;
104
105    FunctionType*                       mFunctionType;
106    Function*                           mFunction;
107
108
109    Value*                              mBasisBitsAddr;
110    Value*                              mOutputAddrPtr;
111
112    unsigned                            mMaxNestingDepth;
113
114    StringToValueMap                    mCalleeMap;
115};
116
117}
118
119#endif // LLVM_GENERATOR_H
Note: See TracBrowser for help on using the repository browser.