message: Fix UB in right shift instructions with negative shift value
diff: @@ -409,6 +409,7 @@ inline void comparison_op(Stack<uint64_t>& stack, Op<T> op) noexcept
  template <typename T>
  inline T shift_left(T lhs, T rhs) noexcept
  {
  + static_assert(!std::numeric_limits<T>::is_signed);
  constexpr T num_bits{sizeof(T) * 8};
  const auto k = rhs % num_bits;
  return lhs << k;
  @@ -418,13 +419,14 @@ template <typename T>
  inline T shift_right(T lhs, T rhs) noexcept
  {
  constexpr T num_bits{sizeof(T) * 8};
  - const auto k = rhs % num_bits;
  + const auto k = rhs & (num_bits - 1);
  return lhs >> k;
  }
  template <typename T>
  inline T rotl(T lhs, T rhs) noexcept
  {
  + static_assert(!std::numeric_limits<T>::is_signed);
  constexpr T num_bits{sizeof(T) * 8};
  const auto k = rhs % num_bits;
  @@ -437,6 +439,7 @@ inline T rotl(T lhs, T rhs) noexcept
  template <typename T>
  inline T rotr(T lhs, T rhs) noexcept
  {
  + static_assert(!std::numeric_limits<T>::is_signed);
  constexpr T num_bits{sizeof(T) * 8};
  const auto k = rhs % num_bits;
  