5#include "native/config.h"
11#if NATIVE_HOST_NEON || defined(NATIVE_DOXYGEN)
13namespace native::detail {
15 template<isa<arm> Arch>
requires(Arch.has(arm_feature::dotprod))
17 int32x2_t
sdot(int32x2_t accumulator, int8x8_t lhs, int8x8_t rhs) noexcept {
18 return vdot_s32(accumulator, lhs, rhs);
21 template<isa<arm> Arch,
int Lane>
requires(Arch.has(arm_feature::dotprod) && Lane >= 0 && Lane < 2)
23 int32x2_t
sdot_lane(int32x2_t accumulator, int8x8_t lhs, int8x8_t rhs) noexcept {
24 return vdot_lane_s32(accumulator, lhs, rhs, Lane);
27 template<isa<arm> Arch,
int Lane>
requires(Arch.has(arm_feature::dotprod) && Lane >= 0 && Lane < 4)
29 int32x2_t
sdot_lane(int32x2_t accumulator, int8x8_t lhs, int8x16_t rhs) noexcept {
30 return vdot_laneq_s32(accumulator, lhs, rhs, Lane);
33 template<isa<arm> Arch>
requires(Arch.has(arm_feature::dotprod))
35 int32x4_t
sdot(int32x4_t accumulator, int8x16_t lhs, int8x16_t rhs) noexcept {
36 return vdotq_s32(accumulator, lhs, rhs);
39 template<isa<arm> Arch,
int Lane>
requires(Arch.has(arm_feature::dotprod) && Lane >= 0 && Lane < 2)
41 int32x4_t
sdot_lane(int32x4_t accumulator, int8x16_t lhs, int8x8_t rhs) noexcept {
42 return vdotq_lane_s32(accumulator, lhs, rhs, Lane);
45 template<isa<arm> Arch,
int Lane>
requires(Arch.has(arm_feature::dotprod) && Lane >= 0 && Lane < 4)
47 int32x4_t
sdot_lane(int32x4_t accumulator, int8x16_t lhs, int8x16_t rhs) noexcept {
48 return vdotq_laneq_s32(accumulator, lhs, rhs, Lane);
51 template<isa<arm> Arch>
requires(Arch.has(arm_feature::dotprod))
53 uint32x2_t
udot(uint32x2_t accumulator, uint8x8_t lhs, uint8x8_t rhs) noexcept {
54 return vdot_u32(accumulator, lhs, rhs);
57 template<isa<arm> Arch,
int Lane>
requires(Arch.has(arm_feature::dotprod) && Lane >= 0 && Lane < 2)
59 uint32x2_t
udot_lane(uint32x2_t accumulator, uint8x8_t lhs, uint8x8_t rhs) noexcept {
60 return vdot_lane_u32(accumulator, lhs, rhs, Lane);
63 template<isa<arm> Arch,
int Lane>
requires(Arch.has(arm_feature::dotprod) && Lane >= 0 && Lane < 4)
65 uint32x2_t
udot_lane(uint32x2_t accumulator, uint8x8_t lhs, uint8x16_t rhs) noexcept {
66 return vdot_laneq_u32(accumulator, lhs, rhs, Lane);
69 template<isa<arm> Arch>
requires(Arch.has(arm_feature::dotprod))
71 uint32x4_t
udot(uint32x4_t accumulator, uint8x16_t lhs, uint8x16_t rhs) noexcept {
72 return vdotq_u32(accumulator, lhs, rhs);
75 template<isa<arm> Arch,
int Lane>
requires(Arch.has(arm_feature::dotprod) && Lane >= 0 && Lane < 2)
77 uint32x4_t
udot_lane(uint32x4_t accumulator, uint8x16_t lhs, uint8x8_t rhs) noexcept {
78 return vdotq_lane_u32(accumulator, lhs, rhs, Lane);
81 template<isa<arm> Arch,
int Lane>
requires(Arch.has(arm_feature::dotprod) && Lane >= 0 && Lane < 4)
83 uint32x4_t
udot_lane(uint32x4_t accumulator, uint8x16_t lhs, uint8x16_t rhs) noexcept {
84 return vdotq_laneq_u32(accumulator, lhs, rhs, Lane);
90 template<isa<arm> Arch,
class A,
class B,
class C>
91 void sdot(A, B, C) =
delete;
92 template<isa<arm> Arch,
int Lane,
class A,
class B,
class C>
94 template<isa<arm> Arch,
class A,
class B,
class C>
95 void udot(A, B, C) =
delete;
96 template<isa<arm> Arch,
int Lane,
class A,
class B,
class C>
Compiler attributes for host code, with shader-safe shared modifiers.
constexpr simd< std::uint32_t, 2, Arch > udot_lane(simd< std::uint32_t, 2, Arch > accumulator, simd< std::uint8_t, 8, Arch > lhs, simd< std::uint8_t, 8, Arch > rhs) noexcept
UDOT by element: broadcast rhs byte group Lane to every accumulator lane.
constexpr simd< std::int32_t, 2, Arch > sdot(simd< std::int32_t, 2, Arch > accumulator, simd< std::int8_t, 8, Arch > lhs, simd< std::int8_t, 8, Arch > rhs) noexcept
SDOT: four byte products per accumulator lane, modulo 2^32.
constexpr simd< std::int32_t, 2, Arch > sdot_lane(simd< std::int32_t, 2, Arch > accumulator, simd< std::int8_t, 8, Arch > lhs, simd< std::int8_t, 8, Arch > rhs) noexcept
SDOT by element: broadcast rhs byte group Lane to every accumulator lane.
constexpr simd< std::uint32_t, 2, Arch > udot(simd< std::uint32_t, 2, Arch > accumulator, simd< std::uint8_t, 8, Arch > lhs, simd< std::uint8_t, 8, Arch > rhs) noexcept
UDOT: four byte products per accumulator lane, modulo 2^32.
#define native_inline
inline [[always_inline]]
#define native_nodiscard
C++17 [[nodiscard]].
#define native_const
[[const]] is not const
constexpr int target
First matching requirement, with every later choice checked for shadowing.