}
}
+ if (k1 == BEEV::BVNEG && k2 == BEEV::BVUMINUS && in1[0] == in2[0])
+ return ASTFalse;
+
+ if (k1 == BEEV::BVUMINUS && k2 == BEEV::BVNEG && in1[0] == in2[0])
+ return ASTFalse;
//last resort is to CreateNode
return hashing.CreateNode(BEEV::EQ, children);
ASTNode constant = NonMemberBVConstEvaluator(&bm , BEEV::BVPLUS, ch, width);
result = NodeFactory::CreateTerm(BEEV::BVPLUS, width, constant, n1[1]);
}
+ else if (n1.GetKind() == BEEV::BVUMINUS && (n0.isConstant() && CONSTANTBV::BitVector_is_full(n0.GetBVConst())))
+ {
+ result = NodeFactory::CreateTerm(BEEV::BVNEG, width, n1[0]);
+ }
+
return result;
}
if (width == 1 && children[0] == children[1])
result = children[0];
+
+ if (children[0].GetKind() == BEEV::BVUMINUS && children[1].GetKind() == BEEV::BVUMINUS)
+ result = NodeFactory::CreateTerm(BEEV::BVMULT, width, children[0][0],children[1][0]);
}
}
break;
case BEEV::BVNEG:
if (children[0].GetKind() == BEEV::BVNEG)
- result = children[0][0];
+ result = children[0][0];
+ if (children[0].GetKind() == BEEV::BVPLUS && children[0].Degree() == 2 && children[0][0].GetKind() == BEEV::BVCONST
+ && children[0][0] == bm.CreateMaxConst(width))
+ result = NodeFactory::CreateTerm(BEEV::BVUMINUS, width, children[0][1]);
+ if (children[0].GetKind() == BEEV::BVUMINUS)
+ result = NodeFactory::CreateTerm(BEEV::BVPLUS, width, children[0][0], bm.CreateMaxConst(width));
+
break;
case BEEV::BVUMINUS:
result = children[0][0];
else if (width == 1)
result = children[0];
-
+ else if (children[0].GetKind() == BEEV::BVPLUS && children[0].Degree() == 2 && children[0][0].GetKind() == BEEV::BVCONST && children[0][0] == bm.CreateOneConst(width))
+ result = NodeFactory::CreateTerm(BEEV::BVNEG, width, children[0][1]);
+ else if (children[0].GetKind() == BEEV::BVNEG)
+ result = NodeFactory::CreateTerm(BEEV::BVPLUS, width, children[0][0], bm.CreateOneConst(width));
break;
case BEEV::BVEXTRACT:
case BEEV::BVDIV:
if (children[1].isConstant() && children[1] == bm.CreateOneConst(width))
result = children[0];
+ else if (children[1].isConstant() && children[1] == bm.CreateZeroConst(width) && bm.UserFlags.division_by_zero_returns_one_flag)
+ result = bm.CreateOneConst(width);
+ else if (bm.UserFlags.division_by_zero_returns_one_flag && children[0] == children[1])
+ result = bm.CreateOneConst(width);
+
break;
case BEEV::SBVDIV:
result = children[0];
else if (children[1].isConstant() && bm.CreateOneConst(width) == children[1])
result = bm.CreateZeroConst(width);
+ else if (children[1].GetKind() == BEEV::BVUMINUS)
+ result = NodeFactory::CreateTerm(BEEV::SBVREM, width, children[0], children[1][0]);
+ else if (children[0].GetKind() == BEEV::BVUMINUS && children[0][0] == children[1])
+ result = bm.CreateZeroConst(width);
else
result = BEEV::ArrayTransformer::TranslateSignedDivModRem(hashing.CreateTerm(kind, width, children),this,&bm);
break;