4#include "native/config.h"
10#if NATIVE_HOST_NEON || defined(NATIVE_DOXYGEN)
12namespace native::detail {
21 template<isa<arm> Arch>
requires(Arch.has(arm_feature::i8mm))
23 int32x4_t
smmla(int32x4_t acc, int8x16_t a, int8x16_t b) noexcept {
24 return vmmlaq_s32(acc,a,b);
27 template<isa<arm> Arch>
requires(Arch.has(arm_feature::i8mm))
29 uint32x4_t
ummla(uint32x4_t acc, uint8x16_t a, uint8x16_t b) noexcept {
30 return vmmlaq_u32(acc,a,b);
33 template<isa<arm> Arch>
requires(Arch.has(arm_feature::i8mm))
35 int32x4_t
usmmla(int32x4_t acc, uint8x16_t a, int8x16_t b) noexcept {
36 return vusmmlaq_s32(acc,a,b);
39 template<isa<arm> Arch>
requires(Arch.has(arm_feature::i8mm))
41 int32x2_t
usdot(int32x2_t acc, uint8x8_t a, int8x8_t b) noexcept {
42 return vusdot_s32(acc,a,b);
45 template<isa<arm> Arch,
unsigned Lane>
requires(Arch.has(arm_feature::i8mm) && Lane < 2)
47 int32x2_t
usdot_lane(int32x2_t acc, uint8x8_t a, int8x8_t b) noexcept {
48 return vusdot_lane_s32(acc,a,b,Lane);
51 template<isa<arm> Arch,
unsigned Lane>
requires(Arch.has(arm_feature::i8mm) && Lane < 2)
53 int32x2_t
sudot_lane(int32x2_t acc, int8x8_t a, uint8x8_t b) noexcept {
54 return vsudot_lane_s32(acc,a,b,Lane);
57 template<isa<arm> Arch,
unsigned Lane>
requires(Arch.has(arm_feature::i8mm) && Lane < 4)
59 int32x2_t
usdot_lane(int32x2_t acc, uint8x8_t a, int8x16_t b) noexcept {
60 return vusdot_laneq_s32(acc,a,b,Lane);
63 template<isa<arm> Arch,
unsigned Lane>
requires(Arch.has(arm_feature::i8mm) && Lane < 4)
65 int32x2_t
sudot_lane(int32x2_t acc, int8x8_t a, uint8x16_t b) noexcept {
66 return vsudot_laneq_s32(acc,a,b,Lane);
69 template<isa<arm> Arch>
requires(Arch.has(arm_feature::i8mm))
71 int32x4_t
usdot(int32x4_t acc, uint8x16_t a, int8x16_t b) noexcept {
72 return vusdotq_s32(acc,a,b);
75 template<isa<arm> Arch,
unsigned Lane>
requires(Arch.has(arm_feature::i8mm) && Lane < 2)
77 int32x4_t
usdot_lane(int32x4_t acc, uint8x16_t a, int8x8_t b) noexcept {
78 return vusdotq_lane_s32(acc,a,b,Lane);
81 template<isa<arm> Arch,
unsigned Lane>
requires(Arch.has(arm_feature::i8mm) && Lane < 2)
83 int32x4_t
sudot_lane(int32x4_t acc, int8x16_t a, uint8x8_t b) noexcept {
84 return vsudotq_lane_s32(acc,a,b,Lane);
87 template<isa<arm> Arch,
unsigned Lane>
requires(Arch.has(arm_feature::i8mm) && Lane < 4)
89 int32x4_t
usdot_lane(int32x4_t acc, uint8x16_t a, int8x16_t b) noexcept {
90 return vusdotq_laneq_s32(acc,a,b,Lane);
93 template<isa<arm> Arch,
unsigned Lane>
requires(Arch.has(arm_feature::i8mm) && Lane < 4)
95 int32x4_t
sudot_lane(int32x4_t acc, int8x16_t a, uint8x16_t b) noexcept {
96 return vsudotq_laneq_s32(acc,a,b,Lane);
Compiler attributes for host code, with shader-safe shared modifiers.
constexpr simd< std::int32_t, 2, Arch > usdot(simd< std::int32_t, 2, Arch > acc, simd< std::uint8_t, 8, Arch > a, simd< std::int8_t, 8, Arch > b) noexcept
Accumulate each corresponding group of four unsigned a bytes times signed b bytes.
constexpr simd< std::int32_t, 2, Arch > sudot_lane(simd< std::int32_t, 2, Arch > acc, simd< std::int8_t, 8, Arch > a, simd< std::uint8_t, 8, Arch > b) noexcept
Accumulate each four-byte group of a times b[4*Lane..4*Lane+3].
constexpr simd< std::int32_t, 4, Arch > usmmla(simd< std::int32_t, 4, Arch > acc, simd< std::uint8_t, 16, Arch > a, simd< std::int8_t, 16, Arch > b) noexcept
Unsigned left matrix times signed right matrix, with signed accumulator.
constexpr simd< std::uint32_t, 4, Arch > ummla(simd< std::uint32_t, 4, Arch > acc, simd< std::uint8_t, 16, Arch > a, simd< std::uint8_t, 16, Arch > b) noexcept
Unsigned 2x8 times 8x2 matrix multiply-accumulate.
constexpr simd< std::int32_t, 4, Arch > smmla(simd< std::int32_t, 4, Arch > acc, simd< std::int8_t, 16, Arch > a, simd< std::int8_t, 16, Arch > b) noexcept
Signed 2x8 times 8x2 matrix multiply-accumulate.
constexpr simd< std::int32_t, 2, Arch > usdot_lane(simd< std::int32_t, 2, Arch > acc, simd< std::uint8_t, 8, Arch > a, simd< std::int8_t, 8, Arch > b) noexcept
Accumulate each four-byte group of a times b[4*Lane..4*Lane+3].
#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.