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

Last change on this file since 4831 was 4821, checked in by cameron, 4 years ago

Encapsulating all-zeroes and all-ones initializers within IDISA builder

File size: 3.7 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 <unordered_map>
26#include <pablo/pe_string.h>
27#include <pablo/carry_manager.h>
28#include <llvm/ADT/Twine.h>
29#include <llvm/IR/IRBuilder.h>
30#include <IDISA/idisa_builder.h>
31
32namespace llvm {
33    class Value;
34    class Module;
35    class ExecutionEngine;
36    class VectorType;
37    class PointerType;
38    class ConstantAggregateZero;
39    class Constant;
40    class FunctionType;
41    class Function;
42    class BasicBlock;
43}
44
45namespace pablo {
46
47using namespace llvm;
48
49class PabloAST;
50class PabloBlock;
51class PabloFunction;
52class String;
53class Var;
54class Statement;
55class StatementList;
56class If;
57class While;
58
59#if (BLOCK_SIZE==256)
60#define USE_UADD_OVERFLOW
61#define USE_TWO_UADD_OVERFLOW
62#endif
63
64class PabloCompiler {
65    #ifdef USE_UADD_OVERFLOW
66    struct SumWithOverflowPack {
67        Value * sum;
68        Value * obit;
69    };
70    #endif
71
72    typedef std::unordered_map<const pablo::PabloAST *, Value *>   ASTToValueMap;
73    typedef std::vector<Value*>                                    CarryQueueVector;
74
75public:
76    PabloCompiler();
77    ~PabloCompiler();
78    Function * compile(pablo::PabloFunction * function);
79    Function * compile(pablo::PabloFunction * function, Module *module);
80    Module *getModule();
81private:
82    void GenerateFunction(PabloFunction & function);
83    void DeclareDebugFunctions();
84    void Examine(PabloFunction & function);
85    void Examine(PabloBlock & block);
86
87    void SetOutputValue(Value * marker, const unsigned index);
88
89    void genPrintRegister(std::string regName, Value * bitblockValue);
90    void compileBlock(PabloBlock & block);
91    void compileStatement(const Statement * stmt);
92    Value * genBitTest2(Value * e1, Value * e2);
93    void compileIf(const If * ifStmt);
94    void compileWhile(const While * whileStmt);
95    Value* compileExpression(const PabloAST * expr);
96
97    #ifdef USE_UADD_OVERFLOW
98    #ifdef USE_TWO_UADD_OVERFLOW
99    Function* mFunctionUaddOverflow;
100    SumWithOverflowPack callUaddOverflow(Value *e1, Value *e2);
101    #else
102    Function* mFunctionUaddOverflowCarryin;
103    SumWithOverflowPack callUaddOverflow(Value *e1, Value *e2, Value *cin);
104    #endif
105    #endif
106
107    ASTToValueMap                       mMarkerMap;
108    CarryQueueVector                    mCarryInVector;
109    CarryQueueVector                    mCarryOutVector;
110
111
112    Module *                            mMod;
113    IRBuilder <> *                      mBuilder;
114
115    CarryManager *                      mCarryManager;
116
117    VectorType* const                   mBitBlockType;
118    IDISA::IDISA_Builder                iBuilder;
119    PointerType*                        mInputType;
120
121    PabloBlock *                        mPabloBlock;
122   
123    unsigned                            mWhileDepth;
124    unsigned                            mIfDepth;
125
126    Function *                          mFunction;
127    Value *                             mInputAddressPtr;
128    Value *                             mOutputAddressPtr;
129
130    unsigned                            mMaxWhileDepth;
131
132    Constant *                          mPrintRegisterFunction;
133};
134
135inline Module * PabloCompiler::getModule() {
136    return mMod;
137}
138
139}
140
141#endif // LLVM_GENERATOR_H
Note: See TracBrowser for help on using the repository browser.