C++ Mathematical Expression Toolkit (ExprTk) release
Loading...
Searching...
No Matches
exprtk::details::vec_mul_op< T > Struct Template Reference

#include <exprtk.hpp>

Public Types

typedef vector_interface< T > * ivector_ptr

Static Public Member Functions

static T process (const ivector_ptr v)

Detailed Description

template<typename T>
struct exprtk::details::vec_mul_op< T >

Definition at line 16753 of file exprtk.hpp.

Member Typedef Documentation

◆ ivector_ptr

template<typename T>
typedef vector_interface<T>* exprtk::details::vec_mul_op< T >::ivector_ptr

Definition at line 16755 of file exprtk.hpp.

Member Function Documentation

◆ process()

template<typename T>
T exprtk::details::vec_mul_op< T >::process ( const ivector_ptr v)
inlinestatic

Definition at line 16757 of file exprtk.hpp.

16758 {
16759 const T* vec = v->vec()->vds().data();
16760 const std::size_t vec_size = v->vec()->size();
16761
16763
16764 if (vec_size <= static_cast<std::size_t>(lud.batch_size))
16765 {
16766 T result = T(1);
16767 int i = 0;
16768
16769 switch (vec_size)
16770 {
16771 #define case_stmt(N,fall_through) \
16772 case N : result *= vec[i++]; \
16773 fall_through \
16774
16775 #ifndef exprtk_disable_superscalar_unroll
16782 #endif
16784 case_stmt( 2, exprtk_fallthrough) case_stmt( 1, (void)0;)
16785 }
16786
16787 #undef case_stmt
16788
16789 return result;
16790 }
16791
16792 T r[] = {
16793 T(1), T(1), T(1), T(1), T(1), T(1), T(1), T(1),
16794 T(1), T(1), T(1), T(1), T(1), T(1), T(1), T(1)
16795 };
16796
16797 const T* upper_bound = vec + lud.upper_bound;
16798
16799 while (vec < upper_bound)
16800 {
16801 #define exprtk_loop(N) \
16802 r[N] *= vec[N]; \
16803
16804 exprtk_loop( 0) exprtk_loop( 1)
16805 exprtk_loop( 2) exprtk_loop( 3)
16806 #ifndef exprtk_disable_superscalar_unroll
16807 exprtk_loop( 4) exprtk_loop( 5)
16808 exprtk_loop( 6) exprtk_loop( 7)
16809 exprtk_loop( 8) exprtk_loop( 9)
16810 exprtk_loop(10) exprtk_loop(11)
16811 exprtk_loop(12) exprtk_loop(13)
16812 exprtk_loop(14) exprtk_loop(15)
16813 #endif
16814
16815 vec += lud.batch_size;
16816 }
16817
16818 int i = 0;
16819
16820 switch (lud.remainder)
16821 {
16822 #define case_stmt(N,fall_through) \
16823 case N : r[0] *= vec[i++]; \
16824 fall_through \
16825
16826 #ifndef exprtk_disable_superscalar_unroll
16833 #endif
16835 case_stmt( 1, (void)0;)
16836 }
16837
16838 #undef exprtk_loop
16839 #undef case_stmt
16840
16841 return (r[ 0] * r[ 1] * r[ 2] * r[ 3])
16842 #ifndef exprtk_disable_superscalar_unroll
16843 * (r[ 4] * r[ 5] * r[ 6] * r[ 7])
16844 * (r[ 8] * r[ 9] * r[10] * r[11])
16845 * (r[12] * r[13] * r[14] * r[15])
16846 #endif
16847 ;
16848 }
#define case_stmt(N)
Definition exprtk.hpp:33330
#define exprtk_loop(N)

References exprtk::details::loop_unroll::details::batch_size, case_stmt, exprtk::details::vec_data_store< T >::data(), exprtk_fallthrough, exprtk_loop, exprtk::details::nodetype_T0oT1< T, T0, T1 >::result, exprtk::details::loop_unroll::details::remainder, exprtk::details::vector_node< T >::size(), exprtk::details::loop_unroll::details::upper_bound, exprtk::details::vector_node< T >::vds(), and exprtk::details::vector_interface< T >::vec().

Here is the call graph for this function:

The documentation for this struct was generated from the following file: