Skip to content

File dp_simd.h

File List > inc > dp_simd.h

Go to the documentation of this file

#ifndef DP_SIMD_H
#define DP_SIMD_H

#include <stddef.h>

#include "jm_simd.h"

#define DP_SUMSQ_F32(dst, ptr, n)                                             \
  do                                                                          \
    {                                                                         \
      const float *dp_p_ = (ptr);                                             \
      size_t dp_n_ = (size_t)(n);                                             \
      size_t dp_nv_ = dp_n_ - dp_n_ % (size_t)JM_SIMD_WIDTH_F32;              \
      JM_VEC_F32 dp_acc_ = JM_ZERO_F32 ();                                    \
      for (size_t dp_i_ = 0; dp_i_ < dp_nv_;                                  \
           dp_i_ += (size_t)JM_SIMD_WIDTH_F32)                                \
        {                                                                     \
          JM_VEC_F32 dp_v_ = JM_LOAD_F32 (dp_p_ + dp_i_);                     \
          JM_FMA_F32 (dp_acc_, dp_v_, dp_v_);                                 \
        }                                                                     \
      float dp_s_ = JM_HSUM_F32 (dp_acc_);                                    \
      for (size_t dp_i_ = dp_nv_; dp_i_ < dp_n_; dp_i_++)                     \
        dp_s_ += dp_p_[dp_i_] * dp_p_[dp_i_];                                 \
      (dst) = dp_s_;                                                          \
    }                                                                         \
  while (0)

#endif /* DP_SIMD_H */