Commit 84b16aa6 authored by Alexandre Duret-Lutz's avatar Alexandre Duret-Lutz
Browse files

[buddy] consolidate shortcuts for binary operation

* src/bddop.c (apply_rec, appquant_rec): Define missing shortcuts
for bddop_less, bddop_diff, bddop_revimpl and define them once.
parent 75c33def
......@@ -569,105 +569,114 @@ static BDD apply_rec(BDD l, BDD r)
BddCacheData *entry;
BDD res;
switch (applyop)
{
case bddop_and:
if (l == r)
return l;
/* The operation is commutative, so lets
order the arguments to favor cache hits. */
if (l > r)
{
BDD tmp = l;
l = r;
r = tmp;
}
if (ISZERO(l) /* || ISZERO(r) */)
return 0;
if (ISONE(l))
return r;
/* if (ISONE(r))
return l; */
break;
case bddop_or:
if (l == r)
return l;
/* The operation is commutative, so lets
order the arguments to favor cache hits. */
if (l > r)
{
BDD tmp = l;
l = r;
r = tmp;
}
if (ISONE(l) || ISONE(r))
return 1;
if (ISZERO(l))
return r;
/* if (ISZERO(r))
return l; */
break;
case bddop_xor:
if (l == r)
return 0;
/* The operation is commutative, so lets
order the arguments to favor cache hits. */
if (l > r)
{
BDD tmp = l;
l = r;
r = tmp;
}
if (ISZERO(l))
return r;
/* if (ISZERO(r))
return l; */
break;
case bddop_nand:
/* The operation is commutative, so lets
order the arguments to favor cache hits. */
if (l > r)
{
BDD tmp = l;
l = r;
r = tmp;
}
if (ISZERO(l) /* || ISZERO(r) */)
return 1;
break;
case bddop_nor:
/* The operation is commutative, so lets
order the arguments to favor cache hits. */
if (l > r)
{
BDD tmp = l;
l = r;
r = tmp;
}
if (ISONE(l) || ISONE(r))
return 0;
break;
case bddop_imp:
if (ISZERO(l))
return 1;
if (ISONE(l))
return r;
if (ISONE(r))
return 1;
break;
case bddop_biimp:
/* The operation is commutative, so lets
order the arguments to favor cache hits. */
if (l > r)
{
BDD tmp = l;
l = r;
r = tmp;
}
break;
}
#define APPLY_SHORTCUTS(op, rec) \
switch (op) \
{ \
case bddop_and: \
if (l == r) \
return rec(l); \
if (l > r) \
{ \
BDD tmp = l; \
l = r; \
r = tmp; \
} \
if (ISZERO(l) /* || ISZERO(r) */) \
return 0; \
if (ISONE(l)) \
return rec(r); \
break; \
case bddop_or: \
if (l == r) \
return rec(l); \
if (l > r) \
{ \
BDD tmp = l; \
l = r; \
r = tmp; \
} \
if (ISONE(l) || ISONE(r)) \
return 1; \
if (ISZERO(l)) \
return rec(r); \
break; \
case bddop_xor: \
if (l == r) \
return 0; \
if (l > r) \
{ \
BDD tmp = l; \
l = r; \
r = tmp; \
} \
if (ISZERO(l)) \
return rec(r); \
break; \
case bddop_nand: \
if (l > r) \
{ \
BDD tmp = l; \
l = r; \
r = tmp; \
} \
if (ISZERO(l)) \
return 1; \
break; \
case bddop_nor: \
if (l > r) \
{ \
BDD tmp = l; \
l = r; \
r = tmp; \
} \
if (ISONE(l) || ISONE(r)) \
return 0; \
break; \
case bddop_invimp: /* l << r = r >> l */ \
{ \
BDD tmp = l; \
l = r; \
r = tmp; \
op = bddop_imp; \
} \
/* fall through */ \
case bddop_imp: \
if (ISONE(r) || ISZERO(l)) \
return 1; \
if (ISONE(l)) \
return rec(r); \
break; \
case bddop_biimp: \
if (l == r) \
return 1; \
if (l > r) \
{ \
BDD tmp = l; \
l = r; \
r = tmp; \
} \
if (ISCONST(l)) \
return 0; \
break; \
case bddop_less: /* l < r = r - l */ \
{ \
BDD tmp = l; \
l = r; \
r = tmp; \
op = bddop_diff; \
} \
/* fall through */ \
case bddop_diff: /* l - r = l &! r */ \
if (l == r || ISONE(r)) \
return 0; \
if (ISZERO(r)) \
return rec(l); \
break; \
}
if (ISCONST(l) && ISCONST(r))
APPLY_SHORTCUTS(applyop, /* id */);
if (__unlikely(ISCONST(l) && ISCONST(r)))
res = oprres[applyop][l<<1 | r];
else
{
......@@ -2204,95 +2213,7 @@ static int appquant_rec(int l, int r)
BddCacheData *entry;
int res;
switch (appexop)
{
case bddop_and:
/* The operation is commutative, so lets
order the arguments to favor cache hits. */
if (l > r)
{
BDD tmp = l;
l = r;
r = tmp;
}
if (l == 0 /* || r == 0 */)
return 0;
if (l == r)
return quant_rec(l);
if (l == 1)
return quant_rec(r);
/* if (r == 1)
return quant_rec(l); */
break;
case bddop_or:
if (l == 1 || r == 1)
return 1;
if (l == r)
return quant_rec(l);
/* The operation is commutative, so lets
order the arguments to favor cache hits. */
if (l > r)
{
BDD tmp = l;
l = r;
r = tmp;
}
if (l == 0)
return quant_rec(r);
/* if (r == 0)
return quant_rec(l); */
break;
case bddop_xor:
if (l == r)
return 0;
/* The operation is commutative, so lets
order the arguments to favor cache hits. */
if (l > r)
{
BDD tmp = l;
l = r;
r = tmp;
}
if (l == 0)
return quant_rec(r);
/* if (r == 0)
return quant_rec(l); */
break;
case bddop_nand:
/* The operation is commutative, so lets
order the arguments to favor cache hits. */
if (l > r)
{
BDD tmp = l;
l = r;
r = tmp;
}
if (l == 0 /* || r == 0 */)
return 1;
break;
case bddop_nor:
if (l == 1 || r == 1)
return 0;
/* The operation is commutative, so lets
order the arguments to favor cache hits. */
if (l > r)
{
BDD tmp = l;
l = r;
r = tmp;
}
break;
case bddop_biimp:
/* The operation is commutative, so lets
order the arguments to favor cache hits. */
if (l > r)
{
BDD tmp = l;
l = r;
r = tmp;
}
break;
}
APPLY_SHORTCUTS(appexop, quant_rec);
if (ISCONST(l) && ISCONST(r))
res = oprres[appexop][(l<<1) | r];
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment