From db10de1a6a0da0ddfb0114862219bf5961508f8a Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Fri, 9 May 2008 09:16:11 -0700 Subject: [PATCH] Fix calculation of XOR when z is present When calculating 0^z with constant arguments, make sure the result is x. This problem only happens when the arguments are constants and the expression is calculated at compile time. --- verinum.cc | 4 ++-- verinum.h | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/verinum.cc b/verinum.cc index 11d561c1a..cb66ace0c 100644 --- a/verinum.cc +++ b/verinum.cc @@ -1238,9 +1238,9 @@ verinum::V operator & (verinum::V l, verinum::V r) verinum::V operator ^ (verinum::V l, verinum::V r) { if (l == verinum::V0) - return r; + return bit4_z2x(r); if (r == verinum::V0) - return l; + return bit4_z2x(l); if ((l == verinum::V1) && (r == verinum::V1)) return verinum::V0; diff --git a/verinum.h b/verinum.h index 29477f7d2..b184c3c8c 100644 --- a/verinum.h +++ b/verinum.h @@ -130,6 +130,9 @@ extern verinum trim_vnum(const verinum&); extern ostream& operator<< (ostream&, const verinum&); extern ostream& operator<< (ostream&, verinum::V); +inline verinum::V bit4_z2x(verinum::V bit) +{ return bit<2? bit : verinum::Vx; /* Relies on V0 and V1 being <2 */} + extern verinum::V operator ~ (verinum::V l); extern verinum::V operator | (verinum::V l, verinum::V r); extern verinum::V operator & (verinum::V l, verinum::V r);