#include <arm_neon.h>

Dot product & matrix multiply

Integer and BFloat16 dot products and matrix multiply-accumulate (dotprod, i8mm, bf16).

intrinsic family of arm_neon.h
20 macros · 12 functions

functionvbfdotq_f32

__ai __attribute__((target("bf16,neon")))
float32x4_t vbfdotq_f32(float32x4_t __p0, bfloat16x8_t __p1, bfloat16x8_t __p2)

functionvbfdot_f32

__ai __attribute__((target("bf16,neon")))
float32x2_t vbfdot_f32(float32x2_t __p0, bfloat16x4_t __p1, bfloat16x4_t __p2)

functionvbfmmlaq_f32

__ai __attribute__((target("bf16,neon")))
float32x4_t vbfmmlaq_f32(float32x4_t __p0, bfloat16x8_t __p1, bfloat16x8_t __p2)

functionvdotq_u32

__ai __attribute__((target("dotprod,neon")))
uint32x4_t vdotq_u32(uint32x4_t __p0, uint8x16_t __p1, uint8x16_t __p2)

functionvdotq_s32

__ai __attribute__((target("dotprod,neon")))
int32x4_t vdotq_s32(int32x4_t __p0, int8x16_t __p1, int8x16_t __p2)

functionvdot_u32

__ai __attribute__((target("dotprod,neon")))
uint32x2_t vdot_u32(uint32x2_t __p0, uint8x8_t __p1, uint8x8_t __p2)

functionvdot_s32

__ai __attribute__((target("dotprod,neon")))
int32x2_t vdot_s32(int32x2_t __p0, int8x8_t __p1, int8x8_t __p2)

functionvmmlaq_u32

__ai __attribute__((target("i8mm,neon")))
uint32x4_t vmmlaq_u32(uint32x4_t __p0, uint8x16_t __p1, uint8x16_t __p2)

functionvmmlaq_s32

__ai __attribute__((target("i8mm,neon")))
int32x4_t vmmlaq_s32(int32x4_t __p0, int8x16_t __p1, int8x16_t __p2)

functionvusdotq_s32

__ai __attribute__((target("i8mm,neon")))
int32x4_t vusdotq_s32(int32x4_t __p0, uint8x16_t __p1, int8x16_t __p2)

functionvusdot_s32

__ai __attribute__((target("i8mm,neon")))
int32x2_t vusdot_s32(int32x2_t __p0, uint8x8_t __p1, int8x8_t __p2)

functionvusmmlaq_s32

__ai __attribute__((target("i8mm,neon")))
int32x4_t vusmmlaq_s32(int32x4_t __p0, uint8x16_t __p1, int8x16_t __p2)

macrovdotq_laneq_u32

#define vdotq_laneq_u32(__p0_242, __p1_242, __p2_242, __p3_242) __extension__ ({
  uint32x4_t __ret_242;
  uint32x4_t __s0_242 = __p0_242;
  uint8x16_t __s1_242 = __p1_242;
  uint8x16_t __s2_242 = __p2_242;
  __ret_242 = vdotq_u32(__s0_242, __s1_242, __builtin_bit_cast(uint8x16_t, splatq_laneq_u32(__builtin_bit_cast(uint32x4_t, __s2_242), __p3_242)));
  __ret_242;
})

macrovdotq_laneq_s32

#define vdotq_laneq_s32(__p0_244, __p1_244, __p2_244, __p3_244) __extension__ ({
  int32x4_t __ret_244;
  int32x4_t __s0_244 = __p0_244;
  int8x16_t __s1_244 = __p1_244;
  int8x16_t __s2_244 = __p2_244;
  __ret_244 = vdotq_s32(__s0_244, __s1_244, __builtin_bit_cast(int8x16_t, splatq_laneq_s32(__builtin_bit_cast(int32x4_t, __s2_244), __p3_244)));
  __ret_244;
})

macrovdot_laneq_u32

#define vdot_laneq_u32(__p0_246, __p1_246, __p2_246, __p3_246) __extension__ ({
  uint32x2_t __ret_246;
  uint32x2_t __s0_246 = __p0_246;
  uint8x8_t __s1_246 = __p1_246;
  uint8x16_t __s2_246 = __p2_246;
  __ret_246 = vdot_u32(__s0_246, __s1_246, __builtin_bit_cast(uint8x8_t, splat_laneq_u32(__builtin_bit_cast(uint32x4_t, __s2_246), __p3_246)));
  __ret_246;
})

macrovdot_laneq_s32

#define vdot_laneq_s32(__p0_248, __p1_248, __p2_248, __p3_248) __extension__ ({
  int32x2_t __ret_248;
  int32x2_t __s0_248 = __p0_248;
  int8x8_t __s1_248 = __p1_248;
  int8x16_t __s2_248 = __p2_248;
  __ret_248 = vdot_s32(__s0_248, __s1_248, __builtin_bit_cast(int8x8_t, splat_laneq_s32(__builtin_bit_cast(int32x4_t, __s2_248), __p3_248)));
  __ret_248;
})

