Changeset 4873
- Timestamp:
- Nov 16, 2015, 10:01:04 PM (3 years ago)
- Location:
- icGREP/icgrep-devel/icgrep/pablo
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
icGREP/icgrep-devel/icgrep/pablo/codegenstate.cpp
r4870 r4873 242 242 } 243 243 } else if (Or * or1 = dyn_cast<Or>(expr1)) { 244 if (equals(or1->get Expr1(), expr2) || equals(or1->getExpr2(), expr2)) {244 if (equals(or1->getOperand(0), expr2) || equals(or1->getOperand(1), expr2)) { 245 245 return expr2; 246 246 } 247 247 } else if (Or * or2 = dyn_cast<Or>(expr2)) { 248 if (equals(or2->get Expr1(), expr1) || equals(or2->getExpr2(), expr1)) {248 if (equals(or2->getOperand(0), expr1) || equals(or2->getOperand(1), expr1)) { 249 249 return expr1; 250 250 } … … 275 275 } 276 276 } else if (Or * or1 = dyn_cast<Or>(expr1)) { 277 if (equals(or1->get Expr1(), expr2) || equals(or1->getExpr2(), expr2)) {277 if (equals(or1->getOperand(0), expr2) || equals(or1->getOperand(1), expr2)) { 278 278 return expr2; 279 279 } 280 280 } else if (Or * or2 = dyn_cast<Or>(expr2)) { 281 if (equals(or2->get Expr1(), expr1) || equals(or2->getExpr2(), expr1)) {281 if (equals(or2->getOperand(0), expr1) || equals(or2->getOperand(1), expr1)) { 282 282 return expr1; 283 283 } … … 306 306 } else if (And * and1 = dyn_cast<And>(expr1)) { 307 307 if (And * and2 = dyn_cast<And>(expr2)) { 308 PabloAST * const expr1a = and1->get Expr1();309 PabloAST * const expr1b = and1->get Expr2();310 PabloAST * const expr2a = and2->get Expr1();311 PabloAST * const expr2b = and2->get Expr2();308 PabloAST * const expr1a = and1->getOperand(0); 309 PabloAST * const expr1b = and1->getOperand(1); 310 PabloAST * const expr2a = and2->getOperand(0); 311 PabloAST * const expr2b = and2->getOperand(1); 312 312 //These optimizations factor out common components that can occur when sets are formed by union 313 313 //(e.g., union of [a-z] and [A-Z]. … … 321 321 return createAnd(expr1b, createOr(expr1a, expr2b)); 322 322 } 323 } else if (equals(and1->get Expr1(), expr2) || equals(and1->getExpr2(), expr2)){323 } else if (equals(and1->getOperand(0), expr2) || equals(and1->getOperand(1), expr2)){ 324 324 // (aâ§b) âš a = a 325 325 return expr2; 326 326 } 327 327 } else if (And * and2 = dyn_cast<And>(expr2)) { 328 if (equals(and2->get Expr1(), expr1) || equals(and2->getExpr2(), expr1)) {328 if (equals(and2->getOperand(0), expr1) || equals(and2->getOperand(1), expr1)) { 329 329 return expr1; 330 330 } … … 351 351 } else if (And * and1 = dyn_cast<And>(expr1)) { 352 352 if (And * and2 = dyn_cast<And>(expr2)) { 353 PabloAST * const expr1a = and1->get Expr1();354 PabloAST * const expr1b = and1->get Expr2();355 PabloAST * const expr2a = and2->get Expr1();356 PabloAST * const expr2b = and2->get Expr2();353 PabloAST * const expr1a = and1->getOperand(0); 354 PabloAST * const expr1b = and1->getOperand(1); 355 PabloAST * const expr2a = and2->getOperand(0); 356 PabloAST * const expr2b = and2->getOperand(1); 357 357 //These optimizations factor out common components that can occur when sets are formed by union 358 358 //(e.g., union of [a-z] and [A-Z]. … … 366 366 return createAnd(expr1b, createOr(expr1a, expr2b), prefix); 367 367 } 368 } else if (equals(and1->get Expr1(), expr2) || equals(and1->getExpr2(), expr2)) {368 } else if (equals(and1->getOperand(0), expr2) || equals(and1->getOperand(1), expr2)) { 369 369 // (aâ§b) âš a = a 370 370 return expr2; 371 371 } 372 372 } else if (And * and2 = dyn_cast<And>(expr2)) { 373 if (equals(and2->get Expr1(), expr1) || equals(and2->getExpr2(), expr1)) {373 if (equals(and2->getOperand(0), expr1) || equals(and2->getOperand(1), expr1)) { 374 374 return expr1; 375 375 } -
icGREP/icgrep-devel/icgrep/pablo/pabloAST.cpp
r4871 r4873 43 43 } else if (const And* and1 = dyn_cast<const And>(expr1)) { 44 44 if (const And* and2 = cast<const And>(expr2)) { 45 if (equals(and1->get Expr1(), and2->getExpr1())) {46 return equals(and1->get Expr2(), and2->getExpr2());47 } else if (equals(and1->get Expr1(), and2->getExpr2())) {48 return equals(and1->get Expr2(), and2->getExpr1());45 if (equals(and1->getOperand(0), and2->getOperand(0))) { 46 return equals(and1->getOperand(1), and2->getOperand(1)); 47 } else if (equals(and1->getOperand(0), and2->getOperand(1))) { 48 return equals(and1->getOperand(1), and2->getOperand(0)); 49 49 } 50 50 } 51 51 } else if (const Or * or1 = dyn_cast<const Or>(expr1)) { 52 52 if (const Or* or2 = cast<const Or>(expr2)) { 53 if (equals(or1->get Expr1(), or2->getExpr1())) {54 return equals(or1->get Expr2(), or2->getExpr2());55 } else if (equals(or1->get Expr1(), or2->getExpr2())) {56 return equals(or1->get Expr2(), or2->getExpr1());53 if (equals(or1->getOperand(0), or2->getOperand(0))) { 54 return equals(or1->getOperand(1), or2->getOperand(1)); 55 } else if (equals(or1->getOperand(0), or2->getOperand(1))) { 56 return equals(or1->getOperand(1), or2->getOperand(0)); 57 57 } 58 58 } 59 59 } else if (const Xor * xor1 = dyn_cast<const Xor>(expr1)) { 60 60 if (const Xor * xor2 = cast<const Xor>(expr2)) { 61 if (equals(xor1->get Expr1(), xor2->getExpr1())) {62 return equals(xor1->get Expr2(), xor2->getExpr2());63 } else if (equals(xor1->get Expr1(), xor2->getExpr2())) {64 return equals(xor1->get Expr2(), xor2->getExpr1());61 if (equals(xor1->getOperand(0), xor2->getOperand(0))) { 62 return equals(xor1->getOperand(1), xor2->getOperand(1)); 63 } else if (equals(xor1->getOperand(0), xor2->getOperand(1))) { 64 return equals(xor1->getOperand(1), xor2->getOperand(0)); 65 65 } 66 66 } … … 374 374 375 375 /** ------------------------------------------------------------------------------------------------------------- * 376 * @brief addOperand 377 ** ------------------------------------------------------------------------------------------------------------- */ 378 void Variadic::addOperand(PabloAST * expr) { 379 unsigned index = 0; 380 for (; index != mOperands; ++index) { 381 if (mOperand[index] > expr) { 382 break; 383 } 384 } 385 if (mOperands == mCapacity) { 386 mCapacity = std::max<unsigned>(mCapacity * 2, 2); 387 PabloAST ** expandedArray = reinterpret_cast<PabloAST**>(mAllocator.allocate(mOperands * sizeof(PabloAST *))); 388 std::memcpy(expandedArray, mOperand, mOperands * sizeof(PabloAST *)); 389 mAllocator.deallocate(reinterpret_cast<Allocator::pointer>(mOperand)); 390 mOperand = expandedArray; 391 } 392 std::memcpy(mOperand + index + 1, mOperand + index, (mOperands - index) * sizeof(PabloAST *)); 393 mOperand[index] = expr; 394 ++mOperands; 395 } 396 397 /** ------------------------------------------------------------------------------------------------------------- * 398 * @brief removeOperand 399 ** ------------------------------------------------------------------------------------------------------------- */ 400 void Variadic::removeOperand(const unsigned index) { 401 assert (index < getNumOperands()); 402 std::memcpy(mOperand + index, mOperand + index + 1, (mOperands - index - 1) * sizeof(PabloAST *)); 403 --mOperands; 404 } 405 406 /** ------------------------------------------------------------------------------------------------------------- * 376 407 * @brief contains 377 408 ** ------------------------------------------------------------------------------------------------------------- */ -
icGREP/icgrep-devel/icgrep/pablo/pabloAST.h
r4871 r4873 249 249 void checkEscapedValueList(Statement * branch, PabloAST * const from, PabloAST * const to, ValueList & list); 250 250 protected: 251 const String * mName; 252 Statement * mNext; 253 Statement * mPrev; 254 PabloBlock * mParent; 255 const unsigned mOperands; 256 // If we knew prior to construction how many operands were needed, we could 257 // eliminate the mOperand pointer and simply use this[1] instead. 258 PabloAST ** mOperand; 251 const String * mName; 252 Statement * mNext; 253 Statement * mPrev; 254 PabloBlock * mParent; 255 unsigned mOperands; 256 PabloAST ** mOperand; 257 }; 258 259 class Variadic : public Statement { 260 public: 261 void addOperand(PabloAST * expr); 262 void removeOperand(const unsigned index); 263 protected: 264 Variadic(const ClassTypeId id, std::initializer_list<PabloAST *> operands, const String * const name) 265 : Statement(id, operands, name) 266 , mCapacity(operands.size()) { 267 268 } 269 private: 270 unsigned mCapacity; 259 271 }; 260 272 -
icGREP/icgrep-devel/icgrep/pablo/pablo_compiler.cpp
r4870 r4873 391 391 } 392 392 else if (const And * pablo_and = dyn_cast<And>(stmt)) { 393 expr = iBuilder.simd_and(compileExpression(pablo_and->get Expr1()), compileExpression(pablo_and->getExpr2()));393 expr = iBuilder.simd_and(compileExpression(pablo_and->getOperand(0)), compileExpression(pablo_and->getOperand(1))); 394 394 } 395 395 else if (const Or * pablo_or = dyn_cast<Or>(stmt)) { 396 expr = iBuilder.simd_or(compileExpression(pablo_or->get Expr1()), compileExpression(pablo_or->getExpr2()));396 expr = iBuilder.simd_or(compileExpression(pablo_or->getOperand(0)), compileExpression(pablo_or->getOperand(1))); 397 397 } 398 398 else if (const Xor * pablo_xor = dyn_cast<Xor>(stmt)) { 399 expr = iBuilder.simd_xor(compileExpression(pablo_xor->get Expr1()), compileExpression(pablo_xor->getExpr2()));399 expr = iBuilder.simd_xor(compileExpression(pablo_xor->getOperand(0)), compileExpression(pablo_xor->getOperand(1))); 400 400 } 401 401 else if (const Sel * sel = dyn_cast<Sel>(stmt)) { -
icGREP/icgrep-devel/icgrep/pablo/pe_and.h
r4797 r4873 12 12 namespace pablo { 13 13 14 class And : public Statement{14 class And : public Variadic { 15 15 friend class PabloBlock; 16 16 public: … … 21 21 return false; 22 22 } 23 virtual ~And() { 24 } 25 PabloAST * getExpr1() const { 26 return getOperand(0); 27 } 28 PabloAST * getExpr2() const { 29 return getOperand(1); 30 } 23 virtual ~And() { } 31 24 protected: 32 25 And(PabloAST * expr1, PabloAST * expr2, String * name) 33 : Statement(ClassTypeId::And, {expr1, expr2}, name)26 : Variadic(ClassTypeId::And, {expr1, expr2}, name) 34 27 { 35 assert (getNumOperands() == 2); 28 36 29 } 37 30 }; -
icGREP/icgrep-devel/icgrep/pablo/pe_or.h
r4797 r4873 12 12 namespace pablo { 13 13 14 class Or : public Statement{14 class Or : public Variadic { 15 15 friend class PabloBlock; 16 16 public: … … 21 21 return false; 22 22 } 23 virtual ~Or() { 24 } 25 PabloAST * getExpr1() const { 26 return mOperand[0]; 27 } 28 PabloAST * getExpr2() const { 29 return mOperand[1]; 30 } 23 virtual ~Or() { } 31 24 protected: 32 25 Or(PabloAST * expr1, PabloAST * expr2, String * name) 33 : Statement(ClassTypeId::Or, {expr1, expr2}, name)26 : Variadic(ClassTypeId::Or, {expr1, expr2}, name) 34 27 { 35 assert (getNumOperands() == 2); 28 36 29 } 37 30 }; -
icGREP/icgrep-devel/icgrep/pablo/pe_xor.h
r4797 r4873 9 9 10 10 #include <pablo/pabloAST.h> 11 #include <array>12 11 13 12 namespace pablo { 14 13 15 class Xor : public Statement{14 class Xor : public Variadic { 16 15 friend class PabloBlock; 17 16 public: … … 22 21 return false; 23 22 } 24 virtual ~Xor() { 25 } 26 PabloAST * getExpr1() const { 27 return getOperand(0); 28 } 29 PabloAST * getExpr2() const { 30 return getOperand(1); 31 } 23 virtual ~Xor() { } 32 24 protected: 33 25 Xor(PabloAST * expr1, PabloAST * expr2, String * name) 34 : Statement(ClassTypeId::Xor, {expr1, expr2}, name)26 : Variadic(ClassTypeId::Xor, {expr1, expr2}, name) 35 27 { 36 assert (getNumOperands() == 2); 28 37 29 } 38 30 }; -
icGREP/icgrep-devel/icgrep/pablo/printer_pablos.cpp
r4870 r4873 56 56 } else if (const And * pablo_and = dyn_cast<const And>(stmt)) { 57 57 out << pablo_and->getName() << " = ("; 58 print(pablo_and->getExpr1(), out); 59 out << " & "; 60 print(pablo_and->getExpr2(), out); 58 for (unsigned i = 0; i != pablo_and->getNumOperands(); ++i) { 59 if (i) out << " & "; 60 print(pablo_and->getOperand(i), out); 61 } 61 62 out << ")"; 62 63 } else if (const Or * pablo_or = dyn_cast<const Or>(stmt)) { 63 64 out << pablo_or->getName() << " = ("; 64 print(pablo_or->getExpr1(), out); 65 out << " | "; 66 print(pablo_or->getExpr2(), out); 65 for (unsigned i = 0; i != pablo_or->getNumOperands(); ++i) { 66 if (i) out << " | "; 67 print(pablo_or->getOperand(i), out); 68 } 67 69 out << ")"; 68 70 } else if (const Xor * pablo_xor = dyn_cast<const Xor>(stmt)) { 69 71 out << pablo_xor->getName() << " = ("; 70 print(pablo_xor->getExpr1(), out); 71 out << " ^ "; 72 print(pablo_xor->getExpr2(), out); 72 for (unsigned i = 0; i != pablo_xor->getNumOperands(); ++i) { 73 if (i) out << " ^ "; 74 print(pablo_xor->getOperand(i), out); 75 } 73 76 out << ")"; 74 77 } else if (const Sel * pablo_sel = dyn_cast<const Sel>(stmt)) {
Note: See TracChangeset
for help on using the changeset viewer.