E.V.E
v2023.02.15

◆ if_else

eve::if_else = {}
inlineconstexpr

Computes the results of a choice under condition.

Defined in Header

#include <eve/module/core.hpp>

Callable Signatures

namespace eve
{
template< eve::value T, eve::value U, eve::value V >
auto if_else(T x, U, y, V z ) noexcept;
}
constexpr callable_if_else_ if_else
Computes the results of a choice under condition.
Definition: if_else.hpp:67
Definition: abi.hpp:18

Parameters

Return value

The call if_else(x, y, z) performs elementwise a choice between the elements of y and z according to the truth value of the elements of x.

Possible optimizations

The following calls where x, y and z are values can be optimized:

  • if_else(x, y, allbits< T >()) writing: if_else(x, y, eve::allbits_)
  • if_else(x, y, one< T >() ) writing: if_else(x, y, eve::one_ )
  • if_else(x, y, mone< T >() ) writing: if_else(x, y, eve::mone_ )
  • if_else(x, y, zero< T >() ) writing: if_else(x, y, eve::zero_ )
  • if_else(x, allbits< T >(), z) writing: if_else(x, eve::allbits_, z)
  • if_else(x, one< T >(), z ) writing: if_else(x, eve::one_, z )
  • if_else(x, mone< T >(), z ) writing: if_else(x, eve::mone_, z )
  • if_else(x, zero< T >(), z ) writing: if_else(x, eve::zero_, z )

Example

#include <eve/module/core.hpp>
#include <eve/wide.hpp>
#include <iostream>
using iT = std::int32_t;
using wide_it = eve::wide<iT, eve::fixed<4>>;
using wide_lt = eve::as_logical_t<wide_it>;
int main()
{
wide_it pi = {3, -2, -10, 0};
wide_it qi = {4, -1, 0, 5};
wide_it si = {2, -3, 0, 4};
wide_lt lsi = {true, false, false, true};
std::cout << "---- simd" << '\n'
<< " <- si = " << si << '\n'
<< " <- lsi = " << lsi << '\n'
<< " <- pi = " << pi << '\n'
<< " <- qi = " << qi << '\n'
<< " -> eve::if_else(si, pi, qi) = " << eve::if_else(si, pi, qi) << '\n'
<< " -> eve::if_else(lsi, pi, qi) = " << eve::if_else(lsi, pi, qi) << '\n';
iT ssi = 3, xi = 3, yi = 4;
eve::logical<iT> lssi = false;
std::cout << "---- scalar" << '\n'
<< " ssi = = " << ssi << '\n'
<< " lssi = = " << lssi << '\n'
<< " xi = = " << xi << '\n'
<< " yi = = " << yi << '\n'
<< " -> eve::if_else(ssi, xi, yi) = " << eve::if_else(ssi, xi, yi) << '\n'
<< " -> eve::if_else(lssi, xi, yi) = " << eve::if_else(lssi, xi, yi) << '\n';
return 0;
}
constexpr callable_pi_ pi
Callable object computing the constant .
Definition: pi.hpp:49
Wrapper for SIMD registers.
Definition: wide.hpp:65