C++ Mathematical Expression Toolkit (ExprTk) release
Loading...
Searching...
No Matches
exprtk::details::vec_add_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_add_op< T >

Definition at line 16653 of file exprtk.hpp.

Member Typedef Documentation

◆ ivector_ptr

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

Definition at line 16655 of file exprtk.hpp.

Member Function Documentation

◆ process()

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

Definition at line 16657 of file exprtk.hpp.

16658 {
16659 const T* vec = v->vec()->vds().data();
16660 const std::size_t vec_size = v->size();
16661
16663
16664 if (vec_size <= static_cast<std::size_t>(lud.batch_size))
16665 {
16666 T result = T(0);
16667 int i = 0;
16668
16669 switch (vec_size)
16670 {
16671 #define case_stmt(N,fall_through) \
16672 case N : result += vec[i++]; \
16673 fall_through \
16674
16675 #ifndef exprtk_disable_superscalar_unroll
16682
16683 #endif
16685 case_stmt( 2, exprtk_fallthrough) case_stmt( 1, (void)0;)
16686 }
16687
16688 #undef case_stmt
16689
16690 return result;
16691 }
16692
16693 T r[] = {
16694 T(0), T(0), T(0), T(0), T(0), T(0), T(0), T(0),
16695 T(0), T(0), T(0), T(0), T(0), T(0), T(0), T(0)
16696 };
16697
16698 const T* upper_bound = vec + lud.upper_bound;
16699
16700 while (vec < upper_bound)
16701 {
16702 #define exprtk_loop(N) \
16703 r[N] += vec[N]; \
16704
16705 exprtk_loop( 0) exprtk_loop( 1)
16706 exprtk_loop( 2) exprtk_loop( 3)
16707 #ifndef exprtk_disable_superscalar_unroll
16708 exprtk_loop( 4) exprtk_loop( 5)
16709 exprtk_loop( 6) exprtk_loop( 7)
16710 exprtk_loop( 8) exprtk_loop( 9)
16711 exprtk_loop(10) exprtk_loop(11)
16712 exprtk_loop(12) exprtk_loop(13)
16713 exprtk_loop(14) exprtk_loop(15)
16714 #endif
16715
16716 vec += lud.batch_size;
16717 }
16718
16719 int i = 0;
16720
16721 switch (lud.remainder)
16722 {
16723 #define case_stmt(N,fall_through) \
16724 case N : r[0] += vec[i++]; \
16725 fall_through \
16726
16727 #ifndef exprtk_disable_superscalar_unroll
16734 #endif
16736 case_stmt( 1, (void)0;)
16737 }
16738
16739 #undef exprtk_loop
16740 #undef case_stmt
16741
16742 return (r[ 0] + r[ 1] + r[ 2] + r[ 3])
16743 #ifndef exprtk_disable_superscalar_unroll
16744 + (r[ 4] + r[ 5] + r[ 6] + r[ 7])
16745 + (r[ 8] + r[ 9] + r[10] + r[11])
16746 + (r[12] + r[13] + r[14] + r[15])
16747 #endif
16748 ;
16749 }
#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_interface< T >::size(), exprtk::details::loop_unroll::details::upper_bound, exprtk::details::vector_node< T >::vds(), and exprtk::details::vector_interface< T >::vec().

Referenced by exprtk::details::vec_avg_op< T >::process().

Here is the call graph for this function:
Here is the caller graph for this function:

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