macrovsudotq_laneq_s32

#define vsudotq_laneq_s32(__p0_274, __p1_274, __p2_274, __p3_274) __extension__ ({
  int32x4_t __ret_274;
  int32x4_t __s0_274 = __p0_274;
  int8x16_t __s1_274 = __p1_274;
  uint8x16_t __s2_274 = __p2_274;
  __ret_274 = vusdotq_s32(__s0_274, __builtin_bit_cast(uint8x16_t, splatq_laneq_s32(__builtin_bit_cast(int32x4_t, __s2_274), __p3_274)), __s1_274);
  __ret_274;
})

macrovsudot_laneq_s32

#define vsudot_laneq_s32(__p0_276, __p1_276, __p2_276, __p3_276) __extension__ ({
  int32x2_t __ret_276;
  int32x2_t __s0_276 = __p0_276;
  int8x8_t __s1_276 = __p1_276;
  uint8x16_t __s2_276 = __p2_276;
  __ret_276 = vusdot_s32(__s0_276, __builtin_bit_cast(uint8x8_t, splat_laneq_s32(__builtin_bit_cast(int32x4_t, __s2_276), __p3_276)), __s1_276);
  __ret_276;
})

macrovusdotq_laneq_s32

#define vusdotq_laneq_s32(__p0_278, __p1_278, __p2_278, __p3_278) __extension__ ({
  int32x4_t __ret_278;
  int32x4_t __s0_278 = __p0_278;
  uint8x16_t __s1_278 = __p1_278;
  int8x16_t __s2_278 = __p2_278;
  __ret_278 = vusdotq_s32(__s0_278, __s1_278, __builtin_bit_cast(int8x16_t, splatq_laneq_s32(__builtin_bit_cast(int32x4_t, __s2_278), __p3_278)));
  __ret_278;
})

macrovusdot_laneq_s32

#define vusdot_laneq_s32(__p0_280, __p1_280, __p2_280, __p3_280) __extension__ ({
  int32x2_t __ret_280;
  int32x2_t __s0_280 = __p0_280;
  uint8x8_t __s1_280 = __p1_280;
  int8x16_t __s2_280 = __p2_280;
  __ret_280 = vusdot_s32(__s0_280, __s1_280, __builtin_bit_cast(int8x8_t, splat_laneq_s32(__builtin_bit_cast(int32x4_t, __s2_280), __p3_280)));
  __ret_280;
})

macrovbfdotq_lane_f32

#define vbfdotq_lane_f32(__p0_808, __p1_808, __p2_808, __p3_808) __extension__ ({
  float32x4_t __ret_808;
  float32x4_t __s0_808 = __p0_808;
  bfloat16x8_t __s1_808 = __p1_808;
  bfloat16x4_t __s2_808 = __p2_808;
  __ret_808 = vbfdotq_f32(__s0_808, __s1_808, __builtin_bit_cast(bfloat16x8_t, splatq_lane_f32(__builtin_bit_cast(float32x2_t, __s2_808), __p3_808)));
  __ret_808;
})

macrovbfdot_lane_f32

#define vbfdot_lane_f32(__p0_810, __p1_810, __p2_810, __p3_810) __extension__ ({
  float32x2_t __ret_810;
  float32x2_t __s0_810 = __p0_810;
  bfloat16x4_t __s1_810 = __p1_810;
  bfloat16x4_t __s2_810 = __p2_810;
  __ret_810 = vbfdot_f32(__s0_810, __s1_810, __builtin_bit_cast(bfloat16x4_t, splat_lane_f32(__builtin_bit_cast(float32x2_t, __s2_810), __p3_810)));
  __ret_810;
})

macrovbfdotq_laneq_f32

#define vbfdotq_laneq_f32(__p0_812, __p1_812, __p2_812, __p3_812) __extension__ ({
  float32x4_t __ret_812;
  float32x4_t __s0_812 = __p0_812;
  bfloat16x8_t __s1_812 = __p1_812;
  bfloat16x8_t __s2_812 = __p2_812;
  __ret_812 = vbfdotq_f32(__s0_812, __s1_812, __builtin_bit_cast(bfloat16x8_t, splatq_laneq_f32(__builtin_bit_cast(float32x4_t, __s2_812), __p3_812)));
  __ret_812;
})

macrovbfdot_laneq_f32

#define vbfdot_laneq_f32(__p0_814, __p1_814, __p2_814, __p3_814) __extension__ ({
  float32x2_t __ret_814;
  float32x2_t __s0_814 = __p0_814;
  bfloat16x4_t __s1_814 = __p1_814;
  bfloat16x8_t __s2_814 = __p2_814;
  __ret_814 = vbfdot_f32(__s0_814, __s1_814, __builtin_bit_cast(bfloat16x4_t, splat_laneq_f32(__builtin_bit_cast(float32x4_t, __s2_814), __p3_814)));
  __ret_814;
})

