From 7a7f6f69369a858f9022e44e7f1a8a30bff56c3e Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 26 Aug 2018 21:00:06 +0200 Subject: Remove branch from gray_code_inv --- chilbert/detail/MultiBitVec.hpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'chilbert') diff --git a/chilbert/detail/MultiBitVec.hpp b/chilbert/detail/MultiBitVec.hpp index 283601f..a184287 100644 --- a/chilbert/detail/MultiBitVec.hpp +++ b/chilbert/detail/MultiBitVec.hpp @@ -24,6 +24,7 @@ #include "chilbert/detail/BitVecMask.hpp" #include "chilbert/detail/operations.hpp" +#include #include #include #include @@ -366,15 +367,16 @@ template void gray_code_inv(MultiBitVec& value) { - typename MultiBitVec::Rack s = 0; + using Rack = typename MultiBitVec::Rack; + + constexpr std::array masks{Rack{0}, ~Rack{0}}; + bool s = 0; for (size_t ri = 0; ri < value.num_racks(); ++ri) { const size_t i = value.num_racks() - ri - 1; auto& rack = value.rack(i); gray_code_inv(rack); - if (s) { - rack = ~rack; - } + rack ^= masks[s]; s = rack & 1; } } -- cgit v1.2.1