CMSIS-DSP  
CMSIS DSP Software Library
 
Loading...
Searching...
No Matches
number.hpp File Reference
#include "fixed_point.hpp"
#include <type_traits>
#include "arm_math_types.h"
#include "arm_math_types_f16.h"
#include "num_features/complex_double.hpp"
#include "num_features/double.hpp"
#include "num_features/complex_float.hpp"
#include "num_features/float.hpp"
#include "num_features/complex_half.hpp"
#include "num_features/half.hpp"
#include "num_features/q31.hpp"
#include "num_features/complex_q31.hpp"
#include "num_features/q15.hpp"
#include "num_features/complex_q15.hpp"
#include "num_features/q7.hpp"
#include "num_features/complex_q7.hpp"
#include "DSP/num_features.hpp"
#include "Helium/num_features.hpp"
#include "num_features/group.hpp"

Data Structures

struct  vector_traits< T, arch, typename >
 Properties of a vector datatype linked to a scalar datatype. More...
 
struct  vctpq< T, typename >
 Predicate (only defined for vector architectures) More...
 
struct  number_traits< std::complex< double > >
 Features for complex double. More...
 
struct  vector_traits< std::complex< double >, arch, void >
 Default vector datatype description for this scalar datatype. More...
 
struct  number_traits< double >
 Features for double. More...
 
struct  vector_traits< double, arch, void >
 Default vector datatype description for this scalar datatype. More...
 
struct  number_traits< std::complex< float > >
 Features for complex float. More...
 
struct  vector_traits< std::complex< float >, arch, typename std::enable_if<!std::is_base_of< Helium, arch >::value &&!std::is_base_of< Neon, arch >::value >::type >
 Vector instructions for complex float when no Helium or Neon. More...
 
struct  number_traits< float >
 Features for float. More...
 
struct  vector_traits< float, arch, typename std::enable_if<!std::is_base_of< Helium, arch >::value &&!std::is_base_of< Neon, arch >::value >::type >
 Vector instructions for float when no Helium or Neon. More...
 
struct  number_traits< std::complex< float16_t > >
 Feature for complex float16. More...
 
struct  vector_traits< std::complex< float16_t >, arch, typename std::enable_if<!std::is_base_of< Helium, arch >::value &&!std::is_base_of< Neon, arch >::value >::type >
 float16 vector description when no vector architecture More...
 
struct  number_traits< float16_t >
 Feature of float16 datatype. More...
 
struct  vector_traits< float16_t >
 float16 vector description when no vector architecture More...
 
struct  number_traits< Q31 >
 Features for Q31. More...
 
struct  vector_traits< Q31, arch, typename std::enable_if<!std::is_base_of< Helium, arch >::value &&!std::is_base_of< Neon, arch >::value >::type >
 Vector features for Q31 when no vector instructions. More...
 
struct  number_traits< std::complex< Q31 > >
 Features for complex Q31. More...
 
struct  vector_traits< std::complex< Q31 >, arch, typename std::enable_if<!std::is_base_of< Helium, arch >::value &&!std::is_base_of< Neon, arch >::value >::type >
 Vector features for std::complex<Q31> when no vector instructions. More...
 
struct  number_traits< Q15 >
 Q15 features. More...
 
struct  vector_traits< Q15, arch, typename std::enable_if<!std::is_base_of< Helium, arch >::value &&!std::is_base_of< Neon, arch >::value &&!std::is_base_of< DSP, arch >::value >::type >
 Vector features for Q15 when no vector architecture. More...
 
struct  number_traits< std::complex< Q15 > >
 Features for complex Q15. More...
 
struct  vector_traits< std::complex< Q15 >, arch, typename std::enable_if<!std::is_base_of< Helium, arch >::value &&!std::is_base_of< Neon, arch >::value >::type >
 Vector features for Q15 when no vector architecture. More...
 
struct  number_traits< Q7 >
 Q7 features. More...
 
struct  vector_traits< Q7, arch, typename std::enable_if<!std::is_base_of< Helium, arch >::value &&!std::is_base_of< Neon, arch >::value &&!std::is_base_of< DSP, arch >::value >::type >
 Vector description when no vector architecture. More...
 
struct  number_traits< std::complex< Q7 > >
 Features for Complex Q7. More...
 
struct  vector_traits< std::complex< Q7 >, arch, void >
 Vector description when no vector architecture. More...
 
struct  Q15DSPVector
 Representation of a vector when DSP extension supported. More...
 
struct  vector_traits< Q15, DSP, typename std::enable_if< true >::type >
 Vector description for Q15 with DSP extensions. More...
 
struct  vector_traits< float, arch, typename std::enable_if< std::is_base_of< Helium, arch >::value >::type >
 Vector datatype for Helium. More...
 
struct  vctpq< float >
 vctpq for this datatype More...
 
struct  vload1_gen_stride< float32_t, 0, 1, 2, 3 >
 Load with generalized stride specialized for <0,1,2,3> More...
 
struct  vload1_gen_stride_z< float32_t, 0, 1, 2, 3 >
 Load with generalized stride (gather load) and tail predicate specialized for <0,1,2,3> More...
 
struct  vstore1_gen_stride< float32_t, 0, 1, 2, 3 >
 Generalized store with stride (Specialized for <0,1,2,3>) More...
 
struct  vstore1_gen_stride_z< float32_t, 0, 1, 2, 3 >
 Scatter store with tail predicate (specialized for <0,1,2,3>) More...
 
struct  vector_traits< std::complex< float >, arch, typename std::enable_if< std::is_base_of< Helium, arch >::value >::type >
 Vector datatype for Helium. More...
 
struct  vload1_gen_stride< std::complex< float >, 0, 1, 2, 3 >
 Load with generalized stride specialized for <0,1,2,3> More...
 
struct  vstore1_gen_stride< std::complex< float32_t >, 0, 1, 2, 3 >
 Generalized store with stride (Specialized for <0,1,2,3>) More...
 
struct  vector_traits< float16_t, arch, typename std::enable_if< std::is_base_of< Helium, arch >::value >::type >
 Vector features for f16 on Helium. More...
 
struct  vctpq< float16_t >
 vctpq for Helium and f16 More...
 
struct  vector_traits< std::complex< float16_t >, arch, typename std::enable_if< std::is_base_of< Helium, arch >::value >::type >
 Vector datatype for Helium. More...
 
struct  vload1_gen_stride< std::complex< float16_t >, 0, 1, 2, 3, 4, 5, 6, 7 >
 Load with generalized stride specialized for <0,1,2,3,4,5,6,7> More...
 
struct  vstore1_gen_stride< std::complex< float16_t >, 0, 1, 2, 3, 4, 5, 6, 7 >
 Generalized store with stride (Specialized for <0,1,2,3>) More...
 
struct  vector_traits< Q15, arch, typename std::enable_if< std::is_base_of< Helium, arch >::value >::type >
 Vector features for Q15 on Helium. More...
 
struct  number_traits< std::tuple< E... > >
 Number description for a tuple of numbers. More...
 
struct  vector_traits< std::tuple< E... >, arch >
 Tuple of compatible vectors. More...
 
struct  vctpq< std::tuple< E... > >
 Tuple of predicates. More...
 

Namespaces

namespace  arm_cmsis_dsp
 
namespace  arm_cmsis_dsp::inner
 

Functions

std::complex< double > from_accumulator (const std::complex< double > &a)
 Convert from accumulator representation.
 
std::complex< double > mac (const std::complex< double > &acc, const std::complex< double > &a, const std::complex< double > &b)
 Multiply and accumulate for this datatype.
 
void accumulate (std::complex< double > &a, const std::complex< double > &b)
 Accumulate.
 
std::complex< double > mult (const std::complex< double > &a, const std::complex< double > &b)
 Multiply.
 
double from_accumulator (const double a)
 Convert from accumulator representation.
 
double mac (const double acc, const double a, const double b)
 Multiply and accumulate for this datatype.
 
void accumulate (double &a, const double &b)
 Accumulate.
 
double mult (const double &a, const double &b)
 Multiply.
 
std::complex< float > from_accumulator (const std::complex< float > &a)
 Convert from accumulator representtaion.
 
std::complex< float > mac (const std::complex< float > &acc, const std::complex< float > &a, const std::complex< float > &b)
 Scalar multiply and accumulate.
 
void accumulate (std::complex< float > &a, const std::complex< float > &b)
 Scalar accumulate.
 
std::complex< float > mult (const std::complex< float > &a, const std::complex< float > &b)
 Scalar multiply.
 
float from_accumulator (const float a)
 Convert from accumulator representtaion.
 
float mac (const float acc, const float a, const float b)
 Scalar multiply and accumulate.
 
void accumulate (float &a, const float &b)
 Scalar accumulate.
 
float mult (const float &a, const float &b)
 Scalar multiply.
 
std::complex< float16_t > from_accumulator (const std::complex< float16_t > a)
 Convert from accumulator datatype.
 
std::complex< float16_t > mac (const std::complex< float16_t > acc, const std::complex< float16_t > a, const std::complex< float16_t > b)
 Multiply and accumulate.
 
void accumulate (std::complex< float16_t > &a, const std::complex< float16_t > &b)
 Accumulate.
 
std::complex< float16_t > mult (const std::complex< float16_t > &a, const std::complex< float16_t > &b)
 Multiply.
 
float16_t from_accumulator (const float16_t a)
 Convert from accumulator datatype.
 
float16_t mac (const float16_t acc, const float16_t a, const float16_t b)
 Multiply and accumulate.
 
void accumulate (float16_t &a, const float16_t &b)
 Accumulate.
 
float16_t mult (float16_t &a, const float16_t &b)
 Multiply.
 
Q31 from_accumulator (const Q< 15, 48 > a)
 Convert from accumulator (with no saturation)
 
Q< 15, 48 > mac (const Q< 15, 48 > acc, const Q31 a, const Q31 b)
 Multiply and accumulate.
 
std::complex< Q31from_accumulator (const std::complex< Q< 15, 48 > > a)
 Convert from accumulator (with no saturation)
 
std::complex< Q< 15, 48 > > mac (const std::complex< Q< 15, 48 > > acc, const std::complex< Q31 > a, const std::complex< Q31 > b)
 Multiply and accumulate.
 
Q15 from_accumulator (const Q< 33, 30 > a)
 Convert from accumulator type.
 
Q< 33, 30 > mac (const Q< 33, 30 > acc, const Q15 a, const Q15 b)
 Multiply and accumulate.
 
std::complex< Q15from_accumulator (const std::complex< Q< 33, 30 > > &a)
 Convert from accumulator type.
 
std::complex< Q< 33, 30 > > mac (const std::complex< Q< 33, 30 > > &acc, const std::complex< Q15 > a, const std::complex< Q15 > b)
 Multiply and accumulate.
 
Q7 from_accumulator (const Q< 17, 14 > a)
 Convert from accumulator with saturation.
 
Q< 17, 14 > mac (const Q< 17, 14 > acc, const Q7 a, const Q7 b)
 Multiply and accumulate.
 
std::complex< Q7from_accumulator (const std::complex< Q< 17, 14 > > &a)
 Convert from accumulator with saturation.
 
std::complex< Q< 17, 14 > > mac (const std::complex< Q< 17, 14 > > acc, const std::complex< Q7 > a, const std::complex< Q7 > b)
 Multiply and accumulate.
 
Q15DSPVector vconst (Q15 val)
 Vector const.
 
Q< 33, 30 > vreduce (const Q< 33, 30 > sum)
 Reduce accumulation value.
 
float32x4_t vconst (const float v)
 Vector constant.
 
float32x4_t vconst_tail (const float v, const mve_pred16_t p0)
 Vector constant with tail.
 
float32x4_t vneg (const float32x4_t a)
 Vector negate.
 
float32x4_t vneg (const float32x4_t a, const mve_pred16_t p0)
 Vector negate with tail.
 
float32x4_t vconjugate (const float32x4_t a)
 Vector conjugate.
 
float32x4_t vconjugate (const float32x4_t a, const mve_pred16_t p0)
 Vector conjugate with tail.
 
float32x4_t vadd (const float32x4_t a, const float32x4_t b)
 Vector + Vector.
 
float32x4_t vadd (const float32x4_t a, const float b)
 Vector + Scalar.
 
float32x4_t vadd (const float a, const float32x4_t b)
 Scalar + Vector.
 
float32x4_t vadd (const float32x4_t a, const float32x4_t b, const mve_pred16_t p0)
 Vector + Vector with tail.
 
float32x4_t vadd (const float32x4_t a, const float b, const mve_pred16_t p0)
 Vector + scalar with tail.
 
float32x4_t vadd (const float a, const float32x4_t b, const mve_pred16_t p0)
 Scalar + vector with tail predicate.
 
float32x4_t vsub (const float32x4_t a, const float32x4_t b)
 Vector - Vector.
 
float32x4_t vsub (const float32x4_t a, const float b)
 Vector - Scalar.
 
