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

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

Mod64Advance, Mod64MatchStar, Mod64ScanThru ops; -mod64-approximate command-line option

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