source: icGREP/icgrep-devel/icgrep/pablo/carry_manager.h @ 4708

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

Move add-with-carry into carry manager

File size: 4.7 KB
Line 
1/*
2 *  Copyright (c) 2015 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 CARRY_MANAGER_H
8#define CARRY_MANAGER_H
9#include <llvm/IR/IRBuilder.h>
10#include <llvm/IR/Module.h>
11#include <IDISA/idisa_builder.h>
12#include <pablo/codegenstate.h>
13#include <pablo/carry_data.h>
14
15/*
16 * Carry Data Manager.
17 *
18 * Each PabloBlock (Main, If, While) has a contiguous data area for carry information.
19 * The data area may be at a fixed or variable base offset from the base of the
20 * main function carry data area.
21 * The data area for each block consists of contiguous space for the local carries and
22 * advances of the block plus the areas of any ifs/whiles nested within the block.
23
24*/
25
26using namespace llvm;
27
28namespace pablo {
29
30class PabloBlock;
31
32
33
34class CarryManager {
35public:
36 
37    CarryManager(IRBuilder <> * b, VectorType * bitBlockType, ConstantAggregateZero * zero, Constant * one, IDISA::IDISA_Builder * idb)
38    : mBuilder(b)
39    , mBitBlockType(bitBlockType)
40    , mZeroInitializer(zero)
41    , mOneInitializer(one)
42    , iBuilder(idb)
43    , mPabloRoot(nullptr)
44    , mCurrentScope(nullptr)
45    , mCarryInfo(nullptr)
46    , mCurrentFrameIndex(0)
47    , mCarryPackBasePtr(nullptr)
48#ifdef PACKING
49    , mCarryBitBlockPtr(nullptr)
50#endif
51    , mBlockNoPtr(nullptr)
52    , mBlockNo(nullptr)
53    , mTotalCarryDataBitBlocks(0)
54    {
55
56    }
57   
58    unsigned initialize(PabloBlock * blk, Value * carryDataPtr); 
59   
60    unsigned enumerate(PabloBlock * blk, unsigned ifDepth, unsigned whileDepth);
61   
62    void generateBlockNoIncrement();   
63    Value * getBlockNoPtr();
64   
65    /* Entering and leaving scopes. */
66   
67    void enterScope(PabloBlock * blk);
68    void leaveScope();
69   
70    /* Methods for processing individual carry-generating operations. */
71   
72    Value * getCarryOpCarryIn(int localIndex);
73    void setCarryOpCarryOut(unsigned idx, Value * carry_out);
74    Value * addCarryInCarryOut(int localIndex, Value* e1, Value* e2);
75
76
77    Value * advanceCarryInCarryOut(int localIndex, int shift_amount, Value * strm);
78 
79    /* Methods for getting and setting carry summary values for If statements */
80   
81    bool blockHasCarries();
82   
83    void initializeCarryDataAtIfEntry();
84   
85    Value * getCarrySummaryExpr();
86   
87    void generateCarryOutSummaryCodeIfNeeded();
88   
89    void buildCarryDataPhisAfterIfBody(BasicBlock * ifEntryBlock, BasicBlock * ifBodyFinalBlock);
90   
91    void addSummaryPhiIfNeeded(BasicBlock * ifEntryBlock, BasicBlock * ifBodyFinalBlock);
92   
93    /* Methods for handling while statements */
94   
95    void ensureCarriesLoadedRecursive();
96
97    void initializeCarryDataPhisAtWhileEntry(BasicBlock * whileBodyFinalBlock);
98
99    void extendCarryDataPhisAtWhileBodyFinalBlock(BasicBlock * whileBodyFinalBlock);
100
101    void ensureCarriesStoredRecursive();
102
103   
104private:
105    IRBuilder <> * mBuilder;
106    VectorType * mBitBlockType;
107    Constant * mZeroInitializer;
108    Constant * mOneInitializer;
109    IDISA::IDISA_Builder * iBuilder;
110    PabloBlock * mPabloRoot;
111    PabloBlock * mCurrentScope;
112    PabloBlockCarryData * mCarryInfo;
113    unsigned mCurrentFrameIndex;
114    Value * mCarryPackBasePtr;
115#ifdef PACKING
116    Type * mCarryPackType;
117    Value * mCarryBitBlockPtr;
118#endif
119    Value * mBlockNoPtr;
120    Value * mBlockNo;
121    unsigned mTotalCarryDataBitBlocks;
122   
123    std::vector<PabloBlockCarryData *> mCarryInfoVector;
124
125
126    std::vector<Value *> mCarryPackPtr;
127    std::vector<Value *> mCarryInPack;
128    std::vector<PHINode *> mCarryInPhis; 
129    std::vector<PHINode *> mCarryOutAccumPhis; 
130    std::vector<Value *> mCarryOutPack;
131
132    Value * unitAdvanceCarryInCarryOut(int localIndex, Value * strm);
133    Value * shortAdvanceCarryInCarryOut(int localIndex, int shift_amount, Value * strm);
134    Value * longAdvanceCarryInCarryOut(int localIndex, int shift_amount, Value * strm);
135   
136   
137    /* Helper routines */
138    Value * getCarryPack(unsigned packIndex);
139    void storeCarryPack(unsigned packIndex);
140   
141    Value * maskSelectBitRange(Value * pack, unsigned lo_bit, unsigned bitCount);     
142    Value * getCarryInBits(unsigned carryBitPos, unsigned bits);
143    void extractAndSaveCarryOutBits(Value * strm, unsigned carryBit_lo, unsigned carryBitCount);
144    Value * pack2bitblock(Value * pack);
145    Value* genShiftLeft64(Value* e);
146
147
148    unsigned absPosition(unsigned frameOffsetinBits, unsigned relPos);
149    unsigned carryOpPosition(unsigned localIndex) ;
150    unsigned advance1Position(unsigned localIndex);
151    unsigned shortAdvancePosition(unsigned localIndex);
152    unsigned longAdvanceBitBlockPosition(unsigned localIndex);
153    unsigned localBasePack();
154    unsigned scopeBasePack();
155    unsigned summaryPosition();
156    unsigned summaryBits();
157
158};
159
160}
161
162#endif // CARRY_MANAGER_H
Note: See TracBrowser for help on using the repository browser.