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

Last change on this file since 4275 was 4275, checked in by linmengl, 5 years ago

USE_UADD_OVERFLOW flag is now working

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 DeclareCallFunctions(const StatementList & stmts);
64    void DeclareCallFunctions(const PabloAST * expr);
65    void SetOutputValue(Value * marker, const unsigned index);
66
67    Value* compileStatements(const StatementList & stmts);
68    Value* compileStatement(const PabloAST * stmt);
69    Value* compileExpression(const PabloAST * expr);
70    Value* genCarryInLoad(const unsigned index);
71    void   genCarryOutStore(Value* carryOut, const unsigned index);
72    Value* genAddWithCarry(Value* e1, Value* e2);
73    Value* genAdvanceWithCarry(Value* e1, int shift_amount);
74    Value* genBitBlockAny(Value* test);
75    Value* genShiftHighbitToLow(Value* e, const Twine & namehint = "");
76    Value* genShiftLeft64(Value* e, const Twine & namehint = "") ;
77    Value* genNot(Value* expr);
78
79    #ifdef USE_UADD_OVERFLOW
80    SumWithOverflowPack callUaddOverflow(Value *e1, Value *e2, Value *cin);
81    Function* mFunctionUaddOverflow;
82    #endif
83
84    StringToValueMap                    mMarkerMap;
85    CarryQueueVector                    mCarryQueueVector;
86
87    const std::vector<Var *> &          mBasisBits;
88
89    Module* const                       mMod;
90    BasicBlock*                         mBasicBlock;
91    ExecutionEngine*                    mExecutionEngine;
92
93    VectorType* const                   mBitBlockType;
94    PointerType*                        mBasisBitsInputPtr;
95
96    unsigned                            mCarryQueueIdx;
97    Value*                              mCarryQueuePtr;
98    unsigned                            mNestingDepth;
99    unsigned                            mCarryQueueSize;
100
101    ConstantAggregateZero* const        mZeroInitializer;
102    Constant* const                     mOneInitializer;
103
104    FunctionType*                       mFunctionType;
105    Function*                           mFunction;
106
107
108    Value*                              mBasisBitsAddr;
109    Value*                              mOutputAddrPtr;
110
111    int                                 mMaxPabloWhileDepth;
112
113    StringToValueMap                    mCalleeMap;
114};
115
116}
117
118#endif // LLVM_GENERATOR_H
Note: See TracBrowser for help on using the repository browser.