source: icGREP/icgrep-devel/icgrep/pablo/codegenstate.cpp @ 4388

Last change on this file since 4388 was 4280, checked in by nmedfort, 5 years ago

More Pablo IR manipulation functionality; finished use analysis optimizer (requires boost). Removed remaining LLVM optimization passes.

File size: 2.8 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#include <pablo/codegenstate.h>
8#include <iostream>
9
10namespace pablo {
11
12/// UNARY CREATE FUNCTIONS
13
14PabloAST * PabloBlock::createAdvance(PabloAST * expr, const int shiftAmount) {
15    if (isa<Zeroes>(expr)) {
16        return expr;
17    }
18    return mUnaryWithInt.findOrMake<Advance>(PabloAST::ClassTypeId::Advance, expr, shiftAmount);
19}
20
21Call * PabloBlock::createCall(const std::string name) {
22    return mUnary.findOrMake<Call>(PabloAST::ClassTypeId::Call, mSymbolGenerator.get(name));
23}
24
25PabloAST * PabloBlock::createNot(PabloAST * expr) {
26    return mUnary.findOrCall<OptimizeNot>(PabloAST::ClassTypeId::Not, expr);
27}
28
29Var * PabloBlock::createVar(const std::string name) {
30    return mUnary.findOrMake<Var>(PabloAST::ClassTypeId::Var, mSymbolGenerator.get(name));
31}
32
33Var * PabloBlock::createVar(Assign * assign) {
34    return mUnary.findOrMake<Var>(PabloAST::ClassTypeId::Var, assign);
35}
36
37Var * PabloBlock::createVar(Next * next) {
38    return mUnary.findOrMake<Var>(PabloAST::ClassTypeId::Var, next);
39}
40
41/// BINARY CREATE FUNCTIONS
42
43Next * PabloBlock::createNext(Assign * assign, PabloAST * expr) {
44    Next * next = mBinary.findOrMake<Next>(PabloAST::ClassTypeId::Next, assign, expr, &mStatements);
45    mStatements.push_back(next);
46    return next;
47}
48
49PabloAST * PabloBlock::createMatchStar(PabloAST * marker, PabloAST * charclass) {
50    if (isa<Zeroes>(marker) || isa<Zeroes>(charclass)) {
51        return marker;
52    }
53    return mBinary.findOrMake<MatchStar>(PabloAST::ClassTypeId::MatchStar, marker, charclass);
54}
55
56PabloAST * PabloBlock::createScanThru(PabloAST * from, PabloAST * thru) {
57    if (isa<Zeroes>(from) || isa<Zeroes>(thru)) {
58        return from;
59    }
60    return mBinary.findOrMake<ScanThru>(PabloAST::ClassTypeId::ScanThru, from, thru);
61}
62
63PabloAST * PabloBlock::createAnd(PabloAST * expr1, PabloAST * expr2) {
64    if (expr1 < expr2) {
65        std::swap(expr1, expr2);
66    }
67    return mBinary.findOrCall<OptimizeAnd>(PabloAST::ClassTypeId::And, expr1, expr2);
68}
69
70PabloAST * PabloBlock::createOr(PabloAST * expr1, PabloAST * expr2) {
71    if (expr1 < expr2) {
72        std::swap(expr1, expr2);
73    }
74    return mBinary.findOrCall<OptimizeOr>(PabloAST::ClassTypeId::Or, expr1, expr2);
75}
76
77PabloAST * PabloBlock::createXor(PabloAST * expr1, PabloAST * expr2) {
78    if (expr1 < expr2) {
79        std::swap(expr1, expr2);
80    }
81    return mBinary.findOrCall<OptimizeXor>(PabloAST::ClassTypeId::Xor, expr1, expr2);
82}
83
84/// TERNARY CREATE FUNCTION
85
86PabloAST *PabloBlock::createSel(PabloAST * condition, PabloAST * trueExpr, PabloAST * falseExpr) {
87    return mTernary.findOrCall<OptimizeSel>(PabloAST::ClassTypeId::Sel, condition, trueExpr, falseExpr);
88}
89
90}
Note: See TracBrowser for help on using the repository browser.