float32x4_t vsub (const float a, const float32x4_t b)
 Scalar - Vector.
 
float32x4_t vsub (const float32x4_t a, const float32x4_t b, const mve_pred16_t p0)
 Vector - Vector with predicate.
 
float32x4_t vsub (const float32x4_t a, const float b, const mve_pred16_t p0)
 Vector - Scalar with predicate.
 
float32x4_t vsub (const float a, const float32x4_t b, const mve_pred16_t p0)
 Scalar - Vector with predicate.
 
float32x4_t vmul (const float32x4_t a, const float32x4_t b)
 Vector * Vector.
 
float32x4_t vmul (const float32x4_t a, const float b)
 Vector * Scalar.
 
float32x4_t vmul (const float a, const float32x4_t b)
 Scalar * Vector.
 
float32x4_t vmul (const float32x4_t a, const float32x4_t b, const mve_pred16_t p0)
 Vector * Vector with predicate.
 
float32x4_t vmul (const float32x4_t a, const float b, const mve_pred16_t p0)
 Vector * Scalar with predicate.
 
float32x4_t vmul (const float a, const float32x4_t b, const mve_pred16_t p0)
 Scalar * Vector with predicate.
 
float32x4_t vmacc (const float32x4_t acc, const float32x4_t a, const float32x4_t b)
 Multiply accumulate (Vector * Vector)
 
float32x4_t vmacc (const float32x4_t acc, const float32x4_t a, const float_t b)
 Multiply accumulate (Vector * Scalar)
 
float32x4_t vmacc (const float32x4_t acc, const float32x4_t a, const float32x4_t b, const mve_pred16_t p0)
 Multiply accumulate with predicate (Vector * Vector)
 
float vreduce (const float32x4_t in)
 Vector reduce.
 
template<int S, typename std::enable_if< S==1, bool >::type = true>
float32x4_t vload1 (const float32_t *p)
 Vector load with stride.
 
float32x4_t vload1 (const float32_t *p, const index_t stride)
 Vector load with dynamic stride.
 
template<int S, typename std::enable_if< S==1, bool >::type = true>
float32x4_t vload1_z (const float32_t *p, const std::size_t nb, const mve_pred16_t p0)
 Vector load with stride and predicate.
 
float32x4_t vload1_z (const float32_t *p, const index_t stride, const std::size_t nb, const mve_pred16_t p0)
 Vector load with dynamic stride and loop predication.
 
template<int S, typename std::enable_if< S==1, bool >::type = true>
void vstore1 (float32_t *p, const float32x4_t val)
 Store with stride.
 
void vstore1 (float32_t *p, const index_t stride, const float32x4_t val)
 Store with dynamic stride.
 
template<int S, typename std::enable_if< S==1, bool >::type = true>
void vstore1_z (float32_t *p, const float32x4_t val, const std::size_t nb, const mve_pred16_t p0)
 Store with stride and tail predicate.
 
void vstore1_z (float32_t *p, const index_t stride, const float32x4_t val, const std::size_t nb, const mve_pred16_t p0)
 Store with dynamic stride.
 
ComplexVector< float32x4_t > vconst (const std::complex< float > v)
 Vector constant.
 
ComplexVector< float32x4_t > vneg (const ComplexVector< float32x4_t > &a)
 Vector negate.
 
ComplexVector< float32x4_t > vconjugate (const ComplexVector< float32x4_t > &a)
 Vector conjugate.
 
ComplexVector< float32x4_t > vadd (const ComplexVector< float32x4_t > &a, const ComplexVector< float32x4_t > &b)
 Vector + Vector.
 
ComplexVector< float32x4_t > vadd (const ComplexVector< float32x4_t > &a, const std::complex< float > &b)
 Vector + Scalar.
 
ComplexVector< float32x4_t > vadd (const std::complex< float > &a, const ComplexVector< float32x4_t > &b)
 Scalar + Vector.
 
ComplexVector< float32x4_t > vsub (const ComplexVector< float32x4_t > &a, const ComplexVector< float32x4_t > &b)
 Vector - Vector.
 
ComplexVector< float32x4_t > vsub (const ComplexVector< float32x4_t > &a, const std::complex< float > &b)
 Vector - Scalar.
 
ComplexVector< float32x4_t > vsub (const std::complex< float > &a, const ComplexVector< float32x4_t > &b)
 Scalar - Vector.
 