macrovdotq_lane_u32

#define vdotq_lane_u32(__p0_827, __p1_827, __p2_827, __p3_827) __extension__ ({
  uint32x4_t __ret_827;
  uint32x4_t __s0_827 = __p0_827;
  uint8x16_t __s1_827 = __p1_827;
  uint8x8_t __s2_827 = __p2_827;
  __ret_827 = vdotq_u32(__s0_827, __s1_827, __builtin_bit_cast(uint8x16_t, splatq_lane_u32(__builtin_bit_cast(uint32x2_t, __s2_827), __p3_827)));
  __ret_827;
})

macrovdotq_lane_s32

#define vdotq_lane_s32(__p0_829, __p1_829, __p2_829, __p3_829) __extension__ ({
  int32x4_t __ret_829;
  int32x4_t __s0_829 = __p0_829;
  int8x16_t __s1_829 = __p1_829;
  int8x8_t __s2_829 = __p2_829;
  __ret_829 = vdotq_s32(__s0_829, __s1_829, __builtin_bit_cast(int8x16_t, splatq_lane_s32(__builtin_bit_cast(int32x2_t, __s2_829), __p3_829)));
  __ret_829;
})

macrovdot_lane_u32

#define vdot_lane_u32(__p0_831, __p1_831, __p2_831, __p3_831) __extension__ ({
  uint32x2_t __ret_831;
  uint32x2_t __s0_831 = __p0_831;
  uint8x8_t __s1_831 = __p1_831;
  uint8x8_t __s2_831 = __p2_831;
  __ret_831 = vdot_u32(__s0_831, __s1_831, __builtin_bit_cast(uint8x8_t, splat_lane_u32(__builtin_bit_cast(uint32x2_t, __s2_831), __p3_831)));
  __ret_831;
})

macrovdot_lane_s32

#define vdot_lane_s32(__p0_833, __p1_833, __p2_833, __p3_833) __extension__ ({
  int32x2_t __ret_833;
  int32x2_t __s0_833 = __p0_833;
  int8x8_t __s1_833 = __p1_833;
  int8x8_t __s2_833 = __p2_833;
  __ret_833 = vdot_s32(__s0_833, __s1_833, __builtin_bit_cast(int8x8_t, splat_lane_s32(__builtin_bit_cast(int32x2_t, __s2_833), __p3_833)));
  __ret_833;
})

macrovsudotq_lane_s32

#define vsudotq_lane_s32(__p0_839, __p1_839, __p2_839, __p3_839) __extension__ ({
  int32x4_t __ret_839;
  int32x4_t __s0_839 = __p0_839;
  int8x16_t __s1_839 = __p1_839;
  uint8x8_t __s2_839 = __p2_839;
  __ret_839 = vusdotq_s32(__s0_839, __builtin_bit_cast(uint8x16_t, splatq_lane_s32(__builtin_bit_cast(int32x2_t, __s2_839), __p3_839)), __s1_839);
  __ret_839;
})

macrovsudot_lane_s32

#define vsudot_lane_s32(__p0_841, __p1_841, __p2_841, __p3_841) __extension__ ({
  int32x2_t __ret_841;
  int32x2_t __s0_841 = __p0_841;
  int8x8_t __s1_841 = __p1_841;
  uint8x8_t __s2_841 = __p2_841;
  __ret_841 = vusdot_s32(__s0_841, __builtin_bit_cast(uint8x8_t, splat_lane_s32(__builtin_bit_cast(int32x2_t, __s2_841), __p3_841)), __s1_841);
  __ret_841;
})

macrovusdotq_lane_s32

#define vusdotq_lane_s32(__p0_843, __p1_843, __p2_843, __p3_843) __extension__ ({
  int32x4_t __ret_843;
  int32x4_t __s0_843 = __p0_843;
  uint8x16_t __s1_843 = __p1_843;
  int8x8_t __s2_843 = __p2_843;
  __ret_843 = vusdotq_s32(__s0_843, __s1_843, __builtin_bit_cast(int8x16_t, splatq_lane_s32(__builtin_bit_cast(int32x2_t, __s2_843), __p3_843)));
  __ret_843;
})

macrovusdot_lane_s32

#define vusdot_lane_s32(__p0_845, __p1_845, __p2_845, __p3_845) __extension__ ({
  int32x2_t __ret_845;
  int32x2_t __s0_845 = __p0_845;
  uint8x8_t __s1_845 = __p1_845;
  int8x8_t __s2_845 = __p2_845;
  __ret_845 = vusdot_s32(__s0_845, __s1_845, __builtin_bit_cast(int8x8_t, splat_lane_s32(__builtin_bit_cast(int32x2_t, __s2_845), __p3_845)));
  __ret_845;
})