Argon 0.1.0
Loading...
Searching...
No Matches
a32_float.hpp
1#pragma once
2#include "vfpv4_float.hpp"
3
4#ifdef __ARM_FEATURE_MVE
5#define simd mve
6#else
7#define simd neon
8#endif
9
10#ifdef __cplusplus
11
12#ifdef __clang__
13#define nce constexpr
14#else
15#define nce inline
16#endif
17
18namespace simd {
19// clang-format off
20template <typename T> nce T convert_round_to_nearest_with_ties_away_from_zero(float16x8_t a);
21template <typename T> nce T convert_round_to_nearest_with_ties_away_from_zero(float32x4_t a);
22template <typename T> nce T convert_round_to_nearest_with_ties_to_even(float16x8_t a);
23template <typename T> nce T convert_round_to_nearest_with_ties_to_even(float32x4_t a);
24template <typename T> nce T convert_round_toward_positive_infinity(float16x8_t a);
25template <typename T> nce T convert_round_toward_positive_infinity(float32x4_t a);
26template <typename T> nce T convert_round_toward_negative_infinity(float16x8_t a);
27template <typename T> nce T convert_round_toward_negative_infinity(float32x4_t a);
28template <typename T> nce T convert(int16x8_t a);
29template <typename T> nce T convert(uint16x8_t a);
30template <typename T> nce T convert(float16x8_t a);
31template <typename T> nce T reinterpret(int8x16_t a);
32template <typename T> nce T reinterpret(int16x8_t a);
33template <typename T> nce T reinterpret(int32x4_t a);
34template <typename T> nce T reinterpret(uint8x16_t a);
35template <typename T> nce T reinterpret(uint16x8_t a);
36template <typename T> nce T reinterpret(uint32x4_t a);
37template <typename T> nce T reinterpret(int64x2_t a);
38template <> [[gnu::always_inline]] nce float16x8_t convert(uint16x8_t a) { return vcvtq_f16_u16(a); }
39template <int n>[[gnu::always_inline]] nce float16x8_t convert_n(uint16x8_t a) { return vcvtq_n_f16_u16(a, n); }
40template <> [[gnu::always_inline]] nce float16x8_t convert(int16x8_t a) { return vcvtq_f16_s16(a); }
41template <int n>[[gnu::always_inline]] nce float16x8_t convert_n(int16x8_t a) { return vcvtq_n_f16_s16(a, n); }
42[[gnu::always_inline]] nce float16x8_t subtract_absolute(float16x8_t a, float16x8_t b) { return vabdq_f16(a, b); }
43[[gnu::always_inline]] nce float16x8_t add(float16x8_t a, float16x8_t b) { return vaddq_f16(a, b); }
44[[gnu::always_inline]] nce float16x8_t multiply(float16x8_t a, float16x8_t b) { return vmulq_f16(a, b); }
45[[gnu::always_inline]] nce float16x8_t subtract(float16x8_t a, float16x8_t b) { return vsubq_f16(a, b); }
46[[gnu::always_inline]] nce float16x8_t negate(float16x8_t a) { return vnegq_f16(a); }
47[[gnu::always_inline]] nce float16x8_t complex_add_rotate_90(float16x8_t a, float16x8_t b) { return vcaddq_rot90_f16(a, b); }
48[[gnu::always_inline]] nce float16x8_t complex_add_rotate_270(float16x8_t a, float16x8_t b) { return vcaddq_rot270_f16(a, b); }
49template <> [[gnu::always_inline]] nce int16x8_t convert_round_to_nearest_with_ties_away_from_zero(float16x8_t a) { return vcvtaq_s16_f16(a); }
50template <> [[gnu::always_inline]] nce uint16x8_t convert_round_to_nearest_with_ties_away_from_zero(float16x8_t a) { return vcvtaq_u16_f16(a); }
51template <> [[gnu::always_inline]] nce int16x8_t convert_round_to_nearest_with_ties_to_even(float16x8_t a) { return vcvtnq_s16_f16(a); }
52template <> [[gnu::always_inline]] nce uint16x8_t convert_round_to_nearest_with_ties_to_even(float16x8_t a) { return vcvtnq_u16_f16(a); }
53template <> [[gnu::always_inline]] nce int16x8_t convert_round_toward_positive_infinity(float16x8_t a) { return vcvtpq_s16_f16(a); }
54template <> [[gnu::always_inline]] nce uint16x8_t convert_round_toward_positive_infinity(float16x8_t a) { return vcvtpq_u16_f16(a); }
55template <> [[gnu::always_inline]] nce int16x8_t convert_round_toward_negative_infinity(float16x8_t a) { return vcvtmq_s16_f16(a); }
56template <> [[gnu::always_inline]] nce uint16x8_t convert_round_toward_negative_infinity(float16x8_t a) { return vcvtmq_u16_f16(a); }
57template <> [[gnu::always_inline]] nce int16x8_t convert(float16x8_t a) { return vcvtq_s16_f16(a); }
58template <> [[gnu::always_inline]] nce uint16x8_t convert(float16x8_t a) { return vcvtq_u16_f16(a); }
59template <int n>[[gnu::always_inline]] nce int16x8_t convert_n_signed(float16x8_t a) { return vcvtq_n_s16_f16(a, n); }
60template <int n>[[gnu::always_inline]] nce uint16x8_t convert_n_unsigned(float16x8_t a) { return vcvtq_n_u16_f16(a, n); }
61[[gnu::always_inline]] nce float32x4_t min_strict(float32x4_t a, float32x4_t b) { return vminnmq_f32(a, b); }
62[[gnu::always_inline]] nce float32x4_t max_strict(float32x4_t a, float32x4_t b) { return vmaxnmq_f32(a, b); }
63[[gnu::always_inline]] nce float32x4_t round(float32x4_t a) { return vrndq_f32(a); }
64[[gnu::always_inline]] nce float32x4_t round_to_nearest_with_ties_to_even(float32x4_t a) { return vrndnq_f32(a); }
65[[gnu::always_inline]] nce float32x4_t round_toward_negative_infinity(float32x4_t a) { return vrndmq_f32(a); }
66[[gnu::always_inline]] nce float32x4_t round_toward_positive_infinity(float32x4_t a) { return vrndpq_f32(a); }
67[[gnu::always_inline]] nce float32x4_t round_to_nearest_with_ties_away_from_zero(float32x4_t a) { return vrndaq_f32(a); }
68[[gnu::always_inline]] nce float32x4_t round_inexact(float32x4_t a) { return vrndxq_f32(a); }
69[[gnu::always_inline]] nce float32x4_t complex_add_rotate_90(float32x4_t a, float32x4_t b) { return vcaddq_rot90_f32(a, b); }
70[[gnu::always_inline]] nce float32x4_t complex_add_rotate_270(float32x4_t a, float32x4_t b) { return vcaddq_rot270_f32(a, b); }
71template <> [[gnu::always_inline]] nce int32x4_t convert_round_to_nearest_with_ties_away_from_zero(float32x4_t a) { return vcvtaq_s32_f32(a); }
72template <> [[gnu::always_inline]] nce uint32x4_t convert_round_to_nearest_with_ties_away_from_zero(float32x4_t a) { return vcvtaq_u32_f32(a); }
73template <> [[gnu::always_inline]] nce int32x4_t convert_round_to_nearest_with_ties_to_even(float32x4_t a) { return vcvtnq_s32_f32(a); }
74template <> [[gnu::always_inline]] nce uint32x4_t convert_round_to_nearest_with_ties_to_even(float32x4_t a) { return vcvtnq_u32_f32(a); }
75template <> [[gnu::always_inline]] nce int32x4_t convert_round_toward_positive_infinity(float32x4_t a) { return vcvtpq_s32_f32(a); }
76template <> [[gnu::always_inline]] nce uint32x4_t convert_round_toward_positive_infinity(float32x4_t a) { return vcvtpq_u32_f32(a); }
77template <> [[gnu::always_inline]] nce int32x4_t convert_round_toward_negative_infinity(float32x4_t a) { return vcvtmq_s32_f32(a); }
78template <> [[gnu::always_inline]] nce uint32x4_t convert_round_toward_negative_infinity(float32x4_t a) { return vcvtmq_u32_f32(a); }
79// clang-format on
80} // namespace simd
81#endif
82#undef nce
83#undef simd