ComplexVector< float32x4_t > vmul (const ComplexVector< float32x4_t > &a, const ComplexVector< float32x4_t > &b)
 Vector * Vector.
 
ComplexVector< float32x4_t > vmul (const ComplexVector< float32x4_t > &a, const std::complex< float > &b)
 Vector * Scalar.
 
ComplexVector< float32x4_t > vmul (const std::complex< float > &a, const ComplexVector< float32x4_t > &b)
 Scalar * Vector.
 
ComplexVector< float32x4_t > vmacc (const ComplexVector< float32x4_t > &acc, const ComplexVector< float32x4_t > &a, const ComplexVector< float32x4_t > &b)
 Multiply accumulate (Vector * Vector)
 
ComplexVector< float32x4_t > vmacc (const ComplexVector< float32x4_t > &acc, const ComplexVector< float32x4_t > &a, const std::complex< float > &b)
 Multiply accumulate (Vector * Scalar)
 
std::complex< float > vreduce (const ComplexVector< float32x4_t > &in)
 Vector reduce.
 
template<int S, typename std::enable_if< S==1, bool >::type = true>
ComplexVector< float32x4_t > vload1 (const std::complex< float32_t > *p)
 Vector load with stride.
 
ComplexVector< float32x4_t > vload1 (const std::complex< float32_t > *p, const index_t stride)
 Vector load with dynamic stride.
 
template<int S, typename std::enable_if< S==1, bool >::type = true>
void vstore1 (std::complex< float32_t > *p, const ComplexVector< float32x4_t > &val)
 Store with stride.
 
void vstore1 (std::complex< float32_t > *p, const index_t stride, const ComplexVector< float32x4_t > &val)
 Store with dynamic stride.
 
float16x8_t vconst (float16_t v)
 Vector const.
 
float16x8_t vconst_tail (const float16_t v, const mve_pred16_t p0)
 Vector of const with tail predicate.
 
float16x8_t vneg (const float16x8_t a)
 Vector negate.
 
float16x8_t vneg (const float16x8_t a, const mve_pred16_t p0)
 Vector negate with tail predicate.
 
float16x8_t vconjugate (const float16x8_t a)
 Vector conjugate.
 
float16x8_t vconjugate (const float16x8_t a, const mve_pred16_t p0)
 Vector conjugate with tail predicate.
 
float16x8_t vadd (const float16x8_t a, const float16x8_t b)
 Vector + Vector.
 
float16x8_t vadd (const float16x8_t a, const float16_t b)
 Vector + Scalar.
 
float16x8_t vadd (const float16_t a, const float16x8_t b)
 Scalar + Vector.
 
float16x8_t vadd (const float16x8_t a, const float16x8_t b, const mve_pred16_t p0)
 Vector + Vector with tail predicate.
 
float16x8_t vadd (const float16x8_t a, const float16_t b, const mve_pred16_t p0)
 Vector + Scalar with tail predicate.
 
float16x8_t vadd (const float16_t a, const float16x8_t b, const mve_pred16_t p0)
 Scalar + Vector with tail predicate.
 
ComplexVector< float16x8_t > vconst (const std::complex< float16_t > v)
 Vector constant.
 
ComplexVector< float16x8_t > vneg (const ComplexVector< float16x8_t > &a)
 Vector negate.
 
ComplexVector< float16x8_t > vconjugate (const ComplexVector< float16x8_t > &a)
 Vector conjugate.
 
ComplexVector< float16x8_t > vadd (const ComplexVector< float16x8_t > &a, const ComplexVector< float16x8_t > &b)
 Vector + Vector.
 
ComplexVector< float16x8_t > vadd (const ComplexVector< float16x8_t > &a, const std::complex< float16_t > &b)
 Vector + Scalar.
 
ComplexVector< float16x8_t > vadd (const std::complex< float16_t > &a, const ComplexVector< float16x8_t > &b)
 Scalar + Vector.
 
ComplexVector< float16x8_t > vsub (const ComplexVector< float16x8_t > &a, const ComplexVector< float16x8_t > &b)
 Vector - Vector.
 
ComplexVector< float16x8_t > vsub (const ComplexVector< float16x8_t > &a, const std::complex< float16_t > &b)
 Vector - Scalar.
 
ComplexVector< float16x8_t > vsub (const std::complex< float16_t > &a, const ComplexVector< float16x8_t > &b)
 Scalar - Vector.
 
