source: icGREP/icgrep-devel/icgrep/pablo/carry_data.cpp @ 4716

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

Mod64 approximation mode

File size: 4.8 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
8#include <include/simd-lib/bitblock.hpp>
9#include <pablo/pablo_compiler.h>
10#include <pablo/codegenstate.h>
11#include <pablo/carry_data.h>
12#include <iostream>
13
14namespace pablo {
15
16void PabloBlockCarryData::enumerateLocal() {
17    for (Statement * stmt : *theScope) {
18        if (Advance * adv = dyn_cast<Advance>(stmt)) {
19            unsigned shift_amount = adv->getAdvanceAmount();
20            if (!adv->isMod64()) {
21                if (shift_amount == 1) {
22                    adv->setLocalAdvanceIndex(advance1.entries);
23                    advance1.entries++;               
24                }
25                else if (shift_amount < LongAdvanceBase) {
26                    // short Advance
27                    if (mITEMS_PER_PACK >= LongAdvanceBase) {
28                        // Packing is possible.   We will use the allocated bit position as
29                        // the index.
30                        if (roomInFinalPack(shortAdvance.allocatedBits) < shift_amount) {
31                            // Start a new pack.
32                            shortAdvance.allocatedBits = alignCeiling(shortAdvance.allocatedBits, mPACK_SIZE);
33                        }
34                        adv->setLocalAdvanceIndex(shortAdvance.allocatedBits);
35                    }
36                    else {
37                        adv->setLocalAdvanceIndex(shortAdvance.entries);
38                    }
39                    shortAdvance.entries++;
40                    shortAdvance.allocatedBits += shift_amount;
41                }
42                else {
43                    adv->setLocalAdvanceIndex(longAdvance.allocatedBitBlocks);
44                    longAdvance.entries++;
45                    longAdvance.allocatedBitBlocks += longAdvanceBufferSize(shift_amount);
46                }
47            }
48        }
49        else if (MatchStar * m = dyn_cast<MatchStar>(stmt)) {
50            if (!m->isMod64()) {
51                m->setLocalCarryIndex(addWithCarry.entries);
52                ++addWithCarry.entries;
53            }
54        }
55        else if (ScanThru * s = dyn_cast<ScanThru>(stmt)) {
56            if (!s->isMod64()) {
57                s->setLocalCarryIndex(addWithCarry.entries);
58                ++addWithCarry.entries;
59            }
60        }
61    }
62    longAdvance.frameOffset = 0;
63    shortAdvance.frameOffset = longAdvance.frameOffset + longAdvance.allocatedBitBlocks * mPOSITIONS_PER_BLOCK;
64    if (mITEMS_PER_PACK == mPACK_SIZE) {
65        addWithCarry.frameOffset = shortAdvance.frameOffset + shortAdvance.allocatedBits;
66        if (roomInFinalPack(addWithCarry.frameOffset) < addWithCarry.entries) {
67            addWithCarry.frameOffset = alignCeiling(addWithCarry.frameOffset, mPACK_SIZE);
68        }
69        advance1.frameOffset = addWithCarry.frameOffset + addWithCarry.entries;
70        if (roomInFinalPack(advance1.frameOffset) < advance1.entries) {
71            advance1.frameOffset = alignCeiling(advance1.frameOffset, mPACK_SIZE);
72        }
73    }
74    else {
75        addWithCarry.frameOffset = shortAdvance.frameOffset + shortAdvance.entries;
76        advance1.frameOffset = addWithCarry.frameOffset + addWithCarry.entries;
77
78    }
79    nested.frameOffset = advance1.frameOffset + advance1.entries;
80}
81       
82void PabloBlockCarryData::dumpCarryData(llvm::raw_ostream & strm) {
83    unsigned totalDepth = ifDepth + whileDepth;
84    for (int i = 0; i < totalDepth; i++) strm << "  ";
85    strm << "scope index = " << theScope->getScopeIndex();
86    strm << " framePosition: " << framePosition << ", ifDepth: " << ifDepth << ", whileDepth:" << whileDepth << ", maxNestingDepth: " << maxNestingDepth << "\n";
87    for (int i = 0; i < totalDepth; i++) strm << "  ";
88    strm << "longAdvance: offset = " << longAdvance.frameOffset << ", entries = " << longAdvance.entries << "\n";
89    for (int i = 0; i < totalDepth; i++) strm << "  ";
90    strm << "shortAdvance: offset = " << shortAdvance.frameOffset << ", entries = " << shortAdvance.entries << "\n";
91    for (int i = 0; i < totalDepth; i++) strm << "  ";
92    strm << "advance1: offset = " << advance1.frameOffset << ", entries = " << advance1.entries << "\n";
93    for (int i = 0; i < totalDepth; i++) strm << "  ";
94    strm << "addWithCarry: offset = " << addWithCarry.frameOffset << ", entries = " << addWithCarry.entries << "\n";
95    for (int i = 0; i < totalDepth; i++) strm << "  ";
96    strm << "nested: offset = " << nested.frameOffset << ", allocatedBits = " << nested.allocatedBits << "\n";
97    for (int i = 0; i < totalDepth; i++) strm << "  ";
98    strm << "summary: offset = " << summary.frameOffset << "\n";
99    for (int i = 0; i < totalDepth; i++) strm << "  ";
100    strm << "scopeCarryDataSize = " << scopeCarryDataSize  << "\n";
101    strm.flush();
102   
103}
104
105}
Note: See TracBrowser for help on using the repository browser.