ComplexVector< float16x8_t > vmul (const ComplexVector< float16x8_t > &a, const ComplexVector< float16x8_t > &b)
 Vector * Vector.
 
ComplexVector< float16x8_t > vmul (const ComplexVector< float16x8_t > &a, const std::complex< float16_t > &b)
 Vector * Scalar.
 
ComplexVector< float16x8_t > vmul (const std::complex< float16_t > &a, const ComplexVector< float16x8_t > &b)
 Scalar * Vector.
 
ComplexVector< float16x8_t > vmacc (const ComplexVector< float16x8_t > &acc, const ComplexVector< float16x8_t > &a, const ComplexVector< float16x8_t > &b)
 Multiply accumulate (Vector * Vector)
 
ComplexVector< float16x8_t > vmacc (const ComplexVector< float16x8_t > &acc, const ComplexVector< float16x8_t > &a, const std::complex< float16_t > &b)
 Multiply accumulate (Vector * Scalar)
 
std::complex< float16_t > vreduce (const ComplexVector< float16x8_t > &in)
 Vector reduce.
 
template<int S, typename std::enable_if< S==1, bool >::type = true>
ComplexVector< float16x8_t > vload1 (const std::complex< float16_t > *p)
 Vector load with stride.
 
ComplexVector< float16x8_t > vload1 (const std::complex< float16_t > *p, const index_t stride)
 Vector load with dynamic stride.
 
template<int S, typename std::enable_if< S==1, bool >::type = true>
void vstore1 (std::complex< float16_t > *p, const ComplexVector< float16x8_t > &val)
 Store with stride.
 
void vstore1 (std::complex< float16_t > *p, const index_t stride, const ComplexVector< float16x8_t > &val)
 Store with dynamic stride.
 
template<int S, typename std::enable_if< S==1, bool >::type = true>
int16x8_t vload1 (const Q15 *p)
 Vector load with stride.
 
Q< 33, 30 > vmacc (const Q< 33, 30 > sum, const int16x8_t vala, const int16x8_t valb)
 Vector accumulate into scalar.
 
template<typename A, typename VA, typename VB, std::size_t... Ns>
vmacc_impl (const A &acc, const VA &a, const VB &b, std::index_sequence< Ns... >)
 Vector accumulate for tuples of vectors.
 
template<typename A, typename ... EA, typename ... EB>
vmacc (const A &acc, const std::tuple< EA... > &a, const std::tuple< EB... > &b)
 Vector accumulate for tuples of vectors.
 
template<typename A, typename VA, typename VB, typename B, std::size_t... Ns>
vmacc_impl (const A &acc, const VA &a, const VB &b, const B p0, std::index_sequence< Ns... >)
 Predicated vector accumulate for tuple.
 
template<typename A, typename B, typename ... EA, typename ... EB>
vmacc (const A &acc, const std::tuple< EA... > &a, const std::tuple< EB... > &b, const B p0)
 Predicated vector accumulate for tuples.
 
template<typename A, std::size_t... Ns>
auto vreduce_impl (const A &acc, std::index_sequence< Ns... >)
 Reduce function for tuple.
 
template<typename ... E>
auto vreduce (const std::tuple< E... > &acc)
 Reduce function for tuples.
 
template<typename A, std::size_t... Ns>
auto from_accumulator_impl (const A &acc, std::index_sequence< Ns... >)
 Convert from accumulator value.
 
template<typename ... E>
auto from_accumulator (const std::tuple< E... > &acc)
 Convert from tuple of accumulator values.
 
template<typename A, typename VA, typename VB, std::size_t... Ns>
mac_impl (const A &acc, const VA &a, const VB &b, std::index_sequence< Ns... >)
 Multiply accumulate for tuple of scalar.
 
template<typename A, typename ... EA, typename ... EB>
mac (const A &acc, const std::tuple< EA... > &a, const std::tuple< EB... > &b)
 Multiply accumulate.
 
template<typename A, typename VA, typename VB, typename B, std::size_t... Ns>
mac_impl (const A &acc, const VA &a, const VB &b, const B p0, std::index_sequence< Ns... >)
 Multiply accumulate for tuple of scalar.
 
template<typename A, typename B, typename ... EA, typename ... EB>
mac (const A &acc, const std::tuple< EA... > &a, const std::tuple< EB... > &b, const B p0)
 Multiply accumulate.