From c59db7c33522f1b8243777c187d9e52ddc4bb8aa Mon Sep 17 00:00:00 2001 From: Yi-Yen Chung <45251297+yyctw@users.noreply.github.com> Date: Mon, 20 Nov 2023 23:27:49 +0800 Subject: [PATCH] NEON: implement all bf16-related intrinsics (#1110) * [Feat] Add BF16 when the machine is supported. Finished: vld1_bf16_x4 and vld1q_bf16_x2 * [NEON] Add a C implementation of the bf16 type * [NEON] Add all ld_*_bf16 intrinsics. * [NEON] Add all st*_bf16 intrinsics. * [Test] Add vbfdot_f32 test case * [NEON] Complete converting function from float32 to bfloat16. - Also add bf-related functions in three series - cvt, dot, dot_lane * [Feat] Add option '+bf16' in cross-file * [NEON] Completed initial implementation of bf-16 related intrinsics. * [Fix] Remove redundant commment * [Fix] Correct native aliases * [Fix] The test generation code has been completed. --- .../cross-files/aarch64-clang-15-ccache.cross | 4 +- .../cross-files/aarch64-clang-16-ccache.cross | 4 +- .../cross-files/aarch64-gcc-12-ccache.cross | 4 +- meson.build | 1 + simde/arm/neon/combine.h | 25 + simde/arm/neon/copy_lane.h | 77 + simde/arm/neon/create.h | 15 +- simde/arm/neon/cvt.h | 164 ++ simde/arm/neon/dot.h | 61 +- simde/arm/neon/dot_lane.h | 141 +- simde/arm/neon/dup_lane.h | 80 + simde/arm/neon/dup_n.h | 41 + simde/arm/neon/fmlal.h | 153 ++ simde/arm/neon/get_high.h | 21 + simde/arm/neon/get_lane.h | 41 + simde/arm/neon/get_low.h | 21 + simde/arm/neon/ld1.h | 31 + simde/arm/neon/ld1_dup.h | 27 + simde/arm/neon/ld1_lane.h | 30 + simde/arm/neon/ld1_x2.h | 19 + simde/arm/neon/ld1_x3.h | 20 + simde/arm/neon/ld1_x4.h | 21 + simde/arm/neon/ld1q_x2.h | 20 + simde/arm/neon/ld1q_x3.h | 20 + simde/arm/neon/ld1q_x4.h | 21 + simde/arm/neon/ld2.h | 53 + simde/arm/neon/ld2_dup.h | 37 + simde/arm/neon/ld2_lane.h | 39 + simde/arm/neon/ld3.h | 55 + simde/arm/neon/ld3_dup.h | 37 + simde/arm/neon/ld3_lane.h | 39 + simde/arm/neon/ld4.h | 39 + simde/arm/neon/ld4_dup.h | 37 + simde/arm/neon/ld4_lane.h | 43 + simde/arm/neon/mmlaq.h | 28 + simde/arm/neon/reinterpret.h | 921 ++++++++ simde/arm/neon/set_lane.h | 37 + simde/arm/neon/st1.h | 29 + simde/arm/neon/st1_lane.h | 31 + simde/arm/neon/st1_x2.h | 17 + simde/arm/neon/st1_x3.h | 17 + simde/arm/neon/st1_x4.h | 17 + simde/arm/neon/st1q_x2.h | 17 + simde/arm/neon/st1q_x3.h | 17 + simde/arm/neon/st1q_x4.h | 17 + simde/arm/neon/st2.h | 39 + simde/arm/neon/st2_lane.h | 37 + simde/arm/neon/st3.h | 41 + simde/arm/neon/st3_lane.h | 37 + simde/arm/neon/st4.h | 39 + simde/arm/neon/st4_lane.h | 37 + simde/arm/neon/types.h | 67 + simde/arm/neon/usdot.h | 4 +- simde/simde-arch.h | 5 + simde/simde-bf16.h | 131 ++ simde/simde-features.h | 4 + test/arm/neon/combine.c | 68 + test/arm/neon/copy_lane.c | 399 ++++ test/arm/neon/create.c | 47 + test/arm/neon/cvt.c | 371 ++++ test/arm/neon/dot.c | 135 ++ test/arm/neon/dot_lane.c | 277 +++ test/arm/neon/dup_lane.c | 344 +++ test/arm/neon/dup_n.c | 89 + test/arm/neon/fmlal.c | 412 ++++ test/arm/neon/get_high.c | 56 + test/arm/neon/get_lane.c | 105 + test/arm/neon/get_low.c | 56 + test/arm/neon/ld1_dup.c | 89 + test/arm/neon/ld1_lane.c | 100 + test/arm/neon/ld1_x2.c | 41 + test/arm/neon/ld1_x3.c | 52 + test/arm/neon/ld1_x4.c | 63 + test/arm/neon/ld1q_x2.c | 63 + test/arm/neon/ld1q_x3.c | 82 + test/arm/neon/ld1q_x4.c | 103 + test/arm/neon/ld2.c | 108 + test/arm/neon/ld2_dup.c | 124 ++ test/arm/neon/ld2_lane.c | 146 ++ test/arm/neon/ld3_dup.c | 150 ++ test/arm/neon/ld3_lane.c | 192 ++ test/arm/neon/ld4_dup.c | 178 ++ test/arm/neon/ld4_lane.c | 233 ++ test/arm/neon/mmlaq.c | 65 + test/arm/neon/reinterpret.c | 1958 +++++++++++++++++ test/arm/neon/set_lane.c | 121 + test/arm/neon/st1_lane.c | 99 + test/arm/neon/st1_x2.c | 59 + test/arm/neon/st1_x3.c | 84 + test/arm/neon/st1_x4.c | 101 + test/arm/neon/st1q_x2.c | 99 + test/arm/neon/st1q_x3.c | 132 ++ test/arm/neon/st1q_x4.c | 165 ++ test/arm/neon/st2.c | 107 + test/arm/neon/st2_lane.c | 127 ++ test/arm/neon/st3.c | 236 ++ test/arm/neon/st3_lane.c | 157 ++ test/arm/neon/st4.c | 295 +++ test/arm/neon/st4_lane.c | 185 ++ test/arm/neon/test-neon.h | 42 +- test/test.h | 98 + 101 files changed, 11220 insertions(+), 23 deletions(-) create mode 100644 simde/simde-bf16.h diff --git a/docker/cross-files/aarch64-clang-15-ccache.cross b/docker/cross-files/aarch64-clang-15-ccache.cross index 4efaa8da5..55e947418 100644 --- a/docker/cross-files/aarch64-clang-15-ccache.cross +++ b/docker/cross-files/aarch64-clang-15-ccache.cross @@ -8,8 +8,8 @@ ld = 'llvm-ld-15' exe_wrapper = ['qemu-aarch64-static', '-L', '/usr/aarch64-linux-gnu'] [properties] -c_args = ['--target=aarch64-linux-gnu', '-march=armv8-a+simd+crypto+crc', '-isystem=/usr/aarch64-linux-gnu/include', '-Weverything', '-fno-lax-vector-conversions', '-Werror'] -cpp_args = ['--target=aarch64-linux-gnu', '-march=armv8-a+simd+crypto+crc', '-isystem=/usr/aarch64-linux-gnu/include', '-Weverything', '-fno-lax-vector-conversions', '-Werror'] +c_args = ['--target=aarch64-linux-gnu', '-march=armv8.2-a+simd+crypto+crc+bf16', '-isystem=/usr/aarch64-linux-gnu/include', '-Weverything', '-fno-lax-vector-conversions', '-Werror'] +cpp_args = ['--target=aarch64-linux-gnu', '-march=armv8.2-a+simd+crypto+crc+bf16', '-isystem=/usr/aarch64-linux-gnu/include', '-Weverything', '-fno-lax-vector-conversions', '-Werror'] c_link_args = ['--target=aarch64-linux-gnu'] cpp_link_args = ['--target=aarch64-linux-gnu'] diff --git a/docker/cross-files/aarch64-clang-16-ccache.cross b/docker/cross-files/aarch64-clang-16-ccache.cross index 4e730e728..0430296dc 100644 --- a/docker/cross-files/aarch64-clang-16-ccache.cross +++ b/docker/cross-files/aarch64-clang-16-ccache.cross @@ -8,8 +8,8 @@ ld = 'llvm-ld-16' exe_wrapper = ['qemu-aarch64-static', '-L', '/usr/aarch64-linux-gnu'] [properties] -c_args = ['--target=aarch64-linux-gnu', '-march=armv8-a+simd+crypto+crc', '-isystem=/usr/aarch64-linux-gnu/include', '-Weverything', '-fno-lax-vector-conversions', '-Werror', '-Wno-unsafe-buffer-usage'] -cpp_args = ['--target=aarch64-linux-gnu', '-march=armv8-a+simd+crypto+crc', '-isystem=/usr/aarch64-linux-gnu/include', '-Weverything', '-fno-lax-vector-conversions', '-Werror', '-Wno-unsafe-buffer-usage'] +c_args = ['--target=aarch64-linux-gnu', '-march=armv8-a+simd+crypto+crc+bf16', '-isystem=/usr/aarch64-linux-gnu/include', '-Weverything', '-fno-lax-vector-conversions', '-Werror', '-Wno-unsafe-buffer-usage'] +cpp_args = ['--target=aarch64-linux-gnu', '-march=armv8-a+simd+crypto+crc+bf16', '-isystem=/usr/aarch64-linux-gnu/include', '-Weverything', '-fno-lax-vector-conversions', '-Werror', '-Wno-unsafe-buffer-usage'] c_link_args = ['--target=aarch64-linux-gnu'] cpp_link_args = ['--target=aarch64-linux-gnu'] diff --git a/docker/cross-files/aarch64-gcc-12-ccache.cross b/docker/cross-files/aarch64-gcc-12-ccache.cross index 20d8c3550..31afe26f7 100644 --- a/docker/cross-files/aarch64-gcc-12-ccache.cross +++ b/docker/cross-files/aarch64-gcc-12-ccache.cross @@ -8,8 +8,8 @@ ld = 'aarch64-linux-gnu-ld' exe_wrapper = ['qemu-aarch64-static', '-L', '/usr/aarch64-linux-gnu'] [properties] -c_args = ['-march=armv8-a+simd+crypto+crc', '-Wextra', '-Werror'] -cpp_args = ['-march=armv8-a+simd+crypto+crc', '-Wextra', '-Werror'] +c_args = ['-march=armv8.2-a+simd+crypto+crc+bf16', '-Wextra', '-Werror'] +cpp_args = ['-march=armv8.2-a+simd+crypto+crc+bf16', '-Wextra', '-Werror'] [host_machine] system = 'linux' diff --git a/meson.build b/meson.build index 2f215eba0..0ae187896 100644 --- a/meson.build +++ b/meson.build @@ -481,6 +481,7 @@ if not meson.is_subproject() 'simde/simde-aes.h', 'simde/simde-align.h', 'simde/simde-arch.h', + 'simde/simde-bf16.h', 'simde/simde-common.h', 'simde/simde-constify.h', 'simde/simde-detect-clang.h', diff --git a/simde/arm/neon/combine.h b/simde/arm/neon/combine.h index a2b01ffe6..1a9218784 100644 --- a/simde/arm/neon/combine.h +++ b/simde/arm/neon/combine.h @@ -442,6 +442,31 @@ simde_vcombine_p64(simde_poly64x1_t low, simde_poly64x1_t high) { #define vcombine_p64(low, high) simde_vcombine_p64((low), (high)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vcombine_bf16(simde_bfloat16x4_t low, simde_bfloat16x4_t high) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vcombine_bf16(low, high); + #else + simde_bfloat16x8_private r_; + simde_bfloat16x4_private + low_ = simde_bfloat16x4_to_private(low), + high_ = simde_bfloat16x4_to_private(high); + + size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2; + SIMDE_VECTORIZE + for (size_t i = 0 ; i < halfway ; i++) { + r_.values[i] = low_.values[i]; + r_.values[i + halfway] = high_.values[i]; + } + + return simde_bfloat16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vcombine_bf16 + #define vcombine_bf16(low, high) simde_vcombine_bf16((low), (high)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/copy_lane.h b/simde/arm/neon/copy_lane.h index 174962f5e..7195c8076 100644 --- a/simde/arm/neon/copy_lane.h +++ b/simde/arm/neon/copy_lane.h @@ -1100,6 +1100,83 @@ simde_vcopyq_laneq_p64(simde_poly64x2_t a, const int lane1, simde_poly64x2_t b, #define vcopyq_laneq_p64(a, lane1, b, lane2) simde_vcopyq_laneq_p64((a), (lane1), (b), (lane2)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vcopy_lane_bf16(simde_bfloat16x4_t a, const int lane1, simde_bfloat16x4_t b, const int lane2) + SIMDE_REQUIRE_CONSTANT_RANGE(lane1, 0, 3) + SIMDE_REQUIRE_CONSTANT_RANGE(lane2, 0, 3) { + simde_bfloat16x4_private + b_ = simde_bfloat16x4_to_private(b), + r_ = simde_bfloat16x4_to_private(a); + + r_.values[lane1] = b_.values[lane2]; + return simde_bfloat16x4_from_private(r_); +} +#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + #define simde_vcopy_lane_bf16(a, lane1, b, lane2) vcopy_lane_bf16((a), (lane1), (b), (lane2)) +#endif +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vcopy_lane_bf16 + #define vcopy_lane_bf16(a, lane1, b, lane2) simde_vcopy_lane_bf16((a), (lane1), (b), (lane2)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vcopy_laneq_bf16(simde_bfloat16x4_t a, const int lane1, simde_bfloat16x8_t b, const int lane2) + SIMDE_REQUIRE_CONSTANT_RANGE(lane1, 0, 3) + SIMDE_REQUIRE_CONSTANT_RANGE(lane2, 0, 7) { + simde_bfloat16x4_private r_ = simde_bfloat16x4_to_private(a); + simde_bfloat16x8_private b_ = simde_bfloat16x8_to_private(b); + + r_.values[lane1] = b_.values[lane2]; + return simde_bfloat16x4_from_private(r_); +} +#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + #define simde_vcopy_laneq_bf16(a, lane1, b, lane2) vcopy_laneq_bf16((a), (lane1), (b), (lane2)) +#endif +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vcopy_laneq_bf16 + #define vcopy_laneq_bf16(a, lane1, b, lane2) simde_vcopy_laneq_bf16((a), (lane1), (b), (lane2)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vcopyq_lane_bf16(simde_bfloat16x8_t a, const int lane1, simde_bfloat16x4_t b, const int lane2) + SIMDE_REQUIRE_CONSTANT_RANGE(lane1, 0, 7) + SIMDE_REQUIRE_CONSTANT_RANGE(lane2, 0, 3) { + simde_bfloat16x4_private b_ = simde_bfloat16x4_to_private(b); + simde_bfloat16x8_private r_ = simde_bfloat16x8_to_private(a); + + r_.values[lane1] = b_.values[lane2]; + return simde_bfloat16x8_from_private(r_); +} +#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + #define simde_vcopyq_lane_bf16(a, lane1, b, lane2) vcopyq_lane_bf16((a), (lane1), (b), (lane2)) +#endif +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vcopyq_lane_bf16 + #define vcopyq_lane_bf16(a, lane1, b, lane2) simde_vcopyq_lane_bf16((a), (lane1), (b), (lane2)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vcopyq_laneq_bf16(simde_bfloat16x8_t a, const int lane1, simde_bfloat16x8_t b, const int lane2) + SIMDE_REQUIRE_CONSTANT_RANGE(lane1, 0, 7) + SIMDE_REQUIRE_CONSTANT_RANGE(lane2, 0, 7) { + simde_bfloat16x8_private + b_ = simde_bfloat16x8_to_private(b), + r_ = simde_bfloat16x8_to_private(a); + + r_.values[lane1] = b_.values[lane2]; + return simde_bfloat16x8_from_private(r_); +} +#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + #define simde_vcopyq_laneq_bf16(a, lane1, b, lane2) vcopyq_laneq_bf16((a), (lane1), (b), (lane2)) +#endif +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vcopyq_laneq_bf16 + #define vcopyq_laneq_bf16(a, lane1, b, lane2) simde_vcopyq_laneq_bf16((a), (lane1), (b), (lane2)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/create.h b/simde/arm/neon/create.h index 3aaf70744..5954922bb 100644 --- a/simde/arm/neon/create.h +++ b/simde/arm/neon/create.h @@ -26,8 +26,6 @@ * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ -/* Yi-Yen Chung: Added vcreate_f16 */ - #if !defined(SIMDE_ARM_NEON_CREATE_H) #define SIMDE_ARM_NEON_CREATE_H @@ -235,6 +233,19 @@ simde_vcreate_p64(simde_poly64_t a) { #define vcreate_p64(a) simde_vcreate_p64(a) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vcreate_bf16(uint64_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vcreate_bf16(a); + #else + return simde_vreinterpret_bf16_u64(simde_vdup_n_u64(a)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vcreate_bf16 + #define vcreate_bf16(a) simde_vcreate_bf16(a) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/cvt.h b/simde/arm/neon/cvt.h index 682e652c8..6a31353e8 100644 --- a/simde/arm/neon/cvt.h +++ b/simde/arm/neon/cvt.h @@ -2068,6 +2068,170 @@ simde_vcvtx_high_f32_f64(simde_float32x2_t r, simde_float64x2_t a) { #define vcvtx_high_f32_f64(r, a) simde_vcvtx_high_f32_f64((r), (a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vcvt_bf16_f32(simde_float32x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vcvt_bf16_f32(a); + #else + simde_float32x4_private a_ = simde_float32x4_to_private(a); + simde_bfloat16x4_private r_; + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_bfloat16_from_float32(a_.values[i]); + } + + return simde_bfloat16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vcvt_bf16_f32 + #define vcvt_bf16_f32(a) simde_vcvt_bf16_f32(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x4_t +simde_vcvt_f32_bf16(simde_bfloat16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vcvt_f32_bf16(a); + #else + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_float32x4_private r_; + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_bfloat16_to_float32(a_.values[i]); + } + + return simde_float32x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vcvt_f32_bf16 + #define vcvt_f32_bf16(a) simde_vcvt_f32_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float32_t +simde_vcvtah_f32_bf16(simde_bfloat16_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vcvtah_f32_bf16(a); + #else + return simde_bfloat16_to_float32(a); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vcvtah_f32_bf16 + #define vcvtah_f32_bf16(a) simde_vcvtah_f32_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16_t +simde_vcvth_bf16_f32(float a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vcvth_bf16_f32(a); + #else + return simde_bfloat16_from_float32(a); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vcvth_bf16_f32 + #define vcvth_bf16_f32(a) simde_vcvth_bf16_f32(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x4_t +simde_vcvtq_low_f32_bf16(simde_bfloat16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vcvtq_low_f32_bf16(a); + #else + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_float32x4_private r_; + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_bfloat16_to_float32(a_.values[i]); + } + + return simde_float32x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vcvtq_low_f32_bf16 + #define vcvtq_low_f32_bf16(a) simde_vcvtq_low_f32_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x4_t +simde_vcvtq_high_f32_bf16(simde_bfloat16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vcvtq_high_f32_bf16(a); + #else + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_float32x4_private r_; + + size_t rsize = (sizeof(r_.values) / sizeof(r_.values[0])); + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_bfloat16_to_float32(a_.values[i + rsize]); + } + + return simde_float32x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vcvtq_high_f32_bf16 + #define vcvtq_high_f32_bf16(a) simde_vcvtq_high_f32_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vcvtq_low_bf16_f32(simde_float32x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vcvtq_low_bf16_f32(a); + #else + simde_float32x4_private a_ = simde_float32x4_to_private(a); + simde_bfloat16x8_private r_; + + size_t asize = (sizeof(a_.values) / sizeof(a_.values[0])); + SIMDE_VECTORIZE + for (size_t i = 0 ; i < asize; i++) { + r_.values[i] = simde_bfloat16_from_float32(a_.values[i]); + r_.values[i + asize] = SIMDE_BFLOAT16_VALUE(0.0); + } + + return simde_bfloat16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vcvtq_low_bf16_f32 + #define vcvtq_low_bf16_f32(a) simde_vcvtq_low_bf16_f32(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vcvtq_high_bf16_f32(simde_bfloat16x8_t inactive, simde_float32x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vcvtq_high_bf16_f32(inactive, a); + #else + simde_bfloat16x8_private inactive_ = simde_bfloat16x8_to_private(inactive); + simde_float32x4_private a_ = simde_float32x4_to_private(a); + simde_bfloat16x8_private r_; + + size_t asize = (sizeof(a_.values) / sizeof(a_.values[0])); + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) { + r_.values[i] = inactive_.values[i]; + r_.values[i + asize] = simde_bfloat16_from_float32(a_.values[i]); + } + return simde_bfloat16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vcvtq_high_bf16_f32 + #define vcvtq_high_bf16_f32(inactive, a) simde_vcvtq_high_bf16_f32((inactive), (a)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/dot.h b/simde/arm/neon/dot.h index fa7febe03..5399a2ee5 100644 --- a/simde/arm/neon/dot.h +++ b/simde/arm/neon/dot.h @@ -67,7 +67,7 @@ simde_vdot_s32(simde_int32x2_t r, simde_int8x8_t a, simde_int8x8_t b) { return simde_vadd_s32(r, simde_int32x2_from_private(r_)); #endif } -#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) || (defined(SIMDE_ENABLE_NATIVE_ALIASES) && !defined(__ARM_FEATURE_DOTPROD)) +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) #undef vdot_s32 #define vdot_s32(r, a, b) simde_vdot_s32((r), (a), (b)) #endif @@ -97,7 +97,7 @@ simde_vdot_u32(simde_uint32x2_t r, simde_uint8x8_t a, simde_uint8x8_t b) { return simde_vadd_u32(r, simde_uint32x2_from_private(r_)); #endif } -#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) || (defined(SIMDE_ENABLE_NATIVE_ALIASES) && !defined(__ARM_FEATURE_DOTPROD)) +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) #undef vdot_u32 #define vdot_u32(r, a, b) simde_vdot_u32((r), (a), (b)) #endif @@ -128,7 +128,7 @@ simde_vdotq_s32(simde_int32x4_t r, simde_int8x16_t a, simde_int8x16_t b) { return simde_vaddq_s32(r, simde_int32x4_from_private(r_)); #endif } -#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) || (defined(SIMDE_ENABLE_NATIVE_ALIASES) && !defined(__ARM_FEATURE_DOTPROD)) +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) #undef vdotq_s32 #define vdotq_s32(r, a, b) simde_vdotq_s32((r), (a), (b)) #endif @@ -159,11 +159,64 @@ simde_vdotq_u32(simde_uint32x4_t r, simde_uint8x16_t a, simde_uint8x16_t b) { return simde_vaddq_u32(r, simde_uint32x4_from_private(r_)); #endif } -#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) || (defined(SIMDE_ENABLE_NATIVE_ALIASES) && !defined(__ARM_FEATURE_DOTPROD)) +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) #undef vdotq_u32 #define vdotq_u32(r, a, b) simde_vdotq_u32((r), (a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x2_t +simde_vbfdot_f32(simde_float32x2_t r, simde_bfloat16x4_t a, simde_bfloat16x4_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && \ + defined(SIMDE_ARM_NEON_BF16) + return vbfdot_f32(r, a, b); + #else + simde_float32x2_private r_ = simde_float32x2_to_private(r); + simde_bfloat16x4_private + a_ = simde_bfloat16x4_to_private(a), + b_ = simde_bfloat16x4_to_private(b); + + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + simde_float32_t elt1_a = simde_bfloat16_to_float32(a_.values[2 * i + 0]); + simde_float32_t elt1_b = simde_bfloat16_to_float32(a_.values[2 * i + 1]); + simde_float32_t elt2_a = simde_bfloat16_to_float32(b_.values[2 * i + 0]); + simde_float32_t elt2_b = simde_bfloat16_to_float32(b_.values[2 * i + 1]); + r_.values[i] = r_.values[i] + elt1_a * elt2_a + elt1_b * elt2_b; + } + return simde_float32x2_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vbfdot_f32 + #define vbfdot_f32(r, a, b) simde_vbfdot_f32((r), (a), (b)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x4_t +simde_vbfdotq_f32(simde_float32x4_t r, simde_bfloat16x8_t a, simde_bfloat16x8_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(__ARM_FEATURE_DOTPROD) && \ + defined(SIMDE_ARM_NEON_BF16) + return vbfdotq_f32(r, a, b); + #else + simde_float32x4_private r_ = simde_float32x4_to_private(r); + simde_bfloat16x8_private + a_ = simde_bfloat16x8_to_private(a), + b_ = simde_bfloat16x8_to_private(b); + + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + simde_float32_t elt1_a = simde_bfloat16_to_float32(a_.values[2 * i + 0]); + simde_float32_t elt1_b = simde_bfloat16_to_float32(a_.values[2 * i + 1]); + simde_float32_t elt2_a = simde_bfloat16_to_float32(b_.values[2 * i + 0]); + simde_float32_t elt2_b = simde_bfloat16_to_float32(b_.values[2 * i + 1]); + r_.values[i] = r_.values[i] + elt1_a * elt2_a + elt1_b * elt2_b; + } + return simde_float32x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vbfdotq_f32 + #define vbfdotq_f32(r, a, b) simde_vbfdotq_f32((r), (a), (b)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/dot_lane.h b/simde/arm/neon/dot_lane.h index 1ed7ccb34..c2fc1c459 100644 --- a/simde/arm/neon/dot_lane.h +++ b/simde/arm/neon/dot_lane.h @@ -86,7 +86,7 @@ simde_vdot_lane_s32(simde_int32x2_t r, simde_int8x8_t a, simde_int8x8_t b, const return result; } -#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) || (defined(SIMDE_ENABLE_NATIVE_ALIASES) && !defined(__ARM_FEATURE_DOTPROD)) +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) #undef vdot_lane_s32 #define vdot_lane_s32(r, a, b, lane) simde_vdot_lane_s32((r), (a), (b), (lane)) #endif @@ -137,7 +137,7 @@ simde_vdot_lane_u32(simde_uint32x2_t r, simde_uint8x8_t a, simde_uint8x8_t b, co return result; } -#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) || (defined(SIMDE_ENABLE_NATIVE_ALIASES) && !defined(__ARM_FEATURE_DOTPROD)) +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) #undef vdot_lane_u32 #define vdot_lane_u32(r, a, b, lane) simde_vdot_lane_u32((r), (a), (b), (lane)) #endif @@ -186,7 +186,7 @@ simde_vdot_laneq_s32(simde_int32x2_t r, simde_int8x8_t a, simde_int8x16_t b, con return result; } -#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) || (defined(SIMDE_ENABLE_NATIVE_ALIASES) && !defined(__ARM_FEATURE_DOTPROD)) +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) #undef vdot_laneq_s32 #define vdot_laneq_s32(r, a, b, lane) simde_vdot_laneq_s32((r), (a), (b), (lane)) #endif @@ -234,7 +234,7 @@ simde_vdot_laneq_u32(simde_uint32x2_t r, simde_uint8x8_t a, simde_uint8x16_t b, #endif return result; } -#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) || (defined(SIMDE_ENABLE_NATIVE_ALIASES) && !defined(__ARM_FEATURE_DOTPROD)) +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) #undef vdot_laneq_u32 #define vdot_laneq_u32(r, a, b, lane) simde_vdot_laneq_u32((r), (a), (b), (lane)) #endif @@ -296,7 +296,7 @@ simde_vdotq_laneq_u32(simde_uint32x4_t r, simde_uint8x16_t a, simde_uint8x16_t b #endif return result; } -#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) || (defined(SIMDE_ENABLE_NATIVE_ALIASES) && !defined(__ARM_FEATURE_DOTPROD)) +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) #undef vdotq_laneq_u32 #define vdotq_laneq_u32(r, a, b, lane) simde_vdotq_laneq_u32((r), (a), (b), (lane)) #endif @@ -358,7 +358,7 @@ simde_vdotq_laneq_s32(simde_int32x4_t r, simde_int8x16_t a, simde_int8x16_t b, c #endif return result; } -#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) || (defined(SIMDE_ENABLE_NATIVE_ALIASES) && !defined(__ARM_FEATURE_DOTPROD)) +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) #undef vdotq_laneq_s32 #define vdotq_laneq_s32(r, a, b, lane) simde_vdotq_laneq_s32((r), (a), (b), (lane)) #endif @@ -419,7 +419,7 @@ simde_vdotq_lane_u32(simde_uint32x4_t r, simde_uint8x16_t a, simde_uint8x8_t b, #endif return result; } -#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) || (defined(SIMDE_ENABLE_NATIVE_ALIASES) && !defined(__ARM_FEATURE_DOTPROD)) +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) #undef vdotq_lane_u32 #define vdotq_lane_u32(r, a, b, lane) simde_vdotq_lane_u32((r), (a), (b), (lane)) #endif @@ -480,11 +480,136 @@ simde_vdotq_lane_s32(simde_int32x4_t r, simde_int8x16_t a, simde_int8x8_t b, con #endif return result; } -#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) || (defined(SIMDE_ENABLE_NATIVE_ALIASES) && !defined(__ARM_FEATURE_DOTPROD)) +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) #undef vdotq_lane_s32 #define vdotq_lane_s32(r, a, b, lane) simde_vdotq_lane_s32((r), (a), (b), (lane)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x2_t +simde_vbfdot_lane_f32(simde_float32x2_t r, simde_bfloat16x4_t a, simde_bfloat16x4_t b, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 1) { + simde_float32x2_t result; + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(__ARM_FEATURE_DOTPROD) && \ + defined(SIMDE_ARM_NEON_BF16) + SIMDE_CONSTIFY_2_(vbfdot_lane_f32, result, (HEDLEY_UNREACHABLE(), result), lane, r, a, b); + #else + simde_float32x2_private r_ = simde_float32x2_to_private(r); + simde_bfloat16x4_private + a_ = simde_bfloat16x4_to_private(a), + b_ = simde_bfloat16x4_to_private(b); + + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + simde_float32_t elt1_a = simde_bfloat16_to_float32(a_.values[2 * i + 0]); + simde_float32_t elt1_b = simde_bfloat16_to_float32(a_.values[2 * i + 1]); + simde_float32_t elt2_a = simde_bfloat16_to_float32(b_.values[2 * lane + 0]); + simde_float32_t elt2_b = simde_bfloat16_to_float32(b_.values[2 * lane + 1]); + r_.values[i] = r_.values[i] + elt1_a * elt2_a + elt1_b * elt2_b; + } + + result = simde_float32x2_from_private(r_); + #endif + + return result; +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vbfdot_lane_f32 + #define vbfdot_lane_f32(r, a, b, lane) simde_vbfdot_lane_f32((r), (a), (b), (lane)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x4_t +simde_vbfdotq_lane_f32(simde_float32x4_t r, simde_bfloat16x8_t a, simde_bfloat16x4_t b, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 1) { + simde_float32x4_t result; + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(__ARM_FEATURE_DOTPROD) && \ + defined(SIMDE_ARM_NEON_BF16) + SIMDE_CONSTIFY_2_(vbfdotq_lane_f32, result, (HEDLEY_UNREACHABLE(), result), lane, r, a, b); + #else + simde_float32x4_private r_ = simde_float32x4_to_private(r); + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_bfloat16x4_private b_ = simde_bfloat16x4_to_private(b); + + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + simde_float32_t elt1_a = simde_bfloat16_to_float32(a_.values[2 * i + 0]); + simde_float32_t elt1_b = simde_bfloat16_to_float32(a_.values[2 * i + 1]); + simde_float32_t elt2_a = simde_bfloat16_to_float32(b_.values[2 * lane + 0]); + simde_float32_t elt2_b = simde_bfloat16_to_float32(b_.values[2 * lane + 1]); + r_.values[i] = r_.values[i] + elt1_a * elt2_a + elt1_b * elt2_b; + } + + result = simde_float32x4_from_private(r_); + #endif + + return result; +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vbfdotq_lane_f32 + #define vbfdotq_lane_f32(r, a, b, lane) simde_vbfdotq_lane_f32((r), (a), (b), (lane)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x2_t +simde_vbfdot_laneq_f32(simde_float32x2_t r, simde_bfloat16x4_t a, simde_bfloat16x8_t b, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 3) { + simde_float32x2_t result; + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(__ARM_FEATURE_DOTPROD) && \ + defined(SIMDE_ARM_NEON_BF16) + SIMDE_CONSTIFY_4_(vbfdot_laneq_f32, result, (HEDLEY_UNREACHABLE(), result), lane, r, a, b); + #else + simde_float32x2_private r_ = simde_float32x2_to_private(r); + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_bfloat16x8_private b_ = simde_bfloat16x8_to_private(b); + + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + simde_float32_t elt1_a = simde_bfloat16_to_float32(a_.values[2 * i + 0]); + simde_float32_t elt1_b = simde_bfloat16_to_float32(a_.values[2 * i + 1]); + simde_float32_t elt2_a = simde_bfloat16_to_float32(b_.values[2 * lane + 0]); + simde_float32_t elt2_b = simde_bfloat16_to_float32(b_.values[2 * lane + 1]); + r_.values[i] = r_.values[i] + elt1_a * elt2_a + elt1_b * elt2_b; + } + + result = simde_float32x2_from_private(r_); + #endif + + return result; +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vbfdot_laneq_f32 + #define vbfdot_laneq_f32(r, a, b, lane) simde_vbfdot_laneq_f32((r), (a), (b), (lane)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x4_t +simde_vbfdotq_laneq_f32(simde_float32x4_t r, simde_bfloat16x8_t a, simde_bfloat16x8_t b, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 3) { + simde_float32x4_t result; + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(__ARM_FEATURE_DOTPROD) && \ + defined(SIMDE_ARM_NEON_BF16) + SIMDE_CONSTIFY_4_(vbfdotq_laneq_f32, result, (HEDLEY_UNREACHABLE(), result), lane, r, a, b); + #else + simde_float32x4_private r_ = simde_float32x4_to_private(r); + simde_bfloat16x8_private + a_ = simde_bfloat16x8_to_private(a), + b_ = simde_bfloat16x8_to_private(b); + + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + simde_float32_t elt1_a = simde_bfloat16_to_float32(a_.values[2 * i + 0]); + simde_float32_t elt1_b = simde_bfloat16_to_float32(a_.values[2 * i + 1]); + simde_float32_t elt2_a = simde_bfloat16_to_float32(b_.values[2 * lane + 0]); + simde_float32_t elt2_b = simde_bfloat16_to_float32(b_.values[2 * lane + 1]); + r_.values[i] = r_.values[i] + elt1_a * elt2_a + elt1_b * elt2_b; + } + + result = simde_float32x4_from_private(r_); + #endif + + return result; +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vbfdotq_laneq_f32 + #define vbfdotq_laneq_f32(r, a, b, lane) simde_vbfdotq_laneq_f32((r), (a), (b), (lane)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/dup_lane.h b/simde/arm/neon/dup_lane.h index d4beea271..44db662be 100644 --- a/simde/arm/neon/dup_lane.h +++ b/simde/arm/neon/dup_lane.h @@ -1612,6 +1612,86 @@ simde_vduph_laneq_p16(simde_poly16x8_t vec, const int lane) #define vduph_laneq_p16(vec, lane) simde_vduph_laneq_p16((vec), (lane)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16_t +simde_vduph_lane_bf16(simde_bfloat16x4_t vec, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 3) { + return simde_bfloat16x4_to_private(vec).values[lane]; +} +#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + #define simde_vduph_lane_bf16(vec, lane) vduph_lane_bf16(vec, lane) +#endif +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vduph_lane_bf16 + #define vduph_lane_bf16(vec, lane) simde_vduph_lane_bf16((vec), (lane)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16_t +simde_vduph_laneq_bf16(simde_bfloat16x8_t vec, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 7) { + return simde_bfloat16x8_to_private(vec).values[lane]; +} +#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + #define simde_vduph_laneq_bf16(vec, lane) vduph_laneq_bf16(vec, lane) +#endif +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vduph_laneq_bf16 + #define vduph_laneq_bf16(vec, lane) simde_vduph_laneq_bf16((vec), (lane)) +#endif + +// simde_vdup_lane_bf16 +#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + #define simde_vdup_lane_bf16(vec, lane) vdup_lane_bf16(vec, lane) +#else + #define simde_vdup_lane_bf16(vec, lane) simde_vdup_n_bf16(simde_vduph_lane_bf16(vec, lane)) +#endif +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vdup_lane_bf16 + #define vdup_lane_bf16(vec, lane) simde_vdup_lane_bf16((vec), (lane)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vdup_laneq_bf16(simde_bfloat16x8_t vec, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 7) { + return simde_vdup_n_bf16(simde_bfloat16x8_to_private(vec).values[lane]); +} +#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) +#define simde_vdup_laneq_bf16(vec, lane) vdup_laneq_bf16(vec, lane) +#endif +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vdup_laneq_bf16 + #define vdup_laneq_bf16(vec, lane) simde_vdup_laneq_bf16((vec), (lane)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vdupq_lane_bf16(simde_bfloat16x4_t vec, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 3) { + return simde_vdupq_n_bf16(simde_bfloat16x4_to_private(vec).values[lane]); +} +#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) +#define simde_vdupq_lane_bf16(vec, lane) vdupq_lane_bf16(vec, lane) +#endif +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vdupq_lane_bf16 + #define vdupq_lane_bf16(vec, lane) simde_vdupq_lane_bf16((vec), (lane)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vdupq_laneq_bf16(simde_bfloat16x8_t vec, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 7) { + return simde_vdupq_n_bf16(simde_bfloat16x8_to_private(vec).values[lane]); +} +#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + #define simde_vdupq_laneq_bf16(vec, lane) vdupq_laneq_bf16(vec, lane) +#endif +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vdupq_laneq_bf16 + #define vdupq_laneq_bf16(vec, lane) simde_vdupq_laneq_bf16((vec), (lane)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/dup_n.h b/simde/arm/neon/dup_n.h index 1e491c4cb..365293edf 100644 --- a/simde/arm/neon/dup_n.h +++ b/simde/arm/neon/dup_n.h @@ -807,6 +807,47 @@ simde_vdupq_n_p64(simde_poly64_t value) { #define vdupq_n_p64(value) simde_vdupq_n_p64((value)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vdup_n_bf16(simde_bfloat16_t value) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vdup_n_bf16(value); + #else + simde_bfloat16x4_private r_; + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = value; + } + + return simde_bfloat16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vdup_n_bf16 + #define vdup_n_bf16(value) simde_vdup_n_bf16((value)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vdupq_n_bf16(simde_bfloat16_t value) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vdupq_n_bf16(value); + #else + simde_bfloat16x8_private r_; + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = value; + } + + return simde_bfloat16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vdupq_n_bf16 + #define vdupq_n_bf16(value) simde_vdupq_n_bf16((value)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/fmlal.h b/simde/arm/neon/fmlal.h index c9d3901a7..afe4afe9b 100644 --- a/simde/arm/neon/fmlal.h +++ b/simde/arm/neon/fmlal.h @@ -367,6 +367,159 @@ simde_vfmlalq_laneq_high_f16(simde_float32x4_t r, simde_float16x8_t a, simde_flo #define vfmlalq_laneq_high_f16(r, a, b, lane) simde_vfmlalq_laneq_high_f16((r), (a), (b), (lane)); #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x4_t +simde_vbfmlalbq_f32(simde_float32x4_t r, simde_bfloat16x8_t a, simde_bfloat16x8_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vbfmlalbq_f32(r, a, b); + #else + simde_float32x4_private + ret, + r_ = simde_float32x4_to_private(r); + simde_bfloat16x8_private + a_ = simde_bfloat16x8_to_private(a), + b_ = simde_bfloat16x8_to_private(b); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(ret.values) / sizeof(ret.values[0])) ; i++) { + ret.values[i] = r_.values[i] + + simde_bfloat16_to_float32(a_.values[i * 2]) * simde_bfloat16_to_float32(b_.values[i * 2]); + } + return simde_float32x4_from_private(ret); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vbfmlalbq_f32 + #define vbfmlalbq_f32(r, a, b) simde_vbfmlalbq_f32((r), (a), (b)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x4_t +simde_vbfmlaltq_f32(simde_float32x4_t r, simde_bfloat16x8_t a, simde_bfloat16x8_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vbfmlaltq_f32(r, a, b); + #else + simde_float32x4_private + ret, + r_ = simde_float32x4_to_private(r); + simde_bfloat16x8_private + a_ = simde_bfloat16x8_to_private(a), + b_ = simde_bfloat16x8_to_private(b); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(ret.values) / sizeof(ret.values[0])) ; i++) { + ret.values[i] = r_.values[i] + + simde_bfloat16_to_float32(a_.values[i * 2 + 1]) * simde_bfloat16_to_float32(b_.values[i * 2 + 1]); + } + return simde_float32x4_from_private(ret); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vbfmlaltq_f32 + #define vbfmlaltq_f32(r, a, b) simde_vbfmlaltq_f32((r), (a), (b)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x4_t +simde_vbfmlalbq_lane_f32(simde_float32x4_t r, simde_bfloat16x8_t a, simde_bfloat16x4_t b, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 3) { + simde_float32x4_private + ret, + r_ = simde_float32x4_to_private(r); + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_bfloat16x4_private b_ = simde_bfloat16x4_to_private(b); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(ret.values) / sizeof(ret.values[0])) ; i++) { + ret.values[i] = r_.values[i] + + simde_bfloat16_to_float32(a_.values[i * 2]) * simde_bfloat16_to_float32(b_.values[lane]); + } + return simde_float32x4_from_private(ret); +} +#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + #define simde_vbfmlalbq_lane_f32(r, a, b, lane) vbfmlalbq_lane_f32((r), (a), (b), (lane)) +#endif +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vbfmlalbq_lane_f32 + #define vbfmlalbq_lane_f32(r, a, b, lane) simde_vbfmlalbq_lane_f32((r), (a), (b), (lane)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x4_t +simde_vbfmlalbq_laneq_f32(simde_float32x4_t r, simde_bfloat16x8_t a, simde_bfloat16x8_t b, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 7) { + simde_float32x4_private + ret, + r_ = simde_float32x4_to_private(r); + simde_bfloat16x8_private + a_ = simde_bfloat16x8_to_private(a), + b_ = simde_bfloat16x8_to_private(b); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(ret.values) / sizeof(ret.values[0])) ; i++) { + ret.values[i] = r_.values[i] + + simde_bfloat16_to_float32(a_.values[i * 2]) * simde_bfloat16_to_float32(b_.values[lane]); + } + return simde_float32x4_from_private(ret); +} +#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + #define simde_vbfmlalbq_laneq_f32(r, a, b, lane) vbfmlalbq_laneq_f32((r), (a), (b), (lane)) +#endif +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vbfmlalbq_laneq_f32 + #define vbfmlalbq_laneq_f32(r, a, b, lane) simde_vbfmlalbq_laneq_f32((r), (a), (b), (lane)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x4_t +simde_vbfmlaltq_lane_f32(simde_float32x4_t r, simde_bfloat16x8_t a, simde_bfloat16x4_t b, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 3) { + simde_float32x4_private + ret, + r_ = simde_float32x4_to_private(r); + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_bfloat16x4_private b_ = simde_bfloat16x4_to_private(b); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(ret.values) / sizeof(ret.values[0])) ; i++) { + ret.values[i] = r_.values[i] + + simde_bfloat16_to_float32(a_.values[i * 2 + 1]) * simde_bfloat16_to_float32(b_.values[lane]); + } + return simde_float32x4_from_private(ret); +} +#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + #define simde_vbfmlaltq_lane_f32(r, a, b, lane) vbfmlaltq_lane_f32((r), (a), (b), (lane)) +#endif +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vbfmlaltq_lane_f32 + #define vbfmlaltq_lane_f32(r, a, b, lane) simde_vbfmlaltq_lane_f32((r), (a), (b), (lane)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x4_t +simde_vbfmlaltq_laneq_f32(simde_float32x4_t r, simde_bfloat16x8_t a, simde_bfloat16x8_t b, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 7) { + simde_float32x4_private + ret, + r_ = simde_float32x4_to_private(r); + simde_bfloat16x8_private + a_ = simde_bfloat16x8_to_private(a), + b_ = simde_bfloat16x8_to_private(b); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(ret.values) / sizeof(ret.values[0])) ; i++) { + ret.values[i] = r_.values[i] + + simde_bfloat16_to_float32(a_.values[i * 2 + 1]) * simde_bfloat16_to_float32(b_.values[lane]); + } + return simde_float32x4_from_private(ret); +} +#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + #define simde_vbfmlaltq_laneq_f32(r, a, b, lane) vbfmlaltq_laneq_f32((r), (a), (b), (lane)) +#endif +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vbfmlaltq_laneq_f32 + #define vbfmlaltq_laneq_f32(r, a, b, lane) simde_vbfmlaltq_laneq_f32((r), (a), (b), (lane)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/get_high.h b/simde/arm/neon/get_high.h index d64bcb897..df37cccca 100644 --- a/simde/arm/neon/get_high.h +++ b/simde/arm/neon/get_high.h @@ -383,6 +383,27 @@ simde_vget_high_p64(simde_poly64x2_t a) { #define vget_high_p64(a) simde_vget_high_p64((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vget_high_bf16(simde_bfloat16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vget_high_bf16(a); + #else + simde_bfloat16x4_private r_; + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = a_.values[i + (sizeof(r_.values) / sizeof(r_.values[0]))]; + } + + return simde_bfloat16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vget_high_bf16 + #define vget_high_bf16(a) simde_vget_high_bf16((a)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/get_lane.h b/simde/arm/neon/get_lane.h index af1b7689d..06040eb2c 100644 --- a/simde/arm/neon/get_lane.h +++ b/simde/arm/neon/get_lane.h @@ -669,6 +669,47 @@ simde_vgetq_lane_p64(simde_poly64x2_t v, const int lane) #define vgetq_lane_p64(v, lane) simde_vgetq_lane_p64((v), (lane)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16_t +simde_vget_lane_bf16(simde_bfloat16x4_t v, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 3) { + simde_bfloat16_t r; + + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + SIMDE_CONSTIFY_4_(vget_lane_bf16, r, (HEDLEY_UNREACHABLE(), SIMDE_BFLOAT16_VALUE(0.0)), lane, v); + #else + simde_bfloat16x4_private v_ = simde_bfloat16x4_to_private(v); + + r = v_.values[lane]; + #endif + + return r; +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vget_lane_bf16 + #define vget_lane_bf16(v, lane) simde_vget_lane_bf16((v), (lane)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16_t +simde_vgetq_lane_bf16(simde_bfloat16x8_t v, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 7) { + simde_bfloat16_t r; + + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + SIMDE_CONSTIFY_8_(vgetq_lane_bf16, r, (HEDLEY_UNREACHABLE(), SIMDE_BFLOAT16_VALUE(0.0)), lane, v); + #else + simde_bfloat16x8_private v_ = simde_bfloat16x8_to_private(v); + + r = v_.values[lane]; + #endif + + return r; +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vgetq_lane_bf16 + #define vgetq_lane_bf16(v, lane) simde_vgetq_lane_bf16((v), (lane)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/get_low.h b/simde/arm/neon/get_low.h index 74d63e736..4594a3064 100644 --- a/simde/arm/neon/get_low.h +++ b/simde/arm/neon/get_low.h @@ -415,6 +415,27 @@ simde_vget_low_p64(simde_poly64x2_t a) { #define vget_low_p64(a) simde_vget_low_p64((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vget_low_bf16(simde_bfloat16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vget_low_bf16(a); + #else + simde_bfloat16x4_private r_; + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = a_.values[i]; + } + + return simde_bfloat16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vget_low_bf16 + #define vget_low_bf16(a) simde_vget_low_bf16((a)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/ld1.h b/simde/arm/neon/ld1.h index 6fe6cbce2..51624a849 100644 --- a/simde/arm/neon/ld1.h +++ b/simde/arm/neon/ld1.h @@ -546,6 +546,37 @@ simde_vldrq_p128(simde_poly128_t const ptr[HEDLEY_ARRAY_PARAM(1)]) { #endif /* !defined(SIMDE_TARGET_NOT_SUPPORT_INT128_TYPE) */ +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vld1_bf16(simde_bfloat16_t const ptr[HEDLEY_ARRAY_PARAM(4)]) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld1_bf16(ptr); + #else + simde_bfloat16x4_private r_; + simde_memcpy(&r_, ptr, sizeof(r_)); + return simde_bfloat16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld1_bf16 + #define vld1_bf16(a) simde_vld1_bf16((a)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vld1q_bf16(simde_bfloat16_t const ptr[HEDLEY_ARRAY_PARAM(8)]) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld1q_bf16(ptr); + #else + simde_bfloat16x8_private r_; + simde_memcpy(&r_, ptr, sizeof(r_)); + return simde_bfloat16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld1q_bf16 + #define vld1q_bf16(a) simde_vld1q_bf16((a)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/ld1_dup.h b/simde/arm/neon/ld1_dup.h index 5e0acf2c7..cc15cf982 100644 --- a/simde/arm/neon/ld1_dup.h +++ b/simde/arm/neon/ld1_dup.h @@ -514,6 +514,33 @@ simde_vld1q_dup_p64(simde_poly64_t const * ptr) { #define vld1q_dup_p64(a) simde_vld1q_dup_p64((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vld1_dup_bf16(simde_bfloat16 const * ptr) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld1_dup_bf16(ptr); + #else + return simde_vdup_n_bf16(*ptr); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld1_dup_bf16 + #define vld1_dup_bf16(a) simde_vld1_dup_bf16((a)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vld1q_dup_bf16(simde_bfloat16 const * ptr) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld1q_dup_bf16(ptr); + #else + return simde_vdupq_n_bf16(*ptr); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld1q_dup_bf16 + #define vld1q_dup_bf16(a) simde_vld1q_dup_bf16((a)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/ld1_lane.h b/simde/arm/neon/ld1_lane.h index ce71fb969..5818ead64 100644 --- a/simde/arm/neon/ld1_lane.h +++ b/simde/arm/neon/ld1_lane.h @@ -488,6 +488,36 @@ simde_vld1q_lane_p64(simde_poly64_t const *ptr, simde_poly64x2_t src, #define vld1q_lane_p64(ptr, src, lane) simde_vld1q_lane_p64((ptr), (src), (lane)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t simde_vld1_lane_bf16(simde_bfloat16_t const *ptr, simde_bfloat16x4_t src, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 3) { + simde_bfloat16x4_private r = simde_bfloat16x4_to_private(src); + r.values[lane] = *ptr; + return simde_bfloat16x4_from_private(r); +} +#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + #define simde_vld1_lane_bf16(ptr, src, lane) vld1_lane_bf16(ptr, src, lane) +#endif +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld1_lane_bf16 + #define vld1_lane_bf16(ptr, src, lane) simde_vld1_lane_bf16((ptr), (src), (lane)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t simde_vld1q_lane_bf16(simde_bfloat16_t const *ptr, simde_bfloat16x8_t src, + const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 7) { + simde_bfloat16x8_private r = simde_bfloat16x8_to_private(src); + r.values[lane] = *ptr; + return simde_bfloat16x8_from_private(r); +} +#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + #define simde_vld1q_lane_bf16(ptr, src, lane) vld1q_lane_bf16(ptr, src, lane) +#endif +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld1q_lane_bf16 + #define vld1q_lane_bf16(ptr, src, lane) simde_vld1q_lane_bf16((ptr), (src), (lane)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/ld1_x2.h b/simde/arm/neon/ld1_x2.h index 5eba22b0f..237c28afb 100644 --- a/simde/arm/neon/ld1_x2.h +++ b/simde/arm/neon/ld1_x2.h @@ -357,6 +357,25 @@ simde_vld1_p64_x2(simde_poly64_t const ptr[HEDLEY_ARRAY_PARAM(2)]) { #define vld1_p64_x2(a) simde_vld1_p64_x2((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4x2_t +simde_vld1_bf16_x2(simde_bfloat16 const ptr[HEDLEY_ARRAY_PARAM(8)]) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld1_bf16_x2(ptr); + #else + simde_bfloat16x4_private a_[2]; + for (size_t i = 0; i < 8; i++) { + a_[i / 4].values[i % 4] = ptr[i]; + } + simde_bfloat16x4x2_t s_ = { { simde_bfloat16x4_from_private(a_[0]), + simde_bfloat16x4_from_private(a_[1]) } }; + return s_; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld1_bf16_x2 + #define vld1_bf16_x2(a) simde_vld1_bf16_x2((a)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/ld1_x3.h b/simde/arm/neon/ld1_x3.h index 153505574..f4616af4c 100644 --- a/simde/arm/neon/ld1_x3.h +++ b/simde/arm/neon/ld1_x3.h @@ -372,6 +372,26 @@ simde_vld1_p64_x3(simde_poly64_t const ptr[HEDLEY_ARRAY_PARAM(3)]) { #define vld1_p64_x3(a) simde_vld1_p64_x3((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4x3_t +simde_vld1_bf16_x3(simde_bfloat16 const ptr[HEDLEY_ARRAY_PARAM(12)]) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld1_bf16_x3(ptr); + #else + simde_bfloat16x4_private a_[3]; + for (size_t i = 0; i < 12; i++) { + a_[i / 4].values[i % 4] = ptr[i]; + } + simde_bfloat16x4x3_t s_ = { { simde_bfloat16x4_from_private(a_[0]), + simde_bfloat16x4_from_private(a_[1]), + simde_bfloat16x4_from_private(a_[2]) } }; + return s_; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld1_bf16_x3 + #define vld1_bf16_x3(a) simde_vld1_bf16_x3((a)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/ld1_x4.h b/simde/arm/neon/ld1_x4.h index 0c9bd7f67..b8b505aaf 100644 --- a/simde/arm/neon/ld1_x4.h +++ b/simde/arm/neon/ld1_x4.h @@ -387,6 +387,27 @@ simde_vld1_p64_x4(simde_poly64_t const ptr[HEDLEY_ARRAY_PARAM(4)]) { #define vld1_p64_x4(a) simde_vld1_p64_x4((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4x4_t +simde_vld1_bf16_x4(simde_bfloat16 const ptr[HEDLEY_ARRAY_PARAM(16)]) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld1_bf16_x4(ptr); + #else + simde_bfloat16x4_private a_[4]; + for (size_t i = 0; i < 16; i++) { + a_[i / 4].values[i % 4] = ptr[i]; + } + simde_bfloat16x4x4_t s_ = { { simde_bfloat16x4_from_private(a_[0]), + simde_bfloat16x4_from_private(a_[1]), + simde_bfloat16x4_from_private(a_[2]), + simde_bfloat16x4_from_private(a_[3]) } }; + return s_; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld1_bf16_x4 + #define vld1_bf16_x4(a) simde_vld1_bf16_x4((a)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/ld1q_x2.h b/simde/arm/neon/ld1q_x2.h index 0560daddf..25453d97c 100644 --- a/simde/arm/neon/ld1q_x2.h +++ b/simde/arm/neon/ld1q_x2.h @@ -361,6 +361,26 @@ simde_vld1q_p64_x2(simde_poly64_t const ptr[HEDLEY_ARRAY_PARAM(4)]) { #define vld1q_p64_x2(a) simde_vld1q_p64_x2((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8x2_t +simde_vld1q_bf16_x2(simde_bfloat16 const ptr[HEDLEY_ARRAY_PARAM(16)]) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld1q_bf16_x2(ptr); + #else + simde_bfloat16x8_private a_[2]; + for (size_t i = 0; i < 16; i++) { + a_[i / 8].values[i % 8] = ptr[i]; + } + simde_bfloat16x8x2_t s_ = { { simde_bfloat16x8_from_private(a_[0]), + simde_bfloat16x8_from_private(a_[1]) } }; + return s_; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld1q_bf16_x2 + #define vld1q_bf16_x2(a) simde_vld1q_bf16_x2((a)) +#endif + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/ld1q_x3.h b/simde/arm/neon/ld1q_x3.h index 636ee4b7d..d819ed900 100644 --- a/simde/arm/neon/ld1q_x3.h +++ b/simde/arm/neon/ld1q_x3.h @@ -373,6 +373,26 @@ simde_vld1q_p64_x3(simde_poly64_t const ptr[HEDLEY_ARRAY_PARAM(3)]) { #define vld1q_p64_x3(a) simde_vld1q_p64_x3((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8x3_t +simde_vld1q_bf16_x3(simde_bfloat16 const ptr[HEDLEY_ARRAY_PARAM(24)]) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld1q_bf16_x3(ptr); + #else + simde_bfloat16x8_private a_[3]; + for (size_t i = 0; i < 24; i++) { + a_[i / 8].values[i % 8] = ptr[i]; + } + simde_bfloat16x8x3_t s_ = { { simde_bfloat16x8_from_private(a_[0]), + simde_bfloat16x8_from_private(a_[1]), + simde_bfloat16x8_from_private(a_[2]) } }; + return s_; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld1q_bf16_x3 + #define vld1q_bf16_x3(a) simde_vld1q_bf16_x3((a)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/ld1q_x4.h b/simde/arm/neon/ld1q_x4.h index 7be67b773..9c64e6895 100644 --- a/simde/arm/neon/ld1q_x4.h +++ b/simde/arm/neon/ld1q_x4.h @@ -388,6 +388,27 @@ simde_vld1q_p64_x4(simde_poly64_t const ptr[HEDLEY_ARRAY_PARAM(8)]) { #define vld1q_p64_x4(a) simde_vld1q_p64_x4((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8x4_t +simde_vld1q_bf16_x4(simde_bfloat16 const ptr[HEDLEY_ARRAY_PARAM(32)]) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld1q_bf16_x4(ptr); + #else + simde_bfloat16x8_private a_[4]; + for (size_t i = 0; i < 32; i++) { + a_[i / 8].values[i % 8] = ptr[i]; + } + simde_bfloat16x8x4_t s_ = { { simde_bfloat16x8_from_private(a_[0]), + simde_bfloat16x8_from_private(a_[1]), + simde_bfloat16x8_from_private(a_[2]), + simde_bfloat16x8_from_private(a_[3]) } }; + return s_; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld1q_bf16_x4 + #define vld1q_bf16_x4(a) simde_vld1q_bf16_x4((a)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/ld2.h b/simde/arm/neon/ld2.h index 7316ff04a..8011790c6 100644 --- a/simde/arm/neon/ld2.h +++ b/simde/arm/neon/ld2.h @@ -1013,6 +1013,59 @@ simde_vld2q_p64(simde_poly64_t const ptr[HEDLEY_ARRAY_PARAM(4)]) { #define vld2q_p64(a) simde_vld2q_p64((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4x2_t +simde_vld2_bf16(simde_bfloat16_t const ptr[HEDLEY_ARRAY_PARAM(8)]) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld2_bf16(ptr); + #else + simde_bfloat16x4_private r_[2]; + + for (size_t i = 0 ; i < (sizeof(r_) / sizeof(r_[0])) ; i++) { + for (size_t j = 0 ; j < (sizeof(r_[0].values) / sizeof(r_[0].values[0])) ; j++) { + r_[i].values[j] = ptr[i + (j * (sizeof(r_) / sizeof(r_[0])))]; + } + } + + simde_bfloat16x4x2_t r = { { + simde_bfloat16x4_from_private(r_[0]), + simde_bfloat16x4_from_private(r_[1]), + } }; + + return r; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld2_bf16 + #define vld2_bf16(a) simde_vld2_bf16((a)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8x2_t +simde_vld2q_bf16(simde_bfloat16_t const ptr[HEDLEY_ARRAY_PARAM(16)]) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld2q_bf16(ptr); + #else + simde_bfloat16x8_private r_[2]; + + for (size_t i = 0 ; i < (sizeof(r_) / sizeof(r_[0])); i++) { + for (size_t j = 0 ; j < (sizeof(r_[0].values) / sizeof(r_[0].values[0])) ; j++) { + r_[i].values[j] = ptr[i + (j * (sizeof(r_) / sizeof(r_[0])))]; + } + } + + simde_bfloat16x8x2_t r = { { + simde_bfloat16x8_from_private(r_[0]), + simde_bfloat16x8_from_private(r_[1]), + } }; + + return r; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld2q_bf16 + #define vld2q_bf16(a) simde_vld2q_bf16((a)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/ld2_dup.h b/simde/arm/neon/ld2_dup.h index d0eff607a..f5e5d2cac 100644 --- a/simde/arm/neon/ld2_dup.h +++ b/simde/arm/neon/ld2_dup.h @@ -568,6 +568,43 @@ simde_vld2q_dup_p64(simde_poly64_t const * ptr) { #define vld2q_dup_p64(a) simde_vld2q_dup_p64((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4x2_t +simde_vld2_dup_bf16(simde_bfloat16_t const ptr[HEDLEY_ARRAY_PARAM(2)]) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld2_dup_bf16(ptr); + #else + simde_bfloat16x4x2_t r; + + for (size_t i = 0 ; i < 2 ; i++) { + r.val[i] = simde_vdup_n_bf16(ptr[i]); + } + return r; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld2_dup_bf16 + #define vld2_dup_bf16(a) simde_vld2_dup_bf16((a)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8x2_t +simde_vld2q_dup_bf16(simde_bfloat16 const * ptr) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld2q_dup_bf16(ptr); + #else + simde_bfloat16x8x2_t r; + + for (size_t i = 0 ; i < 2 ; i++) { + r.val[i] = simde_vdupq_n_bf16(ptr[i]); + } + return r; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld2q_dup_bf16 + #define vld2q_dup_bf16(a) simde_vld2q_dup_bf16((a)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/ld2_lane.h b/simde/arm/neon/ld2_lane.h index 95784fbe8..f2c2a1a4d 100644 --- a/simde/arm/neon/ld2_lane.h +++ b/simde/arm/neon/ld2_lane.h @@ -592,6 +592,45 @@ simde_poly64x2x2_t simde_vld2q_lane_p64(simde_poly64_t const ptr[HEDLEY_ARRAY_PA #define vld2q_lane_p64(ptr, src, lane) simde_vld2q_lane_p64((ptr), (src), (lane)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4x2_t simde_vld2_lane_bf16(simde_bfloat16_t const ptr[HEDLEY_ARRAY_PARAM(2)], simde_bfloat16x4x2_t src, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 3) { + simde_bfloat16x4x2_t r; + + for (size_t i = 0 ; i < 2 ; i++) { + simde_bfloat16x4_private tmp_ = simde_bfloat16x4_to_private(src.val[i]); + tmp_.values[lane] = ptr[i]; + r.val[i] = simde_bfloat16x4_from_private(tmp_); + } + return r; +} +#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + #define simde_vld2_lane_bf16(ptr, src, lane) vld2_lane_bf16(ptr, src, lane) +#endif +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld2_lane_bf16 + #define vld2_lane_bf16(ptr, src, lane) simde_vld2_lane_bf16((ptr), (src), (lane)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8x2_t simde_vld2q_lane_bf16(simde_bfloat16_t const ptr[HEDLEY_ARRAY_PARAM(2)], simde_bfloat16x8x2_t src, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 7) { + simde_bfloat16x8x2_t r; + + for (size_t i = 0 ; i < 2 ; i++) { + simde_bfloat16x8_private tmp_ = simde_bfloat16x8_to_private(src.val[i]); + tmp_.values[lane] = ptr[i]; + r.val[i] = simde_bfloat16x8_from_private(tmp_); + } + return r; +} +#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + #define simde_vld2q_lane_bf16(ptr, src, lane) vld2q_lane_bf16(ptr, src, lane) +#endif +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld2q_lane_bf16 + #define vld2q_lane_bf16(ptr, src, lane) simde_vld2q_lane_bf16((ptr), (src), (lane)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/ld3.h b/simde/arm/neon/ld3.h index 7d946e264..b53baa836 100644 --- a/simde/arm/neon/ld3.h +++ b/simde/arm/neon/ld3.h @@ -826,6 +826,61 @@ simde_vld3q_p64(simde_poly64_t const *ptr) { #define vld3q_p64(a) simde_vld3q_p64((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4x3_t +simde_vld3_bf16(simde_bfloat16 const *ptr) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld3_bf16(ptr); + #else + simde_bfloat16x4_private r_[3]; + + for (size_t i = 0; i < (sizeof(r_) / sizeof(r_[0])); i++) { + for (size_t j = 0 ; j < (sizeof(r_[0].values) / sizeof(r_[0].values[0])) ; j++) { + r_[i].values[j] = ptr[i + (j * (sizeof(r_) / sizeof(r_[0])))]; + } + } + + simde_bfloat16x4x3_t r = { { + simde_bfloat16x4_from_private(r_[0]), + simde_bfloat16x4_from_private(r_[1]), + simde_bfloat16x4_from_private(r_[2]) + } }; + + return r; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld3_bf16 + #define vld3_bf16(a) simde_vld3_bf16((a)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8x3_t +simde_vld3q_bf16(simde_bfloat16 const *ptr) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld3q_bf16(ptr); + #else + simde_bfloat16x8_private r_[3]; + + for (size_t i = 0; i < (sizeof(r_) / sizeof(r_[0])); i++) { + for (size_t j = 0 ; j < (sizeof(r_[0].values) / sizeof(r_[0].values[0])) ; j++) { + r_[i].values[j] = ptr[i + (j * (sizeof(r_) / sizeof(r_[0])))]; + } + } + + simde_bfloat16x8x3_t r = { { + simde_bfloat16x8_from_private(r_[0]), + simde_bfloat16x8_from_private(r_[1]), + simde_bfloat16x8_from_private(r_[2]) + } }; + + return r; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld3q_bf16 + #define vld3q_bf16(a) simde_vld3q_bf16((a)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/ld3_dup.h b/simde/arm/neon/ld3_dup.h index 108746a4a..f6a513846 100644 --- a/simde/arm/neon/ld3_dup.h +++ b/simde/arm/neon/ld3_dup.h @@ -566,6 +566,43 @@ simde_vld3q_dup_p64(simde_poly64_t const * ptr) { #define vld3q_dup_p64(a) simde_vld3q_dup_p64((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4x3_t +simde_vld3_dup_bf16(simde_bfloat16_t const ptr[HEDLEY_ARRAY_PARAM(2)]) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld3_dup_bf16(ptr); + #else + simde_bfloat16x4x3_t r; + + for (size_t i = 0 ; i < 3 ; i++) { + r.val[i] = simde_vdup_n_bf16(ptr[i]); + } + return r; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld3_dup_bf16 + #define vld3_dup_bf16(a) simde_vld3_dup_bf16((a)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8x3_t +simde_vld3q_dup_bf16(simde_bfloat16 const * ptr) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld3q_dup_bf16(ptr); + #else + simde_bfloat16x8x3_t r; + + for (size_t i = 0 ; i < 3 ; i++) { + r.val[i] = simde_vdupq_n_bf16(ptr[i]); + } + return r; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld3q_dup_bf16 + #define vld3q_dup_bf16(a) simde_vld3q_dup_bf16((a)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/ld3_lane.h b/simde/arm/neon/ld3_lane.h index 3c14de435..7541bb207 100644 --- a/simde/arm/neon/ld3_lane.h +++ b/simde/arm/neon/ld3_lane.h @@ -592,6 +592,45 @@ simde_poly64x2x3_t simde_vld3q_lane_p64(simde_poly64_t const ptr[HEDLEY_ARRAY_PA #define vld3q_lane_p64(ptr, src, lane) simde_vld3q_lane_p64((ptr), (src), (lane)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4x3_t simde_vld3_lane_bf16(simde_bfloat16_t const ptr[HEDLEY_ARRAY_PARAM(3)], simde_bfloat16x4x3_t src, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 3) { + simde_bfloat16x4x3_t r; + + for (size_t i = 0 ; i < 3 ; i++) { + simde_bfloat16x4_private tmp_ = simde_bfloat16x4_to_private(src.val[i]); + tmp_.values[lane] = ptr[i]; + r.val[i] = simde_bfloat16x4_from_private(tmp_); + } + return r; +} +#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + #define simde_vld3_lane_bf16(ptr, src, lane) vld3_lane_bf16(ptr, src, lane) +#endif +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld3_lane_bf16 + #define vld3_lane_bf16(ptr, src, lane) simde_vld3_lane_bf16((ptr), (src), (lane)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8x3_t simde_vld3q_lane_bf16(simde_bfloat16_t const ptr[HEDLEY_ARRAY_PARAM(3)], simde_bfloat16x8x3_t src, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 7) { + simde_bfloat16x8x3_t r; + + for (size_t i = 0 ; i < 3 ; i++) { + simde_bfloat16x8_private tmp_ = simde_bfloat16x8_to_private(src.val[i]); + tmp_.values[lane] = ptr[i]; + r.val[i] = simde_bfloat16x8_from_private(tmp_); + } + return r; +} +#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + #define simde_vld3q_lane_bf16(ptr, src, lane) vld3q_lane_bf16(ptr, src, lane) +#endif +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld3q_lane_bf16 + #define vld3q_lane_bf16(ptr, src, lane) simde_vld3q_lane_bf16((ptr), (src), (lane)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/ld4.h b/simde/arm/neon/ld4.h index 1f81c77b3..7f6db039d 100644 --- a/simde/arm/neon/ld4.h +++ b/simde/arm/neon/ld4.h @@ -638,6 +638,45 @@ simde_vld4q_p64(simde_poly64_t const ptr[HEDLEY_ARRAY_PARAM(8)]) { #define vld4q_p64(a) simde_vld4q_p64((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4x4_t +simde_vld4_bf16(simde_bfloat16 const ptr[HEDLEY_ARRAY_PARAM(16)]) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld4_bf16(ptr); + #else + simde_bfloat16x4_private a_[4]; + for (size_t i = 0; i < (sizeof(simde_bfloat16x4_t) / sizeof(*ptr)) * 4 ; i++) { + a_[i % 4].values[i / 4] = ptr[i]; + } + simde_bfloat16x4x4_t s_ = { { simde_bfloat16x4_from_private(a_[0]), simde_bfloat16x4_from_private(a_[1]), + simde_bfloat16x4_from_private(a_[2]), simde_bfloat16x4_from_private(a_[3]) } }; + return (s_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld4_bf16 + #define vld4_bf16(a) simde_vld4_bf16((a)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8x4_t +simde_vld4q_bf16(simde_bfloat16 const ptr[HEDLEY_ARRAY_PARAM(32)]) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld4q_bf16(ptr); + #else + simde_bfloat16x8_private a_[4]; + for (size_t i = 0; i < (sizeof(simde_bfloat16x8_t) / sizeof(*ptr)) * 4 ; i++) { + a_[i % 4].values[i / 4] = ptr[i]; + } + simde_bfloat16x8x4_t s_ = { { simde_bfloat16x8_from_private(a_[0]), simde_bfloat16x8_from_private(a_[1]), + simde_bfloat16x8_from_private(a_[2]), simde_bfloat16x8_from_private(a_[3]) } }; + return s_; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld4q_bf16 + #define vld4q_bf16(a) simde_vld4q_bf16((a)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/ld4_dup.h b/simde/arm/neon/ld4_dup.h index b51c09a89..6471efd61 100644 --- a/simde/arm/neon/ld4_dup.h +++ b/simde/arm/neon/ld4_dup.h @@ -566,6 +566,43 @@ simde_vld4q_dup_p64(simde_poly64_t const * ptr) { #define vld4q_dup_p64(a) simde_vld4q_dup_p64((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4x4_t +simde_vld4_dup_bf16(simde_bfloat16_t const ptr[HEDLEY_ARRAY_PARAM(2)]) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld4_dup_bf16(ptr); + #else + simde_bfloat16x4x4_t r; + + for (size_t i = 0 ; i < 4 ; i++) { + r.val[i] = simde_vdup_n_bf16(ptr[i]); + } + return r; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld4_dup_bf16 + #define vld4_dup_bf16(a) simde_vld4_dup_bf16((a)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8x4_t +simde_vld4q_dup_bf16(simde_bfloat16 const * ptr) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vld4q_dup_bf16(ptr); + #else + simde_bfloat16x8x4_t r; + + for (size_t i = 0 ; i < 4 ; i++) { + r.val[i] = simde_vdupq_n_bf16(ptr[i]); + } + return r; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld4q_dup_bf16 + #define vld4q_dup_bf16(a) simde_vld4q_dup_bf16((a)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/ld4_lane.h b/simde/arm/neon/ld4_lane.h index 2166436fb..ed8a7e4d2 100644 --- a/simde/arm/neon/ld4_lane.h +++ b/simde/arm/neon/ld4_lane.h @@ -773,6 +773,49 @@ simde_vld4q_lane_p64(simde_poly64_t const ptr[HEDLEY_ARRAY_PARAM(4)], simde_poly #define vld4q_lane_p64(ptr, src, lane) simde_vld4q_lane_p64((ptr), (src), (lane)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4x4_t +simde_vld4_lane_bf16(simde_bfloat16_t const ptr[HEDLEY_ARRAY_PARAM(4)], simde_bfloat16x4x4_t src, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 3) { + simde_bfloat16x4x4_t r; + + for (size_t i = 0 ; i < 4 ; i++) { + simde_bfloat16x4_private tmp_ = simde_bfloat16x4_to_private(src.val[i]); + tmp_.values[lane] = ptr[i]; + r.val[i] = simde_bfloat16x4_from_private(tmp_); + } + + return r; +} +#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + #define simde_vld4_lane_bf16(ptr, src, lane) vld4_lane_bf16(ptr, src, lane) +#endif +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld4_lane_bf16 + #define vld4_lane_bf16(ptr, src, lane) simde_vld4_lane_bf16((ptr), (src), (lane)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8x4_t +simde_vld4q_lane_bf16(simde_bfloat16_t const ptr[HEDLEY_ARRAY_PARAM(4)], simde_bfloat16x8x4_t src, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 7) { + simde_bfloat16x8x4_t r; + + for (size_t i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_private tmp_ = simde_bfloat16x8_to_private(src.val[i]); + tmp_.values[lane] = ptr[i]; + r.val[i] = simde_bfloat16x8_from_private(tmp_); + } + + return r; +} +#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + #define simde_vld4q_lane_bf16(ptr, src, lane) vld4q_lane_bf16(ptr, src, lane) +#endif +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vld4q_lane_bf16 + #define vld4q_lane_bf16(ptr, src, lane) simde_vld4q_lane_bf16((ptr), (src), (lane)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/mmlaq.h b/simde/arm/neon/mmlaq.h index cc3b87a4f..972771167 100644 --- a/simde/arm/neon/mmlaq.h +++ b/simde/arm/neon/mmlaq.h @@ -118,6 +118,34 @@ simde_vusmmlaq_s32(simde_int32x4_t r, simde_uint8x16_t a, simde_int8x16_t b) { #define vusmmlaq_s32(r, a, b) simde_vusmmlaq_s32((r), (a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x4_t +simde_vbfmmlaq_f32(simde_float32x4_t r, simde_bfloat16x8_t a, simde_bfloat16x8_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(__ARM_FEATURE_MATMUL_INT8) && \ + defined(SIMDE_ARM_NEON_BF16) + return vbfmmlaq_f32(r, a, b); + #else + simde_bfloat16x8_private + a_ = simde_bfloat16x8_to_private(a), + b_ = simde_bfloat16x8_to_private(b); + simde_float32x4_private + r_ = simde_float32x4_to_private(r), + ret; + + for (size_t k = 0 ; k < (sizeof(ret.values) / sizeof(ret.values[0])) ; k++) { + ret.values[k] = r_.values[k]; + for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0]) / 2) ; i++) { + ret.values[k] += simde_bfloat16_to_float32(a_.values[(k/2)*4+i]) * + simde_bfloat16_to_float32(b_.values[(k%2)*4+i]); + } + } + return simde_float32x4_from_private(ret); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vbfmmlaq_f32 + #define vbfmmlaq_f32(r, a, b) simde_vbfmmlaq_f32((r), (a), (b)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/reinterpret.h b/simde/arm/neon/reinterpret.h index f657fe4b0..d56a4a483 100644 --- a/simde/arm/neon/reinterpret.h +++ b/simde/arm/neon/reinterpret.h @@ -6602,6 +6602,927 @@ simde_vreinterpretq_f64_p128(simde_poly128_t a) { #endif /* !defined(SIMDE_TARGET_NOT_SUPPORT_INT128_TYPE) */ +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vreinterpret_bf16_s8(simde_int8x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_bf16_s8(a); + #else + simde_bfloat16x4_private r_; + simde_int8x8_private a_ = simde_int8x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_bf16_s8 + #define vreinterpret_bf16_s8(a) simde_vreinterpret_bf16_s8(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vreinterpret_bf16_s16(simde_int16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_bf16_s16(a); + #else + simde_bfloat16x4_private r_; + simde_int16x4_private a_ = simde_int16x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_bf16_s16 + #define vreinterpret_bf16_s16(a) simde_vreinterpret_bf16_s16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vreinterpret_bf16_s32(simde_int32x2_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_bf16_s32(a); + #else + simde_bfloat16x4_private r_; + simde_int32x2_private a_ = simde_int32x2_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_bf16_s32 + #define vreinterpret_bf16_s32(a) simde_vreinterpret_bf16_s32(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vreinterpret_bf16_s64(simde_int64x1_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_bf16_s64(a); + #else + simde_bfloat16x4_private r_; + simde_int64x1_private a_ = simde_int64x1_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_bf16_s64 + #define vreinterpret_bf16_s64(a) simde_vreinterpret_bf16_s64(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vreinterpret_bf16_u8(simde_uint8x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_bf16_u8(a); + #else + simde_bfloat16x4_private r_; + simde_uint8x8_private a_ = simde_uint8x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_bf16_u8 + #define vreinterpret_bf16_u8(a) simde_vreinterpret_bf16_u8(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vreinterpret_bf16_u16(simde_uint16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_bf16_u16(a); + #else + simde_bfloat16x4_private r_; + simde_uint16x4_private a_ = simde_uint16x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_bf16_u16 + #define vreinterpret_bf16_u16(a) simde_vreinterpret_bf16_u16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vreinterpret_bf16_u32(simde_uint32x2_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_bf16_u32(a); + #else + simde_bfloat16x4_private r_; + simde_uint32x2_private a_ = simde_uint32x2_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_bf16_u32 + #define vreinterpret_bf16_u32(a) simde_vreinterpret_bf16_u32(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vreinterpret_bf16_u64(simde_uint64x1_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_bf16_u64(a); + #else + simde_bfloat16x4_private r_; + simde_uint64x1_private a_ = simde_uint64x1_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_bf16_u64 + #define vreinterpret_bf16_u64(a) simde_vreinterpret_bf16_u64(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vreinterpret_bf16_f32(simde_float32x2_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_bf16_f32(a); + #else + simde_bfloat16x4_private r_; + simde_float32x2_private a_ = simde_float32x2_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_bf16_f32 + #define vreinterpret_bf16_f32 simde_vreinterpret_bf16_f32 +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vreinterpret_bf16_f64(simde_float64x1_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_bf16_f64(a); + #else + simde_bfloat16x4_private r_; + simde_float64x1_private a_ = simde_float64x1_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_bf16_f64 + #define vreinterpret_bf16_f64 simde_vreinterpret_bf16_f64 +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vreinterpretq_bf16_s8(simde_int8x16_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_bf16_s8(a); + #else + simde_bfloat16x8_private r_; + simde_int8x16_private a_ = simde_int8x16_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_bf16_s8 + #define vreinterpretq_bf16_s8(a) simde_vreinterpretq_bf16_s8(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vreinterpretq_bf16_s16(simde_int16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_bf16_s16(a); + #else + simde_bfloat16x8_private r_; + simde_int16x8_private a_ = simde_int16x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_bf16_s16 + #define vreinterpretq_bf16_s16(a) simde_vreinterpretq_bf16_s16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vreinterpretq_bf16_s32(simde_int32x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_bf16_s32(a); + #else + simde_bfloat16x8_private r_; + simde_int32x4_private a_ = simde_int32x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_bf16_s32 + #define vreinterpretq_bf16_s32(a) simde_vreinterpretq_bf16_s32(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vreinterpretq_bf16_s64(simde_int64x2_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_bf16_s64(a); + #else + simde_bfloat16x8_private r_; + simde_int64x2_private a_ = simde_int64x2_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_bf16_s64 + #define vreinterpretq_bf16_s64(a) simde_vreinterpretq_bf16_s64(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vreinterpretq_bf16_u8(simde_uint8x16_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_bf16_u8(a); + #else + simde_bfloat16x8_private r_; + simde_uint8x16_private a_ = simde_uint8x16_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_bf16_u8 + #define vreinterpretq_bf16_u8(a) simde_vreinterpretq_bf16_u8(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vreinterpretq_bf16_u16(simde_uint16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_bf16_u16(a); + #else + simde_bfloat16x8_private r_; + simde_uint16x8_private a_ = simde_uint16x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_bf16_u16 + #define vreinterpretq_bf16_u16(a) simde_vreinterpretq_bf16_u16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vreinterpretq_bf16_u32(simde_uint32x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_bf16_u32(a); + #else + simde_bfloat16x8_private r_; + simde_uint32x4_private a_ = simde_uint32x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_bf16_u32 + #define vreinterpretq_bf16_u32(a) simde_vreinterpretq_bf16_u32(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vreinterpretq_bf16_u64(simde_uint64x2_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_bf16_u64(a); + #else + simde_bfloat16x8_private r_; + simde_uint64x2_private a_ = simde_uint64x2_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_bf16_u64 + #define vreinterpretq_bf16_u64(a) simde_vreinterpretq_bf16_u64(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vreinterpretq_bf16_f32(simde_float32x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_bf16_f32(a); + #else + simde_bfloat16x8_private r_; + simde_float32x4_private a_ = simde_float32x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_bf16_f32 + #define vreinterpretq_bf16_f32 simde_vreinterpretq_bf16_f32 +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vreinterpretq_bf16_f64(simde_float64x2_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_bf16_f64(a); + #else + simde_bfloat16x8_private r_; + simde_float64x2_private a_ = simde_float64x2_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_bf16_f64 + #define vreinterpretq_bf16_f64 simde_vreinterpretq_bf16_f64 +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_int8x8_t +simde_vreinterpret_s8_bf16(simde_bfloat16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_s8_bf16(a); + #else + simde_int8x8_private r_; + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_int8x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_s8_bf16 + #define vreinterpret_s8_bf16(a) simde_vreinterpret_s8_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_int16x4_t +simde_vreinterpret_s16_bf16(simde_bfloat16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_s16_bf16(a); + #else + simde_int16x4_private r_; + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_int16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_s16_bf16 + #define vreinterpret_s16_bf16(a) simde_vreinterpret_s16_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_int32x2_t +simde_vreinterpret_s32_bf16(simde_bfloat16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_s32_bf16(a); + #else + simde_int32x2_private r_; + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_int32x2_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_s32_bf16 + #define vreinterpret_s32_bf16(a) simde_vreinterpret_s32_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_int64x1_t +simde_vreinterpret_s64_bf16(simde_bfloat16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_s64_bf16(a); + #else + simde_int64x1_private r_; + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_int64x1_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_s64_bf16 + #define vreinterpret_s64_bf16(a) simde_vreinterpret_s64_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_uint8x8_t +simde_vreinterpret_u8_bf16(simde_bfloat16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_u8_bf16(a); + #else + simde_uint8x8_private r_; + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_uint8x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_u8_bf16 + #define vreinterpret_u8_bf16(a) simde_vreinterpret_u8_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_uint16x4_t +simde_vreinterpret_u16_bf16(simde_bfloat16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_u16_bf16(a); + #else + simde_uint16x4_private r_; + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_uint16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_u16_bf16 + #define vreinterpret_u16_bf16(a) simde_vreinterpret_u16_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_uint32x2_t +simde_vreinterpret_u32_bf16(simde_bfloat16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_u32_bf16(a); + #else + simde_uint32x2_private r_; + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_uint32x2_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_u32_bf16 + #define vreinterpret_u32_bf16(a) simde_vreinterpret_u32_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_uint64x1_t +simde_vreinterpret_u64_bf16(simde_bfloat16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_u64_bf16(a); + #else + simde_uint64x1_private r_; + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_uint64x1_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_u64_bf16 + #define vreinterpret_u64_bf16(a) simde_vreinterpret_u64_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x2_t +simde_vreinterpret_f32_bf16(simde_bfloat16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_f32_bf16(a); + #else + simde_float32x2_private r_; + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_float32x2_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_f32_bf16 + #define vreinterpret_f32_bf16 simde_vreinterpret_f32_bf16 +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float64x1_t +simde_vreinterpret_f64_bf16(simde_bfloat16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_f64_bf16(a); + #else + simde_float64x1_private r_; + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_float64x1_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_f64_bf16 + #define vreinterpret_f64_bf16 simde_vreinterpret_f64_bf16 +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_int8x16_t +simde_vreinterpretq_s8_bf16(simde_bfloat16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_s8_bf16(a); + #else + simde_int8x16_private r_; + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_int8x16_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_s8_bf16 + #define vreinterpretq_s8_bf16(a) simde_vreinterpretq_s8_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_int16x8_t +simde_vreinterpretq_s16_bf16(simde_bfloat16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_s16_bf16(a); + #else + simde_int16x8_private r_; + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_int16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_s16_bf16 + #define vreinterpretq_s16_bf16(a) simde_vreinterpretq_s16_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_int32x4_t +simde_vreinterpretq_s32_bf16(simde_bfloat16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_s32_bf16(a); + #else + simde_int32x4_private r_; + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_int32x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_s32_bf16 + #define vreinterpretq_s32_bf16(a) simde_vreinterpretq_s32_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_int64x2_t +simde_vreinterpretq_s64_bf16(simde_bfloat16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_s64_bf16(a); + #else + simde_int64x2_private r_; + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_int64x2_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_s64_bf16 + #define vreinterpretq_s64_bf16(a) simde_vreinterpretq_s64_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_uint8x16_t +simde_vreinterpretq_u8_bf16(simde_bfloat16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_u8_bf16(a); + #else + simde_uint8x16_private r_; + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_uint8x16_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_u8_bf16 + #define vreinterpretq_u8_bf16(a) simde_vreinterpretq_u8_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_uint16x8_t +simde_vreinterpretq_u16_bf16(simde_bfloat16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_u16_bf16(a); + #else + simde_uint16x8_private r_; + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_uint16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_u16_bf16 + #define vreinterpretq_u16_bf16(a) simde_vreinterpretq_u16_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_uint32x4_t +simde_vreinterpretq_u32_bf16(simde_bfloat16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_u32_bf16(a); + #else + simde_uint32x4_private r_; + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_uint32x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_u32_bf16 + #define vreinterpretq_u32_bf16(a) simde_vreinterpretq_u32_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_uint64x2_t +simde_vreinterpretq_u64_bf16(simde_bfloat16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_u64_bf16(a); + #else + simde_uint64x2_private r_; + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_uint64x2_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_u64_bf16 + #define vreinterpretq_u64_bf16(a) simde_vreinterpretq_u64_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x4_t +simde_vreinterpretq_f32_bf16(simde_bfloat16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_f32_bf16(a); + #else + simde_float32x4_private r_; + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_float32x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_f32_bf16 + #define vreinterpretq_f32_bf16 simde_vreinterpretq_f32_bf16 +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float64x2_t +simde_vreinterpretq_f64_bf16(simde_bfloat16x8_t a) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_f64_bf16(a); + #else + simde_float64x2_private r_; + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_float64x2_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_f64_bf16 + #define vreinterpretq_f64_bf16 simde_vreinterpretq_f64_bf16 +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vreinterpret_bf16_p8(simde_poly8x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_bf16_p8(a); + #else + simde_bfloat16x4_private r_; + simde_poly8x8_private a_ = simde_poly8x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_bf16_p8 + #define vreinterpret_bf16_p8(a) simde_vreinterpret_bf16_p8(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vreinterpret_bf16_p16(simde_poly16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_bf16_p16(a); + #else + simde_bfloat16x4_private r_; + simde_poly16x4_private a_ = simde_poly16x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_bf16_p16 + #define vreinterpret_bf16_p16(a) simde_vreinterpret_bf16_p16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vreinterpret_bf16_p64(simde_poly64x1_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_bf16_p64(a); + #else + simde_bfloat16x4_private r_; + simde_poly64x1_private a_ = simde_poly64x1_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_bf16_p64 + #define vreinterpret_bf16_p64(a) simde_vreinterpret_bf16_p64(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vreinterpretq_bf16_p8(simde_poly8x16_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_bf16_p8(a); + #else + simde_bfloat16x8_private r_; + simde_poly8x16_private a_ = simde_poly8x16_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_bf16_p8 + #define vreinterpretq_bf16_p8(a) simde_vreinterpretq_bf16_p8(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vreinterpretq_bf16_p16(simde_poly16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_bf16_p16(a); + #else + simde_bfloat16x8_private r_; + simde_poly16x8_private a_ = simde_poly16x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_bf16_p16 + #define vreinterpretq_bf16_p16(a) simde_vreinterpretq_bf16_p16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vreinterpretq_bf16_p64(simde_poly64x2_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_bf16_p64(a); + #else + simde_bfloat16x8_private r_; + simde_poly64x2_private a_ = simde_poly64x2_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_bf16_p64 + #define vreinterpretq_bf16_p64(a) simde_vreinterpretq_bf16_p64(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_poly8x8_t +simde_vreinterpret_p8_bf16(simde_bfloat16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_p8_bf16(a); + #else + simde_poly8x8_private r_; + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_poly8x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_p8_bf16 + #define vreinterpret_p8_bf16(a) simde_vreinterpret_p8_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_poly16x4_t +simde_vreinterpret_p16_bf16(simde_bfloat16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_p16_bf16(a); + #else + simde_poly16x4_private r_; + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_poly16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_p16_bf16 + #define vreinterpret_p16_bf16(a) simde_vreinterpret_p16_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_poly64x1_t +simde_vreinterpret_p64_bf16(simde_bfloat16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpret_p64_bf16(a); + #else + simde_poly64x1_private r_; + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_poly64x1_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_p64_bf16 + #define vreinterpret_p64_bf16(a) simde_vreinterpret_p64_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_poly8x16_t +simde_vreinterpretq_p8_bf16(simde_bfloat16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_p8_bf16(a); + #else + simde_poly8x16_private r_; + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_poly8x16_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_p8_bf16 + #define vreinterpretq_p8_bf16(a) simde_vreinterpretq_p8_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_poly16x8_t +simde_vreinterpretq_p16_bf16(simde_bfloat16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_p16_bf16(a); + #else + simde_poly16x8_private r_; + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_poly16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_p16_bf16 + #define vreinterpretq_p16_bf16(a) simde_vreinterpretq_p16_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_poly64x2_t +simde_vreinterpretq_p64_bf16(simde_bfloat16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_p64_bf16(a); + #else + simde_poly64x2_private r_; + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_poly64x2_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_p64_bf16 + #define vreinterpretq_p64_bf16(a) simde_vreinterpretq_p64_bf16(a) +#endif + +#if !defined(SIMDE_TARGET_NOT_SUPPORT_INT128_TYPE) + +SIMDE_FUNCTION_ATTRIBUTES +simde_poly128_t +simde_vreinterpretq_p128_bf16(simde_bfloat16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_p128_bf16(a); + #else + simde_poly128_t r_; + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return r_; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_p128_bf16 + #define vreinterpretq_p128_bf16(a) simde_vreinterpretq_p128_bf16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vreinterpretq_bf16_p128(simde_poly128_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vreinterpretq_bf16_p128(a); + #else + simde_bfloat16x8_t r_; + simde_poly128_t a_ = a; + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_bfloat16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_bf16_p128 + #define vreinterpretq_bf16_p128(a) simde_vreinterpretq_bf16_p128(a) +#endif + +#endif /* !defined(SIMDE_TARGET_NOT_SUPPORT_INT128_TYPE) */ SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/set_lane.h b/simde/arm/neon/set_lane.h index d440a2044..1c230f39b 100644 --- a/simde/arm/neon/set_lane.h +++ b/simde/arm/neon/set_lane.h @@ -563,6 +563,43 @@ simde_vsetq_lane_p64(simde_poly64_t a, simde_poly64x2_t v, const int lane) #define vsetq_lane_p64(a, b, c) simde_vsetq_lane_p64((a), (b), (c)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x4_t +simde_vset_lane_bf16(simde_bfloat16_t a, simde_bfloat16x4_t v, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 3) { + simde_bfloat16x4_t r; + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + SIMDE_CONSTIFY_4_(vset_lane_bf16, r, (HEDLEY_UNREACHABLE(), v), lane, a, v); + #else + simde_bfloat16x4_private v_ = simde_bfloat16x4_to_private(v); + v_.values[lane] = a; + r = simde_bfloat16x4_from_private(v_); + #endif + return r; +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vset_lane_bf16 + #define vset_lane_bf16(a, b, c) simde_vset_lane_bf16((a), (b), (c)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_bfloat16x8_t +simde_vsetq_lane_bf16(simde_bfloat16_t a, simde_bfloat16x8_t v, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 7) { + simde_bfloat16x8_t r; + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + SIMDE_CONSTIFY_8_(vsetq_lane_bf16, r, (HEDLEY_UNREACHABLE(), v), lane, a, v); + #else + simde_bfloat16x8_private v_ = simde_bfloat16x8_to_private(v); + v_.values[lane] = a; + r = simde_bfloat16x8_from_private(v_); + #endif + return r; +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vsetq_lane_bf16 + #define vsetq_lane_bf16(a, b, c) simde_vsetq_lane_bf16((a), (b), (c)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/st1.h b/simde/arm/neon/st1.h index 9a4d46576..b91658149 100644 --- a/simde/arm/neon/st1.h +++ b/simde/arm/neon/st1.h @@ -525,6 +525,35 @@ simde_vstrq_p128(simde_poly128_t ptr[HEDLEY_ARRAY_PARAM(1)], simde_poly128_t val #endif #endif /* !defined(SIMDE_TARGET_NOT_SUPPORT_INT128_TYPE) */ +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst1_bf16(simde_bfloat16_t ptr[HEDLEY_ARRAY_PARAM(4)], simde_bfloat16x4_t val) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + vst1_bf16(ptr, val); + #else + simde_bfloat16x4_private val_ = simde_bfloat16x4_to_private(val); + simde_memcpy(ptr, &val_, sizeof(val_)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst1_bf16 + #define vst1_bf16(a, b) simde_vst1_bf16((a), (b)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst1q_bf16(simde_bfloat16_t ptr[HEDLEY_ARRAY_PARAM(8)], simde_bfloat16x8_t val) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + vst1q_bf16(ptr, val); + #else + simde_bfloat16x8_private val_ = simde_bfloat16x8_to_private(val); + simde_memcpy(ptr, &val_, sizeof(val_)); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vst1q_bf16 + #define vst1q_bf16(a, b) simde_vst1q_bf16((a), (b)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/st1_lane.h b/simde/arm/neon/st1_lane.h index 7ed2cb62a..8facb2e77 100644 --- a/simde/arm/neon/st1_lane.h +++ b/simde/arm/neon/st1_lane.h @@ -486,6 +486,37 @@ simde_vst1q_lane_p64(simde_poly64_t *ptr, simde_poly64x2_t val, const int lane) #define vst1q_lane_p64(a, b, c) simde_vst1q_lane_p64((a), (b), (c)) #endif +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst1_lane_bf16(simde_bfloat16_t *ptr, simde_bfloat16x4_t val, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 3) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + SIMDE_CONSTIFY_4_NO_RESULT_(vst1_lane_bf16, HEDLEY_UNREACHABLE(), lane, ptr, val); + #else + simde_bfloat16x4_private val_ = simde_bfloat16x4_to_private(val); + *ptr = val_.values[lane]; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst1_lane_bf16 + #define vst1_lane_bf16(a, b, c) simde_vst1_lane_bf16((a), (b), (c)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst1q_lane_bf16(simde_bfloat16_t *ptr, simde_bfloat16x8_t val, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 7) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + SIMDE_CONSTIFY_8_NO_RESULT_(vst1q_lane_bf16, HEDLEY_UNREACHABLE(), lane, ptr, val); + #else + simde_bfloat16x8_private val_ = simde_bfloat16x8_to_private(val); + *ptr = val_.values[lane]; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst1q_lane_bf16 + #define vst1q_lane_bf16(a, b, c) simde_vst1q_lane_bf16((a), (b), (c)) +#endif SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/st1_x2.h b/simde/arm/neon/st1_x2.h index b91a5eaf8..59d3b395d 100644 --- a/simde/arm/neon/st1_x2.h +++ b/simde/arm/neon/st1_x2.h @@ -262,6 +262,23 @@ simde_vst1_p64_x2(simde_poly64_t ptr[HEDLEY_ARRAY_PARAM(2)], simde_poly64x1x2_t #define vst1_p64_x2(a, b) simde_vst1_p64_x2((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst1_bf16_x2(simde_bfloat16_t ptr[HEDLEY_ARRAY_PARAM(8)], simde_bfloat16x4x2_t val) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + vst1_bf16_x2(ptr, val); + #else + simde_bfloat16x4_private val_[2]; + for (size_t i = 0; i < 2; i++) { + val_[i] = simde_bfloat16x4_to_private(val.val[i]); + } + simde_memcpy(ptr, &val_, sizeof(val_)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst1_bf16_x2 + #define vst1_bf16_x2(a, b) simde_vst1_bf16_x2((a), (b)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/st1_x3.h b/simde/arm/neon/st1_x3.h index 601dfc034..35ead1244 100644 --- a/simde/arm/neon/st1_x3.h +++ b/simde/arm/neon/st1_x3.h @@ -272,6 +272,23 @@ simde_vst1_p64_x3(simde_poly64_t ptr[HEDLEY_ARRAY_PARAM(3)], simde_poly64x1x3_t #define vst1_p64_x3(a, b) simde_vst1_p64_x3((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst1_bf16_x3(simde_bfloat16_t ptr[HEDLEY_ARRAY_PARAM(12)], simde_bfloat16x4x3_t val) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + vst1_bf16_x3(ptr, val); + #else + simde_bfloat16x4_private val_[3]; + for (size_t i = 0; i < 3; i++) { + val_[i] = simde_bfloat16x4_to_private(val.val[i]); + } + simde_memcpy(ptr, &val_, sizeof(val_)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst1_bf16_x3 + #define vst1_bf16_x3(a, b) simde_vst1_bf16_x3((a), (b)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/st1_x4.h b/simde/arm/neon/st1_x4.h index 58a68fc10..873e1f413 100644 --- a/simde/arm/neon/st1_x4.h +++ b/simde/arm/neon/st1_x4.h @@ -282,6 +282,23 @@ simde_vst1_p64_x4(simde_poly64_t ptr[HEDLEY_ARRAY_PARAM(4)], simde_poly64x1x4_t #define vst1_p64_x4(a, b) simde_vst1_p64_x4((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst1_bf16_x4(simde_bfloat16_t ptr[HEDLEY_ARRAY_PARAM(16)], simde_bfloat16x4x4_t val) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + vst1_bf16_x4(ptr, val); + #else + simde_bfloat16x4_private val_[4]; + for (size_t i = 0; i < 4; i++) { + val_[i] = simde_bfloat16x4_to_private(val.val[i]); + } + simde_memcpy(ptr, &val_, sizeof(val_)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst1_bf16_x4 + #define vst1_bf16_x4(a, b) simde_vst1_bf16_x4((a), (b)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/st1q_x2.h b/simde/arm/neon/st1q_x2.h index 2f77af637..eeee23975 100644 --- a/simde/arm/neon/st1q_x2.h +++ b/simde/arm/neon/st1q_x2.h @@ -260,6 +260,23 @@ simde_vst1q_p64_x2(simde_poly64_t ptr[HEDLEY_ARRAY_PARAM(4)], simde_poly64x2x2_t #define vst1q_p64_x2(a, b) simde_vst1q_p64_x2((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst1q_bf16_x2(simde_bfloat16_t ptr[HEDLEY_ARRAY_PARAM(16)], simde_bfloat16x8x2_t val) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + vst1q_bf16_x2(ptr, val); + #else + simde_bfloat16x8_private val_[2]; + for (size_t i = 0; i < 2; i++) { + val_[i] = simde_bfloat16x8_to_private(val.val[i]); + } + simde_memcpy(ptr, &val_, sizeof(val_)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst1q_bf16_x2 + #define vst1q_bf16_x2(a, b) simde_vst1q_bf16_x2((a), (b)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/st1q_x3.h b/simde/arm/neon/st1q_x3.h index 8cc4797e4..604e037c3 100644 --- a/simde/arm/neon/st1q_x3.h +++ b/simde/arm/neon/st1q_x3.h @@ -270,6 +270,23 @@ simde_vst1q_p64_x3(simde_poly64_t ptr[HEDLEY_ARRAY_PARAM(6)], simde_poly64x2x3_t #define vst1q_p64_x3(a, b) simde_vst1q_p64_x3((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst1q_bf16_x3(simde_bfloat16_t ptr[HEDLEY_ARRAY_PARAM(24)], simde_bfloat16x8x3_t val) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + vst1q_bf16_x3(ptr, val); + #else + simde_bfloat16x8_private val_[3]; + for (size_t i = 0; i < 3; i++) { + val_[i] = simde_bfloat16x8_to_private(val.val[i]); + } + simde_memcpy(ptr, &val_, sizeof(val_)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst1q_bf16_x3 + #define vst1q_bf16_x3(a, b) simde_vst1q_bf16_x3((a), (b)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/st1q_x4.h b/simde/arm/neon/st1q_x4.h index 8f5bea902..a23651c60 100644 --- a/simde/arm/neon/st1q_x4.h +++ b/simde/arm/neon/st1q_x4.h @@ -282,6 +282,23 @@ simde_vst1q_p64_x4(simde_poly64_t ptr[HEDLEY_ARRAY_PARAM(8)], simde_poly64x2x4_t #define vst1q_p64_x4(a, b) simde_vst1q_p64_x4((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst1q_bf16_x4(simde_bfloat16_t ptr[HEDLEY_ARRAY_PARAM(32)], simde_bfloat16x8x4_t val) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + vst1q_bf16_x4(ptr, val); + #else + simde_bfloat16x8_private val_[4]; + for (size_t i = 0; i < 4; i++) { + val_[i] = simde_bfloat16x8_to_private(val.val[i]); + } + simde_memcpy(ptr, &val_, sizeof(val_)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst1q_bf16_x4 + #define vst1q_bf16_x4(a, b) simde_vst1q_bf16_x4((a), (b)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/st2.h b/simde/arm/neon/st2.h index 060094fc6..b449f8525 100644 --- a/simde/arm/neon/st2.h +++ b/simde/arm/neon/st2.h @@ -566,6 +566,45 @@ simde_vst2q_p64(simde_poly64_t *ptr, simde_poly64x2x2_t val) { #define vst2q_p64(a, b) simde_vst2q_p64((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst2_bf16(simde_bfloat16_t *ptr, simde_bfloat16x4x2_t val) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + vst2_bf16(ptr, val); + #else + simde_bfloat16_t buf[8]; + simde_bfloat16x4_private a_[2] = {simde_bfloat16x4_to_private(val.val[0]), + simde_bfloat16x4_to_private(val.val[1])}; + for (size_t i = 0; i < (sizeof(val.val[0]) / sizeof(*ptr)) * 2 ; i++) { + buf[i] = a_[i % 2].values[i / 2]; + } + simde_memcpy(ptr, buf, sizeof(buf)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst2_bf16 + #define vst2_bf16(a, b) simde_vst2_bf16((a), (b)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst2q_bf16(simde_bfloat16_t *ptr, simde_bfloat16x8x2_t val) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + vst2q_bf16(ptr, val); + #else + simde_bfloat16_t buf[16]; + simde_bfloat16x8_private a_[2] = {simde_bfloat16x8_to_private(val.val[0]), + simde_bfloat16x8_to_private(val.val[1])}; + for (size_t i = 0; i < (sizeof(val.val[0]) / sizeof(*ptr)) * 2 ; i++) { + buf[i] = a_[i % 2].values[i / 2]; + } + simde_memcpy(ptr, buf, sizeof(buf)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst2q_bf16 + #define vst2q_bf16(a, b) simde_vst2q_bf16((a), (b)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/st2_lane.h b/simde/arm/neon/st2_lane.h index 0fc7e59a6..3be5c8e79 100644 --- a/simde/arm/neon/st2_lane.h +++ b/simde/arm/neon/st2_lane.h @@ -572,6 +572,43 @@ simde_vst2q_lane_p64(simde_poly64_t ptr[HEDLEY_ARRAY_PARAM(2)], simde_poly64x2x2 #define vst2q_lane_p64(a, b, c) simde_vst2q_lane_p64((a), (b), (c)) #endif +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst2_lane_bf16(simde_bfloat16_t ptr[HEDLEY_ARRAY_PARAM(2)], simde_bfloat16x4x2_t val, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 3) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + SIMDE_CONSTIFY_4_NO_RESULT_(vst2_lane_bf16, HEDLEY_UNREACHABLE(), lane, ptr, val); + #else + simde_bfloat16x4_private r; + for (size_t i = 0 ; i < 2 ; i ++) { + r = simde_bfloat16x4_to_private(val.val[i]); + ptr[i] = r.values[lane]; + } + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst2_lane_bf16 + #define vst2_lane_bf16(a, b, c) simde_vst2_lane_bf16((a), (b), (c)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst2q_lane_bf16(simde_bfloat16_t ptr[HEDLEY_ARRAY_PARAM(2)], simde_bfloat16x8x2_t val, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 7) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + SIMDE_CONSTIFY_8_NO_RESULT_(vst2q_lane_bf16, HEDLEY_UNREACHABLE(), lane, ptr, val); + #else + simde_bfloat16x8_private r; + for (size_t i = 0 ; i < 2 ; i++) { + r = simde_bfloat16x8_to_private(val.val[i]); + ptr[i] = r.values[lane]; + } + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst2q_lane_bf16 + #define vst2q_lane_bf16(a, b, c) simde_vst2q_lane_bf16((a), (b), (c)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/st3.h b/simde/arm/neon/st3.h index 052396e53..d14b1f62e 100644 --- a/simde/arm/neon/st3.h +++ b/simde/arm/neon/st3.h @@ -937,6 +937,47 @@ simde_vst3q_p64(simde_poly64_t ptr[HEDLEY_ARRAY_PARAM(6)], simde_poly64x2x3_t va #define vst3q_p64(a, b) simde_vst3q_p64((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst3_bf16(simde_bfloat16_t ptr[HEDLEY_ARRAY_PARAM(12)], simde_bfloat16x4x3_t val) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + vst3_bf16(ptr, val); + #else + simde_bfloat16x4_private a[3] = { simde_bfloat16x4_to_private(val.val[0]), + simde_bfloat16x4_to_private(val.val[1]), + simde_bfloat16x4_to_private(val.val[2]) }; + simde_bfloat16_t buf[12]; + for (size_t i = 0; i < (sizeof(val.val[0]) / sizeof(*ptr)) * 3 ; i++) { + buf[i] = a[i % 3].values[i / 3]; + } + simde_memcpy(ptr, buf, sizeof(buf)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst3_bf16 + #define vst3_bf16(a, b) simde_vst3_bf16((a), (b)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst3q_bf16(simde_bfloat16_t ptr[HEDLEY_ARRAY_PARAM(24)], simde_bfloat16x8x3_t val) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + vst3q_bf16(ptr, val); + #else + simde_bfloat16x8_private a_[3] = { simde_bfloat16x8_to_private(val.val[0]), + simde_bfloat16x8_to_private(val.val[1]), + simde_bfloat16x8_to_private(val.val[2]) }; + simde_bfloat16_t buf[24]; + for (size_t i = 0; i < (sizeof(val.val[0]) / sizeof(*ptr)) * 3 ; i++) { + buf[i] = a_[i % 3].values[i / 3]; + } + simde_memcpy(ptr, buf, sizeof(buf)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst3q_bf16 + #define vst3q_bf16(a, b) simde_vst3q_bf16((a), (b)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/st3_lane.h b/simde/arm/neon/st3_lane.h index e20cf9b94..d8325b9a3 100644 --- a/simde/arm/neon/st3_lane.h +++ b/simde/arm/neon/st3_lane.h @@ -572,6 +572,43 @@ simde_vst3q_lane_p64(simde_poly64_t ptr[HEDLEY_ARRAY_PARAM(3)], simde_poly64x2x3 #define vst3q_lane_p64(a, b, c) simde_vst3q_lane_p64((a), (b), (c)) #endif +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst3_lane_bf16(simde_bfloat16_t ptr[HEDLEY_ARRAY_PARAM(3)], simde_bfloat16x4x3_t val, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 3) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + SIMDE_CONSTIFY_4_NO_RESULT_(vst3_lane_bf16, HEDLEY_UNREACHABLE(), lane, ptr, val); + #else + simde_bfloat16x4_private r; + for (size_t i = 0 ; i < 3 ; i++) { + r = simde_bfloat16x4_to_private(val.val[i]); + ptr[i] = r.values[lane]; + } + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst3_lane_bf16 + #define vst3_lane_bf16(a, b, c) simde_vst3_lane_bf16((a), (b), (c)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst3q_lane_bf16(simde_bfloat16_t ptr[HEDLEY_ARRAY_PARAM(3)], simde_bfloat16x8x3_t val, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 7) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + SIMDE_CONSTIFY_8_NO_RESULT_(vst3q_lane_bf16, HEDLEY_UNREACHABLE(), lane, ptr, val); + #else + simde_bfloat16x8_private r; + for (size_t i = 0 ; i < 3 ; i++) { + r = simde_bfloat16x8_to_private(val.val[i]); + ptr[i] = r.values[lane]; + } + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst3q_lane_bf16 + #define vst3q_lane_bf16(a, b, c) simde_vst3q_lane_bf16((a), (b), (c)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/st4.h b/simde/arm/neon/st4.h index db669fa63..7ed0ec480 100644 --- a/simde/arm/neon/st4.h +++ b/simde/arm/neon/st4.h @@ -598,6 +598,45 @@ simde_vst4q_p64(simde_poly64_t *ptr, simde_poly64x2x4_t val) { #define vst4q_p64(a, b) simde_vst4q_p64((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst4_bf16(simde_bfloat16_t *ptr, simde_bfloat16x4x4_t val) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + vst4_bf16(ptr, val); + #else + simde_bfloat16_t buf[16]; + simde_bfloat16x4_private a_[4] = { simde_bfloat16x4_to_private(val.val[0]), simde_bfloat16x4_to_private(val.val[1]), + simde_bfloat16x4_to_private(val.val[2]), simde_bfloat16x4_to_private(val.val[3]) }; + for (size_t i = 0; i < (sizeof(val.val[0]) / sizeof(*ptr)) * 4 ; i++) { + buf[i] = a_[i % 4].values[i / 4]; + } + simde_memcpy(ptr, buf, sizeof(buf)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst4_bf16 + #define vst4_bf16(a, b) simde_vst4_bf16((a), (b)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst4q_bf16(simde_bfloat16_t *ptr, simde_bfloat16x8x4_t val) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + vst4q_bf16(ptr, val); + #else + simde_bfloat16_t buf[32]; + simde_bfloat16x8_private a_[4] = { simde_bfloat16x8_to_private(val.val[0]), simde_bfloat16x8_to_private(val.val[1]), + simde_bfloat16x8_to_private(val.val[2]), simde_bfloat16x8_to_private(val.val[3]) }; + for (size_t i = 0; i < (sizeof(val.val[0]) / sizeof(*ptr)) * 4 ; i++) { + buf[i] = a_[i % 4].values[i / 4]; + } + simde_memcpy(ptr, buf, sizeof(buf)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst4q_bf16 + #define vst4q_bf16(a, b) simde_vst4q_bf16((a), (b)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/st4_lane.h b/simde/arm/neon/st4_lane.h index 76da61d1a..4f8a5b655 100644 --- a/simde/arm/neon/st4_lane.h +++ b/simde/arm/neon/st4_lane.h @@ -573,6 +573,43 @@ simde_vst4q_lane_p64(simde_poly64_t ptr[HEDLEY_ARRAY_PARAM(4)], simde_poly64x2x4 #define vst4q_lane_p64(a, b, c) simde_vst4q_lane_p64((a), (b), (c)) #endif +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst4_lane_bf16(simde_bfloat16_t ptr[HEDLEY_ARRAY_PARAM(4)], simde_bfloat16x4x4_t val, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 3) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + SIMDE_CONSTIFY_4_NO_RESULT_(vst4_lane_bf16, HEDLEY_UNREACHABLE(), lane, ptr, val); + #else + simde_bfloat16x4_private r; + for (size_t i = 0 ; i < 4 ; i++) { + r = simde_bfloat16x4_to_private(val.val[i]); + ptr[i] = r.values[lane]; + } + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst4_lane_bf16 + #define vst4_lane_bf16(a, b, c) simde_vst4_lane_bf16((a), (b), (c)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst4q_lane_bf16(simde_bfloat16_t ptr[HEDLEY_ARRAY_PARAM(4)], simde_bfloat16x8x4_t val, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 7) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + SIMDE_CONSTIFY_8_NO_RESULT_(vst4q_lane_bf16, HEDLEY_UNREACHABLE(), lane, ptr, val); + #else + simde_bfloat16x8_private r; + for (size_t i = 0 ; i < 4 ; i++) { + r = simde_bfloat16x8_to_private(val.val[i]); + ptr[i] = r.values[lane]; + } + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vst4q_lane_bf16 + #define vst4q_lane_bf16(a, b, c) simde_vst4q_lane_bf16((a), (b), (c)) +#endif #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/simde/arm/neon/types.h b/simde/arm/neon/types.h index e5a6ff6db..50ea467c0 100644 --- a/simde/arm/neon/types.h +++ b/simde/arm/neon/types.h @@ -30,6 +30,7 @@ #include "../../simde-common.h" #include "../../simde-f16.h" +#include "../../simde-bf16.h" HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS @@ -341,6 +342,22 @@ typedef union { SIMDE_ARM_NEON_DECLARE_VECTOR(simde_poly64, values, 16); } simde_poly64x2_private; +typedef union { + #if SIMDE_BFLOAT16_API == SIMDE_BFLOAT16_API_BF16 + SIMDE_ARM_NEON_DECLARE_VECTOR(simde_bfloat16, values, 8); + #else + simde_bfloat16 values[4]; + #endif +} simde_bfloat16x4_private; + +typedef union { + #if SIMDE_BFLOAT16_API == SIMDE_BFLOAT16_API_BF16 + SIMDE_ARM_NEON_DECLARE_VECTOR(simde_bfloat16, values, 16); + #else + simde_bfloat16 values[8]; + #endif +} simde_bfloat16x8_private; + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) typedef float32_t simde_float32_t; typedef poly8_t simde_poly8_t; @@ -456,6 +473,20 @@ typedef union { #define SIMDE_ARM_NEON_NEED_PORTABLE_F16 #endif + #if defined(SIMDE_ARM_NEON_BF16) + typedef bfloat16_t simde_bfloat16_t; + typedef bfloat16x4_t simde_bfloat16x4_t; + typedef bfloat16x4x2_t simde_bfloat16x4x2_t; + typedef bfloat16x4x3_t simde_bfloat16x4x3_t; + typedef bfloat16x4x4_t simde_bfloat16x4x4_t; + typedef bfloat16x8_t simde_bfloat16x8_t; + typedef bfloat16x8x2_t simde_bfloat16x8x2_t; + typedef bfloat16x8x3_t simde_bfloat16x8x3_t; + typedef bfloat16x8x4_t simde_bfloat16x8x4_t; + #else + #define SIMDE_ARM_NEON_NEED_PORTABLE_BF16 + #endif + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) typedef poly64_t simde_poly64_t; typedef poly64x1_t simde_poly64x1_t; @@ -501,6 +532,7 @@ typedef union { #define SIMDE_ARM_NEON_NEED_PORTABLE_POLY_64_BIT #define SIMDE_ARM_NEON_NEED_PORTABLE_POLY_128_BIT #define SIMDE_ARM_NEON_NEED_PORTABLE_POLY_VXN + #define SIMDE_ARM_NEON_NEED_PORTABLE_BF16 #define SIMDE_ARM_NEON_NEED_PORTABLE_VXN #define SIMDE_ARM_NEON_NEED_PORTABLE_F64X1XN @@ -564,6 +596,7 @@ typedef union { #define SIMDE_ARM_NEON_NEED_PORTABLE_POLY_64_BIT #define SIMDE_ARM_NEON_NEED_PORTABLE_POLY_128_BIT #define SIMDE_ARM_NEON_NEED_PORTABLE_POLY_VXN + #define SIMDE_ARM_NEON_NEED_PORTABLE_BF16 #define SIMDE_ARM_NEON_NEED_PORTABLE_64BIT @@ -590,6 +623,7 @@ typedef union { #define SIMDE_ARM_NEON_NEED_PORTABLE_POLY_64_BIT #define SIMDE_ARM_NEON_NEED_PORTABLE_POLY_128_BIT #define SIMDE_ARM_NEON_NEED_PORTABLE_POLY_VXN + #define SIMDE_ARM_NEON_NEED_PORTABLE_BF16 #define SIMDE_ARM_NEON_NEED_PORTABLE_64BIT #define SIMDE_ARM_NEON_NEED_PORTABLE_F64X1XN @@ -667,6 +701,7 @@ typedef union { #define SIMDE_ARM_NEON_NEED_PORTABLE_POLY_64_BIT #define SIMDE_ARM_NEON_NEED_PORTABLE_POLY_128_BIT #define SIMDE_ARM_NEON_NEED_PORTABLE_POLY_VXN + #define SIMDE_ARM_NEON_NEED_PORTABLE_BF16 #define SIMDE_ARM_NEON_NEED_PORTABLE_VXN #define SIMDE_ARM_NEON_NEED_PORTABLE_F64X1XN #define SIMDE_ARM_NEON_NEED_PORTABLE_F64X2XN @@ -675,6 +710,7 @@ typedef union { #define SIMDE_ARM_NEON_NEED_PORTABLE_POLY_64_BIT #define SIMDE_ARM_NEON_NEED_PORTABLE_POLY_128_BIT #define SIMDE_ARM_NEON_NEED_PORTABLE_POLY_VXN + #define SIMDE_ARM_NEON_NEED_PORTABLE_BF16 #define SIMDE_ARM_NEON_NEED_PORTABLE_F16 #define SIMDE_ARM_NEON_NEED_PORTABLE_F32 #define SIMDE_ARM_NEON_NEED_PORTABLE_F64 @@ -765,6 +801,35 @@ typedef union { } simde_poly16x8x4_t; #endif +#if defined(SIMDE_ARM_NEON_NEED_PORTABLE_BF16) + typedef simde_bfloat16 simde_bfloat16_t; + typedef simde_bfloat16x4_private simde_bfloat16x4_t; + typedef simde_bfloat16x8_private simde_bfloat16x8_t; + typedef struct simde_bfloat16x4x2_t { + simde_bfloat16x4_t val[2]; + } simde_bfloat16x4x2_t; + + typedef struct simde_bfloat16x8x2_t { + simde_bfloat16x8_t val[2]; + } simde_bfloat16x8x2_t; + + typedef struct simde_bfloat16x4x3_t { + simde_bfloat16x4_t val[3]; + } simde_bfloat16x4x3_t; + + typedef struct simde_bfloat16x8x3_t { + simde_bfloat16x8_t val[3]; + } simde_bfloat16x8x3_t; + + typedef struct simde_bfloat16x4x4_t { + simde_bfloat16x4_t val[4]; + } simde_bfloat16x4x4_t; + + typedef struct simde_bfloat16x8x4_t { + simde_bfloat16x8_t val[4]; + } simde_bfloat16x8x4_t; +#endif + #if defined(SIMDE_ARM_NEON_NEED_PORTABLE_I8X8) || defined(SIMDE_ARM_NEON_NEED_PORTABLE_64BIT) typedef simde_int8x8_private simde_int8x8_t; #endif @@ -1271,6 +1336,7 @@ SIMDE_ARM_NEON_TYPE_DEFINE_CONVERSIONS_(float64x1) SIMDE_ARM_NEON_TYPE_DEFINE_CONVERSIONS_(poly8x8) SIMDE_ARM_NEON_TYPE_DEFINE_CONVERSIONS_(poly16x4) SIMDE_ARM_NEON_TYPE_DEFINE_CONVERSIONS_(poly64x1) +SIMDE_ARM_NEON_TYPE_DEFINE_CONVERSIONS_(bfloat16x4) SIMDE_ARM_NEON_TYPE_DEFINE_CONVERSIONS_(int8x16) SIMDE_ARM_NEON_TYPE_DEFINE_CONVERSIONS_(int16x8) SIMDE_ARM_NEON_TYPE_DEFINE_CONVERSIONS_(int32x4) @@ -1285,6 +1351,7 @@ SIMDE_ARM_NEON_TYPE_DEFINE_CONVERSIONS_(poly64x2) SIMDE_ARM_NEON_TYPE_DEFINE_CONVERSIONS_(float16x8) SIMDE_ARM_NEON_TYPE_DEFINE_CONVERSIONS_(float32x4) SIMDE_ARM_NEON_TYPE_DEFINE_CONVERSIONS_(float64x2) +SIMDE_ARM_NEON_TYPE_DEFINE_CONVERSIONS_(bfloat16x8) SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/usdot.h b/simde/arm/neon/usdot.h index 464e8cebf..c1c4e0c59 100644 --- a/simde/arm/neon/usdot.h +++ b/simde/arm/neon/usdot.h @@ -56,7 +56,7 @@ simde_vusdot_s32(simde_int32x2_t r, simde_uint8x8_t a, simde_int8x8_t b) { return simde_vadd_s32(r, simde_int32x2_from_private(r_)); #endif } -#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) || (defined(SIMDE_ENABLE_NATIVE_ALIASES) && !defined(__ARM_FEATURE_MATMUL_INT8)) +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) #undef vusdot_s32 #define vusdot_s32(r, a, b) simde_vusdot_s32((r), (a), (b)) #endif @@ -82,7 +82,7 @@ simde_vusdotq_s32(simde_int32x4_t r, simde_uint8x16_t a, simde_int8x16_t b) { return simde_vaddq_s32(r, simde_int32x4_from_private(r_)); #endif } -#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) || (defined(SIMDE_ENABLE_NATIVE_ALIASES) && !defined(__ARM_FEATURE_MATMUL_INT8)) +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) #undef vusdotq_s32 #define vusdotq_s32(r, a, b) simde_vusdotq_s32((r), (a), (b)) #endif diff --git a/simde/simde-arch.h b/simde/simde-arch.h index 31ed4bc39..c1a975381 100644 --- a/simde/simde-arch.h +++ b/simde/simde-arch.h @@ -592,6 +592,11 @@ # define SIMDE_ARCH_ARM_NEON_FP16 #endif +/* Availability of 16-bit brain floating-point arithmetic intrinsics */ +#if defined(__ARM_FEATURE_BF16_VECTOR_ARITHMETIC) +# define SIMDE_ARCH_ARM_NEON_BF16 +#endif + /* LoongArch */ #if defined(__loongarch32) diff --git a/simde/simde-bf16.h b/simde/simde-bf16.h new file mode 100644 index 000000000..7e0736854 --- /dev/null +++ b/simde/simde-bf16.h @@ -0,0 +1,131 @@ +/* SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright: + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) + */ + +#include "hedley.h" +#include "simde-common.h" +#include "simde-detect-clang.h" + +#if !defined(SIMDE_BFLOAT16_H) +#define SIMDE_BFLOAT16_H + +HEDLEY_DIAGNOSTIC_PUSH +SIMDE_DISABLE_UNWANTED_DIAGNOSTICS +SIMDE_BEGIN_DECLS_ + +/* This implementations is based upon simde-f16.h */ + +/* Portable version which should work on pretty much any compiler. + * Obviously you can't rely on compiler support for things like + * conversion to/from 32-bit floats, so make sure you always use the + * functions and macros in this file! + */ +#define SIMDE_BFLOAT16_API_PORTABLE 1 + +#define SIMDE_BFLOAT16_API_BF16 2 + +#if !defined(SIMDE_BFLOAT16_API) + #if defined(SIMDE_ARM_NEON_BF16) + #define SIMDE_BFLOAT16_API SIMDE_BFLOAT16_API_BF16 + #else + #define SIMDE_BFLOAT16_API SIMDE_BFLOAT16_API_PORTABLE + #endif +#endif + +#if SIMDE_BFLOAT16_API == SIMDE_BFLOAT16_API_BF16 + #include + typedef __bf16 simde_bfloat16; +#elif SIMDE_BFLOAT16_API == SIMDE_BFLOAT16_API_PORTABLE + typedef struct { uint16_t value; } simde_bfloat16; +#else + #error No 16-bit floating point API. +#endif + +/* Conversion -- convert between single-precision and brain half-precision + * floats. */ +static HEDLEY_ALWAYS_INLINE HEDLEY_CONST +simde_bfloat16 +simde_bfloat16_from_float32 (simde_float32 value) { +#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vcvth_bf16_f32(value); +#else + simde_bfloat16 res; + char* src = HEDLEY_REINTERPRET_CAST(char*, &value); + // rounding to nearest bfloat16 + // If the 17th bit of value is 1, set the rounding to 1. + uint8_t rounding = 0; + + #if SIMDE_ENDIAN_ORDER == SIMDE_ENDIAN_LITTLE + if (src[1] & UINT8_C(0x80)) rounding = 1; + src[2] = HEDLEY_STATIC_CAST(char, (HEDLEY_STATIC_CAST(uint8_t, src[2]) + rounding)); + simde_memcpy(&res, src+2, sizeof(res)); + #else + if (src[2] & UINT8_C(0x80)) rounding = 1; + src[1] = HEDLEY_STATIC_CAST(char, (HEDLEY_STATIC_CAST(uint8_t, src[1]) + rounding)); + simde_memcpy(&res, src, sizeof(res)); + #endif + + return res; +#endif +} + +static HEDLEY_ALWAYS_INLINE HEDLEY_CONST +simde_float32 +simde_bfloat16_to_float32 (simde_bfloat16 value) { +#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_BF16) + return vcvtah_f32_bf16(value); +#else + simde_float32 res = 0.0; + char* _res = HEDLEY_REINTERPRET_CAST(char*, &res); + + #if SIMDE_ENDIAN_ORDER == SIMDE_ENDIAN_LITTLE + simde_memcpy(_res+2, &value, sizeof(value)); + #else + simde_memcpy(_res, &value, sizeof(value)); + #endif + + return res; +#endif +} + +SIMDE_DEFINE_CONVERSION_FUNCTION_(simde_uint16_as_bfloat16, simde_bfloat16, uint16_t) + +#define SIMDE_NANBF simde_uint16_as_bfloat16(0xFFC1) // a quiet Not-a-Number +#define SIMDE_INFINITYBF simde_uint16_as_bfloat16(0x7F80) +#define SIMDE_NINFINITYBF simde_uint16_as_bfloat16(0xFF80) + +#define SIMDE_BFLOAT16_VALUE(value) simde_bfloat16_from_float32(SIMDE_FLOAT32_C(value)) + +#if !defined(simde_isinfbf) && defined(simde_math_isinff) + #define simde_isinfbf(a) simde_math_isinff(simde_bfloat16_to_float32(a)) +#endif +#if !defined(simde_isnanbf) && defined(simde_math_isnanf) + #define simde_isnanbf(a) simde_math_isnanf(simde_bfloat16_to_float32(a)) +#endif + +SIMDE_END_DECLS_ +HEDLEY_DIAGNOSTIC_POP + +#endif /* !defined(SIMDE_BFLOAT16_H) */ diff --git a/simde/simde-features.h b/simde/simde-features.h index 34b4db4ea..c7717b0c7 100644 --- a/simde/simde-features.h +++ b/simde/simde-features.h @@ -720,6 +720,10 @@ #define SIMDE_ARM_NEON_FP16 #endif +#if defined(SIMDE_ARCH_ARM_NEON_BF16) + #define SIMDE_ARM_NEON_BF16 +#endif + #if !defined(SIMDE_LOONGARCH_LASX_NATIVE) && !defined(SIMDE_LOONGARCH_LASX_NO_NATIVE) && !defined(SIMDE_NO_NATIVE) #if defined(SIMDE_ARCH_LOONGARCH_LASX) #define SIMDE_LOONGARCH_LASX_NATIVE diff --git a/test/arm/neon/combine.c b/test/arm/neon/combine.c index 283b6b1d0..7d62c42c9 100644 --- a/test/arm/neon/combine.c +++ b/test/arm/neon/combine.c @@ -846,6 +846,73 @@ test_simde_vcombine_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vcombine_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16 a[4]; + simde_bfloat16 b[4]; + simde_bfloat16 r[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( -49.28), SIMDE_BFLOAT16_VALUE( -109.00), SIMDE_BFLOAT16_VALUE( -626.50), SIMDE_BFLOAT16_VALUE( -567.00) }, + { SIMDE_BFLOAT16_VALUE( -178.88), SIMDE_BFLOAT16_VALUE( 10.22), SIMDE_BFLOAT16_VALUE( 976.50), SIMDE_BFLOAT16_VALUE( -31.19) }, + { SIMDE_BFLOAT16_VALUE( -49.28), SIMDE_BFLOAT16_VALUE( -109.00), SIMDE_BFLOAT16_VALUE( -626.50), SIMDE_BFLOAT16_VALUE( -567.00), + SIMDE_BFLOAT16_VALUE( -178.88), SIMDE_BFLOAT16_VALUE( 10.22), SIMDE_BFLOAT16_VALUE( 976.50), SIMDE_BFLOAT16_VALUE( -31.19) } }, + { { SIMDE_BFLOAT16_VALUE( -226.00), SIMDE_BFLOAT16_VALUE( -520.50), SIMDE_BFLOAT16_VALUE( -252.38), SIMDE_BFLOAT16_VALUE( -407.50) }, + { SIMDE_BFLOAT16_VALUE( 89.44), SIMDE_BFLOAT16_VALUE( -200.50), SIMDE_BFLOAT16_VALUE( -439.75), SIMDE_BFLOAT16_VALUE( -450.75) }, + { SIMDE_BFLOAT16_VALUE( -226.00), SIMDE_BFLOAT16_VALUE( -520.50), SIMDE_BFLOAT16_VALUE( -252.38), SIMDE_BFLOAT16_VALUE( -407.50), + SIMDE_BFLOAT16_VALUE( 89.44), SIMDE_BFLOAT16_VALUE( -200.50), SIMDE_BFLOAT16_VALUE( -439.75), SIMDE_BFLOAT16_VALUE( -450.75) } }, + { { SIMDE_BFLOAT16_VALUE( -833.00), SIMDE_BFLOAT16_VALUE( -714.00), SIMDE_BFLOAT16_VALUE( 428.50), SIMDE_BFLOAT16_VALUE( 871.50) }, + { SIMDE_BFLOAT16_VALUE( -157.12), SIMDE_BFLOAT16_VALUE( 972.50), SIMDE_BFLOAT16_VALUE( 298.75), SIMDE_BFLOAT16_VALUE( -919.50) }, + { SIMDE_BFLOAT16_VALUE( -833.00), SIMDE_BFLOAT16_VALUE( -714.00), SIMDE_BFLOAT16_VALUE( 428.50), SIMDE_BFLOAT16_VALUE( 871.50), + SIMDE_BFLOAT16_VALUE( -157.12), SIMDE_BFLOAT16_VALUE( 972.50), SIMDE_BFLOAT16_VALUE( 298.75), SIMDE_BFLOAT16_VALUE( -919.50) } }, + { { SIMDE_BFLOAT16_VALUE( 488.00), SIMDE_BFLOAT16_VALUE( 112.56), SIMDE_BFLOAT16_VALUE( 58.66), SIMDE_BFLOAT16_VALUE( 879.50) }, + { SIMDE_BFLOAT16_VALUE( 129.00), SIMDE_BFLOAT16_VALUE( -858.50), SIMDE_BFLOAT16_VALUE( -133.88), SIMDE_BFLOAT16_VALUE( -920.50) }, + { SIMDE_BFLOAT16_VALUE( 488.00), SIMDE_BFLOAT16_VALUE( 112.56), SIMDE_BFLOAT16_VALUE( 58.66), SIMDE_BFLOAT16_VALUE( 879.50), + SIMDE_BFLOAT16_VALUE( 129.00), SIMDE_BFLOAT16_VALUE( -858.50), SIMDE_BFLOAT16_VALUE( -133.88), SIMDE_BFLOAT16_VALUE( -920.50) } }, + { { SIMDE_BFLOAT16_VALUE( 32.59), SIMDE_BFLOAT16_VALUE( 239.50), SIMDE_BFLOAT16_VALUE( -487.50), SIMDE_BFLOAT16_VALUE( 853.50) }, + { SIMDE_BFLOAT16_VALUE( -750.50), SIMDE_BFLOAT16_VALUE( -510.75), SIMDE_BFLOAT16_VALUE( -177.50), SIMDE_BFLOAT16_VALUE( 23.77) }, + { SIMDE_BFLOAT16_VALUE( 32.59), SIMDE_BFLOAT16_VALUE( 239.50), SIMDE_BFLOAT16_VALUE( -487.50), SIMDE_BFLOAT16_VALUE( 853.50), + SIMDE_BFLOAT16_VALUE( -750.50), SIMDE_BFLOAT16_VALUE( -510.75), SIMDE_BFLOAT16_VALUE( -177.50), SIMDE_BFLOAT16_VALUE( 23.77) } }, + { { SIMDE_BFLOAT16_VALUE( -31.45), SIMDE_BFLOAT16_VALUE( 570.00), SIMDE_BFLOAT16_VALUE( 616.00), SIMDE_BFLOAT16_VALUE( -942.00) }, + { SIMDE_BFLOAT16_VALUE( -630.50), SIMDE_BFLOAT16_VALUE( -823.50), SIMDE_BFLOAT16_VALUE( -392.75), SIMDE_BFLOAT16_VALUE( -463.25) }, + { SIMDE_BFLOAT16_VALUE( -31.45), SIMDE_BFLOAT16_VALUE( 570.00), SIMDE_BFLOAT16_VALUE( 616.00), SIMDE_BFLOAT16_VALUE( -942.00), + SIMDE_BFLOAT16_VALUE( -630.50), SIMDE_BFLOAT16_VALUE( -823.50), SIMDE_BFLOAT16_VALUE( -392.75), SIMDE_BFLOAT16_VALUE( -463.25) } }, + { { SIMDE_BFLOAT16_VALUE( -537.50), SIMDE_BFLOAT16_VALUE( -964.50), SIMDE_BFLOAT16_VALUE( -592.00), SIMDE_BFLOAT16_VALUE( 305.50) }, + { SIMDE_BFLOAT16_VALUE( -992.00), SIMDE_BFLOAT16_VALUE( 707.00), SIMDE_BFLOAT16_VALUE( 386.00), SIMDE_BFLOAT16_VALUE( 496.00) }, + { SIMDE_BFLOAT16_VALUE( -537.50), SIMDE_BFLOAT16_VALUE( -964.50), SIMDE_BFLOAT16_VALUE( -592.00), SIMDE_BFLOAT16_VALUE( 305.50), + SIMDE_BFLOAT16_VALUE( -992.00), SIMDE_BFLOAT16_VALUE( 707.00), SIMDE_BFLOAT16_VALUE( 386.00), SIMDE_BFLOAT16_VALUE( 496.00) } }, + { { SIMDE_BFLOAT16_VALUE( -180.50), SIMDE_BFLOAT16_VALUE( -555.50), SIMDE_BFLOAT16_VALUE( 375.50), SIMDE_BFLOAT16_VALUE( 948.50) }, + { SIMDE_BFLOAT16_VALUE( -413.75), SIMDE_BFLOAT16_VALUE( -758.50), SIMDE_BFLOAT16_VALUE( -972.00), SIMDE_BFLOAT16_VALUE( 619.00) }, + { SIMDE_BFLOAT16_VALUE( -180.50), SIMDE_BFLOAT16_VALUE( -555.50), SIMDE_BFLOAT16_VALUE( 375.50), SIMDE_BFLOAT16_VALUE( 948.50), + SIMDE_BFLOAT16_VALUE( -413.75), SIMDE_BFLOAT16_VALUE( -758.50), SIMDE_BFLOAT16_VALUE( -972.00), SIMDE_BFLOAT16_VALUE( 619.00) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a); + simde_bfloat16x4_t b = simde_vld1_bf16(test_vec[i].b); + simde_bfloat16x8_t r = simde_vcombine_bf16(a, b); + + simde_test_arm_neon_assert_equal_bf16x8(r, simde_vld1q_bf16(test_vec[i].r), 1); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(-100.0f, 100.0f); + simde_bfloat16x4_t b = simde_test_arm_neon_random_bf16x4(-100.0f, 100.0f); + simde_bfloat16x8_t r = simde_vcombine_bf16(a, b); + + simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vcombine_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vcombine_f32) @@ -861,6 +928,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vcombine_u64) SIMDE_TEST_FUNC_LIST_ENTRY(vcombine_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vcombine_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vcombine_p64) +SIMDE_TEST_FUNC_LIST_ENTRY(vcombine_bf16) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/copy_lane.c b/test/arm/neon/copy_lane.c index 04e822317..297df843e 100644 --- a/test/arm/neon/copy_lane.c +++ b/test/arm/neon/copy_lane.c @@ -6681,6 +6681,400 @@ test_simde_vcopyq_laneq_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vcopy_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[4]; + simde_bfloat16_t b[4]; + simde_bfloat16_t r00[4]; + simde_bfloat16_t r01[4]; + simde_bfloat16_t r13[4]; + simde_bfloat16_t r22[4]; + simde_bfloat16_t r33[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 908.00), SIMDE_BFLOAT16_VALUE( -852.00), SIMDE_BFLOAT16_VALUE( 788.00), SIMDE_BFLOAT16_VALUE( 880.00) }, + { SIMDE_BFLOAT16_VALUE( 15.94), SIMDE_BFLOAT16_VALUE( 964.00), SIMDE_BFLOAT16_VALUE( -406.00), SIMDE_BFLOAT16_VALUE( 484.00) }, + { SIMDE_BFLOAT16_VALUE( 15.94), SIMDE_BFLOAT16_VALUE( -852.00), SIMDE_BFLOAT16_VALUE( 788.00), SIMDE_BFLOAT16_VALUE( 880.00) }, + { SIMDE_BFLOAT16_VALUE( 964.00), SIMDE_BFLOAT16_VALUE( -852.00), SIMDE_BFLOAT16_VALUE( 788.00), SIMDE_BFLOAT16_VALUE( 880.00) }, + { SIMDE_BFLOAT16_VALUE( 908.00), SIMDE_BFLOAT16_VALUE( 484.00), SIMDE_BFLOAT16_VALUE( 788.00), SIMDE_BFLOAT16_VALUE( 880.00) }, + { SIMDE_BFLOAT16_VALUE( 908.00), SIMDE_BFLOAT16_VALUE( -852.00), SIMDE_BFLOAT16_VALUE( -406.00), SIMDE_BFLOAT16_VALUE( 880.00) }, + { SIMDE_BFLOAT16_VALUE( 908.00), SIMDE_BFLOAT16_VALUE( -852.00), SIMDE_BFLOAT16_VALUE( 788.00), SIMDE_BFLOAT16_VALUE( 484.00) } }, + { { SIMDE_BFLOAT16_VALUE( -24.38), SIMDE_BFLOAT16_VALUE( -424.00), SIMDE_BFLOAT16_VALUE( 864.00), SIMDE_BFLOAT16_VALUE( 25.25) }, + { SIMDE_BFLOAT16_VALUE( 95.00), SIMDE_BFLOAT16_VALUE( -494.00), SIMDE_BFLOAT16_VALUE( -340.00), SIMDE_BFLOAT16_VALUE( -744.00) }, + { SIMDE_BFLOAT16_VALUE( 95.00), SIMDE_BFLOAT16_VALUE( -424.00), SIMDE_BFLOAT16_VALUE( 864.00), SIMDE_BFLOAT16_VALUE( 25.25) }, + { SIMDE_BFLOAT16_VALUE( -494.00), SIMDE_BFLOAT16_VALUE( -424.00), SIMDE_BFLOAT16_VALUE( 864.00), SIMDE_BFLOAT16_VALUE( 25.25) }, + { SIMDE_BFLOAT16_VALUE( -24.38), SIMDE_BFLOAT16_VALUE( -744.00), SIMDE_BFLOAT16_VALUE( 864.00), SIMDE_BFLOAT16_VALUE( 25.25) }, + { SIMDE_BFLOAT16_VALUE( -24.38), SIMDE_BFLOAT16_VALUE( -424.00), SIMDE_BFLOAT16_VALUE( -340.00), SIMDE_BFLOAT16_VALUE( 25.25) }, + { SIMDE_BFLOAT16_VALUE( -24.38), SIMDE_BFLOAT16_VALUE( -424.00), SIMDE_BFLOAT16_VALUE( 864.00), SIMDE_BFLOAT16_VALUE( -744.00) } }, + { { SIMDE_BFLOAT16_VALUE( -310.00), SIMDE_BFLOAT16_VALUE( 556.00), SIMDE_BFLOAT16_VALUE( -434.00), SIMDE_BFLOAT16_VALUE( 884.00) }, + { SIMDE_BFLOAT16_VALUE( 430.00), SIMDE_BFLOAT16_VALUE( -784.00), SIMDE_BFLOAT16_VALUE( -458.00), SIMDE_BFLOAT16_VALUE( 224.00) }, + { SIMDE_BFLOAT16_VALUE( 430.00), SIMDE_BFLOAT16_VALUE( 556.00), SIMDE_BFLOAT16_VALUE( -434.00), SIMDE_BFLOAT16_VALUE( 884.00) }, + { SIMDE_BFLOAT16_VALUE( -784.00), SIMDE_BFLOAT16_VALUE( 556.00), SIMDE_BFLOAT16_VALUE( -434.00), SIMDE_BFLOAT16_VALUE( 884.00) }, + { SIMDE_BFLOAT16_VALUE( -310.00), SIMDE_BFLOAT16_VALUE( 224.00), SIMDE_BFLOAT16_VALUE( -434.00), SIMDE_BFLOAT16_VALUE( 884.00) }, + { SIMDE_BFLOAT16_VALUE( -310.00), SIMDE_BFLOAT16_VALUE( 556.00), SIMDE_BFLOAT16_VALUE( -458.00), SIMDE_BFLOAT16_VALUE( 884.00) }, + { SIMDE_BFLOAT16_VALUE( -310.00), SIMDE_BFLOAT16_VALUE( 556.00), SIMDE_BFLOAT16_VALUE( -434.00), SIMDE_BFLOAT16_VALUE( 224.00) } }, + { { SIMDE_BFLOAT16_VALUE( -964.00), SIMDE_BFLOAT16_VALUE( -90.00), SIMDE_BFLOAT16_VALUE( -940.00), SIMDE_BFLOAT16_VALUE( -204.00) }, + { SIMDE_BFLOAT16_VALUE( -390.00), SIMDE_BFLOAT16_VALUE( -57.00), SIMDE_BFLOAT16_VALUE( 332.00), SIMDE_BFLOAT16_VALUE( -480.00) }, + { SIMDE_BFLOAT16_VALUE( -390.00), SIMDE_BFLOAT16_VALUE( -90.00), SIMDE_BFLOAT16_VALUE( -940.00), SIMDE_BFLOAT16_VALUE( -204.00) }, + { SIMDE_BFLOAT16_VALUE( -57.00), SIMDE_BFLOAT16_VALUE( -90.00), SIMDE_BFLOAT16_VALUE( -940.00), SIMDE_BFLOAT16_VALUE( -204.00) }, + { SIMDE_BFLOAT16_VALUE( -964.00), SIMDE_BFLOAT16_VALUE( -480.00), SIMDE_BFLOAT16_VALUE( -940.00), SIMDE_BFLOAT16_VALUE( -204.00) }, + { SIMDE_BFLOAT16_VALUE( -964.00), SIMDE_BFLOAT16_VALUE( -90.00), SIMDE_BFLOAT16_VALUE( 332.00), SIMDE_BFLOAT16_VALUE( -204.00) }, + { SIMDE_BFLOAT16_VALUE( -964.00), SIMDE_BFLOAT16_VALUE( -90.00), SIMDE_BFLOAT16_VALUE( -940.00), SIMDE_BFLOAT16_VALUE( -480.00) } }, + { { SIMDE_BFLOAT16_VALUE( 89.50), SIMDE_BFLOAT16_VALUE( 124.50), SIMDE_BFLOAT16_VALUE( -596.00), SIMDE_BFLOAT16_VALUE( -892.00) }, + { SIMDE_BFLOAT16_VALUE( 90.00), SIMDE_BFLOAT16_VALUE( -6.28), SIMDE_BFLOAT16_VALUE( 588.00), SIMDE_BFLOAT16_VALUE( -932.00) }, + { SIMDE_BFLOAT16_VALUE( 90.00), SIMDE_BFLOAT16_VALUE( 124.50), SIMDE_BFLOAT16_VALUE( -596.00), SIMDE_BFLOAT16_VALUE( -892.00) }, + { SIMDE_BFLOAT16_VALUE( -6.28), SIMDE_BFLOAT16_VALUE( 124.50), SIMDE_BFLOAT16_VALUE( -596.00), SIMDE_BFLOAT16_VALUE( -892.00) }, + { SIMDE_BFLOAT16_VALUE( 89.50), SIMDE_BFLOAT16_VALUE( -932.00), SIMDE_BFLOAT16_VALUE( -596.00), SIMDE_BFLOAT16_VALUE( -892.00) }, + { SIMDE_BFLOAT16_VALUE( 89.50), SIMDE_BFLOAT16_VALUE( 124.50), SIMDE_BFLOAT16_VALUE( 588.00), SIMDE_BFLOAT16_VALUE( -892.00) }, + { SIMDE_BFLOAT16_VALUE( 89.50), SIMDE_BFLOAT16_VALUE( 124.50), SIMDE_BFLOAT16_VALUE( -596.00), SIMDE_BFLOAT16_VALUE( -932.00) } }, + { { SIMDE_BFLOAT16_VALUE( 568.00), SIMDE_BFLOAT16_VALUE( 456.00), SIMDE_BFLOAT16_VALUE( 91.00), SIMDE_BFLOAT16_VALUE( -336.00) }, + { SIMDE_BFLOAT16_VALUE( 960.00), SIMDE_BFLOAT16_VALUE( 748.00), SIMDE_BFLOAT16_VALUE( -81.50), SIMDE_BFLOAT16_VALUE( -348.00) }, + { SIMDE_BFLOAT16_VALUE( 960.00), SIMDE_BFLOAT16_VALUE( 456.00), SIMDE_BFLOAT16_VALUE( 91.00), SIMDE_BFLOAT16_VALUE( -336.00) }, + { SIMDE_BFLOAT16_VALUE( 748.00), SIMDE_BFLOAT16_VALUE( 456.00), SIMDE_BFLOAT16_VALUE( 91.00), SIMDE_BFLOAT16_VALUE( -336.00) }, + { SIMDE_BFLOAT16_VALUE( 568.00), SIMDE_BFLOAT16_VALUE( -348.00), SIMDE_BFLOAT16_VALUE( 91.00), SIMDE_BFLOAT16_VALUE( -336.00) }, + { SIMDE_BFLOAT16_VALUE( 568.00), SIMDE_BFLOAT16_VALUE( 456.00), SIMDE_BFLOAT16_VALUE( -81.50), SIMDE_BFLOAT16_VALUE( -336.00) }, + { SIMDE_BFLOAT16_VALUE( 568.00), SIMDE_BFLOAT16_VALUE( 456.00), SIMDE_BFLOAT16_VALUE( 91.00), SIMDE_BFLOAT16_VALUE( -348.00) } }, + { { SIMDE_BFLOAT16_VALUE( 308.00), SIMDE_BFLOAT16_VALUE( 482.00), SIMDE_BFLOAT16_VALUE( -462.00), SIMDE_BFLOAT16_VALUE( -260.00) }, + { SIMDE_BFLOAT16_VALUE( 692.00), SIMDE_BFLOAT16_VALUE( 78.00), SIMDE_BFLOAT16_VALUE( 960.00), SIMDE_BFLOAT16_VALUE( 728.00) }, + { SIMDE_BFLOAT16_VALUE( 692.00), SIMDE_BFLOAT16_VALUE( 482.00), SIMDE_BFLOAT16_VALUE( -462.00), SIMDE_BFLOAT16_VALUE( -260.00) }, + { SIMDE_BFLOAT16_VALUE( 78.00), SIMDE_BFLOAT16_VALUE( 482.00), SIMDE_BFLOAT16_VALUE( -462.00), SIMDE_BFLOAT16_VALUE( -260.00) }, + { SIMDE_BFLOAT16_VALUE( 308.00), SIMDE_BFLOAT16_VALUE( 728.00), SIMDE_BFLOAT16_VALUE( -462.00), SIMDE_BFLOAT16_VALUE( -260.00) }, + { SIMDE_BFLOAT16_VALUE( 308.00), SIMDE_BFLOAT16_VALUE( 482.00), SIMDE_BFLOAT16_VALUE( 960.00), SIMDE_BFLOAT16_VALUE( -260.00) }, + { SIMDE_BFLOAT16_VALUE( 308.00), SIMDE_BFLOAT16_VALUE( 482.00), SIMDE_BFLOAT16_VALUE( -462.00), SIMDE_BFLOAT16_VALUE( 728.00) } }, + { { SIMDE_BFLOAT16_VALUE( 984.00), SIMDE_BFLOAT16_VALUE( -980.00), SIMDE_BFLOAT16_VALUE( -472.00), SIMDE_BFLOAT16_VALUE( -402.00) }, + { SIMDE_BFLOAT16_VALUE( -37.25), SIMDE_BFLOAT16_VALUE( 860.00), SIMDE_BFLOAT16_VALUE( 114.50), SIMDE_BFLOAT16_VALUE( -944.00) }, + { SIMDE_BFLOAT16_VALUE( -37.25), SIMDE_BFLOAT16_VALUE( -980.00), SIMDE_BFLOAT16_VALUE( -472.00), SIMDE_BFLOAT16_VALUE( -402.00) }, + { SIMDE_BFLOAT16_VALUE( 860.00), SIMDE_BFLOAT16_VALUE( -980.00), SIMDE_BFLOAT16_VALUE( -472.00), SIMDE_BFLOAT16_VALUE( -402.00) }, + { SIMDE_BFLOAT16_VALUE( 984.00), SIMDE_BFLOAT16_VALUE( -944.00), SIMDE_BFLOAT16_VALUE( -472.00), SIMDE_BFLOAT16_VALUE( -402.00) }, + { SIMDE_BFLOAT16_VALUE( 984.00), SIMDE_BFLOAT16_VALUE( -980.00), SIMDE_BFLOAT16_VALUE( 114.50), SIMDE_BFLOAT16_VALUE( -402.00) }, + { SIMDE_BFLOAT16_VALUE( 984.00), SIMDE_BFLOAT16_VALUE( -980.00), SIMDE_BFLOAT16_VALUE( -472.00), SIMDE_BFLOAT16_VALUE( -944.00) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a); + simde_bfloat16x4_t b = simde_vld1_bf16(test_vec[i].b); + + simde_bfloat16x4_t r00 = simde_vcopy_lane_bf16(a, 0, b, 0); + simde_bfloat16x4_t r01 = simde_vcopy_lane_bf16(a, 0, b, 1); + simde_bfloat16x4_t r13 = simde_vcopy_lane_bf16(a, 1, b, 3); + simde_bfloat16x4_t r22 = simde_vcopy_lane_bf16(a, 2, b, 2); + simde_bfloat16x4_t r33 = simde_vcopy_lane_bf16(a, 3, b, 3); + + simde_test_arm_neon_assert_equal_bf16x4(r00, simde_vld1_bf16(test_vec[i].r00), 1); + simde_test_arm_neon_assert_equal_bf16x4(r01, simde_vld1_bf16(test_vec[i].r01), 1); + simde_test_arm_neon_assert_equal_bf16x4(r13, simde_vld1_bf16(test_vec[i].r13), 1); + simde_test_arm_neon_assert_equal_bf16x4(r22, simde_vld1_bf16(test_vec[i].r22), 1); + simde_test_arm_neon_assert_equal_bf16x4(r33, simde_vld1_bf16(test_vec[i].r33), 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-1000.0), SIMDE_BFLOAT16_VALUE(1000.0)); + simde_bfloat16x4_t b = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-1000.0), SIMDE_BFLOAT16_VALUE(1000.0)); + simde_bfloat16x4_t r00 = simde_vcopy_lane_bf16(a, 0, b, 0); + simde_bfloat16x4_t r01 = simde_vcopy_lane_bf16(a, 0, b, 1); + simde_bfloat16x4_t r13 = simde_vcopy_lane_bf16(a, 1, b, 3); + simde_bfloat16x4_t r22 = simde_vcopy_lane_bf16(a, 2, b, 2); + simde_bfloat16x4_t r33 = simde_vcopy_lane_bf16(a, 3, b, 3); + + simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x4(2, r00, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x4(2, r01, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x4(2, r13, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x4(2, r22, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x4(2, r33, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vcopy_laneq_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[4]; + simde_bfloat16_t b[8]; + simde_bfloat16_t r0_0[4]; + simde_bfloat16_t r1_3[4]; + simde_bfloat16_t r2_5[4]; + simde_bfloat16_t r3_7[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( -908.00), SIMDE_BFLOAT16_VALUE( -536.00), SIMDE_BFLOAT16_VALUE( -217.00), SIMDE_BFLOAT16_VALUE( -788.00) }, + { SIMDE_BFLOAT16_VALUE( 572.00), SIMDE_BFLOAT16_VALUE( 143.00), SIMDE_BFLOAT16_VALUE( 732.00), SIMDE_BFLOAT16_VALUE( -114.00), + SIMDE_BFLOAT16_VALUE( -392.00), SIMDE_BFLOAT16_VALUE( 272.00), SIMDE_BFLOAT16_VALUE( 498.00), SIMDE_BFLOAT16_VALUE( 382.00) }, + { SIMDE_BFLOAT16_VALUE( 572.00), SIMDE_BFLOAT16_VALUE( -536.00), SIMDE_BFLOAT16_VALUE( -217.00), SIMDE_BFLOAT16_VALUE( -788.00) }, + { SIMDE_BFLOAT16_VALUE( -908.00), SIMDE_BFLOAT16_VALUE( -114.00), SIMDE_BFLOAT16_VALUE( -217.00), SIMDE_BFLOAT16_VALUE( -788.00) }, + { SIMDE_BFLOAT16_VALUE( -908.00), SIMDE_BFLOAT16_VALUE( -536.00), SIMDE_BFLOAT16_VALUE( 272.00), SIMDE_BFLOAT16_VALUE( -788.00) }, + { SIMDE_BFLOAT16_VALUE( -908.00), SIMDE_BFLOAT16_VALUE( -536.00), SIMDE_BFLOAT16_VALUE( -217.00), SIMDE_BFLOAT16_VALUE( 382.00) } }, + { { SIMDE_BFLOAT16_VALUE( 128.00), SIMDE_BFLOAT16_VALUE( 652.00), SIMDE_BFLOAT16_VALUE( 290.00), SIMDE_BFLOAT16_VALUE( -860.00) }, + { SIMDE_BFLOAT16_VALUE( 302.00), SIMDE_BFLOAT16_VALUE( -672.00), SIMDE_BFLOAT16_VALUE( -752.00), SIMDE_BFLOAT16_VALUE( 736.00), + SIMDE_BFLOAT16_VALUE( -106.50), SIMDE_BFLOAT16_VALUE( -524.00), SIMDE_BFLOAT16_VALUE( -996.00), SIMDE_BFLOAT16_VALUE( 420.00) }, + { SIMDE_BFLOAT16_VALUE( 302.00), SIMDE_BFLOAT16_VALUE( 652.00), SIMDE_BFLOAT16_VALUE( 290.00), SIMDE_BFLOAT16_VALUE( -860.00) }, + { SIMDE_BFLOAT16_VALUE( 128.00), SIMDE_BFLOAT16_VALUE( 736.00), SIMDE_BFLOAT16_VALUE( 290.00), SIMDE_BFLOAT16_VALUE( -860.00) }, + { SIMDE_BFLOAT16_VALUE( 128.00), SIMDE_BFLOAT16_VALUE( 652.00), SIMDE_BFLOAT16_VALUE( -524.00), SIMDE_BFLOAT16_VALUE( -860.00) }, + { SIMDE_BFLOAT16_VALUE( 128.00), SIMDE_BFLOAT16_VALUE( 652.00), SIMDE_BFLOAT16_VALUE( 290.00), SIMDE_BFLOAT16_VALUE( 420.00) } }, + { { SIMDE_BFLOAT16_VALUE( -640.00), SIMDE_BFLOAT16_VALUE( -696.00), SIMDE_BFLOAT16_VALUE( -688.00), SIMDE_BFLOAT16_VALUE( -632.00) }, + { SIMDE_BFLOAT16_VALUE( 86.50), SIMDE_BFLOAT16_VALUE( 428.00), SIMDE_BFLOAT16_VALUE( -912.00), SIMDE_BFLOAT16_VALUE( 175.00), + SIMDE_BFLOAT16_VALUE( 888.00), SIMDE_BFLOAT16_VALUE( -131.00), SIMDE_BFLOAT16_VALUE( 382.00), SIMDE_BFLOAT16_VALUE( 462.00) }, + { SIMDE_BFLOAT16_VALUE( 86.50), SIMDE_BFLOAT16_VALUE( -696.00), SIMDE_BFLOAT16_VALUE( -688.00), SIMDE_BFLOAT16_VALUE( -632.00) }, + { SIMDE_BFLOAT16_VALUE( -640.00), SIMDE_BFLOAT16_VALUE( 175.00), SIMDE_BFLOAT16_VALUE( -688.00), SIMDE_BFLOAT16_VALUE( -632.00) }, + { SIMDE_BFLOAT16_VALUE( -640.00), SIMDE_BFLOAT16_VALUE( -696.00), SIMDE_BFLOAT16_VALUE( -131.00), SIMDE_BFLOAT16_VALUE( -632.00) }, + { SIMDE_BFLOAT16_VALUE( -640.00), SIMDE_BFLOAT16_VALUE( -696.00), SIMDE_BFLOAT16_VALUE( -688.00), SIMDE_BFLOAT16_VALUE( 462.00) } }, + { { SIMDE_BFLOAT16_VALUE( -988.00), SIMDE_BFLOAT16_VALUE( 118.50), SIMDE_BFLOAT16_VALUE( -648.00), SIMDE_BFLOAT16_VALUE( -380.00) }, + { SIMDE_BFLOAT16_VALUE( -608.00), SIMDE_BFLOAT16_VALUE( 844.00), SIMDE_BFLOAT16_VALUE( -996.00), SIMDE_BFLOAT16_VALUE( 520.00), + SIMDE_BFLOAT16_VALUE( 502.00), SIMDE_BFLOAT16_VALUE( 292.00), SIMDE_BFLOAT16_VALUE( 656.00), SIMDE_BFLOAT16_VALUE( -194.00) }, + { SIMDE_BFLOAT16_VALUE( -608.00), SIMDE_BFLOAT16_VALUE( 118.50), SIMDE_BFLOAT16_VALUE( -648.00), SIMDE_BFLOAT16_VALUE( -380.00) }, + { SIMDE_BFLOAT16_VALUE( -988.00), SIMDE_BFLOAT16_VALUE( 520.00), SIMDE_BFLOAT16_VALUE( -648.00), SIMDE_BFLOAT16_VALUE( -380.00) }, + { SIMDE_BFLOAT16_VALUE( -988.00), SIMDE_BFLOAT16_VALUE( 118.50), SIMDE_BFLOAT16_VALUE( 292.00), SIMDE_BFLOAT16_VALUE( -380.00) }, + { SIMDE_BFLOAT16_VALUE( -988.00), SIMDE_BFLOAT16_VALUE( 118.50), SIMDE_BFLOAT16_VALUE( -648.00), SIMDE_BFLOAT16_VALUE( -194.00) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a); + simde_bfloat16x8_t b = simde_vld1q_bf16(test_vec[i].b); + + simde_bfloat16x4_t r0_0 = simde_vcopy_laneq_bf16(a, 0, b, 0); + simde_bfloat16x4_t r1_3 = simde_vcopy_laneq_bf16(a, 1, b, 3); + simde_bfloat16x4_t r2_5 = simde_vcopy_laneq_bf16(a, 2, b, 5); + simde_bfloat16x4_t r3_7 = simde_vcopy_laneq_bf16(a, 3, b, 7); + + simde_test_arm_neon_assert_equal_bf16x4(r0_0, simde_vld1_bf16(test_vec[i].r0_0), 1); + simde_test_arm_neon_assert_equal_bf16x4(r1_3, simde_vld1_bf16(test_vec[i].r1_3), 1); + simde_test_arm_neon_assert_equal_bf16x4(r2_5, simde_vld1_bf16(test_vec[i].r2_5), 1); + simde_test_arm_neon_assert_equal_bf16x4(r3_7, simde_vld1_bf16(test_vec[i].r3_7), 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-1000.0), SIMDE_BFLOAT16_VALUE(1000.0)); + simde_bfloat16x8_t b = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-1000.0), SIMDE_BFLOAT16_VALUE(1000.0)); + simde_bfloat16x4_t r0_0 = simde_vcopy_laneq_bf16(a, 0, b, 0); + simde_bfloat16x4_t r1_3 = simde_vcopy_laneq_bf16(a, 1, b, 3); + simde_bfloat16x4_t r2_5 = simde_vcopy_laneq_bf16(a, 2, b, 5); + simde_bfloat16x4_t r3_7 = simde_vcopy_laneq_bf16(a, 3, b, 7); + + simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x4(2, r0_0, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x4(2, r1_3, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x4(2, r2_5, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x4(2, r3_7, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vcopyq_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[8]; + simde_bfloat16_t b[4]; + simde_bfloat16_t r0_3[8]; + simde_bfloat16_t r3_2[8]; + simde_bfloat16_t r5_1[8]; + simde_bfloat16_t r7_0[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 616.00), SIMDE_BFLOAT16_VALUE( 900.00), SIMDE_BFLOAT16_VALUE( -454.00), SIMDE_BFLOAT16_VALUE( -486.00), + SIMDE_BFLOAT16_VALUE( -620.00), SIMDE_BFLOAT16_VALUE( -452.00), SIMDE_BFLOAT16_VALUE( 932.00), SIMDE_BFLOAT16_VALUE( -262.00) }, + { SIMDE_BFLOAT16_VALUE( -151.00), SIMDE_BFLOAT16_VALUE( -756.00), SIMDE_BFLOAT16_VALUE( 100.50), SIMDE_BFLOAT16_VALUE( 932.00) }, + { SIMDE_BFLOAT16_VALUE( 932.00), SIMDE_BFLOAT16_VALUE( 900.00), SIMDE_BFLOAT16_VALUE( -454.00), SIMDE_BFLOAT16_VALUE( -486.00), + SIMDE_BFLOAT16_VALUE( -620.00), SIMDE_BFLOAT16_VALUE( -452.00), SIMDE_BFLOAT16_VALUE( 932.00), SIMDE_BFLOAT16_VALUE( -262.00) }, + { SIMDE_BFLOAT16_VALUE( 616.00), SIMDE_BFLOAT16_VALUE( 900.00), SIMDE_BFLOAT16_VALUE( -454.00), SIMDE_BFLOAT16_VALUE( 100.50), + SIMDE_BFLOAT16_VALUE( -620.00), SIMDE_BFLOAT16_VALUE( -452.00), SIMDE_BFLOAT16_VALUE( 932.00), SIMDE_BFLOAT16_VALUE( -262.00) }, + { SIMDE_BFLOAT16_VALUE( 616.00), SIMDE_BFLOAT16_VALUE( 900.00), SIMDE_BFLOAT16_VALUE( -454.00), SIMDE_BFLOAT16_VALUE( -486.00), + SIMDE_BFLOAT16_VALUE( -620.00), SIMDE_BFLOAT16_VALUE( -756.00), SIMDE_BFLOAT16_VALUE( 932.00), SIMDE_BFLOAT16_VALUE( -262.00) }, + { SIMDE_BFLOAT16_VALUE( 616.00), SIMDE_BFLOAT16_VALUE( 900.00), SIMDE_BFLOAT16_VALUE( -454.00), SIMDE_BFLOAT16_VALUE( -486.00), + SIMDE_BFLOAT16_VALUE( -620.00), SIMDE_BFLOAT16_VALUE( -452.00), SIMDE_BFLOAT16_VALUE( 932.00), SIMDE_BFLOAT16_VALUE( -151.00) } }, + { { SIMDE_BFLOAT16_VALUE( 672.00), SIMDE_BFLOAT16_VALUE( 186.00), SIMDE_BFLOAT16_VALUE( 111.00), SIMDE_BFLOAT16_VALUE( 560.00), + SIMDE_BFLOAT16_VALUE( -944.00), SIMDE_BFLOAT16_VALUE( -504.00), SIMDE_BFLOAT16_VALUE( 23.75), SIMDE_BFLOAT16_VALUE( -932.00) }, + { SIMDE_BFLOAT16_VALUE( 612.00), SIMDE_BFLOAT16_VALUE( 372.00), SIMDE_BFLOAT16_VALUE( -314.00), SIMDE_BFLOAT16_VALUE( -992.00) }, + { SIMDE_BFLOAT16_VALUE( -992.00), SIMDE_BFLOAT16_VALUE( 186.00), SIMDE_BFLOAT16_VALUE( 111.00), SIMDE_BFLOAT16_VALUE( 560.00), + SIMDE_BFLOAT16_VALUE( -944.00), SIMDE_BFLOAT16_VALUE( -504.00), SIMDE_BFLOAT16_VALUE( 23.75), SIMDE_BFLOAT16_VALUE( -932.00) }, + { SIMDE_BFLOAT16_VALUE( 672.00), SIMDE_BFLOAT16_VALUE( 186.00), SIMDE_BFLOAT16_VALUE( 111.00), SIMDE_BFLOAT16_VALUE( -314.00), + SIMDE_BFLOAT16_VALUE( -944.00), SIMDE_BFLOAT16_VALUE( -504.00), SIMDE_BFLOAT16_VALUE( 23.75), SIMDE_BFLOAT16_VALUE( -932.00) }, + { SIMDE_BFLOAT16_VALUE( 672.00), SIMDE_BFLOAT16_VALUE( 186.00), SIMDE_BFLOAT16_VALUE( 111.00), SIMDE_BFLOAT16_VALUE( 560.00), + SIMDE_BFLOAT16_VALUE( -944.00), SIMDE_BFLOAT16_VALUE( 372.00), SIMDE_BFLOAT16_VALUE( 23.75), SIMDE_BFLOAT16_VALUE( -932.00) }, + { SIMDE_BFLOAT16_VALUE( 672.00), SIMDE_BFLOAT16_VALUE( 186.00), SIMDE_BFLOAT16_VALUE( 111.00), SIMDE_BFLOAT16_VALUE( 560.00), + SIMDE_BFLOAT16_VALUE( -944.00), SIMDE_BFLOAT16_VALUE( -504.00), SIMDE_BFLOAT16_VALUE( 23.75), SIMDE_BFLOAT16_VALUE( 612.00) } }, + { { SIMDE_BFLOAT16_VALUE( 220.00), SIMDE_BFLOAT16_VALUE( -312.00), SIMDE_BFLOAT16_VALUE( 524.00), SIMDE_BFLOAT16_VALUE( -276.00), + SIMDE_BFLOAT16_VALUE( 980.00), SIMDE_BFLOAT16_VALUE( 184.00), SIMDE_BFLOAT16_VALUE( 524.00), SIMDE_BFLOAT16_VALUE( 596.00) }, + { SIMDE_BFLOAT16_VALUE( 87.00), SIMDE_BFLOAT16_VALUE( -928.00), SIMDE_BFLOAT16_VALUE( -884.00), SIMDE_BFLOAT16_VALUE( 464.00) }, + { SIMDE_BFLOAT16_VALUE( 464.00), SIMDE_BFLOAT16_VALUE( -312.00), SIMDE_BFLOAT16_VALUE( 524.00), SIMDE_BFLOAT16_VALUE( -276.00), + SIMDE_BFLOAT16_VALUE( 980.00), SIMDE_BFLOAT16_VALUE( 184.00), SIMDE_BFLOAT16_VALUE( 524.00), SIMDE_BFLOAT16_VALUE( 596.00) }, + { SIMDE_BFLOAT16_VALUE( 220.00), SIMDE_BFLOAT16_VALUE( -312.00), SIMDE_BFLOAT16_VALUE( 524.00), SIMDE_BFLOAT16_VALUE( -884.00), + SIMDE_BFLOAT16_VALUE( 980.00), SIMDE_BFLOAT16_VALUE( 184.00), SIMDE_BFLOAT16_VALUE( 524.00), SIMDE_BFLOAT16_VALUE( 596.00) }, + { SIMDE_BFLOAT16_VALUE( 220.00), SIMDE_BFLOAT16_VALUE( -312.00), SIMDE_BFLOAT16_VALUE( 524.00), SIMDE_BFLOAT16_VALUE( -276.00), + SIMDE_BFLOAT16_VALUE( 980.00), SIMDE_BFLOAT16_VALUE( -928.00), SIMDE_BFLOAT16_VALUE( 524.00), SIMDE_BFLOAT16_VALUE( 596.00) }, + { SIMDE_BFLOAT16_VALUE( 220.00), SIMDE_BFLOAT16_VALUE( -312.00), SIMDE_BFLOAT16_VALUE( 524.00), SIMDE_BFLOAT16_VALUE( -276.00), + SIMDE_BFLOAT16_VALUE( 980.00), SIMDE_BFLOAT16_VALUE( 184.00), SIMDE_BFLOAT16_VALUE( 524.00), SIMDE_BFLOAT16_VALUE( 87.00) } }, + { { SIMDE_BFLOAT16_VALUE( -380.00), SIMDE_BFLOAT16_VALUE( -952.00), SIMDE_BFLOAT16_VALUE( -796.00), SIMDE_BFLOAT16_VALUE( 466.00), + SIMDE_BFLOAT16_VALUE( -708.00), SIMDE_BFLOAT16_VALUE( 300.00), SIMDE_BFLOAT16_VALUE( 402.00), SIMDE_BFLOAT16_VALUE( 960.00) }, + { SIMDE_BFLOAT16_VALUE( -510.00), SIMDE_BFLOAT16_VALUE( -484.00), SIMDE_BFLOAT16_VALUE( 520.00), SIMDE_BFLOAT16_VALUE( -456.00) }, + { SIMDE_BFLOAT16_VALUE( -456.00), SIMDE_BFLOAT16_VALUE( -952.00), SIMDE_BFLOAT16_VALUE( -796.00), SIMDE_BFLOAT16_VALUE( 466.00), + SIMDE_BFLOAT16_VALUE( -708.00), SIMDE_BFLOAT16_VALUE( 300.00), SIMDE_BFLOAT16_VALUE( 402.00), SIMDE_BFLOAT16_VALUE( 960.00) }, + { SIMDE_BFLOAT16_VALUE( -380.00), SIMDE_BFLOAT16_VALUE( -952.00), SIMDE_BFLOAT16_VALUE( -796.00), SIMDE_BFLOAT16_VALUE( 520.00), + SIMDE_BFLOAT16_VALUE( -708.00), SIMDE_BFLOAT16_VALUE( 300.00), SIMDE_BFLOAT16_VALUE( 402.00), SIMDE_BFLOAT16_VALUE( 960.00) }, + { SIMDE_BFLOAT16_VALUE( -380.00), SIMDE_BFLOAT16_VALUE( -952.00), SIMDE_BFLOAT16_VALUE( -796.00), SIMDE_BFLOAT16_VALUE( 466.00), + SIMDE_BFLOAT16_VALUE( -708.00), SIMDE_BFLOAT16_VALUE( -484.00), SIMDE_BFLOAT16_VALUE( 402.00), SIMDE_BFLOAT16_VALUE( 960.00) }, + { SIMDE_BFLOAT16_VALUE( -380.00), SIMDE_BFLOAT16_VALUE( -952.00), SIMDE_BFLOAT16_VALUE( -796.00), SIMDE_BFLOAT16_VALUE( 466.00), + SIMDE_BFLOAT16_VALUE( -708.00), SIMDE_BFLOAT16_VALUE( 300.00), SIMDE_BFLOAT16_VALUE( 402.00), SIMDE_BFLOAT16_VALUE( -510.00) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x4_t b = simde_vld1_bf16(test_vec[i].b); + + simde_bfloat16x8_t r0_3 = simde_vcopyq_lane_bf16(a, 0, b, 3); + simde_bfloat16x8_t r3_2 = simde_vcopyq_lane_bf16(a, 3, b, 2); + simde_bfloat16x8_t r5_1 = simde_vcopyq_lane_bf16(a, 5, b, 1); + simde_bfloat16x8_t r7_0 = simde_vcopyq_lane_bf16(a, 7, b, 0); + + simde_test_arm_neon_assert_equal_bf16x8(r0_3, simde_vld1q_bf16(test_vec[i].r0_3), 1); + simde_test_arm_neon_assert_equal_bf16x8(r3_2, simde_vld1q_bf16(test_vec[i].r3_2), 1); + simde_test_arm_neon_assert_equal_bf16x8(r5_1, simde_vld1q_bf16(test_vec[i].r5_1), 1); + simde_test_arm_neon_assert_equal_bf16x8(r7_0, simde_vld1q_bf16(test_vec[i].r7_0), 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-1000.0), SIMDE_BFLOAT16_VALUE(1000.0)); + simde_bfloat16x4_t b = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-1000.0), SIMDE_BFLOAT16_VALUE(1000.0)); + simde_bfloat16x8_t r0_3 = simde_vcopyq_lane_bf16(a, 0, b, 3); + simde_bfloat16x8_t r3_2 = simde_vcopyq_lane_bf16(a, 3, b, 2); + simde_bfloat16x8_t r5_1 = simde_vcopyq_lane_bf16(a, 5, b, 1); + simde_bfloat16x8_t r7_0 = simde_vcopyq_lane_bf16(a, 7, b, 0); + + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, r0_3, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, r3_2, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, r5_1, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, r7_0, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vcopyq_laneq_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[8]; + simde_bfloat16_t b[8]; + simde_bfloat16_t r0_7[8]; + simde_bfloat16_t r1_6[8]; + simde_bfloat16_t r3_4[8]; + simde_bfloat16_t r5_3[8]; + simde_bfloat16_t r7_1[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 9.06), SIMDE_BFLOAT16_VALUE( -452.00), SIMDE_BFLOAT16_VALUE( -388.00), SIMDE_BFLOAT16_VALUE( -376.00), + SIMDE_BFLOAT16_VALUE( 916.00), SIMDE_BFLOAT16_VALUE( 296.00), SIMDE_BFLOAT16_VALUE( -370.00), SIMDE_BFLOAT16_VALUE( 139.00) }, + { SIMDE_BFLOAT16_VALUE( 980.00), SIMDE_BFLOAT16_VALUE( -844.00), SIMDE_BFLOAT16_VALUE( 860.00), SIMDE_BFLOAT16_VALUE( 964.00), + SIMDE_BFLOAT16_VALUE( 336.00), SIMDE_BFLOAT16_VALUE( 388.00), SIMDE_BFLOAT16_VALUE( 560.00), SIMDE_BFLOAT16_VALUE( -572.00) }, + { SIMDE_BFLOAT16_VALUE( -572.00), SIMDE_BFLOAT16_VALUE( -452.00), SIMDE_BFLOAT16_VALUE( -388.00), SIMDE_BFLOAT16_VALUE( -376.00), + SIMDE_BFLOAT16_VALUE( 916.00), SIMDE_BFLOAT16_VALUE( 296.00), SIMDE_BFLOAT16_VALUE( -370.00), SIMDE_BFLOAT16_VALUE( 139.00) }, + { SIMDE_BFLOAT16_VALUE( 9.06), SIMDE_BFLOAT16_VALUE( 560.00), SIMDE_BFLOAT16_VALUE( -388.00), SIMDE_BFLOAT16_VALUE( -376.00), + SIMDE_BFLOAT16_VALUE( 916.00), SIMDE_BFLOAT16_VALUE( 296.00), SIMDE_BFLOAT16_VALUE( -370.00), SIMDE_BFLOAT16_VALUE( 139.00) }, + { SIMDE_BFLOAT16_VALUE( 9.06), SIMDE_BFLOAT16_VALUE( -452.00), SIMDE_BFLOAT16_VALUE( -388.00), SIMDE_BFLOAT16_VALUE( 336.00), + SIMDE_BFLOAT16_VALUE( 916.00), SIMDE_BFLOAT16_VALUE( 296.00), SIMDE_BFLOAT16_VALUE( -370.00), SIMDE_BFLOAT16_VALUE( 139.00) }, + { SIMDE_BFLOAT16_VALUE( 9.06), SIMDE_BFLOAT16_VALUE( -452.00), SIMDE_BFLOAT16_VALUE( -388.00), SIMDE_BFLOAT16_VALUE( -376.00), + SIMDE_BFLOAT16_VALUE( 916.00), SIMDE_BFLOAT16_VALUE( 964.00), SIMDE_BFLOAT16_VALUE( -370.00), SIMDE_BFLOAT16_VALUE( 139.00) }, + { SIMDE_BFLOAT16_VALUE( 9.06), SIMDE_BFLOAT16_VALUE( -452.00), SIMDE_BFLOAT16_VALUE( -388.00), SIMDE_BFLOAT16_VALUE( -376.00), + SIMDE_BFLOAT16_VALUE( 916.00), SIMDE_BFLOAT16_VALUE( 296.00), SIMDE_BFLOAT16_VALUE( -370.00), SIMDE_BFLOAT16_VALUE( -844.00) } }, + { { SIMDE_BFLOAT16_VALUE( 460.00), SIMDE_BFLOAT16_VALUE( 676.00), SIMDE_BFLOAT16_VALUE( 888.00), SIMDE_BFLOAT16_VALUE( -916.00), + SIMDE_BFLOAT16_VALUE( 720.00), SIMDE_BFLOAT16_VALUE( -908.00), SIMDE_BFLOAT16_VALUE( 544.00), SIMDE_BFLOAT16_VALUE( -984.00) }, + { SIMDE_BFLOAT16_VALUE( 390.00), SIMDE_BFLOAT16_VALUE( -49.25), SIMDE_BFLOAT16_VALUE( 972.00), SIMDE_BFLOAT16_VALUE( 880.00), + SIMDE_BFLOAT16_VALUE( 464.00), SIMDE_BFLOAT16_VALUE( 496.00), SIMDE_BFLOAT16_VALUE( -576.00), SIMDE_BFLOAT16_VALUE( -524.00) }, + { SIMDE_BFLOAT16_VALUE( -524.00), SIMDE_BFLOAT16_VALUE( 676.00), SIMDE_BFLOAT16_VALUE( 888.00), SIMDE_BFLOAT16_VALUE( -916.00), + SIMDE_BFLOAT16_VALUE( 720.00), SIMDE_BFLOAT16_VALUE( -908.00), SIMDE_BFLOAT16_VALUE( 544.00), SIMDE_BFLOAT16_VALUE( -984.00) }, + { SIMDE_BFLOAT16_VALUE( 460.00), SIMDE_BFLOAT16_VALUE( -576.00), SIMDE_BFLOAT16_VALUE( 888.00), SIMDE_BFLOAT16_VALUE( -916.00), + SIMDE_BFLOAT16_VALUE( 720.00), SIMDE_BFLOAT16_VALUE( -908.00), SIMDE_BFLOAT16_VALUE( 544.00), SIMDE_BFLOAT16_VALUE( -984.00) }, + { SIMDE_BFLOAT16_VALUE( 460.00), SIMDE_BFLOAT16_VALUE( 676.00), SIMDE_BFLOAT16_VALUE( 888.00), SIMDE_BFLOAT16_VALUE( 464.00), + SIMDE_BFLOAT16_VALUE( 720.00), SIMDE_BFLOAT16_VALUE( -908.00), SIMDE_BFLOAT16_VALUE( 544.00), SIMDE_BFLOAT16_VALUE( -984.00) }, + { SIMDE_BFLOAT16_VALUE( 460.00), SIMDE_BFLOAT16_VALUE( 676.00), SIMDE_BFLOAT16_VALUE( 888.00), SIMDE_BFLOAT16_VALUE( -916.00), + SIMDE_BFLOAT16_VALUE( 720.00), SIMDE_BFLOAT16_VALUE( 880.00), SIMDE_BFLOAT16_VALUE( 544.00), SIMDE_BFLOAT16_VALUE( -984.00) }, + { SIMDE_BFLOAT16_VALUE( 460.00), SIMDE_BFLOAT16_VALUE( 676.00), SIMDE_BFLOAT16_VALUE( 888.00), SIMDE_BFLOAT16_VALUE( -916.00), + SIMDE_BFLOAT16_VALUE( 720.00), SIMDE_BFLOAT16_VALUE( -908.00), SIMDE_BFLOAT16_VALUE( 544.00), SIMDE_BFLOAT16_VALUE( -49.25) } }, + { { SIMDE_BFLOAT16_VALUE( -956.00), SIMDE_BFLOAT16_VALUE( 33.75), SIMDE_BFLOAT16_VALUE( 96.00), SIMDE_BFLOAT16_VALUE( 960.00), + SIMDE_BFLOAT16_VALUE( -668.00), SIMDE_BFLOAT16_VALUE( 724.00), SIMDE_BFLOAT16_VALUE( 101.50), SIMDE_BFLOAT16_VALUE( -684.00) }, + { SIMDE_BFLOAT16_VALUE( 876.00), SIMDE_BFLOAT16_VALUE( -36.50), SIMDE_BFLOAT16_VALUE( -720.00), SIMDE_BFLOAT16_VALUE( 216.00), + SIMDE_BFLOAT16_VALUE( -644.00), SIMDE_BFLOAT16_VALUE( 840.00), SIMDE_BFLOAT16_VALUE( 640.00), SIMDE_BFLOAT16_VALUE( 812.00) }, + { SIMDE_BFLOAT16_VALUE( 812.00), SIMDE_BFLOAT16_VALUE( 33.75), SIMDE_BFLOAT16_VALUE( 96.00), SIMDE_BFLOAT16_VALUE( 960.00), + SIMDE_BFLOAT16_VALUE( -668.00), SIMDE_BFLOAT16_VALUE( 724.00), SIMDE_BFLOAT16_VALUE( 101.50), SIMDE_BFLOAT16_VALUE( -684.00) }, + { SIMDE_BFLOAT16_VALUE( -956.00), SIMDE_BFLOAT16_VALUE( 640.00), SIMDE_BFLOAT16_VALUE( 96.00), SIMDE_BFLOAT16_VALUE( 960.00), + SIMDE_BFLOAT16_VALUE( -668.00), SIMDE_BFLOAT16_VALUE( 724.00), SIMDE_BFLOAT16_VALUE( 101.50), SIMDE_BFLOAT16_VALUE( -684.00) }, + { SIMDE_BFLOAT16_VALUE( -956.00), SIMDE_BFLOAT16_VALUE( 33.75), SIMDE_BFLOAT16_VALUE( 96.00), SIMDE_BFLOAT16_VALUE( -644.00), + SIMDE_BFLOAT16_VALUE( -668.00), SIMDE_BFLOAT16_VALUE( 724.00), SIMDE_BFLOAT16_VALUE( 101.50), SIMDE_BFLOAT16_VALUE( -684.00) }, + { SIMDE_BFLOAT16_VALUE( -956.00), SIMDE_BFLOAT16_VALUE( 33.75), SIMDE_BFLOAT16_VALUE( 96.00), SIMDE_BFLOAT16_VALUE( 960.00), + SIMDE_BFLOAT16_VALUE( -668.00), SIMDE_BFLOAT16_VALUE( 216.00), SIMDE_BFLOAT16_VALUE( 101.50), SIMDE_BFLOAT16_VALUE( -684.00) }, + { SIMDE_BFLOAT16_VALUE( -956.00), SIMDE_BFLOAT16_VALUE( 33.75), SIMDE_BFLOAT16_VALUE( 96.00), SIMDE_BFLOAT16_VALUE( 960.00), + SIMDE_BFLOAT16_VALUE( -668.00), SIMDE_BFLOAT16_VALUE( 724.00), SIMDE_BFLOAT16_VALUE( 101.50), SIMDE_BFLOAT16_VALUE( -36.50) } }, + { { SIMDE_BFLOAT16_VALUE( 516.00), SIMDE_BFLOAT16_VALUE( 528.00), SIMDE_BFLOAT16_VALUE( 892.00), SIMDE_BFLOAT16_VALUE( 240.00), + SIMDE_BFLOAT16_VALUE( 620.00), SIMDE_BFLOAT16_VALUE( 442.00), SIMDE_BFLOAT16_VALUE( 252.00), SIMDE_BFLOAT16_VALUE( 13.44) }, + { SIMDE_BFLOAT16_VALUE( -604.00), SIMDE_BFLOAT16_VALUE( 226.00), SIMDE_BFLOAT16_VALUE( -106.00), SIMDE_BFLOAT16_VALUE( 856.00), + SIMDE_BFLOAT16_VALUE( -276.00), SIMDE_BFLOAT16_VALUE( 316.00), SIMDE_BFLOAT16_VALUE( -668.00), SIMDE_BFLOAT16_VALUE( -233.00) }, + { SIMDE_BFLOAT16_VALUE( -233.00), SIMDE_BFLOAT16_VALUE( 528.00), SIMDE_BFLOAT16_VALUE( 892.00), SIMDE_BFLOAT16_VALUE( 240.00), + SIMDE_BFLOAT16_VALUE( 620.00), SIMDE_BFLOAT16_VALUE( 442.00), SIMDE_BFLOAT16_VALUE( 252.00), SIMDE_BFLOAT16_VALUE( 13.44) }, + { SIMDE_BFLOAT16_VALUE( 516.00), SIMDE_BFLOAT16_VALUE( -668.00), SIMDE_BFLOAT16_VALUE( 892.00), SIMDE_BFLOAT16_VALUE( 240.00), + SIMDE_BFLOAT16_VALUE( 620.00), SIMDE_BFLOAT16_VALUE( 442.00), SIMDE_BFLOAT16_VALUE( 252.00), SIMDE_BFLOAT16_VALUE( 13.44) }, + { SIMDE_BFLOAT16_VALUE( 516.00), SIMDE_BFLOAT16_VALUE( 528.00), SIMDE_BFLOAT16_VALUE( 892.00), SIMDE_BFLOAT16_VALUE( -276.00), + SIMDE_BFLOAT16_VALUE( 620.00), SIMDE_BFLOAT16_VALUE( 442.00), SIMDE_BFLOAT16_VALUE( 252.00), SIMDE_BFLOAT16_VALUE( 13.44) }, + { SIMDE_BFLOAT16_VALUE( 516.00), SIMDE_BFLOAT16_VALUE( 528.00), SIMDE_BFLOAT16_VALUE( 892.00), SIMDE_BFLOAT16_VALUE( 240.00), + SIMDE_BFLOAT16_VALUE( 620.00), SIMDE_BFLOAT16_VALUE( 856.00), SIMDE_BFLOAT16_VALUE( 252.00), SIMDE_BFLOAT16_VALUE( 13.44) }, + { SIMDE_BFLOAT16_VALUE( 516.00), SIMDE_BFLOAT16_VALUE( 528.00), SIMDE_BFLOAT16_VALUE( 892.00), SIMDE_BFLOAT16_VALUE( 240.00), + SIMDE_BFLOAT16_VALUE( 620.00), SIMDE_BFLOAT16_VALUE( 442.00), SIMDE_BFLOAT16_VALUE( 252.00), SIMDE_BFLOAT16_VALUE( 226.00) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_t b = simde_vld1q_bf16(test_vec[i].b); + + simde_bfloat16x8_t r0_7 = simde_vcopyq_laneq_bf16(a, 0, b, 7); + simde_bfloat16x8_t r1_6 = simde_vcopyq_laneq_bf16(a, 1, b, 6); + simde_bfloat16x8_t r3_4 = simde_vcopyq_laneq_bf16(a, 3, b, 4); + simde_bfloat16x8_t r5_3 = simde_vcopyq_laneq_bf16(a, 5, b, 3); + simde_bfloat16x8_t r7_1 = simde_vcopyq_laneq_bf16(a, 7, b, 1); + + simde_test_arm_neon_assert_equal_bf16x8(r0_7, simde_vld1q_bf16(test_vec[i].r0_7), 1); + simde_test_arm_neon_assert_equal_bf16x8(r1_6, simde_vld1q_bf16(test_vec[i].r1_6), 1); + simde_test_arm_neon_assert_equal_bf16x8(r3_4, simde_vld1q_bf16(test_vec[i].r3_4), 1); + simde_test_arm_neon_assert_equal_bf16x8(r5_3, simde_vld1q_bf16(test_vec[i].r5_3), 1); + simde_test_arm_neon_assert_equal_bf16x8(r7_1, simde_vld1q_bf16(test_vec[i].r7_1), 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-1000.0), SIMDE_BFLOAT16_VALUE(1000.0)); + simde_bfloat16x8_t b = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-1000.0), SIMDE_BFLOAT16_VALUE(1000.0)); + simde_bfloat16x8_t r0_7 = simde_vcopyq_laneq_bf16(a, 0, b, 7); + simde_bfloat16x8_t r1_6 = simde_vcopyq_laneq_bf16(a, 1, b, 6); + simde_bfloat16x8_t r3_4 = simde_vcopyq_laneq_bf16(a, 3, b, 4); + simde_bfloat16x8_t r5_3 = simde_vcopyq_laneq_bf16(a, 5, b, 3); + simde_bfloat16x8_t r7_1 = simde_vcopyq_laneq_bf16(a, 7, b, 1); + + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, r0_7, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, r1_6, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, r3_4, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, r5_3, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, r7_1, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vcopy_lane_s8) SIMDE_TEST_FUNC_LIST_ENTRY(vcopy_lane_s16) @@ -6738,6 +7132,11 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vcopyq_lane_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vcopyq_laneq_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vcopyq_laneq_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vcopyq_laneq_p64) + +SIMDE_TEST_FUNC_LIST_ENTRY(vcopy_lane_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vcopy_laneq_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vcopyq_lane_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vcopyq_laneq_bf16) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/create.c b/test/arm/neon/create.c index bbb3530e3..de87b8eb5 100644 --- a/test/arm/neon/create.c +++ b/test/arm/neon/create.c @@ -636,6 +636,51 @@ test_simde_vcreate_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vcreate_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + uint64_t a; + uint64_t r[1]; + } test_vec[] = { + { UINT64_C(14121171741695809290), + { UINT64_C(14121171741695809290) } }, + { UINT64_C(14036155041624243569), + { UINT64_C(14036155041624243569) } }, + { UINT64_C( 4933549844381694689), + { UINT64_C( 4933549844381694689) } }, + { UINT64_C( 4721956654897595679), + { UINT64_C( 4721956654897595679) } }, + { UINT64_C( 4794791124775457096), + { UINT64_C( 4794791124775457096) } }, + { UINT64_C(14142503323827870106), + { UINT64_C(14142503323827870106) } }, + { UINT64_C(14093049577892322181), + { UINT64_C(14093049577892322181) } }, + { UINT64_C( 4932300799177322332), + { UINT64_C( 4932300799177322332) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t r = simde_vcreate_bf16(test_vec[i].a); + simde_test_arm_neon_assert_equal_u64x1(simde_vreinterpret_u64_bf16(r), simde_vld1_u64(test_vec[i].r)); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_uint64_t a = simde_test_codegen_random_u64(); + simde_uint64x1_t r = simde_vcreate_bf16(a); + + simde_test_codegen_write_u64(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_u64x1(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vcreate_s8) SIMDE_TEST_FUNC_LIST_ENTRY(vcreate_s16) @@ -654,6 +699,8 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vcreate_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vcreate_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vcreate_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vcreate_p64) + +SIMDE_TEST_FUNC_LIST_ENTRY(vcreate_bf16) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/cvt.c b/test/arm/neon/cvt.c index b8773a4bb..de75a6358 100644 --- a/test/arm/neon/cvt.c +++ b/test/arm/neon/cvt.c @@ -3706,6 +3706,368 @@ test_simde_vcvtx_high_f32_f64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vcvt_bf16_f32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_float32_t a[4]; + simde_bfloat16_t r[4]; + } test_vec[] = { + { { SIMDE_FLOAT32_C( 797.26), SIMDE_FLOAT32_C( 229.13), SIMDE_FLOAT32_C( 344.37), SIMDE_FLOAT32_C( 315.27) }, + { SIMDE_BFLOAT16_VALUE( 796.00), SIMDE_BFLOAT16_VALUE( 229.00), SIMDE_BFLOAT16_VALUE( 344.00), SIMDE_BFLOAT16_VALUE( 316.00) } }, + { { SIMDE_FLOAT32_C( -649.66), SIMDE_FLOAT32_C( -120.10), SIMDE_FLOAT32_C( 452.41), SIMDE_FLOAT32_C( -963.13) }, + { SIMDE_BFLOAT16_VALUE( -648.00), SIMDE_BFLOAT16_VALUE( -120.00), SIMDE_BFLOAT16_VALUE( 452.00), SIMDE_BFLOAT16_VALUE( -964.00) } }, + { { SIMDE_FLOAT32_C( 860.52), SIMDE_FLOAT32_C( 434.19), SIMDE_FLOAT32_C( -916.52), SIMDE_FLOAT32_C( 292.15) }, + { SIMDE_BFLOAT16_VALUE( 860.00), SIMDE_BFLOAT16_VALUE( 434.00), SIMDE_BFLOAT16_VALUE( -916.00), SIMDE_BFLOAT16_VALUE( 292.00) } }, + { { SIMDE_FLOAT32_C( -616.07), SIMDE_FLOAT32_C( -682.86), SIMDE_FLOAT32_C( -929.66), SIMDE_FLOAT32_C( 699.98) }, + { SIMDE_BFLOAT16_VALUE( -616.00), SIMDE_BFLOAT16_VALUE( -684.00), SIMDE_BFLOAT16_VALUE( -928.00), SIMDE_BFLOAT16_VALUE( 700.00) } }, + { { SIMDE_FLOAT32_C( 727.29), SIMDE_FLOAT32_C( -756.32), SIMDE_FLOAT32_C( 149.91), SIMDE_FLOAT32_C( -673.19) }, + { SIMDE_BFLOAT16_VALUE( 728.00), SIMDE_BFLOAT16_VALUE( -756.00), SIMDE_BFLOAT16_VALUE( 150.00), SIMDE_BFLOAT16_VALUE( -672.00) } }, + { { SIMDE_FLOAT32_C( -378.54), SIMDE_FLOAT32_C( -694.93), SIMDE_FLOAT32_C( -667.13), SIMDE_FLOAT32_C( 808.37) }, + { SIMDE_BFLOAT16_VALUE( -378.00), SIMDE_BFLOAT16_VALUE( -696.00), SIMDE_BFLOAT16_VALUE( -668.00), SIMDE_BFLOAT16_VALUE( 808.00) } }, + { { SIMDE_FLOAT32_C( 68.80), SIMDE_FLOAT32_C( 564.38), SIMDE_FLOAT32_C( -586.51), SIMDE_FLOAT32_C( 81.23) }, + { SIMDE_BFLOAT16_VALUE( 69.00), SIMDE_BFLOAT16_VALUE( 564.00), SIMDE_BFLOAT16_VALUE( -588.00), SIMDE_BFLOAT16_VALUE( 81.00) } }, + { { SIMDE_FLOAT32_C( 250.43), SIMDE_FLOAT32_C( -181.74), SIMDE_FLOAT32_C( 899.88), SIMDE_FLOAT32_C( 47.69) }, + { SIMDE_BFLOAT16_VALUE( 250.00), SIMDE_BFLOAT16_VALUE( -182.00), SIMDE_BFLOAT16_VALUE( 900.00), SIMDE_BFLOAT16_VALUE( 47.75) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x4_t a = simde_vld1q_f32(test_vec[i].a); + simde_bfloat16x4_t r = simde_vcvt_bf16_f32(a); + + simde_test_arm_neon_assert_equal_bf16x4(r, simde_vld1_bf16(test_vec[i].r), 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_float32x4_t a = simde_test_arm_neon_random_f32x4(SIMDE_FLOAT64_C(-1000.0), SIMDE_FLOAT64_C(1000.0)); + simde_bfloat16x4_t r = simde_vcvt_bf16_f32(a); + + simde_test_arm_neon_write_f32x4(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x4(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vcvt_f32_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[4]; + simde_float32_t r[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 117.00), SIMDE_BFLOAT16_VALUE( -636.00), SIMDE_BFLOAT16_VALUE( 12.12), SIMDE_BFLOAT16_VALUE( -50.25) }, + { SIMDE_FLOAT32_C( 117.00), SIMDE_FLOAT32_C( -636.00), SIMDE_FLOAT32_C( 12.12), SIMDE_FLOAT32_C( -50.25) } }, + { { SIMDE_BFLOAT16_VALUE( -816.00), SIMDE_BFLOAT16_VALUE( 292.00), SIMDE_BFLOAT16_VALUE( -516.00), SIMDE_BFLOAT16_VALUE( -656.00) }, + { SIMDE_FLOAT32_C( -816.00), SIMDE_FLOAT32_C( 292.00), SIMDE_FLOAT32_C( -516.00), SIMDE_FLOAT32_C( -656.00) } }, + { { SIMDE_BFLOAT16_VALUE( 133.00), SIMDE_BFLOAT16_VALUE( 776.00), SIMDE_BFLOAT16_VALUE( 334.00), SIMDE_BFLOAT16_VALUE( -716.00) }, + { SIMDE_FLOAT32_C( 133.00), SIMDE_FLOAT32_C( 776.00), SIMDE_FLOAT32_C( 334.00), SIMDE_FLOAT32_C( -716.00) } }, + { { SIMDE_BFLOAT16_VALUE( 592.00), SIMDE_BFLOAT16_VALUE( -728.00), SIMDE_BFLOAT16_VALUE( 294.00), SIMDE_BFLOAT16_VALUE( 63.00) }, + { SIMDE_FLOAT32_C( 592.00), SIMDE_FLOAT32_C( -728.00), SIMDE_FLOAT32_C( 294.00), SIMDE_FLOAT32_C( 63.00) } }, + { { SIMDE_BFLOAT16_VALUE( 322.00), SIMDE_BFLOAT16_VALUE( -676.00), SIMDE_BFLOAT16_VALUE( -234.00), SIMDE_BFLOAT16_VALUE( 820.00) }, + { SIMDE_FLOAT32_C( 322.00), SIMDE_FLOAT32_C( -676.00), SIMDE_FLOAT32_C( -234.00), SIMDE_FLOAT32_C( 820.00) } }, + { { SIMDE_BFLOAT16_VALUE( 888.00), SIMDE_BFLOAT16_VALUE( 428.00), SIMDE_BFLOAT16_VALUE( -608.00), SIMDE_BFLOAT16_VALUE( 308.00) }, + { SIMDE_FLOAT32_C( 888.00), SIMDE_FLOAT32_C( 428.00), SIMDE_FLOAT32_C( -608.00), SIMDE_FLOAT32_C( 308.00) } }, + { { SIMDE_BFLOAT16_VALUE( -672.00), SIMDE_BFLOAT16_VALUE( 612.00), SIMDE_BFLOAT16_VALUE( 207.00), SIMDE_BFLOAT16_VALUE( 948.00) }, + { SIMDE_FLOAT32_C( -672.00), SIMDE_FLOAT32_C( 612.00), SIMDE_FLOAT32_C( 207.00), SIMDE_FLOAT32_C( 948.00) } }, + { { SIMDE_BFLOAT16_VALUE( 330.00), SIMDE_BFLOAT16_VALUE( 952.00), SIMDE_BFLOAT16_VALUE( 632.00), SIMDE_BFLOAT16_VALUE( -552.00) }, + { SIMDE_FLOAT32_C( 330.00), SIMDE_FLOAT32_C( 952.00), SIMDE_FLOAT32_C( 632.00), SIMDE_FLOAT32_C( -552.00) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a); + simde_float32x4_t r = simde_vcvt_f32_bf16(a); + + simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-1000.0), SIMDE_BFLOAT16_VALUE(1000.0)); + simde_float32x4_t r = simde_vcvt_f32_bf16(a); + + simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_f32x4(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vcvtah_f32_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a; + simde_float32_t r; + } test_vec[] = { + { SIMDE_BFLOAT16_VALUE( 111.50), + SIMDE_FLOAT32_C( 111.50) }, + { SIMDE_BFLOAT16_VALUE( 456.00), + SIMDE_FLOAT32_C( 456.00) }, + { SIMDE_BFLOAT16_VALUE( 454.00), + SIMDE_FLOAT32_C( 454.00) }, + { SIMDE_BFLOAT16_VALUE( -880.00), + SIMDE_FLOAT32_C( -880.00) }, + { SIMDE_BFLOAT16_VALUE( -292.00), + SIMDE_FLOAT32_C( -292.00) }, + { SIMDE_BFLOAT16_VALUE( 956.00), + SIMDE_FLOAT32_C( 956.00) }, + { SIMDE_BFLOAT16_VALUE( -193.00), + SIMDE_FLOAT32_C( -193.00) }, + { SIMDE_BFLOAT16_VALUE( -692.00), + SIMDE_FLOAT32_C( -692.00) }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32_t r = simde_vcvtah_f32_bf16(test_vec[i].a); + + simde_assert_equal_f32(r, test_vec[i].r, 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_bfloat16_t a = simde_test_codegen_random_bf16(SIMDE_BFLOAT16_VALUE(-1000.0), SIMDE_BFLOAT16_VALUE(1000.0)); + simde_float32_t r = simde_vcvtah_f32_bf16(a); + + simde_test_codegen_write_bf16(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_codegen_write_f32(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vcvth_bf16_f32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_float32_t a; + simde_bfloat16_t r; + } test_vec[] = { + { SIMDE_FLOAT32_C( -614.15), + SIMDE_BFLOAT16_VALUE( -616.00) }, + { SIMDE_FLOAT32_C( 155.05), + SIMDE_BFLOAT16_VALUE( 155.00) }, + { SIMDE_FLOAT32_C( -344.88), + SIMDE_BFLOAT16_VALUE( -344.00) }, + { SIMDE_FLOAT32_C( -544.03), + SIMDE_BFLOAT16_VALUE( -544.00) }, + { SIMDE_FLOAT32_C( 952.07), + SIMDE_BFLOAT16_VALUE( 952.00) }, + { SIMDE_FLOAT32_C( 722.53), + SIMDE_BFLOAT16_VALUE( 724.00) }, + { SIMDE_FLOAT32_C( -898.84), + SIMDE_BFLOAT16_VALUE( -900.00) }, + { SIMDE_FLOAT32_C( -620.87), + SIMDE_BFLOAT16_VALUE( -620.00) }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16_t r = simde_vcvth_bf16_f32(test_vec[i].a); + + simde_assert_equal_bf16(r, test_vec[i].r, 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_float32_t a = simde_test_codegen_random_f32(-1000.0, 1000.0); + simde_bfloat16_t r = simde_vcvth_bf16_f32(a); + + simde_test_codegen_write_f32(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_codegen_write_bf16(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vcvtq_low_f32_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[8]; + simde_float32_t r[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( -30.50), SIMDE_BFLOAT16_VALUE( -860.00), SIMDE_BFLOAT16_VALUE( 424.00), SIMDE_BFLOAT16_VALUE( -984.00), + SIMDE_BFLOAT16_VALUE( -262.00), SIMDE_BFLOAT16_VALUE( 99.00), SIMDE_BFLOAT16_VALUE( 884.00), SIMDE_BFLOAT16_VALUE( -628.00) }, + { SIMDE_FLOAT32_C( -30.50), SIMDE_FLOAT32_C( -860.00), SIMDE_FLOAT32_C( 424.00), SIMDE_FLOAT32_C( -984.00) } }, + { { SIMDE_BFLOAT16_VALUE( 608.00), SIMDE_BFLOAT16_VALUE( 268.00), SIMDE_BFLOAT16_VALUE( -748.00), SIMDE_BFLOAT16_VALUE( 988.00), + SIMDE_BFLOAT16_VALUE( -183.00), SIMDE_BFLOAT16_VALUE( -69.00), SIMDE_BFLOAT16_VALUE( -198.00), SIMDE_BFLOAT16_VALUE( -434.00) }, + { SIMDE_FLOAT32_C( 608.00), SIMDE_FLOAT32_C( 268.00), SIMDE_FLOAT32_C( -748.00), SIMDE_FLOAT32_C( 988.00) } }, + { { SIMDE_BFLOAT16_VALUE( 105.00), SIMDE_BFLOAT16_VALUE( -772.00), SIMDE_BFLOAT16_VALUE( 432.00), SIMDE_BFLOAT16_VALUE( -320.00), + SIMDE_BFLOAT16_VALUE( 268.00), SIMDE_BFLOAT16_VALUE( 492.00), SIMDE_BFLOAT16_VALUE( -984.00), SIMDE_BFLOAT16_VALUE( 800.00) }, + { SIMDE_FLOAT32_C( 105.00), SIMDE_FLOAT32_C( -772.00), SIMDE_FLOAT32_C( 432.00), SIMDE_FLOAT32_C( -320.00) } }, + { { SIMDE_BFLOAT16_VALUE( -512.00), SIMDE_BFLOAT16_VALUE( 456.00), SIMDE_BFLOAT16_VALUE( 378.00), SIMDE_BFLOAT16_VALUE( 540.00), + SIMDE_BFLOAT16_VALUE( -868.00), SIMDE_BFLOAT16_VALUE( -860.00), SIMDE_BFLOAT16_VALUE( -2.16), SIMDE_BFLOAT16_VALUE( 103.00) }, + { SIMDE_FLOAT32_C( -512.00), SIMDE_FLOAT32_C( 456.00), SIMDE_FLOAT32_C( 378.00), SIMDE_FLOAT32_C( 540.00) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_float32x4_t r = simde_vcvtq_low_f32_bf16(a); + + simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-1000.0), SIMDE_BFLOAT16_VALUE(1000.0)); + simde_float32x4_t r = simde_vcvtq_low_f32_bf16(a); + + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_f32x4(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vcvtq_high_f32_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[8]; + simde_float32_t r[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 213.00), SIMDE_BFLOAT16_VALUE( 223.00), SIMDE_BFLOAT16_VALUE( 580.00), SIMDE_BFLOAT16_VALUE( -952.00), + SIMDE_BFLOAT16_VALUE( -732.00), SIMDE_BFLOAT16_VALUE( -900.00), SIMDE_BFLOAT16_VALUE( -416.00), SIMDE_BFLOAT16_VALUE( -640.00) }, + { SIMDE_FLOAT32_C( -732.00), SIMDE_FLOAT32_C( -900.00), SIMDE_FLOAT32_C( -416.00), SIMDE_FLOAT32_C( -640.00) } }, + { { SIMDE_BFLOAT16_VALUE( 708.00), SIMDE_BFLOAT16_VALUE( -748.00), SIMDE_BFLOAT16_VALUE( -524.00), SIMDE_BFLOAT16_VALUE( -316.00), + SIMDE_BFLOAT16_VALUE( -180.00), SIMDE_BFLOAT16_VALUE( -712.00), SIMDE_BFLOAT16_VALUE( 432.00), SIMDE_BFLOAT16_VALUE( 318.00) }, + { SIMDE_FLOAT32_C( -180.00), SIMDE_FLOAT32_C( -712.00), SIMDE_FLOAT32_C( 432.00), SIMDE_FLOAT32_C( 318.00) } }, + { { SIMDE_BFLOAT16_VALUE( 824.00), SIMDE_BFLOAT16_VALUE( -362.00), SIMDE_BFLOAT16_VALUE( 256.00), SIMDE_BFLOAT16_VALUE( 808.00), + SIMDE_BFLOAT16_VALUE( 92.50), SIMDE_BFLOAT16_VALUE( 380.00), SIMDE_BFLOAT16_VALUE( -422.00), SIMDE_BFLOAT16_VALUE( -608.00) }, + { SIMDE_FLOAT32_C( 92.50), SIMDE_FLOAT32_C( 380.00), SIMDE_FLOAT32_C( -422.00), SIMDE_FLOAT32_C( -608.00) } }, + { { SIMDE_BFLOAT16_VALUE( 688.00), SIMDE_BFLOAT16_VALUE( -300.00), SIMDE_BFLOAT16_VALUE( -812.00), SIMDE_BFLOAT16_VALUE( 720.00), + SIMDE_BFLOAT16_VALUE( 728.00), SIMDE_BFLOAT16_VALUE( -274.00), SIMDE_BFLOAT16_VALUE( -56.50), SIMDE_BFLOAT16_VALUE( -60.50) }, + { SIMDE_FLOAT32_C( 728.00), SIMDE_FLOAT32_C( -274.00), SIMDE_FLOAT32_C( -56.50), SIMDE_FLOAT32_C( -60.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_float32x4_t r = simde_vcvtq_high_f32_bf16(a); + + simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-1000.0), SIMDE_BFLOAT16_VALUE(1000.0)); + simde_float32x4_t r = simde_vcvtq_high_f32_bf16(a); + + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_f32x4(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vcvtq_low_bf16_f32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_float32_t a[4]; + simde_bfloat16_t r[8]; + } test_vec[] = { + { { SIMDE_FLOAT32_C( -701.24), SIMDE_FLOAT32_C( -714.20), SIMDE_FLOAT32_C( -963.85), SIMDE_FLOAT32_C( 314.60) }, + { SIMDE_BFLOAT16_VALUE( -700.00), SIMDE_BFLOAT16_VALUE( -716.00), SIMDE_BFLOAT16_VALUE( -964.00), SIMDE_BFLOAT16_VALUE( 314.00), + SIMDE_BFLOAT16_VALUE( 0.00), SIMDE_BFLOAT16_VALUE( 0.00), SIMDE_BFLOAT16_VALUE( 0.00), SIMDE_BFLOAT16_VALUE( 0.00) } }, + { { SIMDE_FLOAT32_C( -888.30), SIMDE_FLOAT32_C( -957.30), SIMDE_FLOAT32_C( -62.19), SIMDE_FLOAT32_C( 885.41) }, + { SIMDE_BFLOAT16_VALUE( -888.00), SIMDE_BFLOAT16_VALUE( -956.00), SIMDE_BFLOAT16_VALUE( -62.25), SIMDE_BFLOAT16_VALUE( 884.00), + SIMDE_BFLOAT16_VALUE( 0.00), SIMDE_BFLOAT16_VALUE( 0.00), SIMDE_BFLOAT16_VALUE( 0.00), SIMDE_BFLOAT16_VALUE( 0.00) } }, + { { SIMDE_FLOAT32_C( -193.79), SIMDE_FLOAT32_C( 606.35), SIMDE_FLOAT32_C( 848.78), SIMDE_FLOAT32_C( -888.62) }, + { SIMDE_BFLOAT16_VALUE( -194.00), SIMDE_BFLOAT16_VALUE( 608.00), SIMDE_BFLOAT16_VALUE( 848.00), SIMDE_BFLOAT16_VALUE( -888.00), + SIMDE_BFLOAT16_VALUE( 0.00), SIMDE_BFLOAT16_VALUE( 0.00), SIMDE_BFLOAT16_VALUE( 0.00), SIMDE_BFLOAT16_VALUE( 0.00) } }, + { { SIMDE_FLOAT32_C( 393.77), SIMDE_FLOAT32_C( 651.13), SIMDE_FLOAT32_C( 692.47), SIMDE_FLOAT32_C( -491.41) }, + { SIMDE_BFLOAT16_VALUE( 394.00), SIMDE_BFLOAT16_VALUE( 652.00), SIMDE_BFLOAT16_VALUE( 692.00), SIMDE_BFLOAT16_VALUE( -492.00), + SIMDE_BFLOAT16_VALUE( 0.00), SIMDE_BFLOAT16_VALUE( 0.00), SIMDE_BFLOAT16_VALUE( 0.00), SIMDE_BFLOAT16_VALUE( 0.00) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x4_t a = simde_vld1q_f32(test_vec[i].a); + simde_bfloat16x8_t r = simde_vcvtq_low_bf16_f32(a); + + simde_test_arm_neon_assert_equal_bf16x8(r, simde_vld1q_bf16(test_vec[i].r), 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_float32x4_t a = simde_test_arm_neon_random_f32x4(-1000.0, 1000.0); + simde_bfloat16x8_t r = simde_vcvtq_low_bf16_f32(a); + + simde_test_arm_neon_write_f32x4(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x8(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vcvtq_high_bf16_f32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t inactive[8]; + simde_float32_t a[4]; + simde_bfloat16_t r[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( -114.50), SIMDE_BFLOAT16_VALUE( 158.00), SIMDE_BFLOAT16_VALUE( 536.00), SIMDE_BFLOAT16_VALUE( 119.00), + SIMDE_BFLOAT16_VALUE( 624.00), SIMDE_BFLOAT16_VALUE( 228.00), SIMDE_BFLOAT16_VALUE( 12.56), SIMDE_BFLOAT16_VALUE( -852.00) }, + { SIMDE_FLOAT32_C( -332.48), SIMDE_FLOAT32_C( 318.31), SIMDE_FLOAT32_C( -852.48), SIMDE_FLOAT32_C( 741.06) }, + { SIMDE_BFLOAT16_VALUE( -114.50), SIMDE_BFLOAT16_VALUE( 158.00), SIMDE_BFLOAT16_VALUE( 536.00), SIMDE_BFLOAT16_VALUE( 119.00), + SIMDE_BFLOAT16_VALUE( -332.00), SIMDE_BFLOAT16_VALUE( 318.00), SIMDE_BFLOAT16_VALUE( -852.00), SIMDE_BFLOAT16_VALUE( 740.00) } }, + { { SIMDE_BFLOAT16_VALUE( 34.50), SIMDE_BFLOAT16_VALUE( 868.00), SIMDE_BFLOAT16_VALUE( 224.00), SIMDE_BFLOAT16_VALUE( -812.00), + SIMDE_BFLOAT16_VALUE( -732.00), SIMDE_BFLOAT16_VALUE( -360.00), SIMDE_BFLOAT16_VALUE( 908.00), SIMDE_BFLOAT16_VALUE( -816.00) }, + { SIMDE_FLOAT32_C( 783.96), SIMDE_FLOAT32_C( 537.75), SIMDE_FLOAT32_C( -247.99), SIMDE_FLOAT32_C( 99.18) }, + { SIMDE_BFLOAT16_VALUE( 34.50), SIMDE_BFLOAT16_VALUE( 868.00), SIMDE_BFLOAT16_VALUE( 224.00), SIMDE_BFLOAT16_VALUE( -812.00), + SIMDE_BFLOAT16_VALUE( 784.00), SIMDE_BFLOAT16_VALUE( 536.00), SIMDE_BFLOAT16_VALUE( -248.00), SIMDE_BFLOAT16_VALUE( 99.00) } }, + { { SIMDE_BFLOAT16_VALUE( -892.00), SIMDE_BFLOAT16_VALUE( -57.75), SIMDE_BFLOAT16_VALUE( -60.00), SIMDE_BFLOAT16_VALUE( -872.00), + SIMDE_BFLOAT16_VALUE( 620.00), SIMDE_BFLOAT16_VALUE( -280.00), SIMDE_BFLOAT16_VALUE( 154.00), SIMDE_BFLOAT16_VALUE( -494.00) }, + { SIMDE_FLOAT32_C( 878.16), SIMDE_FLOAT32_C( -310.72), SIMDE_FLOAT32_C( 626.10), SIMDE_FLOAT32_C( 504.14) }, + { SIMDE_BFLOAT16_VALUE( -892.00), SIMDE_BFLOAT16_VALUE( -57.75), SIMDE_BFLOAT16_VALUE( -60.00), SIMDE_BFLOAT16_VALUE( -872.00), + SIMDE_BFLOAT16_VALUE( 880.00), SIMDE_BFLOAT16_VALUE( -310.00), SIMDE_BFLOAT16_VALUE( 628.00), SIMDE_BFLOAT16_VALUE( 504.00) } }, + { { SIMDE_BFLOAT16_VALUE( 916.00), SIMDE_BFLOAT16_VALUE( -362.00), SIMDE_BFLOAT16_VALUE( 652.00), SIMDE_BFLOAT16_VALUE( -414.00), + SIMDE_BFLOAT16_VALUE( 956.00), SIMDE_BFLOAT16_VALUE( 800.00), SIMDE_BFLOAT16_VALUE( -672.00), SIMDE_BFLOAT16_VALUE( -8.56) }, + { SIMDE_FLOAT32_C( 667.89), SIMDE_FLOAT32_C( 550.42), SIMDE_FLOAT32_C( 177.82), SIMDE_FLOAT32_C( 934.96) }, + { SIMDE_BFLOAT16_VALUE( 916.00), SIMDE_BFLOAT16_VALUE( -362.00), SIMDE_BFLOAT16_VALUE( 652.00), SIMDE_BFLOAT16_VALUE( -414.00), + SIMDE_BFLOAT16_VALUE( 668.00), SIMDE_BFLOAT16_VALUE( 552.00), SIMDE_BFLOAT16_VALUE( 178.00), SIMDE_BFLOAT16_VALUE( 936.00) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t inactive = simde_vld1q_bf16(test_vec[i].inactive); + simde_float32x4_t a = simde_vld1q_f32(test_vec[i].a); + simde_bfloat16x8_t r = simde_vcvtq_high_bf16_f32(inactive, a); + + simde_test_arm_neon_assert_equal_bf16x8(r, simde_vld1q_bf16(test_vec[i].r), 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_t inactive = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-1000.0), SIMDE_BFLOAT16_VALUE(1000.0)); + simde_float32x4_t a = simde_test_arm_neon_random_f32x4(-1000.0, 1000.0); + simde_bfloat16x8_t r = simde_vcvtq_high_bf16_f32(inactive, a); + + simde_test_arm_neon_write_bf16x8(2, inactive, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_f32x4(2, a, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vcvth_s16_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vcvth_s32_f16) @@ -3791,6 +4153,15 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vcvt_high_f64_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vcvtxd_f32_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vcvtx_f32_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vcvtx_high_f32_f64) + +SIMDE_TEST_FUNC_LIST_ENTRY(vcvt_bf16_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vcvt_f32_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vcvtah_f32_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vcvth_bf16_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vcvtq_low_f32_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vcvtq_high_f32_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vcvtq_low_bf16_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vcvtq_high_bf16_f32) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/dot.c b/test/arm/neon/dot.c index 054879fa2..8025fd50c 100644 --- a/test/arm/neon/dot.c +++ b/test/arm/neon/dot.c @@ -318,12 +318,147 @@ test_simde_vdotq_u32 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vbfdot_f32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_float32_t a[2]; + simde_bfloat16_t b[4]; + simde_bfloat16_t c[4]; + simde_float32_t r[2]; + } test_vec[] = { + { { SIMDE_FLOAT32_C( 252.14), SIMDE_FLOAT32_C( -907.02) }, + { SIMDE_BFLOAT16_VALUE( -4.81), SIMDE_BFLOAT16_VALUE( 63.25), SIMDE_BFLOAT16_VALUE( -33.00), SIMDE_BFLOAT16_VALUE( 85.00) }, + { SIMDE_BFLOAT16_VALUE( 69.00), SIMDE_BFLOAT16_VALUE( -92.00), SIMDE_BFLOAT16_VALUE( 42.00), SIMDE_BFLOAT16_VALUE( -15.00) }, + { SIMDE_FLOAT32_C( -5898.92), SIMDE_FLOAT32_C( -3568.02) } }, + { { SIMDE_FLOAT32_C( 913.22), SIMDE_FLOAT32_C( 129.13) }, + { SIMDE_BFLOAT16_VALUE( -33.75), SIMDE_BFLOAT16_VALUE( -81.00), SIMDE_BFLOAT16_VALUE( -74.00), SIMDE_BFLOAT16_VALUE( -32.50) }, + { SIMDE_BFLOAT16_VALUE( -34.00), SIMDE_BFLOAT16_VALUE( 90.00), SIMDE_BFLOAT16_VALUE( -85.00), SIMDE_BFLOAT16_VALUE( 6.16) }, + { SIMDE_FLOAT32_C( -5229.28), SIMDE_FLOAT32_C( 6219.05) } }, + { { SIMDE_FLOAT32_C( 570.92), SIMDE_FLOAT32_C( -274.51) }, + { SIMDE_BFLOAT16_VALUE( -71.50), SIMDE_BFLOAT16_VALUE( -39.25), SIMDE_BFLOAT16_VALUE( 31.00), SIMDE_BFLOAT16_VALUE( 9.12) }, + { SIMDE_BFLOAT16_VALUE( -15.44), SIMDE_BFLOAT16_VALUE( 32.75), SIMDE_BFLOAT16_VALUE( -88.50), SIMDE_BFLOAT16_VALUE( 89.00) }, + { SIMDE_FLOAT32_C( 389.26), SIMDE_FLOAT32_C( -2205.89) } }, + { { SIMDE_FLOAT32_C( 968.24), SIMDE_FLOAT32_C( 363.85) }, + { SIMDE_BFLOAT16_VALUE( 98.50), SIMDE_BFLOAT16_VALUE( -8.00), SIMDE_BFLOAT16_VALUE( -0.28), SIMDE_BFLOAT16_VALUE( -34.25) }, + { SIMDE_BFLOAT16_VALUE( -23.00), SIMDE_BFLOAT16_VALUE( -31.25), SIMDE_BFLOAT16_VALUE( -26.62), SIMDE_BFLOAT16_VALUE( -80.50) }, + { SIMDE_FLOAT32_C( -1047.26), SIMDE_FLOAT32_C( 3128.41) } }, + { { SIMDE_FLOAT32_C( 536.43), SIMDE_FLOAT32_C( -353.12) }, + { SIMDE_BFLOAT16_VALUE( 32.00), SIMDE_BFLOAT16_VALUE( -80.00), SIMDE_BFLOAT16_VALUE( -16.75), SIMDE_BFLOAT16_VALUE( 57.75) }, + { SIMDE_BFLOAT16_VALUE( -12.88), SIMDE_BFLOAT16_VALUE( 49.00), SIMDE_BFLOAT16_VALUE( 47.75), SIMDE_BFLOAT16_VALUE( 1.81) }, + { SIMDE_FLOAT32_C( -3795.57), SIMDE_FLOAT32_C( -1048.26) } }, + { { SIMDE_FLOAT32_C( -446.13), SIMDE_FLOAT32_C( 50.80) }, + { SIMDE_BFLOAT16_VALUE( 74.00), SIMDE_BFLOAT16_VALUE( -16.25), SIMDE_BFLOAT16_VALUE( 65.50), SIMDE_BFLOAT16_VALUE( 5.41) }, + { SIMDE_BFLOAT16_VALUE( 92.50), SIMDE_BFLOAT16_VALUE( -49.75), SIMDE_BFLOAT16_VALUE( -61.75), SIMDE_BFLOAT16_VALUE( -95.50) }, + { SIMDE_FLOAT32_C( 7207.31), SIMDE_FLOAT32_C( -4510.12) } }, + { { SIMDE_FLOAT32_C( -603.46), SIMDE_FLOAT32_C( -649.21) }, + { SIMDE_BFLOAT16_VALUE( 40.25), SIMDE_BFLOAT16_VALUE( -61.50), SIMDE_BFLOAT16_VALUE( 27.00), SIMDE_BFLOAT16_VALUE( -59.75) }, + { SIMDE_BFLOAT16_VALUE( 4.09), SIMDE_BFLOAT16_VALUE( -95.50), SIMDE_BFLOAT16_VALUE( 8.81), SIMDE_BFLOAT16_VALUE( 77.00) }, + { SIMDE_FLOAT32_C( 5434.56), SIMDE_FLOAT32_C( -5012.02) } }, + { { SIMDE_FLOAT32_C( -768.71), SIMDE_FLOAT32_C( -375.04) }, + { SIMDE_BFLOAT16_VALUE( -57.75), SIMDE_BFLOAT16_VALUE( 55.00), SIMDE_BFLOAT16_VALUE( -17.62), SIMDE_BFLOAT16_VALUE( 25.38) }, + { SIMDE_BFLOAT16_VALUE( 13.00), SIMDE_BFLOAT16_VALUE( 69.00), SIMDE_BFLOAT16_VALUE( -25.38), SIMDE_BFLOAT16_VALUE( -38.75) }, + { SIMDE_FLOAT32_C( 2275.54), SIMDE_FLOAT32_C( -911.09) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x2_t a = simde_vld1_f32(test_vec[i].a); + simde_bfloat16x4_t b = simde_vld1_bf16(test_vec[i].b); + simde_bfloat16x4_t c = simde_vld1_bf16(test_vec[i].c); + simde_float32x2_t r = simde_vbfdot_f32(a, b, c); + + simde_test_arm_neon_assert_equal_f32x2(r, simde_vld1_f32(test_vec[i].r), 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_float32x2_t a = simde_test_arm_neon_random_f32x2(-1000.0f, 1000.0f); + simde_bfloat16x4_t b = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_bfloat16x4_t c = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_float32x2_t r = simde_vbfdot_f32(a, b, c); + + simde_test_arm_neon_write_f32x2(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x4(2, c, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_f32x2(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vbfdotq_f32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_float32_t a[4]; + simde_bfloat16_t b[8]; + simde_bfloat16_t c[8]; + simde_float32_t r[4]; + } test_vec[] = { + { { SIMDE_FLOAT32_C( 702.57), SIMDE_FLOAT32_C( -400.04), SIMDE_FLOAT32_C( 887.18), SIMDE_FLOAT32_C( 555.97) }, + { SIMDE_BFLOAT16_VALUE( -1.57), SIMDE_BFLOAT16_VALUE( 8.56), SIMDE_BFLOAT16_VALUE( 5.94), SIMDE_BFLOAT16_VALUE( -69.50), + SIMDE_BFLOAT16_VALUE( 56.50), SIMDE_BFLOAT16_VALUE( 66.00), SIMDE_BFLOAT16_VALUE( -1.67), SIMDE_BFLOAT16_VALUE( 25.62) }, + { SIMDE_BFLOAT16_VALUE( -23.75), SIMDE_BFLOAT16_VALUE( 0.36), SIMDE_BFLOAT16_VALUE( -3.33), SIMDE_BFLOAT16_VALUE( -2.45), + SIMDE_BFLOAT16_VALUE( -90.00), SIMDE_BFLOAT16_VALUE( -0.43), SIMDE_BFLOAT16_VALUE( -80.00), SIMDE_BFLOAT16_VALUE( -47.50) }, + { SIMDE_FLOAT32_C( 742.94), SIMDE_FLOAT32_C( -249.31), SIMDE_FLOAT32_C( -4226.18), SIMDE_FLOAT32_C( -527.47) } }, + { { SIMDE_FLOAT32_C( -849.68), SIMDE_FLOAT32_C( -39.59), SIMDE_FLOAT32_C( -943.04), SIMDE_FLOAT32_C( -354.67) }, + { SIMDE_BFLOAT16_VALUE( 20.62), SIMDE_BFLOAT16_VALUE( 67.50), SIMDE_BFLOAT16_VALUE( -16.88), SIMDE_BFLOAT16_VALUE( -63.00), + SIMDE_BFLOAT16_VALUE( -59.00), SIMDE_BFLOAT16_VALUE( 84.50), SIMDE_BFLOAT16_VALUE( -10.12), SIMDE_BFLOAT16_VALUE( -88.50) }, + { SIMDE_BFLOAT16_VALUE( -55.75), SIMDE_BFLOAT16_VALUE( -21.38), SIMDE_BFLOAT16_VALUE( 67.00), SIMDE_BFLOAT16_VALUE( 42.75), + SIMDE_BFLOAT16_VALUE( 87.00), SIMDE_BFLOAT16_VALUE( -27.25), SIMDE_BFLOAT16_VALUE( 73.00), SIMDE_BFLOAT16_VALUE( 43.75) }, + { SIMDE_FLOAT32_C( -3442.34), SIMDE_FLOAT32_C( -3863.46), SIMDE_FLOAT32_C( -8378.67), SIMDE_FLOAT32_C( -4965.67) } }, + { { SIMDE_FLOAT32_C( -611.39), SIMDE_FLOAT32_C( -286.15), SIMDE_FLOAT32_C( -307.09), SIMDE_FLOAT32_C( 151.25) }, + { SIMDE_BFLOAT16_VALUE( 72.00), SIMDE_BFLOAT16_VALUE( 66.00), SIMDE_BFLOAT16_VALUE( -87.50), SIMDE_BFLOAT16_VALUE( 81.50), + SIMDE_BFLOAT16_VALUE( -34.50), SIMDE_BFLOAT16_VALUE( -67.00), SIMDE_BFLOAT16_VALUE( -65.50), SIMDE_BFLOAT16_VALUE( -19.38) }, + { SIMDE_BFLOAT16_VALUE( 28.88), SIMDE_BFLOAT16_VALUE( -60.00), SIMDE_BFLOAT16_VALUE( 45.00), SIMDE_BFLOAT16_VALUE( -50.50), + SIMDE_BFLOAT16_VALUE( -92.50), SIMDE_BFLOAT16_VALUE( -72.00), SIMDE_BFLOAT16_VALUE( -13.31), SIMDE_BFLOAT16_VALUE( -51.50) }, + { SIMDE_FLOAT32_C( -2492.39), SIMDE_FLOAT32_C( -8339.40), SIMDE_FLOAT32_C( 7708.16), SIMDE_FLOAT32_C( 2021.03) } }, + { { SIMDE_FLOAT32_C( -875.40), SIMDE_FLOAT32_C( 765.80), SIMDE_FLOAT32_C( -401.45), SIMDE_FLOAT32_C( -432.53) }, + { SIMDE_BFLOAT16_VALUE( -44.75), SIMDE_BFLOAT16_VALUE( -73.50), SIMDE_BFLOAT16_VALUE( 99.50), SIMDE_BFLOAT16_VALUE( -57.75), + SIMDE_BFLOAT16_VALUE( -0.49), SIMDE_BFLOAT16_VALUE( 72.50), SIMDE_BFLOAT16_VALUE( 86.00), SIMDE_BFLOAT16_VALUE( 38.25) }, + { SIMDE_BFLOAT16_VALUE( -56.00), SIMDE_BFLOAT16_VALUE( -44.75), SIMDE_BFLOAT16_VALUE( -46.50), SIMDE_BFLOAT16_VALUE( -84.50), + SIMDE_BFLOAT16_VALUE( -79.00), SIMDE_BFLOAT16_VALUE( -33.75), SIMDE_BFLOAT16_VALUE( 97.50), SIMDE_BFLOAT16_VALUE( -13.25) }, + { SIMDE_FLOAT32_C( 4919.73), SIMDE_FLOAT32_C( 1018.93), SIMDE_FLOAT32_C( -2809.60), SIMDE_FLOAT32_C( 7445.66) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x4_t a = simde_vld1q_f32(test_vec[i].a); + simde_bfloat16x8_t b = simde_vld1q_bf16(test_vec[i].b); + simde_bfloat16x8_t c = simde_vld1q_bf16(test_vec[i].c); + simde_float32x4_t r = simde_vbfdotq_f32(a, b, c); + + simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_float32x4_t a = simde_test_arm_neon_random_f32x4(-1000.0f, 1000.0f); + simde_bfloat16x8_t b = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_bfloat16x8_t c = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_float32x4_t r = simde_vbfdotq_f32(a, b, c); + + simde_test_arm_neon_write_f32x4(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, c, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_f32x4(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vdot_s32) SIMDE_TEST_FUNC_LIST_ENTRY(vdot_u32) SIMDE_TEST_FUNC_LIST_ENTRY(vdotq_s32) SIMDE_TEST_FUNC_LIST_ENTRY(vdotq_u32) + +SIMDE_TEST_FUNC_LIST_ENTRY(vbfdot_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vbfdotq_f32) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/dot_lane.c b/test/arm/neon/dot_lane.c index 34ad41232..9ad714496 100644 --- a/test/arm/neon/dot_lane.c +++ b/test/arm/neon/dot_lane.c @@ -732,6 +732,278 @@ test_simde_vdotq_lane_s32 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vbfdot_lane_f32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_float32_t r_[2]; + simde_bfloat16_t a[4]; + simde_bfloat16_t b[4]; + const int lane; + simde_float32_t r[2]; + } test_vec[] = { + { { SIMDE_FLOAT32_C( -149.82), SIMDE_FLOAT32_C( 786.97) }, + { SIMDE_BFLOAT16_VALUE( 91.00), SIMDE_BFLOAT16_VALUE( -20.75), SIMDE_BFLOAT16_VALUE( 39.50), SIMDE_BFLOAT16_VALUE( -76.50) }, + { SIMDE_BFLOAT16_VALUE( 11.75), SIMDE_BFLOAT16_VALUE( 81.00), SIMDE_BFLOAT16_VALUE( -1.40), SIMDE_BFLOAT16_VALUE( -54.25) }, + INT32_C( 0), + { SIMDE_FLOAT32_C( -761.32), SIMDE_FLOAT32_C( -4945.41) } }, + { { SIMDE_FLOAT32_C( -27.31), SIMDE_FLOAT32_C( 520.43) }, + { SIMDE_BFLOAT16_VALUE( -23.12), SIMDE_BFLOAT16_VALUE( -58.00), SIMDE_BFLOAT16_VALUE( 19.50), SIMDE_BFLOAT16_VALUE( 62.00) }, + { SIMDE_BFLOAT16_VALUE( 9.44), SIMDE_BFLOAT16_VALUE( -14.56), SIMDE_BFLOAT16_VALUE( -38.50), SIMDE_BFLOAT16_VALUE( -84.00) }, + INT32_C( 1), + { SIMDE_FLOAT32_C( 5735.00), SIMDE_FLOAT32_C( -5438.32) } }, + { { SIMDE_FLOAT32_C( -132.86), SIMDE_FLOAT32_C( -52.12) }, + { SIMDE_BFLOAT16_VALUE( -8.50), SIMDE_BFLOAT16_VALUE( -9.56), SIMDE_BFLOAT16_VALUE( -36.75), SIMDE_BFLOAT16_VALUE( 11.19) }, + { SIMDE_BFLOAT16_VALUE( 61.50), SIMDE_BFLOAT16_VALUE( -45.75), SIMDE_BFLOAT16_VALUE( -15.81), SIMDE_BFLOAT16_VALUE( -53.25) }, + INT32_C( 1), + { SIMDE_FLOAT32_C( 510.75), SIMDE_FLOAT32_C( -66.74) } }, + { { SIMDE_FLOAT32_C( -246.78), SIMDE_FLOAT32_C( 258.80) }, + { SIMDE_BFLOAT16_VALUE( 72.50), SIMDE_BFLOAT16_VALUE( -1.24), SIMDE_BFLOAT16_VALUE( -62.25), SIMDE_BFLOAT16_VALUE( 53.25) }, + { SIMDE_BFLOAT16_VALUE( 97.50), SIMDE_BFLOAT16_VALUE( -16.62), SIMDE_BFLOAT16_VALUE( 81.50), SIMDE_BFLOAT16_VALUE( -5.38) }, + INT32_C( 0), + { SIMDE_FLOAT32_C( 6842.62), SIMDE_FLOAT32_C( -6695.86) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x2_t r_ = simde_vld1_f32(test_vec[i].r_); + simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a); + simde_bfloat16x4_t b = simde_vld1_bf16(test_vec[i].b); + simde_float32x2_t r; + + SIMDE_CONSTIFY_2_(simde_vbfdot_lane_f32, r, (HEDLEY_UNREACHABLE(), r), test_vec[i].lane, r_, a, b); + + simde_test_arm_neon_assert_equal_f32x2(r, simde_vld1_f32(test_vec[i].r), 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_float32x2_t r_ = simde_test_arm_neon_random_f32x2(-1000.0, 1000.0); + simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_bfloat16x4_t b = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + int lane = simde_test_codegen_random_i8() & 1; + simde_float32x2_t r; + SIMDE_CONSTIFY_2_(simde_vbfdot_lane_f32, r, (HEDLEY_UNREACHABLE(), simde_vdup_n_f32(0.0f)), lane, r_, a, b); + + simde_test_arm_neon_write_f32x2(2, r_, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_codegen_write_i32(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_f32x2(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vbfdotq_lane_f32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_float32_t r_[4]; + simde_bfloat16_t a[8]; + simde_bfloat16_t b[4]; + const int lane; + simde_float32_t r[4]; + } test_vec[] = { + { { SIMDE_FLOAT32_C( -716.46), SIMDE_FLOAT32_C( 325.35), SIMDE_FLOAT32_C( -139.56), SIMDE_FLOAT32_C( 137.36) }, + { SIMDE_BFLOAT16_VALUE( -91.50), SIMDE_BFLOAT16_VALUE( 14.94), SIMDE_BFLOAT16_VALUE( 1.34), SIMDE_BFLOAT16_VALUE( -28.50), + SIMDE_BFLOAT16_VALUE( 99.50), SIMDE_BFLOAT16_VALUE( -2.69), SIMDE_BFLOAT16_VALUE( -48.50), SIMDE_BFLOAT16_VALUE( 5.62) }, + { SIMDE_BFLOAT16_VALUE( -39.75), SIMDE_BFLOAT16_VALUE( -89.00), SIMDE_BFLOAT16_VALUE( 20.75), SIMDE_BFLOAT16_VALUE( -19.00) }, + INT32_C( 0), + { SIMDE_FLOAT32_C( 1591.23), SIMDE_FLOAT32_C( 2808.44), SIMDE_FLOAT32_C( -3855.50), SIMDE_FLOAT32_C( 1564.61) } }, + { { SIMDE_FLOAT32_C( -555.68), SIMDE_FLOAT32_C( -136.93), SIMDE_FLOAT32_C( -701.24), SIMDE_FLOAT32_C( 181.13) }, + { SIMDE_BFLOAT16_VALUE( 0.85), SIMDE_BFLOAT16_VALUE( -36.75), SIMDE_BFLOAT16_VALUE( 43.50), SIMDE_BFLOAT16_VALUE( 38.50), + SIMDE_BFLOAT16_VALUE( -7.00), SIMDE_BFLOAT16_VALUE( 75.00), SIMDE_BFLOAT16_VALUE( -23.25), SIMDE_BFLOAT16_VALUE( -58.00) }, + { SIMDE_BFLOAT16_VALUE( -59.75), SIMDE_BFLOAT16_VALUE( -74.50), SIMDE_BFLOAT16_VALUE( -29.75), SIMDE_BFLOAT16_VALUE( 72.50) }, + INT32_C( 0), + { SIMDE_FLOAT32_C( 2131.31), SIMDE_FLOAT32_C( -5604.30), SIMDE_FLOAT32_C( -5870.49), SIMDE_FLOAT32_C( 5891.32) } }, + { { SIMDE_FLOAT32_C( 839.64), SIMDE_FLOAT32_C( 812.75), SIMDE_FLOAT32_C( -737.26), SIMDE_FLOAT32_C( -146.98) }, + { SIMDE_BFLOAT16_VALUE( -47.25), SIMDE_BFLOAT16_VALUE( -74.00), SIMDE_BFLOAT16_VALUE( 82.50), SIMDE_BFLOAT16_VALUE( 4.28), + SIMDE_BFLOAT16_VALUE( 31.50), SIMDE_BFLOAT16_VALUE( -57.00), SIMDE_BFLOAT16_VALUE( 15.19), SIMDE_BFLOAT16_VALUE( -47.75) }, + { SIMDE_BFLOAT16_VALUE( 24.00), SIMDE_BFLOAT16_VALUE( 74.50), SIMDE_BFLOAT16_VALUE( -3.28), SIMDE_BFLOAT16_VALUE( -89.50) }, + INT32_C( 0), + { SIMDE_FLOAT32_C( -5807.36), SIMDE_FLOAT32_C( 3111.70), SIMDE_FLOAT32_C( -4227.76), SIMDE_FLOAT32_C( -3339.85) } }, + { { SIMDE_FLOAT32_C( -851.72), SIMDE_FLOAT32_C( 111.17), SIMDE_FLOAT32_C( -320.42), SIMDE_FLOAT32_C( 583.32) }, + { SIMDE_BFLOAT16_VALUE( -50.25), SIMDE_BFLOAT16_VALUE( 61.00), SIMDE_BFLOAT16_VALUE( 33.25), SIMDE_BFLOAT16_VALUE( 26.38), + SIMDE_BFLOAT16_VALUE( -97.00), SIMDE_BFLOAT16_VALUE( 73.50), SIMDE_BFLOAT16_VALUE( 51.75), SIMDE_BFLOAT16_VALUE( -26.88) }, + { SIMDE_BFLOAT16_VALUE( 46.25), SIMDE_BFLOAT16_VALUE( -37.00), SIMDE_BFLOAT16_VALUE( -43.00), SIMDE_BFLOAT16_VALUE( 27.38) }, + INT32_C( 0), + { SIMDE_FLOAT32_C( -5432.78), SIMDE_FLOAT32_C( 673.11), SIMDE_FLOAT32_C( -7526.17), SIMDE_FLOAT32_C( 3971.13) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x4_t r_ = simde_vld1q_f32(test_vec[i].r_); + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x4_t b = simde_vld1_bf16(test_vec[i].b); + simde_float32x4_t r; + + SIMDE_CONSTIFY_2_(simde_vbfdotq_lane_f32, r, (HEDLEY_UNREACHABLE(), r), test_vec[i].lane, r_, a, b); + + simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_float32x4_t r_ = simde_test_arm_neon_random_f32x4(-1000.0, 1000.0); + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_bfloat16x4_t b = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + int lane = simde_test_codegen_random_i8() & 1; + simde_float32x4_t r; + SIMDE_CONSTIFY_2_(simde_vbfdotq_lane_f32, r, (HEDLEY_UNREACHABLE(), simde_vdupq_n_f32(0.0f)), lane, r_, a, b); + + simde_test_arm_neon_write_f32x4(2, r_, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_codegen_write_i32(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_f32x4(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vbfdot_laneq_f32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_float32_t r_[2]; + simde_bfloat16_t a[4]; + simde_bfloat16_t b[8]; + const int lane; + simde_float32_t r[2]; + } test_vec[] = { + { { SIMDE_FLOAT32_C( 587.89), SIMDE_FLOAT32_C( 435.61) }, + { SIMDE_BFLOAT16_VALUE( -74.00), SIMDE_BFLOAT16_VALUE( -43.50), SIMDE_BFLOAT16_VALUE( 57.75), SIMDE_BFLOAT16_VALUE( -15.00) }, + { SIMDE_BFLOAT16_VALUE( 46.75), SIMDE_BFLOAT16_VALUE( -85.00), SIMDE_BFLOAT16_VALUE( -13.88), SIMDE_BFLOAT16_VALUE( -56.25), + SIMDE_BFLOAT16_VALUE( -48.25), SIMDE_BFLOAT16_VALUE( -97.50), SIMDE_BFLOAT16_VALUE( -33.50), SIMDE_BFLOAT16_VALUE( -22.38) }, + INT32_C( 1), + { SIMDE_FLOAT32_C( 4061.52), SIMDE_FLOAT32_C( 478.08) } }, + { { SIMDE_FLOAT32_C( 950.19), SIMDE_FLOAT32_C( 622.60) }, + { SIMDE_BFLOAT16_VALUE( 29.75), SIMDE_BFLOAT16_VALUE( -47.50), SIMDE_BFLOAT16_VALUE( -95.00), SIMDE_BFLOAT16_VALUE( 57.75) }, + { SIMDE_BFLOAT16_VALUE( -76.50), SIMDE_BFLOAT16_VALUE( 10.38), SIMDE_BFLOAT16_VALUE( -58.75), SIMDE_BFLOAT16_VALUE( 9.19), + SIMDE_BFLOAT16_VALUE( -18.62), SIMDE_BFLOAT16_VALUE( -96.50), SIMDE_BFLOAT16_VALUE( 70.00), SIMDE_BFLOAT16_VALUE( 79.00) }, + INT32_C( 0), + { SIMDE_FLOAT32_C( -1818.50), SIMDE_FLOAT32_C( 8489.26) } }, + { { SIMDE_FLOAT32_C( -621.37), SIMDE_FLOAT32_C( 377.94) }, + { SIMDE_BFLOAT16_VALUE( 81.50), SIMDE_BFLOAT16_VALUE( -36.00), SIMDE_BFLOAT16_VALUE( 94.50), SIMDE_BFLOAT16_VALUE( 39.25) }, + { SIMDE_BFLOAT16_VALUE( 49.00), SIMDE_BFLOAT16_VALUE( 41.25), SIMDE_BFLOAT16_VALUE( 54.00), SIMDE_BFLOAT16_VALUE( -65.00), + SIMDE_BFLOAT16_VALUE( 85.00), SIMDE_BFLOAT16_VALUE( -94.50), SIMDE_BFLOAT16_VALUE( -62.50), SIMDE_BFLOAT16_VALUE( -48.75) }, + INT32_C( 1), + { SIMDE_FLOAT32_C( 6119.63), SIMDE_FLOAT32_C( 2929.69) } }, + { { SIMDE_FLOAT32_C( -384.17), SIMDE_FLOAT32_C( -536.21) }, + { SIMDE_BFLOAT16_VALUE( -54.50), SIMDE_BFLOAT16_VALUE( 91.50), SIMDE_BFLOAT16_VALUE( -1.21), SIMDE_BFLOAT16_VALUE( -49.25) }, + { SIMDE_BFLOAT16_VALUE( 49.25), SIMDE_BFLOAT16_VALUE( 22.00), SIMDE_BFLOAT16_VALUE( 61.25), SIMDE_BFLOAT16_VALUE( 90.50), + SIMDE_BFLOAT16_VALUE( -69.00), SIMDE_BFLOAT16_VALUE( -57.50), SIMDE_BFLOAT16_VALUE( 94.00), SIMDE_BFLOAT16_VALUE( -98.50) }, + INT32_C( 2), + { SIMDE_FLOAT32_C( -1884.92), SIMDE_FLOAT32_C( 2379.22) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x2_t r_ = simde_vld1_f32(test_vec[i].r_); + simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a); + simde_bfloat16x8_t b = simde_vld1q_bf16(test_vec[i].b); + simde_float32x2_t r; + + SIMDE_CONSTIFY_4_(simde_vbfdot_laneq_f32, r, (HEDLEY_UNREACHABLE(), r), test_vec[i].lane, r_, a, b); + + simde_test_arm_neon_assert_equal_f32x2(r, simde_vld1_f32(test_vec[i].r), 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_float32x2_t r_ = simde_test_arm_neon_random_f32x2(-1000.0, 1000.0); + simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_bfloat16x8_t b = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + int lane = simde_test_codegen_random_i8() & 3; + simde_float32x2_t r; + SIMDE_CONSTIFY_4_(simde_vbfdot_laneq_f32, r, (HEDLEY_UNREACHABLE(), simde_vdup_n_f32(0.0f)), lane, r_, a, b); + + simde_test_arm_neon_write_f32x2(2, r_, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_codegen_write_i32(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_f32x2(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vbfdotq_laneq_f32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_float32_t r_[4]; + simde_bfloat16_t a[8]; + simde_bfloat16_t b[8]; + const int lane; + simde_float32_t r[4]; + } test_vec[] = { + { { SIMDE_FLOAT32_C( 227.56), SIMDE_FLOAT32_C( 208.46), SIMDE_FLOAT32_C( 840.03), SIMDE_FLOAT32_C( 133.04) }, + { SIMDE_BFLOAT16_VALUE( -86.50), SIMDE_BFLOAT16_VALUE( 76.50), SIMDE_BFLOAT16_VALUE( 32.25), SIMDE_BFLOAT16_VALUE( 88.00), + SIMDE_BFLOAT16_VALUE( 0.74), SIMDE_BFLOAT16_VALUE( 12.81), SIMDE_BFLOAT16_VALUE( 55.25), SIMDE_BFLOAT16_VALUE( 80.50) }, + { SIMDE_BFLOAT16_VALUE( -37.50), SIMDE_BFLOAT16_VALUE( -28.50), SIMDE_BFLOAT16_VALUE( 6.06), SIMDE_BFLOAT16_VALUE( -3.45), + SIMDE_BFLOAT16_VALUE( -88.00), SIMDE_BFLOAT16_VALUE( 61.50), SIMDE_BFLOAT16_VALUE( -89.50), SIMDE_BFLOAT16_VALUE( -29.25) }, + INT32_C( 2), + { SIMDE_FLOAT32_C( 12544.31), SIMDE_FLOAT32_C( 2782.46), SIMDE_FLOAT32_C( 1563.03), SIMDE_FLOAT32_C( 221.79) } }, + { { SIMDE_FLOAT32_C( -671.68), SIMDE_FLOAT32_C( 569.68), SIMDE_FLOAT32_C( -658.75), SIMDE_FLOAT32_C( -929.73) }, + { SIMDE_BFLOAT16_VALUE( -9.44), SIMDE_BFLOAT16_VALUE( -41.75), SIMDE_BFLOAT16_VALUE( -50.50), SIMDE_BFLOAT16_VALUE( 38.50), + SIMDE_BFLOAT16_VALUE( -83.00), SIMDE_BFLOAT16_VALUE( 70.00), SIMDE_BFLOAT16_VALUE( -38.50), SIMDE_BFLOAT16_VALUE( 37.75) }, + { SIMDE_BFLOAT16_VALUE( 54.00), SIMDE_BFLOAT16_VALUE( 74.50), SIMDE_BFLOAT16_VALUE( 51.25), SIMDE_BFLOAT16_VALUE( 30.50), + SIMDE_BFLOAT16_VALUE( 7.00), SIMDE_BFLOAT16_VALUE( 39.00), SIMDE_BFLOAT16_VALUE( -68.50), SIMDE_BFLOAT16_VALUE( -80.00) }, + INT32_C( 1), + { SIMDE_FLOAT32_C( -2428.73), SIMDE_FLOAT32_C( -844.20), SIMDE_FLOAT32_C( -2777.50), SIMDE_FLOAT32_C( -1751.48) } }, + { { SIMDE_FLOAT32_C( -883.22), SIMDE_FLOAT32_C( -177.38), SIMDE_FLOAT32_C( 657.38), SIMDE_FLOAT32_C( 177.35) }, + { SIMDE_BFLOAT16_VALUE( 79.00), SIMDE_BFLOAT16_VALUE( 78.00), SIMDE_BFLOAT16_VALUE( -20.75), SIMDE_BFLOAT16_VALUE( 89.50), + SIMDE_BFLOAT16_VALUE( -51.25), SIMDE_BFLOAT16_VALUE( 40.50), SIMDE_BFLOAT16_VALUE( -78.00), SIMDE_BFLOAT16_VALUE( -94.50) }, + { SIMDE_BFLOAT16_VALUE( 74.50), SIMDE_BFLOAT16_VALUE( -71.00), SIMDE_BFLOAT16_VALUE( -3.77), SIMDE_BFLOAT16_VALUE( -67.00), + SIMDE_BFLOAT16_VALUE( -21.38), SIMDE_BFLOAT16_VALUE( -65.00), SIMDE_BFLOAT16_VALUE( -50.00), SIMDE_BFLOAT16_VALUE( -51.25) }, + INT32_C( 2), + { SIMDE_FLOAT32_C( -7641.84), SIMDE_FLOAT32_C( -5551.35), SIMDE_FLOAT32_C( -879.65), SIMDE_FLOAT32_C( 7987.10) } }, + { { SIMDE_FLOAT32_C( 876.90), SIMDE_FLOAT32_C( -971.55), SIMDE_FLOAT32_C( -290.86), SIMDE_FLOAT32_C( 389.10) }, + { SIMDE_BFLOAT16_VALUE( 33.50), SIMDE_BFLOAT16_VALUE( 78.00), SIMDE_BFLOAT16_VALUE( -22.12), SIMDE_BFLOAT16_VALUE( 64.50), + SIMDE_BFLOAT16_VALUE( 97.50), SIMDE_BFLOAT16_VALUE( 72.00), SIMDE_BFLOAT16_VALUE( 76.50), SIMDE_BFLOAT16_VALUE( -20.00) }, + { SIMDE_BFLOAT16_VALUE( 37.75), SIMDE_BFLOAT16_VALUE( -5.91), SIMDE_BFLOAT16_VALUE( -41.25), SIMDE_BFLOAT16_VALUE( 15.75), + SIMDE_BFLOAT16_VALUE( 73.50), SIMDE_BFLOAT16_VALUE( -52.00), SIMDE_BFLOAT16_VALUE( 64.50), SIMDE_BFLOAT16_VALUE( 13.88) }, + INT32_C( 0), + { SIMDE_FLOAT32_C( 1680.84), SIMDE_FLOAT32_C( -2187.72), SIMDE_FLOAT32_C( 2964.52), SIMDE_FLOAT32_C( 3395.10) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x4_t r_ = simde_vld1q_f32(test_vec[i].r_); + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_t b = simde_vld1q_bf16(test_vec[i].b); + simde_float32x4_t r; + + SIMDE_CONSTIFY_4_(simde_vbfdotq_laneq_f32, r, (HEDLEY_UNREACHABLE(), r), test_vec[i].lane, r_, a, b); + + simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_float32x4_t r_ = simde_test_arm_neon_random_f32x4(-1000.0, 1000.0); + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_bfloat16x8_t b = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + int lane = simde_test_codegen_random_i8() & 3; + simde_float32x4_t r; + SIMDE_CONSTIFY_4_(simde_vbfdotq_laneq_f32, r, (HEDLEY_UNREACHABLE(), simde_vdupq_n_f32(0.0f)), lane, r_, a, b); + + simde_test_arm_neon_write_f32x4(2, r_, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_codegen_write_i32(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_f32x4(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vdot_lane_s32) SIMDE_TEST_FUNC_LIST_ENTRY(vdot_lane_u32) @@ -744,6 +1016,11 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vdotq_laneq_s32) SIMDE_TEST_FUNC_LIST_ENTRY(vdotq_lane_u32) SIMDE_TEST_FUNC_LIST_ENTRY(vdotq_lane_s32) + +SIMDE_TEST_FUNC_LIST_ENTRY(vbfdot_lane_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vbfdotq_lane_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vbfdot_laneq_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vbfdotq_laneq_f32) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/dup_lane.c b/test/arm/neon/dup_lane.c index 657948cb4..7896632df 100644 --- a/test/arm/neon/dup_lane.c +++ b/test/arm/neon/dup_lane.c @@ -3166,6 +3166,40 @@ test_simde_vduph_laneq_u16 (SIMDE_MUNIT_TEST_ARGS) { return 0; } +static int +test_simde_vduph_lane_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16_t vec[4]; + int lane; + simde_float16_t r; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(-3.387), SIMDE_FLOAT16_VALUE(-9.632), SIMDE_FLOAT16_VALUE(19.992), SIMDE_FLOAT16_VALUE( 1.837) }, + INT16_C( 0), + SIMDE_FLOAT16_VALUE(-3.387) }, + { { SIMDE_FLOAT16_VALUE(26.430), SIMDE_FLOAT16_VALUE(28.640), SIMDE_FLOAT16_VALUE(-21.270), SIMDE_FLOAT16_VALUE(-10.357) }, + INT16_C( 0), + SIMDE_FLOAT16_VALUE(26.430) }, + { { SIMDE_FLOAT16_VALUE(24.992), SIMDE_FLOAT16_VALUE( 2.837), SIMDE_FLOAT16_VALUE( 1.880), SIMDE_FLOAT16_VALUE( 1.855) }, + INT16_C( 1), + SIMDE_FLOAT16_VALUE( 2.837) }, + { { SIMDE_FLOAT16_VALUE(-15.363), SIMDE_FLOAT16_VALUE(-5.167), SIMDE_FLOAT16_VALUE( 4.732), SIMDE_FLOAT16_VALUE(-14.807) }, + INT16_C( 3), + SIMDE_FLOAT16_VALUE(-14.807) }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t vec; + simde_float16_t r; + + vec = simde_vld1_f16(test_vec[i].vec); + SIMDE_CONSTIFY_4_(simde_vduph_lane_f16, r, (HEDLEY_UNREACHABLE(), r), test_vec[i].lane, vec); + + simde_assert_equal_f16(r, test_vec[i].r, 1); + } + + return 0; +} + static int test_simde_vduph_laneq_f16 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -4019,6 +4053,308 @@ test_simde_vduph_laneq_p16 (SIMDE_MUNIT_TEST_ARGS) { return 0; } +static int +test_simde_vduph_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t vec[4]; + int lane; + simde_bfloat16_t r; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(-3.387), SIMDE_BFLOAT16_VALUE(-9.632), SIMDE_BFLOAT16_VALUE(19.992), SIMDE_BFLOAT16_VALUE( 1.837) }, + INT16_C( 0), + SIMDE_BFLOAT16_VALUE(-3.387) }, + { { SIMDE_BFLOAT16_VALUE(26.430), SIMDE_BFLOAT16_VALUE(28.640), SIMDE_BFLOAT16_VALUE(-21.270), SIMDE_BFLOAT16_VALUE(-10.357) }, + INT16_C( 0), + SIMDE_BFLOAT16_VALUE(26.430) }, + { { SIMDE_BFLOAT16_VALUE(24.992), SIMDE_BFLOAT16_VALUE( 2.837), SIMDE_BFLOAT16_VALUE( 1.880), SIMDE_BFLOAT16_VALUE( 1.855) }, + INT16_C( 1), + SIMDE_BFLOAT16_VALUE( 2.837) }, + { { SIMDE_BFLOAT16_VALUE(-15.363), SIMDE_BFLOAT16_VALUE(-5.167), SIMDE_BFLOAT16_VALUE( 4.732), SIMDE_BFLOAT16_VALUE(-14.807) }, + INT16_C( 3), + SIMDE_BFLOAT16_VALUE(-14.807) }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t vec; + simde_bfloat16_t r; + + vec = simde_vld1_bf16(test_vec[i].vec); + SIMDE_CONSTIFY_4_(simde_vduph_lane_bf16, r, (HEDLEY_UNREACHABLE(), r), test_vec[i].lane, vec); + + simde_assert_equal_bf16(r, test_vec[i].r, INT_MAX); + } + + return 0; +} + +static int +test_simde_vduph_laneq_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t vec[8]; + int lane; + simde_bfloat16_t r; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(-3.387), SIMDE_BFLOAT16_VALUE(-9.632), SIMDE_BFLOAT16_VALUE(19.992), SIMDE_BFLOAT16_VALUE( 1.837), + SIMDE_BFLOAT16_VALUE(10.218), SIMDE_BFLOAT16_VALUE( 0.924), SIMDE_BFLOAT16_VALUE(28.548), SIMDE_BFLOAT16_VALUE(10.866) }, + INT16_C( 0), + SIMDE_BFLOAT16_VALUE(-3.387) }, + { { SIMDE_BFLOAT16_VALUE(26.430), SIMDE_BFLOAT16_VALUE(28.640), SIMDE_BFLOAT16_VALUE(-21.270), SIMDE_BFLOAT16_VALUE(-10.357), + SIMDE_BFLOAT16_VALUE( 0.986), SIMDE_BFLOAT16_VALUE(-14.685), SIMDE_BFLOAT16_VALUE(27.090), SIMDE_BFLOAT16_VALUE(16.825) }, + INT16_C( 0), + SIMDE_BFLOAT16_VALUE(26.430) }, + { { SIMDE_BFLOAT16_VALUE(24.992), SIMDE_BFLOAT16_VALUE( 2.837), SIMDE_BFLOAT16_VALUE( 1.880), SIMDE_BFLOAT16_VALUE( 1.855), + SIMDE_BFLOAT16_VALUE(-26.001), SIMDE_BFLOAT16_VALUE(25.433), SIMDE_BFLOAT16_VALUE(-25.054), SIMDE_BFLOAT16_VALUE(-18.612) }, + INT16_C( 1), + SIMDE_BFLOAT16_VALUE( 2.837) }, + { { SIMDE_BFLOAT16_VALUE(-24.460), SIMDE_BFLOAT16_VALUE(-22.313), SIMDE_BFLOAT16_VALUE(-17.405), SIMDE_BFLOAT16_VALUE( 7.420), + SIMDE_BFLOAT16_VALUE(-9.492), SIMDE_BFLOAT16_VALUE(-28.099), SIMDE_BFLOAT16_VALUE(-25.166), SIMDE_BFLOAT16_VALUE(-23.800) }, + INT16_C( 5), + SIMDE_BFLOAT16_VALUE(-28.099) }, + { { SIMDE_BFLOAT16_VALUE(-20.270), SIMDE_BFLOAT16_VALUE(-10.763), SIMDE_BFLOAT16_VALUE(-20.068), SIMDE_BFLOAT16_VALUE( 1.744), + SIMDE_BFLOAT16_VALUE( 4.890), SIMDE_BFLOAT16_VALUE(-28.985), SIMDE_BFLOAT16_VALUE(-27.261), SIMDE_BFLOAT16_VALUE(-5.649) }, + INT16_C( 6), + SIMDE_BFLOAT16_VALUE(-27.261) }, + { { SIMDE_BFLOAT16_VALUE( 2.648), SIMDE_BFLOAT16_VALUE(-19.666), SIMDE_BFLOAT16_VALUE( 0.498), SIMDE_BFLOAT16_VALUE(-12.129), + SIMDE_BFLOAT16_VALUE(-6.541), SIMDE_BFLOAT16_VALUE(20.271), SIMDE_BFLOAT16_VALUE(11.576), SIMDE_BFLOAT16_VALUE(26.583) }, + INT16_C( 5), + SIMDE_BFLOAT16_VALUE(20.271) }, + { { SIMDE_BFLOAT16_VALUE(-15.363), SIMDE_BFLOAT16_VALUE(-5.167), SIMDE_BFLOAT16_VALUE( 4.732), SIMDE_BFLOAT16_VALUE(-14.807), + SIMDE_BFLOAT16_VALUE(13.136), SIMDE_BFLOAT16_VALUE(26.351), SIMDE_BFLOAT16_VALUE(15.240), SIMDE_BFLOAT16_VALUE(-21.142) }, + INT16_C( 3), + SIMDE_BFLOAT16_VALUE(-14.807) }, + { { SIMDE_BFLOAT16_VALUE(-22.512), SIMDE_BFLOAT16_VALUE(15.536), SIMDE_BFLOAT16_VALUE(-20.898), SIMDE_BFLOAT16_VALUE(-24.975), + SIMDE_BFLOAT16_VALUE(-28.439), SIMDE_BFLOAT16_VALUE(-28.696), SIMDE_BFLOAT16_VALUE(12.933), SIMDE_BFLOAT16_VALUE(20.260) }, + INT16_C( 7), + SIMDE_BFLOAT16_VALUE(20.260) }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t vec; + simde_bfloat16_t r; + + vec = simde_vld1q_bf16(test_vec[i].vec); + SIMDE_CONSTIFY_8_(simde_vduph_laneq_bf16, r, (HEDLEY_UNREACHABLE(), r), test_vec[i].lane, vec); + + simde_assert_equal_bf16(r, test_vec[i].r, INT_MAX); + } + + return 0; +} + +static int +test_simde_vdup_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16 vec[4]; + int lane; + simde_bfloat16 r[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(-7.6), SIMDE_BFLOAT16_VALUE(11.4), SIMDE_BFLOAT16_VALUE(10.7), SIMDE_BFLOAT16_VALUE(-0.1) }, + INT8_C(2), + { SIMDE_BFLOAT16_VALUE(10.7), SIMDE_BFLOAT16_VALUE(10.7), SIMDE_BFLOAT16_VALUE(10.7), SIMDE_BFLOAT16_VALUE(10.7) } }, + { { SIMDE_BFLOAT16_VALUE(1.4), SIMDE_BFLOAT16_VALUE(-5.5), SIMDE_BFLOAT16_VALUE(3.7), SIMDE_BFLOAT16_VALUE(-12.5) }, + INT8_C(0), + { SIMDE_BFLOAT16_VALUE(1.4), SIMDE_BFLOAT16_VALUE(1.4), SIMDE_BFLOAT16_VALUE(1.4), SIMDE_BFLOAT16_VALUE(1.4) } }, + { { SIMDE_BFLOAT16_VALUE(13.3), SIMDE_BFLOAT16_VALUE(-11.6), SIMDE_BFLOAT16_VALUE(4.4), SIMDE_BFLOAT16_VALUE(-1.3) }, + INT8_C(2), + { SIMDE_BFLOAT16_VALUE(4.4), SIMDE_BFLOAT16_VALUE(4.4), SIMDE_BFLOAT16_VALUE(4.4), SIMDE_BFLOAT16_VALUE(4.4) } }, + { { SIMDE_BFLOAT16_VALUE(-11.5), SIMDE_BFLOAT16_VALUE(-10.6), SIMDE_BFLOAT16_VALUE(13.5), SIMDE_BFLOAT16_VALUE(-5.6) }, + INT8_C(0), + { SIMDE_BFLOAT16_VALUE(-11.5), SIMDE_BFLOAT16_VALUE(-11.5), SIMDE_BFLOAT16_VALUE(-11.5), SIMDE_BFLOAT16_VALUE(-11.5) } }, + { { SIMDE_BFLOAT16_VALUE(-12.6), SIMDE_BFLOAT16_VALUE(-12.4), SIMDE_BFLOAT16_VALUE(11.3), SIMDE_BFLOAT16_VALUE(11.8) }, + INT8_C(0), + { SIMDE_BFLOAT16_VALUE(-12.6), SIMDE_BFLOAT16_VALUE(-12.6), SIMDE_BFLOAT16_VALUE(-12.6), SIMDE_BFLOAT16_VALUE(-12.6) } }, + { { SIMDE_BFLOAT16_VALUE(1.7), SIMDE_BFLOAT16_VALUE(-12.1), SIMDE_BFLOAT16_VALUE(-11.1), SIMDE_BFLOAT16_VALUE(-11.3) }, + INT8_C(1), + { SIMDE_BFLOAT16_VALUE(-12.1), SIMDE_BFLOAT16_VALUE(-12.1), SIMDE_BFLOAT16_VALUE(-12.1), SIMDE_BFLOAT16_VALUE(-12.1) } }, + { { SIMDE_BFLOAT16_VALUE(-2.9), SIMDE_BFLOAT16_VALUE(0.3), SIMDE_BFLOAT16_VALUE(11.1), SIMDE_BFLOAT16_VALUE(8.8) }, + INT8_C(1), + { SIMDE_BFLOAT16_VALUE(0.3), SIMDE_BFLOAT16_VALUE(0.3), SIMDE_BFLOAT16_VALUE(0.3), SIMDE_BFLOAT16_VALUE(0.3) } }, + { { SIMDE_BFLOAT16_VALUE(8.0), SIMDE_BFLOAT16_VALUE(-13.7), SIMDE_BFLOAT16_VALUE(-3.6), SIMDE_BFLOAT16_VALUE(5.8) }, + INT8_C(0), + { SIMDE_BFLOAT16_VALUE(8.0), SIMDE_BFLOAT16_VALUE(8.0), SIMDE_BFLOAT16_VALUE(8.0), SIMDE_BFLOAT16_VALUE(8.0) } }, + { { SIMDE_BFLOAT16_VALUE(1.1), SIMDE_BFLOAT16_VALUE(10.1), SIMDE_BFLOAT16_VALUE(1.2), SIMDE_BFLOAT16_VALUE(-11.7) }, + INT8_C(0), + { SIMDE_BFLOAT16_VALUE(1.1), SIMDE_BFLOAT16_VALUE(1.1), SIMDE_BFLOAT16_VALUE(1.1), SIMDE_BFLOAT16_VALUE(1.1) } }, + { { SIMDE_BFLOAT16_VALUE(-2.0), SIMDE_BFLOAT16_VALUE(-14.0), SIMDE_BFLOAT16_VALUE(-13.7), SIMDE_BFLOAT16_VALUE(-10.2) }, + INT8_C(0), + { SIMDE_BFLOAT16_VALUE(-2.0), SIMDE_BFLOAT16_VALUE(-2.0), SIMDE_BFLOAT16_VALUE(-2.0), SIMDE_BFLOAT16_VALUE(-2.0) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t vec; + simde_bfloat16x4_t r; + + vec = simde_vld1_bf16(test_vec[i].vec); + SIMDE_CONSTIFY_4_(simde_vdup_lane_bf16, r, (HEDLEY_UNREACHABLE(), simde_vdup_n_bf16(SIMDE_BFLOAT16_VALUE(0.0))), test_vec[i].lane, vec); + + simde_test_arm_neon_assert_equal_bf16x4(r, simde_vld1_bf16(test_vec[i].r), 1); + } + + return 0; +} + +static int +test_simde_vdup_laneq_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16 vec[8]; + int lane; + simde_bfloat16 r[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 9.056), SIMDE_BFLOAT16_VALUE( 1.677), SIMDE_BFLOAT16_VALUE( 7.053), SIMDE_BFLOAT16_VALUE( 28.437), + SIMDE_BFLOAT16_VALUE( 14.165), SIMDE_BFLOAT16_VALUE( 18.651), SIMDE_BFLOAT16_VALUE( -23.860), SIMDE_BFLOAT16_VALUE( 2.771) }, + INT8_C( 6), + { SIMDE_BFLOAT16_VALUE( -23.860), SIMDE_BFLOAT16_VALUE( -23.860), SIMDE_BFLOAT16_VALUE( -23.860), SIMDE_BFLOAT16_VALUE( -23.860) } }, + { { SIMDE_BFLOAT16_VALUE( 24.258), SIMDE_BFLOAT16_VALUE( -13.828), SIMDE_BFLOAT16_VALUE( -26.370), SIMDE_BFLOAT16_VALUE( 19.116), + SIMDE_BFLOAT16_VALUE( -8.063), SIMDE_BFLOAT16_VALUE( 29.418), SIMDE_BFLOAT16_VALUE( -20.107), SIMDE_BFLOAT16_VALUE( 7.234) }, + INT8_C( 2), + { SIMDE_BFLOAT16_VALUE( -26.370), SIMDE_BFLOAT16_VALUE( -26.370), SIMDE_BFLOAT16_VALUE( -26.370), SIMDE_BFLOAT16_VALUE( -26.370) } }, + { { SIMDE_BFLOAT16_VALUE( -11.462), SIMDE_BFLOAT16_VALUE( 22.959), SIMDE_BFLOAT16_VALUE( -17.969), SIMDE_BFLOAT16_VALUE( -9.845), + SIMDE_BFLOAT16_VALUE( 7.748), SIMDE_BFLOAT16_VALUE( -18.327), SIMDE_BFLOAT16_VALUE( 13.108), SIMDE_BFLOAT16_VALUE( -16.811) }, + INT8_C( 7), + { SIMDE_BFLOAT16_VALUE( -16.811), SIMDE_BFLOAT16_VALUE( -16.811), SIMDE_BFLOAT16_VALUE( -16.811), SIMDE_BFLOAT16_VALUE( -16.811) } }, + { { SIMDE_BFLOAT16_VALUE( 8.525), SIMDE_BFLOAT16_VALUE( -15.131), SIMDE_BFLOAT16_VALUE( 14.364), SIMDE_BFLOAT16_VALUE( -8.648), + SIMDE_BFLOAT16_VALUE( -10.759), SIMDE_BFLOAT16_VALUE( -3.780), SIMDE_BFLOAT16_VALUE( 3.004), SIMDE_BFLOAT16_VALUE( -12.422) }, + INT8_C( 4), + { SIMDE_BFLOAT16_VALUE( -10.759), SIMDE_BFLOAT16_VALUE( -10.759), SIMDE_BFLOAT16_VALUE( -10.759), SIMDE_BFLOAT16_VALUE( -10.759) } }, + { { SIMDE_BFLOAT16_VALUE( 12.736), SIMDE_BFLOAT16_VALUE( 10.408), SIMDE_BFLOAT16_VALUE( 16.484), SIMDE_BFLOAT16_VALUE( -11.569), + SIMDE_BFLOAT16_VALUE( -27.593), SIMDE_BFLOAT16_VALUE( -22.388), SIMDE_BFLOAT16_VALUE( 0.182), SIMDE_BFLOAT16_VALUE( 27.270) }, + INT8_C( 1), + { SIMDE_BFLOAT16_VALUE( 10.408), SIMDE_BFLOAT16_VALUE( 10.408), SIMDE_BFLOAT16_VALUE( 10.408), SIMDE_BFLOAT16_VALUE( 10.408) } }, + { { SIMDE_BFLOAT16_VALUE( -8.778), SIMDE_BFLOAT16_VALUE( 6.046), SIMDE_BFLOAT16_VALUE( 1.558), SIMDE_BFLOAT16_VALUE( 7.396), + SIMDE_BFLOAT16_VALUE( 29.886), SIMDE_BFLOAT16_VALUE( -0.845), SIMDE_BFLOAT16_VALUE( 14.948), SIMDE_BFLOAT16_VALUE( 17.996) }, + INT8_C( 6), + { SIMDE_BFLOAT16_VALUE( 14.948), SIMDE_BFLOAT16_VALUE( 14.948), SIMDE_BFLOAT16_VALUE( 14.948), SIMDE_BFLOAT16_VALUE( 14.948) } }, + { { SIMDE_BFLOAT16_VALUE( -9.902), SIMDE_BFLOAT16_VALUE( 20.687), SIMDE_BFLOAT16_VALUE( -25.203), SIMDE_BFLOAT16_VALUE( 13.883), + SIMDE_BFLOAT16_VALUE( -14.370), SIMDE_BFLOAT16_VALUE( -27.322), SIMDE_BFLOAT16_VALUE( -24.150), SIMDE_BFLOAT16_VALUE( -21.580) }, + INT8_C( 1), + { SIMDE_BFLOAT16_VALUE( 20.687), SIMDE_BFLOAT16_VALUE( 20.687), SIMDE_BFLOAT16_VALUE( 20.687), SIMDE_BFLOAT16_VALUE( 20.687) } }, + { { SIMDE_BFLOAT16_VALUE( 11.499), SIMDE_BFLOAT16_VALUE( -13.869), SIMDE_BFLOAT16_VALUE( -27.353), SIMDE_BFLOAT16_VALUE( 6.786), + SIMDE_BFLOAT16_VALUE( 29.577), SIMDE_BFLOAT16_VALUE( -4.705), SIMDE_BFLOAT16_VALUE( -25.496), SIMDE_BFLOAT16_VALUE( 26.515) }, + INT8_C( 0), + { SIMDE_BFLOAT16_VALUE( 11.499), SIMDE_BFLOAT16_VALUE( 11.499), SIMDE_BFLOAT16_VALUE( 11.499), SIMDE_BFLOAT16_VALUE( 11.499) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t vec; + simde_bfloat16x4_t r; + + vec = simde_vld1q_bf16(test_vec[i].vec); + SIMDE_CONSTIFY_8_(simde_vdup_laneq_bf16, r, (HEDLEY_UNREACHABLE(), r), test_vec[i].lane, vec); + + simde_test_arm_neon_assert_equal_bf16x4(r, simde_vld1_bf16(test_vec[i].r), 1); + } + + return 0; +} + +static int +test_simde_vdupq_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16 vec[4]; + int lane; + simde_bfloat16 r[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(-3.4), SIMDE_BFLOAT16_VALUE(6.4), SIMDE_BFLOAT16_VALUE(-7.4), SIMDE_BFLOAT16_VALUE(0.5) }, + INT8_C(0), + { SIMDE_BFLOAT16_VALUE(-3.4), SIMDE_BFLOAT16_VALUE(-3.4), SIMDE_BFLOAT16_VALUE(-3.4), SIMDE_BFLOAT16_VALUE(-3.4), + SIMDE_BFLOAT16_VALUE(-3.4), SIMDE_BFLOAT16_VALUE(-3.4), SIMDE_BFLOAT16_VALUE(-3.4), SIMDE_BFLOAT16_VALUE(-3.4) } }, + { { SIMDE_BFLOAT16_VALUE(8.1), SIMDE_BFLOAT16_VALUE(-0.0), SIMDE_BFLOAT16_VALUE(6.2), SIMDE_BFLOAT16_VALUE(-5.5) }, + INT8_C(3), + { SIMDE_BFLOAT16_VALUE(-5.5), SIMDE_BFLOAT16_VALUE(-5.5), SIMDE_BFLOAT16_VALUE(-5.5), SIMDE_BFLOAT16_VALUE(-5.5), + SIMDE_BFLOAT16_VALUE(-5.5), SIMDE_BFLOAT16_VALUE(-5.5), SIMDE_BFLOAT16_VALUE(-5.5), SIMDE_BFLOAT16_VALUE(-5.5) } }, + { { SIMDE_BFLOAT16_VALUE(-9.6), SIMDE_BFLOAT16_VALUE(6.7), SIMDE_BFLOAT16_VALUE(1.4), SIMDE_BFLOAT16_VALUE(10.7) }, + INT8_C(3), + { SIMDE_BFLOAT16_VALUE(10.7), SIMDE_BFLOAT16_VALUE(10.7), SIMDE_BFLOAT16_VALUE(10.7), SIMDE_BFLOAT16_VALUE(10.7), + SIMDE_BFLOAT16_VALUE(10.7), SIMDE_BFLOAT16_VALUE(10.7), SIMDE_BFLOAT16_VALUE(10.7), SIMDE_BFLOAT16_VALUE(10.7) } }, + { { SIMDE_BFLOAT16_VALUE(2.9), SIMDE_BFLOAT16_VALUE(-15.0), SIMDE_BFLOAT16_VALUE(14.8), SIMDE_BFLOAT16_VALUE(-2.2) }, + INT8_C(1), + { SIMDE_BFLOAT16_VALUE(-15.0), SIMDE_BFLOAT16_VALUE(-15.0), SIMDE_BFLOAT16_VALUE(-15.0), SIMDE_BFLOAT16_VALUE(-15.0), + SIMDE_BFLOAT16_VALUE(-15.0), SIMDE_BFLOAT16_VALUE(-15.0), SIMDE_BFLOAT16_VALUE(-15.0), SIMDE_BFLOAT16_VALUE(-15.0) } }, + { { SIMDE_BFLOAT16_VALUE(0.4), SIMDE_BFLOAT16_VALUE(0.2), SIMDE_BFLOAT16_VALUE(7.5), SIMDE_BFLOAT16_VALUE(-14.7) }, + INT8_C(2), + { SIMDE_BFLOAT16_VALUE(7.5), SIMDE_BFLOAT16_VALUE(7.5), SIMDE_BFLOAT16_VALUE(7.5), SIMDE_BFLOAT16_VALUE(7.5), + SIMDE_BFLOAT16_VALUE(7.5), SIMDE_BFLOAT16_VALUE(7.5), SIMDE_BFLOAT16_VALUE(7.5), SIMDE_BFLOAT16_VALUE(7.5) } }, + { { SIMDE_BFLOAT16_VALUE(-6.0), SIMDE_BFLOAT16_VALUE(0.4), SIMDE_BFLOAT16_VALUE(-8.9), SIMDE_BFLOAT16_VALUE(-11.3) }, + INT8_C(3), + { SIMDE_BFLOAT16_VALUE(-11.3), SIMDE_BFLOAT16_VALUE(-11.3), SIMDE_BFLOAT16_VALUE(-11.3), SIMDE_BFLOAT16_VALUE(-11.3), + SIMDE_BFLOAT16_VALUE(-11.3), SIMDE_BFLOAT16_VALUE(-11.3), SIMDE_BFLOAT16_VALUE(-11.3), SIMDE_BFLOAT16_VALUE(-11.3) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t vec; + simde_bfloat16x8_t r; + + vec = simde_vld1_bf16(test_vec[i].vec); + SIMDE_CONSTIFY_4_(simde_vdupq_lane_bf16, r, (HEDLEY_UNREACHABLE(), simde_vdupq_n_bf16(SIMDE_BFLOAT16_VALUE(0.0))), test_vec[i].lane, vec); + + simde_test_arm_neon_assert_equal_bf16x8(r, simde_vld1q_bf16(test_vec[i].r), 1); + } + + return 0; +} + +static int +test_simde_vdupq_laneq_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16 vec[8]; + int lane; + simde_bfloat16 r[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( -14.944), SIMDE_BFLOAT16_VALUE( 29.976), SIMDE_BFLOAT16_VALUE( 8.148), SIMDE_BFLOAT16_VALUE( -8.525), + SIMDE_BFLOAT16_VALUE( 4.332), SIMDE_BFLOAT16_VALUE( -8.444), SIMDE_BFLOAT16_VALUE( -17.802), SIMDE_BFLOAT16_VALUE( 18.658) }, + INT8_C( 3), + { SIMDE_BFLOAT16_VALUE( -8.525), SIMDE_BFLOAT16_VALUE( -8.525), SIMDE_BFLOAT16_VALUE( -8.525), SIMDE_BFLOAT16_VALUE( -8.525), + SIMDE_BFLOAT16_VALUE( -8.525), SIMDE_BFLOAT16_VALUE( -8.525), SIMDE_BFLOAT16_VALUE( -8.525), SIMDE_BFLOAT16_VALUE( -8.525) } }, + { { SIMDE_BFLOAT16_VALUE( 2.837), SIMDE_BFLOAT16_VALUE( -2.966), SIMDE_BFLOAT16_VALUE( -13.207), SIMDE_BFLOAT16_VALUE( 9.802), + SIMDE_BFLOAT16_VALUE( -11.553), SIMDE_BFLOAT16_VALUE( 4.185), SIMDE_BFLOAT16_VALUE( -2.087), SIMDE_BFLOAT16_VALUE( -25.138) }, + INT8_C( 0), + { SIMDE_BFLOAT16_VALUE( 2.837), SIMDE_BFLOAT16_VALUE( 2.837), SIMDE_BFLOAT16_VALUE( 2.837), SIMDE_BFLOAT16_VALUE( 2.837), + SIMDE_BFLOAT16_VALUE( 2.837), SIMDE_BFLOAT16_VALUE( 2.837), SIMDE_BFLOAT16_VALUE( 2.837), SIMDE_BFLOAT16_VALUE( 2.837) } }, + { { SIMDE_BFLOAT16_VALUE( -9.082), SIMDE_BFLOAT16_VALUE( -20.470), SIMDE_BFLOAT16_VALUE( -2.951), SIMDE_BFLOAT16_VALUE( -21.315), + SIMDE_BFLOAT16_VALUE( -22.110), SIMDE_BFLOAT16_VALUE( 4.867), SIMDE_BFLOAT16_VALUE( -1.873), SIMDE_BFLOAT16_VALUE( -9.236) }, + INT8_C( 6), + { SIMDE_BFLOAT16_VALUE( -1.873), SIMDE_BFLOAT16_VALUE( -1.873), SIMDE_BFLOAT16_VALUE( -1.873), SIMDE_BFLOAT16_VALUE( -1.873), + SIMDE_BFLOAT16_VALUE( -1.873), SIMDE_BFLOAT16_VALUE( -1.873), SIMDE_BFLOAT16_VALUE( -1.873), SIMDE_BFLOAT16_VALUE( -1.873) } }, + { { SIMDE_BFLOAT16_VALUE( -6.811), SIMDE_BFLOAT16_VALUE( -18.944), SIMDE_BFLOAT16_VALUE( 17.974), SIMDE_BFLOAT16_VALUE( 23.871), + SIMDE_BFLOAT16_VALUE( 22.903), SIMDE_BFLOAT16_VALUE( -21.458), SIMDE_BFLOAT16_VALUE( -7.777), SIMDE_BFLOAT16_VALUE( 11.946) }, + INT8_C( 7), + { SIMDE_BFLOAT16_VALUE( 11.946), SIMDE_BFLOAT16_VALUE( 11.946), SIMDE_BFLOAT16_VALUE( 11.946), SIMDE_BFLOAT16_VALUE( 11.946), + SIMDE_BFLOAT16_VALUE( 11.946), SIMDE_BFLOAT16_VALUE( 11.946), SIMDE_BFLOAT16_VALUE( 11.946), SIMDE_BFLOAT16_VALUE( 11.946) } }, + { { SIMDE_BFLOAT16_VALUE( 4.721), SIMDE_BFLOAT16_VALUE( 22.653), SIMDE_BFLOAT16_VALUE( -5.854), SIMDE_BFLOAT16_VALUE( -4.341), + SIMDE_BFLOAT16_VALUE( 0.043), SIMDE_BFLOAT16_VALUE( -3.823), SIMDE_BFLOAT16_VALUE( 4.788), SIMDE_BFLOAT16_VALUE( 11.244) }, + INT8_C( 4), + { SIMDE_BFLOAT16_VALUE( 0.043), SIMDE_BFLOAT16_VALUE( 0.043), SIMDE_BFLOAT16_VALUE( 0.043), SIMDE_BFLOAT16_VALUE( 0.043), + SIMDE_BFLOAT16_VALUE( 0.043), SIMDE_BFLOAT16_VALUE( 0.043), SIMDE_BFLOAT16_VALUE( 0.043), SIMDE_BFLOAT16_VALUE( 0.043) } }, + { { SIMDE_BFLOAT16_VALUE( -29.389), SIMDE_BFLOAT16_VALUE( 25.831), SIMDE_BFLOAT16_VALUE( 2.593), SIMDE_BFLOAT16_VALUE( 0.655), + SIMDE_BFLOAT16_VALUE( -29.518), SIMDE_BFLOAT16_VALUE( 21.627), SIMDE_BFLOAT16_VALUE( -9.484), SIMDE_BFLOAT16_VALUE( 9.197) }, + INT8_C( 7), + { SIMDE_BFLOAT16_VALUE( 9.197), SIMDE_BFLOAT16_VALUE( 9.197), SIMDE_BFLOAT16_VALUE( 9.197), SIMDE_BFLOAT16_VALUE( 9.197), + SIMDE_BFLOAT16_VALUE( 9.197), SIMDE_BFLOAT16_VALUE( 9.197), SIMDE_BFLOAT16_VALUE( 9.197), SIMDE_BFLOAT16_VALUE( 9.197) } }, + { { SIMDE_BFLOAT16_VALUE( 6.412), SIMDE_BFLOAT16_VALUE( -2.948), SIMDE_BFLOAT16_VALUE( 17.301), SIMDE_BFLOAT16_VALUE( 9.426), + SIMDE_BFLOAT16_VALUE( 23.317), SIMDE_BFLOAT16_VALUE( -1.470), SIMDE_BFLOAT16_VALUE( -28.086), SIMDE_BFLOAT16_VALUE( -4.040) }, + INT8_C( 6), + { SIMDE_BFLOAT16_VALUE( -28.086), SIMDE_BFLOAT16_VALUE( -28.086), SIMDE_BFLOAT16_VALUE( -28.086), SIMDE_BFLOAT16_VALUE( -28.086), + SIMDE_BFLOAT16_VALUE( -28.086), SIMDE_BFLOAT16_VALUE( -28.086), SIMDE_BFLOAT16_VALUE( -28.086), SIMDE_BFLOAT16_VALUE( -28.086) } }, + { { SIMDE_BFLOAT16_VALUE( 17.678), SIMDE_BFLOAT16_VALUE( 12.177), SIMDE_BFLOAT16_VALUE( -14.208), SIMDE_BFLOAT16_VALUE( -15.268), + SIMDE_BFLOAT16_VALUE( 15.600), SIMDE_BFLOAT16_VALUE( -16.025), SIMDE_BFLOAT16_VALUE( 24.952), SIMDE_BFLOAT16_VALUE( -1.031) }, + INT8_C( 7), + { SIMDE_BFLOAT16_VALUE( -1.031), SIMDE_BFLOAT16_VALUE( -1.031), SIMDE_BFLOAT16_VALUE( -1.031), SIMDE_BFLOAT16_VALUE( -1.031), + SIMDE_BFLOAT16_VALUE( -1.031), SIMDE_BFLOAT16_VALUE( -1.031), SIMDE_BFLOAT16_VALUE( -1.031), SIMDE_BFLOAT16_VALUE( -1.031) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t vec; + simde_bfloat16x8_t r; + + vec = simde_vld1q_bf16(test_vec[i].vec); + SIMDE_CONSTIFY_8_(simde_vdupq_laneq_bf16, r, (HEDLEY_UNREACHABLE(), simde_vdupq_n_bf16(SIMDE_BFLOAT16_VALUE(0.0))), test_vec[i].lane, vec); + + simde_test_arm_neon_assert_equal_bf16x8(r, simde_vld1q_bf16(test_vec[i].r), 1); + } + + return 0; +} + HEDLEY_DIAGNOSTIC_POP SIMDE_TEST_FUNC_LIST_BEGIN @@ -4079,6 +4415,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vduph_lane_s16) SIMDE_TEST_FUNC_LIST_ENTRY(vduph_lane_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vduph_laneq_s16) SIMDE_TEST_FUNC_LIST_ENTRY(vduph_laneq_u16) +SIMDE_TEST_FUNC_LIST_ENTRY(vduph_lane_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vduph_laneq_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vdup_lane_p8) @@ -4102,6 +4439,13 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vdupb_laneq_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vduph_lane_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vduph_laneq_p16) +SIMDE_TEST_FUNC_LIST_ENTRY(vdup_lane_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vdup_laneq_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vdupq_lane_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vdupq_laneq_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vduph_lane_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vduph_laneq_bf16) + SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/dup_n.c b/test/arm/neon/dup_n.c index 35aea724a..6ecb61e57 100644 --- a/test/arm/neon/dup_n.c +++ b/test/arm/neon/dup_n.c @@ -1382,6 +1382,92 @@ test_simde_vdupq_n_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vdup_n_bf16 (SIMDE_MUNIT_TEST_ARGS) { + #if 1 + struct { + SIMDE_ALIGN_TO_16 simde_bfloat16_t a; + SIMDE_ALIGN_TO_16 simde_bfloat16_t r[4]; + } test_vec[] = { + { SIMDE_BFLOAT16_VALUE( 688.00), + { SIMDE_BFLOAT16_VALUE( 688.00), SIMDE_BFLOAT16_VALUE( 688.00), SIMDE_BFLOAT16_VALUE( 688.00), SIMDE_BFLOAT16_VALUE( 688.00) } }, + { SIMDE_BFLOAT16_VALUE( 160.00), + { SIMDE_BFLOAT16_VALUE( 160.00), SIMDE_BFLOAT16_VALUE( 160.00), SIMDE_BFLOAT16_VALUE( 160.00), SIMDE_BFLOAT16_VALUE( 160.00) } }, + { SIMDE_BFLOAT16_VALUE( 62.75), + { SIMDE_BFLOAT16_VALUE( 62.75), SIMDE_BFLOAT16_VALUE( 62.75), SIMDE_BFLOAT16_VALUE( 62.75), SIMDE_BFLOAT16_VALUE( 62.75) } }, + { SIMDE_BFLOAT16_VALUE( 182.00), + { SIMDE_BFLOAT16_VALUE( 182.00), SIMDE_BFLOAT16_VALUE( 182.00), SIMDE_BFLOAT16_VALUE( 182.00), SIMDE_BFLOAT16_VALUE( 182.00) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + SIMDE_ALIGN_TO_16 simde_bfloat16_t a; + SIMDE_ALIGN_TO_16 simde_bfloat16x4_t r; + + a = test_vec[i].a; + r = simde_vdup_n_bf16(a); + + simde_test_arm_neon_assert_equal_bf16x4(r, simde_vld1_bf16(test_vec[i].r), 1); + } + + return 0; + #else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + SIMDE_ALIGN_TO_16 simde_bfloat16_t a = simde_test_codegen_random_bf16(SIMDE_BFLOAT16_VALUE(-1000.0), SIMDE_BFLOAT16_VALUE(1000.0)); + SIMDE_ALIGN_TO_16 simde_bfloat16x4_t r = simde_vdup_n_bf16(a); + + simde_test_codegen_write_bf16(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x4(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; + #endif +} + +static int +test_simde_vdupq_n_bf16 (SIMDE_MUNIT_TEST_ARGS) { + #if 1 + struct { + SIMDE_ALIGN_TO_16 simde_bfloat16_t a; + SIMDE_ALIGN_TO_16 simde_bfloat16_t r[8]; + } test_vec[] = { + { SIMDE_BFLOAT16_VALUE( 246.00), + { SIMDE_BFLOAT16_VALUE( 246.00), SIMDE_BFLOAT16_VALUE( 246.00), SIMDE_BFLOAT16_VALUE( 246.00), SIMDE_BFLOAT16_VALUE( 246.00), + SIMDE_BFLOAT16_VALUE( 246.00), SIMDE_BFLOAT16_VALUE( 246.00), SIMDE_BFLOAT16_VALUE( 246.00), SIMDE_BFLOAT16_VALUE( 246.00) } }, + { SIMDE_BFLOAT16_VALUE( -330.00), + { SIMDE_BFLOAT16_VALUE( -330.00), SIMDE_BFLOAT16_VALUE( -330.00), SIMDE_BFLOAT16_VALUE( -330.00), SIMDE_BFLOAT16_VALUE( -330.00), + SIMDE_BFLOAT16_VALUE( -330.00), SIMDE_BFLOAT16_VALUE( -330.00), SIMDE_BFLOAT16_VALUE( -330.00), SIMDE_BFLOAT16_VALUE( -330.00) } }, + { SIMDE_BFLOAT16_VALUE( 540.00), + { SIMDE_BFLOAT16_VALUE( 540.00), SIMDE_BFLOAT16_VALUE( 540.00), SIMDE_BFLOAT16_VALUE( 540.00), SIMDE_BFLOAT16_VALUE( 540.00), + SIMDE_BFLOAT16_VALUE( 540.00), SIMDE_BFLOAT16_VALUE( 540.00), SIMDE_BFLOAT16_VALUE( 540.00), SIMDE_BFLOAT16_VALUE( 540.00) } }, + { SIMDE_BFLOAT16_VALUE( -210.00), + { SIMDE_BFLOAT16_VALUE( -210.00), SIMDE_BFLOAT16_VALUE( -210.00), SIMDE_BFLOAT16_VALUE( -210.00), SIMDE_BFLOAT16_VALUE( -210.00), + SIMDE_BFLOAT16_VALUE( -210.00), SIMDE_BFLOAT16_VALUE( -210.00), SIMDE_BFLOAT16_VALUE( -210.00), SIMDE_BFLOAT16_VALUE( -210.00) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + SIMDE_ALIGN_TO_16 simde_bfloat16_t a; + SIMDE_ALIGN_TO_16 simde_bfloat16x8_t r; + + a = test_vec[i].a; + r = simde_vdupq_n_bf16(a); + + simde_test_arm_neon_assert_equal_bf16x8(r, simde_vld1q_bf16(test_vec[i].r), 1); + } + + return 0; + #else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16_t a = simde_test_codegen_random_bf16(SIMDE_BFLOAT16_VALUE(-1000.0), SIMDE_BFLOAT16_VALUE(1000.0)); + simde_bfloat16x8_t r = simde_vdupq_n_bf16(a); + + simde_test_codegen_write_bf16(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x8(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; + #endif +} + SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vdup_n_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vdup_n_f32) @@ -1413,6 +1499,9 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vdup_n_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vdupq_n_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vdupq_n_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vdupq_n_p64) + +SIMDE_TEST_FUNC_LIST_ENTRY(vdup_n_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vdupq_n_bf16) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/fmlal.c b/test/arm/neon/fmlal.c index cc878adb7..25f0a0c2a 100644 --- a/test/arm/neon/fmlal.c +++ b/test/arm/neon/fmlal.c @@ -1055,6 +1055,412 @@ test_simde_vfmlalq_laneq_high_f16 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vbfmlalbq_f32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_float32_t buf[4]; + simde_bfloat16_t a[8]; + simde_bfloat16_t b[8]; + simde_float32_t r[4]; + } test_vec[] = { + { { SIMDE_FLOAT32_C( -90.78), SIMDE_FLOAT32_C( 390.35), SIMDE_FLOAT32_C( 893.69), SIMDE_FLOAT32_C( 387.97) }, + { SIMDE_BFLOAT16_VALUE( -6.38), SIMDE_BFLOAT16_VALUE( -82.00), SIMDE_BFLOAT16_VALUE( 31.12), SIMDE_BFLOAT16_VALUE( 83.00), + SIMDE_BFLOAT16_VALUE( -34.50), SIMDE_BFLOAT16_VALUE( 61.50), SIMDE_BFLOAT16_VALUE( 7.38), SIMDE_BFLOAT16_VALUE( -3.36) }, + { SIMDE_BFLOAT16_VALUE( -58.00), SIMDE_BFLOAT16_VALUE( -83.50), SIMDE_BFLOAT16_VALUE( -7.28), SIMDE_BFLOAT16_VALUE( 90.50), + SIMDE_BFLOAT16_VALUE( 71.50), SIMDE_BFLOAT16_VALUE( -43.75), SIMDE_BFLOAT16_VALUE( 9.12), SIMDE_BFLOAT16_VALUE( 61.25) }, + { SIMDE_FLOAT32_C( 278.97), SIMDE_FLOAT32_C( 163.72), SIMDE_FLOAT32_C( -1573.06), SIMDE_FLOAT32_C( 455.27) } }, + { { SIMDE_FLOAT32_C( 846.10), SIMDE_FLOAT32_C( -810.17), SIMDE_FLOAT32_C( -470.39), SIMDE_FLOAT32_C( 92.71) }, + { SIMDE_BFLOAT16_VALUE( 33.75), SIMDE_BFLOAT16_VALUE( -78.50), SIMDE_BFLOAT16_VALUE( 85.00), SIMDE_BFLOAT16_VALUE( 55.50), + SIMDE_BFLOAT16_VALUE( -46.00), SIMDE_BFLOAT16_VALUE( 35.50), SIMDE_BFLOAT16_VALUE( 96.50), SIMDE_BFLOAT16_VALUE( 45.00) }, + { SIMDE_BFLOAT16_VALUE( -25.38), SIMDE_BFLOAT16_VALUE( 85.50), SIMDE_BFLOAT16_VALUE( -16.25), SIMDE_BFLOAT16_VALUE( 68.50), + SIMDE_BFLOAT16_VALUE( -96.50), SIMDE_BFLOAT16_VALUE( -85.00), SIMDE_BFLOAT16_VALUE( 51.25), SIMDE_BFLOAT16_VALUE( -30.75) }, + { SIMDE_FLOAT32_C( -10.31), SIMDE_FLOAT32_C( -2191.42), SIMDE_FLOAT32_C( 3968.61), SIMDE_FLOAT32_C( 5038.33) } }, + { { SIMDE_FLOAT32_C( 764.56), SIMDE_FLOAT32_C( -412.55), SIMDE_FLOAT32_C( 658.54), SIMDE_FLOAT32_C( -814.96) }, + { SIMDE_BFLOAT16_VALUE( -24.62), SIMDE_BFLOAT16_VALUE( -41.50), SIMDE_BFLOAT16_VALUE( -91.00), SIMDE_BFLOAT16_VALUE( -53.25), + SIMDE_BFLOAT16_VALUE( 14.88), SIMDE_BFLOAT16_VALUE( 18.00), SIMDE_BFLOAT16_VALUE( -92.00), SIMDE_BFLOAT16_VALUE( -0.54) }, + { SIMDE_BFLOAT16_VALUE( 37.00), SIMDE_BFLOAT16_VALUE( -39.25), SIMDE_BFLOAT16_VALUE( -91.50), SIMDE_BFLOAT16_VALUE( -29.38), + SIMDE_BFLOAT16_VALUE( -17.75), SIMDE_BFLOAT16_VALUE( 94.00), SIMDE_BFLOAT16_VALUE( -74.00), SIMDE_BFLOAT16_VALUE( 36.25) }, + { SIMDE_FLOAT32_C( -146.57), SIMDE_FLOAT32_C( 7913.95), SIMDE_FLOAT32_C( 394.51), SIMDE_FLOAT32_C( 5993.04) } }, + { { SIMDE_FLOAT32_C( 294.63), SIMDE_FLOAT32_C( -776.78), SIMDE_FLOAT32_C( -187.02), SIMDE_FLOAT32_C( -959.03) }, + { SIMDE_BFLOAT16_VALUE( -92.00), SIMDE_BFLOAT16_VALUE( 65.00), SIMDE_BFLOAT16_VALUE( 72.50), SIMDE_BFLOAT16_VALUE( -88.50), + SIMDE_BFLOAT16_VALUE( 80.00), SIMDE_BFLOAT16_VALUE( 23.75), SIMDE_BFLOAT16_VALUE( -19.12), SIMDE_BFLOAT16_VALUE( 56.50) }, + { SIMDE_BFLOAT16_VALUE( 82.50), SIMDE_BFLOAT16_VALUE( -53.25), SIMDE_BFLOAT16_VALUE( 75.00), SIMDE_BFLOAT16_VALUE( -42.25), + SIMDE_BFLOAT16_VALUE( 5.31), SIMDE_BFLOAT16_VALUE( 84.00), SIMDE_BFLOAT16_VALUE( 4.59), SIMDE_BFLOAT16_VALUE( -80.00) }, + { SIMDE_FLOAT32_C( -7295.37), SIMDE_FLOAT32_C( 4660.72), SIMDE_FLOAT32_C( 237.98), SIMDE_FLOAT32_C( -1046.89) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x4_t buf = simde_vld1q_f32(test_vec[i].buf); + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_t b = simde_vld1q_bf16(test_vec[i].b); + simde_float32x4_t r = simde_vbfmlalbq_f32(buf, a, b); + + simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4; i++) { + simde_float32x4_t buf = simde_test_arm_neon_random_f32x4(-1000.0f, 1000.0f); + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_bfloat16x8_t b = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_float32x4_t r = simde_vbfmlalbq_f32(buf, a, b); + + simde_test_arm_neon_write_f32x4(2, buf, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_f32x4(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vbfmlaltq_f32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_float32_t buf[4]; + simde_bfloat16_t a[8]; + simde_bfloat16_t b[8]; + simde_float32_t r[4]; + } test_vec[] = { + { { SIMDE_FLOAT32_C( 189.80), SIMDE_FLOAT32_C( 898.26), SIMDE_FLOAT32_C( -621.12), SIMDE_FLOAT32_C( 76.72) }, + { SIMDE_BFLOAT16_VALUE( -48.25), SIMDE_BFLOAT16_VALUE( -86.50), SIMDE_BFLOAT16_VALUE( 22.38), SIMDE_BFLOAT16_VALUE( -74.00), + SIMDE_BFLOAT16_VALUE( 77.00), SIMDE_BFLOAT16_VALUE( 63.00), SIMDE_BFLOAT16_VALUE( 70.50), SIMDE_BFLOAT16_VALUE( 0.60) }, + { SIMDE_BFLOAT16_VALUE( -26.50), SIMDE_BFLOAT16_VALUE( -53.25), SIMDE_BFLOAT16_VALUE( 56.00), SIMDE_BFLOAT16_VALUE( 15.56), + SIMDE_BFLOAT16_VALUE( 59.50), SIMDE_BFLOAT16_VALUE( -97.50), SIMDE_BFLOAT16_VALUE( 80.00), SIMDE_BFLOAT16_VALUE( 6.44) }, + { SIMDE_FLOAT32_C( 4795.92), SIMDE_FLOAT32_C( -253.36), SIMDE_FLOAT32_C( -6763.62), SIMDE_FLOAT32_C( 80.59) } }, + { { SIMDE_FLOAT32_C( 480.73), SIMDE_FLOAT32_C( 341.03), SIMDE_FLOAT32_C( -369.94), SIMDE_FLOAT32_C( 131.59) }, + { SIMDE_BFLOAT16_VALUE( -22.38), SIMDE_BFLOAT16_VALUE( 2.19), SIMDE_BFLOAT16_VALUE( 66.50), SIMDE_BFLOAT16_VALUE( -55.00), + SIMDE_BFLOAT16_VALUE( -71.50), SIMDE_BFLOAT16_VALUE( 17.75), SIMDE_BFLOAT16_VALUE( -6.50), SIMDE_BFLOAT16_VALUE( 47.50) }, + { SIMDE_BFLOAT16_VALUE( 7.62), SIMDE_BFLOAT16_VALUE( 31.38), SIMDE_BFLOAT16_VALUE( -44.75), SIMDE_BFLOAT16_VALUE( 59.50), + SIMDE_BFLOAT16_VALUE( 44.75), SIMDE_BFLOAT16_VALUE( 77.50), SIMDE_BFLOAT16_VALUE( 85.50), SIMDE_BFLOAT16_VALUE( 21.75) }, + { SIMDE_FLOAT32_C( 549.36), SIMDE_FLOAT32_C( -2931.47), SIMDE_FLOAT32_C( 1005.68), SIMDE_FLOAT32_C( 1164.71) } }, + { { SIMDE_FLOAT32_C( 406.40), SIMDE_FLOAT32_C( 560.81), SIMDE_FLOAT32_C( -776.44), SIMDE_FLOAT32_C( -858.76) }, + { SIMDE_BFLOAT16_VALUE( -97.00), SIMDE_BFLOAT16_VALUE( 78.50), SIMDE_BFLOAT16_VALUE( 29.62), SIMDE_BFLOAT16_VALUE( 62.50), + SIMDE_BFLOAT16_VALUE( 81.00), SIMDE_BFLOAT16_VALUE( 9.50), SIMDE_BFLOAT16_VALUE( -31.12), SIMDE_BFLOAT16_VALUE( 29.00) }, + { SIMDE_BFLOAT16_VALUE( -56.50), SIMDE_BFLOAT16_VALUE( 31.88), SIMDE_BFLOAT16_VALUE( -58.00), SIMDE_BFLOAT16_VALUE( 21.25), + SIMDE_BFLOAT16_VALUE( -66.00), SIMDE_BFLOAT16_VALUE( -91.50), SIMDE_BFLOAT16_VALUE( 66.00), SIMDE_BFLOAT16_VALUE( -37.25) }, + { SIMDE_FLOAT32_C( 2908.59), SIMDE_FLOAT32_C( 1888.94), SIMDE_FLOAT32_C( -1645.69), SIMDE_FLOAT32_C( -1939.01) } }, + { { SIMDE_FLOAT32_C( 265.07), SIMDE_FLOAT32_C( -403.13), SIMDE_FLOAT32_C( -897.91), SIMDE_FLOAT32_C( -658.76) }, + { SIMDE_BFLOAT16_VALUE( 91.00), SIMDE_BFLOAT16_VALUE( -34.50), SIMDE_BFLOAT16_VALUE( 93.50), SIMDE_BFLOAT16_VALUE( 36.00), + SIMDE_BFLOAT16_VALUE( -57.00), SIMDE_BFLOAT16_VALUE( 79.00), SIMDE_BFLOAT16_VALUE( -42.25), SIMDE_BFLOAT16_VALUE( 83.50) }, + { SIMDE_BFLOAT16_VALUE( 35.00), SIMDE_BFLOAT16_VALUE( -20.00), SIMDE_BFLOAT16_VALUE( 97.50), SIMDE_BFLOAT16_VALUE( 38.00), + SIMDE_BFLOAT16_VALUE( -41.50), SIMDE_BFLOAT16_VALUE( 27.38), SIMDE_BFLOAT16_VALUE( 0.38), SIMDE_BFLOAT16_VALUE( -60.75) }, + { SIMDE_FLOAT32_C( 955.07), SIMDE_FLOAT32_C( 964.87), SIMDE_FLOAT32_C( 1264.72), SIMDE_FLOAT32_C( -5731.38) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x4_t buf = simde_vld1q_f32(test_vec[i].buf); + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_t b = simde_vld1q_bf16(test_vec[i].b); + simde_float32x4_t r = simde_vbfmlaltq_f32(buf, a, b); + + simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4; i++) { + simde_float32x4_t buf = simde_test_arm_neon_random_f32x4(-1000.0f, 1000.0f); + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_bfloat16x8_t b = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_float32x4_t r = simde_vbfmlaltq_f32(buf, a, b); + + simde_test_arm_neon_write_f32x4(2, buf, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_f32x4(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vbfmlalbq_lane_f32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_float32_t buf[4]; + simde_bfloat16_t a[8]; + simde_bfloat16_t b[4]; + const int lane; + simde_float32_t r[4]; + } test_vec[] = { + { { SIMDE_FLOAT32_C( 824.53), SIMDE_FLOAT32_C( -450.81), SIMDE_FLOAT32_C( 308.95), SIMDE_FLOAT32_C( 958.95) }, + { SIMDE_BFLOAT16_VALUE( -11.19), SIMDE_BFLOAT16_VALUE( 81.00), SIMDE_BFLOAT16_VALUE( -65.00), SIMDE_BFLOAT16_VALUE( 99.00), + SIMDE_BFLOAT16_VALUE( 79.50), SIMDE_BFLOAT16_VALUE( 19.00), SIMDE_BFLOAT16_VALUE( -3.02), SIMDE_BFLOAT16_VALUE( -50.00) }, + { SIMDE_BFLOAT16_VALUE( 26.75), SIMDE_BFLOAT16_VALUE( 30.12), SIMDE_BFLOAT16_VALUE( 14.81), SIMDE_BFLOAT16_VALUE( -93.00) }, + INT32_C( 2), + { SIMDE_FLOAT32_C( 658.82), SIMDE_FLOAT32_C( -1413.62), SIMDE_FLOAT32_C( 1486.54), SIMDE_FLOAT32_C( 914.28) } }, + { { SIMDE_FLOAT32_C( -762.57), SIMDE_FLOAT32_C( -809.10), SIMDE_FLOAT32_C( -944.16), SIMDE_FLOAT32_C( 603.41) }, + { SIMDE_BFLOAT16_VALUE( 74.00), SIMDE_BFLOAT16_VALUE( -59.50), SIMDE_BFLOAT16_VALUE( -11.50), SIMDE_BFLOAT16_VALUE( 32.50), + SIMDE_BFLOAT16_VALUE( -91.00), SIMDE_BFLOAT16_VALUE( -8.50), SIMDE_BFLOAT16_VALUE( 47.00), SIMDE_BFLOAT16_VALUE( -74.50) }, + { SIMDE_BFLOAT16_VALUE( 9.06), SIMDE_BFLOAT16_VALUE( -95.00), SIMDE_BFLOAT16_VALUE( -92.00), SIMDE_BFLOAT16_VALUE( 64.00) }, + INT32_C( 2), + { SIMDE_FLOAT32_C( -7570.57), SIMDE_FLOAT32_C( 248.90), SIMDE_FLOAT32_C( 7427.84), SIMDE_FLOAT32_C( -3720.59) } }, + { { SIMDE_FLOAT32_C( -962.26), SIMDE_FLOAT32_C( -472.21), SIMDE_FLOAT32_C( 171.13), SIMDE_FLOAT32_C( -611.90) }, + { SIMDE_BFLOAT16_VALUE( -48.00), SIMDE_BFLOAT16_VALUE( -3.25), SIMDE_BFLOAT16_VALUE( 57.75), SIMDE_BFLOAT16_VALUE( 49.00), + SIMDE_BFLOAT16_VALUE( 46.75), SIMDE_BFLOAT16_VALUE( -15.31), SIMDE_BFLOAT16_VALUE( -21.00), SIMDE_BFLOAT16_VALUE( -38.50) }, + { SIMDE_BFLOAT16_VALUE( -8.19), SIMDE_BFLOAT16_VALUE( -72.00), SIMDE_BFLOAT16_VALUE( -14.69), SIMDE_BFLOAT16_VALUE( 10.88) }, + INT32_C( 3), + { SIMDE_FLOAT32_C( -1484.26), SIMDE_FLOAT32_C( 155.82), SIMDE_FLOAT32_C( 679.54), SIMDE_FLOAT32_C( -840.28) } }, + { { SIMDE_FLOAT32_C( -543.53), SIMDE_FLOAT32_C( -150.17), SIMDE_FLOAT32_C( -257.14), SIMDE_FLOAT32_C( 341.17) }, + { SIMDE_BFLOAT16_VALUE( -82.50), SIMDE_BFLOAT16_VALUE( -16.75), SIMDE_BFLOAT16_VALUE( -74.50), SIMDE_BFLOAT16_VALUE( 64.50), + SIMDE_BFLOAT16_VALUE( 8.62), SIMDE_BFLOAT16_VALUE( 34.75), SIMDE_BFLOAT16_VALUE( 69.50), SIMDE_BFLOAT16_VALUE( 16.50) }, + { SIMDE_BFLOAT16_VALUE( -1.37), SIMDE_BFLOAT16_VALUE( 5.59), SIMDE_BFLOAT16_VALUE( 20.25), SIMDE_BFLOAT16_VALUE( 51.50) }, + INT32_C( 3), + { SIMDE_FLOAT32_C( -4792.28), SIMDE_FLOAT32_C( -3986.92), SIMDE_FLOAT32_C( 187.05), SIMDE_FLOAT32_C( 3920.42) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x4_t buf = simde_vld1q_f32(test_vec[i].buf); + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x4_t b = simde_vld1_bf16(test_vec[i].b); + simde_float32x4_t r; + SIMDE_CONSTIFY_4_(simde_vbfmlalbq_lane_f32, r, (HEDLEY_UNREACHABLE(), buf), test_vec[i].lane, buf, a, b); + + simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4; i++) { + simde_float32x4_t buf = simde_test_arm_neon_random_f32x4(-1000.0f, 1000.0f); + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_bfloat16x4_t b = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + int lane = simde_test_codegen_random_i8() & 3; + simde_float32x4_t r; + SIMDE_CONSTIFY_4_(simde_vbfmlalbq_lane_f32, r, (HEDLEY_UNREACHABLE(), buf), lane, buf, a, b); + + simde_test_arm_neon_write_f32x4(2, buf, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_codegen_write_i32(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_f32x4(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vbfmlalbq_laneq_f32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_float32_t buf[4]; + simde_bfloat16_t a[8]; + simde_bfloat16_t b[8]; + const int lane; + simde_float32_t r[4]; + } test_vec[] = { + { { SIMDE_FLOAT32_C( -621.19), SIMDE_FLOAT32_C( -830.86), SIMDE_FLOAT32_C( -44.77), SIMDE_FLOAT32_C( 432.43) }, + { SIMDE_BFLOAT16_VALUE( 91.50), SIMDE_BFLOAT16_VALUE( 64.50), SIMDE_BFLOAT16_VALUE( 20.62), SIMDE_BFLOAT16_VALUE( -66.50), + SIMDE_BFLOAT16_VALUE( -1.14), SIMDE_BFLOAT16_VALUE( 88.50), SIMDE_BFLOAT16_VALUE( 12.56), SIMDE_BFLOAT16_VALUE( 81.00) }, + { SIMDE_BFLOAT16_VALUE( -43.00), SIMDE_BFLOAT16_VALUE( -28.75), SIMDE_BFLOAT16_VALUE( -78.00), SIMDE_BFLOAT16_VALUE( -15.88), + SIMDE_BFLOAT16_VALUE( 0.39), SIMDE_BFLOAT16_VALUE( 7.47), SIMDE_BFLOAT16_VALUE( 79.50), SIMDE_BFLOAT16_VALUE( -82.50) }, + INT32_C( 2), + { SIMDE_FLOAT32_C( -7758.19), SIMDE_FLOAT32_C( -2439.61), SIMDE_FLOAT32_C( 44.20), SIMDE_FLOAT32_C( -547.45) } }, + { { SIMDE_FLOAT32_C( 963.16), SIMDE_FLOAT32_C( 919.18), SIMDE_FLOAT32_C( -44.32), SIMDE_FLOAT32_C( 217.46) }, + { SIMDE_BFLOAT16_VALUE( 92.50), SIMDE_BFLOAT16_VALUE( -60.00), SIMDE_BFLOAT16_VALUE( 84.50), SIMDE_BFLOAT16_VALUE( -25.88), + SIMDE_BFLOAT16_VALUE( 18.88), SIMDE_BFLOAT16_VALUE( 28.38), SIMDE_BFLOAT16_VALUE( 12.00), SIMDE_BFLOAT16_VALUE( 35.75) }, + { SIMDE_BFLOAT16_VALUE( -76.00), SIMDE_BFLOAT16_VALUE( -44.75), SIMDE_BFLOAT16_VALUE( 27.25), SIMDE_BFLOAT16_VALUE( 88.50), + SIMDE_BFLOAT16_VALUE( 76.00), SIMDE_BFLOAT16_VALUE( 60.75), SIMDE_BFLOAT16_VALUE( -12.75), SIMDE_BFLOAT16_VALUE( 64.50) }, + INT32_C( 7), + { SIMDE_FLOAT32_C( 6929.41), SIMDE_FLOAT32_C( 6369.43), SIMDE_FLOAT32_C( 1173.12), SIMDE_FLOAT32_C( 991.46) } }, + { { SIMDE_FLOAT32_C( -317.22), SIMDE_FLOAT32_C( -783.97), SIMDE_FLOAT32_C( 445.97), SIMDE_FLOAT32_C( -97.04) }, + { SIMDE_BFLOAT16_VALUE( 5.72), SIMDE_BFLOAT16_VALUE( -55.00), SIMDE_BFLOAT16_VALUE( 98.00), SIMDE_BFLOAT16_VALUE( -14.56), + SIMDE_BFLOAT16_VALUE( -37.75), SIMDE_BFLOAT16_VALUE( 54.25), SIMDE_BFLOAT16_VALUE( -18.25), SIMDE_BFLOAT16_VALUE( -45.75) }, + { SIMDE_BFLOAT16_VALUE( -50.00), SIMDE_BFLOAT16_VALUE( -96.50), SIMDE_BFLOAT16_VALUE( -53.25), SIMDE_BFLOAT16_VALUE( -10.12), + SIMDE_BFLOAT16_VALUE( 87.50), SIMDE_BFLOAT16_VALUE( 21.00), SIMDE_BFLOAT16_VALUE( -91.00), SIMDE_BFLOAT16_VALUE( 16.12) }, + INT32_C( 0), + { SIMDE_FLOAT32_C( -603.16), SIMDE_FLOAT32_C( -5683.97), SIMDE_FLOAT32_C( 2333.47), SIMDE_FLOAT32_C( 815.46) } }, + { { SIMDE_FLOAT32_C( 446.33), SIMDE_FLOAT32_C( 400.13), SIMDE_FLOAT32_C( -117.83), SIMDE_FLOAT32_C( -281.81) }, + { SIMDE_BFLOAT16_VALUE( 28.38), SIMDE_BFLOAT16_VALUE( -36.00), SIMDE_BFLOAT16_VALUE( -67.50), SIMDE_BFLOAT16_VALUE( -84.50), + SIMDE_BFLOAT16_VALUE( -71.50), SIMDE_BFLOAT16_VALUE( 5.81), SIMDE_BFLOAT16_VALUE( -16.12), SIMDE_BFLOAT16_VALUE( -49.75) }, + { SIMDE_BFLOAT16_VALUE( -49.50), SIMDE_BFLOAT16_VALUE( 74.00), SIMDE_BFLOAT16_VALUE( 56.00), SIMDE_BFLOAT16_VALUE( -4.59), + SIMDE_BFLOAT16_VALUE( 72.00), SIMDE_BFLOAT16_VALUE( -58.50), SIMDE_BFLOAT16_VALUE( 57.75), SIMDE_BFLOAT16_VALUE( 26.25) }, + INT32_C( 4), + { SIMDE_FLOAT32_C( 2489.33), SIMDE_FLOAT32_C( -4459.87), SIMDE_FLOAT32_C( -5265.83), SIMDE_FLOAT32_C( -1442.81) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x4_t buf = simde_vld1q_f32(test_vec[i].buf); + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_t b = simde_vld1q_bf16(test_vec[i].b); + simde_float32x4_t r; + SIMDE_CONSTIFY_8_(simde_vbfmlalbq_laneq_f32, r, (HEDLEY_UNREACHABLE(), buf), test_vec[i].lane, buf, a, b); + + simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4; i++) { + simde_float32x4_t buf = simde_test_arm_neon_random_f32x4(-1000.0f, 1000.0f); + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_bfloat16x8_t b = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + int lane = simde_test_codegen_random_i8() & 7; + simde_float32x4_t r; + SIMDE_CONSTIFY_8_(simde_vbfmlalbq_laneq_f32, r, (HEDLEY_UNREACHABLE(), buf), lane, buf, a, b); + + simde_test_arm_neon_write_f32x4(2, buf, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_codegen_write_i32(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_f32x4(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vbfmlaltq_lane_f32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_float32_t buf[4]; + simde_bfloat16_t a[8]; + simde_bfloat16_t b[4]; + const int lane; + simde_float32_t r[4]; + } test_vec[] = { + { { SIMDE_FLOAT32_C( 880.27), SIMDE_FLOAT32_C( -26.30), SIMDE_FLOAT32_C( -10.67), SIMDE_FLOAT32_C( 370.59) }, + { SIMDE_BFLOAT16_VALUE( -72.50), SIMDE_BFLOAT16_VALUE( 37.50), SIMDE_BFLOAT16_VALUE( 65.00), SIMDE_BFLOAT16_VALUE( 31.00), + SIMDE_BFLOAT16_VALUE( -36.25), SIMDE_BFLOAT16_VALUE( 6.34), SIMDE_BFLOAT16_VALUE( -98.00), SIMDE_BFLOAT16_VALUE( 63.25) }, + { SIMDE_BFLOAT16_VALUE( -65.00), SIMDE_BFLOAT16_VALUE( 62.00), SIMDE_BFLOAT16_VALUE( -12.38), SIMDE_BFLOAT16_VALUE( 7.03) }, + INT32_C( 0), + { SIMDE_FLOAT32_C( -1557.23), SIMDE_FLOAT32_C( -2041.30), SIMDE_FLOAT32_C( -423.01), SIMDE_FLOAT32_C( -3740.66) } }, + { { SIMDE_FLOAT32_C( -130.23), SIMDE_FLOAT32_C( -295.66), SIMDE_FLOAT32_C( -390.26), SIMDE_FLOAT32_C( -618.54) }, + { SIMDE_BFLOAT16_VALUE( -58.50), SIMDE_BFLOAT16_VALUE( -0.17), SIMDE_BFLOAT16_VALUE( 66.50), SIMDE_BFLOAT16_VALUE( 46.00), + SIMDE_BFLOAT16_VALUE( -14.62), SIMDE_BFLOAT16_VALUE( 78.50), SIMDE_BFLOAT16_VALUE( 47.00), SIMDE_BFLOAT16_VALUE( -32.50) }, + { SIMDE_BFLOAT16_VALUE( 47.50), SIMDE_BFLOAT16_VALUE( -2.55), SIMDE_BFLOAT16_VALUE( -44.50), SIMDE_BFLOAT16_VALUE( -55.25) }, + INT32_C( 3), + { SIMDE_FLOAT32_C( -120.84), SIMDE_FLOAT32_C( -2837.16), SIMDE_FLOAT32_C( -4727.38), SIMDE_FLOAT32_C( 1177.08) } }, + { { SIMDE_FLOAT32_C( 924.71), SIMDE_FLOAT32_C( -277.33), SIMDE_FLOAT32_C( 339.00), SIMDE_FLOAT32_C( 575.22) }, + { SIMDE_BFLOAT16_VALUE( -96.50), SIMDE_BFLOAT16_VALUE( 97.50), SIMDE_BFLOAT16_VALUE( -36.25), SIMDE_BFLOAT16_VALUE( -94.50), + SIMDE_BFLOAT16_VALUE( 61.00), SIMDE_BFLOAT16_VALUE( -1.37), SIMDE_BFLOAT16_VALUE( 67.50), SIMDE_BFLOAT16_VALUE( -51.50) }, + { SIMDE_BFLOAT16_VALUE( -94.50), SIMDE_BFLOAT16_VALUE( -24.62), SIMDE_BFLOAT16_VALUE( 35.50), SIMDE_BFLOAT16_VALUE( -23.88) }, + INT32_C( 0), + { SIMDE_FLOAT32_C( -8289.04), SIMDE_FLOAT32_C( 8652.92), SIMDE_FLOAT32_C( 468.20), SIMDE_FLOAT32_C( 5441.97) } }, + { { SIMDE_FLOAT32_C( 736.74), SIMDE_FLOAT32_C( 176.28), SIMDE_FLOAT32_C( -637.98), SIMDE_FLOAT32_C( 399.56) }, + { SIMDE_BFLOAT16_VALUE( -36.25), SIMDE_BFLOAT16_VALUE( 21.50), SIMDE_BFLOAT16_VALUE( 18.38), SIMDE_BFLOAT16_VALUE( -89.50), + SIMDE_BFLOAT16_VALUE( 89.00), SIMDE_BFLOAT16_VALUE( -34.25), SIMDE_BFLOAT16_VALUE( 8.06), SIMDE_BFLOAT16_VALUE( -55.75) }, + { SIMDE_BFLOAT16_VALUE( 10.62), SIMDE_BFLOAT16_VALUE( 4.47), SIMDE_BFLOAT16_VALUE( -63.25), SIMDE_BFLOAT16_VALUE( 83.00) }, + INT32_C( 0), + { SIMDE_FLOAT32_C( 965.18), SIMDE_FLOAT32_C( -774.66), SIMDE_FLOAT32_C( -1001.89), SIMDE_FLOAT32_C( -192.78) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x4_t buf = simde_vld1q_f32(test_vec[i].buf); + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x4_t b = simde_vld1_bf16(test_vec[i].b); + simde_float32x4_t r; + SIMDE_CONSTIFY_4_(simde_vbfmlaltq_lane_f32, r, (HEDLEY_UNREACHABLE(), buf), test_vec[i].lane, buf, a, b); + + simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4; i++) { + simde_float32x4_t buf = simde_test_arm_neon_random_f32x4(-1000.0f, 1000.0f); + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_bfloat16x4_t b = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + int lane = simde_test_codegen_random_i8() & 3; + simde_float32x4_t r; + SIMDE_CONSTIFY_4_(simde_vbfmlaltq_lane_f32, r, (HEDLEY_UNREACHABLE(), buf), lane, buf, a, b); + + simde_test_arm_neon_write_f32x4(2, buf, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_codegen_write_i32(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_f32x4(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vbfmlaltq_laneq_f32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_float32_t buf[4]; + simde_bfloat16_t a[8]; + simde_bfloat16_t b[8]; + const int lane; + simde_float32_t r[4]; + } test_vec[] = { + { { SIMDE_FLOAT32_C( 837.38), SIMDE_FLOAT32_C( -790.75), SIMDE_FLOAT32_C( -534.23), SIMDE_FLOAT32_C( 409.47) }, + { SIMDE_BFLOAT16_VALUE( 87.50), SIMDE_BFLOAT16_VALUE( 59.25), SIMDE_BFLOAT16_VALUE( -51.00), SIMDE_BFLOAT16_VALUE( -58.25), + SIMDE_BFLOAT16_VALUE( -15.19), SIMDE_BFLOAT16_VALUE( -47.25), SIMDE_BFLOAT16_VALUE( 57.00), SIMDE_BFLOAT16_VALUE( 0.18) }, + { SIMDE_BFLOAT16_VALUE( 76.50), SIMDE_BFLOAT16_VALUE( -33.50), SIMDE_BFLOAT16_VALUE( 39.50), SIMDE_BFLOAT16_VALUE( -20.38), + SIMDE_BFLOAT16_VALUE( -18.62), SIMDE_BFLOAT16_VALUE( -16.38), SIMDE_BFLOAT16_VALUE( -53.00), SIMDE_BFLOAT16_VALUE( 44.75) }, + INT32_C( 5), + { SIMDE_FLOAT32_C( -132.84), SIMDE_FLOAT32_C( 163.09), SIMDE_FLOAT32_C( 239.49), SIMDE_FLOAT32_C( 406.53) } }, + { { SIMDE_FLOAT32_C( -671.57), SIMDE_FLOAT32_C( 84.75), SIMDE_FLOAT32_C( -721.64), SIMDE_FLOAT32_C( -987.98) }, + { SIMDE_BFLOAT16_VALUE( -22.88), SIMDE_BFLOAT16_VALUE( -99.50), SIMDE_BFLOAT16_VALUE( -58.50), SIMDE_BFLOAT16_VALUE( 91.00), + SIMDE_BFLOAT16_VALUE( 54.75), SIMDE_BFLOAT16_VALUE( -93.50), SIMDE_BFLOAT16_VALUE( 74.50), SIMDE_BFLOAT16_VALUE( 75.50) }, + { SIMDE_BFLOAT16_VALUE( -47.00), SIMDE_BFLOAT16_VALUE( 15.44), SIMDE_BFLOAT16_VALUE( 63.00), SIMDE_BFLOAT16_VALUE( -88.00), + SIMDE_BFLOAT16_VALUE( 64.50), SIMDE_BFLOAT16_VALUE( -95.50), SIMDE_BFLOAT16_VALUE( -2.95), SIMDE_BFLOAT16_VALUE( -83.00) }, + INT32_C( 1), + { SIMDE_FLOAT32_C( -2207.60), SIMDE_FLOAT32_C( 1489.56), SIMDE_FLOAT32_C( -2165.05), SIMDE_FLOAT32_C( 177.55) } }, + { { SIMDE_FLOAT32_C( 972.25), SIMDE_FLOAT32_C( 937.14), SIMDE_FLOAT32_C( -719.41), SIMDE_FLOAT32_C( 367.83) }, + { SIMDE_BFLOAT16_VALUE( -26.62), SIMDE_BFLOAT16_VALUE( 9.44), SIMDE_BFLOAT16_VALUE( -79.50), SIMDE_BFLOAT16_VALUE( 20.25), + SIMDE_BFLOAT16_VALUE( -46.00), SIMDE_BFLOAT16_VALUE( -93.50), SIMDE_BFLOAT16_VALUE( 53.25), SIMDE_BFLOAT16_VALUE( 62.50) }, + { SIMDE_BFLOAT16_VALUE( -65.50), SIMDE_BFLOAT16_VALUE( 54.25), SIMDE_BFLOAT16_VALUE( -60.50), SIMDE_BFLOAT16_VALUE( -65.00), + SIMDE_BFLOAT16_VALUE( 96.00), SIMDE_BFLOAT16_VALUE( -69.50), SIMDE_BFLOAT16_VALUE( 89.50), SIMDE_BFLOAT16_VALUE( -97.50) }, + INT32_C( 1), + { SIMDE_FLOAT32_C( 1484.23), SIMDE_FLOAT32_C( 2035.70), SIMDE_FLOAT32_C( -5791.79), SIMDE_FLOAT32_C( 3758.46) } }, + { { SIMDE_FLOAT32_C( 653.81), SIMDE_FLOAT32_C( -446.32), SIMDE_FLOAT32_C( 203.78), SIMDE_FLOAT32_C( 283.36) }, + { SIMDE_BFLOAT16_VALUE( -32.50), SIMDE_BFLOAT16_VALUE( -15.25), SIMDE_BFLOAT16_VALUE( 33.00), SIMDE_BFLOAT16_VALUE( 64.50), + SIMDE_BFLOAT16_VALUE( 1.90), SIMDE_BFLOAT16_VALUE( -5.31), SIMDE_BFLOAT16_VALUE( 61.75), SIMDE_BFLOAT16_VALUE( -4.38) }, + { SIMDE_BFLOAT16_VALUE( 22.75), SIMDE_BFLOAT16_VALUE( -1.35), SIMDE_BFLOAT16_VALUE( 69.00), SIMDE_BFLOAT16_VALUE( -68.00), + SIMDE_BFLOAT16_VALUE( 19.00), SIMDE_BFLOAT16_VALUE( -10.69), SIMDE_BFLOAT16_VALUE( -13.75), SIMDE_BFLOAT16_VALUE( 25.62) }, + INT32_C( 7), + { SIMDE_FLOAT32_C( 263.03), SIMDE_FLOAT32_C( 1206.49), SIMDE_FLOAT32_C( 67.65), SIMDE_FLOAT32_C( 171.25) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x4_t buf = simde_vld1q_f32(test_vec[i].buf); + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_t b = simde_vld1q_bf16(test_vec[i].b); + simde_float32x4_t r; + SIMDE_CONSTIFY_8_(simde_vbfmlaltq_laneq_f32, r, (HEDLEY_UNREACHABLE(), buf), test_vec[i].lane, buf, a, b); + + simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4; i++) { + simde_float32x4_t buf = simde_test_arm_neon_random_f32x4(-1000.0f, 1000.0f); + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_bfloat16x8_t b = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + int lane = simde_test_codegen_random_i8() & 7; + simde_float32x4_t r; + SIMDE_CONSTIFY_8_(simde_vbfmlaltq_laneq_f32, r, (HEDLEY_UNREACHABLE(), buf), lane, buf, a, b); + + simde_test_arm_neon_write_f32x4(2, buf, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_codegen_write_i32(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_f32x4(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vfmlal_low_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vfmlal_high_f16) @@ -1074,6 +1480,12 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vfmlalq_lane_high_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vfmlalq_laneq_low_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vfmlalq_laneq_high_f16) +SIMDE_TEST_FUNC_LIST_ENTRY(vbfmlalbq_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vbfmlaltq_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vbfmlalbq_lane_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vbfmlalbq_laneq_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vbfmlaltq_lane_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vbfmlaltq_laneq_f32) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/get_high.c b/test/arm/neon/get_high.c index 50098f89e..5212935b3 100644 --- a/test/arm/neon/get_high.c +++ b/test/arm/neon/get_high.c @@ -694,6 +694,61 @@ test_simde_vget_high_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vget_high_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16 a[8]; + simde_bfloat16 r[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 93.50), SIMDE_BFLOAT16_VALUE( -34.75), SIMDE_BFLOAT16_VALUE( -13.19), SIMDE_BFLOAT16_VALUE( 37.75), + SIMDE_BFLOAT16_VALUE( -19.38), SIMDE_BFLOAT16_VALUE( 80.00), SIMDE_BFLOAT16_VALUE( 3.44), SIMDE_BFLOAT16_VALUE( -84.00) }, + { SIMDE_BFLOAT16_VALUE( -19.38), SIMDE_BFLOAT16_VALUE( 80.00), SIMDE_BFLOAT16_VALUE( 3.44), SIMDE_BFLOAT16_VALUE( -84.00) } }, + { { SIMDE_BFLOAT16_VALUE( 33.00), SIMDE_BFLOAT16_VALUE( -30.38), SIMDE_BFLOAT16_VALUE( 82.50), SIMDE_BFLOAT16_VALUE( 53.50), + SIMDE_BFLOAT16_VALUE( 70.00), SIMDE_BFLOAT16_VALUE( 55.00), SIMDE_BFLOAT16_VALUE( 46.25), SIMDE_BFLOAT16_VALUE( 2.16) }, + { SIMDE_BFLOAT16_VALUE( 70.00), SIMDE_BFLOAT16_VALUE( 55.00), SIMDE_BFLOAT16_VALUE( 46.25), SIMDE_BFLOAT16_VALUE( 2.16) } }, + { { SIMDE_BFLOAT16_VALUE( 97.00), SIMDE_BFLOAT16_VALUE( 54.00), SIMDE_BFLOAT16_VALUE( -65.50), SIMDE_BFLOAT16_VALUE( -11.38), + SIMDE_BFLOAT16_VALUE( 99.00), SIMDE_BFLOAT16_VALUE( 6.31), SIMDE_BFLOAT16_VALUE( -54.75), SIMDE_BFLOAT16_VALUE( -75.50) }, + { SIMDE_BFLOAT16_VALUE( 99.00), SIMDE_BFLOAT16_VALUE( 6.31), SIMDE_BFLOAT16_VALUE( -54.75), SIMDE_BFLOAT16_VALUE( -75.50) } }, + { { SIMDE_BFLOAT16_VALUE( 19.25), SIMDE_BFLOAT16_VALUE( 24.00), SIMDE_BFLOAT16_VALUE( -76.50), SIMDE_BFLOAT16_VALUE( 1.22), + SIMDE_BFLOAT16_VALUE( 64.50), SIMDE_BFLOAT16_VALUE( 35.75), SIMDE_BFLOAT16_VALUE( 6.47), SIMDE_BFLOAT16_VALUE( 58.00) }, + { SIMDE_BFLOAT16_VALUE( 64.50), SIMDE_BFLOAT16_VALUE( 35.75), SIMDE_BFLOAT16_VALUE( 6.47), SIMDE_BFLOAT16_VALUE( 58.00) } }, + { { SIMDE_BFLOAT16_VALUE( -99.00), SIMDE_BFLOAT16_VALUE( 93.50), SIMDE_BFLOAT16_VALUE( -4.28), SIMDE_BFLOAT16_VALUE( -18.38), + SIMDE_BFLOAT16_VALUE( 73.50), SIMDE_BFLOAT16_VALUE( 99.00), SIMDE_BFLOAT16_VALUE( -2.41), SIMDE_BFLOAT16_VALUE( 6.38) }, + { SIMDE_BFLOAT16_VALUE( 73.50), SIMDE_BFLOAT16_VALUE( 99.00), SIMDE_BFLOAT16_VALUE( -2.41), SIMDE_BFLOAT16_VALUE( 6.38) } }, + { { SIMDE_BFLOAT16_VALUE( -31.12), SIMDE_BFLOAT16_VALUE( -19.75), SIMDE_BFLOAT16_VALUE( -40.00), SIMDE_BFLOAT16_VALUE( -61.25), + SIMDE_BFLOAT16_VALUE( -64.50), SIMDE_BFLOAT16_VALUE( -93.50), SIMDE_BFLOAT16_VALUE( 41.00), SIMDE_BFLOAT16_VALUE( -68.00) }, + { SIMDE_BFLOAT16_VALUE( -64.50), SIMDE_BFLOAT16_VALUE( -93.50), SIMDE_BFLOAT16_VALUE( 41.00), SIMDE_BFLOAT16_VALUE( -68.00) } }, + { { SIMDE_BFLOAT16_VALUE( 60.25), SIMDE_BFLOAT16_VALUE( 75.50), SIMDE_BFLOAT16_VALUE( 20.75), SIMDE_BFLOAT16_VALUE( 59.25), + SIMDE_BFLOAT16_VALUE( -18.38), SIMDE_BFLOAT16_VALUE( 66.00), SIMDE_BFLOAT16_VALUE( 84.00), SIMDE_BFLOAT16_VALUE( -99.00) }, + { SIMDE_BFLOAT16_VALUE( -18.38), SIMDE_BFLOAT16_VALUE( 66.00), SIMDE_BFLOAT16_VALUE( 84.00), SIMDE_BFLOAT16_VALUE( -99.00) } }, + { { SIMDE_BFLOAT16_VALUE( -10.06), SIMDE_BFLOAT16_VALUE( -93.00), SIMDE_BFLOAT16_VALUE( 2.06), SIMDE_BFLOAT16_VALUE( -45.50), + SIMDE_BFLOAT16_VALUE( 42.75), SIMDE_BFLOAT16_VALUE( -91.50), SIMDE_BFLOAT16_VALUE( -87.50), SIMDE_BFLOAT16_VALUE( 43.75) }, + { SIMDE_BFLOAT16_VALUE( 42.75), SIMDE_BFLOAT16_VALUE( -91.50), SIMDE_BFLOAT16_VALUE( -87.50), SIMDE_BFLOAT16_VALUE( 43.75) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x4_t r = simde_vget_high_bf16(a); + + simde_test_arm_neon_assert_equal_bf16x4(r, simde_vld1_bf16(test_vec[i].r), 1); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_bfloat16x4_t r = simde_vget_high_bf16(a); + + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x4(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vget_high_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vget_high_f32) @@ -709,6 +764,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vget_high_u64) SIMDE_TEST_FUNC_LIST_ENTRY(vget_high_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vget_high_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vget_high_p64) +SIMDE_TEST_FUNC_LIST_ENTRY(vget_high_bf16) SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/get_lane.c b/test/arm/neon/get_lane.c index ac9f9bacf..c02f08856 100644 --- a/test/arm/neon/get_lane.c +++ b/test/arm/neon/get_lane.c @@ -1282,6 +1282,108 @@ test_simde_vgetq_lane_p64 (SIMDE_MUNIT_TEST_ARGS) { return 0; } +static int +test_simde_vget_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16 a[4]; + int b; + simde_bfloat16 r; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 70.00), SIMDE_BFLOAT16_VALUE( 90.50), SIMDE_BFLOAT16_VALUE( 51.50), SIMDE_BFLOAT16_VALUE( -79.50) }, + INT32_C( 1), + SIMDE_BFLOAT16_VALUE( 90.50) }, + { { SIMDE_BFLOAT16_VALUE( -23.88), SIMDE_BFLOAT16_VALUE( -43.50), SIMDE_BFLOAT16_VALUE( 61.50), SIMDE_BFLOAT16_VALUE( 35.25) }, + INT32_C( 2), + SIMDE_BFLOAT16_VALUE( 61.50) }, + { { SIMDE_BFLOAT16_VALUE( -91.00), SIMDE_BFLOAT16_VALUE( -59.75), SIMDE_BFLOAT16_VALUE( 91.50), SIMDE_BFLOAT16_VALUE( 54.25) }, + INT32_C( 3), + SIMDE_BFLOAT16_VALUE( 54.25) }, + { { SIMDE_BFLOAT16_VALUE( -56.50), SIMDE_BFLOAT16_VALUE( 40.50), SIMDE_BFLOAT16_VALUE( -32.50), SIMDE_BFLOAT16_VALUE( -29.88) }, + INT32_C( 3), + SIMDE_BFLOAT16_VALUE( -29.88) }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + + simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a); + int b = test_vec[i].b; + simde_bfloat16 r; + SIMDE_CONSTIFY_4_(simde_vget_lane_bf16, r, (HEDLEY_UNREACHABLE(), SIMDE_BFLOAT16_VALUE(0.0)), b, a); + + simde_assert_equal_bf16(r, test_vec[i].r, 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + int lane = simde_test_codegen_random_i8() & 3; + simde_bfloat16_t r; + SIMDE_CONSTIFY_4_(simde_vget_lane_bf16, r, (HEDLEY_UNREACHABLE(), SIMDE_BFLOAT16_VALUE(-100.0)), lane, a); + + simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_codegen_write_i32(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_codegen_write_bf16(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vgetq_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16 a[8]; + int b; + simde_bfloat16 r; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( -7.41), SIMDE_BFLOAT16_VALUE( 29.62), SIMDE_BFLOAT16_VALUE( -78.50), SIMDE_BFLOAT16_VALUE( 93.00), + SIMDE_BFLOAT16_VALUE( -23.62), SIMDE_BFLOAT16_VALUE( -42.00), SIMDE_BFLOAT16_VALUE( 16.62), SIMDE_BFLOAT16_VALUE( 54.75) }, + INT32_C( 5), + SIMDE_BFLOAT16_VALUE( -42.00) }, + { { SIMDE_BFLOAT16_VALUE( -74.00), SIMDE_BFLOAT16_VALUE( 82.00), SIMDE_BFLOAT16_VALUE( 20.62), SIMDE_BFLOAT16_VALUE( -37.25), + SIMDE_BFLOAT16_VALUE( 84.00), SIMDE_BFLOAT16_VALUE( 38.25), SIMDE_BFLOAT16_VALUE( 74.00), SIMDE_BFLOAT16_VALUE( -99.00) }, + INT32_C( 2), + SIMDE_BFLOAT16_VALUE( 20.62) }, + { { SIMDE_BFLOAT16_VALUE( -33.00), SIMDE_BFLOAT16_VALUE( 85.00), SIMDE_BFLOAT16_VALUE( -66.00), SIMDE_BFLOAT16_VALUE( -94.50), + SIMDE_BFLOAT16_VALUE( -63.00), SIMDE_BFLOAT16_VALUE( -86.00), SIMDE_BFLOAT16_VALUE( -22.25), SIMDE_BFLOAT16_VALUE( 19.62) }, + INT32_C( 4), + SIMDE_BFLOAT16_VALUE( -63.00) }, + { { SIMDE_BFLOAT16_VALUE( 46.00), SIMDE_BFLOAT16_VALUE( 82.00), SIMDE_BFLOAT16_VALUE( 51.25), SIMDE_BFLOAT16_VALUE( 47.50), + SIMDE_BFLOAT16_VALUE( -25.38), SIMDE_BFLOAT16_VALUE( -19.12), SIMDE_BFLOAT16_VALUE( 68.50), SIMDE_BFLOAT16_VALUE( -32.50) }, + INT32_C( 0), + SIMDE_BFLOAT16_VALUE( 46.00) }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + int b = test_vec[i].b; + simde_bfloat16 r; + SIMDE_CONSTIFY_8_(simde_vgetq_lane_bf16, r, (HEDLEY_UNREACHABLE(), SIMDE_BFLOAT16_VALUE(0.0)), b, a); + + simde_assert_equal_bf16(r, test_vec[i].r, 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + int lane = simde_test_codegen_random_i8() & 7; + simde_bfloat16_t r; + SIMDE_CONSTIFY_8_(simde_vgetq_lane_bf16, r, (HEDLEY_UNREACHABLE(), SIMDE_BFLOAT16_VALUE(-100.0)), lane, a); + + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_codegen_write_i32(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_codegen_write_bf16(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + HEDLEY_DIAGNOSTIC_POP SIMDE_TEST_FUNC_LIST_BEGIN @@ -1315,6 +1417,9 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vget_lane_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vgetq_lane_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vgetq_lane_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vgetq_lane_p64) + +SIMDE_TEST_FUNC_LIST_ENTRY(vget_lane_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vgetq_lane_bf16) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/get_low.c b/test/arm/neon/get_low.c index 9460ed922..ba5b3e59d 100644 --- a/test/arm/neon/get_low.c +++ b/test/arm/neon/get_low.c @@ -694,6 +694,61 @@ test_simde_vget_low_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vget_low_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16 a[8]; + simde_bfloat16 r[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( -42.50), SIMDE_BFLOAT16_VALUE( -76.00), SIMDE_BFLOAT16_VALUE( -11.38), SIMDE_BFLOAT16_VALUE( -30.00), + SIMDE_BFLOAT16_VALUE( 12.50), SIMDE_BFLOAT16_VALUE( 68.00), SIMDE_BFLOAT16_VALUE( -68.50), SIMDE_BFLOAT16_VALUE( 31.75) }, + { SIMDE_BFLOAT16_VALUE( -42.50), SIMDE_BFLOAT16_VALUE( -76.00), SIMDE_BFLOAT16_VALUE( -11.38), SIMDE_BFLOAT16_VALUE( -30.00) } }, + { { SIMDE_BFLOAT16_VALUE( 88.50), SIMDE_BFLOAT16_VALUE( 3.77), SIMDE_BFLOAT16_VALUE( 25.88), SIMDE_BFLOAT16_VALUE( 51.75), + SIMDE_BFLOAT16_VALUE( -70.50), SIMDE_BFLOAT16_VALUE( 87.50), SIMDE_BFLOAT16_VALUE( 58.00), SIMDE_BFLOAT16_VALUE( -65.50) }, + { SIMDE_BFLOAT16_VALUE( 88.50), SIMDE_BFLOAT16_VALUE( 3.77), SIMDE_BFLOAT16_VALUE( 25.88), SIMDE_BFLOAT16_VALUE( 51.75) } }, + { { SIMDE_BFLOAT16_VALUE( -16.38), SIMDE_BFLOAT16_VALUE( 75.00), SIMDE_BFLOAT16_VALUE( 8.06), SIMDE_BFLOAT16_VALUE( -43.50), + SIMDE_BFLOAT16_VALUE( 44.75), SIMDE_BFLOAT16_VALUE( 66.00), SIMDE_BFLOAT16_VALUE( -18.62), SIMDE_BFLOAT16_VALUE( -34.00) }, + { SIMDE_BFLOAT16_VALUE( -16.38), SIMDE_BFLOAT16_VALUE( 75.00), SIMDE_BFLOAT16_VALUE( 8.06), SIMDE_BFLOAT16_VALUE( -43.50) } }, + { { SIMDE_BFLOAT16_VALUE( 39.75), SIMDE_BFLOAT16_VALUE( 99.50), SIMDE_BFLOAT16_VALUE( 25.25), SIMDE_BFLOAT16_VALUE( -74.00), + SIMDE_BFLOAT16_VALUE( 42.25), SIMDE_BFLOAT16_VALUE( 73.50), SIMDE_BFLOAT16_VALUE( -92.50), SIMDE_BFLOAT16_VALUE( 99.50) }, + { SIMDE_BFLOAT16_VALUE( 39.75), SIMDE_BFLOAT16_VALUE( 99.50), SIMDE_BFLOAT16_VALUE( 25.25), SIMDE_BFLOAT16_VALUE( -74.00) } }, + { { SIMDE_BFLOAT16_VALUE( 97.50), SIMDE_BFLOAT16_VALUE( -3.91), SIMDE_BFLOAT16_VALUE( -30.38), SIMDE_BFLOAT16_VALUE( 10.00), + SIMDE_BFLOAT16_VALUE( -35.75), SIMDE_BFLOAT16_VALUE( 1.14), SIMDE_BFLOAT16_VALUE( -58.25), SIMDE_BFLOAT16_VALUE( -47.25) }, + { SIMDE_BFLOAT16_VALUE( 97.50), SIMDE_BFLOAT16_VALUE( -3.91), SIMDE_BFLOAT16_VALUE( -30.38), SIMDE_BFLOAT16_VALUE( 10.00) } }, + { { SIMDE_BFLOAT16_VALUE( -95.00), SIMDE_BFLOAT16_VALUE( 67.50), SIMDE_BFLOAT16_VALUE( -95.50), SIMDE_BFLOAT16_VALUE( -66.00), + SIMDE_BFLOAT16_VALUE( 55.00), SIMDE_BFLOAT16_VALUE( 62.50), SIMDE_BFLOAT16_VALUE( -31.12), SIMDE_BFLOAT16_VALUE( -61.50) }, + { SIMDE_BFLOAT16_VALUE( -95.00), SIMDE_BFLOAT16_VALUE( 67.50), SIMDE_BFLOAT16_VALUE( -95.50), SIMDE_BFLOAT16_VALUE( -66.00) } }, + { { SIMDE_BFLOAT16_VALUE( 37.25), SIMDE_BFLOAT16_VALUE( 77.00), SIMDE_BFLOAT16_VALUE( -4.97), SIMDE_BFLOAT16_VALUE( -18.00), + SIMDE_BFLOAT16_VALUE( 43.00), SIMDE_BFLOAT16_VALUE( 76.50), SIMDE_BFLOAT16_VALUE( 48.00), SIMDE_BFLOAT16_VALUE( -17.25) }, + { SIMDE_BFLOAT16_VALUE( 37.25), SIMDE_BFLOAT16_VALUE( 77.00), SIMDE_BFLOAT16_VALUE( -4.97), SIMDE_BFLOAT16_VALUE( -18.00) } }, + { { SIMDE_BFLOAT16_VALUE( 76.00), SIMDE_BFLOAT16_VALUE( -26.62), SIMDE_BFLOAT16_VALUE( 8.50), SIMDE_BFLOAT16_VALUE( 18.38), + SIMDE_BFLOAT16_VALUE( -53.25), SIMDE_BFLOAT16_VALUE( 15.94), SIMDE_BFLOAT16_VALUE( 18.00), SIMDE_BFLOAT16_VALUE( -55.75) }, + { SIMDE_BFLOAT16_VALUE( 76.00), SIMDE_BFLOAT16_VALUE( -26.62), SIMDE_BFLOAT16_VALUE( 8.50), SIMDE_BFLOAT16_VALUE( 18.38) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x4_t r = simde_vget_low_bf16(a); + + simde_test_arm_neon_assert_equal_bf16x4(r, simde_vld1_bf16(test_vec[i].r), 1); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_bfloat16x4_t r = simde_vget_low_bf16(a); + + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x4(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vget_low_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vget_low_f32) @@ -709,6 +764,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vget_low_u64) SIMDE_TEST_FUNC_LIST_ENTRY(vget_low_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vget_low_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vget_low_p64) +SIMDE_TEST_FUNC_LIST_ENTRY(vget_low_bf16) SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/ld1_dup.c b/test/arm/neon/ld1_dup.c index 1e30dc2fb..2611abad2 100644 --- a/test/arm/neon/ld1_dup.c +++ b/test/arm/neon/ld1_dup.c @@ -1645,6 +1645,92 @@ test_simde_vld1q_dup_p64 (SIMDE_MUNIT_TEST_ARGS) { return 1; #endif } + +static int +test_simde_vld1_dup_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t a; + simde_bfloat16_t unused; + simde_bfloat16_t r[4]; + } test_vec[] = { + { SIMDE_BFLOAT16_VALUE(4.04), + SIMDE_BFLOAT16_VALUE(4.51), + { SIMDE_BFLOAT16_VALUE(4.04), SIMDE_BFLOAT16_VALUE(4.04), SIMDE_BFLOAT16_VALUE(4.04), SIMDE_BFLOAT16_VALUE(4.04) } }, + { SIMDE_BFLOAT16_VALUE(-0.29), + SIMDE_BFLOAT16_VALUE(8.79), + { SIMDE_BFLOAT16_VALUE(-0.29), SIMDE_BFLOAT16_VALUE(-0.29), SIMDE_BFLOAT16_VALUE(-0.29), SIMDE_BFLOAT16_VALUE(-0.29) } }, + { SIMDE_BFLOAT16_VALUE(-1.66), + SIMDE_BFLOAT16_VALUE(-8.54), + { SIMDE_BFLOAT16_VALUE(-1.66), SIMDE_BFLOAT16_VALUE(-1.66), SIMDE_BFLOAT16_VALUE(-1.66), SIMDE_BFLOAT16_VALUE(-1.66) } }, + { SIMDE_BFLOAT16_VALUE(-7.87), + SIMDE_BFLOAT16_VALUE(2.04), + { SIMDE_BFLOAT16_VALUE(-7.87), SIMDE_BFLOAT16_VALUE(-7.87), SIMDE_BFLOAT16_VALUE(-7.87), SIMDE_BFLOAT16_VALUE(-7.87) } }, + { SIMDE_BFLOAT16_VALUE(2.65), + SIMDE_BFLOAT16_VALUE(-7.48), + { SIMDE_BFLOAT16_VALUE(2.65), SIMDE_BFLOAT16_VALUE(2.65), SIMDE_BFLOAT16_VALUE(2.65), SIMDE_BFLOAT16_VALUE(2.65) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t r = simde_vld1_dup_bf16(&test_vec[i].a); + + simde_test_arm_neon_assert_equal_bf16x4(r, simde_vld1_bf16(test_vec[i].r), + INT_MAX); + } + + return 0; +} + +static int +test_simde_vld1q_dup_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t a; + simde_bfloat16_t unused; + simde_bfloat16_t r[8]; + } test_vec[] = { + { SIMDE_BFLOAT16_VALUE( -275.48), + SIMDE_BFLOAT16_VALUE( 563.30), + { SIMDE_BFLOAT16_VALUE( -275.48), SIMDE_BFLOAT16_VALUE( -275.48), SIMDE_BFLOAT16_VALUE( -275.48), SIMDE_BFLOAT16_VALUE( -275.48), + SIMDE_BFLOAT16_VALUE( -275.48), SIMDE_BFLOAT16_VALUE( -275.48), SIMDE_BFLOAT16_VALUE( -275.48), SIMDE_BFLOAT16_VALUE( -275.48) } }, + { SIMDE_BFLOAT16_VALUE( -478.65), + SIMDE_BFLOAT16_VALUE( 688.84), + { SIMDE_BFLOAT16_VALUE( -478.65), SIMDE_BFLOAT16_VALUE( -478.65), SIMDE_BFLOAT16_VALUE( -478.65), SIMDE_BFLOAT16_VALUE( -478.65), + SIMDE_BFLOAT16_VALUE( -478.65), SIMDE_BFLOAT16_VALUE( -478.65), SIMDE_BFLOAT16_VALUE( -478.65), SIMDE_BFLOAT16_VALUE( -478.65) } }, + { SIMDE_BFLOAT16_VALUE( 810.78), + SIMDE_BFLOAT16_VALUE( -456.08), + { SIMDE_BFLOAT16_VALUE( 810.78), SIMDE_BFLOAT16_VALUE( 810.78), SIMDE_BFLOAT16_VALUE( 810.78), SIMDE_BFLOAT16_VALUE( 810.78), + SIMDE_BFLOAT16_VALUE( 810.78), SIMDE_BFLOAT16_VALUE( 810.78), SIMDE_BFLOAT16_VALUE( 810.78), SIMDE_BFLOAT16_VALUE( 810.78) } }, + { SIMDE_BFLOAT16_VALUE( -139.83), + SIMDE_BFLOAT16_VALUE( -302.96), + { SIMDE_BFLOAT16_VALUE( -139.83), SIMDE_BFLOAT16_VALUE( -139.83), SIMDE_BFLOAT16_VALUE( -139.83), SIMDE_BFLOAT16_VALUE( -139.83), + SIMDE_BFLOAT16_VALUE( -139.83), SIMDE_BFLOAT16_VALUE( -139.83), SIMDE_BFLOAT16_VALUE( -139.83), SIMDE_BFLOAT16_VALUE( -139.83) } }, + { SIMDE_BFLOAT16_VALUE( 16.91), + SIMDE_BFLOAT16_VALUE( -128.20), + { SIMDE_BFLOAT16_VALUE( 16.91), SIMDE_BFLOAT16_VALUE( 16.91), SIMDE_BFLOAT16_VALUE( 16.91), SIMDE_BFLOAT16_VALUE( 16.91), + SIMDE_BFLOAT16_VALUE( 16.91), SIMDE_BFLOAT16_VALUE( 16.91), SIMDE_BFLOAT16_VALUE( 16.91), SIMDE_BFLOAT16_VALUE( 16.91) } }, + { SIMDE_BFLOAT16_VALUE( 315.19), + SIMDE_BFLOAT16_VALUE( -659.25), + { SIMDE_BFLOAT16_VALUE( 315.19), SIMDE_BFLOAT16_VALUE( 315.19), SIMDE_BFLOAT16_VALUE( 315.19), SIMDE_BFLOAT16_VALUE( 315.19), + SIMDE_BFLOAT16_VALUE( 315.19), SIMDE_BFLOAT16_VALUE( 315.19), SIMDE_BFLOAT16_VALUE( 315.19), SIMDE_BFLOAT16_VALUE( 315.19) } }, + { SIMDE_BFLOAT16_VALUE( -303.00), + SIMDE_BFLOAT16_VALUE( -865.13), + { SIMDE_BFLOAT16_VALUE( -303.00), SIMDE_BFLOAT16_VALUE( -303.00), SIMDE_BFLOAT16_VALUE( -303.00), SIMDE_BFLOAT16_VALUE( -303.00), + SIMDE_BFLOAT16_VALUE( -303.00), SIMDE_BFLOAT16_VALUE( -303.00), SIMDE_BFLOAT16_VALUE( -303.00), SIMDE_BFLOAT16_VALUE( -303.00) } }, + { SIMDE_BFLOAT16_VALUE( 391.93), + SIMDE_BFLOAT16_VALUE( -958.40), + { SIMDE_BFLOAT16_VALUE( 391.93), SIMDE_BFLOAT16_VALUE( 391.93), SIMDE_BFLOAT16_VALUE( 391.93), SIMDE_BFLOAT16_VALUE( 391.93), + SIMDE_BFLOAT16_VALUE( 391.93), SIMDE_BFLOAT16_VALUE( 391.93), SIMDE_BFLOAT16_VALUE( 391.93), SIMDE_BFLOAT16_VALUE( 391.93) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t r = simde_vld1q_dup_bf16(&test_vec[i].a); + + simde_test_arm_neon_assert_equal_bf16x8(r, simde_vld1q_bf16(test_vec[i].r), + INT_MAX); + } + + return 0; +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -1678,6 +1764,9 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vld1_dup_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_dup_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_dup_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_dup_p64) + +SIMDE_TEST_FUNC_LIST_ENTRY(vld1_dup_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_dup_bf16) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/ld1_lane.c b/test/arm/neon/ld1_lane.c index 61face867..794dcf81a 100644 --- a/test/arm/neon/ld1_lane.c +++ b/test/arm/neon/ld1_lane.c @@ -1627,6 +1627,104 @@ test_simde_vld1q_lane_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vld1_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t src[4]; + simde_bfloat16_t buf; + simde_bfloat16_t r[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(-6.89), SIMDE_BFLOAT16_VALUE(-8.34), SIMDE_BFLOAT16_VALUE(1.02), SIMDE_BFLOAT16_VALUE(-3.31) }, + SIMDE_BFLOAT16_VALUE(-8.93), + { SIMDE_BFLOAT16_VALUE(-8.93), SIMDE_BFLOAT16_VALUE(-8.34), SIMDE_BFLOAT16_VALUE(1.02), SIMDE_BFLOAT16_VALUE(-3.31) } }, + { { SIMDE_BFLOAT16_VALUE(8.46), SIMDE_BFLOAT16_VALUE(9.18), SIMDE_BFLOAT16_VALUE(-5.63), SIMDE_BFLOAT16_VALUE(-7.46) }, + SIMDE_BFLOAT16_VALUE(4.92), + { SIMDE_BFLOAT16_VALUE(8.46), SIMDE_BFLOAT16_VALUE(4.92), SIMDE_BFLOAT16_VALUE(-5.63), SIMDE_BFLOAT16_VALUE(-7.46) } }, + { { SIMDE_BFLOAT16_VALUE(4.00), SIMDE_BFLOAT16_VALUE(-5.13), SIMDE_BFLOAT16_VALUE(7.28), SIMDE_BFLOAT16_VALUE(4.93) }, + SIMDE_BFLOAT16_VALUE(2.30), + { SIMDE_BFLOAT16_VALUE(4.00), SIMDE_BFLOAT16_VALUE(-5.13), SIMDE_BFLOAT16_VALUE(2.30), SIMDE_BFLOAT16_VALUE(4.93) } }, + { { SIMDE_BFLOAT16_VALUE(-1.08), SIMDE_BFLOAT16_VALUE(-0.44), SIMDE_BFLOAT16_VALUE(9.35), SIMDE_BFLOAT16_VALUE(7.72) }, + SIMDE_BFLOAT16_VALUE(6.05), + { SIMDE_BFLOAT16_VALUE(-1.08), SIMDE_BFLOAT16_VALUE(-0.44), SIMDE_BFLOAT16_VALUE(9.35), SIMDE_BFLOAT16_VALUE(6.05) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t r, src, expected; + src = simde_vld1_bf16(test_vec[i].src); + + SIMDE_CONSTIFY_4_(simde_vld1_lane_bf16, r, (HEDLEY_UNREACHABLE(), r), i, &test_vec[i].buf, src); + + expected = simde_vld1_bf16(test_vec[i].r); + + simde_test_arm_neon_assert_equal_bf16x4(r, expected, 1); + } + + return 0; +} + +static int +test_simde_vld1q_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t src[8]; + simde_bfloat16_t buf; + simde_bfloat16_t r[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(-7.05), SIMDE_BFLOAT16_VALUE(6.67), SIMDE_BFLOAT16_VALUE(6.59), SIMDE_BFLOAT16_VALUE(3.75), + SIMDE_BFLOAT16_VALUE(-9.33), SIMDE_BFLOAT16_VALUE(3.01), SIMDE_BFLOAT16_VALUE(-8.25), SIMDE_BFLOAT16_VALUE(0.24) }, + SIMDE_BFLOAT16_VALUE(-6.92), + { SIMDE_BFLOAT16_VALUE(-6.92), SIMDE_BFLOAT16_VALUE(6.67), SIMDE_BFLOAT16_VALUE(6.59), SIMDE_BFLOAT16_VALUE(3.75), + SIMDE_BFLOAT16_VALUE(-9.33), SIMDE_BFLOAT16_VALUE(3.01), SIMDE_BFLOAT16_VALUE(-8.25), SIMDE_BFLOAT16_VALUE(0.24) } }, + { { SIMDE_BFLOAT16_VALUE(0.08), SIMDE_BFLOAT16_VALUE(-9.60), SIMDE_BFLOAT16_VALUE(1.90), SIMDE_BFLOAT16_VALUE(9.42), + SIMDE_BFLOAT16_VALUE(-7.19), SIMDE_BFLOAT16_VALUE(9.43), SIMDE_BFLOAT16_VALUE(9.22), SIMDE_BFLOAT16_VALUE(-8.41) }, + SIMDE_BFLOAT16_VALUE(8.22), + { SIMDE_BFLOAT16_VALUE(0.08), SIMDE_BFLOAT16_VALUE(8.22), SIMDE_BFLOAT16_VALUE(1.90), SIMDE_BFLOAT16_VALUE(9.42), + SIMDE_BFLOAT16_VALUE(-7.19), SIMDE_BFLOAT16_VALUE(9.43), SIMDE_BFLOAT16_VALUE(9.22), SIMDE_BFLOAT16_VALUE(-8.41) } }, + { { SIMDE_BFLOAT16_VALUE(8.85), SIMDE_BFLOAT16_VALUE(0.77), SIMDE_BFLOAT16_VALUE(5.98), SIMDE_BFLOAT16_VALUE(-6.67), + SIMDE_BFLOAT16_VALUE(-9.86), SIMDE_BFLOAT16_VALUE(-7.30), SIMDE_BFLOAT16_VALUE(-7.33), SIMDE_BFLOAT16_VALUE(-9.11) }, + SIMDE_BFLOAT16_VALUE(7.84), + { SIMDE_BFLOAT16_VALUE(8.85), SIMDE_BFLOAT16_VALUE(0.77), SIMDE_BFLOAT16_VALUE(7.84), SIMDE_BFLOAT16_VALUE(-6.67), + SIMDE_BFLOAT16_VALUE(-9.86), SIMDE_BFLOAT16_VALUE(-7.30), SIMDE_BFLOAT16_VALUE(-7.33), SIMDE_BFLOAT16_VALUE(-9.11) } }, + { { SIMDE_BFLOAT16_VALUE(0.48), SIMDE_BFLOAT16_VALUE(-7.75), SIMDE_BFLOAT16_VALUE(5.24), SIMDE_BFLOAT16_VALUE(0.40), + SIMDE_BFLOAT16_VALUE(6.95), SIMDE_BFLOAT16_VALUE(4.84), SIMDE_BFLOAT16_VALUE(4.63), SIMDE_BFLOAT16_VALUE(-7.39) }, + SIMDE_BFLOAT16_VALUE(4.37), + { SIMDE_BFLOAT16_VALUE(0.48), SIMDE_BFLOAT16_VALUE(-7.75), SIMDE_BFLOAT16_VALUE(5.24), SIMDE_BFLOAT16_VALUE(4.37), + SIMDE_BFLOAT16_VALUE(6.95), SIMDE_BFLOAT16_VALUE(4.84), SIMDE_BFLOAT16_VALUE(4.63), SIMDE_BFLOAT16_VALUE(-7.39) } }, + { { SIMDE_BFLOAT16_VALUE(-1.01), SIMDE_BFLOAT16_VALUE(3.27), SIMDE_BFLOAT16_VALUE(6.19), SIMDE_BFLOAT16_VALUE(-8.33), + SIMDE_BFLOAT16_VALUE(-4.60), SIMDE_BFLOAT16_VALUE(-9.70), SIMDE_BFLOAT16_VALUE(5.66), SIMDE_BFLOAT16_VALUE(-0.67) }, + SIMDE_BFLOAT16_VALUE(8.73), + { SIMDE_BFLOAT16_VALUE(-1.01), SIMDE_BFLOAT16_VALUE(3.27), SIMDE_BFLOAT16_VALUE(6.19), SIMDE_BFLOAT16_VALUE(-8.33), + SIMDE_BFLOAT16_VALUE(8.73), SIMDE_BFLOAT16_VALUE(-9.70), SIMDE_BFLOAT16_VALUE(5.66), SIMDE_BFLOAT16_VALUE(-0.67) } }, + { { SIMDE_BFLOAT16_VALUE(7.81), SIMDE_BFLOAT16_VALUE(-4.30), SIMDE_BFLOAT16_VALUE(-0.94), SIMDE_BFLOAT16_VALUE(-1.26), + SIMDE_BFLOAT16_VALUE(-7.70), SIMDE_BFLOAT16_VALUE(4.04), SIMDE_BFLOAT16_VALUE(3.75), SIMDE_BFLOAT16_VALUE(8.96) }, + SIMDE_BFLOAT16_VALUE(4.12), + { SIMDE_BFLOAT16_VALUE(7.81), SIMDE_BFLOAT16_VALUE(-4.30), SIMDE_BFLOAT16_VALUE(-0.94), SIMDE_BFLOAT16_VALUE(-1.26), + SIMDE_BFLOAT16_VALUE(-7.70), SIMDE_BFLOAT16_VALUE(4.12), SIMDE_BFLOAT16_VALUE(3.75), SIMDE_BFLOAT16_VALUE(8.96) } }, + { { SIMDE_BFLOAT16_VALUE(-2.64), SIMDE_BFLOAT16_VALUE(0.23), SIMDE_BFLOAT16_VALUE(8.32), SIMDE_BFLOAT16_VALUE(4.82), + SIMDE_BFLOAT16_VALUE(0.39), SIMDE_BFLOAT16_VALUE(-9.75), SIMDE_BFLOAT16_VALUE(8.11), SIMDE_BFLOAT16_VALUE(3.33) }, + SIMDE_BFLOAT16_VALUE(-6.51), + { SIMDE_BFLOAT16_VALUE(-2.64), SIMDE_BFLOAT16_VALUE(0.23), SIMDE_BFLOAT16_VALUE(8.32), SIMDE_BFLOAT16_VALUE(4.82), + SIMDE_BFLOAT16_VALUE(0.39), SIMDE_BFLOAT16_VALUE(-9.75), SIMDE_BFLOAT16_VALUE(-6.51), SIMDE_BFLOAT16_VALUE(3.33) } }, + { { SIMDE_BFLOAT16_VALUE(-0.09), SIMDE_BFLOAT16_VALUE(-8.36), SIMDE_BFLOAT16_VALUE(1.34), SIMDE_BFLOAT16_VALUE(2.32), + SIMDE_BFLOAT16_VALUE(9.15), SIMDE_BFLOAT16_VALUE(6.52), SIMDE_BFLOAT16_VALUE(-6.82), SIMDE_BFLOAT16_VALUE(-4.18) }, + SIMDE_BFLOAT16_VALUE(6.98), + { SIMDE_BFLOAT16_VALUE(-0.09), SIMDE_BFLOAT16_VALUE(-8.36), SIMDE_BFLOAT16_VALUE(1.34), SIMDE_BFLOAT16_VALUE(2.32), + SIMDE_BFLOAT16_VALUE(9.15), SIMDE_BFLOAT16_VALUE(6.52), SIMDE_BFLOAT16_VALUE(-6.82), SIMDE_BFLOAT16_VALUE(6.98) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t r, src, expected; + src = simde_vld1q_bf16(test_vec[i].src); + + SIMDE_CONSTIFY_8_(simde_vld1q_lane_bf16, r, (HEDLEY_UNREACHABLE(), r), i, &test_vec[i].buf, src); + + expected = simde_vld1q_bf16(test_vec[i].r); + + simde_test_arm_neon_assert_equal_bf16x8(r, expected, 1); + } + + return 0; +} + SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vld1_lane_s8) SIMDE_TEST_FUNC_LIST_ENTRY(vld1_lane_s16) @@ -1657,6 +1755,8 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vld1_lane_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_lane_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_lane_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_lane_p64) +SIMDE_TEST_FUNC_LIST_ENTRY(vld1_lane_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_lane_bf16) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/ld1_x2.c b/test/arm/neon/ld1_x2.c index 6bdc3cd27..410136a0c 100644 --- a/test/arm/neon/ld1_x2.c +++ b/test/arm/neon/ld1_x2.c @@ -906,6 +906,46 @@ test_simde_vld1_p64_x2 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vld1_bf16_x2 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16 buf[8]; + simde_bfloat16 expected[2][4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(3.81), SIMDE_BFLOAT16_VALUE(-2.59), SIMDE_BFLOAT16_VALUE(-2.10), SIMDE_BFLOAT16_VALUE(-4.19), + SIMDE_BFLOAT16_VALUE(-8.46), SIMDE_BFLOAT16_VALUE(3.35), SIMDE_BFLOAT16_VALUE(-0.60), SIMDE_BFLOAT16_VALUE(-5.62) }, + { { SIMDE_BFLOAT16_VALUE(3.81), SIMDE_BFLOAT16_VALUE(-2.59), SIMDE_BFLOAT16_VALUE(-2.10), SIMDE_BFLOAT16_VALUE(-4.19) }, + { SIMDE_BFLOAT16_VALUE(-8.46), SIMDE_BFLOAT16_VALUE(3.35), SIMDE_BFLOAT16_VALUE(-0.60), SIMDE_BFLOAT16_VALUE(-5.62) } } }, + { { SIMDE_BFLOAT16_VALUE(5.29), SIMDE_BFLOAT16_VALUE(2.79), SIMDE_BFLOAT16_VALUE(-5.18), SIMDE_BFLOAT16_VALUE(-2.73), + SIMDE_BFLOAT16_VALUE(0.13), SIMDE_BFLOAT16_VALUE(-0.07), SIMDE_BFLOAT16_VALUE(-0.93), SIMDE_BFLOAT16_VALUE(-8.59) }, + { { SIMDE_BFLOAT16_VALUE(5.29), SIMDE_BFLOAT16_VALUE(2.79), SIMDE_BFLOAT16_VALUE(-5.18), SIMDE_BFLOAT16_VALUE(-2.73) }, + { SIMDE_BFLOAT16_VALUE(0.13), SIMDE_BFLOAT16_VALUE(-0.07), SIMDE_BFLOAT16_VALUE(-0.93), SIMDE_BFLOAT16_VALUE(-8.59) } } }, + { { SIMDE_BFLOAT16_VALUE(-1.35), SIMDE_BFLOAT16_VALUE(6.47), SIMDE_BFLOAT16_VALUE(-0.26), SIMDE_BFLOAT16_VALUE(-8.64), + SIMDE_BFLOAT16_VALUE(1.24), SIMDE_BFLOAT16_VALUE(8.31), SIMDE_BFLOAT16_VALUE(3.54), SIMDE_BFLOAT16_VALUE(2.21) }, + { { SIMDE_BFLOAT16_VALUE(-1.35), SIMDE_BFLOAT16_VALUE(6.47), SIMDE_BFLOAT16_VALUE(-0.26), SIMDE_BFLOAT16_VALUE(-8.64) }, + { SIMDE_BFLOAT16_VALUE(1.24), SIMDE_BFLOAT16_VALUE(8.31), SIMDE_BFLOAT16_VALUE(3.54), SIMDE_BFLOAT16_VALUE(2.21) } } }, + { { SIMDE_BFLOAT16_VALUE(-6.50), SIMDE_BFLOAT16_VALUE(-7.07), SIMDE_BFLOAT16_VALUE(-6.76), SIMDE_BFLOAT16_VALUE(7.01), + SIMDE_BFLOAT16_VALUE(1.81), SIMDE_BFLOAT16_VALUE(9.02), SIMDE_BFLOAT16_VALUE(3.69), SIMDE_BFLOAT16_VALUE(-8.59) }, + { { SIMDE_BFLOAT16_VALUE(-6.50), SIMDE_BFLOAT16_VALUE(-7.07), SIMDE_BFLOAT16_VALUE(-6.76), SIMDE_BFLOAT16_VALUE(7.01) }, + { SIMDE_BFLOAT16_VALUE(1.81), SIMDE_BFLOAT16_VALUE(9.02), SIMDE_BFLOAT16_VALUE(3.69), SIMDE_BFLOAT16_VALUE(-8.59) } } }, + { { SIMDE_BFLOAT16_VALUE(-7.98), SIMDE_BFLOAT16_VALUE(-1.43), SIMDE_BFLOAT16_VALUE(8.33), SIMDE_BFLOAT16_VALUE(-4.97), + SIMDE_BFLOAT16_VALUE(2.58), SIMDE_BFLOAT16_VALUE(1.73), SIMDE_BFLOAT16_VALUE(0.86), SIMDE_BFLOAT16_VALUE(-9.82) }, + { { SIMDE_BFLOAT16_VALUE(-7.98), SIMDE_BFLOAT16_VALUE(-1.43), SIMDE_BFLOAT16_VALUE(8.33), SIMDE_BFLOAT16_VALUE(-4.97) }, + { SIMDE_BFLOAT16_VALUE(2.58), SIMDE_BFLOAT16_VALUE(1.73), SIMDE_BFLOAT16_VALUE(0.86), SIMDE_BFLOAT16_VALUE(-9.82) } } }, + }; + + for (size_t i = 0; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + simde_bfloat16x4x2_t r = simde_vld1_bf16_x2(test_vec[i].buf); + simde_bfloat16x4x2_t expected = {{ + simde_vld1_bf16(test_vec[i].expected[0]), + simde_vld1_bf16(test_vec[i].expected[1]), + }}; + simde_test_arm_neon_assert_equal_bf16x4x2(r, expected, 1); + } + + return 0; +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -924,6 +964,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vld1_u64_x2) SIMDE_TEST_FUNC_LIST_ENTRY(vld1_p8_x2) SIMDE_TEST_FUNC_LIST_ENTRY(vld1_p16_x2) SIMDE_TEST_FUNC_LIST_ENTRY(vld1_p64_x2) +SIMDE_TEST_FUNC_LIST_ENTRY(vld1_bf16_x2) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/ld1_x3.c b/test/arm/neon/ld1_x3.c index 5756c7ceb..f28aae2cd 100644 --- a/test/arm/neon/ld1_x3.c +++ b/test/arm/neon/ld1_x3.c @@ -1090,6 +1090,57 @@ test_simde_vld1_p64_x3 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vld1_bf16_x3 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16 buf[12]; + simde_bfloat16 expected[3][4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(-5.79), SIMDE_BFLOAT16_VALUE(4.80), SIMDE_BFLOAT16_VALUE(9.66), SIMDE_BFLOAT16_VALUE(-2.49), + SIMDE_BFLOAT16_VALUE(-3.48), SIMDE_BFLOAT16_VALUE(2.38), SIMDE_BFLOAT16_VALUE(-7.06), SIMDE_BFLOAT16_VALUE(-9.89), + SIMDE_BFLOAT16_VALUE(-0.42), SIMDE_BFLOAT16_VALUE(4.02), SIMDE_BFLOAT16_VALUE(1.60), SIMDE_BFLOAT16_VALUE(4.63) }, + { { SIMDE_BFLOAT16_VALUE(-5.79), SIMDE_BFLOAT16_VALUE(4.80), SIMDE_BFLOAT16_VALUE(9.66), SIMDE_BFLOAT16_VALUE(-2.49) }, + { SIMDE_BFLOAT16_VALUE(-3.48), SIMDE_BFLOAT16_VALUE(2.38), SIMDE_BFLOAT16_VALUE(-7.06), SIMDE_BFLOAT16_VALUE(-9.89) }, + { SIMDE_BFLOAT16_VALUE(-0.42), SIMDE_BFLOAT16_VALUE(4.02), SIMDE_BFLOAT16_VALUE(1.60), SIMDE_BFLOAT16_VALUE(4.63) } } }, + { { SIMDE_BFLOAT16_VALUE(-7.02), SIMDE_BFLOAT16_VALUE(1.17), SIMDE_BFLOAT16_VALUE(-2.58), SIMDE_BFLOAT16_VALUE(-1.99), + SIMDE_BFLOAT16_VALUE(8.35), SIMDE_BFLOAT16_VALUE(-6.76), SIMDE_BFLOAT16_VALUE(-2.81), SIMDE_BFLOAT16_VALUE(-8.55), + SIMDE_BFLOAT16_VALUE(5.89), SIMDE_BFLOAT16_VALUE(-9.99), SIMDE_BFLOAT16_VALUE(3.60), SIMDE_BFLOAT16_VALUE(-5.29) }, + { { SIMDE_BFLOAT16_VALUE(-7.02), SIMDE_BFLOAT16_VALUE(1.17), SIMDE_BFLOAT16_VALUE(-2.58), SIMDE_BFLOAT16_VALUE(-1.99) }, + { SIMDE_BFLOAT16_VALUE(8.35), SIMDE_BFLOAT16_VALUE(-6.76), SIMDE_BFLOAT16_VALUE(-2.81), SIMDE_BFLOAT16_VALUE(-8.55) }, + { SIMDE_BFLOAT16_VALUE(5.89), SIMDE_BFLOAT16_VALUE(-9.99), SIMDE_BFLOAT16_VALUE(3.60), SIMDE_BFLOAT16_VALUE(-5.29) } } }, + { { SIMDE_BFLOAT16_VALUE(-0.56), SIMDE_BFLOAT16_VALUE(-4.61), SIMDE_BFLOAT16_VALUE(4.12), SIMDE_BFLOAT16_VALUE(6.86), + SIMDE_BFLOAT16_VALUE(-0.93), SIMDE_BFLOAT16_VALUE(8.80), SIMDE_BFLOAT16_VALUE(-4.47), SIMDE_BFLOAT16_VALUE(-0.16), + SIMDE_BFLOAT16_VALUE(-2.20), SIMDE_BFLOAT16_VALUE(9.97), SIMDE_BFLOAT16_VALUE(2.92), SIMDE_BFLOAT16_VALUE(4.50) }, + { { SIMDE_BFLOAT16_VALUE(-0.56), SIMDE_BFLOAT16_VALUE(-4.61), SIMDE_BFLOAT16_VALUE(4.12), SIMDE_BFLOAT16_VALUE(6.86) }, + { SIMDE_BFLOAT16_VALUE(-0.93), SIMDE_BFLOAT16_VALUE(8.80), SIMDE_BFLOAT16_VALUE(-4.47), SIMDE_BFLOAT16_VALUE(-0.16) }, + { SIMDE_BFLOAT16_VALUE(-2.20), SIMDE_BFLOAT16_VALUE(9.97), SIMDE_BFLOAT16_VALUE(2.92), SIMDE_BFLOAT16_VALUE(4.50) } } }, + { { SIMDE_BFLOAT16_VALUE(5.33), SIMDE_BFLOAT16_VALUE(1.10), SIMDE_BFLOAT16_VALUE(-0.07), SIMDE_BFLOAT16_VALUE(4.80), + SIMDE_BFLOAT16_VALUE(-7.40), SIMDE_BFLOAT16_VALUE(4.65), SIMDE_BFLOAT16_VALUE(9.31), SIMDE_BFLOAT16_VALUE(8.79), + SIMDE_BFLOAT16_VALUE(-3.82), SIMDE_BFLOAT16_VALUE(4.51), SIMDE_BFLOAT16_VALUE(-9.93), SIMDE_BFLOAT16_VALUE(-6.90) }, + { { SIMDE_BFLOAT16_VALUE(5.33), SIMDE_BFLOAT16_VALUE(1.10), SIMDE_BFLOAT16_VALUE(-0.07), SIMDE_BFLOAT16_VALUE(4.80) }, + { SIMDE_BFLOAT16_VALUE(-7.40), SIMDE_BFLOAT16_VALUE(4.65), SIMDE_BFLOAT16_VALUE(9.31), SIMDE_BFLOAT16_VALUE(8.79) }, + { SIMDE_BFLOAT16_VALUE(-3.82), SIMDE_BFLOAT16_VALUE(4.51), SIMDE_BFLOAT16_VALUE(-9.93), SIMDE_BFLOAT16_VALUE(-6.90) } } }, + { { SIMDE_BFLOAT16_VALUE(6.23), SIMDE_BFLOAT16_VALUE(9.84), SIMDE_BFLOAT16_VALUE(1.44), SIMDE_BFLOAT16_VALUE(-9.15), + SIMDE_BFLOAT16_VALUE(0.50), SIMDE_BFLOAT16_VALUE(6.55), SIMDE_BFLOAT16_VALUE(-3.70), SIMDE_BFLOAT16_VALUE(-1.56), + SIMDE_BFLOAT16_VALUE(-1.16), SIMDE_BFLOAT16_VALUE(1.56), SIMDE_BFLOAT16_VALUE(-4.94), SIMDE_BFLOAT16_VALUE(-5.71) }, + { { SIMDE_BFLOAT16_VALUE(6.23), SIMDE_BFLOAT16_VALUE(9.84), SIMDE_BFLOAT16_VALUE(1.44), SIMDE_BFLOAT16_VALUE(-9.15) }, + { SIMDE_BFLOAT16_VALUE(0.50), SIMDE_BFLOAT16_VALUE(6.55), SIMDE_BFLOAT16_VALUE(-3.70), SIMDE_BFLOAT16_VALUE(-1.56) }, + { SIMDE_BFLOAT16_VALUE(-1.16), SIMDE_BFLOAT16_VALUE(1.56), SIMDE_BFLOAT16_VALUE(-4.94), SIMDE_BFLOAT16_VALUE(-5.71) } } }, + }; + + for (size_t i = 0; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + simde_bfloat16x4x3_t r = simde_vld1_bf16_x3(test_vec[i].buf); + simde_bfloat16x4x3_t expected = {{ + simde_vld1_bf16(test_vec[i].expected[0]), + simde_vld1_bf16(test_vec[i].expected[1]), + simde_vld1_bf16(test_vec[i].expected[2]), + }}; + simde_test_arm_neon_assert_equal_bf16x4x3(r, expected, 1); + } + + return 0; +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -1108,6 +1159,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vld1_u64_x3) SIMDE_TEST_FUNC_LIST_ENTRY(vld1_p8_x3) SIMDE_TEST_FUNC_LIST_ENTRY(vld1_p16_x3) SIMDE_TEST_FUNC_LIST_ENTRY(vld1_p64_x3) +SIMDE_TEST_FUNC_LIST_ENTRY(vld1_bf16_x3) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/ld1_x4.c b/test/arm/neon/ld1_x4.c index d829183b7..e2f3bca48 100644 --- a/test/arm/neon/ld1_x4.c +++ b/test/arm/neon/ld1_x4.c @@ -1242,6 +1242,68 @@ test_simde_vld1_p64_x4 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vld1_bf16_x4 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16 buf[16]; + simde_bfloat16 expected[4][4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(1.49), SIMDE_BFLOAT16_VALUE(-9.73), SIMDE_BFLOAT16_VALUE(7.36), SIMDE_BFLOAT16_VALUE(3.11), + SIMDE_BFLOAT16_VALUE(7.22), SIMDE_BFLOAT16_VALUE(-2.45), SIMDE_BFLOAT16_VALUE(3.68), SIMDE_BFLOAT16_VALUE(-1.35), + SIMDE_BFLOAT16_VALUE(-6.30), SIMDE_BFLOAT16_VALUE(-2.80), SIMDE_BFLOAT16_VALUE(3.23), SIMDE_BFLOAT16_VALUE(5.48), + SIMDE_BFLOAT16_VALUE(4.45), SIMDE_BFLOAT16_VALUE(-3.47), SIMDE_BFLOAT16_VALUE(7.65), SIMDE_BFLOAT16_VALUE(3.68) }, + { { SIMDE_BFLOAT16_VALUE(1.49), SIMDE_BFLOAT16_VALUE(-9.73), SIMDE_BFLOAT16_VALUE(7.36), SIMDE_BFLOAT16_VALUE(3.11) }, + { SIMDE_BFLOAT16_VALUE(7.22), SIMDE_BFLOAT16_VALUE(-2.45), SIMDE_BFLOAT16_VALUE(3.68), SIMDE_BFLOAT16_VALUE(-1.35) }, + { SIMDE_BFLOAT16_VALUE(-6.30), SIMDE_BFLOAT16_VALUE(-2.80), SIMDE_BFLOAT16_VALUE(3.23), SIMDE_BFLOAT16_VALUE(5.48) }, + { SIMDE_BFLOAT16_VALUE(4.45), SIMDE_BFLOAT16_VALUE(-3.47), SIMDE_BFLOAT16_VALUE(7.65), SIMDE_BFLOAT16_VALUE(3.68) } } }, + { { SIMDE_BFLOAT16_VALUE(-8.94), SIMDE_BFLOAT16_VALUE(-1.95), SIMDE_BFLOAT16_VALUE(7.40), SIMDE_BFLOAT16_VALUE(4.23), + SIMDE_BFLOAT16_VALUE(1.06), SIMDE_BFLOAT16_VALUE(-0.17), SIMDE_BFLOAT16_VALUE(-7.00), SIMDE_BFLOAT16_VALUE(9.69), + SIMDE_BFLOAT16_VALUE(-1.56), SIMDE_BFLOAT16_VALUE(2.45), SIMDE_BFLOAT16_VALUE(-4.16), SIMDE_BFLOAT16_VALUE(-6.16), + SIMDE_BFLOAT16_VALUE(6.09), SIMDE_BFLOAT16_VALUE(3.06), SIMDE_BFLOAT16_VALUE(-0.57), SIMDE_BFLOAT16_VALUE(4.51) }, + { { SIMDE_BFLOAT16_VALUE(-8.94), SIMDE_BFLOAT16_VALUE(-1.95), SIMDE_BFLOAT16_VALUE(7.40), SIMDE_BFLOAT16_VALUE(4.23) }, + { SIMDE_BFLOAT16_VALUE(1.06), SIMDE_BFLOAT16_VALUE(-0.17), SIMDE_BFLOAT16_VALUE(-7.00), SIMDE_BFLOAT16_VALUE(9.69) }, + { SIMDE_BFLOAT16_VALUE(-1.56), SIMDE_BFLOAT16_VALUE(2.45), SIMDE_BFLOAT16_VALUE(-4.16), SIMDE_BFLOAT16_VALUE(-6.16) }, + { SIMDE_BFLOAT16_VALUE(6.09), SIMDE_BFLOAT16_VALUE(3.06), SIMDE_BFLOAT16_VALUE(-0.57), SIMDE_BFLOAT16_VALUE(4.51) } } }, + { { SIMDE_BFLOAT16_VALUE(6.06), SIMDE_BFLOAT16_VALUE(-0.83), SIMDE_BFLOAT16_VALUE(-8.07), SIMDE_BFLOAT16_VALUE(-8.13), + SIMDE_BFLOAT16_VALUE(-2.78), SIMDE_BFLOAT16_VALUE(-9.03), SIMDE_BFLOAT16_VALUE(0.63), SIMDE_BFLOAT16_VALUE(-6.69), + SIMDE_BFLOAT16_VALUE(3.21), SIMDE_BFLOAT16_VALUE(-7.11), SIMDE_BFLOAT16_VALUE(2.09), SIMDE_BFLOAT16_VALUE(5.06), + SIMDE_BFLOAT16_VALUE(-0.76), SIMDE_BFLOAT16_VALUE(4.49), SIMDE_BFLOAT16_VALUE(-8.49), SIMDE_BFLOAT16_VALUE(-9.25) }, + { { SIMDE_BFLOAT16_VALUE(6.06), SIMDE_BFLOAT16_VALUE(-0.83), SIMDE_BFLOAT16_VALUE(-8.07), SIMDE_BFLOAT16_VALUE(-8.13) }, + { SIMDE_BFLOAT16_VALUE(-2.78), SIMDE_BFLOAT16_VALUE(-9.03), SIMDE_BFLOAT16_VALUE(0.63), SIMDE_BFLOAT16_VALUE(-6.69) }, + { SIMDE_BFLOAT16_VALUE(3.21), SIMDE_BFLOAT16_VALUE(-7.11), SIMDE_BFLOAT16_VALUE(2.09), SIMDE_BFLOAT16_VALUE(5.06) }, + { SIMDE_BFLOAT16_VALUE(-0.76), SIMDE_BFLOAT16_VALUE(4.49), SIMDE_BFLOAT16_VALUE(-8.49), SIMDE_BFLOAT16_VALUE(-9.25) } } }, + { { SIMDE_BFLOAT16_VALUE(9.79), SIMDE_BFLOAT16_VALUE(2.62), SIMDE_BFLOAT16_VALUE(-9.19), SIMDE_BFLOAT16_VALUE(3.73), + SIMDE_BFLOAT16_VALUE(1.03), SIMDE_BFLOAT16_VALUE(8.35), SIMDE_BFLOAT16_VALUE(-3.15), SIMDE_BFLOAT16_VALUE(0.58), + SIMDE_BFLOAT16_VALUE(-3.14), SIMDE_BFLOAT16_VALUE(-8.78), SIMDE_BFLOAT16_VALUE(7.54), SIMDE_BFLOAT16_VALUE(-1.07), + SIMDE_BFLOAT16_VALUE(-8.37), SIMDE_BFLOAT16_VALUE(7.13), SIMDE_BFLOAT16_VALUE(-5.82), SIMDE_BFLOAT16_VALUE(8.91) }, + { { SIMDE_BFLOAT16_VALUE(9.79), SIMDE_BFLOAT16_VALUE(2.62), SIMDE_BFLOAT16_VALUE(-9.19), SIMDE_BFLOAT16_VALUE(3.73) }, + { SIMDE_BFLOAT16_VALUE(1.03), SIMDE_BFLOAT16_VALUE(8.35), SIMDE_BFLOAT16_VALUE(-3.15), SIMDE_BFLOAT16_VALUE(0.58) }, + { SIMDE_BFLOAT16_VALUE(-3.14), SIMDE_BFLOAT16_VALUE(-8.78), SIMDE_BFLOAT16_VALUE(7.54), SIMDE_BFLOAT16_VALUE(-1.07) }, + { SIMDE_BFLOAT16_VALUE(-8.37), SIMDE_BFLOAT16_VALUE(7.13), SIMDE_BFLOAT16_VALUE(-5.82), SIMDE_BFLOAT16_VALUE(8.91) } } }, + { { SIMDE_BFLOAT16_VALUE(-9.77), SIMDE_BFLOAT16_VALUE(6.23), SIMDE_BFLOAT16_VALUE(3.40), SIMDE_BFLOAT16_VALUE(-7.45), + SIMDE_BFLOAT16_VALUE(7.00), SIMDE_BFLOAT16_VALUE(-0.92), SIMDE_BFLOAT16_VALUE(3.60), SIMDE_BFLOAT16_VALUE(3.19), + SIMDE_BFLOAT16_VALUE(3.24), SIMDE_BFLOAT16_VALUE(8.21), SIMDE_BFLOAT16_VALUE(-1.51), SIMDE_BFLOAT16_VALUE(4.81), + SIMDE_BFLOAT16_VALUE(2.05), SIMDE_BFLOAT16_VALUE(-3.18), SIMDE_BFLOAT16_VALUE(8.26), SIMDE_BFLOAT16_VALUE(-6.38) }, + { { SIMDE_BFLOAT16_VALUE(-9.77), SIMDE_BFLOAT16_VALUE(6.23), SIMDE_BFLOAT16_VALUE(3.40), SIMDE_BFLOAT16_VALUE(-7.45) }, + { SIMDE_BFLOAT16_VALUE(7.00), SIMDE_BFLOAT16_VALUE(-0.92), SIMDE_BFLOAT16_VALUE(3.60), SIMDE_BFLOAT16_VALUE(3.19) }, + { SIMDE_BFLOAT16_VALUE(3.24), SIMDE_BFLOAT16_VALUE(8.21), SIMDE_BFLOAT16_VALUE(-1.51), SIMDE_BFLOAT16_VALUE(4.81) }, + { SIMDE_BFLOAT16_VALUE(2.05), SIMDE_BFLOAT16_VALUE(-3.18), SIMDE_BFLOAT16_VALUE(8.26), SIMDE_BFLOAT16_VALUE(-6.38) } } }, + }; + + for (size_t i = 0; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + simde_bfloat16x4x4_t r = simde_vld1_bf16_x4(test_vec[i].buf); + simde_bfloat16x4x4_t expected = {{ + simde_vld1_bf16(test_vec[i].expected[0]), + simde_vld1_bf16(test_vec[i].expected[1]), + simde_vld1_bf16(test_vec[i].expected[2]), + simde_vld1_bf16(test_vec[i].expected[3]), + }}; + simde_test_arm_neon_assert_equal_bf16x4x4(r, expected, 1); + } + + return 0; +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -1260,6 +1322,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vld1_u64_x4) SIMDE_TEST_FUNC_LIST_ENTRY(vld1_p8_x4) SIMDE_TEST_FUNC_LIST_ENTRY(vld1_p16_x4) SIMDE_TEST_FUNC_LIST_ENTRY(vld1_p64_x4) +SIMDE_TEST_FUNC_LIST_ENTRY(vld1_bf16_x4) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/ld1q_x2.c b/test/arm/neon/ld1q_x2.c index 3249d8e0d..a3422660d 100644 --- a/test/arm/neon/ld1q_x2.c +++ b/test/arm/neon/ld1q_x2.c @@ -1054,6 +1054,68 @@ test_simde_vld1q_p64_x2 (SIMDE_MUNIT_TEST_ARGS) { #endif } + +static int +test_simde_vld1q_bf16_x2 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16 buf[16]; + simde_bfloat16 expected[2][8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(8.77), SIMDE_BFLOAT16_VALUE(-8.18), SIMDE_BFLOAT16_VALUE(0.29), SIMDE_BFLOAT16_VALUE(-5.13), + SIMDE_BFLOAT16_VALUE(-0.49), SIMDE_BFLOAT16_VALUE(-5.46), SIMDE_BFLOAT16_VALUE(-5.01), SIMDE_BFLOAT16_VALUE(9.21), + SIMDE_BFLOAT16_VALUE(-5.50), SIMDE_BFLOAT16_VALUE(0.96), SIMDE_BFLOAT16_VALUE(-8.88), SIMDE_BFLOAT16_VALUE(-3.56), + SIMDE_BFLOAT16_VALUE(-7.57), SIMDE_BFLOAT16_VALUE(4.59), SIMDE_BFLOAT16_VALUE(2.11), SIMDE_BFLOAT16_VALUE(-8.34) }, + { { SIMDE_BFLOAT16_VALUE(8.77), SIMDE_BFLOAT16_VALUE(-8.18), SIMDE_BFLOAT16_VALUE(0.29), SIMDE_BFLOAT16_VALUE(-5.13), + SIMDE_BFLOAT16_VALUE(-0.49), SIMDE_BFLOAT16_VALUE(-5.46), SIMDE_BFLOAT16_VALUE(-5.01), SIMDE_BFLOAT16_VALUE(9.21) }, + { SIMDE_BFLOAT16_VALUE(-5.50), SIMDE_BFLOAT16_VALUE(0.96), SIMDE_BFLOAT16_VALUE(-8.88), SIMDE_BFLOAT16_VALUE(-3.56), + SIMDE_BFLOAT16_VALUE(-7.57), SIMDE_BFLOAT16_VALUE(4.59), SIMDE_BFLOAT16_VALUE(2.11), SIMDE_BFLOAT16_VALUE(-8.34) } } }, + { { SIMDE_BFLOAT16_VALUE(-2.41), SIMDE_BFLOAT16_VALUE(-4.05), SIMDE_BFLOAT16_VALUE(-2.12), SIMDE_BFLOAT16_VALUE(8.76), + SIMDE_BFLOAT16_VALUE(-9.05), SIMDE_BFLOAT16_VALUE(-9.20), SIMDE_BFLOAT16_VALUE(-9.36), SIMDE_BFLOAT16_VALUE(7.44), + SIMDE_BFLOAT16_VALUE(-0.56), SIMDE_BFLOAT16_VALUE(-0.19), SIMDE_BFLOAT16_VALUE(2.69), SIMDE_BFLOAT16_VALUE(-3.86), + SIMDE_BFLOAT16_VALUE(8.27), SIMDE_BFLOAT16_VALUE(7.78), SIMDE_BFLOAT16_VALUE(5.32), SIMDE_BFLOAT16_VALUE(8.78) }, + { { SIMDE_BFLOAT16_VALUE(-2.41), SIMDE_BFLOAT16_VALUE(-4.05), SIMDE_BFLOAT16_VALUE(-2.12), SIMDE_BFLOAT16_VALUE(8.76), + SIMDE_BFLOAT16_VALUE(-9.05), SIMDE_BFLOAT16_VALUE(-9.20), SIMDE_BFLOAT16_VALUE(-9.36), SIMDE_BFLOAT16_VALUE(7.44) }, + { SIMDE_BFLOAT16_VALUE(-0.56), SIMDE_BFLOAT16_VALUE(-0.19), SIMDE_BFLOAT16_VALUE(2.69), SIMDE_BFLOAT16_VALUE(-3.86), + SIMDE_BFLOAT16_VALUE(8.27), SIMDE_BFLOAT16_VALUE(7.78), SIMDE_BFLOAT16_VALUE(5.32), SIMDE_BFLOAT16_VALUE(8.78) } } }, + { { SIMDE_BFLOAT16_VALUE(9.59), SIMDE_BFLOAT16_VALUE(-4.45), SIMDE_BFLOAT16_VALUE(-4.44), SIMDE_BFLOAT16_VALUE(-3.80), + SIMDE_BFLOAT16_VALUE(8.02), SIMDE_BFLOAT16_VALUE(-6.86), SIMDE_BFLOAT16_VALUE(3.22), SIMDE_BFLOAT16_VALUE(7.96), + SIMDE_BFLOAT16_VALUE(2.96), SIMDE_BFLOAT16_VALUE(9.81), SIMDE_BFLOAT16_VALUE(-2.28), SIMDE_BFLOAT16_VALUE(2.25), + SIMDE_BFLOAT16_VALUE(6.08), SIMDE_BFLOAT16_VALUE(-2.65), SIMDE_BFLOAT16_VALUE(5.79), SIMDE_BFLOAT16_VALUE(2.07) }, + { { SIMDE_BFLOAT16_VALUE(9.59), SIMDE_BFLOAT16_VALUE(-4.45), SIMDE_BFLOAT16_VALUE(-4.44), SIMDE_BFLOAT16_VALUE(-3.80), + SIMDE_BFLOAT16_VALUE(8.02), SIMDE_BFLOAT16_VALUE(-6.86), SIMDE_BFLOAT16_VALUE(3.22), SIMDE_BFLOAT16_VALUE(7.96) }, + { SIMDE_BFLOAT16_VALUE(2.96), SIMDE_BFLOAT16_VALUE(9.81), SIMDE_BFLOAT16_VALUE(-2.28), SIMDE_BFLOAT16_VALUE(2.25), + SIMDE_BFLOAT16_VALUE(6.08), SIMDE_BFLOAT16_VALUE(-2.65), SIMDE_BFLOAT16_VALUE(5.79), SIMDE_BFLOAT16_VALUE(2.07) } } }, + { { SIMDE_BFLOAT16_VALUE(-8.12), SIMDE_BFLOAT16_VALUE(-8.56), SIMDE_BFLOAT16_VALUE(-3.17), SIMDE_BFLOAT16_VALUE(7.97), + SIMDE_BFLOAT16_VALUE(-6.75), SIMDE_BFLOAT16_VALUE(-7.91), SIMDE_BFLOAT16_VALUE(-3.52), SIMDE_BFLOAT16_VALUE(4.08), + SIMDE_BFLOAT16_VALUE(-7.33), SIMDE_BFLOAT16_VALUE(4.96), SIMDE_BFLOAT16_VALUE(2.30), SIMDE_BFLOAT16_VALUE(4.35), + SIMDE_BFLOAT16_VALUE(6.65), SIMDE_BFLOAT16_VALUE(-9.83), SIMDE_BFLOAT16_VALUE(4.16), SIMDE_BFLOAT16_VALUE(-9.32) }, + { { SIMDE_BFLOAT16_VALUE(-8.12), SIMDE_BFLOAT16_VALUE(-8.56), SIMDE_BFLOAT16_VALUE(-3.17), SIMDE_BFLOAT16_VALUE(7.97), + SIMDE_BFLOAT16_VALUE(-6.75), SIMDE_BFLOAT16_VALUE(-7.91), SIMDE_BFLOAT16_VALUE(-3.52), SIMDE_BFLOAT16_VALUE(4.08) }, + { SIMDE_BFLOAT16_VALUE(-7.33), SIMDE_BFLOAT16_VALUE(4.96), SIMDE_BFLOAT16_VALUE(2.30), SIMDE_BFLOAT16_VALUE(4.35), + SIMDE_BFLOAT16_VALUE(6.65), SIMDE_BFLOAT16_VALUE(-9.83), SIMDE_BFLOAT16_VALUE(4.16), SIMDE_BFLOAT16_VALUE(-9.32) } } }, + { { SIMDE_BFLOAT16_VALUE(-8.89), SIMDE_BFLOAT16_VALUE(2.64), SIMDE_BFLOAT16_VALUE(8.88), SIMDE_BFLOAT16_VALUE(8.92), + SIMDE_BFLOAT16_VALUE(1.05), SIMDE_BFLOAT16_VALUE(-5.69), SIMDE_BFLOAT16_VALUE(1.66), SIMDE_BFLOAT16_VALUE(-3.57), + SIMDE_BFLOAT16_VALUE(-0.96), SIMDE_BFLOAT16_VALUE(2.24), SIMDE_BFLOAT16_VALUE(6.98), SIMDE_BFLOAT16_VALUE(1.03), + SIMDE_BFLOAT16_VALUE(7.90), SIMDE_BFLOAT16_VALUE(9.00), SIMDE_BFLOAT16_VALUE(-0.34), SIMDE_BFLOAT16_VALUE(9.82) }, + { { SIMDE_BFLOAT16_VALUE(-8.89), SIMDE_BFLOAT16_VALUE(2.64), SIMDE_BFLOAT16_VALUE(8.88), SIMDE_BFLOAT16_VALUE(8.92), + SIMDE_BFLOAT16_VALUE(1.05), SIMDE_BFLOAT16_VALUE(-5.69), SIMDE_BFLOAT16_VALUE(1.66), SIMDE_BFLOAT16_VALUE(-3.57) }, + { SIMDE_BFLOAT16_VALUE(-0.96), SIMDE_BFLOAT16_VALUE(2.24), SIMDE_BFLOAT16_VALUE(6.98), SIMDE_BFLOAT16_VALUE(1.03), + SIMDE_BFLOAT16_VALUE(7.90), SIMDE_BFLOAT16_VALUE(9.00), SIMDE_BFLOAT16_VALUE(-0.34), SIMDE_BFLOAT16_VALUE(9.82) } } }, + }; + + for (size_t i = 0; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + simde_bfloat16x8x2_t r = simde_vld1q_bf16_x2(test_vec[i].buf); + simde_bfloat16x8x2_t expected = {{ + simde_vld1q_bf16(test_vec[i].expected[0]), + simde_vld1q_bf16(test_vec[i].expected[1]), + }}; + simde_test_arm_neon_assert_equal_bf16x8x2(r, expected, 1); + } + + return 0; +} + + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -1072,6 +1134,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_u64_x2) SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_p8_x2) SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_p16_x2) SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_p64_x2) +SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_bf16_x2) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/ld1q_x3.c b/test/arm/neon/ld1q_x3.c index ce4fb6840..44bd4f510 100644 --- a/test/arm/neon/ld1q_x3.c +++ b/test/arm/neon/ld1q_x3.c @@ -1344,6 +1344,87 @@ test_simde_vld1q_p64_x3 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vld1q_bf16_x3 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16 buf[24]; + simde_bfloat16 expected[3][8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(5.77), SIMDE_BFLOAT16_VALUE(3.40), SIMDE_BFLOAT16_VALUE(8.52), SIMDE_BFLOAT16_VALUE(-8.12), + SIMDE_BFLOAT16_VALUE(9.75), SIMDE_BFLOAT16_VALUE(4.58), SIMDE_BFLOAT16_VALUE(-8.12), SIMDE_BFLOAT16_VALUE(-0.21), + SIMDE_BFLOAT16_VALUE(-8.19), SIMDE_BFLOAT16_VALUE(9.31), SIMDE_BFLOAT16_VALUE(-3.36), SIMDE_BFLOAT16_VALUE(6.68), + SIMDE_BFLOAT16_VALUE(-4.82), SIMDE_BFLOAT16_VALUE(-7.99), SIMDE_BFLOAT16_VALUE(7.60), SIMDE_BFLOAT16_VALUE(-5.32), + SIMDE_BFLOAT16_VALUE(8.17), SIMDE_BFLOAT16_VALUE(-2.82), SIMDE_BFLOAT16_VALUE(-0.51), SIMDE_BFLOAT16_VALUE(-8.15), + SIMDE_BFLOAT16_VALUE(-5.44), SIMDE_BFLOAT16_VALUE(8.44), SIMDE_BFLOAT16_VALUE(-6.93), SIMDE_BFLOAT16_VALUE(2.81) }, + { { SIMDE_BFLOAT16_VALUE(5.77), SIMDE_BFLOAT16_VALUE(3.40), SIMDE_BFLOAT16_VALUE(8.52), SIMDE_BFLOAT16_VALUE(-8.12), + SIMDE_BFLOAT16_VALUE(9.75), SIMDE_BFLOAT16_VALUE(4.58), SIMDE_BFLOAT16_VALUE(-8.12), SIMDE_BFLOAT16_VALUE(-0.21) }, + { SIMDE_BFLOAT16_VALUE(-8.19), SIMDE_BFLOAT16_VALUE(9.31), SIMDE_BFLOAT16_VALUE(-3.36), SIMDE_BFLOAT16_VALUE(6.68), + SIMDE_BFLOAT16_VALUE(-4.82), SIMDE_BFLOAT16_VALUE(-7.99), SIMDE_BFLOAT16_VALUE(7.60), SIMDE_BFLOAT16_VALUE(-5.32) }, + { SIMDE_BFLOAT16_VALUE(8.17), SIMDE_BFLOAT16_VALUE(-2.82), SIMDE_BFLOAT16_VALUE(-0.51), SIMDE_BFLOAT16_VALUE(-8.15), + SIMDE_BFLOAT16_VALUE(-5.44), SIMDE_BFLOAT16_VALUE(8.44), SIMDE_BFLOAT16_VALUE(-6.93), SIMDE_BFLOAT16_VALUE(2.81) } } }, + { { SIMDE_BFLOAT16_VALUE(1.57), SIMDE_BFLOAT16_VALUE(-2.73), SIMDE_BFLOAT16_VALUE(-0.07), SIMDE_BFLOAT16_VALUE(9.59), + SIMDE_BFLOAT16_VALUE(5.25), SIMDE_BFLOAT16_VALUE(-4.36), SIMDE_BFLOAT16_VALUE(0.01), SIMDE_BFLOAT16_VALUE(-7.95), + SIMDE_BFLOAT16_VALUE(-7.48), SIMDE_BFLOAT16_VALUE(5.11), SIMDE_BFLOAT16_VALUE(2.89), SIMDE_BFLOAT16_VALUE(4.88), + SIMDE_BFLOAT16_VALUE(0.38), SIMDE_BFLOAT16_VALUE(5.53), SIMDE_BFLOAT16_VALUE(-1.66), SIMDE_BFLOAT16_VALUE(4.24), + SIMDE_BFLOAT16_VALUE(5.92), SIMDE_BFLOAT16_VALUE(0.65), SIMDE_BFLOAT16_VALUE(-9.00), SIMDE_BFLOAT16_VALUE(9.26), + SIMDE_BFLOAT16_VALUE(-0.65), SIMDE_BFLOAT16_VALUE(3.52), SIMDE_BFLOAT16_VALUE(8.37), SIMDE_BFLOAT16_VALUE(-6.65) }, + { { SIMDE_BFLOAT16_VALUE(1.57), SIMDE_BFLOAT16_VALUE(-2.73), SIMDE_BFLOAT16_VALUE(-0.07), SIMDE_BFLOAT16_VALUE(9.59), + SIMDE_BFLOAT16_VALUE(5.25), SIMDE_BFLOAT16_VALUE(-4.36), SIMDE_BFLOAT16_VALUE(0.01), SIMDE_BFLOAT16_VALUE(-7.95) }, + { SIMDE_BFLOAT16_VALUE(-7.48), SIMDE_BFLOAT16_VALUE(5.11), SIMDE_BFLOAT16_VALUE(2.89), SIMDE_BFLOAT16_VALUE(4.88), + SIMDE_BFLOAT16_VALUE(0.38), SIMDE_BFLOAT16_VALUE(5.53), SIMDE_BFLOAT16_VALUE(-1.66), SIMDE_BFLOAT16_VALUE(4.24) }, + { SIMDE_BFLOAT16_VALUE(5.92), SIMDE_BFLOAT16_VALUE(0.65), SIMDE_BFLOAT16_VALUE(-9.00), SIMDE_BFLOAT16_VALUE(9.26), + SIMDE_BFLOAT16_VALUE(-0.65), SIMDE_BFLOAT16_VALUE(3.52), SIMDE_BFLOAT16_VALUE(8.37), SIMDE_BFLOAT16_VALUE(-6.65) } } }, + { { SIMDE_BFLOAT16_VALUE(-1.37), SIMDE_BFLOAT16_VALUE(-2.25), SIMDE_BFLOAT16_VALUE(1.38), SIMDE_BFLOAT16_VALUE(-0.69), + SIMDE_BFLOAT16_VALUE(-0.74), SIMDE_BFLOAT16_VALUE(-5.25), SIMDE_BFLOAT16_VALUE(6.54), SIMDE_BFLOAT16_VALUE(-9.57), + SIMDE_BFLOAT16_VALUE(8.41), SIMDE_BFLOAT16_VALUE(0.56), SIMDE_BFLOAT16_VALUE(-3.33), SIMDE_BFLOAT16_VALUE(0.61), + SIMDE_BFLOAT16_VALUE(2.97), SIMDE_BFLOAT16_VALUE(9.80), SIMDE_BFLOAT16_VALUE(7.20), SIMDE_BFLOAT16_VALUE(-1.70), + SIMDE_BFLOAT16_VALUE(6.31), SIMDE_BFLOAT16_VALUE(-7.33), SIMDE_BFLOAT16_VALUE(8.80), SIMDE_BFLOAT16_VALUE(5.75), + SIMDE_BFLOAT16_VALUE(4.89), SIMDE_BFLOAT16_VALUE(-5.85), SIMDE_BFLOAT16_VALUE(-5.80), SIMDE_BFLOAT16_VALUE(1.30) }, + { { SIMDE_BFLOAT16_VALUE(-1.37), SIMDE_BFLOAT16_VALUE(-2.25), SIMDE_BFLOAT16_VALUE(1.38), SIMDE_BFLOAT16_VALUE(-0.69), + SIMDE_BFLOAT16_VALUE(-0.74), SIMDE_BFLOAT16_VALUE(-5.25), SIMDE_BFLOAT16_VALUE(6.54), SIMDE_BFLOAT16_VALUE(-9.57) }, + { SIMDE_BFLOAT16_VALUE(8.41), SIMDE_BFLOAT16_VALUE(0.56), SIMDE_BFLOAT16_VALUE(-3.33), SIMDE_BFLOAT16_VALUE(0.61), + SIMDE_BFLOAT16_VALUE(2.97), SIMDE_BFLOAT16_VALUE(9.80), SIMDE_BFLOAT16_VALUE(7.20), SIMDE_BFLOAT16_VALUE(-1.70) }, + { SIMDE_BFLOAT16_VALUE(6.31), SIMDE_BFLOAT16_VALUE(-7.33), SIMDE_BFLOAT16_VALUE(8.80), SIMDE_BFLOAT16_VALUE(5.75), + SIMDE_BFLOAT16_VALUE(4.89), SIMDE_BFLOAT16_VALUE(-5.85), SIMDE_BFLOAT16_VALUE(-5.80), SIMDE_BFLOAT16_VALUE(1.30) } } }, + { { SIMDE_BFLOAT16_VALUE(-1.53), SIMDE_BFLOAT16_VALUE(1.62), SIMDE_BFLOAT16_VALUE(-5.29), SIMDE_BFLOAT16_VALUE(-4.50), + SIMDE_BFLOAT16_VALUE(-9.77), SIMDE_BFLOAT16_VALUE(1.79), SIMDE_BFLOAT16_VALUE(4.79), SIMDE_BFLOAT16_VALUE(6.77), + SIMDE_BFLOAT16_VALUE(2.13), SIMDE_BFLOAT16_VALUE(-4.49), SIMDE_BFLOAT16_VALUE(-8.50), SIMDE_BFLOAT16_VALUE(-4.17), + SIMDE_BFLOAT16_VALUE(-7.82), SIMDE_BFLOAT16_VALUE(8.62), SIMDE_BFLOAT16_VALUE(-9.23), SIMDE_BFLOAT16_VALUE(-8.30), + SIMDE_BFLOAT16_VALUE(6.89), SIMDE_BFLOAT16_VALUE(8.83), SIMDE_BFLOAT16_VALUE(-8.78), SIMDE_BFLOAT16_VALUE(-2.63), + SIMDE_BFLOAT16_VALUE(-4.15), SIMDE_BFLOAT16_VALUE(4.43), SIMDE_BFLOAT16_VALUE(-1.23), SIMDE_BFLOAT16_VALUE(-7.80) }, + { { SIMDE_BFLOAT16_VALUE(-1.53), SIMDE_BFLOAT16_VALUE(1.62), SIMDE_BFLOAT16_VALUE(-5.29), SIMDE_BFLOAT16_VALUE(-4.50), + SIMDE_BFLOAT16_VALUE(-9.77), SIMDE_BFLOAT16_VALUE(1.79), SIMDE_BFLOAT16_VALUE(4.79), SIMDE_BFLOAT16_VALUE(6.77) }, + { SIMDE_BFLOAT16_VALUE(2.13), SIMDE_BFLOAT16_VALUE(-4.49), SIMDE_BFLOAT16_VALUE(-8.50), SIMDE_BFLOAT16_VALUE(-4.17), + SIMDE_BFLOAT16_VALUE(-7.82), SIMDE_BFLOAT16_VALUE(8.62), SIMDE_BFLOAT16_VALUE(-9.23), SIMDE_BFLOAT16_VALUE(-8.30) }, + { SIMDE_BFLOAT16_VALUE(6.89), SIMDE_BFLOAT16_VALUE(8.83), SIMDE_BFLOAT16_VALUE(-8.78), SIMDE_BFLOAT16_VALUE(-2.63), + SIMDE_BFLOAT16_VALUE(-4.15), SIMDE_BFLOAT16_VALUE(4.43), SIMDE_BFLOAT16_VALUE(-1.23), SIMDE_BFLOAT16_VALUE(-7.80) } } }, + { { SIMDE_BFLOAT16_VALUE(7.81), SIMDE_BFLOAT16_VALUE(-8.12), SIMDE_BFLOAT16_VALUE(-5.24), SIMDE_BFLOAT16_VALUE(-7.34), + SIMDE_BFLOAT16_VALUE(-5.07), SIMDE_BFLOAT16_VALUE(8.42), SIMDE_BFLOAT16_VALUE(-1.56), SIMDE_BFLOAT16_VALUE(3.85), + SIMDE_BFLOAT16_VALUE(1.08), SIMDE_BFLOAT16_VALUE(-3.58), SIMDE_BFLOAT16_VALUE(-1.71), SIMDE_BFLOAT16_VALUE(-6.62), + SIMDE_BFLOAT16_VALUE(3.82), SIMDE_BFLOAT16_VALUE(-0.05), SIMDE_BFLOAT16_VALUE(5.35), SIMDE_BFLOAT16_VALUE(-4.41), + SIMDE_BFLOAT16_VALUE(7.30), SIMDE_BFLOAT16_VALUE(-7.74), SIMDE_BFLOAT16_VALUE(-9.77), SIMDE_BFLOAT16_VALUE(-9.07), + SIMDE_BFLOAT16_VALUE(9.48), SIMDE_BFLOAT16_VALUE(-2.73), SIMDE_BFLOAT16_VALUE(-7.56), SIMDE_BFLOAT16_VALUE(3.51) }, + { { SIMDE_BFLOAT16_VALUE(7.81), SIMDE_BFLOAT16_VALUE(-8.12), SIMDE_BFLOAT16_VALUE(-5.24), SIMDE_BFLOAT16_VALUE(-7.34), + SIMDE_BFLOAT16_VALUE(-5.07), SIMDE_BFLOAT16_VALUE(8.42), SIMDE_BFLOAT16_VALUE(-1.56), SIMDE_BFLOAT16_VALUE(3.85) }, + { SIMDE_BFLOAT16_VALUE(1.08), SIMDE_BFLOAT16_VALUE(-3.58), SIMDE_BFLOAT16_VALUE(-1.71), SIMDE_BFLOAT16_VALUE(-6.62), + SIMDE_BFLOAT16_VALUE(3.82), SIMDE_BFLOAT16_VALUE(-0.05), SIMDE_BFLOAT16_VALUE(5.35), SIMDE_BFLOAT16_VALUE(-4.41) }, + { SIMDE_BFLOAT16_VALUE(7.30), SIMDE_BFLOAT16_VALUE(-7.74), SIMDE_BFLOAT16_VALUE(-9.77), SIMDE_BFLOAT16_VALUE(-9.07), + SIMDE_BFLOAT16_VALUE(9.48), SIMDE_BFLOAT16_VALUE(-2.73), SIMDE_BFLOAT16_VALUE(-7.56), SIMDE_BFLOAT16_VALUE(3.51) } } }, + }; + + for (size_t i = 0; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + simde_bfloat16x8x3_t r = simde_vld1q_bf16_x3(test_vec[i].buf); + simde_bfloat16x8x3_t expected = {{ + simde_vld1q_bf16(test_vec[i].expected[0]), + simde_vld1q_bf16(test_vec[i].expected[1]), + simde_vld1q_bf16(test_vec[i].expected[2]), + }}; + simde_test_arm_neon_assert_equal_bf16x8x3(r, expected, 1); + } + + return 0; +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -1362,6 +1443,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_u64_x3) SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_p8_x3) SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_p16_x3) SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_p64_x3) +SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_bf16_x3) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/ld1q_x4.c b/test/arm/neon/ld1q_x4.c index 7c45c85a8..e4593b0c7 100644 --- a/test/arm/neon/ld1q_x4.c +++ b/test/arm/neon/ld1q_x4.c @@ -1754,6 +1754,108 @@ test_simde_vld1q_p64_x4 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vld1q_bf16_x4 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16 buf[32]; + simde_bfloat16 expected[4][8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(0.77), SIMDE_BFLOAT16_VALUE(-4.96), SIMDE_BFLOAT16_VALUE(4.32), SIMDE_BFLOAT16_VALUE(7.52), + SIMDE_BFLOAT16_VALUE(4.70), SIMDE_BFLOAT16_VALUE(1.33), SIMDE_BFLOAT16_VALUE(-9.47), SIMDE_BFLOAT16_VALUE(7.32), + SIMDE_BFLOAT16_VALUE(-3.23), SIMDE_BFLOAT16_VALUE(0.61), SIMDE_BFLOAT16_VALUE(-7.77), SIMDE_BFLOAT16_VALUE(1.39), + SIMDE_BFLOAT16_VALUE(-3.07), SIMDE_BFLOAT16_VALUE(-3.61), SIMDE_BFLOAT16_VALUE(1.98), SIMDE_BFLOAT16_VALUE(-7.55), + SIMDE_BFLOAT16_VALUE(-4.89), SIMDE_BFLOAT16_VALUE(2.58), SIMDE_BFLOAT16_VALUE(-1.82), SIMDE_BFLOAT16_VALUE(-7.17), + SIMDE_BFLOAT16_VALUE(8.34), SIMDE_BFLOAT16_VALUE(6.72), SIMDE_BFLOAT16_VALUE(-7.10), SIMDE_BFLOAT16_VALUE(-4.64), + SIMDE_BFLOAT16_VALUE(9.47), SIMDE_BFLOAT16_VALUE(4.04), SIMDE_BFLOAT16_VALUE(0.95), SIMDE_BFLOAT16_VALUE(-6.12), + SIMDE_BFLOAT16_VALUE(-4.02), SIMDE_BFLOAT16_VALUE(-8.97), SIMDE_BFLOAT16_VALUE(-5.84), SIMDE_BFLOAT16_VALUE(5.81) }, + { { SIMDE_BFLOAT16_VALUE(0.77), SIMDE_BFLOAT16_VALUE(-4.96), SIMDE_BFLOAT16_VALUE(4.32), SIMDE_BFLOAT16_VALUE(7.52), + SIMDE_BFLOAT16_VALUE(4.70), SIMDE_BFLOAT16_VALUE(1.33), SIMDE_BFLOAT16_VALUE(-9.47), SIMDE_BFLOAT16_VALUE(7.32) }, + { SIMDE_BFLOAT16_VALUE(-3.23), SIMDE_BFLOAT16_VALUE(0.61), SIMDE_BFLOAT16_VALUE(-7.77), SIMDE_BFLOAT16_VALUE(1.39), + SIMDE_BFLOAT16_VALUE(-3.07), SIMDE_BFLOAT16_VALUE(-3.61), SIMDE_BFLOAT16_VALUE(1.98), SIMDE_BFLOAT16_VALUE(-7.55) }, + { SIMDE_BFLOAT16_VALUE(-4.89), SIMDE_BFLOAT16_VALUE(2.58), SIMDE_BFLOAT16_VALUE(-1.82), SIMDE_BFLOAT16_VALUE(-7.17), + SIMDE_BFLOAT16_VALUE(8.34), SIMDE_BFLOAT16_VALUE(6.72), SIMDE_BFLOAT16_VALUE(-7.10), SIMDE_BFLOAT16_VALUE(-4.64) }, + { SIMDE_BFLOAT16_VALUE(9.47), SIMDE_BFLOAT16_VALUE(4.04), SIMDE_BFLOAT16_VALUE(0.95), SIMDE_BFLOAT16_VALUE(-6.12), + SIMDE_BFLOAT16_VALUE(-4.02), SIMDE_BFLOAT16_VALUE(-8.97), SIMDE_BFLOAT16_VALUE(-5.84), SIMDE_BFLOAT16_VALUE(5.81) } } }, + { { SIMDE_BFLOAT16_VALUE(5.50), SIMDE_BFLOAT16_VALUE(5.24), SIMDE_BFLOAT16_VALUE(8.86), SIMDE_BFLOAT16_VALUE(4.11), + SIMDE_BFLOAT16_VALUE(-9.23), SIMDE_BFLOAT16_VALUE(-5.26), SIMDE_BFLOAT16_VALUE(2.44), SIMDE_BFLOAT16_VALUE(6.43), + SIMDE_BFLOAT16_VALUE(1.99), SIMDE_BFLOAT16_VALUE(3.20), SIMDE_BFLOAT16_VALUE(8.92), SIMDE_BFLOAT16_VALUE(-1.64), + SIMDE_BFLOAT16_VALUE(7.53), SIMDE_BFLOAT16_VALUE(-2.88), SIMDE_BFLOAT16_VALUE(1.19), SIMDE_BFLOAT16_VALUE(-2.26), + SIMDE_BFLOAT16_VALUE(7.85), SIMDE_BFLOAT16_VALUE(-3.73), SIMDE_BFLOAT16_VALUE(-6.25), SIMDE_BFLOAT16_VALUE(-5.78), + SIMDE_BFLOAT16_VALUE(-4.64), SIMDE_BFLOAT16_VALUE(-6.97), SIMDE_BFLOAT16_VALUE(-3.81), SIMDE_BFLOAT16_VALUE(-1.47), + SIMDE_BFLOAT16_VALUE(8.97), SIMDE_BFLOAT16_VALUE(-3.54), SIMDE_BFLOAT16_VALUE(-8.46), SIMDE_BFLOAT16_VALUE(-0.59), + SIMDE_BFLOAT16_VALUE(1.21), SIMDE_BFLOAT16_VALUE(-0.55), SIMDE_BFLOAT16_VALUE(-3.94), SIMDE_BFLOAT16_VALUE(-5.49) }, + { { SIMDE_BFLOAT16_VALUE(5.50), SIMDE_BFLOAT16_VALUE(5.24), SIMDE_BFLOAT16_VALUE(8.86), SIMDE_BFLOAT16_VALUE(4.11), + SIMDE_BFLOAT16_VALUE(-9.23), SIMDE_BFLOAT16_VALUE(-5.26), SIMDE_BFLOAT16_VALUE(2.44), SIMDE_BFLOAT16_VALUE(6.43) }, + { SIMDE_BFLOAT16_VALUE(1.99), SIMDE_BFLOAT16_VALUE(3.20), SIMDE_BFLOAT16_VALUE(8.92), SIMDE_BFLOAT16_VALUE(-1.64), + SIMDE_BFLOAT16_VALUE(7.53), SIMDE_BFLOAT16_VALUE(-2.88), SIMDE_BFLOAT16_VALUE(1.19), SIMDE_BFLOAT16_VALUE(-2.26) }, + { SIMDE_BFLOAT16_VALUE(7.85), SIMDE_BFLOAT16_VALUE(-3.73), SIMDE_BFLOAT16_VALUE(-6.25), SIMDE_BFLOAT16_VALUE(-5.78), + SIMDE_BFLOAT16_VALUE(-4.64), SIMDE_BFLOAT16_VALUE(-6.97), SIMDE_BFLOAT16_VALUE(-3.81), SIMDE_BFLOAT16_VALUE(-1.47) }, + { SIMDE_BFLOAT16_VALUE(8.97), SIMDE_BFLOAT16_VALUE(-3.54), SIMDE_BFLOAT16_VALUE(-8.46), SIMDE_BFLOAT16_VALUE(-0.59), + SIMDE_BFLOAT16_VALUE(1.21), SIMDE_BFLOAT16_VALUE(-0.55), SIMDE_BFLOAT16_VALUE(-3.94), SIMDE_BFLOAT16_VALUE(-5.49) } } }, + { { SIMDE_BFLOAT16_VALUE(0.84), SIMDE_BFLOAT16_VALUE(1.66), SIMDE_BFLOAT16_VALUE(-0.69), SIMDE_BFLOAT16_VALUE(0.03), + SIMDE_BFLOAT16_VALUE(-9.89), SIMDE_BFLOAT16_VALUE(-1.33), SIMDE_BFLOAT16_VALUE(2.77), SIMDE_BFLOAT16_VALUE(2.16), + SIMDE_BFLOAT16_VALUE(-9.13), SIMDE_BFLOAT16_VALUE(7.90), SIMDE_BFLOAT16_VALUE(9.03), SIMDE_BFLOAT16_VALUE(2.79), + SIMDE_BFLOAT16_VALUE(-8.16), SIMDE_BFLOAT16_VALUE(-1.11), SIMDE_BFLOAT16_VALUE(2.16), SIMDE_BFLOAT16_VALUE(5.32), + SIMDE_BFLOAT16_VALUE(9.71), SIMDE_BFLOAT16_VALUE(-7.58), SIMDE_BFLOAT16_VALUE(-0.85), SIMDE_BFLOAT16_VALUE(-8.57), + SIMDE_BFLOAT16_VALUE(1.14), SIMDE_BFLOAT16_VALUE(-0.42), SIMDE_BFLOAT16_VALUE(3.32), SIMDE_BFLOAT16_VALUE(6.97), + SIMDE_BFLOAT16_VALUE(1.24), SIMDE_BFLOAT16_VALUE(-8.74), SIMDE_BFLOAT16_VALUE(-8.75), SIMDE_BFLOAT16_VALUE(-0.72), + SIMDE_BFLOAT16_VALUE(5.61), SIMDE_BFLOAT16_VALUE(4.15), SIMDE_BFLOAT16_VALUE(9.62), SIMDE_BFLOAT16_VALUE(-3.79) }, + { { SIMDE_BFLOAT16_VALUE(0.84), SIMDE_BFLOAT16_VALUE(1.66), SIMDE_BFLOAT16_VALUE(-0.69), SIMDE_BFLOAT16_VALUE(0.03), + SIMDE_BFLOAT16_VALUE(-9.89), SIMDE_BFLOAT16_VALUE(-1.33), SIMDE_BFLOAT16_VALUE(2.77), SIMDE_BFLOAT16_VALUE(2.16) }, + { SIMDE_BFLOAT16_VALUE(-9.13), SIMDE_BFLOAT16_VALUE(7.90), SIMDE_BFLOAT16_VALUE(9.03), SIMDE_BFLOAT16_VALUE(2.79), + SIMDE_BFLOAT16_VALUE(-8.16), SIMDE_BFLOAT16_VALUE(-1.11), SIMDE_BFLOAT16_VALUE(2.16), SIMDE_BFLOAT16_VALUE(5.32) }, + { SIMDE_BFLOAT16_VALUE(9.71), SIMDE_BFLOAT16_VALUE(-7.58), SIMDE_BFLOAT16_VALUE(-0.85), SIMDE_BFLOAT16_VALUE(-8.57), + SIMDE_BFLOAT16_VALUE(1.14), SIMDE_BFLOAT16_VALUE(-0.42), SIMDE_BFLOAT16_VALUE(3.32), SIMDE_BFLOAT16_VALUE(6.97) }, + { SIMDE_BFLOAT16_VALUE(1.24), SIMDE_BFLOAT16_VALUE(-8.74), SIMDE_BFLOAT16_VALUE(-8.75), SIMDE_BFLOAT16_VALUE(-0.72), + SIMDE_BFLOAT16_VALUE(5.61), SIMDE_BFLOAT16_VALUE(4.15), SIMDE_BFLOAT16_VALUE(9.62), SIMDE_BFLOAT16_VALUE(-3.79) } } }, + { { SIMDE_BFLOAT16_VALUE(7.00), SIMDE_BFLOAT16_VALUE(-5.79), SIMDE_BFLOAT16_VALUE(-0.80), SIMDE_BFLOAT16_VALUE(8.08), + SIMDE_BFLOAT16_VALUE(-7.63), SIMDE_BFLOAT16_VALUE(8.06), SIMDE_BFLOAT16_VALUE(3.73), SIMDE_BFLOAT16_VALUE(5.38), + SIMDE_BFLOAT16_VALUE(-8.76), SIMDE_BFLOAT16_VALUE(-3.66), SIMDE_BFLOAT16_VALUE(-1.79), SIMDE_BFLOAT16_VALUE(4.39), + SIMDE_BFLOAT16_VALUE(4.40), SIMDE_BFLOAT16_VALUE(-1.74), SIMDE_BFLOAT16_VALUE(6.02), SIMDE_BFLOAT16_VALUE(1.11), + SIMDE_BFLOAT16_VALUE(5.43), SIMDE_BFLOAT16_VALUE(-1.01), SIMDE_BFLOAT16_VALUE(1.85), SIMDE_BFLOAT16_VALUE(-2.65), + SIMDE_BFLOAT16_VALUE(-9.84), SIMDE_BFLOAT16_VALUE(-3.62), SIMDE_BFLOAT16_VALUE(8.59), SIMDE_BFLOAT16_VALUE(-1.78), + SIMDE_BFLOAT16_VALUE(-5.54), SIMDE_BFLOAT16_VALUE(2.82), SIMDE_BFLOAT16_VALUE(8.26), SIMDE_BFLOAT16_VALUE(9.23), + SIMDE_BFLOAT16_VALUE(0.57), SIMDE_BFLOAT16_VALUE(1.65), SIMDE_BFLOAT16_VALUE(6.48), SIMDE_BFLOAT16_VALUE(6.43) }, + { { SIMDE_BFLOAT16_VALUE(7.00), SIMDE_BFLOAT16_VALUE(-5.79), SIMDE_BFLOAT16_VALUE(-0.80), SIMDE_BFLOAT16_VALUE(8.08), + SIMDE_BFLOAT16_VALUE(-7.63), SIMDE_BFLOAT16_VALUE(8.06), SIMDE_BFLOAT16_VALUE(3.73), SIMDE_BFLOAT16_VALUE(5.38) }, + { SIMDE_BFLOAT16_VALUE(-8.76), SIMDE_BFLOAT16_VALUE(-3.66), SIMDE_BFLOAT16_VALUE(-1.79), SIMDE_BFLOAT16_VALUE(4.39), + SIMDE_BFLOAT16_VALUE(4.40), SIMDE_BFLOAT16_VALUE(-1.74), SIMDE_BFLOAT16_VALUE(6.02), SIMDE_BFLOAT16_VALUE(1.11) }, + { SIMDE_BFLOAT16_VALUE(5.43), SIMDE_BFLOAT16_VALUE(-1.01), SIMDE_BFLOAT16_VALUE(1.85), SIMDE_BFLOAT16_VALUE(-2.65), + SIMDE_BFLOAT16_VALUE(-9.84), SIMDE_BFLOAT16_VALUE(-3.62), SIMDE_BFLOAT16_VALUE(8.59), SIMDE_BFLOAT16_VALUE(-1.78) }, + { SIMDE_BFLOAT16_VALUE(-5.54), SIMDE_BFLOAT16_VALUE(2.82), SIMDE_BFLOAT16_VALUE(8.26), SIMDE_BFLOAT16_VALUE(9.23), + SIMDE_BFLOAT16_VALUE(0.57), SIMDE_BFLOAT16_VALUE(1.65), SIMDE_BFLOAT16_VALUE(6.48), SIMDE_BFLOAT16_VALUE(6.43) } } }, + { { SIMDE_BFLOAT16_VALUE(-9.54), SIMDE_BFLOAT16_VALUE(7.35), SIMDE_BFLOAT16_VALUE(-8.55), SIMDE_BFLOAT16_VALUE(5.24), + SIMDE_BFLOAT16_VALUE(-9.39), SIMDE_BFLOAT16_VALUE(-8.81), SIMDE_BFLOAT16_VALUE(-2.52), SIMDE_BFLOAT16_VALUE(3.42), + SIMDE_BFLOAT16_VALUE(8.62), SIMDE_BFLOAT16_VALUE(-3.83), SIMDE_BFLOAT16_VALUE(-3.54), SIMDE_BFLOAT16_VALUE(0.09), + SIMDE_BFLOAT16_VALUE(5.41), SIMDE_BFLOAT16_VALUE(1.42), SIMDE_BFLOAT16_VALUE(-8.33), SIMDE_BFLOAT16_VALUE(9.12), + SIMDE_BFLOAT16_VALUE(3.57), SIMDE_BFLOAT16_VALUE(-6.64), SIMDE_BFLOAT16_VALUE(-9.86), SIMDE_BFLOAT16_VALUE(6.74), + SIMDE_BFLOAT16_VALUE(-8.50), SIMDE_BFLOAT16_VALUE(-5.99), SIMDE_BFLOAT16_VALUE(-5.00), SIMDE_BFLOAT16_VALUE(-8.11), + SIMDE_BFLOAT16_VALUE(2.43), SIMDE_BFLOAT16_VALUE(8.06), SIMDE_BFLOAT16_VALUE(8.39), SIMDE_BFLOAT16_VALUE(-5.99), + SIMDE_BFLOAT16_VALUE(-3.26), SIMDE_BFLOAT16_VALUE(-5.56), SIMDE_BFLOAT16_VALUE(-6.74), SIMDE_BFLOAT16_VALUE(-7.39) }, + { { SIMDE_BFLOAT16_VALUE(-9.54), SIMDE_BFLOAT16_VALUE(7.35), SIMDE_BFLOAT16_VALUE(-8.55), SIMDE_BFLOAT16_VALUE(5.24), + SIMDE_BFLOAT16_VALUE(-9.39), SIMDE_BFLOAT16_VALUE(-8.81), SIMDE_BFLOAT16_VALUE(-2.52), SIMDE_BFLOAT16_VALUE(3.42) }, + { SIMDE_BFLOAT16_VALUE(8.62), SIMDE_BFLOAT16_VALUE(-3.83), SIMDE_BFLOAT16_VALUE(-3.54), SIMDE_BFLOAT16_VALUE(0.09), + SIMDE_BFLOAT16_VALUE(5.41), SIMDE_BFLOAT16_VALUE(1.42), SIMDE_BFLOAT16_VALUE(-8.33), SIMDE_BFLOAT16_VALUE(9.12) }, + { SIMDE_BFLOAT16_VALUE(3.57), SIMDE_BFLOAT16_VALUE(-6.64), SIMDE_BFLOAT16_VALUE(-9.86), SIMDE_BFLOAT16_VALUE(6.74), + SIMDE_BFLOAT16_VALUE(-8.50), SIMDE_BFLOAT16_VALUE(-5.99), SIMDE_BFLOAT16_VALUE(-5.00), SIMDE_BFLOAT16_VALUE(-8.11) }, + { SIMDE_BFLOAT16_VALUE(2.43), SIMDE_BFLOAT16_VALUE(8.06), SIMDE_BFLOAT16_VALUE(8.39), SIMDE_BFLOAT16_VALUE(-5.99), + SIMDE_BFLOAT16_VALUE(-3.26), SIMDE_BFLOAT16_VALUE(-5.56), SIMDE_BFLOAT16_VALUE(-6.74), SIMDE_BFLOAT16_VALUE(-7.39) } } }, + }; + + for (size_t i = 0; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + simde_bfloat16x8x4_t r = simde_vld1q_bf16_x4(test_vec[i].buf); + simde_bfloat16x8x4_t expected = {{ + simde_vld1q_bf16(test_vec[i].expected[0]), + simde_vld1q_bf16(test_vec[i].expected[1]), + simde_vld1q_bf16(test_vec[i].expected[2]), + simde_vld1q_bf16(test_vec[i].expected[3]), + }}; + simde_test_arm_neon_assert_equal_bf16x8x4(r, expected, 1); + } + + return 0; +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -1772,6 +1874,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_u64_x4) SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_p8_x4) SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_p16_x4) SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_p64_x4) +SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_bf16_x4) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/ld2.c b/test/arm/neon/ld2.c index cd1d8113e..746a8ff75 100644 --- a/test/arm/neon/ld2.c +++ b/test/arm/neon/ld2.c @@ -2189,6 +2189,112 @@ test_simde_vld2q_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vld2_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t a[8]; + simde_bfloat16_t r[2][4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(-9.278), SIMDE_BFLOAT16_VALUE(-6.969), SIMDE_BFLOAT16_VALUE(1.663), SIMDE_BFLOAT16_VALUE(-2.545), + SIMDE_BFLOAT16_VALUE(-2.609), SIMDE_BFLOAT16_VALUE(6.118), SIMDE_BFLOAT16_VALUE(2.903), SIMDE_BFLOAT16_VALUE(-6.328) }, + { { SIMDE_BFLOAT16_VALUE(-9.278), SIMDE_BFLOAT16_VALUE(1.663), SIMDE_BFLOAT16_VALUE(-2.609), SIMDE_BFLOAT16_VALUE(2.903) }, + { SIMDE_BFLOAT16_VALUE(-6.969), SIMDE_BFLOAT16_VALUE(-2.545), SIMDE_BFLOAT16_VALUE(6.118), SIMDE_BFLOAT16_VALUE(-6.328) } } }, + { { SIMDE_BFLOAT16_VALUE(-1.322), SIMDE_BFLOAT16_VALUE(-3.593), SIMDE_BFLOAT16_VALUE(-1.637), SIMDE_BFLOAT16_VALUE(3.347), + SIMDE_BFLOAT16_VALUE(-9.161), SIMDE_BFLOAT16_VALUE(-9.575), SIMDE_BFLOAT16_VALUE(7.821), SIMDE_BFLOAT16_VALUE(3.600) }, + { { SIMDE_BFLOAT16_VALUE(-1.322), SIMDE_BFLOAT16_VALUE(-1.637), SIMDE_BFLOAT16_VALUE(-9.161), SIMDE_BFLOAT16_VALUE(7.821) }, + { SIMDE_BFLOAT16_VALUE(-3.593), SIMDE_BFLOAT16_VALUE(3.347), SIMDE_BFLOAT16_VALUE(-9.575), SIMDE_BFLOAT16_VALUE(3.600) } } }, + { { SIMDE_BFLOAT16_VALUE(-8.482), SIMDE_BFLOAT16_VALUE(-4.579), SIMDE_BFLOAT16_VALUE(-0.542), SIMDE_BFLOAT16_VALUE(-6.415), + SIMDE_BFLOAT16_VALUE(-4.808), SIMDE_BFLOAT16_VALUE(-0.746), SIMDE_BFLOAT16_VALUE(6.877), SIMDE_BFLOAT16_VALUE(-9.631) }, + { { SIMDE_BFLOAT16_VALUE(-8.482), SIMDE_BFLOAT16_VALUE(-0.542), SIMDE_BFLOAT16_VALUE(-4.808), SIMDE_BFLOAT16_VALUE(6.877) }, + { SIMDE_BFLOAT16_VALUE(-4.579), SIMDE_BFLOAT16_VALUE(-6.415), SIMDE_BFLOAT16_VALUE(-0.746), SIMDE_BFLOAT16_VALUE(-9.631) } } }, + { { SIMDE_BFLOAT16_VALUE(-7.341), SIMDE_BFLOAT16_VALUE(-3.836), SIMDE_BFLOAT16_VALUE(-0.189), SIMDE_BFLOAT16_VALUE(-2.384), + SIMDE_BFLOAT16_VALUE(2.127), SIMDE_BFLOAT16_VALUE(1.646), SIMDE_BFLOAT16_VALUE(7.168), SIMDE_BFLOAT16_VALUE(-5.215) }, + { { SIMDE_BFLOAT16_VALUE(-7.341), SIMDE_BFLOAT16_VALUE(-0.189), SIMDE_BFLOAT16_VALUE(2.127), SIMDE_BFLOAT16_VALUE(7.168) }, + { SIMDE_BFLOAT16_VALUE(-3.836), SIMDE_BFLOAT16_VALUE(-2.384), SIMDE_BFLOAT16_VALUE(1.646), SIMDE_BFLOAT16_VALUE(-5.215) } } }, + { { SIMDE_BFLOAT16_VALUE(-2.854), SIMDE_BFLOAT16_VALUE(-6.178), SIMDE_BFLOAT16_VALUE(6.962), SIMDE_BFLOAT16_VALUE(2.037), + SIMDE_BFLOAT16_VALUE(-2.141), SIMDE_BFLOAT16_VALUE(1.682), SIMDE_BFLOAT16_VALUE(-8.167), SIMDE_BFLOAT16_VALUE(-2.859) }, + { { SIMDE_BFLOAT16_VALUE(-2.854), SIMDE_BFLOAT16_VALUE(6.962), SIMDE_BFLOAT16_VALUE(-2.141), SIMDE_BFLOAT16_VALUE(-8.167) }, + { SIMDE_BFLOAT16_VALUE(-6.178), SIMDE_BFLOAT16_VALUE(2.037), SIMDE_BFLOAT16_VALUE(1.682), SIMDE_BFLOAT16_VALUE(-2.859) } } }, + { { SIMDE_BFLOAT16_VALUE(1.069), SIMDE_BFLOAT16_VALUE(6.073), SIMDE_BFLOAT16_VALUE(-7.430), SIMDE_BFLOAT16_VALUE(5.842), + SIMDE_BFLOAT16_VALUE(0.741), SIMDE_BFLOAT16_VALUE(-7.806), SIMDE_BFLOAT16_VALUE(-1.530), SIMDE_BFLOAT16_VALUE(5.652) }, + { { SIMDE_BFLOAT16_VALUE(1.069), SIMDE_BFLOAT16_VALUE(-7.430), SIMDE_BFLOAT16_VALUE(0.741), SIMDE_BFLOAT16_VALUE(-1.530) }, + { SIMDE_BFLOAT16_VALUE(6.073), SIMDE_BFLOAT16_VALUE(5.842), SIMDE_BFLOAT16_VALUE(-7.806), SIMDE_BFLOAT16_VALUE(5.652) } } }, + { { SIMDE_BFLOAT16_VALUE(2.665), SIMDE_BFLOAT16_VALUE(-0.358), SIMDE_BFLOAT16_VALUE(4.267), SIMDE_BFLOAT16_VALUE(6.043), + SIMDE_BFLOAT16_VALUE(4.497), SIMDE_BFLOAT16_VALUE(2.667), SIMDE_BFLOAT16_VALUE(7.972), SIMDE_BFLOAT16_VALUE(-6.815) }, + { { SIMDE_BFLOAT16_VALUE(2.665), SIMDE_BFLOAT16_VALUE(4.267), SIMDE_BFLOAT16_VALUE(4.497), SIMDE_BFLOAT16_VALUE(7.972) }, + { SIMDE_BFLOAT16_VALUE(-0.358), SIMDE_BFLOAT16_VALUE(6.043), SIMDE_BFLOAT16_VALUE(2.667), SIMDE_BFLOAT16_VALUE(-6.815) } } }, + { { SIMDE_BFLOAT16_VALUE(1.068), SIMDE_BFLOAT16_VALUE(3.596), SIMDE_BFLOAT16_VALUE(-8.704), SIMDE_BFLOAT16_VALUE(5.005), + SIMDE_BFLOAT16_VALUE(4.827), SIMDE_BFLOAT16_VALUE(4.545), SIMDE_BFLOAT16_VALUE(0.047), SIMDE_BFLOAT16_VALUE(2.680) }, + { { SIMDE_BFLOAT16_VALUE(1.068), SIMDE_BFLOAT16_VALUE(-8.704), SIMDE_BFLOAT16_VALUE(4.827), SIMDE_BFLOAT16_VALUE(0.047) }, + { SIMDE_BFLOAT16_VALUE(3.596), SIMDE_BFLOAT16_VALUE(5.005), SIMDE_BFLOAT16_VALUE(4.545), SIMDE_BFLOAT16_VALUE(2.680) } } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4x2_t r = simde_vld2_bf16(test_vec[i].a); + + simde_bfloat16x4x2_t expected = { + {simde_vld1_bf16(test_vec[i].r[0]), simde_vld1_bf16(test_vec[i].r[1])}}; + + simde_test_arm_neon_assert_equal_bf16x4(r.val[0], expected.val[0], 1); + simde_test_arm_neon_assert_equal_bf16x4(r.val[1], expected.val[1], 1); + } + + return 0; +} + +static int +test_simde_vld2q_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t a[16]; + simde_bfloat16_t r[2][8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 793.71), SIMDE_BFLOAT16_VALUE( 221.62), SIMDE_BFLOAT16_VALUE( 781.57), SIMDE_BFLOAT16_VALUE( -525.52), + SIMDE_BFLOAT16_VALUE( 800.99), SIMDE_BFLOAT16_VALUE( -411.87), SIMDE_BFLOAT16_VALUE( 483.99), SIMDE_BFLOAT16_VALUE( 852.73), + SIMDE_BFLOAT16_VALUE( -433.25), SIMDE_BFLOAT16_VALUE( -811.76), SIMDE_BFLOAT16_VALUE( -463.04), SIMDE_BFLOAT16_VALUE( 671.94), + SIMDE_BFLOAT16_VALUE( -60.94), SIMDE_BFLOAT16_VALUE( -434.20), SIMDE_BFLOAT16_VALUE( -263.89), SIMDE_BFLOAT16_VALUE( 754.63) }, + { { SIMDE_BFLOAT16_VALUE( 793.71), SIMDE_BFLOAT16_VALUE( 781.57), SIMDE_BFLOAT16_VALUE( 800.99), SIMDE_BFLOAT16_VALUE( 483.99), + SIMDE_BFLOAT16_VALUE( -433.25), SIMDE_BFLOAT16_VALUE( -463.04), SIMDE_BFLOAT16_VALUE( -60.94), SIMDE_BFLOAT16_VALUE( -263.89) }, + { SIMDE_BFLOAT16_VALUE( 221.62), SIMDE_BFLOAT16_VALUE( -525.52), SIMDE_BFLOAT16_VALUE( -411.87), SIMDE_BFLOAT16_VALUE( 852.73), + SIMDE_BFLOAT16_VALUE( -811.76), SIMDE_BFLOAT16_VALUE( 671.94), SIMDE_BFLOAT16_VALUE( -434.20), SIMDE_BFLOAT16_VALUE( 754.63) } } }, + { { SIMDE_BFLOAT16_VALUE( -877.85), SIMDE_BFLOAT16_VALUE( -225.98), SIMDE_BFLOAT16_VALUE( -292.03), SIMDE_BFLOAT16_VALUE( 932.32), + SIMDE_BFLOAT16_VALUE( -463.10), SIMDE_BFLOAT16_VALUE( 171.18), SIMDE_BFLOAT16_VALUE( -115.23), SIMDE_BFLOAT16_VALUE( -867.52), + SIMDE_BFLOAT16_VALUE( -182.14), SIMDE_BFLOAT16_VALUE( 874.57), SIMDE_BFLOAT16_VALUE( -306.44), SIMDE_BFLOAT16_VALUE( 180.87), + SIMDE_BFLOAT16_VALUE( -827.59), SIMDE_BFLOAT16_VALUE( -449.53), SIMDE_BFLOAT16_VALUE( -593.39), SIMDE_BFLOAT16_VALUE( 966.11) }, + { { SIMDE_BFLOAT16_VALUE( -877.85), SIMDE_BFLOAT16_VALUE( -292.03), SIMDE_BFLOAT16_VALUE( -463.10), SIMDE_BFLOAT16_VALUE( -115.23), + SIMDE_BFLOAT16_VALUE( -182.14), SIMDE_BFLOAT16_VALUE( -306.44), SIMDE_BFLOAT16_VALUE( -827.59), SIMDE_BFLOAT16_VALUE( -593.39) }, + { SIMDE_BFLOAT16_VALUE( -225.98), SIMDE_BFLOAT16_VALUE( 932.32), SIMDE_BFLOAT16_VALUE( 171.18), SIMDE_BFLOAT16_VALUE( -867.52), + SIMDE_BFLOAT16_VALUE( 874.57), SIMDE_BFLOAT16_VALUE( 180.87), SIMDE_BFLOAT16_VALUE( -449.53), SIMDE_BFLOAT16_VALUE( 966.11) } } }, + { { SIMDE_BFLOAT16_VALUE( 772.09), SIMDE_BFLOAT16_VALUE( -811.82), SIMDE_BFLOAT16_VALUE( -559.40), SIMDE_BFLOAT16_VALUE( 573.08), + SIMDE_BFLOAT16_VALUE( -223.69), SIMDE_BFLOAT16_VALUE( 924.59), SIMDE_BFLOAT16_VALUE( 425.81), SIMDE_BFLOAT16_VALUE( 343.06), + SIMDE_BFLOAT16_VALUE( -887.17), SIMDE_BFLOAT16_VALUE( 962.76), SIMDE_BFLOAT16_VALUE( 15.01), SIMDE_BFLOAT16_VALUE( 51.89), + SIMDE_BFLOAT16_VALUE( -471.44), SIMDE_BFLOAT16_VALUE( 751.11), SIMDE_BFLOAT16_VALUE( -193.48), SIMDE_BFLOAT16_VALUE( -349.29) }, + { { SIMDE_BFLOAT16_VALUE( 772.09), SIMDE_BFLOAT16_VALUE( -559.40), SIMDE_BFLOAT16_VALUE( -223.69), SIMDE_BFLOAT16_VALUE( 425.81), + SIMDE_BFLOAT16_VALUE( -887.17), SIMDE_BFLOAT16_VALUE( 15.01), SIMDE_BFLOAT16_VALUE( -471.44), SIMDE_BFLOAT16_VALUE( -193.48) }, + { SIMDE_BFLOAT16_VALUE( -811.82), SIMDE_BFLOAT16_VALUE( 573.08), SIMDE_BFLOAT16_VALUE( 924.59), SIMDE_BFLOAT16_VALUE( 343.06), + SIMDE_BFLOAT16_VALUE( 962.76), SIMDE_BFLOAT16_VALUE( 51.89), SIMDE_BFLOAT16_VALUE( 751.11), SIMDE_BFLOAT16_VALUE( -349.29) } } }, + { { SIMDE_BFLOAT16_VALUE( -474.87), SIMDE_BFLOAT16_VALUE( 514.49), SIMDE_BFLOAT16_VALUE( -416.97), SIMDE_BFLOAT16_VALUE( 62.03), + SIMDE_BFLOAT16_VALUE( -314.33), SIMDE_BFLOAT16_VALUE( 467.80), SIMDE_BFLOAT16_VALUE( 194.51), SIMDE_BFLOAT16_VALUE( 503.53), + SIMDE_BFLOAT16_VALUE( 342.37), SIMDE_BFLOAT16_VALUE( 888.07), SIMDE_BFLOAT16_VALUE( -315.60), SIMDE_BFLOAT16_VALUE( 514.77), + SIMDE_BFLOAT16_VALUE( -561.46), SIMDE_BFLOAT16_VALUE( 91.01), SIMDE_BFLOAT16_VALUE( 480.89), SIMDE_BFLOAT16_VALUE( -789.37) }, + { { SIMDE_BFLOAT16_VALUE( -474.87), SIMDE_BFLOAT16_VALUE( -416.97), SIMDE_BFLOAT16_VALUE( -314.33), SIMDE_BFLOAT16_VALUE( 194.51), + SIMDE_BFLOAT16_VALUE( 342.37), SIMDE_BFLOAT16_VALUE( -315.60), SIMDE_BFLOAT16_VALUE( -561.46), SIMDE_BFLOAT16_VALUE( 480.89) }, + { SIMDE_BFLOAT16_VALUE( 514.49), SIMDE_BFLOAT16_VALUE( 62.03), SIMDE_BFLOAT16_VALUE( 467.80), SIMDE_BFLOAT16_VALUE( 503.53), + SIMDE_BFLOAT16_VALUE( 888.07), SIMDE_BFLOAT16_VALUE( 514.77), SIMDE_BFLOAT16_VALUE( 91.01), SIMDE_BFLOAT16_VALUE( -789.37) } } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8x2_t r = simde_vld2q_bf16(test_vec[i].a); + + simde_bfloat16x8x2_t expected = { + {simde_vld1q_bf16(test_vec[i].r[0]), simde_vld1q_bf16(test_vec[i].r[1])}}; + + simde_test_arm_neon_assert_equal_bf16x8(r.val[0], expected.val[0], INT_MAX); + simde_test_arm_neon_assert_equal_bf16x8(r.val[1], expected.val[1], INT_MAX); + } + + return 0; +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -2221,6 +2327,8 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vld2_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vld2q_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vld2q_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vld2q_p64) +SIMDE_TEST_FUNC_LIST_ENTRY(vld2_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vld2q_bf16) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/ld2_dup.c b/test/arm/neon/ld2_dup.c index 49a954c80..783a7830b 100644 --- a/test/arm/neon/ld2_dup.c +++ b/test/arm/neon/ld2_dup.c @@ -1748,6 +1748,128 @@ test_simde_vld2q_dup_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vld2_dup_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t a[2]; + simde_bfloat16_t unused[2]; + simde_bfloat16_t r[2][4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(39.04), SIMDE_BFLOAT16_VALUE(10.61) }, + { SIMDE_BFLOAT16_VALUE(-41.47), SIMDE_BFLOAT16_VALUE(28.54)}, + { { SIMDE_BFLOAT16_VALUE(39.04), SIMDE_BFLOAT16_VALUE(39.04), SIMDE_BFLOAT16_VALUE(39.04), SIMDE_BFLOAT16_VALUE(39.04) }, + { SIMDE_BFLOAT16_VALUE(10.61), SIMDE_BFLOAT16_VALUE(10.61), SIMDE_BFLOAT16_VALUE(10.61), SIMDE_BFLOAT16_VALUE(10.61) } } }, + { { SIMDE_BFLOAT16_VALUE(-26.09), SIMDE_BFLOAT16_VALUE(-32.09) }, + { SIMDE_BFLOAT16_VALUE(-21.60), SIMDE_BFLOAT16_VALUE(-5.65)}, + { { SIMDE_BFLOAT16_VALUE(-26.09), SIMDE_BFLOAT16_VALUE(-26.09), SIMDE_BFLOAT16_VALUE(-26.09), SIMDE_BFLOAT16_VALUE(-26.09) }, + { SIMDE_BFLOAT16_VALUE(-32.09), SIMDE_BFLOAT16_VALUE(-32.09), SIMDE_BFLOAT16_VALUE(-32.09), SIMDE_BFLOAT16_VALUE(-32.09) } } }, + { { SIMDE_BFLOAT16_VALUE(27.51), SIMDE_BFLOAT16_VALUE(-41.83) }, + { SIMDE_BFLOAT16_VALUE(21.45), SIMDE_BFLOAT16_VALUE(9.79)}, + { { SIMDE_BFLOAT16_VALUE(27.51), SIMDE_BFLOAT16_VALUE(27.51), SIMDE_BFLOAT16_VALUE(27.51), SIMDE_BFLOAT16_VALUE(27.51) }, + { SIMDE_BFLOAT16_VALUE(-41.83), SIMDE_BFLOAT16_VALUE(-41.83), SIMDE_BFLOAT16_VALUE(-41.83), SIMDE_BFLOAT16_VALUE(-41.83) } } }, + { { SIMDE_BFLOAT16_VALUE(-19.53), SIMDE_BFLOAT16_VALUE(-7.90) }, + { SIMDE_BFLOAT16_VALUE(-3.62), SIMDE_BFLOAT16_VALUE(17.75)}, + { { SIMDE_BFLOAT16_VALUE(-19.53), SIMDE_BFLOAT16_VALUE(-19.53), SIMDE_BFLOAT16_VALUE(-19.53), SIMDE_BFLOAT16_VALUE(-19.53) }, + { SIMDE_BFLOAT16_VALUE(-7.90), SIMDE_BFLOAT16_VALUE(-7.90), SIMDE_BFLOAT16_VALUE(-7.90), SIMDE_BFLOAT16_VALUE(-7.90) } } }, + { { SIMDE_BFLOAT16_VALUE(-22.86), SIMDE_BFLOAT16_VALUE(5.30) }, + { SIMDE_BFLOAT16_VALUE(-42.71), SIMDE_BFLOAT16_VALUE(-2.30)}, + { { SIMDE_BFLOAT16_VALUE(-22.86), SIMDE_BFLOAT16_VALUE(-22.86), SIMDE_BFLOAT16_VALUE(-22.86), SIMDE_BFLOAT16_VALUE(-22.86) }, + { SIMDE_BFLOAT16_VALUE(5.30), SIMDE_BFLOAT16_VALUE(5.30), SIMDE_BFLOAT16_VALUE(5.30), SIMDE_BFLOAT16_VALUE(5.30) } } }, + { { SIMDE_BFLOAT16_VALUE(4.74), SIMDE_BFLOAT16_VALUE(43.69) }, + { SIMDE_BFLOAT16_VALUE(-49.64), SIMDE_BFLOAT16_VALUE(-29.99)}, + { { SIMDE_BFLOAT16_VALUE(4.74), SIMDE_BFLOAT16_VALUE(4.74), SIMDE_BFLOAT16_VALUE(4.74), SIMDE_BFLOAT16_VALUE(4.74) }, + { SIMDE_BFLOAT16_VALUE(43.69), SIMDE_BFLOAT16_VALUE(43.69), SIMDE_BFLOAT16_VALUE(43.69), SIMDE_BFLOAT16_VALUE(43.69) } } }, + { { SIMDE_BFLOAT16_VALUE(-1.69), SIMDE_BFLOAT16_VALUE(-25.30) }, + { SIMDE_BFLOAT16_VALUE(4.77), SIMDE_BFLOAT16_VALUE(22.66)}, + { { SIMDE_BFLOAT16_VALUE(-1.69), SIMDE_BFLOAT16_VALUE(-1.69), SIMDE_BFLOAT16_VALUE(-1.69), SIMDE_BFLOAT16_VALUE(-1.69) }, + { SIMDE_BFLOAT16_VALUE(-25.30), SIMDE_BFLOAT16_VALUE(-25.30), SIMDE_BFLOAT16_VALUE(-25.30), SIMDE_BFLOAT16_VALUE(-25.30) } } }, + { { SIMDE_BFLOAT16_VALUE(45.42), SIMDE_BFLOAT16_VALUE(-42.46) }, + { SIMDE_BFLOAT16_VALUE(-4.86), SIMDE_BFLOAT16_VALUE(42.78)}, + { { SIMDE_BFLOAT16_VALUE(45.42), SIMDE_BFLOAT16_VALUE(45.42), SIMDE_BFLOAT16_VALUE(45.42), SIMDE_BFLOAT16_VALUE(45.42) }, + { SIMDE_BFLOAT16_VALUE(-42.46), SIMDE_BFLOAT16_VALUE(-42.46), SIMDE_BFLOAT16_VALUE(-42.46), SIMDE_BFLOAT16_VALUE(-42.46) } } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4x2_t r = simde_vld2_dup_bf16(test_vec[i].a); + simde_bfloat16x4x2_t expected = { + {simde_vld1_bf16(test_vec[i].r[0]), simde_vld1_bf16(test_vec[i].r[1])}}; + + simde_test_arm_neon_assert_equal_bf16x4(r.val[0], expected.val[0], INT_MAX); + simde_test_arm_neon_assert_equal_bf16x4(r.val[1], expected.val[1], INT_MAX); + } + + return 0; +} + +static int +test_simde_vld2q_dup_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t a[2]; + simde_bfloat16_t unused[2]; + simde_bfloat16_t r[2][8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(44.20), SIMDE_BFLOAT16_VALUE(24.16) }, + { SIMDE_BFLOAT16_VALUE(-44.99), SIMDE_BFLOAT16_VALUE(0.06)}, + { { SIMDE_BFLOAT16_VALUE(44.20), SIMDE_BFLOAT16_VALUE(44.20), SIMDE_BFLOAT16_VALUE(44.20), SIMDE_BFLOAT16_VALUE(44.20), + SIMDE_BFLOAT16_VALUE(44.20), SIMDE_BFLOAT16_VALUE(44.20), SIMDE_BFLOAT16_VALUE(44.20), SIMDE_BFLOAT16_VALUE(44.20) }, + { SIMDE_BFLOAT16_VALUE(24.16), SIMDE_BFLOAT16_VALUE(24.16), SIMDE_BFLOAT16_VALUE(24.16), SIMDE_BFLOAT16_VALUE(24.16), + SIMDE_BFLOAT16_VALUE(24.16), SIMDE_BFLOAT16_VALUE(24.16), SIMDE_BFLOAT16_VALUE(24.16), SIMDE_BFLOAT16_VALUE(24.16) } } }, + { { SIMDE_BFLOAT16_VALUE(49.42), SIMDE_BFLOAT16_VALUE(2.99) }, + { SIMDE_BFLOAT16_VALUE(-44.29), SIMDE_BFLOAT16_VALUE(-47.80)}, + { { SIMDE_BFLOAT16_VALUE(49.42), SIMDE_BFLOAT16_VALUE(49.42), SIMDE_BFLOAT16_VALUE(49.42), SIMDE_BFLOAT16_VALUE(49.42), + SIMDE_BFLOAT16_VALUE(49.42), SIMDE_BFLOAT16_VALUE(49.42), SIMDE_BFLOAT16_VALUE(49.42), SIMDE_BFLOAT16_VALUE(49.42) }, + { SIMDE_BFLOAT16_VALUE(2.99), SIMDE_BFLOAT16_VALUE(2.99), SIMDE_BFLOAT16_VALUE(2.99), SIMDE_BFLOAT16_VALUE(2.99), + SIMDE_BFLOAT16_VALUE(2.99), SIMDE_BFLOAT16_VALUE(2.99), SIMDE_BFLOAT16_VALUE(2.99), SIMDE_BFLOAT16_VALUE(2.99) } } }, + { { SIMDE_BFLOAT16_VALUE(-4.29), SIMDE_BFLOAT16_VALUE(-21.75) }, + { SIMDE_BFLOAT16_VALUE(18.84), SIMDE_BFLOAT16_VALUE(47.44)}, + { { SIMDE_BFLOAT16_VALUE(-4.29), SIMDE_BFLOAT16_VALUE(-4.29), SIMDE_BFLOAT16_VALUE(-4.29), SIMDE_BFLOAT16_VALUE(-4.29), + SIMDE_BFLOAT16_VALUE(-4.29), SIMDE_BFLOAT16_VALUE(-4.29), SIMDE_BFLOAT16_VALUE(-4.29), SIMDE_BFLOAT16_VALUE(-4.29) }, + { SIMDE_BFLOAT16_VALUE(-21.75), SIMDE_BFLOAT16_VALUE(-21.75), SIMDE_BFLOAT16_VALUE(-21.75), SIMDE_BFLOAT16_VALUE(-21.75), + SIMDE_BFLOAT16_VALUE(-21.75), SIMDE_BFLOAT16_VALUE(-21.75), SIMDE_BFLOAT16_VALUE(-21.75), SIMDE_BFLOAT16_VALUE(-21.75) } } }, + { { SIMDE_BFLOAT16_VALUE(14.92), SIMDE_BFLOAT16_VALUE(32.44) }, + { SIMDE_BFLOAT16_VALUE(32.42), SIMDE_BFLOAT16_VALUE(-11.78)}, + { { SIMDE_BFLOAT16_VALUE(14.92), SIMDE_BFLOAT16_VALUE(14.92), SIMDE_BFLOAT16_VALUE(14.92), SIMDE_BFLOAT16_VALUE(14.92), + SIMDE_BFLOAT16_VALUE(14.92), SIMDE_BFLOAT16_VALUE(14.92), SIMDE_BFLOAT16_VALUE(14.92), SIMDE_BFLOAT16_VALUE(14.92) }, + { SIMDE_BFLOAT16_VALUE(32.44), SIMDE_BFLOAT16_VALUE(32.44), SIMDE_BFLOAT16_VALUE(32.44), SIMDE_BFLOAT16_VALUE(32.44), + SIMDE_BFLOAT16_VALUE(32.44), SIMDE_BFLOAT16_VALUE(32.44), SIMDE_BFLOAT16_VALUE(32.44), SIMDE_BFLOAT16_VALUE(32.44) } } }, + { { SIMDE_BFLOAT16_VALUE(-15.04), SIMDE_BFLOAT16_VALUE(-22.71) }, + { SIMDE_BFLOAT16_VALUE(21.86), SIMDE_BFLOAT16_VALUE(-1.79)}, + { { SIMDE_BFLOAT16_VALUE(-15.04), SIMDE_BFLOAT16_VALUE(-15.04), SIMDE_BFLOAT16_VALUE(-15.04), SIMDE_BFLOAT16_VALUE(-15.04), + SIMDE_BFLOAT16_VALUE(-15.04), SIMDE_BFLOAT16_VALUE(-15.04), SIMDE_BFLOAT16_VALUE(-15.04), SIMDE_BFLOAT16_VALUE(-15.04) }, + { SIMDE_BFLOAT16_VALUE(-22.71), SIMDE_BFLOAT16_VALUE(-22.71), SIMDE_BFLOAT16_VALUE(-22.71), SIMDE_BFLOAT16_VALUE(-22.71), + SIMDE_BFLOAT16_VALUE(-22.71), SIMDE_BFLOAT16_VALUE(-22.71), SIMDE_BFLOAT16_VALUE(-22.71), SIMDE_BFLOAT16_VALUE(-22.71) } } }, + { { SIMDE_BFLOAT16_VALUE(2.97), SIMDE_BFLOAT16_VALUE(23.53) }, + { SIMDE_BFLOAT16_VALUE(-46.16), SIMDE_BFLOAT16_VALUE(23.15)}, + { { SIMDE_BFLOAT16_VALUE(2.97), SIMDE_BFLOAT16_VALUE(2.97), SIMDE_BFLOAT16_VALUE(2.97), SIMDE_BFLOAT16_VALUE(2.97), + SIMDE_BFLOAT16_VALUE(2.97), SIMDE_BFLOAT16_VALUE(2.97), SIMDE_BFLOAT16_VALUE(2.97), SIMDE_BFLOAT16_VALUE(2.97) }, + { SIMDE_BFLOAT16_VALUE(23.53), SIMDE_BFLOAT16_VALUE(23.53), SIMDE_BFLOAT16_VALUE(23.53), SIMDE_BFLOAT16_VALUE(23.53), + SIMDE_BFLOAT16_VALUE(23.53), SIMDE_BFLOAT16_VALUE(23.53), SIMDE_BFLOAT16_VALUE(23.53), SIMDE_BFLOAT16_VALUE(23.53) } } }, + { { SIMDE_BFLOAT16_VALUE(9.52), SIMDE_BFLOAT16_VALUE(-32.92) }, + { SIMDE_BFLOAT16_VALUE(24.32), SIMDE_BFLOAT16_VALUE(39.39)}, + { { SIMDE_BFLOAT16_VALUE(9.52), SIMDE_BFLOAT16_VALUE(9.52), SIMDE_BFLOAT16_VALUE(9.52), SIMDE_BFLOAT16_VALUE(9.52), + SIMDE_BFLOAT16_VALUE(9.52), SIMDE_BFLOAT16_VALUE(9.52), SIMDE_BFLOAT16_VALUE(9.52), SIMDE_BFLOAT16_VALUE(9.52) }, + { SIMDE_BFLOAT16_VALUE(-32.92), SIMDE_BFLOAT16_VALUE(-32.92), SIMDE_BFLOAT16_VALUE(-32.92), SIMDE_BFLOAT16_VALUE(-32.92), + SIMDE_BFLOAT16_VALUE(-32.92), SIMDE_BFLOAT16_VALUE(-32.92), SIMDE_BFLOAT16_VALUE(-32.92), SIMDE_BFLOAT16_VALUE(-32.92) } } }, + { { SIMDE_BFLOAT16_VALUE(-26.46), SIMDE_BFLOAT16_VALUE(24.31) }, + { SIMDE_BFLOAT16_VALUE(14.82), SIMDE_BFLOAT16_VALUE(-40.92)}, + { { SIMDE_BFLOAT16_VALUE(-26.46), SIMDE_BFLOAT16_VALUE(-26.46), SIMDE_BFLOAT16_VALUE(-26.46), SIMDE_BFLOAT16_VALUE(-26.46), + SIMDE_BFLOAT16_VALUE(-26.46), SIMDE_BFLOAT16_VALUE(-26.46), SIMDE_BFLOAT16_VALUE(-26.46), SIMDE_BFLOAT16_VALUE(-26.46) }, + { SIMDE_BFLOAT16_VALUE(24.31), SIMDE_BFLOAT16_VALUE(24.31), SIMDE_BFLOAT16_VALUE(24.31), SIMDE_BFLOAT16_VALUE(24.31), + SIMDE_BFLOAT16_VALUE(24.31), SIMDE_BFLOAT16_VALUE(24.31), SIMDE_BFLOAT16_VALUE(24.31), SIMDE_BFLOAT16_VALUE(24.31) } } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8x2_t r = simde_vld2q_dup_bf16(test_vec[i].a); + simde_bfloat16x8x2_t expected = { + {simde_vld1q_bf16(test_vec[i].r[0]), simde_vld1q_bf16(test_vec[i].r[1])}}; + + simde_test_arm_neon_assert_equal_bf16x8(r.val[0], expected.val[0], INT_MAX); + simde_test_arm_neon_assert_equal_bf16x8(r.val[1], expected.val[1], INT_MAX); + } + + return 0; +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -1780,6 +1902,8 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vld2_dup_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vld2q_dup_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vld2q_dup_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vld2q_dup_p64) +SIMDE_TEST_FUNC_LIST_ENTRY(vld2_dup_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vld2q_dup_bf16) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/ld2_lane.c b/test/arm/neon/ld2_lane.c index 3f7f03af9..5292f6e17 100644 --- a/test/arm/neon/ld2_lane.c +++ b/test/arm/neon/ld2_lane.c @@ -1984,6 +1984,150 @@ test_simde_vld2q_lane_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vld2_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t src[2][4]; + simde_bfloat16_t buf[2]; + simde_bfloat16_t r[2][4]; + } test_vec[] = { + { { { SIMDE_BFLOAT16_VALUE(-45.80), SIMDE_BFLOAT16_VALUE(29.77), SIMDE_BFLOAT16_VALUE(44.10), SIMDE_BFLOAT16_VALUE(-17.29) }, + { SIMDE_BFLOAT16_VALUE(-34.30), SIMDE_BFLOAT16_VALUE(-46.41), SIMDE_BFLOAT16_VALUE(-43.15), SIMDE_BFLOAT16_VALUE(-30.34) } }, + { SIMDE_BFLOAT16_VALUE(-16.64), SIMDE_BFLOAT16_VALUE(-13.70)}, + { { SIMDE_BFLOAT16_VALUE(-16.64), SIMDE_BFLOAT16_VALUE(29.77), SIMDE_BFLOAT16_VALUE(44.10), SIMDE_BFLOAT16_VALUE(-17.29) }, + { SIMDE_BFLOAT16_VALUE(-13.70), SIMDE_BFLOAT16_VALUE(-46.41), SIMDE_BFLOAT16_VALUE(-43.15), SIMDE_BFLOAT16_VALUE(-30.34) } } }, + { { { SIMDE_BFLOAT16_VALUE(-31.49), SIMDE_BFLOAT16_VALUE(-3.02), SIMDE_BFLOAT16_VALUE(4.73), SIMDE_BFLOAT16_VALUE(29.19) }, + { SIMDE_BFLOAT16_VALUE(-6.51), SIMDE_BFLOAT16_VALUE(-6.97), SIMDE_BFLOAT16_VALUE(-24.86), SIMDE_BFLOAT16_VALUE(20.04) } }, + { SIMDE_BFLOAT16_VALUE(4.78), SIMDE_BFLOAT16_VALUE(-24.76)}, + { { SIMDE_BFLOAT16_VALUE(-31.49), SIMDE_BFLOAT16_VALUE(4.78), SIMDE_BFLOAT16_VALUE(4.73), SIMDE_BFLOAT16_VALUE(29.19) }, + { SIMDE_BFLOAT16_VALUE(-6.51), SIMDE_BFLOAT16_VALUE(-24.76), SIMDE_BFLOAT16_VALUE(-24.86), SIMDE_BFLOAT16_VALUE(20.04) } } }, + { { { SIMDE_BFLOAT16_VALUE(-33.05), SIMDE_BFLOAT16_VALUE(44.60), SIMDE_BFLOAT16_VALUE(44.07), SIMDE_BFLOAT16_VALUE(-42.37) }, + { SIMDE_BFLOAT16_VALUE(45.53), SIMDE_BFLOAT16_VALUE(4.23), SIMDE_BFLOAT16_VALUE(13.47), SIMDE_BFLOAT16_VALUE(2.19) } }, + { SIMDE_BFLOAT16_VALUE(-14.88), SIMDE_BFLOAT16_VALUE(-15.37)}, + { { SIMDE_BFLOAT16_VALUE(-33.05), SIMDE_BFLOAT16_VALUE(44.60), SIMDE_BFLOAT16_VALUE(-14.88), SIMDE_BFLOAT16_VALUE(-42.37) }, + { SIMDE_BFLOAT16_VALUE(45.53), SIMDE_BFLOAT16_VALUE(4.23), SIMDE_BFLOAT16_VALUE(-15.37), SIMDE_BFLOAT16_VALUE(2.19) } } }, + { { { SIMDE_BFLOAT16_VALUE(22.74), SIMDE_BFLOAT16_VALUE(-1.07), SIMDE_BFLOAT16_VALUE(48.37), SIMDE_BFLOAT16_VALUE(26.68) }, + { SIMDE_BFLOAT16_VALUE(-34.05), SIMDE_BFLOAT16_VALUE(-26.07), SIMDE_BFLOAT16_VALUE(-44.28), SIMDE_BFLOAT16_VALUE(6.92) } }, + { SIMDE_BFLOAT16_VALUE(-28.27), SIMDE_BFLOAT16_VALUE(-30.31)}, + { { SIMDE_BFLOAT16_VALUE(22.74), SIMDE_BFLOAT16_VALUE(-1.07), SIMDE_BFLOAT16_VALUE(48.37), SIMDE_BFLOAT16_VALUE(-28.27) }, + { SIMDE_BFLOAT16_VALUE(-34.05), SIMDE_BFLOAT16_VALUE(-26.07), SIMDE_BFLOAT16_VALUE(-44.28), SIMDE_BFLOAT16_VALUE(-30.31) } } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4x2_t r, src, expected; + src.val[0] = simde_vld1_bf16(test_vec[i].src[0]); + src.val[1] = simde_vld1_bf16(test_vec[i].src[1]); + + SIMDE_CONSTIFY_4_(simde_vld2_lane_bf16, r, (HEDLEY_UNREACHABLE(), r), i, test_vec[i].buf, src); + + expected.val[0] = simde_vld1_bf16(test_vec[i].r[0]); + expected.val[1] = simde_vld1_bf16(test_vec[i].r[1]); + + simde_test_arm_neon_assert_equal_bf16x4(r.val[0], expected.val[0], INT_MAX); + simde_test_arm_neon_assert_equal_bf16x4(r.val[1], expected.val[1], INT_MAX); + } + + return 0; +} + +static int +test_simde_vld2q_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t src[2][8]; + simde_bfloat16_t buf[2]; + simde_bfloat16_t r[2][8]; + } test_vec[] = { + { { { SIMDE_BFLOAT16_VALUE(-44.86), SIMDE_BFLOAT16_VALUE(-27.30), SIMDE_BFLOAT16_VALUE(-35.67), SIMDE_BFLOAT16_VALUE(22.98), + SIMDE_BFLOAT16_VALUE(-34.31), SIMDE_BFLOAT16_VALUE(-40.87), SIMDE_BFLOAT16_VALUE(-37.54), SIMDE_BFLOAT16_VALUE(-11.89) }, + { SIMDE_BFLOAT16_VALUE(-19.39), SIMDE_BFLOAT16_VALUE(-21.84), SIMDE_BFLOAT16_VALUE(-32.89), SIMDE_BFLOAT16_VALUE(43.11), + SIMDE_BFLOAT16_VALUE(-10.75), SIMDE_BFLOAT16_VALUE(-18.47), SIMDE_BFLOAT16_VALUE(14.59), SIMDE_BFLOAT16_VALUE(48.79) } }, + { SIMDE_BFLOAT16_VALUE(7.62), SIMDE_BFLOAT16_VALUE(-49.51)}, + { { SIMDE_BFLOAT16_VALUE(7.62), SIMDE_BFLOAT16_VALUE(-27.30), SIMDE_BFLOAT16_VALUE(-35.67), SIMDE_BFLOAT16_VALUE(22.98), + SIMDE_BFLOAT16_VALUE(-34.31), SIMDE_BFLOAT16_VALUE(-40.87), SIMDE_BFLOAT16_VALUE(-37.54), SIMDE_BFLOAT16_VALUE(-11.89) }, + { SIMDE_BFLOAT16_VALUE(-49.51), SIMDE_BFLOAT16_VALUE(-21.84), SIMDE_BFLOAT16_VALUE(-32.89), SIMDE_BFLOAT16_VALUE(43.11), + SIMDE_BFLOAT16_VALUE(-10.75), SIMDE_BFLOAT16_VALUE(-18.47), SIMDE_BFLOAT16_VALUE(14.59), SIMDE_BFLOAT16_VALUE(48.79) } } }, + { { { SIMDE_BFLOAT16_VALUE(-38.62), SIMDE_BFLOAT16_VALUE(4.41), SIMDE_BFLOAT16_VALUE(-33.69), SIMDE_BFLOAT16_VALUE(-29.42), + SIMDE_BFLOAT16_VALUE(-26.20), SIMDE_BFLOAT16_VALUE(-37.93), SIMDE_BFLOAT16_VALUE(-22.76), SIMDE_BFLOAT16_VALUE(9.22) }, + { SIMDE_BFLOAT16_VALUE(33.15), SIMDE_BFLOAT16_VALUE(36.15), SIMDE_BFLOAT16_VALUE(8.88), SIMDE_BFLOAT16_VALUE(-47.77), + SIMDE_BFLOAT16_VALUE(42.44), SIMDE_BFLOAT16_VALUE(-2.49), SIMDE_BFLOAT16_VALUE(-30.82), SIMDE_BFLOAT16_VALUE(-8.07) } }, + { SIMDE_BFLOAT16_VALUE(13.95), SIMDE_BFLOAT16_VALUE(-11.74)}, + { { SIMDE_BFLOAT16_VALUE(-38.62), SIMDE_BFLOAT16_VALUE(13.95), SIMDE_BFLOAT16_VALUE(-33.69), SIMDE_BFLOAT16_VALUE(-29.42), + SIMDE_BFLOAT16_VALUE(-26.20), SIMDE_BFLOAT16_VALUE(-37.93), SIMDE_BFLOAT16_VALUE(-22.76), SIMDE_BFLOAT16_VALUE(9.22) }, + { SIMDE_BFLOAT16_VALUE(33.15), SIMDE_BFLOAT16_VALUE(-11.74), SIMDE_BFLOAT16_VALUE(8.88), SIMDE_BFLOAT16_VALUE(-47.77), + SIMDE_BFLOAT16_VALUE(42.44), SIMDE_BFLOAT16_VALUE(-2.49), SIMDE_BFLOAT16_VALUE(-30.82), SIMDE_BFLOAT16_VALUE(-8.07) } } }, + { { { SIMDE_BFLOAT16_VALUE(20.63), SIMDE_BFLOAT16_VALUE(-26.03), SIMDE_BFLOAT16_VALUE(-49.03), SIMDE_BFLOAT16_VALUE(-9.02), + SIMDE_BFLOAT16_VALUE(-7.24), SIMDE_BFLOAT16_VALUE(21.25), SIMDE_BFLOAT16_VALUE(7.83), SIMDE_BFLOAT16_VALUE(13.60) }, + { SIMDE_BFLOAT16_VALUE(-25.60), SIMDE_BFLOAT16_VALUE(-0.34), SIMDE_BFLOAT16_VALUE(-14.32), SIMDE_BFLOAT16_VALUE(11.44), + SIMDE_BFLOAT16_VALUE(-0.16), SIMDE_BFLOAT16_VALUE(44.81), SIMDE_BFLOAT16_VALUE(-26.95), SIMDE_BFLOAT16_VALUE(-20.70) } }, + { SIMDE_BFLOAT16_VALUE(-12.06), SIMDE_BFLOAT16_VALUE(-20.03)}, + { { SIMDE_BFLOAT16_VALUE(20.63), SIMDE_BFLOAT16_VALUE(-26.03), SIMDE_BFLOAT16_VALUE(-12.06), SIMDE_BFLOAT16_VALUE(-9.02), + SIMDE_BFLOAT16_VALUE(-7.24), SIMDE_BFLOAT16_VALUE(21.25), SIMDE_BFLOAT16_VALUE(7.83), SIMDE_BFLOAT16_VALUE(13.60) }, + { SIMDE_BFLOAT16_VALUE(-25.60), SIMDE_BFLOAT16_VALUE(-0.34), SIMDE_BFLOAT16_VALUE(-20.03), SIMDE_BFLOAT16_VALUE(11.44), + SIMDE_BFLOAT16_VALUE(-0.16), SIMDE_BFLOAT16_VALUE(44.81), SIMDE_BFLOAT16_VALUE(-26.95), SIMDE_BFLOAT16_VALUE(-20.70) } } }, + { { { SIMDE_BFLOAT16_VALUE(-11.60), SIMDE_BFLOAT16_VALUE(-14.50), SIMDE_BFLOAT16_VALUE(45.43), SIMDE_BFLOAT16_VALUE(40.80), + SIMDE_BFLOAT16_VALUE(-19.67), SIMDE_BFLOAT16_VALUE(-0.54), SIMDE_BFLOAT16_VALUE(31.88), SIMDE_BFLOAT16_VALUE(14.74) }, + { SIMDE_BFLOAT16_VALUE(-31.78), SIMDE_BFLOAT16_VALUE(8.81), SIMDE_BFLOAT16_VALUE(10.59), SIMDE_BFLOAT16_VALUE(6.10), + SIMDE_BFLOAT16_VALUE(-25.88), SIMDE_BFLOAT16_VALUE(0.90), SIMDE_BFLOAT16_VALUE(45.87), SIMDE_BFLOAT16_VALUE(13.51) } }, + { SIMDE_BFLOAT16_VALUE(-26.80), SIMDE_BFLOAT16_VALUE(13.43)}, + { { SIMDE_BFLOAT16_VALUE(-11.60), SIMDE_BFLOAT16_VALUE(-14.50), SIMDE_BFLOAT16_VALUE(45.43), SIMDE_BFLOAT16_VALUE(-26.80), + SIMDE_BFLOAT16_VALUE(-19.67), SIMDE_BFLOAT16_VALUE(-0.54), SIMDE_BFLOAT16_VALUE(31.88), SIMDE_BFLOAT16_VALUE(14.74) }, + { SIMDE_BFLOAT16_VALUE(-31.78), SIMDE_BFLOAT16_VALUE(8.81), SIMDE_BFLOAT16_VALUE(10.59), SIMDE_BFLOAT16_VALUE(13.43), + SIMDE_BFLOAT16_VALUE(-25.88), SIMDE_BFLOAT16_VALUE(0.90), SIMDE_BFLOAT16_VALUE(45.87), SIMDE_BFLOAT16_VALUE(13.51) } } }, + { { { SIMDE_BFLOAT16_VALUE(33.71), SIMDE_BFLOAT16_VALUE(-5.48), SIMDE_BFLOAT16_VALUE(-13.87), SIMDE_BFLOAT16_VALUE(2.58), + SIMDE_BFLOAT16_VALUE(22.05), SIMDE_BFLOAT16_VALUE(-25.14), SIMDE_BFLOAT16_VALUE(32.71), SIMDE_BFLOAT16_VALUE(49.78) }, + { SIMDE_BFLOAT16_VALUE(-33.81), SIMDE_BFLOAT16_VALUE(-37.35), SIMDE_BFLOAT16_VALUE(6.37), SIMDE_BFLOAT16_VALUE(42.63), + SIMDE_BFLOAT16_VALUE(27.98), SIMDE_BFLOAT16_VALUE(-47.79), SIMDE_BFLOAT16_VALUE(0.37), SIMDE_BFLOAT16_VALUE(24.16) } }, + { SIMDE_BFLOAT16_VALUE(-22.12), SIMDE_BFLOAT16_VALUE(22.45)}, + { { SIMDE_BFLOAT16_VALUE(33.71), SIMDE_BFLOAT16_VALUE(-5.48), SIMDE_BFLOAT16_VALUE(-13.87), SIMDE_BFLOAT16_VALUE(2.58), + SIMDE_BFLOAT16_VALUE(-22.12), SIMDE_BFLOAT16_VALUE(-25.14), SIMDE_BFLOAT16_VALUE(32.71), SIMDE_BFLOAT16_VALUE(49.78) }, + { SIMDE_BFLOAT16_VALUE(-33.81), SIMDE_BFLOAT16_VALUE(-37.35), SIMDE_BFLOAT16_VALUE(6.37), SIMDE_BFLOAT16_VALUE(42.63), + SIMDE_BFLOAT16_VALUE(22.45), SIMDE_BFLOAT16_VALUE(-47.79), SIMDE_BFLOAT16_VALUE(0.37), SIMDE_BFLOAT16_VALUE(24.16) } } }, + { { { SIMDE_BFLOAT16_VALUE(35.13), SIMDE_BFLOAT16_VALUE(-36.13), SIMDE_BFLOAT16_VALUE(-42.60), SIMDE_BFLOAT16_VALUE(-23.46), + SIMDE_BFLOAT16_VALUE(-42.93), SIMDE_BFLOAT16_VALUE(-21.16), SIMDE_BFLOAT16_VALUE(-29.86), SIMDE_BFLOAT16_VALUE(29.04) }, + { SIMDE_BFLOAT16_VALUE(37.40), SIMDE_BFLOAT16_VALUE(30.74), SIMDE_BFLOAT16_VALUE(30.82), SIMDE_BFLOAT16_VALUE(44.38), + SIMDE_BFLOAT16_VALUE(-30.52), SIMDE_BFLOAT16_VALUE(42.55), SIMDE_BFLOAT16_VALUE(16.70), SIMDE_BFLOAT16_VALUE(47.97) } }, + { SIMDE_BFLOAT16_VALUE(41.68), SIMDE_BFLOAT16_VALUE(12.98)}, + { { SIMDE_BFLOAT16_VALUE(35.13), SIMDE_BFLOAT16_VALUE(-36.13), SIMDE_BFLOAT16_VALUE(-42.60), SIMDE_BFLOAT16_VALUE(-23.46), + SIMDE_BFLOAT16_VALUE(-42.93), SIMDE_BFLOAT16_VALUE(41.68), SIMDE_BFLOAT16_VALUE(-29.86), SIMDE_BFLOAT16_VALUE(29.04) }, + { SIMDE_BFLOAT16_VALUE(37.40), SIMDE_BFLOAT16_VALUE(30.74), SIMDE_BFLOAT16_VALUE(30.82), SIMDE_BFLOAT16_VALUE(44.38), + SIMDE_BFLOAT16_VALUE(-30.52), SIMDE_BFLOAT16_VALUE(12.98), SIMDE_BFLOAT16_VALUE(16.70), SIMDE_BFLOAT16_VALUE(47.97) } } }, + { { { SIMDE_BFLOAT16_VALUE(45.22), SIMDE_BFLOAT16_VALUE(-8.00), SIMDE_BFLOAT16_VALUE(-27.03), SIMDE_BFLOAT16_VALUE(48.60), + SIMDE_BFLOAT16_VALUE(19.87), SIMDE_BFLOAT16_VALUE(-1.72), SIMDE_BFLOAT16_VALUE(-45.40), SIMDE_BFLOAT16_VALUE(-3.56) }, + { SIMDE_BFLOAT16_VALUE(36.60), SIMDE_BFLOAT16_VALUE(-32.25), SIMDE_BFLOAT16_VALUE(13.01), SIMDE_BFLOAT16_VALUE(-12.64), + SIMDE_BFLOAT16_VALUE(22.43), SIMDE_BFLOAT16_VALUE(1.87), SIMDE_BFLOAT16_VALUE(-38.57), SIMDE_BFLOAT16_VALUE(-24.61) } }, + { SIMDE_BFLOAT16_VALUE(49.75), SIMDE_BFLOAT16_VALUE(-1.23)}, + { { SIMDE_BFLOAT16_VALUE(45.22), SIMDE_BFLOAT16_VALUE(-8.00), SIMDE_BFLOAT16_VALUE(-27.03), SIMDE_BFLOAT16_VALUE(48.60), + SIMDE_BFLOAT16_VALUE(19.87), SIMDE_BFLOAT16_VALUE(-1.72), SIMDE_BFLOAT16_VALUE(49.75), SIMDE_BFLOAT16_VALUE(-3.56) }, + { SIMDE_BFLOAT16_VALUE(36.60), SIMDE_BFLOAT16_VALUE(-32.25), SIMDE_BFLOAT16_VALUE(13.01), SIMDE_BFLOAT16_VALUE(-12.64), + SIMDE_BFLOAT16_VALUE(22.43), SIMDE_BFLOAT16_VALUE(1.87), SIMDE_BFLOAT16_VALUE(-1.23), SIMDE_BFLOAT16_VALUE(-24.61) } } }, + { { { SIMDE_BFLOAT16_VALUE(24.31), SIMDE_BFLOAT16_VALUE(-43.53), SIMDE_BFLOAT16_VALUE(20.69), SIMDE_BFLOAT16_VALUE(26.28), + SIMDE_BFLOAT16_VALUE(44.06), SIMDE_BFLOAT16_VALUE(42.57), SIMDE_BFLOAT16_VALUE(7.84), SIMDE_BFLOAT16_VALUE(-4.34) }, + { SIMDE_BFLOAT16_VALUE(-7.29), SIMDE_BFLOAT16_VALUE(5.56), SIMDE_BFLOAT16_VALUE(-20.99), SIMDE_BFLOAT16_VALUE(-46.49), + SIMDE_BFLOAT16_VALUE(24.87), SIMDE_BFLOAT16_VALUE(40.56), SIMDE_BFLOAT16_VALUE(-20.02), SIMDE_BFLOAT16_VALUE(38.66) } }, + { SIMDE_BFLOAT16_VALUE(17.79), SIMDE_BFLOAT16_VALUE(37.56)}, + { { SIMDE_BFLOAT16_VALUE(24.31), SIMDE_BFLOAT16_VALUE(-43.53), SIMDE_BFLOAT16_VALUE(20.69), SIMDE_BFLOAT16_VALUE(26.28), + SIMDE_BFLOAT16_VALUE(44.06), SIMDE_BFLOAT16_VALUE(42.57), SIMDE_BFLOAT16_VALUE(7.84), SIMDE_BFLOAT16_VALUE(17.79) }, + { SIMDE_BFLOAT16_VALUE(-7.29), SIMDE_BFLOAT16_VALUE(5.56), SIMDE_BFLOAT16_VALUE(-20.99), SIMDE_BFLOAT16_VALUE(-46.49), + SIMDE_BFLOAT16_VALUE(24.87), SIMDE_BFLOAT16_VALUE(40.56), SIMDE_BFLOAT16_VALUE(-20.02), SIMDE_BFLOAT16_VALUE(37.56) } } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8x2_t r, src, expected; + src.val[0] = simde_vld1q_bf16(test_vec[i].src[0]); + src.val[1] = simde_vld1q_bf16(test_vec[i].src[1]); + + SIMDE_CONSTIFY_8_(simde_vld2q_lane_bf16, r, (HEDLEY_UNREACHABLE(), r), i, test_vec[i].buf, src); + + expected.val[0] = simde_vld1q_bf16(test_vec[i].r[0]); + expected.val[1] = simde_vld1q_bf16(test_vec[i].r[1]); + + simde_test_arm_neon_assert_equal_bf16x8(r.val[0], expected.val[0], INT_MAX); + simde_test_arm_neon_assert_equal_bf16x8(r.val[1], expected.val[1], INT_MAX); + } + + return 0; +} + SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vld2_lane_s8) SIMDE_TEST_FUNC_LIST_ENTRY(vld2_lane_s16) @@ -2013,6 +2157,8 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vld2_lane_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vld2q_lane_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vld2q_lane_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vld2q_lane_p64) +SIMDE_TEST_FUNC_LIST_ENTRY(vld2_lane_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vld2q_lane_bf16) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/ld3_dup.c b/test/arm/neon/ld3_dup.c index 9d5e3b4a6..f7cdfa7f9 100644 --- a/test/arm/neon/ld3_dup.c +++ b/test/arm/neon/ld3_dup.c @@ -2089,6 +2089,154 @@ test_simde_vld3q_dup_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vld3_dup_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t a[3]; + simde_bfloat16_t unused[3]; + simde_bfloat16_t r[3][4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(-6.58), SIMDE_BFLOAT16_VALUE(2.17), SIMDE_BFLOAT16_VALUE(3.51) }, + { SIMDE_BFLOAT16_VALUE(-28.23), SIMDE_BFLOAT16_VALUE(27.18), SIMDE_BFLOAT16_VALUE(21.06)}, + { { SIMDE_BFLOAT16_VALUE(-6.58), SIMDE_BFLOAT16_VALUE(-6.58), SIMDE_BFLOAT16_VALUE(-6.58), SIMDE_BFLOAT16_VALUE(-6.58) }, + { SIMDE_BFLOAT16_VALUE(2.17), SIMDE_BFLOAT16_VALUE(2.17), SIMDE_BFLOAT16_VALUE(2.17), SIMDE_BFLOAT16_VALUE(2.17) }, + { SIMDE_BFLOAT16_VALUE(3.51), SIMDE_BFLOAT16_VALUE(3.51), SIMDE_BFLOAT16_VALUE(3.51), SIMDE_BFLOAT16_VALUE(3.51) } } }, + { { SIMDE_BFLOAT16_VALUE(-46.99), SIMDE_BFLOAT16_VALUE(-6.72), SIMDE_BFLOAT16_VALUE(41.08) }, + { SIMDE_BFLOAT16_VALUE(-2.06), SIMDE_BFLOAT16_VALUE(-6.78), SIMDE_BFLOAT16_VALUE(36.58)}, + { { SIMDE_BFLOAT16_VALUE(-46.99), SIMDE_BFLOAT16_VALUE(-46.99), SIMDE_BFLOAT16_VALUE(-46.99), SIMDE_BFLOAT16_VALUE(-46.99) }, + { SIMDE_BFLOAT16_VALUE(-6.72), SIMDE_BFLOAT16_VALUE(-6.72), SIMDE_BFLOAT16_VALUE(-6.72), SIMDE_BFLOAT16_VALUE(-6.72) }, + { SIMDE_BFLOAT16_VALUE(41.08), SIMDE_BFLOAT16_VALUE(41.08), SIMDE_BFLOAT16_VALUE(41.08), SIMDE_BFLOAT16_VALUE(41.08) } } }, + { { SIMDE_BFLOAT16_VALUE(39.86), SIMDE_BFLOAT16_VALUE(40.77), SIMDE_BFLOAT16_VALUE(-32.22) }, + { SIMDE_BFLOAT16_VALUE(-24.94), SIMDE_BFLOAT16_VALUE(-38.80), SIMDE_BFLOAT16_VALUE(7.87)}, + { { SIMDE_BFLOAT16_VALUE(39.86), SIMDE_BFLOAT16_VALUE(39.86), SIMDE_BFLOAT16_VALUE(39.86), SIMDE_BFLOAT16_VALUE(39.86) }, + { SIMDE_BFLOAT16_VALUE(40.77), SIMDE_BFLOAT16_VALUE(40.77), SIMDE_BFLOAT16_VALUE(40.77), SIMDE_BFLOAT16_VALUE(40.77) }, + { SIMDE_BFLOAT16_VALUE(-32.22), SIMDE_BFLOAT16_VALUE(-32.22), SIMDE_BFLOAT16_VALUE(-32.22), SIMDE_BFLOAT16_VALUE(-32.22) } } }, + { { SIMDE_BFLOAT16_VALUE(3.72), SIMDE_BFLOAT16_VALUE(45.41), SIMDE_BFLOAT16_VALUE(4.48) }, + { SIMDE_BFLOAT16_VALUE(47.09), SIMDE_BFLOAT16_VALUE(-24.14), SIMDE_BFLOAT16_VALUE(-0.13)}, + { { SIMDE_BFLOAT16_VALUE(3.72), SIMDE_BFLOAT16_VALUE(3.72), SIMDE_BFLOAT16_VALUE(3.72), SIMDE_BFLOAT16_VALUE(3.72) }, + { SIMDE_BFLOAT16_VALUE(45.41), SIMDE_BFLOAT16_VALUE(45.41), SIMDE_BFLOAT16_VALUE(45.41), SIMDE_BFLOAT16_VALUE(45.41) }, + { SIMDE_BFLOAT16_VALUE(4.48), SIMDE_BFLOAT16_VALUE(4.48), SIMDE_BFLOAT16_VALUE(4.48), SIMDE_BFLOAT16_VALUE(4.48) } } }, + { { SIMDE_BFLOAT16_VALUE(-31.75), SIMDE_BFLOAT16_VALUE(20.34), SIMDE_BFLOAT16_VALUE(-29.59) }, + { SIMDE_BFLOAT16_VALUE(-11.56), SIMDE_BFLOAT16_VALUE(-7.53), SIMDE_BFLOAT16_VALUE(28.61)}, + { { SIMDE_BFLOAT16_VALUE(-31.75), SIMDE_BFLOAT16_VALUE(-31.75), SIMDE_BFLOAT16_VALUE(-31.75), SIMDE_BFLOAT16_VALUE(-31.75) }, + { SIMDE_BFLOAT16_VALUE(20.34), SIMDE_BFLOAT16_VALUE(20.34), SIMDE_BFLOAT16_VALUE(20.34), SIMDE_BFLOAT16_VALUE(20.34) }, + { SIMDE_BFLOAT16_VALUE(-29.59), SIMDE_BFLOAT16_VALUE(-29.59), SIMDE_BFLOAT16_VALUE(-29.59), SIMDE_BFLOAT16_VALUE(-29.59) } } }, + { { SIMDE_BFLOAT16_VALUE(37.05), SIMDE_BFLOAT16_VALUE(17.72), SIMDE_BFLOAT16_VALUE(-49.37) }, + { SIMDE_BFLOAT16_VALUE(-27.61), SIMDE_BFLOAT16_VALUE(-29.16), SIMDE_BFLOAT16_VALUE(2.30)}, + { { SIMDE_BFLOAT16_VALUE(37.05), SIMDE_BFLOAT16_VALUE(37.05), SIMDE_BFLOAT16_VALUE(37.05), SIMDE_BFLOAT16_VALUE(37.05) }, + { SIMDE_BFLOAT16_VALUE(17.72), SIMDE_BFLOAT16_VALUE(17.72), SIMDE_BFLOAT16_VALUE(17.72), SIMDE_BFLOAT16_VALUE(17.72) }, + { SIMDE_BFLOAT16_VALUE(-49.37), SIMDE_BFLOAT16_VALUE(-49.37), SIMDE_BFLOAT16_VALUE(-49.37), SIMDE_BFLOAT16_VALUE(-49.37) } } }, + { { SIMDE_BFLOAT16_VALUE(-49.24), SIMDE_BFLOAT16_VALUE(-2.48), SIMDE_BFLOAT16_VALUE(-45.21) }, + { SIMDE_BFLOAT16_VALUE(19.81), SIMDE_BFLOAT16_VALUE(5.79), SIMDE_BFLOAT16_VALUE(42.08)}, + { { SIMDE_BFLOAT16_VALUE(-49.24), SIMDE_BFLOAT16_VALUE(-49.24), SIMDE_BFLOAT16_VALUE(-49.24), SIMDE_BFLOAT16_VALUE(-49.24) }, + { SIMDE_BFLOAT16_VALUE(-2.48), SIMDE_BFLOAT16_VALUE(-2.48), SIMDE_BFLOAT16_VALUE(-2.48), SIMDE_BFLOAT16_VALUE(-2.48) }, + { SIMDE_BFLOAT16_VALUE(-45.21), SIMDE_BFLOAT16_VALUE(-45.21), SIMDE_BFLOAT16_VALUE(-45.21), SIMDE_BFLOAT16_VALUE(-45.21) } } }, + { { SIMDE_BFLOAT16_VALUE(26.41), SIMDE_BFLOAT16_VALUE(49.96), SIMDE_BFLOAT16_VALUE(20.11) }, + { SIMDE_BFLOAT16_VALUE(34.64), SIMDE_BFLOAT16_VALUE(-7.87), SIMDE_BFLOAT16_VALUE(-43.78)}, + { { SIMDE_BFLOAT16_VALUE(26.41), SIMDE_BFLOAT16_VALUE(26.41), SIMDE_BFLOAT16_VALUE(26.41), SIMDE_BFLOAT16_VALUE(26.41) }, + { SIMDE_BFLOAT16_VALUE(49.96), SIMDE_BFLOAT16_VALUE(49.96), SIMDE_BFLOAT16_VALUE(49.96), SIMDE_BFLOAT16_VALUE(49.96) }, + { SIMDE_BFLOAT16_VALUE(20.11), SIMDE_BFLOAT16_VALUE(20.11), SIMDE_BFLOAT16_VALUE(20.11), SIMDE_BFLOAT16_VALUE(20.11) } } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4x3_t r = simde_vld3_dup_bf16(test_vec[i].a); + simde_bfloat16x4x3_t expected = { + {simde_vld1_bf16(test_vec[i].r[0]), simde_vld1_bf16(test_vec[i].r[1]), simde_vld1_bf16(test_vec[i].r[2])}}; + + simde_test_arm_neon_assert_equal_bf16x4(r.val[0], expected.val[0], INT_MAX); + simde_test_arm_neon_assert_equal_bf16x4(r.val[1], expected.val[1], INT_MAX); + simde_test_arm_neon_assert_equal_bf16x4(r.val[2], expected.val[2], INT_MAX); + } + + return 0; +} + +static int +test_simde_vld3q_dup_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t a[3]; + simde_bfloat16_t unused[3]; + simde_bfloat16_t r[3][8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(20.19), SIMDE_BFLOAT16_VALUE(16.39), SIMDE_BFLOAT16_VALUE(46.17) }, + { SIMDE_BFLOAT16_VALUE(29.32), SIMDE_BFLOAT16_VALUE(-18.79), SIMDE_BFLOAT16_VALUE(30.83)}, + { { SIMDE_BFLOAT16_VALUE(20.19), SIMDE_BFLOAT16_VALUE(20.19), SIMDE_BFLOAT16_VALUE(20.19), SIMDE_BFLOAT16_VALUE(20.19), + SIMDE_BFLOAT16_VALUE(20.19), SIMDE_BFLOAT16_VALUE(20.19), SIMDE_BFLOAT16_VALUE(20.19), SIMDE_BFLOAT16_VALUE(20.19) }, + { SIMDE_BFLOAT16_VALUE(16.39), SIMDE_BFLOAT16_VALUE(16.39), SIMDE_BFLOAT16_VALUE(16.39), SIMDE_BFLOAT16_VALUE(16.39), + SIMDE_BFLOAT16_VALUE(16.39), SIMDE_BFLOAT16_VALUE(16.39), SIMDE_BFLOAT16_VALUE(16.39), SIMDE_BFLOAT16_VALUE(16.39) }, + { SIMDE_BFLOAT16_VALUE(46.17), SIMDE_BFLOAT16_VALUE(46.17), SIMDE_BFLOAT16_VALUE(46.17), SIMDE_BFLOAT16_VALUE(46.17), + SIMDE_BFLOAT16_VALUE(46.17), SIMDE_BFLOAT16_VALUE(46.17), SIMDE_BFLOAT16_VALUE(46.17), SIMDE_BFLOAT16_VALUE(46.17) } } }, + { { SIMDE_BFLOAT16_VALUE(-48.67), SIMDE_BFLOAT16_VALUE(-21.20), SIMDE_BFLOAT16_VALUE(-45.20) }, + { SIMDE_BFLOAT16_VALUE(6.72), SIMDE_BFLOAT16_VALUE(10.70), SIMDE_BFLOAT16_VALUE(32.09)}, + { { SIMDE_BFLOAT16_VALUE(-48.67), SIMDE_BFLOAT16_VALUE(-48.67), SIMDE_BFLOAT16_VALUE(-48.67), SIMDE_BFLOAT16_VALUE(-48.67), + SIMDE_BFLOAT16_VALUE(-48.67), SIMDE_BFLOAT16_VALUE(-48.67), SIMDE_BFLOAT16_VALUE(-48.67), SIMDE_BFLOAT16_VALUE(-48.67) }, + { SIMDE_BFLOAT16_VALUE(-21.20), SIMDE_BFLOAT16_VALUE(-21.20), SIMDE_BFLOAT16_VALUE(-21.20), SIMDE_BFLOAT16_VALUE(-21.20), + SIMDE_BFLOAT16_VALUE(-21.20), SIMDE_BFLOAT16_VALUE(-21.20), SIMDE_BFLOAT16_VALUE(-21.20), SIMDE_BFLOAT16_VALUE(-21.20) }, + { SIMDE_BFLOAT16_VALUE(-45.20), SIMDE_BFLOAT16_VALUE(-45.20), SIMDE_BFLOAT16_VALUE(-45.20), SIMDE_BFLOAT16_VALUE(-45.20), + SIMDE_BFLOAT16_VALUE(-45.20), SIMDE_BFLOAT16_VALUE(-45.20), SIMDE_BFLOAT16_VALUE(-45.20), SIMDE_BFLOAT16_VALUE(-45.20) } } }, + { { SIMDE_BFLOAT16_VALUE(-29.85), SIMDE_BFLOAT16_VALUE(24.77), SIMDE_BFLOAT16_VALUE(7.75) }, + { SIMDE_BFLOAT16_VALUE(-19.50), SIMDE_BFLOAT16_VALUE(-45.53), SIMDE_BFLOAT16_VALUE(21.67)}, + { { SIMDE_BFLOAT16_VALUE(-29.85), SIMDE_BFLOAT16_VALUE(-29.85), SIMDE_BFLOAT16_VALUE(-29.85), SIMDE_BFLOAT16_VALUE(-29.85), + SIMDE_BFLOAT16_VALUE(-29.85), SIMDE_BFLOAT16_VALUE(-29.85), SIMDE_BFLOAT16_VALUE(-29.85), SIMDE_BFLOAT16_VALUE(-29.85) }, + { SIMDE_BFLOAT16_VALUE(24.77), SIMDE_BFLOAT16_VALUE(24.77), SIMDE_BFLOAT16_VALUE(24.77), SIMDE_BFLOAT16_VALUE(24.77), + SIMDE_BFLOAT16_VALUE(24.77), SIMDE_BFLOAT16_VALUE(24.77), SIMDE_BFLOAT16_VALUE(24.77), SIMDE_BFLOAT16_VALUE(24.77) }, + { SIMDE_BFLOAT16_VALUE(7.75), SIMDE_BFLOAT16_VALUE(7.75), SIMDE_BFLOAT16_VALUE(7.75), SIMDE_BFLOAT16_VALUE(7.75), + SIMDE_BFLOAT16_VALUE(7.75), SIMDE_BFLOAT16_VALUE(7.75), SIMDE_BFLOAT16_VALUE(7.75), SIMDE_BFLOAT16_VALUE(7.75) } } }, + { { SIMDE_BFLOAT16_VALUE(-4.91), SIMDE_BFLOAT16_VALUE(-25.17), SIMDE_BFLOAT16_VALUE(45.00) }, + { SIMDE_BFLOAT16_VALUE(2.89), SIMDE_BFLOAT16_VALUE(7.87), SIMDE_BFLOAT16_VALUE(24.69)}, + { { SIMDE_BFLOAT16_VALUE(-4.91), SIMDE_BFLOAT16_VALUE(-4.91), SIMDE_BFLOAT16_VALUE(-4.91), SIMDE_BFLOAT16_VALUE(-4.91), + SIMDE_BFLOAT16_VALUE(-4.91), SIMDE_BFLOAT16_VALUE(-4.91), SIMDE_BFLOAT16_VALUE(-4.91), SIMDE_BFLOAT16_VALUE(-4.91) }, + { SIMDE_BFLOAT16_VALUE(-25.17), SIMDE_BFLOAT16_VALUE(-25.17), SIMDE_BFLOAT16_VALUE(-25.17), SIMDE_BFLOAT16_VALUE(-25.17), + SIMDE_BFLOAT16_VALUE(-25.17), SIMDE_BFLOAT16_VALUE(-25.17), SIMDE_BFLOAT16_VALUE(-25.17), SIMDE_BFLOAT16_VALUE(-25.17) }, + { SIMDE_BFLOAT16_VALUE(45.00), SIMDE_BFLOAT16_VALUE(45.00), SIMDE_BFLOAT16_VALUE(45.00), SIMDE_BFLOAT16_VALUE(45.00), + SIMDE_BFLOAT16_VALUE(45.00), SIMDE_BFLOAT16_VALUE(45.00), SIMDE_BFLOAT16_VALUE(45.00), SIMDE_BFLOAT16_VALUE(45.00) } } }, + { { SIMDE_BFLOAT16_VALUE(-47.11), SIMDE_BFLOAT16_VALUE(-3.75), SIMDE_BFLOAT16_VALUE(44.40) }, + { SIMDE_BFLOAT16_VALUE(-8.68), SIMDE_BFLOAT16_VALUE(49.28), SIMDE_BFLOAT16_VALUE(49.67)}, + { { SIMDE_BFLOAT16_VALUE(-47.11), SIMDE_BFLOAT16_VALUE(-47.11), SIMDE_BFLOAT16_VALUE(-47.11), SIMDE_BFLOAT16_VALUE(-47.11), + SIMDE_BFLOAT16_VALUE(-47.11), SIMDE_BFLOAT16_VALUE(-47.11), SIMDE_BFLOAT16_VALUE(-47.11), SIMDE_BFLOAT16_VALUE(-47.11) }, + { SIMDE_BFLOAT16_VALUE(-3.75), SIMDE_BFLOAT16_VALUE(-3.75), SIMDE_BFLOAT16_VALUE(-3.75), SIMDE_BFLOAT16_VALUE(-3.75), + SIMDE_BFLOAT16_VALUE(-3.75), SIMDE_BFLOAT16_VALUE(-3.75), SIMDE_BFLOAT16_VALUE(-3.75), SIMDE_BFLOAT16_VALUE(-3.75) }, + { SIMDE_BFLOAT16_VALUE(44.40), SIMDE_BFLOAT16_VALUE(44.40), SIMDE_BFLOAT16_VALUE(44.40), SIMDE_BFLOAT16_VALUE(44.40), + SIMDE_BFLOAT16_VALUE(44.40), SIMDE_BFLOAT16_VALUE(44.40), SIMDE_BFLOAT16_VALUE(44.40), SIMDE_BFLOAT16_VALUE(44.40) } } }, + { { SIMDE_BFLOAT16_VALUE(-32.16), SIMDE_BFLOAT16_VALUE(30.51), SIMDE_BFLOAT16_VALUE(15.52) }, + { SIMDE_BFLOAT16_VALUE(24.82), SIMDE_BFLOAT16_VALUE(34.29), SIMDE_BFLOAT16_VALUE(-0.76)}, + { { SIMDE_BFLOAT16_VALUE(-32.16), SIMDE_BFLOAT16_VALUE(-32.16), SIMDE_BFLOAT16_VALUE(-32.16), SIMDE_BFLOAT16_VALUE(-32.16), + SIMDE_BFLOAT16_VALUE(-32.16), SIMDE_BFLOAT16_VALUE(-32.16), SIMDE_BFLOAT16_VALUE(-32.16), SIMDE_BFLOAT16_VALUE(-32.16) }, + { SIMDE_BFLOAT16_VALUE(30.51), SIMDE_BFLOAT16_VALUE(30.51), SIMDE_BFLOAT16_VALUE(30.51), SIMDE_BFLOAT16_VALUE(30.51), + SIMDE_BFLOAT16_VALUE(30.51), SIMDE_BFLOAT16_VALUE(30.51), SIMDE_BFLOAT16_VALUE(30.51), SIMDE_BFLOAT16_VALUE(30.51) }, + { SIMDE_BFLOAT16_VALUE(15.52), SIMDE_BFLOAT16_VALUE(15.52), SIMDE_BFLOAT16_VALUE(15.52), SIMDE_BFLOAT16_VALUE(15.52), + SIMDE_BFLOAT16_VALUE(15.52), SIMDE_BFLOAT16_VALUE(15.52), SIMDE_BFLOAT16_VALUE(15.52), SIMDE_BFLOAT16_VALUE(15.52) } } }, + { { SIMDE_BFLOAT16_VALUE(-15.98), SIMDE_BFLOAT16_VALUE(9.92), SIMDE_BFLOAT16_VALUE(-43.38) }, + { SIMDE_BFLOAT16_VALUE(3.24), SIMDE_BFLOAT16_VALUE(-29.83), SIMDE_BFLOAT16_VALUE(34.76)}, + { { SIMDE_BFLOAT16_VALUE(-15.98), SIMDE_BFLOAT16_VALUE(-15.98), SIMDE_BFLOAT16_VALUE(-15.98), SIMDE_BFLOAT16_VALUE(-15.98), + SIMDE_BFLOAT16_VALUE(-15.98), SIMDE_BFLOAT16_VALUE(-15.98), SIMDE_BFLOAT16_VALUE(-15.98), SIMDE_BFLOAT16_VALUE(-15.98) }, + { SIMDE_BFLOAT16_VALUE(9.92), SIMDE_BFLOAT16_VALUE(9.92), SIMDE_BFLOAT16_VALUE(9.92), SIMDE_BFLOAT16_VALUE(9.92), + SIMDE_BFLOAT16_VALUE(9.92), SIMDE_BFLOAT16_VALUE(9.92), SIMDE_BFLOAT16_VALUE(9.92), SIMDE_BFLOAT16_VALUE(9.92) }, + { SIMDE_BFLOAT16_VALUE(-43.38), SIMDE_BFLOAT16_VALUE(-43.38), SIMDE_BFLOAT16_VALUE(-43.38), SIMDE_BFLOAT16_VALUE(-43.38), + SIMDE_BFLOAT16_VALUE(-43.38), SIMDE_BFLOAT16_VALUE(-43.38), SIMDE_BFLOAT16_VALUE(-43.38), SIMDE_BFLOAT16_VALUE(-43.38) } } }, + { { SIMDE_BFLOAT16_VALUE(34.74), SIMDE_BFLOAT16_VALUE(3.30), SIMDE_BFLOAT16_VALUE(-43.69) }, + { SIMDE_BFLOAT16_VALUE(-47.12), SIMDE_BFLOAT16_VALUE(-48.25), SIMDE_BFLOAT16_VALUE(-34.42)}, + { { SIMDE_BFLOAT16_VALUE(34.74), SIMDE_BFLOAT16_VALUE(34.74), SIMDE_BFLOAT16_VALUE(34.74), SIMDE_BFLOAT16_VALUE(34.74), + SIMDE_BFLOAT16_VALUE(34.74), SIMDE_BFLOAT16_VALUE(34.74), SIMDE_BFLOAT16_VALUE(34.74), SIMDE_BFLOAT16_VALUE(34.74) }, + { SIMDE_BFLOAT16_VALUE(3.30), SIMDE_BFLOAT16_VALUE(3.30), SIMDE_BFLOAT16_VALUE(3.30), SIMDE_BFLOAT16_VALUE(3.30), + SIMDE_BFLOAT16_VALUE(3.30), SIMDE_BFLOAT16_VALUE(3.30), SIMDE_BFLOAT16_VALUE(3.30), SIMDE_BFLOAT16_VALUE(3.30) }, + { SIMDE_BFLOAT16_VALUE(-43.69), SIMDE_BFLOAT16_VALUE(-43.69), SIMDE_BFLOAT16_VALUE(-43.69), SIMDE_BFLOAT16_VALUE(-43.69), + SIMDE_BFLOAT16_VALUE(-43.69), SIMDE_BFLOAT16_VALUE(-43.69), SIMDE_BFLOAT16_VALUE(-43.69), SIMDE_BFLOAT16_VALUE(-43.69) } } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8x3_t r = simde_vld3q_dup_bf16(test_vec[i].a); + simde_bfloat16x8x3_t expected = { + {simde_vld1q_bf16(test_vec[i].r[0]), simde_vld1q_bf16(test_vec[i].r[1]), simde_vld1q_bf16(test_vec[i].r[2])}}; + + simde_test_arm_neon_assert_equal_bf16x8(r.val[0], expected.val[0], INT_MAX); + simde_test_arm_neon_assert_equal_bf16x8(r.val[1], expected.val[1], INT_MAX); + simde_test_arm_neon_assert_equal_bf16x8(r.val[2], expected.val[2], INT_MAX); + } + + return 0; +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -2121,6 +2269,8 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vld3_dup_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vld3q_dup_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vld3q_dup_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vld3q_dup_p64) +SIMDE_TEST_FUNC_LIST_ENTRY(vld3_dup_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vld3q_dup_bf16) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/ld3_lane.c b/test/arm/neon/ld3_lane.c index 374802c80..f91d53c0d 100644 --- a/test/arm/neon/ld3_lane.c +++ b/test/arm/neon/ld3_lane.c @@ -2472,6 +2472,196 @@ test_simde_vld3q_lane_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vld3_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t src[3][4]; + simde_bfloat16_t buf[3]; + simde_bfloat16_t r[3][4]; + } test_vec[] = { + { { { SIMDE_BFLOAT16_VALUE(-38.09), SIMDE_BFLOAT16_VALUE(39.56), SIMDE_BFLOAT16_VALUE(12.85), SIMDE_BFLOAT16_VALUE(-6.63) }, + { SIMDE_BFLOAT16_VALUE(-41.59), SIMDE_BFLOAT16_VALUE(46.59), SIMDE_BFLOAT16_VALUE(22.79), SIMDE_BFLOAT16_VALUE(-13.35) }, + { SIMDE_BFLOAT16_VALUE(25.23), SIMDE_BFLOAT16_VALUE(-26.59), SIMDE_BFLOAT16_VALUE(19.00), SIMDE_BFLOAT16_VALUE(-16.99) } }, + { SIMDE_BFLOAT16_VALUE(6.58), SIMDE_BFLOAT16_VALUE(-23.21), SIMDE_BFLOAT16_VALUE(-16.75)}, + { { SIMDE_BFLOAT16_VALUE(6.58), SIMDE_BFLOAT16_VALUE(39.56), SIMDE_BFLOAT16_VALUE(12.85), SIMDE_BFLOAT16_VALUE(-6.63) }, + { SIMDE_BFLOAT16_VALUE(-23.21), SIMDE_BFLOAT16_VALUE(46.59), SIMDE_BFLOAT16_VALUE(22.79), SIMDE_BFLOAT16_VALUE(-13.35) }, + { SIMDE_BFLOAT16_VALUE(-16.75), SIMDE_BFLOAT16_VALUE(-26.59), SIMDE_BFLOAT16_VALUE(19.00), SIMDE_BFLOAT16_VALUE(-16.99) } } }, + { { { SIMDE_BFLOAT16_VALUE(-31.46), SIMDE_BFLOAT16_VALUE(30.50), SIMDE_BFLOAT16_VALUE(-31.78), SIMDE_BFLOAT16_VALUE(47.74) }, + { SIMDE_BFLOAT16_VALUE(33.97), SIMDE_BFLOAT16_VALUE(37.16), SIMDE_BFLOAT16_VALUE(27.13), SIMDE_BFLOAT16_VALUE(-28.58) }, + { SIMDE_BFLOAT16_VALUE(-7.95), SIMDE_BFLOAT16_VALUE(-26.73), SIMDE_BFLOAT16_VALUE(17.08), SIMDE_BFLOAT16_VALUE(39.81) } }, + { SIMDE_BFLOAT16_VALUE(-28.19), SIMDE_BFLOAT16_VALUE(29.28), SIMDE_BFLOAT16_VALUE(-1.21)}, + { { SIMDE_BFLOAT16_VALUE(-31.46), SIMDE_BFLOAT16_VALUE(-28.19), SIMDE_BFLOAT16_VALUE(-31.78), SIMDE_BFLOAT16_VALUE(47.74) }, + { SIMDE_BFLOAT16_VALUE(33.97), SIMDE_BFLOAT16_VALUE(29.28), SIMDE_BFLOAT16_VALUE(27.13), SIMDE_BFLOAT16_VALUE(-28.58) }, + { SIMDE_BFLOAT16_VALUE(-7.95), SIMDE_BFLOAT16_VALUE(-1.21), SIMDE_BFLOAT16_VALUE(17.08), SIMDE_BFLOAT16_VALUE(39.81) } } }, + { { { SIMDE_BFLOAT16_VALUE(42.99), SIMDE_BFLOAT16_VALUE(-22.57), SIMDE_BFLOAT16_VALUE(-7.51), SIMDE_BFLOAT16_VALUE(-37.37) }, + { SIMDE_BFLOAT16_VALUE(15.49), SIMDE_BFLOAT16_VALUE(-14.01), SIMDE_BFLOAT16_VALUE(30.43), SIMDE_BFLOAT16_VALUE(-22.10) }, + { SIMDE_BFLOAT16_VALUE(-17.08), SIMDE_BFLOAT16_VALUE(28.40), SIMDE_BFLOAT16_VALUE(-3.15), SIMDE_BFLOAT16_VALUE(-9.72) } }, + { SIMDE_BFLOAT16_VALUE(37.03), SIMDE_BFLOAT16_VALUE(-46.18), SIMDE_BFLOAT16_VALUE(30.55)}, + { { SIMDE_BFLOAT16_VALUE(42.99), SIMDE_BFLOAT16_VALUE(-22.57), SIMDE_BFLOAT16_VALUE(37.03), SIMDE_BFLOAT16_VALUE(-37.37) }, + { SIMDE_BFLOAT16_VALUE(15.49), SIMDE_BFLOAT16_VALUE(-14.01), SIMDE_BFLOAT16_VALUE(-46.18), SIMDE_BFLOAT16_VALUE(-22.10) }, + { SIMDE_BFLOAT16_VALUE(-17.08), SIMDE_BFLOAT16_VALUE(28.40), SIMDE_BFLOAT16_VALUE(30.55), SIMDE_BFLOAT16_VALUE(-9.72) } } }, + { { { SIMDE_BFLOAT16_VALUE(-27.48), SIMDE_BFLOAT16_VALUE(13.58), SIMDE_BFLOAT16_VALUE(-24.04), SIMDE_BFLOAT16_VALUE(4.66) }, + { SIMDE_BFLOAT16_VALUE(29.23), SIMDE_BFLOAT16_VALUE(31.79), SIMDE_BFLOAT16_VALUE(-45.75), SIMDE_BFLOAT16_VALUE(38.47) }, + { SIMDE_BFLOAT16_VALUE(-41.39), SIMDE_BFLOAT16_VALUE(-33.55), SIMDE_BFLOAT16_VALUE(-46.68), SIMDE_BFLOAT16_VALUE(19.26) } }, + { SIMDE_BFLOAT16_VALUE(39.57), SIMDE_BFLOAT16_VALUE(-22.13), SIMDE_BFLOAT16_VALUE(6.04)}, + { { SIMDE_BFLOAT16_VALUE(-27.48), SIMDE_BFLOAT16_VALUE(13.58), SIMDE_BFLOAT16_VALUE(-24.04), SIMDE_BFLOAT16_VALUE(39.57) }, + { SIMDE_BFLOAT16_VALUE(29.23), SIMDE_BFLOAT16_VALUE(31.79), SIMDE_BFLOAT16_VALUE(-45.75), SIMDE_BFLOAT16_VALUE(-22.13) }, + { SIMDE_BFLOAT16_VALUE(-41.39), SIMDE_BFLOAT16_VALUE(-33.55), SIMDE_BFLOAT16_VALUE(-46.68), SIMDE_BFLOAT16_VALUE(6.04) } } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4x3_t r, src, expected; + src.val[0] = simde_vld1_bf16(test_vec[i].src[0]); + src.val[1] = simde_vld1_bf16(test_vec[i].src[1]); + src.val[2] = simde_vld1_bf16(test_vec[i].src[2]); + + SIMDE_CONSTIFY_4_(simde_vld3_lane_bf16, r, (HEDLEY_UNREACHABLE(), r), i, test_vec[i].buf, src); + + expected.val[0] = simde_vld1_bf16(test_vec[i].r[0]); + expected.val[1] = simde_vld1_bf16(test_vec[i].r[1]); + expected.val[2] = simde_vld1_bf16(test_vec[i].r[2]); + + simde_test_arm_neon_assert_equal_bf16x4(r.val[0], expected.val[0], INT_MAX); + simde_test_arm_neon_assert_equal_bf16x4(r.val[1], expected.val[1], INT_MAX); + simde_test_arm_neon_assert_equal_bf16x4(r.val[2], expected.val[2], INT_MAX); + } + + return 0; +} + +static int +test_simde_vld3q_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t src[3][8]; + simde_bfloat16_t buf[3]; + simde_bfloat16_t r[3][8]; + } test_vec[] = { + { { { SIMDE_BFLOAT16_VALUE(25.81), SIMDE_BFLOAT16_VALUE(32.75), SIMDE_BFLOAT16_VALUE(23.73), SIMDE_BFLOAT16_VALUE(-45.72), + SIMDE_BFLOAT16_VALUE(21.87), SIMDE_BFLOAT16_VALUE(8.97), SIMDE_BFLOAT16_VALUE(-15.67), SIMDE_BFLOAT16_VALUE(26.89) }, + { SIMDE_BFLOAT16_VALUE(16.63), SIMDE_BFLOAT16_VALUE(6.70), SIMDE_BFLOAT16_VALUE(26.16), SIMDE_BFLOAT16_VALUE(-0.53), + SIMDE_BFLOAT16_VALUE(-39.38), SIMDE_BFLOAT16_VALUE(-30.03), SIMDE_BFLOAT16_VALUE(33.53), SIMDE_BFLOAT16_VALUE(-5.08) }, + { SIMDE_BFLOAT16_VALUE(24.18), SIMDE_BFLOAT16_VALUE(-0.77), SIMDE_BFLOAT16_VALUE(-38.76), SIMDE_BFLOAT16_VALUE(23.74), + SIMDE_BFLOAT16_VALUE(-37.79), SIMDE_BFLOAT16_VALUE(-12.87), SIMDE_BFLOAT16_VALUE(35.22), SIMDE_BFLOAT16_VALUE(18.82) } }, + { SIMDE_BFLOAT16_VALUE(18.75), SIMDE_BFLOAT16_VALUE(-19.33), SIMDE_BFLOAT16_VALUE(-8.32)}, + { { SIMDE_BFLOAT16_VALUE(18.75), SIMDE_BFLOAT16_VALUE(32.75), SIMDE_BFLOAT16_VALUE(23.73), SIMDE_BFLOAT16_VALUE(-45.72), + SIMDE_BFLOAT16_VALUE(21.87), SIMDE_BFLOAT16_VALUE(8.97), SIMDE_BFLOAT16_VALUE(-15.67), SIMDE_BFLOAT16_VALUE(26.89) }, + { SIMDE_BFLOAT16_VALUE(-19.33), SIMDE_BFLOAT16_VALUE(6.70), SIMDE_BFLOAT16_VALUE(26.16), SIMDE_BFLOAT16_VALUE(-0.53), + SIMDE_BFLOAT16_VALUE(-39.38), SIMDE_BFLOAT16_VALUE(-30.03), SIMDE_BFLOAT16_VALUE(33.53), SIMDE_BFLOAT16_VALUE(-5.08) }, + { SIMDE_BFLOAT16_VALUE(-8.32), SIMDE_BFLOAT16_VALUE(-0.77), SIMDE_BFLOAT16_VALUE(-38.76), SIMDE_BFLOAT16_VALUE(23.74), + SIMDE_BFLOAT16_VALUE(-37.79), SIMDE_BFLOAT16_VALUE(-12.87), SIMDE_BFLOAT16_VALUE(35.22), SIMDE_BFLOAT16_VALUE(18.82) } } }, + { { { SIMDE_BFLOAT16_VALUE(-21.87), SIMDE_BFLOAT16_VALUE(-23.46), SIMDE_BFLOAT16_VALUE(43.50), SIMDE_BFLOAT16_VALUE(-42.37), + SIMDE_BFLOAT16_VALUE(38.96), SIMDE_BFLOAT16_VALUE(-39.73), SIMDE_BFLOAT16_VALUE(1.99), SIMDE_BFLOAT16_VALUE(13.47) }, + { SIMDE_BFLOAT16_VALUE(-21.30), SIMDE_BFLOAT16_VALUE(31.71), SIMDE_BFLOAT16_VALUE(43.14), SIMDE_BFLOAT16_VALUE(6.05), + SIMDE_BFLOAT16_VALUE(-9.36), SIMDE_BFLOAT16_VALUE(31.44), SIMDE_BFLOAT16_VALUE(-1.40), SIMDE_BFLOAT16_VALUE(-46.83) }, + { SIMDE_BFLOAT16_VALUE(22.32), SIMDE_BFLOAT16_VALUE(-30.37), SIMDE_BFLOAT16_VALUE(-16.31), SIMDE_BFLOAT16_VALUE(48.67), + SIMDE_BFLOAT16_VALUE(-32.26), SIMDE_BFLOAT16_VALUE(-43.03), SIMDE_BFLOAT16_VALUE(-31.49), SIMDE_BFLOAT16_VALUE(-29.73) } }, + { SIMDE_BFLOAT16_VALUE(-19.96), SIMDE_BFLOAT16_VALUE(16.11), SIMDE_BFLOAT16_VALUE(15.29)}, + { { SIMDE_BFLOAT16_VALUE(-21.87), SIMDE_BFLOAT16_VALUE(-19.96), SIMDE_BFLOAT16_VALUE(43.50), SIMDE_BFLOAT16_VALUE(-42.37), + SIMDE_BFLOAT16_VALUE(38.96), SIMDE_BFLOAT16_VALUE(-39.73), SIMDE_BFLOAT16_VALUE(1.99), SIMDE_BFLOAT16_VALUE(13.47) }, + { SIMDE_BFLOAT16_VALUE(-21.30), SIMDE_BFLOAT16_VALUE(16.11), SIMDE_BFLOAT16_VALUE(43.14), SIMDE_BFLOAT16_VALUE(6.05), + SIMDE_BFLOAT16_VALUE(-9.36), SIMDE_BFLOAT16_VALUE(31.44), SIMDE_BFLOAT16_VALUE(-1.40), SIMDE_BFLOAT16_VALUE(-46.83) }, + { SIMDE_BFLOAT16_VALUE(22.32), SIMDE_BFLOAT16_VALUE(15.29), SIMDE_BFLOAT16_VALUE(-16.31), SIMDE_BFLOAT16_VALUE(48.67), + SIMDE_BFLOAT16_VALUE(-32.26), SIMDE_BFLOAT16_VALUE(-43.03), SIMDE_BFLOAT16_VALUE(-31.49), SIMDE_BFLOAT16_VALUE(-29.73) } } }, + { { { SIMDE_BFLOAT16_VALUE(22.99), SIMDE_BFLOAT16_VALUE(19.29), SIMDE_BFLOAT16_VALUE(-46.27), SIMDE_BFLOAT16_VALUE(-49.21), + SIMDE_BFLOAT16_VALUE(48.55), SIMDE_BFLOAT16_VALUE(49.51), SIMDE_BFLOAT16_VALUE(1.68), SIMDE_BFLOAT16_VALUE(4.07) }, + { SIMDE_BFLOAT16_VALUE(-8.20), SIMDE_BFLOAT16_VALUE(5.11), SIMDE_BFLOAT16_VALUE(17.40), SIMDE_BFLOAT16_VALUE(-3.87), + SIMDE_BFLOAT16_VALUE(-20.55), SIMDE_BFLOAT16_VALUE(19.44), SIMDE_BFLOAT16_VALUE(-49.04), SIMDE_BFLOAT16_VALUE(-1.42) }, + { SIMDE_BFLOAT16_VALUE(22.33), SIMDE_BFLOAT16_VALUE(-45.53), SIMDE_BFLOAT16_VALUE(-33.31), SIMDE_BFLOAT16_VALUE(-20.16), + SIMDE_BFLOAT16_VALUE(-39.51), SIMDE_BFLOAT16_VALUE(-20.23), SIMDE_BFLOAT16_VALUE(-41.96), SIMDE_BFLOAT16_VALUE(-27.75) } }, + { SIMDE_BFLOAT16_VALUE(21.67), SIMDE_BFLOAT16_VALUE(-1.62), SIMDE_BFLOAT16_VALUE(47.29)}, + { { SIMDE_BFLOAT16_VALUE(22.99), SIMDE_BFLOAT16_VALUE(19.29), SIMDE_BFLOAT16_VALUE(21.67), SIMDE_BFLOAT16_VALUE(-49.21), + SIMDE_BFLOAT16_VALUE(48.55), SIMDE_BFLOAT16_VALUE(49.51), SIMDE_BFLOAT16_VALUE(1.68), SIMDE_BFLOAT16_VALUE(4.07) }, + { SIMDE_BFLOAT16_VALUE(-8.20), SIMDE_BFLOAT16_VALUE(5.11), SIMDE_BFLOAT16_VALUE(-1.62), SIMDE_BFLOAT16_VALUE(-3.87), + SIMDE_BFLOAT16_VALUE(-20.55), SIMDE_BFLOAT16_VALUE(19.44), SIMDE_BFLOAT16_VALUE(-49.04), SIMDE_BFLOAT16_VALUE(-1.42) }, + { SIMDE_BFLOAT16_VALUE(22.33), SIMDE_BFLOAT16_VALUE(-45.53), SIMDE_BFLOAT16_VALUE(47.29), SIMDE_BFLOAT16_VALUE(-20.16), + SIMDE_BFLOAT16_VALUE(-39.51), SIMDE_BFLOAT16_VALUE(-20.23), SIMDE_BFLOAT16_VALUE(-41.96), SIMDE_BFLOAT16_VALUE(-27.75) } } }, + { { { SIMDE_BFLOAT16_VALUE(-13.98), SIMDE_BFLOAT16_VALUE(-15.40), SIMDE_BFLOAT16_VALUE(-41.40), SIMDE_BFLOAT16_VALUE(-11.10), + SIMDE_BFLOAT16_VALUE(-0.98), SIMDE_BFLOAT16_VALUE(20.30), SIMDE_BFLOAT16_VALUE(-21.19), SIMDE_BFLOAT16_VALUE(32.22) }, + { SIMDE_BFLOAT16_VALUE(-29.71), SIMDE_BFLOAT16_VALUE(-33.61), SIMDE_BFLOAT16_VALUE(-34.96), SIMDE_BFLOAT16_VALUE(22.05), + SIMDE_BFLOAT16_VALUE(-46.85), SIMDE_BFLOAT16_VALUE(49.18), SIMDE_BFLOAT16_VALUE(29.80), SIMDE_BFLOAT16_VALUE(15.12) }, + { SIMDE_BFLOAT16_VALUE(-48.25), SIMDE_BFLOAT16_VALUE(20.21), SIMDE_BFLOAT16_VALUE(30.89), SIMDE_BFLOAT16_VALUE(-8.00), + SIMDE_BFLOAT16_VALUE(47.59), SIMDE_BFLOAT16_VALUE(-33.30), SIMDE_BFLOAT16_VALUE(-17.17), SIMDE_BFLOAT16_VALUE(15.96) } }, + { SIMDE_BFLOAT16_VALUE(-22.71), SIMDE_BFLOAT16_VALUE(18.03), SIMDE_BFLOAT16_VALUE(-12.62)}, + { { SIMDE_BFLOAT16_VALUE(-13.98), SIMDE_BFLOAT16_VALUE(-15.40), SIMDE_BFLOAT16_VALUE(-41.40), SIMDE_BFLOAT16_VALUE(-22.71), + SIMDE_BFLOAT16_VALUE(-0.98), SIMDE_BFLOAT16_VALUE(20.30), SIMDE_BFLOAT16_VALUE(-21.19), SIMDE_BFLOAT16_VALUE(32.22) }, + { SIMDE_BFLOAT16_VALUE(-29.71), SIMDE_BFLOAT16_VALUE(-33.61), SIMDE_BFLOAT16_VALUE(-34.96), SIMDE_BFLOAT16_VALUE(18.03), + SIMDE_BFLOAT16_VALUE(-46.85), SIMDE_BFLOAT16_VALUE(49.18), SIMDE_BFLOAT16_VALUE(29.80), SIMDE_BFLOAT16_VALUE(15.12) }, + { SIMDE_BFLOAT16_VALUE(-48.25), SIMDE_BFLOAT16_VALUE(20.21), SIMDE_BFLOAT16_VALUE(30.89), SIMDE_BFLOAT16_VALUE(-12.62), + SIMDE_BFLOAT16_VALUE(47.59), SIMDE_BFLOAT16_VALUE(-33.30), SIMDE_BFLOAT16_VALUE(-17.17), SIMDE_BFLOAT16_VALUE(15.96) } } }, + { { { SIMDE_BFLOAT16_VALUE(-33.16), SIMDE_BFLOAT16_VALUE(41.77), SIMDE_BFLOAT16_VALUE(0.37), SIMDE_BFLOAT16_VALUE(49.97), + SIMDE_BFLOAT16_VALUE(41.81), SIMDE_BFLOAT16_VALUE(-38.26), SIMDE_BFLOAT16_VALUE(36.03), SIMDE_BFLOAT16_VALUE(-6.12) }, + { SIMDE_BFLOAT16_VALUE(45.98), SIMDE_BFLOAT16_VALUE(33.57), SIMDE_BFLOAT16_VALUE(4.26), SIMDE_BFLOAT16_VALUE(19.87), + SIMDE_BFLOAT16_VALUE(6.49), SIMDE_BFLOAT16_VALUE(3.23), SIMDE_BFLOAT16_VALUE(17.28), SIMDE_BFLOAT16_VALUE(-0.70) }, + { SIMDE_BFLOAT16_VALUE(-45.21), SIMDE_BFLOAT16_VALUE(10.70), SIMDE_BFLOAT16_VALUE(-30.89), SIMDE_BFLOAT16_VALUE(17.48), + SIMDE_BFLOAT16_VALUE(-18.12), SIMDE_BFLOAT16_VALUE(-36.32), SIMDE_BFLOAT16_VALUE(12.70), SIMDE_BFLOAT16_VALUE(-9.89) } }, + { SIMDE_BFLOAT16_VALUE(19.50), SIMDE_BFLOAT16_VALUE(43.23), SIMDE_BFLOAT16_VALUE(-34.14)}, + { { SIMDE_BFLOAT16_VALUE(-33.16), SIMDE_BFLOAT16_VALUE(41.77), SIMDE_BFLOAT16_VALUE(0.37), SIMDE_BFLOAT16_VALUE(49.97), + SIMDE_BFLOAT16_VALUE(19.50), SIMDE_BFLOAT16_VALUE(-38.26), SIMDE_BFLOAT16_VALUE(36.03), SIMDE_BFLOAT16_VALUE(-6.12) }, + { SIMDE_BFLOAT16_VALUE(45.98), SIMDE_BFLOAT16_VALUE(33.57), SIMDE_BFLOAT16_VALUE(4.26), SIMDE_BFLOAT16_VALUE(19.87), + SIMDE_BFLOAT16_VALUE(43.23), SIMDE_BFLOAT16_VALUE(3.23), SIMDE_BFLOAT16_VALUE(17.28), SIMDE_BFLOAT16_VALUE(-0.70) }, + { SIMDE_BFLOAT16_VALUE(-45.21), SIMDE_BFLOAT16_VALUE(10.70), SIMDE_BFLOAT16_VALUE(-30.89), SIMDE_BFLOAT16_VALUE(17.48), + SIMDE_BFLOAT16_VALUE(-34.14), SIMDE_BFLOAT16_VALUE(-36.32), SIMDE_BFLOAT16_VALUE(12.70), SIMDE_BFLOAT16_VALUE(-9.89) } } }, + { { { SIMDE_BFLOAT16_VALUE(34.35), SIMDE_BFLOAT16_VALUE(45.11), SIMDE_BFLOAT16_VALUE(-17.38), SIMDE_BFLOAT16_VALUE(32.13), + SIMDE_BFLOAT16_VALUE(-19.58), SIMDE_BFLOAT16_VALUE(-5.73), SIMDE_BFLOAT16_VALUE(-14.12), SIMDE_BFLOAT16_VALUE(-0.42) }, + { SIMDE_BFLOAT16_VALUE(-17.04), SIMDE_BFLOAT16_VALUE(40.80), SIMDE_BFLOAT16_VALUE(-45.80), SIMDE_BFLOAT16_VALUE(37.28), + SIMDE_BFLOAT16_VALUE(35.24), SIMDE_BFLOAT16_VALUE(40.83), SIMDE_BFLOAT16_VALUE(41.86), SIMDE_BFLOAT16_VALUE(16.76) }, + { SIMDE_BFLOAT16_VALUE(44.82), SIMDE_BFLOAT16_VALUE(44.21), SIMDE_BFLOAT16_VALUE(-16.87), SIMDE_BFLOAT16_VALUE(28.04), + SIMDE_BFLOAT16_VALUE(12.42), SIMDE_BFLOAT16_VALUE(-24.77), SIMDE_BFLOAT16_VALUE(-2.03), SIMDE_BFLOAT16_VALUE(6.16) } }, + { SIMDE_BFLOAT16_VALUE(24.51), SIMDE_BFLOAT16_VALUE(-14.45), SIMDE_BFLOAT16_VALUE(-29.20)}, + { { SIMDE_BFLOAT16_VALUE(34.35), SIMDE_BFLOAT16_VALUE(45.11), SIMDE_BFLOAT16_VALUE(-17.38), SIMDE_BFLOAT16_VALUE(32.13), + SIMDE_BFLOAT16_VALUE(-19.58), SIMDE_BFLOAT16_VALUE(24.51), SIMDE_BFLOAT16_VALUE(-14.12), SIMDE_BFLOAT16_VALUE(-0.42) }, + { SIMDE_BFLOAT16_VALUE(-17.04), SIMDE_BFLOAT16_VALUE(40.80), SIMDE_BFLOAT16_VALUE(-45.80), SIMDE_BFLOAT16_VALUE(37.28), + SIMDE_BFLOAT16_VALUE(35.24), SIMDE_BFLOAT16_VALUE(-14.45), SIMDE_BFLOAT16_VALUE(41.86), SIMDE_BFLOAT16_VALUE(16.76) }, + { SIMDE_BFLOAT16_VALUE(44.82), SIMDE_BFLOAT16_VALUE(44.21), SIMDE_BFLOAT16_VALUE(-16.87), SIMDE_BFLOAT16_VALUE(28.04), + SIMDE_BFLOAT16_VALUE(12.42), SIMDE_BFLOAT16_VALUE(-29.20), SIMDE_BFLOAT16_VALUE(-2.03), SIMDE_BFLOAT16_VALUE(6.16) } } }, + { { { SIMDE_BFLOAT16_VALUE(-19.86), SIMDE_BFLOAT16_VALUE(-49.12), SIMDE_BFLOAT16_VALUE(-43.11), SIMDE_BFLOAT16_VALUE(6.61), + SIMDE_BFLOAT16_VALUE(-14.42), SIMDE_BFLOAT16_VALUE(-26.68), SIMDE_BFLOAT16_VALUE(-14.21), SIMDE_BFLOAT16_VALUE(-19.62) }, + { SIMDE_BFLOAT16_VALUE(2.80), SIMDE_BFLOAT16_VALUE(21.66), SIMDE_BFLOAT16_VALUE(-36.49), SIMDE_BFLOAT16_VALUE(-15.12), + SIMDE_BFLOAT16_VALUE(-49.41), SIMDE_BFLOAT16_VALUE(-26.19), SIMDE_BFLOAT16_VALUE(-24.23), SIMDE_BFLOAT16_VALUE(36.09) }, + { SIMDE_BFLOAT16_VALUE(10.26), SIMDE_BFLOAT16_VALUE(31.20), SIMDE_BFLOAT16_VALUE(-42.59), SIMDE_BFLOAT16_VALUE(22.36), + SIMDE_BFLOAT16_VALUE(-1.95), SIMDE_BFLOAT16_VALUE(-8.53), SIMDE_BFLOAT16_VALUE(37.02), SIMDE_BFLOAT16_VALUE(-47.32) } }, + { SIMDE_BFLOAT16_VALUE(-2.66), SIMDE_BFLOAT16_VALUE(-28.19), SIMDE_BFLOAT16_VALUE(-49.39)}, + { { SIMDE_BFLOAT16_VALUE(-19.86), SIMDE_BFLOAT16_VALUE(-49.12), SIMDE_BFLOAT16_VALUE(-43.11), SIMDE_BFLOAT16_VALUE(6.61), + SIMDE_BFLOAT16_VALUE(-14.42), SIMDE_BFLOAT16_VALUE(-26.68), SIMDE_BFLOAT16_VALUE(-2.66), SIMDE_BFLOAT16_VALUE(-19.62) }, + { SIMDE_BFLOAT16_VALUE(2.80), SIMDE_BFLOAT16_VALUE(21.66), SIMDE_BFLOAT16_VALUE(-36.49), SIMDE_BFLOAT16_VALUE(-15.12), + SIMDE_BFLOAT16_VALUE(-49.41), SIMDE_BFLOAT16_VALUE(-26.19), SIMDE_BFLOAT16_VALUE(-28.19), SIMDE_BFLOAT16_VALUE(36.09) }, + { SIMDE_BFLOAT16_VALUE(10.26), SIMDE_BFLOAT16_VALUE(31.20), SIMDE_BFLOAT16_VALUE(-42.59), SIMDE_BFLOAT16_VALUE(22.36), + SIMDE_BFLOAT16_VALUE(-1.95), SIMDE_BFLOAT16_VALUE(-8.53), SIMDE_BFLOAT16_VALUE(-49.39), SIMDE_BFLOAT16_VALUE(-47.32) } } }, + { { { SIMDE_BFLOAT16_VALUE(0.30), SIMDE_BFLOAT16_VALUE(6.73), SIMDE_BFLOAT16_VALUE(-6.28), SIMDE_BFLOAT16_VALUE(35.22), + SIMDE_BFLOAT16_VALUE(-5.78), SIMDE_BFLOAT16_VALUE(-32.42), SIMDE_BFLOAT16_VALUE(-25.16), SIMDE_BFLOAT16_VALUE(14.50) }, + { SIMDE_BFLOAT16_VALUE(9.20), SIMDE_BFLOAT16_VALUE(15.26), SIMDE_BFLOAT16_VALUE(14.27), SIMDE_BFLOAT16_VALUE(24.06), + SIMDE_BFLOAT16_VALUE(9.76), SIMDE_BFLOAT16_VALUE(-32.84), SIMDE_BFLOAT16_VALUE(23.54), SIMDE_BFLOAT16_VALUE(-38.60) }, + { SIMDE_BFLOAT16_VALUE(-2.89), SIMDE_BFLOAT16_VALUE(-12.52), SIMDE_BFLOAT16_VALUE(-24.22), SIMDE_BFLOAT16_VALUE(45.18), + SIMDE_BFLOAT16_VALUE(-49.48), SIMDE_BFLOAT16_VALUE(-38.06), SIMDE_BFLOAT16_VALUE(0.89), SIMDE_BFLOAT16_VALUE(-2.25) } }, + { SIMDE_BFLOAT16_VALUE(2.18), SIMDE_BFLOAT16_VALUE(35.99), SIMDE_BFLOAT16_VALUE(26.18)}, + { { SIMDE_BFLOAT16_VALUE(0.30), SIMDE_BFLOAT16_VALUE(6.73), SIMDE_BFLOAT16_VALUE(-6.28), SIMDE_BFLOAT16_VALUE(35.22), + SIMDE_BFLOAT16_VALUE(-5.78), SIMDE_BFLOAT16_VALUE(-32.42), SIMDE_BFLOAT16_VALUE(-25.16), SIMDE_BFLOAT16_VALUE(2.18) }, + { SIMDE_BFLOAT16_VALUE(9.20), SIMDE_BFLOAT16_VALUE(15.26), SIMDE_BFLOAT16_VALUE(14.27), SIMDE_BFLOAT16_VALUE(24.06), + SIMDE_BFLOAT16_VALUE(9.76), SIMDE_BFLOAT16_VALUE(-32.84), SIMDE_BFLOAT16_VALUE(23.54), SIMDE_BFLOAT16_VALUE(35.99) }, + { SIMDE_BFLOAT16_VALUE(-2.89), SIMDE_BFLOAT16_VALUE(-12.52), SIMDE_BFLOAT16_VALUE(-24.22), SIMDE_BFLOAT16_VALUE(45.18), + SIMDE_BFLOAT16_VALUE(-49.48), SIMDE_BFLOAT16_VALUE(-38.06), SIMDE_BFLOAT16_VALUE(0.89), SIMDE_BFLOAT16_VALUE(26.18) } } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8x3_t r, src, expected; + src.val[0] = simde_vld1q_bf16(test_vec[i].src[0]); + src.val[1] = simde_vld1q_bf16(test_vec[i].src[1]); + src.val[2] = simde_vld1q_bf16(test_vec[i].src[2]); + + SIMDE_CONSTIFY_8_(simde_vld3q_lane_bf16, r, (HEDLEY_UNREACHABLE(), r), i, test_vec[i].buf, src); + + expected.val[0] = simde_vld1q_bf16(test_vec[i].r[0]); + expected.val[1] = simde_vld1q_bf16(test_vec[i].r[1]); + expected.val[2] = simde_vld1q_bf16(test_vec[i].r[2]); + + simde_test_arm_neon_assert_equal_bf16x8(r.val[0], expected.val[0], INT_MAX); + simde_test_arm_neon_assert_equal_bf16x8(r.val[1], expected.val[1], INT_MAX); + simde_test_arm_neon_assert_equal_bf16x8(r.val[2], expected.val[2], INT_MAX); + } + + return 0; +} + SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vld3_lane_s8) SIMDE_TEST_FUNC_LIST_ENTRY(vld3_lane_s16) @@ -2501,6 +2691,8 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vld3_lane_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vld3q_lane_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vld3q_lane_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vld3q_lane_p64) +SIMDE_TEST_FUNC_LIST_ENTRY(vld3_lane_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vld3q_lane_bf16) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/ld4_dup.c b/test/arm/neon/ld4_dup.c index f630acc02..caa771d57 100644 --- a/test/arm/neon/ld4_dup.c +++ b/test/arm/neon/ld4_dup.c @@ -2378,6 +2378,182 @@ test_simde_vld4q_dup_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vld4_dup_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t a[4]; + simde_bfloat16_t unused[4]; + simde_bfloat16_t r[4][4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(48.08), SIMDE_BFLOAT16_VALUE(24.50), SIMDE_BFLOAT16_VALUE(47.79), SIMDE_BFLOAT16_VALUE(45.49) }, + { SIMDE_BFLOAT16_VALUE(-22.72), SIMDE_BFLOAT16_VALUE(6.28), SIMDE_BFLOAT16_VALUE(-7.03), SIMDE_BFLOAT16_VALUE(41.06)}, + { { SIMDE_BFLOAT16_VALUE(48.08), SIMDE_BFLOAT16_VALUE(48.08), SIMDE_BFLOAT16_VALUE(48.08), SIMDE_BFLOAT16_VALUE(48.08) }, + { SIMDE_BFLOAT16_VALUE(24.50), SIMDE_BFLOAT16_VALUE(24.50), SIMDE_BFLOAT16_VALUE(24.50), SIMDE_BFLOAT16_VALUE(24.50) }, + { SIMDE_BFLOAT16_VALUE(47.79), SIMDE_BFLOAT16_VALUE(47.79), SIMDE_BFLOAT16_VALUE(47.79), SIMDE_BFLOAT16_VALUE(47.79) }, + { SIMDE_BFLOAT16_VALUE(45.49), SIMDE_BFLOAT16_VALUE(45.49), SIMDE_BFLOAT16_VALUE(45.49), SIMDE_BFLOAT16_VALUE(45.49) } } }, + { { SIMDE_BFLOAT16_VALUE(41.90), SIMDE_BFLOAT16_VALUE(-45.37), SIMDE_BFLOAT16_VALUE(43.54), SIMDE_BFLOAT16_VALUE(10.59) }, + { SIMDE_BFLOAT16_VALUE(36.07), SIMDE_BFLOAT16_VALUE(28.31), SIMDE_BFLOAT16_VALUE(-11.82), SIMDE_BFLOAT16_VALUE(-16.27)}, + { { SIMDE_BFLOAT16_VALUE(41.90), SIMDE_BFLOAT16_VALUE(41.90), SIMDE_BFLOAT16_VALUE(41.90), SIMDE_BFLOAT16_VALUE(41.90) }, + { SIMDE_BFLOAT16_VALUE(-45.37), SIMDE_BFLOAT16_VALUE(-45.37), SIMDE_BFLOAT16_VALUE(-45.37), SIMDE_BFLOAT16_VALUE(-45.37) }, + { SIMDE_BFLOAT16_VALUE(43.54), SIMDE_BFLOAT16_VALUE(43.54), SIMDE_BFLOAT16_VALUE(43.54), SIMDE_BFLOAT16_VALUE(43.54) }, + { SIMDE_BFLOAT16_VALUE(10.59), SIMDE_BFLOAT16_VALUE(10.59), SIMDE_BFLOAT16_VALUE(10.59), SIMDE_BFLOAT16_VALUE(10.59) } } }, + { { SIMDE_BFLOAT16_VALUE(3.73), SIMDE_BFLOAT16_VALUE(-41.80), SIMDE_BFLOAT16_VALUE(16.45), SIMDE_BFLOAT16_VALUE(28.24) }, + { SIMDE_BFLOAT16_VALUE(14.07), SIMDE_BFLOAT16_VALUE(-1.72), SIMDE_BFLOAT16_VALUE(-31.48), SIMDE_BFLOAT16_VALUE(-4.95)}, + { { SIMDE_BFLOAT16_VALUE(3.73), SIMDE_BFLOAT16_VALUE(3.73), SIMDE_BFLOAT16_VALUE(3.73), SIMDE_BFLOAT16_VALUE(3.73) }, + { SIMDE_BFLOAT16_VALUE(-41.80), SIMDE_BFLOAT16_VALUE(-41.80), SIMDE_BFLOAT16_VALUE(-41.80), SIMDE_BFLOAT16_VALUE(-41.80) }, + { SIMDE_BFLOAT16_VALUE(16.45), SIMDE_BFLOAT16_VALUE(16.45), SIMDE_BFLOAT16_VALUE(16.45), SIMDE_BFLOAT16_VALUE(16.45) }, + { SIMDE_BFLOAT16_VALUE(28.24), SIMDE_BFLOAT16_VALUE(28.24), SIMDE_BFLOAT16_VALUE(28.24), SIMDE_BFLOAT16_VALUE(28.24) } } }, + { { SIMDE_BFLOAT16_VALUE(-14.57), SIMDE_BFLOAT16_VALUE(15.78), SIMDE_BFLOAT16_VALUE(3.71), SIMDE_BFLOAT16_VALUE(-44.25) }, + { SIMDE_BFLOAT16_VALUE(30.42), SIMDE_BFLOAT16_VALUE(7.31), SIMDE_BFLOAT16_VALUE(-31.88), SIMDE_BFLOAT16_VALUE(23.92)}, + { { SIMDE_BFLOAT16_VALUE(-14.57), SIMDE_BFLOAT16_VALUE(-14.57), SIMDE_BFLOAT16_VALUE(-14.57), SIMDE_BFLOAT16_VALUE(-14.57) }, + { SIMDE_BFLOAT16_VALUE(15.78), SIMDE_BFLOAT16_VALUE(15.78), SIMDE_BFLOAT16_VALUE(15.78), SIMDE_BFLOAT16_VALUE(15.78) }, + { SIMDE_BFLOAT16_VALUE(3.71), SIMDE_BFLOAT16_VALUE(3.71), SIMDE_BFLOAT16_VALUE(3.71), SIMDE_BFLOAT16_VALUE(3.71) }, + { SIMDE_BFLOAT16_VALUE(-44.25), SIMDE_BFLOAT16_VALUE(-44.25), SIMDE_BFLOAT16_VALUE(-44.25), SIMDE_BFLOAT16_VALUE(-44.25) } } }, + { { SIMDE_BFLOAT16_VALUE(-7.08), SIMDE_BFLOAT16_VALUE(-13.75), SIMDE_BFLOAT16_VALUE(-46.19), SIMDE_BFLOAT16_VALUE(14.37) }, + { SIMDE_BFLOAT16_VALUE(-44.62), SIMDE_BFLOAT16_VALUE(-35.77), SIMDE_BFLOAT16_VALUE(-19.37), SIMDE_BFLOAT16_VALUE(18.25)}, + { { SIMDE_BFLOAT16_VALUE(-7.08), SIMDE_BFLOAT16_VALUE(-7.08), SIMDE_BFLOAT16_VALUE(-7.08), SIMDE_BFLOAT16_VALUE(-7.08) }, + { SIMDE_BFLOAT16_VALUE(-13.75), SIMDE_BFLOAT16_VALUE(-13.75), SIMDE_BFLOAT16_VALUE(-13.75), SIMDE_BFLOAT16_VALUE(-13.75) }, + { SIMDE_BFLOAT16_VALUE(-46.19), SIMDE_BFLOAT16_VALUE(-46.19), SIMDE_BFLOAT16_VALUE(-46.19), SIMDE_BFLOAT16_VALUE(-46.19) }, + { SIMDE_BFLOAT16_VALUE(14.37), SIMDE_BFLOAT16_VALUE(14.37), SIMDE_BFLOAT16_VALUE(14.37), SIMDE_BFLOAT16_VALUE(14.37) } } }, + { { SIMDE_BFLOAT16_VALUE(-41.21), SIMDE_BFLOAT16_VALUE(23.55), SIMDE_BFLOAT16_VALUE(-20.74), SIMDE_BFLOAT16_VALUE(31.91) }, + { SIMDE_BFLOAT16_VALUE(-5.45), SIMDE_BFLOAT16_VALUE(-43.69), SIMDE_BFLOAT16_VALUE(1.07), SIMDE_BFLOAT16_VALUE(-15.34)}, + { { SIMDE_BFLOAT16_VALUE(-41.21), SIMDE_BFLOAT16_VALUE(-41.21), SIMDE_BFLOAT16_VALUE(-41.21), SIMDE_BFLOAT16_VALUE(-41.21) }, + { SIMDE_BFLOAT16_VALUE(23.55), SIMDE_BFLOAT16_VALUE(23.55), SIMDE_BFLOAT16_VALUE(23.55), SIMDE_BFLOAT16_VALUE(23.55) }, + { SIMDE_BFLOAT16_VALUE(-20.74), SIMDE_BFLOAT16_VALUE(-20.74), SIMDE_BFLOAT16_VALUE(-20.74), SIMDE_BFLOAT16_VALUE(-20.74) }, + { SIMDE_BFLOAT16_VALUE(31.91), SIMDE_BFLOAT16_VALUE(31.91), SIMDE_BFLOAT16_VALUE(31.91), SIMDE_BFLOAT16_VALUE(31.91) } } }, + { { SIMDE_BFLOAT16_VALUE(12.19), SIMDE_BFLOAT16_VALUE(-39.62), SIMDE_BFLOAT16_VALUE(26.35), SIMDE_BFLOAT16_VALUE(24.05) }, + { SIMDE_BFLOAT16_VALUE(14.14), SIMDE_BFLOAT16_VALUE(-6.68), SIMDE_BFLOAT16_VALUE(-34.58), SIMDE_BFLOAT16_VALUE(17.64)}, + { { SIMDE_BFLOAT16_VALUE(12.19), SIMDE_BFLOAT16_VALUE(12.19), SIMDE_BFLOAT16_VALUE(12.19), SIMDE_BFLOAT16_VALUE(12.19) }, + { SIMDE_BFLOAT16_VALUE(-39.62), SIMDE_BFLOAT16_VALUE(-39.62), SIMDE_BFLOAT16_VALUE(-39.62), SIMDE_BFLOAT16_VALUE(-39.62) }, + { SIMDE_BFLOAT16_VALUE(26.35), SIMDE_BFLOAT16_VALUE(26.35), SIMDE_BFLOAT16_VALUE(26.35), SIMDE_BFLOAT16_VALUE(26.35) }, + { SIMDE_BFLOAT16_VALUE(24.05), SIMDE_BFLOAT16_VALUE(24.05), SIMDE_BFLOAT16_VALUE(24.05), SIMDE_BFLOAT16_VALUE(24.05) } } }, + { { SIMDE_BFLOAT16_VALUE(32.66), SIMDE_BFLOAT16_VALUE(22.65), SIMDE_BFLOAT16_VALUE(-23.52), SIMDE_BFLOAT16_VALUE(8.31) }, + { SIMDE_BFLOAT16_VALUE(-26.83), SIMDE_BFLOAT16_VALUE(-6.25), SIMDE_BFLOAT16_VALUE(38.29), SIMDE_BFLOAT16_VALUE(-48.88)}, + { { SIMDE_BFLOAT16_VALUE(32.66), SIMDE_BFLOAT16_VALUE(32.66), SIMDE_BFLOAT16_VALUE(32.66), SIMDE_BFLOAT16_VALUE(32.66) }, + { SIMDE_BFLOAT16_VALUE(22.65), SIMDE_BFLOAT16_VALUE(22.65), SIMDE_BFLOAT16_VALUE(22.65), SIMDE_BFLOAT16_VALUE(22.65) }, + { SIMDE_BFLOAT16_VALUE(-23.52), SIMDE_BFLOAT16_VALUE(-23.52), SIMDE_BFLOAT16_VALUE(-23.52), SIMDE_BFLOAT16_VALUE(-23.52) }, + { SIMDE_BFLOAT16_VALUE(8.31), SIMDE_BFLOAT16_VALUE(8.31), SIMDE_BFLOAT16_VALUE(8.31), SIMDE_BFLOAT16_VALUE(8.31) } } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4x4_t r = simde_vld4_dup_bf16(test_vec[i].a); + simde_bfloat16x4x4_t expected = { + {simde_vld1_bf16(test_vec[i].r[0]), simde_vld1_bf16(test_vec[i].r[1]), + simde_vld1_bf16(test_vec[i].r[2]), simde_vld1_bf16(test_vec[i].r[3])}}; + + simde_test_arm_neon_assert_equal_bf16x4(r.val[0], expected.val[0], INT_MAX); + simde_test_arm_neon_assert_equal_bf16x4(r.val[1], expected.val[1], INT_MAX); + simde_test_arm_neon_assert_equal_bf16x4(r.val[2], expected.val[2], INT_MAX); + simde_test_arm_neon_assert_equal_bf16x4(r.val[3], expected.val[3], INT_MAX); + } + + return 0; +} + +static int +test_simde_vld4q_dup_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t a[4]; + simde_bfloat16_t unused[4]; + simde_bfloat16_t r[4][8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(31.40), SIMDE_BFLOAT16_VALUE(8.80), SIMDE_BFLOAT16_VALUE(7.89), SIMDE_BFLOAT16_VALUE(12.74) }, + { SIMDE_BFLOAT16_VALUE(-0.13), SIMDE_BFLOAT16_VALUE(-35.35), SIMDE_BFLOAT16_VALUE(41.40), SIMDE_BFLOAT16_VALUE(18.27)}, + { { SIMDE_BFLOAT16_VALUE(31.40), SIMDE_BFLOAT16_VALUE(31.40), SIMDE_BFLOAT16_VALUE(31.40), SIMDE_BFLOAT16_VALUE(31.40), + SIMDE_BFLOAT16_VALUE(31.40), SIMDE_BFLOAT16_VALUE(31.40), SIMDE_BFLOAT16_VALUE(31.40), SIMDE_BFLOAT16_VALUE(31.40) }, + { SIMDE_BFLOAT16_VALUE(8.80), SIMDE_BFLOAT16_VALUE(8.80), SIMDE_BFLOAT16_VALUE(8.80), SIMDE_BFLOAT16_VALUE(8.80), + SIMDE_BFLOAT16_VALUE(8.80), SIMDE_BFLOAT16_VALUE(8.80), SIMDE_BFLOAT16_VALUE(8.80), SIMDE_BFLOAT16_VALUE(8.80) }, + { SIMDE_BFLOAT16_VALUE(7.89), SIMDE_BFLOAT16_VALUE(7.89), SIMDE_BFLOAT16_VALUE(7.89), SIMDE_BFLOAT16_VALUE(7.89), + SIMDE_BFLOAT16_VALUE(7.89), SIMDE_BFLOAT16_VALUE(7.89), SIMDE_BFLOAT16_VALUE(7.89), SIMDE_BFLOAT16_VALUE(7.89) }, + { SIMDE_BFLOAT16_VALUE(12.74), SIMDE_BFLOAT16_VALUE(12.74), SIMDE_BFLOAT16_VALUE(12.74), SIMDE_BFLOAT16_VALUE(12.74), + SIMDE_BFLOAT16_VALUE(12.74), SIMDE_BFLOAT16_VALUE(12.74), SIMDE_BFLOAT16_VALUE(12.74), SIMDE_BFLOAT16_VALUE(12.74) } } }, + { { SIMDE_BFLOAT16_VALUE(42.40), SIMDE_BFLOAT16_VALUE(-29.63), SIMDE_BFLOAT16_VALUE(30.06), SIMDE_BFLOAT16_VALUE(1.39) }, + { SIMDE_BFLOAT16_VALUE(31.88), SIMDE_BFLOAT16_VALUE(-49.31), SIMDE_BFLOAT16_VALUE(23.96), SIMDE_BFLOAT16_VALUE(-45.98)}, + { { SIMDE_BFLOAT16_VALUE(42.40), SIMDE_BFLOAT16_VALUE(42.40), SIMDE_BFLOAT16_VALUE(42.40), SIMDE_BFLOAT16_VALUE(42.40), + SIMDE_BFLOAT16_VALUE(42.40), SIMDE_BFLOAT16_VALUE(42.40), SIMDE_BFLOAT16_VALUE(42.40), SIMDE_BFLOAT16_VALUE(42.40) }, + { SIMDE_BFLOAT16_VALUE(-29.63), SIMDE_BFLOAT16_VALUE(-29.63), SIMDE_BFLOAT16_VALUE(-29.63), SIMDE_BFLOAT16_VALUE(-29.63), + SIMDE_BFLOAT16_VALUE(-29.63), SIMDE_BFLOAT16_VALUE(-29.63), SIMDE_BFLOAT16_VALUE(-29.63), SIMDE_BFLOAT16_VALUE(-29.63) }, + { SIMDE_BFLOAT16_VALUE(30.06), SIMDE_BFLOAT16_VALUE(30.06), SIMDE_BFLOAT16_VALUE(30.06), SIMDE_BFLOAT16_VALUE(30.06), + SIMDE_BFLOAT16_VALUE(30.06), SIMDE_BFLOAT16_VALUE(30.06), SIMDE_BFLOAT16_VALUE(30.06), SIMDE_BFLOAT16_VALUE(30.06) }, + { SIMDE_BFLOAT16_VALUE(1.39), SIMDE_BFLOAT16_VALUE(1.39), SIMDE_BFLOAT16_VALUE(1.39), SIMDE_BFLOAT16_VALUE(1.39), + SIMDE_BFLOAT16_VALUE(1.39), SIMDE_BFLOAT16_VALUE(1.39), SIMDE_BFLOAT16_VALUE(1.39), SIMDE_BFLOAT16_VALUE(1.39) } } }, + { { SIMDE_BFLOAT16_VALUE(-19.20), SIMDE_BFLOAT16_VALUE(-9.05), SIMDE_BFLOAT16_VALUE(0.57), SIMDE_BFLOAT16_VALUE(14.82) }, + { SIMDE_BFLOAT16_VALUE(-38.07), SIMDE_BFLOAT16_VALUE(-33.07), SIMDE_BFLOAT16_VALUE(15.20), SIMDE_BFLOAT16_VALUE(3.67)}, + { { SIMDE_BFLOAT16_VALUE(-19.20), SIMDE_BFLOAT16_VALUE(-19.20), SIMDE_BFLOAT16_VALUE(-19.20), SIMDE_BFLOAT16_VALUE(-19.20), + SIMDE_BFLOAT16_VALUE(-19.20), SIMDE_BFLOAT16_VALUE(-19.20), SIMDE_BFLOAT16_VALUE(-19.20), SIMDE_BFLOAT16_VALUE(-19.20) }, + { SIMDE_BFLOAT16_VALUE(-9.05), SIMDE_BFLOAT16_VALUE(-9.05), SIMDE_BFLOAT16_VALUE(-9.05), SIMDE_BFLOAT16_VALUE(-9.05), + SIMDE_BFLOAT16_VALUE(-9.05), SIMDE_BFLOAT16_VALUE(-9.05), SIMDE_BFLOAT16_VALUE(-9.05), SIMDE_BFLOAT16_VALUE(-9.05) }, + { SIMDE_BFLOAT16_VALUE(0.57), SIMDE_BFLOAT16_VALUE(0.57), SIMDE_BFLOAT16_VALUE(0.57), SIMDE_BFLOAT16_VALUE(0.57), + SIMDE_BFLOAT16_VALUE(0.57), SIMDE_BFLOAT16_VALUE(0.57), SIMDE_BFLOAT16_VALUE(0.57), SIMDE_BFLOAT16_VALUE(0.57) }, + { SIMDE_BFLOAT16_VALUE(14.82), SIMDE_BFLOAT16_VALUE(14.82), SIMDE_BFLOAT16_VALUE(14.82), SIMDE_BFLOAT16_VALUE(14.82), + SIMDE_BFLOAT16_VALUE(14.82), SIMDE_BFLOAT16_VALUE(14.82), SIMDE_BFLOAT16_VALUE(14.82), SIMDE_BFLOAT16_VALUE(14.82) } } }, + { { SIMDE_BFLOAT16_VALUE(-12.11), SIMDE_BFLOAT16_VALUE(15.24), SIMDE_BFLOAT16_VALUE(34.23), SIMDE_BFLOAT16_VALUE(38.58) }, + { SIMDE_BFLOAT16_VALUE(46.28), SIMDE_BFLOAT16_VALUE(-11.22), SIMDE_BFLOAT16_VALUE(21.51), SIMDE_BFLOAT16_VALUE(-3.08)}, + { { SIMDE_BFLOAT16_VALUE(-12.11), SIMDE_BFLOAT16_VALUE(-12.11), SIMDE_BFLOAT16_VALUE(-12.11), SIMDE_BFLOAT16_VALUE(-12.11), + SIMDE_BFLOAT16_VALUE(-12.11), SIMDE_BFLOAT16_VALUE(-12.11), SIMDE_BFLOAT16_VALUE(-12.11), SIMDE_BFLOAT16_VALUE(-12.11) }, + { SIMDE_BFLOAT16_VALUE(15.24), SIMDE_BFLOAT16_VALUE(15.24), SIMDE_BFLOAT16_VALUE(15.24), SIMDE_BFLOAT16_VALUE(15.24), + SIMDE_BFLOAT16_VALUE(15.24), SIMDE_BFLOAT16_VALUE(15.24), SIMDE_BFLOAT16_VALUE(15.24), SIMDE_BFLOAT16_VALUE(15.24) }, + { SIMDE_BFLOAT16_VALUE(34.23), SIMDE_BFLOAT16_VALUE(34.23), SIMDE_BFLOAT16_VALUE(34.23), SIMDE_BFLOAT16_VALUE(34.23), + SIMDE_BFLOAT16_VALUE(34.23), SIMDE_BFLOAT16_VALUE(34.23), SIMDE_BFLOAT16_VALUE(34.23), SIMDE_BFLOAT16_VALUE(34.23) }, + { SIMDE_BFLOAT16_VALUE(38.58), SIMDE_BFLOAT16_VALUE(38.58), SIMDE_BFLOAT16_VALUE(38.58), SIMDE_BFLOAT16_VALUE(38.58), + SIMDE_BFLOAT16_VALUE(38.58), SIMDE_BFLOAT16_VALUE(38.58), SIMDE_BFLOAT16_VALUE(38.58), SIMDE_BFLOAT16_VALUE(38.58) } } }, + { { SIMDE_BFLOAT16_VALUE(-16.90), SIMDE_BFLOAT16_VALUE(45.87), SIMDE_BFLOAT16_VALUE(4.55), SIMDE_BFLOAT16_VALUE(-31.32) }, + { SIMDE_BFLOAT16_VALUE(-4.72), SIMDE_BFLOAT16_VALUE(28.72), SIMDE_BFLOAT16_VALUE(26.60), SIMDE_BFLOAT16_VALUE(-42.54)}, + { { SIMDE_BFLOAT16_VALUE(-16.90), SIMDE_BFLOAT16_VALUE(-16.90), SIMDE_BFLOAT16_VALUE(-16.90), SIMDE_BFLOAT16_VALUE(-16.90), + SIMDE_BFLOAT16_VALUE(-16.90), SIMDE_BFLOAT16_VALUE(-16.90), SIMDE_BFLOAT16_VALUE(-16.90), SIMDE_BFLOAT16_VALUE(-16.90) }, + { SIMDE_BFLOAT16_VALUE(45.87), SIMDE_BFLOAT16_VALUE(45.87), SIMDE_BFLOAT16_VALUE(45.87), SIMDE_BFLOAT16_VALUE(45.87), + SIMDE_BFLOAT16_VALUE(45.87), SIMDE_BFLOAT16_VALUE(45.87), SIMDE_BFLOAT16_VALUE(45.87), SIMDE_BFLOAT16_VALUE(45.87) }, + { SIMDE_BFLOAT16_VALUE(4.55), SIMDE_BFLOAT16_VALUE(4.55), SIMDE_BFLOAT16_VALUE(4.55), SIMDE_BFLOAT16_VALUE(4.55), + SIMDE_BFLOAT16_VALUE(4.55), SIMDE_BFLOAT16_VALUE(4.55), SIMDE_BFLOAT16_VALUE(4.55), SIMDE_BFLOAT16_VALUE(4.55) }, + { SIMDE_BFLOAT16_VALUE(-31.32), SIMDE_BFLOAT16_VALUE(-31.32), SIMDE_BFLOAT16_VALUE(-31.32), SIMDE_BFLOAT16_VALUE(-31.32), + SIMDE_BFLOAT16_VALUE(-31.32), SIMDE_BFLOAT16_VALUE(-31.32), SIMDE_BFLOAT16_VALUE(-31.32), SIMDE_BFLOAT16_VALUE(-31.32) } } }, + { { SIMDE_BFLOAT16_VALUE(19.79), SIMDE_BFLOAT16_VALUE(20.65), SIMDE_BFLOAT16_VALUE(-41.73), SIMDE_BFLOAT16_VALUE(27.61) }, + { SIMDE_BFLOAT16_VALUE(-46.55), SIMDE_BFLOAT16_VALUE(-27.42), SIMDE_BFLOAT16_VALUE(0.86), SIMDE_BFLOAT16_VALUE(11.71)}, + { { SIMDE_BFLOAT16_VALUE(19.79), SIMDE_BFLOAT16_VALUE(19.79), SIMDE_BFLOAT16_VALUE(19.79), SIMDE_BFLOAT16_VALUE(19.79), + SIMDE_BFLOAT16_VALUE(19.79), SIMDE_BFLOAT16_VALUE(19.79), SIMDE_BFLOAT16_VALUE(19.79), SIMDE_BFLOAT16_VALUE(19.79) }, + { SIMDE_BFLOAT16_VALUE(20.65), SIMDE_BFLOAT16_VALUE(20.65), SIMDE_BFLOAT16_VALUE(20.65), SIMDE_BFLOAT16_VALUE(20.65), + SIMDE_BFLOAT16_VALUE(20.65), SIMDE_BFLOAT16_VALUE(20.65), SIMDE_BFLOAT16_VALUE(20.65), SIMDE_BFLOAT16_VALUE(20.65) }, + { SIMDE_BFLOAT16_VALUE(-41.73), SIMDE_BFLOAT16_VALUE(-41.73), SIMDE_BFLOAT16_VALUE(-41.73), SIMDE_BFLOAT16_VALUE(-41.73), + SIMDE_BFLOAT16_VALUE(-41.73), SIMDE_BFLOAT16_VALUE(-41.73), SIMDE_BFLOAT16_VALUE(-41.73), SIMDE_BFLOAT16_VALUE(-41.73) }, + { SIMDE_BFLOAT16_VALUE(27.61), SIMDE_BFLOAT16_VALUE(27.61), SIMDE_BFLOAT16_VALUE(27.61), SIMDE_BFLOAT16_VALUE(27.61), + SIMDE_BFLOAT16_VALUE(27.61), SIMDE_BFLOAT16_VALUE(27.61), SIMDE_BFLOAT16_VALUE(27.61), SIMDE_BFLOAT16_VALUE(27.61) } } }, + { { SIMDE_BFLOAT16_VALUE(33.12), SIMDE_BFLOAT16_VALUE(-27.38), SIMDE_BFLOAT16_VALUE(15.63), SIMDE_BFLOAT16_VALUE(-26.25) }, + { SIMDE_BFLOAT16_VALUE(-46.48), SIMDE_BFLOAT16_VALUE(13.65), SIMDE_BFLOAT16_VALUE(3.92), SIMDE_BFLOAT16_VALUE(39.42)}, + { { SIMDE_BFLOAT16_VALUE(33.12), SIMDE_BFLOAT16_VALUE(33.12), SIMDE_BFLOAT16_VALUE(33.12), SIMDE_BFLOAT16_VALUE(33.12), + SIMDE_BFLOAT16_VALUE(33.12), SIMDE_BFLOAT16_VALUE(33.12), SIMDE_BFLOAT16_VALUE(33.12), SIMDE_BFLOAT16_VALUE(33.12) }, + { SIMDE_BFLOAT16_VALUE(-27.38), SIMDE_BFLOAT16_VALUE(-27.38), SIMDE_BFLOAT16_VALUE(-27.38), SIMDE_BFLOAT16_VALUE(-27.38), + SIMDE_BFLOAT16_VALUE(-27.38), SIMDE_BFLOAT16_VALUE(-27.38), SIMDE_BFLOAT16_VALUE(-27.38), SIMDE_BFLOAT16_VALUE(-27.38) }, + { SIMDE_BFLOAT16_VALUE(15.63), SIMDE_BFLOAT16_VALUE(15.63), SIMDE_BFLOAT16_VALUE(15.63), SIMDE_BFLOAT16_VALUE(15.63), + SIMDE_BFLOAT16_VALUE(15.63), SIMDE_BFLOAT16_VALUE(15.63), SIMDE_BFLOAT16_VALUE(15.63), SIMDE_BFLOAT16_VALUE(15.63) }, + { SIMDE_BFLOAT16_VALUE(-26.25), SIMDE_BFLOAT16_VALUE(-26.25), SIMDE_BFLOAT16_VALUE(-26.25), SIMDE_BFLOAT16_VALUE(-26.25), + SIMDE_BFLOAT16_VALUE(-26.25), SIMDE_BFLOAT16_VALUE(-26.25), SIMDE_BFLOAT16_VALUE(-26.25), SIMDE_BFLOAT16_VALUE(-26.25) } } }, + { { SIMDE_BFLOAT16_VALUE(-9.54), SIMDE_BFLOAT16_VALUE(-43.91), SIMDE_BFLOAT16_VALUE(34.76), SIMDE_BFLOAT16_VALUE(30.47) }, + { SIMDE_BFLOAT16_VALUE(44.27), SIMDE_BFLOAT16_VALUE(45.27), SIMDE_BFLOAT16_VALUE(47.81), SIMDE_BFLOAT16_VALUE(10.39)}, + { { SIMDE_BFLOAT16_VALUE(-9.54), SIMDE_BFLOAT16_VALUE(-9.54), SIMDE_BFLOAT16_VALUE(-9.54), SIMDE_BFLOAT16_VALUE(-9.54), + SIMDE_BFLOAT16_VALUE(-9.54), SIMDE_BFLOAT16_VALUE(-9.54), SIMDE_BFLOAT16_VALUE(-9.54), SIMDE_BFLOAT16_VALUE(-9.54) }, + { SIMDE_BFLOAT16_VALUE(-43.91), SIMDE_BFLOAT16_VALUE(-43.91), SIMDE_BFLOAT16_VALUE(-43.91), SIMDE_BFLOAT16_VALUE(-43.91), + SIMDE_BFLOAT16_VALUE(-43.91), SIMDE_BFLOAT16_VALUE(-43.91), SIMDE_BFLOAT16_VALUE(-43.91), SIMDE_BFLOAT16_VALUE(-43.91) }, + { SIMDE_BFLOAT16_VALUE(34.76), SIMDE_BFLOAT16_VALUE(34.76), SIMDE_BFLOAT16_VALUE(34.76), SIMDE_BFLOAT16_VALUE(34.76), + SIMDE_BFLOAT16_VALUE(34.76), SIMDE_BFLOAT16_VALUE(34.76), SIMDE_BFLOAT16_VALUE(34.76), SIMDE_BFLOAT16_VALUE(34.76) }, + { SIMDE_BFLOAT16_VALUE(30.47), SIMDE_BFLOAT16_VALUE(30.47), SIMDE_BFLOAT16_VALUE(30.47), SIMDE_BFLOAT16_VALUE(30.47), + SIMDE_BFLOAT16_VALUE(30.47), SIMDE_BFLOAT16_VALUE(30.47), SIMDE_BFLOAT16_VALUE(30.47), SIMDE_BFLOAT16_VALUE(30.47) } } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8x4_t r = simde_vld4q_dup_bf16(test_vec[i].a); + simde_bfloat16x8x4_t expected = { + {simde_vld1q_bf16(test_vec[i].r[0]), simde_vld1q_bf16(test_vec[i].r[1]), + simde_vld1q_bf16(test_vec[i].r[2]), simde_vld1q_bf16(test_vec[i].r[3])}}; + + simde_test_arm_neon_assert_equal_bf16x8(r.val[0], expected.val[0], INT_MAX); + simde_test_arm_neon_assert_equal_bf16x8(r.val[1], expected.val[1], INT_MAX); + simde_test_arm_neon_assert_equal_bf16x8(r.val[2], expected.val[2], INT_MAX); + simde_test_arm_neon_assert_equal_bf16x8(r.val[3], expected.val[3], INT_MAX); + } + + return 0; +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -2410,6 +2586,8 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vld4_dup_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vld4q_dup_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vld4q_dup_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vld4q_dup_p64) +SIMDE_TEST_FUNC_LIST_ENTRY(vld4_dup_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vld4q_dup_bf16) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/ld4_lane.c b/test/arm/neon/ld4_lane.c index 3a9c2e113..101768155 100644 --- a/test/arm/neon/ld4_lane.c +++ b/test/arm/neon/ld4_lane.c @@ -2770,6 +2770,236 @@ test_simde_vld4q_lane_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vld4_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t src[4][4]; + simde_bfloat16_t buf[4]; + simde_bfloat16_t r[4][4]; + } test_vec[] = { + { { { SIMDE_BFLOAT16_VALUE(-23.48), SIMDE_BFLOAT16_VALUE(-23.67), SIMDE_BFLOAT16_VALUE(44.71), SIMDE_BFLOAT16_VALUE(-48.89) }, + { SIMDE_BFLOAT16_VALUE(46.07), SIMDE_BFLOAT16_VALUE(-4.26), SIMDE_BFLOAT16_VALUE(-33.58), SIMDE_BFLOAT16_VALUE(-23.36) }, + { SIMDE_BFLOAT16_VALUE(45.79), SIMDE_BFLOAT16_VALUE(8.17), SIMDE_BFLOAT16_VALUE(41.11), SIMDE_BFLOAT16_VALUE(24.71) }, + { SIMDE_BFLOAT16_VALUE(-6.19), SIMDE_BFLOAT16_VALUE(-19.02), SIMDE_BFLOAT16_VALUE(4.14), SIMDE_BFLOAT16_VALUE(9.43) } }, + { SIMDE_BFLOAT16_VALUE(-1.12), SIMDE_BFLOAT16_VALUE(-28.65), SIMDE_BFLOAT16_VALUE(-39.28), SIMDE_BFLOAT16_VALUE(-49.01)}, + { { SIMDE_BFLOAT16_VALUE(-1.12), SIMDE_BFLOAT16_VALUE(-23.67), SIMDE_BFLOAT16_VALUE(44.71), SIMDE_BFLOAT16_VALUE(-48.89) }, + { SIMDE_BFLOAT16_VALUE(-28.65), SIMDE_BFLOAT16_VALUE(-4.26), SIMDE_BFLOAT16_VALUE(-33.58), SIMDE_BFLOAT16_VALUE(-23.36) }, + { SIMDE_BFLOAT16_VALUE(-39.28), SIMDE_BFLOAT16_VALUE(8.17), SIMDE_BFLOAT16_VALUE(41.11), SIMDE_BFLOAT16_VALUE(24.71) }, + { SIMDE_BFLOAT16_VALUE(-49.01), SIMDE_BFLOAT16_VALUE(-19.02), SIMDE_BFLOAT16_VALUE(4.14), SIMDE_BFLOAT16_VALUE(9.43) } } }, + { { { SIMDE_BFLOAT16_VALUE(-14.34), SIMDE_BFLOAT16_VALUE(23.49), SIMDE_BFLOAT16_VALUE(-10.62), SIMDE_BFLOAT16_VALUE(39.64) }, + { SIMDE_BFLOAT16_VALUE(-31.94), SIMDE_BFLOAT16_VALUE(-41.05), SIMDE_BFLOAT16_VALUE(20.30), SIMDE_BFLOAT16_VALUE(-28.08) }, + { SIMDE_BFLOAT16_VALUE(-46.77), SIMDE_BFLOAT16_VALUE(-6.97), SIMDE_BFLOAT16_VALUE(10.38), SIMDE_BFLOAT16_VALUE(12.19) }, + { SIMDE_BFLOAT16_VALUE(41.44), SIMDE_BFLOAT16_VALUE(-47.57), SIMDE_BFLOAT16_VALUE(-43.76), SIMDE_BFLOAT16_VALUE(26.14) } }, + { SIMDE_BFLOAT16_VALUE(-20.20), SIMDE_BFLOAT16_VALUE(43.64), SIMDE_BFLOAT16_VALUE(11.06), SIMDE_BFLOAT16_VALUE(-41.55)}, + { { SIMDE_BFLOAT16_VALUE(-14.34), SIMDE_BFLOAT16_VALUE(-20.20), SIMDE_BFLOAT16_VALUE(-10.62), SIMDE_BFLOAT16_VALUE(39.64) }, + { SIMDE_BFLOAT16_VALUE(-31.94), SIMDE_BFLOAT16_VALUE(43.64), SIMDE_BFLOAT16_VALUE(20.30), SIMDE_BFLOAT16_VALUE(-28.08) }, + { SIMDE_BFLOAT16_VALUE(-46.77), SIMDE_BFLOAT16_VALUE(11.06), SIMDE_BFLOAT16_VALUE(10.38), SIMDE_BFLOAT16_VALUE(12.19) }, + { SIMDE_BFLOAT16_VALUE(41.44), SIMDE_BFLOAT16_VALUE(-41.55), SIMDE_BFLOAT16_VALUE(-43.76), SIMDE_BFLOAT16_VALUE(26.14) } } }, + { { { SIMDE_BFLOAT16_VALUE(-49.94), SIMDE_BFLOAT16_VALUE(-3.45), SIMDE_BFLOAT16_VALUE(-18.16), SIMDE_BFLOAT16_VALUE(-35.32) }, + { SIMDE_BFLOAT16_VALUE(-39.02), SIMDE_BFLOAT16_VALUE(20.10), SIMDE_BFLOAT16_VALUE(9.41), SIMDE_BFLOAT16_VALUE(-12.84) }, + { SIMDE_BFLOAT16_VALUE(-20.30), SIMDE_BFLOAT16_VALUE(18.38), SIMDE_BFLOAT16_VALUE(36.37), SIMDE_BFLOAT16_VALUE(-15.62) }, + { SIMDE_BFLOAT16_VALUE(27.10), SIMDE_BFLOAT16_VALUE(-38.20), SIMDE_BFLOAT16_VALUE(-15.40), SIMDE_BFLOAT16_VALUE(-20.21) } }, + { SIMDE_BFLOAT16_VALUE(-9.89), SIMDE_BFLOAT16_VALUE(-2.32), SIMDE_BFLOAT16_VALUE(-33.75), SIMDE_BFLOAT16_VALUE(25.64)}, + { { SIMDE_BFLOAT16_VALUE(-49.94), SIMDE_BFLOAT16_VALUE(-3.45), SIMDE_BFLOAT16_VALUE(-9.89), SIMDE_BFLOAT16_VALUE(-35.32) }, + { SIMDE_BFLOAT16_VALUE(-39.02), SIMDE_BFLOAT16_VALUE(20.10), SIMDE_BFLOAT16_VALUE(-2.32), SIMDE_BFLOAT16_VALUE(-12.84) }, + { SIMDE_BFLOAT16_VALUE(-20.30), SIMDE_BFLOAT16_VALUE(18.38), SIMDE_BFLOAT16_VALUE(-33.75), SIMDE_BFLOAT16_VALUE(-15.62) }, + { SIMDE_BFLOAT16_VALUE(27.10), SIMDE_BFLOAT16_VALUE(-38.20), SIMDE_BFLOAT16_VALUE(25.64), SIMDE_BFLOAT16_VALUE(-20.21) } } }, + { { { SIMDE_BFLOAT16_VALUE(28.09), SIMDE_BFLOAT16_VALUE(-29.96), SIMDE_BFLOAT16_VALUE(28.29), SIMDE_BFLOAT16_VALUE(-15.35) }, + { SIMDE_BFLOAT16_VALUE(15.14), SIMDE_BFLOAT16_VALUE(-42.36), SIMDE_BFLOAT16_VALUE(-3.50), SIMDE_BFLOAT16_VALUE(11.41) }, + { SIMDE_BFLOAT16_VALUE(-2.75), SIMDE_BFLOAT16_VALUE(20.25), SIMDE_BFLOAT16_VALUE(29.83), SIMDE_BFLOAT16_VALUE(45.27) }, + { SIMDE_BFLOAT16_VALUE(22.78), SIMDE_BFLOAT16_VALUE(10.89), SIMDE_BFLOAT16_VALUE(42.55), SIMDE_BFLOAT16_VALUE(-45.91) } }, + { SIMDE_BFLOAT16_VALUE(-8.61), SIMDE_BFLOAT16_VALUE(-39.93), SIMDE_BFLOAT16_VALUE(-16.44), SIMDE_BFLOAT16_VALUE(43.00)}, + { { SIMDE_BFLOAT16_VALUE(28.09), SIMDE_BFLOAT16_VALUE(-29.96), SIMDE_BFLOAT16_VALUE(28.29), SIMDE_BFLOAT16_VALUE(-8.61) }, + { SIMDE_BFLOAT16_VALUE(15.14), SIMDE_BFLOAT16_VALUE(-42.36), SIMDE_BFLOAT16_VALUE(-3.50), SIMDE_BFLOAT16_VALUE(-39.93) }, + { SIMDE_BFLOAT16_VALUE(-2.75), SIMDE_BFLOAT16_VALUE(20.25), SIMDE_BFLOAT16_VALUE(29.83), SIMDE_BFLOAT16_VALUE(-16.44) }, + { SIMDE_BFLOAT16_VALUE(22.78), SIMDE_BFLOAT16_VALUE(10.89), SIMDE_BFLOAT16_VALUE(42.55), SIMDE_BFLOAT16_VALUE(43.00) } } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4x4_t r; + simde_bfloat16x4x4_t src = { + {simde_vld1_bf16(test_vec[i].src[0]), simde_vld1_bf16(test_vec[i].src[1]), + simde_vld1_bf16(test_vec[i].src[2]), simde_vld1_bf16(test_vec[i].src[3])}}; + simde_bfloat16x4x4_t expected = { + {simde_vld1_bf16(test_vec[i].r[0]), simde_vld1_bf16(test_vec[i].r[1]), + simde_vld1_bf16(test_vec[i].r[2]), simde_vld1_bf16(test_vec[i].r[3])}}; + + SIMDE_CONSTIFY_4_(simde_vld4_lane_bf16, r, (HEDLEY_UNREACHABLE(), r), i, test_vec[i].buf, src); + + simde_test_arm_neon_assert_equal_bf16x4(r.val[0], expected.val[0], 1); + simde_test_arm_neon_assert_equal_bf16x4(r.val[1], expected.val[1], 1); + simde_test_arm_neon_assert_equal_bf16x4(r.val[2], expected.val[2], 1); + simde_test_arm_neon_assert_equal_bf16x4(r.val[3], expected.val[3], 1); + } + + return 0; +} + +static int +test_simde_vld4q_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t src[4][8]; + simde_bfloat16_t buf[4]; + simde_bfloat16_t r[4][8]; + } test_vec[] = { + { { { SIMDE_BFLOAT16_VALUE(6.33), SIMDE_BFLOAT16_VALUE(-26.33), SIMDE_BFLOAT16_VALUE(-42.22), SIMDE_BFLOAT16_VALUE(-34.31), + SIMDE_BFLOAT16_VALUE(-14.99), SIMDE_BFLOAT16_VALUE(-21.27), SIMDE_BFLOAT16_VALUE(2.75), SIMDE_BFLOAT16_VALUE(47.13) }, + { SIMDE_BFLOAT16_VALUE(-43.49), SIMDE_BFLOAT16_VALUE(17.65), SIMDE_BFLOAT16_VALUE(39.50), SIMDE_BFLOAT16_VALUE(-42.60), + SIMDE_BFLOAT16_VALUE(36.05), SIMDE_BFLOAT16_VALUE(-8.32), SIMDE_BFLOAT16_VALUE(-40.92), SIMDE_BFLOAT16_VALUE(18.06) }, + { SIMDE_BFLOAT16_VALUE(-42.88), SIMDE_BFLOAT16_VALUE(4.14), SIMDE_BFLOAT16_VALUE(45.09), SIMDE_BFLOAT16_VALUE(20.35), + SIMDE_BFLOAT16_VALUE(-37.99), SIMDE_BFLOAT16_VALUE(6.50), SIMDE_BFLOAT16_VALUE(-31.38), SIMDE_BFLOAT16_VALUE(7.92) }, + { SIMDE_BFLOAT16_VALUE(-39.25), SIMDE_BFLOAT16_VALUE(-28.22), SIMDE_BFLOAT16_VALUE(-2.20), SIMDE_BFLOAT16_VALUE(-44.73), + SIMDE_BFLOAT16_VALUE(-39.75), SIMDE_BFLOAT16_VALUE(48.64), SIMDE_BFLOAT16_VALUE(-28.85), SIMDE_BFLOAT16_VALUE(-41.84) } }, + { SIMDE_BFLOAT16_VALUE(28.80), SIMDE_BFLOAT16_VALUE(25.22), SIMDE_BFLOAT16_VALUE(20.66), SIMDE_BFLOAT16_VALUE(48.85)}, + { { SIMDE_BFLOAT16_VALUE(28.80), SIMDE_BFLOAT16_VALUE(-26.33), SIMDE_BFLOAT16_VALUE(-42.22), SIMDE_BFLOAT16_VALUE(-34.31), + SIMDE_BFLOAT16_VALUE(-14.99), SIMDE_BFLOAT16_VALUE(-21.27), SIMDE_BFLOAT16_VALUE(2.75), SIMDE_BFLOAT16_VALUE(47.13) }, + { SIMDE_BFLOAT16_VALUE(25.22), SIMDE_BFLOAT16_VALUE(17.65), SIMDE_BFLOAT16_VALUE(39.50), SIMDE_BFLOAT16_VALUE(-42.60), + SIMDE_BFLOAT16_VALUE(36.05), SIMDE_BFLOAT16_VALUE(-8.32), SIMDE_BFLOAT16_VALUE(-40.92), SIMDE_BFLOAT16_VALUE(18.06) }, + { SIMDE_BFLOAT16_VALUE(20.66), SIMDE_BFLOAT16_VALUE(4.14), SIMDE_BFLOAT16_VALUE(45.09), SIMDE_BFLOAT16_VALUE(20.35), + SIMDE_BFLOAT16_VALUE(-37.99), SIMDE_BFLOAT16_VALUE(6.50), SIMDE_BFLOAT16_VALUE(-31.38), SIMDE_BFLOAT16_VALUE(7.92) }, + { SIMDE_BFLOAT16_VALUE(48.85), SIMDE_BFLOAT16_VALUE(-28.22), SIMDE_BFLOAT16_VALUE(-2.20), SIMDE_BFLOAT16_VALUE(-44.73), + SIMDE_BFLOAT16_VALUE(-39.75), SIMDE_BFLOAT16_VALUE(48.64), SIMDE_BFLOAT16_VALUE(-28.85), SIMDE_BFLOAT16_VALUE(-41.84) } } }, + { { { SIMDE_BFLOAT16_VALUE(42.30), SIMDE_BFLOAT16_VALUE(4.65), SIMDE_BFLOAT16_VALUE(-21.20), SIMDE_BFLOAT16_VALUE(-43.56), + SIMDE_BFLOAT16_VALUE(46.24), SIMDE_BFLOAT16_VALUE(23.63), SIMDE_BFLOAT16_VALUE(-33.71), SIMDE_BFLOAT16_VALUE(-41.85) }, + { SIMDE_BFLOAT16_VALUE(46.94), SIMDE_BFLOAT16_VALUE(30.22), SIMDE_BFLOAT16_VALUE(3.71), SIMDE_BFLOAT16_VALUE(1.50), + SIMDE_BFLOAT16_VALUE(-25.07), SIMDE_BFLOAT16_VALUE(42.19), SIMDE_BFLOAT16_VALUE(-19.27), SIMDE_BFLOAT16_VALUE(-23.97) }, + { SIMDE_BFLOAT16_VALUE(-27.49), SIMDE_BFLOAT16_VALUE(41.45), SIMDE_BFLOAT16_VALUE(43.62), SIMDE_BFLOAT16_VALUE(28.98), + SIMDE_BFLOAT16_VALUE(-2.13), SIMDE_BFLOAT16_VALUE(24.85), SIMDE_BFLOAT16_VALUE(-34.40), SIMDE_BFLOAT16_VALUE(-36.80) }, + { SIMDE_BFLOAT16_VALUE(9.29), SIMDE_BFLOAT16_VALUE(19.68), SIMDE_BFLOAT16_VALUE(-47.75), SIMDE_BFLOAT16_VALUE(7.71), + SIMDE_BFLOAT16_VALUE(-15.37), SIMDE_BFLOAT16_VALUE(-22.42), SIMDE_BFLOAT16_VALUE(-24.53), SIMDE_BFLOAT16_VALUE(-31.46) } }, + { SIMDE_BFLOAT16_VALUE(6.38), SIMDE_BFLOAT16_VALUE(-5.55), SIMDE_BFLOAT16_VALUE(14.51), SIMDE_BFLOAT16_VALUE(22.81)}, + { { SIMDE_BFLOAT16_VALUE(42.30), SIMDE_BFLOAT16_VALUE(6.38), SIMDE_BFLOAT16_VALUE(-21.20), SIMDE_BFLOAT16_VALUE(-43.56), + SIMDE_BFLOAT16_VALUE(46.24), SIMDE_BFLOAT16_VALUE(23.63), SIMDE_BFLOAT16_VALUE(-33.71), SIMDE_BFLOAT16_VALUE(-41.85) }, + { SIMDE_BFLOAT16_VALUE(46.94), SIMDE_BFLOAT16_VALUE(-5.55), SIMDE_BFLOAT16_VALUE(3.71), SIMDE_BFLOAT16_VALUE(1.50), + SIMDE_BFLOAT16_VALUE(-25.07), SIMDE_BFLOAT16_VALUE(42.19), SIMDE_BFLOAT16_VALUE(-19.27), SIMDE_BFLOAT16_VALUE(-23.97) }, + { SIMDE_BFLOAT16_VALUE(-27.49), SIMDE_BFLOAT16_VALUE(14.51), SIMDE_BFLOAT16_VALUE(43.62), SIMDE_BFLOAT16_VALUE(28.98), + SIMDE_BFLOAT16_VALUE(-2.13), SIMDE_BFLOAT16_VALUE(24.85), SIMDE_BFLOAT16_VALUE(-34.40), SIMDE_BFLOAT16_VALUE(-36.80) }, + { SIMDE_BFLOAT16_VALUE(9.29), SIMDE_BFLOAT16_VALUE(22.81), SIMDE_BFLOAT16_VALUE(-47.75), SIMDE_BFLOAT16_VALUE(7.71), + SIMDE_BFLOAT16_VALUE(-15.37), SIMDE_BFLOAT16_VALUE(-22.42), SIMDE_BFLOAT16_VALUE(-24.53), SIMDE_BFLOAT16_VALUE(-31.46) } } }, + { { { SIMDE_BFLOAT16_VALUE(4.77), SIMDE_BFLOAT16_VALUE(19.23), SIMDE_BFLOAT16_VALUE(19.73), SIMDE_BFLOAT16_VALUE(-7.18), + SIMDE_BFLOAT16_VALUE(-27.37), SIMDE_BFLOAT16_VALUE(-20.24), SIMDE_BFLOAT16_VALUE(49.18), SIMDE_BFLOAT16_VALUE(-24.81) }, + { SIMDE_BFLOAT16_VALUE(-11.08), SIMDE_BFLOAT16_VALUE(-46.49), SIMDE_BFLOAT16_VALUE(2.52), SIMDE_BFLOAT16_VALUE(26.02), + SIMDE_BFLOAT16_VALUE(24.04), SIMDE_BFLOAT16_VALUE(47.33), SIMDE_BFLOAT16_VALUE(-44.39), SIMDE_BFLOAT16_VALUE(12.98) }, + { SIMDE_BFLOAT16_VALUE(-31.55), SIMDE_BFLOAT16_VALUE(14.16), SIMDE_BFLOAT16_VALUE(-20.43), SIMDE_BFLOAT16_VALUE(-34.07), + SIMDE_BFLOAT16_VALUE(-49.98), SIMDE_BFLOAT16_VALUE(10.50), SIMDE_BFLOAT16_VALUE(15.65), SIMDE_BFLOAT16_VALUE(-48.67) }, + { SIMDE_BFLOAT16_VALUE(-11.29), SIMDE_BFLOAT16_VALUE(1.88), SIMDE_BFLOAT16_VALUE(-32.68), SIMDE_BFLOAT16_VALUE(-24.01), + SIMDE_BFLOAT16_VALUE(-1.11), SIMDE_BFLOAT16_VALUE(3.86), SIMDE_BFLOAT16_VALUE(27.69), SIMDE_BFLOAT16_VALUE(26.05) } }, + { SIMDE_BFLOAT16_VALUE(10.65), SIMDE_BFLOAT16_VALUE(-21.85), SIMDE_BFLOAT16_VALUE(14.55), SIMDE_BFLOAT16_VALUE(6.24)}, + { { SIMDE_BFLOAT16_VALUE(4.77), SIMDE_BFLOAT16_VALUE(19.23), SIMDE_BFLOAT16_VALUE(10.65), SIMDE_BFLOAT16_VALUE(-7.18), + SIMDE_BFLOAT16_VALUE(-27.37), SIMDE_BFLOAT16_VALUE(-20.24), SIMDE_BFLOAT16_VALUE(49.18), SIMDE_BFLOAT16_VALUE(-24.81) }, + { SIMDE_BFLOAT16_VALUE(-11.08), SIMDE_BFLOAT16_VALUE(-46.49), SIMDE_BFLOAT16_VALUE(-21.85), SIMDE_BFLOAT16_VALUE(26.02), + SIMDE_BFLOAT16_VALUE(24.04), SIMDE_BFLOAT16_VALUE(47.33), SIMDE_BFLOAT16_VALUE(-44.39), SIMDE_BFLOAT16_VALUE(12.98) }, + { SIMDE_BFLOAT16_VALUE(-31.55), SIMDE_BFLOAT16_VALUE(14.16), SIMDE_BFLOAT16_VALUE(14.55), SIMDE_BFLOAT16_VALUE(-34.07), + SIMDE_BFLOAT16_VALUE(-49.98), SIMDE_BFLOAT16_VALUE(10.50), SIMDE_BFLOAT16_VALUE(15.65), SIMDE_BFLOAT16_VALUE(-48.67) }, + { SIMDE_BFLOAT16_VALUE(-11.29), SIMDE_BFLOAT16_VALUE(1.88), SIMDE_BFLOAT16_VALUE(6.24), SIMDE_BFLOAT16_VALUE(-24.01), + SIMDE_BFLOAT16_VALUE(-1.11), SIMDE_BFLOAT16_VALUE(3.86), SIMDE_BFLOAT16_VALUE(27.69), SIMDE_BFLOAT16_VALUE(26.05) } } }, + { { { SIMDE_BFLOAT16_VALUE(-39.56), SIMDE_BFLOAT16_VALUE(46.56), SIMDE_BFLOAT16_VALUE(37.88), SIMDE_BFLOAT16_VALUE(-34.85), + SIMDE_BFLOAT16_VALUE(-42.50), SIMDE_BFLOAT16_VALUE(47.33), SIMDE_BFLOAT16_VALUE(30.39), SIMDE_BFLOAT16_VALUE(26.97) }, + { SIMDE_BFLOAT16_VALUE(12.13), SIMDE_BFLOAT16_VALUE(13.90), SIMDE_BFLOAT16_VALUE(-11.09), SIMDE_BFLOAT16_VALUE(-46.55), + SIMDE_BFLOAT16_VALUE(-25.60), SIMDE_BFLOAT16_VALUE(36.32), SIMDE_BFLOAT16_VALUE(38.43), SIMDE_BFLOAT16_VALUE(-15.44) }, + { SIMDE_BFLOAT16_VALUE(14.57), SIMDE_BFLOAT16_VALUE(-33.72), SIMDE_BFLOAT16_VALUE(17.48), SIMDE_BFLOAT16_VALUE(-41.97), + SIMDE_BFLOAT16_VALUE(39.90), SIMDE_BFLOAT16_VALUE(12.95), SIMDE_BFLOAT16_VALUE(-24.90), SIMDE_BFLOAT16_VALUE(22.89) }, + { SIMDE_BFLOAT16_VALUE(33.49), SIMDE_BFLOAT16_VALUE(-29.52), SIMDE_BFLOAT16_VALUE(-42.35), SIMDE_BFLOAT16_VALUE(11.54), + SIMDE_BFLOAT16_VALUE(-19.29), SIMDE_BFLOAT16_VALUE(-3.97), SIMDE_BFLOAT16_VALUE(39.49), SIMDE_BFLOAT16_VALUE(34.87) } }, + { SIMDE_BFLOAT16_VALUE(22.68), SIMDE_BFLOAT16_VALUE(-10.73), SIMDE_BFLOAT16_VALUE(1.03), SIMDE_BFLOAT16_VALUE(9.92)}, + { { SIMDE_BFLOAT16_VALUE(-39.56), SIMDE_BFLOAT16_VALUE(46.56), SIMDE_BFLOAT16_VALUE(37.88), SIMDE_BFLOAT16_VALUE(22.68), + SIMDE_BFLOAT16_VALUE(-42.50), SIMDE_BFLOAT16_VALUE(47.33), SIMDE_BFLOAT16_VALUE(30.39), SIMDE_BFLOAT16_VALUE(26.97) }, + { SIMDE_BFLOAT16_VALUE(12.13), SIMDE_BFLOAT16_VALUE(13.90), SIMDE_BFLOAT16_VALUE(-11.09), SIMDE_BFLOAT16_VALUE(-10.73), + SIMDE_BFLOAT16_VALUE(-25.60), SIMDE_BFLOAT16_VALUE(36.32), SIMDE_BFLOAT16_VALUE(38.43), SIMDE_BFLOAT16_VALUE(-15.44) }, + { SIMDE_BFLOAT16_VALUE(14.57), SIMDE_BFLOAT16_VALUE(-33.72), SIMDE_BFLOAT16_VALUE(17.48), SIMDE_BFLOAT16_VALUE(1.03), + SIMDE_BFLOAT16_VALUE(39.90), SIMDE_BFLOAT16_VALUE(12.95), SIMDE_BFLOAT16_VALUE(-24.90), SIMDE_BFLOAT16_VALUE(22.89) }, + { SIMDE_BFLOAT16_VALUE(33.49), SIMDE_BFLOAT16_VALUE(-29.52), SIMDE_BFLOAT16_VALUE(-42.35), SIMDE_BFLOAT16_VALUE(9.92), + SIMDE_BFLOAT16_VALUE(-19.29), SIMDE_BFLOAT16_VALUE(-3.97), SIMDE_BFLOAT16_VALUE(39.49), SIMDE_BFLOAT16_VALUE(34.87) } } }, + { { { SIMDE_BFLOAT16_VALUE(-8.17), SIMDE_BFLOAT16_VALUE(20.98), SIMDE_BFLOAT16_VALUE(-36.48), SIMDE_BFLOAT16_VALUE(-2.58), + SIMDE_BFLOAT16_VALUE(45.57), SIMDE_BFLOAT16_VALUE(1.57), SIMDE_BFLOAT16_VALUE(-6.19), SIMDE_BFLOAT16_VALUE(-12.44) }, + { SIMDE_BFLOAT16_VALUE(45.85), SIMDE_BFLOAT16_VALUE(24.95), SIMDE_BFLOAT16_VALUE(28.89), SIMDE_BFLOAT16_VALUE(49.69), + SIMDE_BFLOAT16_VALUE(1.21), SIMDE_BFLOAT16_VALUE(-33.38), SIMDE_BFLOAT16_VALUE(-40.61), SIMDE_BFLOAT16_VALUE(21.68) }, + { SIMDE_BFLOAT16_VALUE(46.23), SIMDE_BFLOAT16_VALUE(-16.19), SIMDE_BFLOAT16_VALUE(-35.91), SIMDE_BFLOAT16_VALUE(43.87), + SIMDE_BFLOAT16_VALUE(30.36), SIMDE_BFLOAT16_VALUE(-1.03), SIMDE_BFLOAT16_VALUE(19.56), SIMDE_BFLOAT16_VALUE(33.86) }, + { SIMDE_BFLOAT16_VALUE(-24.84), SIMDE_BFLOAT16_VALUE(13.50), SIMDE_BFLOAT16_VALUE(29.52), SIMDE_BFLOAT16_VALUE(41.09), + SIMDE_BFLOAT16_VALUE(-18.40), SIMDE_BFLOAT16_VALUE(40.70), SIMDE_BFLOAT16_VALUE(0.08), SIMDE_BFLOAT16_VALUE(19.83) } }, + { SIMDE_BFLOAT16_VALUE(38.14), SIMDE_BFLOAT16_VALUE(-31.15), SIMDE_BFLOAT16_VALUE(18.94), SIMDE_BFLOAT16_VALUE(21.21)}, + { { SIMDE_BFLOAT16_VALUE(-8.17), SIMDE_BFLOAT16_VALUE(20.98), SIMDE_BFLOAT16_VALUE(-36.48), SIMDE_BFLOAT16_VALUE(-2.58), + SIMDE_BFLOAT16_VALUE(38.14), SIMDE_BFLOAT16_VALUE(1.57), SIMDE_BFLOAT16_VALUE(-6.19), SIMDE_BFLOAT16_VALUE(-12.44) }, + { SIMDE_BFLOAT16_VALUE(45.85), SIMDE_BFLOAT16_VALUE(24.95), SIMDE_BFLOAT16_VALUE(28.89), SIMDE_BFLOAT16_VALUE(49.69), + SIMDE_BFLOAT16_VALUE(-31.15), SIMDE_BFLOAT16_VALUE(-33.38), SIMDE_BFLOAT16_VALUE(-40.61), SIMDE_BFLOAT16_VALUE(21.68) }, + { SIMDE_BFLOAT16_VALUE(46.23), SIMDE_BFLOAT16_VALUE(-16.19), SIMDE_BFLOAT16_VALUE(-35.91), SIMDE_BFLOAT16_VALUE(43.87), + SIMDE_BFLOAT16_VALUE(18.94), SIMDE_BFLOAT16_VALUE(-1.03), SIMDE_BFLOAT16_VALUE(19.56), SIMDE_BFLOAT16_VALUE(33.86) }, + { SIMDE_BFLOAT16_VALUE(-24.84), SIMDE_BFLOAT16_VALUE(13.50), SIMDE_BFLOAT16_VALUE(29.52), SIMDE_BFLOAT16_VALUE(41.09), + SIMDE_BFLOAT16_VALUE(21.21), SIMDE_BFLOAT16_VALUE(40.70), SIMDE_BFLOAT16_VALUE(0.08), SIMDE_BFLOAT16_VALUE(19.83) } } }, + { { { SIMDE_BFLOAT16_VALUE(32.92), SIMDE_BFLOAT16_VALUE(-0.80), SIMDE_BFLOAT16_VALUE(-42.65), SIMDE_BFLOAT16_VALUE(-15.22), + SIMDE_BFLOAT16_VALUE(-16.39), SIMDE_BFLOAT16_VALUE(11.52), SIMDE_BFLOAT16_VALUE(-4.14), SIMDE_BFLOAT16_VALUE(8.87) }, + { SIMDE_BFLOAT16_VALUE(-35.81), SIMDE_BFLOAT16_VALUE(12.74), SIMDE_BFLOAT16_VALUE(-12.60), SIMDE_BFLOAT16_VALUE(21.59), + SIMDE_BFLOAT16_VALUE(-11.53), SIMDE_BFLOAT16_VALUE(44.02), SIMDE_BFLOAT16_VALUE(30.30), SIMDE_BFLOAT16_VALUE(43.42) }, + { SIMDE_BFLOAT16_VALUE(16.67), SIMDE_BFLOAT16_VALUE(0.23), SIMDE_BFLOAT16_VALUE(-4.88), SIMDE_BFLOAT16_VALUE(-5.00), + SIMDE_BFLOAT16_VALUE(36.67), SIMDE_BFLOAT16_VALUE(43.56), SIMDE_BFLOAT16_VALUE(-15.15), SIMDE_BFLOAT16_VALUE(-34.82) }, + { SIMDE_BFLOAT16_VALUE(-22.22), SIMDE_BFLOAT16_VALUE(-41.78), SIMDE_BFLOAT16_VALUE(-15.90), SIMDE_BFLOAT16_VALUE(-36.65), + SIMDE_BFLOAT16_VALUE(34.10), SIMDE_BFLOAT16_VALUE(22.36), SIMDE_BFLOAT16_VALUE(-4.57), SIMDE_BFLOAT16_VALUE(-42.90) } }, + { SIMDE_BFLOAT16_VALUE(-30.23), SIMDE_BFLOAT16_VALUE(-33.22), SIMDE_BFLOAT16_VALUE(14.26), SIMDE_BFLOAT16_VALUE(-48.15)}, + { { SIMDE_BFLOAT16_VALUE(32.92), SIMDE_BFLOAT16_VALUE(-0.80), SIMDE_BFLOAT16_VALUE(-42.65), SIMDE_BFLOAT16_VALUE(-15.22), + SIMDE_BFLOAT16_VALUE(-16.39), SIMDE_BFLOAT16_VALUE(-30.23), SIMDE_BFLOAT16_VALUE(-4.14), SIMDE_BFLOAT16_VALUE(8.87) }, + { SIMDE_BFLOAT16_VALUE(-35.81), SIMDE_BFLOAT16_VALUE(12.74), SIMDE_BFLOAT16_VALUE(-12.60), SIMDE_BFLOAT16_VALUE(21.59), + SIMDE_BFLOAT16_VALUE(-11.53), SIMDE_BFLOAT16_VALUE(-33.22), SIMDE_BFLOAT16_VALUE(30.30), SIMDE_BFLOAT16_VALUE(43.42) }, + { SIMDE_BFLOAT16_VALUE(16.67), SIMDE_BFLOAT16_VALUE(0.23), SIMDE_BFLOAT16_VALUE(-4.88), SIMDE_BFLOAT16_VALUE(-5.00), + SIMDE_BFLOAT16_VALUE(36.67), SIMDE_BFLOAT16_VALUE(14.26), SIMDE_BFLOAT16_VALUE(-15.15), SIMDE_BFLOAT16_VALUE(-34.82) }, + { SIMDE_BFLOAT16_VALUE(-22.22), SIMDE_BFLOAT16_VALUE(-41.78), SIMDE_BFLOAT16_VALUE(-15.90), SIMDE_BFLOAT16_VALUE(-36.65), + SIMDE_BFLOAT16_VALUE(34.10), SIMDE_BFLOAT16_VALUE(-48.15), SIMDE_BFLOAT16_VALUE(-4.57), SIMDE_BFLOAT16_VALUE(-42.90) } } }, + { { { SIMDE_BFLOAT16_VALUE(30.57), SIMDE_BFLOAT16_VALUE(-2.63), SIMDE_BFLOAT16_VALUE(-44.63), SIMDE_BFLOAT16_VALUE(15.88), + SIMDE_BFLOAT16_VALUE(10.45), SIMDE_BFLOAT16_VALUE(45.63), SIMDE_BFLOAT16_VALUE(9.06), SIMDE_BFLOAT16_VALUE(-38.74) }, + { SIMDE_BFLOAT16_VALUE(-26.14), SIMDE_BFLOAT16_VALUE(24.78), SIMDE_BFLOAT16_VALUE(19.94), SIMDE_BFLOAT16_VALUE(-27.09), + SIMDE_BFLOAT16_VALUE(42.67), SIMDE_BFLOAT16_VALUE(1.81), SIMDE_BFLOAT16_VALUE(16.33), SIMDE_BFLOAT16_VALUE(-11.55) }, + { SIMDE_BFLOAT16_VALUE(-48.80), SIMDE_BFLOAT16_VALUE(16.42), SIMDE_BFLOAT16_VALUE(-47.87), SIMDE_BFLOAT16_VALUE(-31.96), + SIMDE_BFLOAT16_VALUE(22.97), SIMDE_BFLOAT16_VALUE(-48.97), SIMDE_BFLOAT16_VALUE(-19.78), SIMDE_BFLOAT16_VALUE(-5.38) }, + { SIMDE_BFLOAT16_VALUE(-15.38), SIMDE_BFLOAT16_VALUE(21.21), SIMDE_BFLOAT16_VALUE(23.35), SIMDE_BFLOAT16_VALUE(0.40), + SIMDE_BFLOAT16_VALUE(25.56), SIMDE_BFLOAT16_VALUE(31.88), SIMDE_BFLOAT16_VALUE(34.93), SIMDE_BFLOAT16_VALUE(30.41) } }, + { SIMDE_BFLOAT16_VALUE(-17.21), SIMDE_BFLOAT16_VALUE(-48.48), SIMDE_BFLOAT16_VALUE(-7.06), SIMDE_BFLOAT16_VALUE(-26.40)}, + { { SIMDE_BFLOAT16_VALUE(30.57), SIMDE_BFLOAT16_VALUE(-2.63), SIMDE_BFLOAT16_VALUE(-44.63), SIMDE_BFLOAT16_VALUE(15.88), + SIMDE_BFLOAT16_VALUE(10.45), SIMDE_BFLOAT16_VALUE(45.63), SIMDE_BFLOAT16_VALUE(-17.21), SIMDE_BFLOAT16_VALUE(-38.74) }, + { SIMDE_BFLOAT16_VALUE(-26.14), SIMDE_BFLOAT16_VALUE(24.78), SIMDE_BFLOAT16_VALUE(19.94), SIMDE_BFLOAT16_VALUE(-27.09), + SIMDE_BFLOAT16_VALUE(42.67), SIMDE_BFLOAT16_VALUE(1.81), SIMDE_BFLOAT16_VALUE(-48.48), SIMDE_BFLOAT16_VALUE(-11.55) }, + { SIMDE_BFLOAT16_VALUE(-48.80), SIMDE_BFLOAT16_VALUE(16.42), SIMDE_BFLOAT16_VALUE(-47.87), SIMDE_BFLOAT16_VALUE(-31.96), + SIMDE_BFLOAT16_VALUE(22.97), SIMDE_BFLOAT16_VALUE(-48.97), SIMDE_BFLOAT16_VALUE(-7.06), SIMDE_BFLOAT16_VALUE(-5.38) }, + { SIMDE_BFLOAT16_VALUE(-15.38), SIMDE_BFLOAT16_VALUE(21.21), SIMDE_BFLOAT16_VALUE(23.35), SIMDE_BFLOAT16_VALUE(0.40), + SIMDE_BFLOAT16_VALUE(25.56), SIMDE_BFLOAT16_VALUE(31.88), SIMDE_BFLOAT16_VALUE(-26.40), SIMDE_BFLOAT16_VALUE(30.41) } } }, + { { { SIMDE_BFLOAT16_VALUE(9.17), SIMDE_BFLOAT16_VALUE(21.02), SIMDE_BFLOAT16_VALUE(-31.99), SIMDE_BFLOAT16_VALUE(40.72), + SIMDE_BFLOAT16_VALUE(-48.40), SIMDE_BFLOAT16_VALUE(-16.85), SIMDE_BFLOAT16_VALUE(-28.29), SIMDE_BFLOAT16_VALUE(-25.87) }, + { SIMDE_BFLOAT16_VALUE(10.04), SIMDE_BFLOAT16_VALUE(11.19), SIMDE_BFLOAT16_VALUE(-9.39), SIMDE_BFLOAT16_VALUE(43.50), + SIMDE_BFLOAT16_VALUE(20.72), SIMDE_BFLOAT16_VALUE(16.81), SIMDE_BFLOAT16_VALUE(31.83), SIMDE_BFLOAT16_VALUE(24.46) }, + { SIMDE_BFLOAT16_VALUE(-6.31), SIMDE_BFLOAT16_VALUE(-39.46), SIMDE_BFLOAT16_VALUE(-33.35), SIMDE_BFLOAT16_VALUE(11.15), + SIMDE_BFLOAT16_VALUE(-7.05), SIMDE_BFLOAT16_VALUE(26.22), SIMDE_BFLOAT16_VALUE(-36.64), SIMDE_BFLOAT16_VALUE(37.19) }, + { SIMDE_BFLOAT16_VALUE(13.89), SIMDE_BFLOAT16_VALUE(26.04), SIMDE_BFLOAT16_VALUE(-44.10), SIMDE_BFLOAT16_VALUE(37.22), + SIMDE_BFLOAT16_VALUE(10.55), SIMDE_BFLOAT16_VALUE(-21.52), SIMDE_BFLOAT16_VALUE(-10.01), SIMDE_BFLOAT16_VALUE(16.56) } }, + { SIMDE_BFLOAT16_VALUE(-30.72), SIMDE_BFLOAT16_VALUE(-43.73), SIMDE_BFLOAT16_VALUE(28.26), SIMDE_BFLOAT16_VALUE(-33.82)}, + { { SIMDE_BFLOAT16_VALUE(9.17), SIMDE_BFLOAT16_VALUE(21.02), SIMDE_BFLOAT16_VALUE(-31.99), SIMDE_BFLOAT16_VALUE(40.72), + SIMDE_BFLOAT16_VALUE(-48.40), SIMDE_BFLOAT16_VALUE(-16.85), SIMDE_BFLOAT16_VALUE(-28.29), SIMDE_BFLOAT16_VALUE(-30.72) }, + { SIMDE_BFLOAT16_VALUE(10.04), SIMDE_BFLOAT16_VALUE(11.19), SIMDE_BFLOAT16_VALUE(-9.39), SIMDE_BFLOAT16_VALUE(43.50), + SIMDE_BFLOAT16_VALUE(20.72), SIMDE_BFLOAT16_VALUE(16.81), SIMDE_BFLOAT16_VALUE(31.83), SIMDE_BFLOAT16_VALUE(-43.73) }, + { SIMDE_BFLOAT16_VALUE(-6.31), SIMDE_BFLOAT16_VALUE(-39.46), SIMDE_BFLOAT16_VALUE(-33.35), SIMDE_BFLOAT16_VALUE(11.15), + SIMDE_BFLOAT16_VALUE(-7.05), SIMDE_BFLOAT16_VALUE(26.22), SIMDE_BFLOAT16_VALUE(-36.64), SIMDE_BFLOAT16_VALUE(28.26) }, + { SIMDE_BFLOAT16_VALUE(13.89), SIMDE_BFLOAT16_VALUE(26.04), SIMDE_BFLOAT16_VALUE(-44.10), SIMDE_BFLOAT16_VALUE(37.22), + SIMDE_BFLOAT16_VALUE(10.55), SIMDE_BFLOAT16_VALUE(-21.52), SIMDE_BFLOAT16_VALUE(-10.01), SIMDE_BFLOAT16_VALUE(-33.82) } } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8x4_t r; + simde_bfloat16x8x4_t src = { + {simde_vld1q_bf16(test_vec[i].src[0]), simde_vld1q_bf16(test_vec[i].src[1]), + simde_vld1q_bf16(test_vec[i].src[2]), simde_vld1q_bf16(test_vec[i].src[3])}}; + simde_bfloat16x8x4_t expected = { + {simde_vld1q_bf16(test_vec[i].r[0]), simde_vld1q_bf16(test_vec[i].r[1]), + simde_vld1q_bf16(test_vec[i].r[2]), simde_vld1q_bf16(test_vec[i].r[3])}}; + + SIMDE_CONSTIFY_8_(simde_vld4q_lane_bf16, r, (HEDLEY_UNREACHABLE(), r), i, test_vec[i].buf, src); + + simde_test_arm_neon_assert_equal_bf16x8(r.val[0], expected.val[0], 1); + simde_test_arm_neon_assert_equal_bf16x8(r.val[1], expected.val[1], 1); + simde_test_arm_neon_assert_equal_bf16x8(r.val[2], expected.val[2], 1); + simde_test_arm_neon_assert_equal_bf16x8(r.val[3], expected.val[3], 1); + } + + return 0; +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ @@ -2804,6 +3034,9 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vld4_lane_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vld4q_lane_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vld4q_lane_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vld4q_lane_p64) + +SIMDE_TEST_FUNC_LIST_ENTRY(vld4_lane_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vld4q_lane_bf16) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/mmlaq.c b/test/arm/neon/mmlaq.c index 0d168a626..af1f5ea04 100644 --- a/test/arm/neon/mmlaq.c +++ b/test/arm/neon/mmlaq.c @@ -370,10 +370,75 @@ test_simde_vusmmlaq_s32 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vbfmmlaq_f32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_float32_t buf[4]; + simde_bfloat16_t a[8]; + simde_bfloat16_t b[8]; + simde_float32_t r[4]; + } test_vec[] = { + { { SIMDE_FLOAT32_C( -663.97), SIMDE_FLOAT32_C( 103.85), SIMDE_FLOAT32_C( 383.97), SIMDE_FLOAT32_C( -387.23) }, + { SIMDE_BFLOAT16_VALUE( -15.12), SIMDE_BFLOAT16_VALUE( 89.00), SIMDE_BFLOAT16_VALUE( 86.00), SIMDE_BFLOAT16_VALUE( 35.00), + SIMDE_BFLOAT16_VALUE( -28.50), SIMDE_BFLOAT16_VALUE( 42.75), SIMDE_BFLOAT16_VALUE( -44.00), SIMDE_BFLOAT16_VALUE( 52.75) }, + { SIMDE_BFLOAT16_VALUE( 95.50), SIMDE_BFLOAT16_VALUE( -28.00), SIMDE_BFLOAT16_VALUE( 73.00), SIMDE_BFLOAT16_VALUE( 59.50), + SIMDE_BFLOAT16_VALUE( 76.50), SIMDE_BFLOAT16_VALUE( -7.16), SIMDE_BFLOAT16_VALUE( -58.00), SIMDE_BFLOAT16_VALUE( -14.06) }, + { SIMDE_FLOAT32_C( 3760.09), SIMDE_FLOAT32_C( -7170.31), SIMDE_FLOAT32_C( -3608.16), SIMDE_FLOAT32_C( -1063.21) } }, + { { SIMDE_FLOAT32_C( -688.33), SIMDE_FLOAT32_C( -782.95), SIMDE_FLOAT32_C( -613.46), SIMDE_FLOAT32_C( 710.46) }, + { SIMDE_BFLOAT16_VALUE( 92.00), SIMDE_BFLOAT16_VALUE( 69.00), SIMDE_BFLOAT16_VALUE( -26.75), SIMDE_BFLOAT16_VALUE( -40.50), + SIMDE_BFLOAT16_VALUE( -99.50), SIMDE_BFLOAT16_VALUE( -83.50), SIMDE_BFLOAT16_VALUE( 19.88), SIMDE_BFLOAT16_VALUE( -66.00) }, + { SIMDE_BFLOAT16_VALUE( 26.88), SIMDE_BFLOAT16_VALUE( -41.75), SIMDE_BFLOAT16_VALUE( -4.53), SIMDE_BFLOAT16_VALUE( -88.00), + SIMDE_BFLOAT16_VALUE( -52.50), SIMDE_BFLOAT16_VALUE( -18.50), SIMDE_BFLOAT16_VALUE( 47.00), SIMDE_BFLOAT16_VALUE( 18.88) }, + { SIMDE_FLOAT32_C( 2588.63), SIMDE_FLOAT32_C( -8911.14), SIMDE_FLOAT32_C( 5916.54), SIMDE_FLOAT32_C( 7167.33) } }, + { { SIMDE_FLOAT32_C( -757.49), SIMDE_FLOAT32_C( -970.43), SIMDE_FLOAT32_C( -283.88), SIMDE_FLOAT32_C( -804.46) }, + { SIMDE_BFLOAT16_VALUE( -25.12), SIMDE_BFLOAT16_VALUE( -55.50), SIMDE_BFLOAT16_VALUE( 79.00), SIMDE_BFLOAT16_VALUE( -48.75), + SIMDE_BFLOAT16_VALUE( 37.50), SIMDE_BFLOAT16_VALUE( -79.00), SIMDE_BFLOAT16_VALUE( 37.25), SIMDE_BFLOAT16_VALUE( 68.50) }, + { SIMDE_BFLOAT16_VALUE( -57.25), SIMDE_BFLOAT16_VALUE( 76.00), SIMDE_BFLOAT16_VALUE( 39.75), SIMDE_BFLOAT16_VALUE( -65.50), + SIMDE_BFLOAT16_VALUE( 45.25), SIMDE_BFLOAT16_VALUE( -87.00), SIMDE_BFLOAT16_VALUE( -5.84), SIMDE_BFLOAT16_VALUE( 45.75) }, + { SIMDE_FLOAT32_C( 2796.29), SIMDE_FLOAT32_C( 29.20), SIMDE_FLOAT32_C(-11440.82), SIMDE_FLOAT32_C( 10681.61) } }, + { { SIMDE_FLOAT32_C( -705.94), SIMDE_FLOAT32_C( -859.67), SIMDE_FLOAT32_C( 799.23), SIMDE_FLOAT32_C( 563.15) }, + { SIMDE_BFLOAT16_VALUE( -27.75), SIMDE_BFLOAT16_VALUE( -24.62), SIMDE_BFLOAT16_VALUE( 68.00), SIMDE_BFLOAT16_VALUE( 19.75), + SIMDE_BFLOAT16_VALUE( 56.75), SIMDE_BFLOAT16_VALUE( 15.06), SIMDE_BFLOAT16_VALUE( -61.50), SIMDE_BFLOAT16_VALUE( 81.00) }, + { SIMDE_BFLOAT16_VALUE( 18.00), SIMDE_BFLOAT16_VALUE( 10.19), SIMDE_BFLOAT16_VALUE( -99.50), SIMDE_BFLOAT16_VALUE( 93.00), + SIMDE_BFLOAT16_VALUE( 54.75), SIMDE_BFLOAT16_VALUE( 79.50), SIMDE_BFLOAT16_VALUE( -55.75), SIMDE_BFLOAT16_VALUE( -7.81) }, + { SIMDE_FLOAT32_C( -6385.56), SIMDE_FLOAT32_C( -8281.97), SIMDE_FLOAT32_C( 15626.43), SIMDE_FLOAT32_C( 7663.49) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x4_t buf = simde_vld1q_f32(test_vec[i].buf); + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_t b = simde_vld1q_bf16(test_vec[i].b); + simde_float32x4_t r = simde_vbfmmlaq_f32(buf, a, b); + + simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_float32x4_t buf = simde_test_arm_neon_random_f32x4(-1000.0f, 1000.0f); + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_bfloat16x8_t b = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_float32x4_t r = simde_vbfmmlaq_f32(buf, a, b); + + simde_test_arm_neon_write_f32x4(2, buf, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_f32x4(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vmmlaq_s32) SIMDE_TEST_FUNC_LIST_ENTRY(vmmlaq_u32) SIMDE_TEST_FUNC_LIST_ENTRY(vusmmlaq_s32) + +SIMDE_TEST_FUNC_LIST_ENTRY(vbfmmlaq_f32) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/reinterpret.c b/test/arm/neon/reinterpret.c index 4a65c94df..1c97de9e4 100644 --- a/test/arm/neon/reinterpret.c +++ b/test/arm/neon/reinterpret.c @@ -18366,8 +18366,1907 @@ test_simde_vreinterpretq_f64_p128 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vreinterpretq_p128_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 80.00), SIMDE_BFLOAT16_VALUE( -44.00), SIMDE_BFLOAT16_VALUE( 33.25), SIMDE_BFLOAT16_VALUE( 29.12), + SIMDE_BFLOAT16_VALUE( -20.25), SIMDE_BFLOAT16_VALUE( 11.06), SIMDE_BFLOAT16_VALUE( 69.50), SIMDE_BFLOAT16_VALUE( 69.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.62), SIMDE_BFLOAT16_VALUE( -94.00), SIMDE_BFLOAT16_VALUE( -84.50), SIMDE_BFLOAT16_VALUE( -16.75), + SIMDE_BFLOAT16_VALUE( -35.25), SIMDE_BFLOAT16_VALUE( -58.75), SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -63.00) } }, + { { SIMDE_BFLOAT16_VALUE( 6.09), SIMDE_BFLOAT16_VALUE( -77.50), SIMDE_BFLOAT16_VALUE( -58.00), SIMDE_BFLOAT16_VALUE( -40.50), + SIMDE_BFLOAT16_VALUE( -99.50), SIMDE_BFLOAT16_VALUE( 26.50), SIMDE_BFLOAT16_VALUE( -49.00), SIMDE_BFLOAT16_VALUE( 55.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.00), SIMDE_BFLOAT16_VALUE( -36.25), SIMDE_BFLOAT16_VALUE( 58.00), SIMDE_BFLOAT16_VALUE( 71.00), + SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -0.30), SIMDE_BFLOAT16_VALUE( -49.75), SIMDE_BFLOAT16_VALUE( 30.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_poly128_t r = simde_vreinterpretq_p128_bf16(a); + + simde_assert_equal_i(0, simde_memcmp(&r, &a_, sizeof(r))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_bf16_p128 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_poly64_t a[2]; + } test_vec[] = { + { { SIMDE_POLY64_C( 9602034079943150237), SIMDE_POLY64_C(15071447892160942436) }, + }, + { { SIMDE_POLY64_C( 7977050267529101445), SIMDE_POLY64_C(15152987898855457686) }, + }, + { { SIMDE_POLY64_C( 3074072634548977156), SIMDE_POLY64_C(14497327183391996253) }, + }, + { { SIMDE_POLY64_C( 8357763767761154458), SIMDE_POLY64_C( 5568845286471110208) }, + }, + { { SIMDE_POLY64_C(18226659911175066113), SIMDE_POLY64_C( 1720527327522890708) }, + }, + { { SIMDE_POLY64_C(16612550484748069179), SIMDE_POLY64_C( 5208029548622103729) }, + }, + { { SIMDE_POLY64_C(12002096110392883190), SIMDE_POLY64_C(12770693919310474149) }, + }, + { { SIMDE_POLY64_C( 3752436936427036807), SIMDE_POLY64_C( 623876170662637081) }, + }, + + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_poly128_t a = test_vec[i].a[0]; + simde_bfloat16x8_t r; + simde_bfloat16x8_private r_; + a = a << 64; + a = a | test_vec[i].a[1]; + r = simde_vreinterpretq_bf16_p128(a); + r_ = simde_bfloat16x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a, sizeof(r_))); + } + + return 0; +} + #endif /* !defined(SIMDE_TARGET_NOT_SUPPORT_INT128_TYPE) */ +static int +test_simde_vreinterpret_bf16_s8 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + int8_t a[8]; + } test_vec[] = { + { { -INT8_C( 124), -INT8_C( 1), -INT8_C( 43), INT8_C( 46), INT8_C( 41), -INT8_C( 85), -INT8_C( 22), -INT8_C( 115) } }, + { { -INT8_C( 50), -INT8_C( 1), INT8_C( 112), -INT8_C( 58), -INT8_C( 86), -INT8_C( 80), -INT8_C( 59), INT8_C( 34) } }, + { { INT8_MAX, -INT8_C( 87), INT8_C( 95), -INT8_C( 32), INT8_C( 54), -INT8_C( 34), -INT8_C( 64), -INT8_C( 43) } }, + { { INT8_C( 24), INT8_C( 52), INT8_C( 102), -INT8_C( 22), -INT8_C( 88), INT8_C( 89), INT8_C( 97), INT8_C( 45) } }, + { { INT8_C( 88), INT8_C( 54), INT8_C( 91), -INT8_C( 127), -INT8_C( 31), INT8_C( 69), INT8_C( 14), -INT8_C( 80) } }, + { { INT8_C( 68), INT8_MAX, INT8_C( 118), -INT8_C( 18), INT8_C( 47), INT8_C( 59), INT8_C( 16), -INT8_C( 82) } }, + { { -INT8_C( 28), INT8_C( 111), -INT8_C( 114), INT8_C( 27), INT8_C( 77), INT8_C( 79), -INT8_C( 16), INT8_C( 102) } }, + { { -INT8_C( 125), INT8_C( 87), INT8_C( 80), INT8_C( 44), -INT8_C( 80), -INT8_C( 79), INT8_C( 89), INT8_C( 8) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_int8x8_t a = simde_vld1_s8(test_vec[i].a); + simde_int8x8_private a_ = simde_int8x8_to_private(a); + simde_bfloat16x4_t r = simde_vreinterpret_bf16_s8(a); + simde_bfloat16x4_private r_ = simde_bfloat16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_int8x8_t a = simde_test_arm_neon_random_i8x8(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_i8x8(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_bf16_s16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + int16_t a[4]; + } test_vec[] = { + { { INT16_C( 5390), -INT16_C( 25778), -INT16_C( 17334), -INT16_C( 15891) } }, + { { -INT16_C( 32408), INT16_C( 9065), -INT16_C( 8799), -INT16_C( 13137) } }, + { { -INT16_C( 27935), INT16_C( 29580), -INT16_C( 21440), INT16_C( 19313) } }, + { { -INT16_C( 329), INT16_C( 245), INT16_C( 4433), INT16_C( 24463) } }, + { { -INT16_C( 8922), INT16_C( 28923), -INT16_C( 5990), INT16_C( 562) } }, + { { -INT16_C( 25751), INT16_C( 2854), -INT16_C( 10887), INT16_C( 23255) } }, + { { INT16_C( 25704), -INT16_C( 22323), INT16_C( 16144), -INT16_C( 14349) } }, + { { -INT16_C( 6083), -INT16_C( 28984), INT16_C( 22521), INT16_C( 8174) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_int16x4_t a = simde_vld1_s16(test_vec[i].a); + simde_int16x4_private a_ = simde_int16x4_to_private(a); + simde_bfloat16x4_t r = simde_vreinterpret_bf16_s16(a); + simde_bfloat16x4_private r_ = simde_bfloat16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_int16x4_t a = simde_test_arm_neon_random_i16x4(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_i16x4(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_bf16_s32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + int32_t a[2]; + } test_vec[] = { + { { -INT32_C( 146931668), INT32_C( 310243946) } }, + { { -INT32_C( 1148030226), INT32_C( 1383596628) } }, + { { INT32_C( 2002637712), -INT32_C( 448937154) } }, + { { -INT32_C( 36872548), -INT32_C( 1389941631) } }, + { { -INT32_C( 1750833876), INT32_C( 1185489240) } }, + { { -INT32_C( 402572396), -INT32_C( 851740099) } }, + { { -INT32_C( 1958438835), -INT32_C( 126778789) } }, + { { INT32_C( 1643462368), -INT32_C( 1760682902) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_int32x2_t a = simde_vld1_s32(test_vec[i].a); + simde_int32x2_private a_ = simde_int32x2_to_private(a); + simde_bfloat16x4_t r = simde_vreinterpret_bf16_s32(a); + simde_bfloat16x4_private r_ = simde_bfloat16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_int32x2_t a = simde_test_arm_neon_random_i32x2(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_i32x2(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_bf16_s64 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + int64_t a[1]; + } test_vec[] = { + { { INT64_C( 7503234288392778626) } }, + { { -INT64_C( 1649007285557452270) } }, + { { -INT64_C( 4289424775988288988) } }, + { { INT64_C( 875163472288443684) } }, + { { INT64_C( 4405653116102792167) } }, + { { INT64_C( 2787352143958209832) } }, + { { INT64_C( 3293571730532344588) } }, + { { -INT64_C( 638982217204507765) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_int64x1_t a = simde_vld1_s64(test_vec[i].a); + simde_int64x1_private a_ = simde_int64x1_to_private(a); + simde_bfloat16x4_t r = simde_vreinterpret_bf16_s64(a); + simde_bfloat16x4_private r_ = simde_bfloat16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_int64x1_t a = simde_test_arm_neon_random_i64x1(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_i64x1(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_bf16_u8 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + uint8_t a[8]; + } test_vec[] = { + { { UINT8_C(219), UINT8_C(229), UINT8_C( 67), UINT8_C( 18), UINT8_C(178), UINT8_C( 20), UINT8_C( 80), UINT8_C( 70) } }, + { { UINT8_C( 11), UINT8_C( 87), UINT8_C(193), UINT8_C(172), UINT8_C(121), UINT8_C(208), UINT8_C(228), UINT8_C( 89) } }, + { { UINT8_C(127), UINT8_C( 77), UINT8_C(191), UINT8_C(170), UINT8_C(119), UINT8_C( 55), UINT8_C(138), UINT8_C( 45) } }, + { { UINT8_C( 84), UINT8_C(175), UINT8_C(191), UINT8_C(230), UINT8_C(232), UINT8_C( 2), UINT8_C(139), UINT8_C(195) } }, + { { UINT8_C(232), UINT8_C(206), UINT8_C(214), UINT8_C(154), UINT8_C(226), UINT8_C( 38), UINT8_C(224), UINT8_C(238) } }, + { { UINT8_C(125), UINT8_C(162), UINT8_C(154), UINT8_C(246), UINT8_C(114), UINT8_C(126), UINT8_C( 79), UINT8_C(242) } }, + { { UINT8_C(203), UINT8_C( 15), UINT8_C(156), UINT8_C( 66), UINT8_C( 70), UINT8_C( 38), UINT8_C(112), UINT8_C(154) } }, + { { UINT8_C(213), UINT8_C( 47), UINT8_C(129), UINT8_C(189), UINT8_C( 50), UINT8_C( 12), UINT8_C(128), UINT8_C( 26) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_uint8x8_t a = simde_vld1_u8(test_vec[i].a); + simde_uint8x8_private a_ = simde_uint8x8_to_private(a); + simde_bfloat16x4_t r = simde_vreinterpret_bf16_u8(a); + simde_bfloat16x4_private r_ = simde_bfloat16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_uint8x8_t a = simde_test_arm_neon_random_u8x8(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_u8x8(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_bf16_u16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + uint16_t a[4]; + } test_vec[] = { + { { UINT16_C(30121), UINT16_C(12108), UINT16_C(42437), UINT16_C(49383) } }, + { { UINT16_C(53470), UINT16_C(44402), UINT16_C(41976), UINT16_C(56351) } }, + { { UINT16_C(61397), UINT16_C(60757), UINT16_C(18305), UINT16_C(55283) } }, + { { UINT16_C(12873), UINT16_C(19715), UINT16_C(47607), UINT16_C(41225) } }, + { { UINT16_C(22063), UINT16_C(62672), UINT16_C(47099), UINT16_C(55732) } }, + { { UINT16_C(10120), UINT16_C(32902), UINT16_C(42442), UINT16_C(40796) } }, + { { UINT16_C(45717), UINT16_C( 5772), UINT16_C(32761), UINT16_C(17389) } }, + { { UINT16_C(61874), UINT16_C(43408), UINT16_C(39594), UINT16_C(55626) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_uint16x4_t a = simde_vld1_u16(test_vec[i].a); + simde_uint16x4_private a_ = simde_uint16x4_to_private(a); + simde_bfloat16x4_t r = simde_vreinterpret_bf16_u16(a); + simde_bfloat16x4_private r_ = simde_bfloat16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_uint16x4_t a = simde_test_arm_neon_random_u16x4(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_u16x4(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_bf16_u32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + uint32_t a[2]; + } test_vec[] = { + { { UINT32_C(1459828951), UINT32_C(2672226147) } }, + { { UINT32_C(1249983765), UINT32_C( 378889046) } }, + { { UINT32_C(3918677086), UINT32_C(2174844555) } }, + { { UINT32_C( 96078707), UINT32_C(3315276013) } }, + { { UINT32_C(3021774673), UINT32_C(2756928142) } }, + { { UINT32_C(4142847392), UINT32_C(2517402424) } }, + { { UINT32_C(1400938184), UINT32_C(2429886748) } }, + { { UINT32_C( 429231916), UINT32_C(4175311271) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_uint32x2_t a = simde_vld1_u32(test_vec[i].a); + simde_uint32x2_private a_ = simde_uint32x2_to_private(a); + simde_bfloat16x4_t r = simde_vreinterpret_bf16_u32(a); + simde_bfloat16x4_private r_ = simde_bfloat16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_uint32x2_t a = simde_test_arm_neon_random_u32x2(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_u32x2(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_bf16_u64 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + uint64_t a[1]; + } test_vec[] = { + { { UINT64_C(18231134642569542608) } }, + { { UINT64_C( 4369616937394893013) } }, + { { UINT64_C( 8091389926875014046) } }, + { { UINT64_C(16254449904943554803) } }, + { { UINT64_C( 1566762566258999395) } }, + { { UINT64_C( 5756380640520090162) } }, + { { UINT64_C(14600200320837120745) } }, + { { UINT64_C(17593022292892657716) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_uint64x1_t a = simde_vld1_u64(test_vec[i].a); + simde_uint64x1_private a_ = simde_uint64x1_to_private(a); + simde_bfloat16x4_t r = simde_vreinterpret_bf16_u64(a); + simde_bfloat16x4_private r_ = simde_bfloat16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_uint64x1_t a = simde_test_arm_neon_random_u64x1(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_u64x1(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_bf16_f32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_float32_t a[2]; + } test_vec[] = { + { { SIMDE_FLOAT32_C( 345.27), SIMDE_FLOAT32_C( 827.74) } }, + { { SIMDE_FLOAT32_C( -488.04), SIMDE_FLOAT32_C( 130.78) } }, + { { SIMDE_FLOAT32_C( 192.25), SIMDE_FLOAT32_C( -556.64) } }, + { { SIMDE_FLOAT32_C( 398.71), SIMDE_FLOAT32_C( -974.95) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x2_t a = simde_vld1_f32(test_vec[i].a); + simde_float32x2_private a_ = simde_float32x2_to_private(a); + simde_bfloat16x4_t r = simde_vreinterpret_bf16_f32(a); + simde_bfloat16x4_private r_ = simde_bfloat16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_float32x2_t a = simde_test_arm_neon_random_f32x2(-1000.0f, 1000.0f); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_f32x2(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_bf16_f64 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_float64_t a[1]; + } test_vec[] = { + { { SIMDE_FLOAT64_C( -427.39) } }, + { { SIMDE_FLOAT64_C( -978.25) } }, + { { SIMDE_FLOAT64_C( 18.64) } }, + { { SIMDE_FLOAT64_C( 383.45) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float64x1_t a = simde_vld1_f64(test_vec[i].a); + simde_float64x1_private a_ = simde_float64x1_to_private(a); + simde_bfloat16x4_t r = simde_vreinterpret_bf16_f64(a); + simde_bfloat16x4_private r_ = simde_bfloat16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_float64x1_t a = simde_test_arm_neon_random_f64x1(-1000.0, 1000.0); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_f64x1(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_bf16_s8 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + int8_t a[16]; + } test_vec[] = { + { { INT8_C( 4), -INT8_C( 109), -INT8_C( 33), -INT8_C( 39), -INT8_C( 90), INT8_C( 69), -INT8_C( 81), INT8_C( 108), + -INT8_C( 116), INT8_C( 17), -INT8_C( 67), -INT8_C( 99), -INT8_C( 64), INT8_C( 35), -INT8_C( 67), INT8_C( 3) } }, + { { -INT8_C( 13), INT8_C( 21), -INT8_C( 24), INT8_C( 103), -INT8_C( 24), INT8_C( 122), INT8_C( 31), INT8_C( 72), + -INT8_C( 89), INT8_C( 36), -INT8_C( 23), -INT8_C( 63), INT8_C( 79), -INT8_C( 62), INT8_C( 8), INT8_C( 83) } }, + { { INT8_C( 85), -INT8_C( 24), INT8_C( 44), -INT8_C( 5), INT8_C( 45), -INT8_C( 36), INT8_C( 103), -INT8_C( 71), + -INT8_C( 19), INT8_C( 37), INT8_C( 86), -INT8_C( 82), INT8_C( 72), INT8_C( 19), -INT8_C( 79), INT8_C( 60) } }, + { { INT8_C( 40), -INT8_C( 102), -INT8_C( 93), INT8_C( 17), INT8_C( 20), -INT8_C( 61), INT8_C( 89), -INT8_C( 69), + -INT8_C( 25), INT8_C( 67), INT8_C( 124), INT8_C( 54), INT8_C( 5), -INT8_C( 123), -INT8_C( 119), INT8_C( 90) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_int8x16_t a = simde_vld1q_s8(test_vec[i].a); + simde_int8x16_private a_ = simde_int8x16_to_private(a); + simde_bfloat16x8_t r = simde_vreinterpretq_bf16_s8(a); + simde_bfloat16x8_private r_ = simde_bfloat16x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_int8x16_t a = simde_test_arm_neon_random_i8x16(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_i8x16(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_bf16_s16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + int16_t a[8]; + } test_vec[] = { + { { -INT16_C( 18835), -INT16_C( 26027), -INT16_C( 17262), INT16_C( 32596), -INT16_C( 21791), INT16_C( 10797), -INT16_C( 8258), -INT16_C( 6554) } }, + { { INT16_C( 2425), -INT16_C( 29193), INT16_C( 20940), -INT16_C( 19384), -INT16_C( 15212), -INT16_C( 26134), INT16_C( 29769), -INT16_C( 18701) } }, + { { INT16_C( 18474), -INT16_C( 17327), -INT16_C( 23292), -INT16_C( 6597), INT16_C( 26959), INT16_C( 3344), INT16_C( 30280), -INT16_C( 15884) } }, + { { -INT16_C( 5249), INT16_C( 19534), -INT16_C( 27076), -INT16_C( 12288), -INT16_C( 5542), -INT16_C( 23447), INT16_C( 23646), -INT16_C( 30630) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_int16x8_t a = simde_vld1q_s16(test_vec[i].a); + simde_int16x8_private a_ = simde_int16x8_to_private(a); + simde_bfloat16x8_t r = simde_vreinterpretq_bf16_s16(a); + simde_bfloat16x8_private r_ = simde_bfloat16x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_int16x8_t a = simde_test_arm_neon_random_i16x8(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_i16x8(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_bf16_s32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + int32_t a[4]; + } test_vec[] = { + { { -INT32_C( 1455117404), -INT32_C( 1601208240), INT32_C( 833462249), -INT32_C( 1796038379) } }, + { { -INT32_C( 908050291), INT32_C( 815456470), INT32_C( 701760459), INT32_C( 78786400) } }, + { { INT32_C( 732821210), INT32_C( 1607154806), -INT32_C( 258967333), -INT32_C( 1484422630) } }, + { { -INT32_C( 1737464382), INT32_C( 298388038), INT32_C( 1849335054), -INT32_C( 1485640500) } }, + { { INT32_C( 1506943203), INT32_C( 951688540), INT32_C( 791169301), -INT32_C( 1898533428) } }, + { { INT32_C( 1495746323), INT32_C( 1600843857), INT32_C( 1523426445), INT32_C( 1946239121) } }, + { { -INT32_C( 1127361696), -INT32_C( 2047572368), -INT32_C( 1665851952), -INT32_C( 584414262) } }, + { { INT32_C( 607539666), -INT32_C( 813457343), -INT32_C( 701935291), -INT32_C( 246797679) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_int32x4_t a = simde_vld1q_s32(test_vec[i].a); + simde_int32x4_private a_ = simde_int32x4_to_private(a); + simde_bfloat16x8_t r = simde_vreinterpretq_bf16_s32(a); + simde_bfloat16x8_private r_ = simde_bfloat16x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_int32x4_t a = simde_test_arm_neon_random_i32x4(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_i32x4(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_bf16_s64 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + int64_t a[2]; + } test_vec[] = { + { { INT64_C( 7994631089864644605), INT64_C( 389337288737990591) } }, + { { -INT64_C( 8964787523093422714), -INT64_C( 1837288424439431170) } }, + { { -INT64_C( 8158755818581054022), -INT64_C( 8419902793332502291) } }, + { { -INT64_C( 369882324318138596), -INT64_C( 7748432328819919192) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_int64x2_t a = simde_vld1q_s64(test_vec[i].a); + simde_int64x2_private a_ = simde_int64x2_to_private(a); + simde_bfloat16x8_t r = simde_vreinterpretq_bf16_s64(a); + simde_bfloat16x8_private r_ = simde_bfloat16x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_int64x2_t a = simde_test_arm_neon_random_i64x2(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_i64x2(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_bf16_u8 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + uint8_t a[16]; + } test_vec[] = { + { { UINT8_C( 83), UINT8_C(131), UINT8_C(194), UINT8_C(165), UINT8_C(223), UINT8_C(177), UINT8_C(173), UINT8_C( 6), + UINT8_C( 66), UINT8_C(145), UINT8_C(232), UINT8_C(162), UINT8_C( 24), UINT8_C(156), UINT8_C(104), UINT8_C( 3) } }, + { { UINT8_C(131), UINT8_C(200), UINT8_C(153), UINT8_C(122), UINT8_C(195), UINT8_C( 98), UINT8_C(154), UINT8_C(224), + UINT8_C(172), UINT8_C( 83), UINT8_C(182), UINT8_C( 84), UINT8_C( 46), UINT8_C(163), UINT8_C( 6), UINT8_C(130) } }, + { { UINT8_C( 38), UINT8_C(200), UINT8_C( 39), UINT8_C( 6), UINT8_C(122), UINT8_C(212), UINT8_C( 12), UINT8_C(188), + UINT8_C(101), UINT8_C(244), UINT8_C( 94), UINT8_C(125), UINT8_C(144), UINT8_C(198), UINT8_C(129), UINT8_C( 20) } }, + { { UINT8_C(143), UINT8_C( 26), UINT8_C(142), UINT8_C( 82), UINT8_C(125), UINT8_C( 40), UINT8_C( 50), UINT8_C( 41), + UINT8_C(123), UINT8_C(233), UINT8_C(126), UINT8_C(170), UINT8_C(140), UINT8_C(132), UINT8_C( 44), UINT8_C(179) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_uint8x16_t a = simde_vld1q_u8(test_vec[i].a); + simde_uint8x16_private a_ = simde_uint8x16_to_private(a); + simde_bfloat16x8_t r = simde_vreinterpretq_bf16_u8(a); + simde_bfloat16x8_private r_ = simde_bfloat16x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_uint8x16_t a = simde_test_arm_neon_random_u8x16(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_u8x16(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_bf16_u16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + uint16_t a[8]; + } test_vec[] = { + { { UINT16_C(21325), UINT16_C(51129), UINT16_C(50471), UINT16_C(35971), UINT16_C(57785), UINT16_C(18954), UINT16_C(35751), UINT16_C(13918) } }, + { { UINT16_C(60581), UINT16_C( 8841), UINT16_C(47893), UINT16_C(36940), UINT16_C(51876), UINT16_C(12602), UINT16_C(26190), UINT16_C(39908) } }, + { { UINT16_C(40377), UINT16_C(57442), UINT16_C(58722), UINT16_C( 7021), UINT16_C(30662), UINT16_C(28261), UINT16_C(49922), UINT16_C(42916) } }, + { { UINT16_C(11696), UINT16_C(50634), UINT16_C( 5865), UINT16_C(36181), UINT16_C(37088), UINT16_C(11966), UINT16_C(41718), UINT16_C(45258) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_uint16x8_t a = simde_vld1q_u16(test_vec[i].a); + simde_uint16x8_private a_ = simde_uint16x8_to_private(a); + simde_bfloat16x8_t r = simde_vreinterpretq_bf16_u16(a); + simde_bfloat16x8_private r_ = simde_bfloat16x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_uint16x8_t a = simde_test_arm_neon_random_u16x8(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_u16x8(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_bf16_u32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + uint32_t a[4]; + } test_vec[] = { + { { UINT32_C(2710580287), UINT32_C(3636329746), UINT32_C(1984307828), UINT32_C(2518608870) } }, + { { UINT32_C( 22800408), UINT32_C(3733958910), UINT32_C( 923553088), UINT32_C( 803722992) } }, + { { UINT32_C( 366049027), UINT32_C(3924659829), UINT32_C(2522887344), UINT32_C( 925662751) } }, + { { UINT32_C(1681491814), UINT32_C(2017642552), UINT32_C( 95374869), UINT32_C( 674600485) } }, + { { UINT32_C(2201814542), UINT32_C(1147939476), UINT32_C(2111556702), UINT32_C(2964653898) } }, + { { UINT32_C(3340037775), UINT32_C(3409925814), UINT32_C(3402756005), UINT32_C(2482112133) } }, + { { UINT32_C(2685808396), UINT32_C(3101983577), UINT32_C(2587213647), UINT32_C(1447750343) } }, + { { UINT32_C(2384289752), UINT32_C(1515871413), UINT32_C(3508808523), UINT32_C(1029969457) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_uint32x4_t a = simde_vld1q_u32(test_vec[i].a); + simde_uint32x4_private a_ = simde_uint32x4_to_private(a); + simde_bfloat16x8_t r = simde_vreinterpretq_bf16_u32(a); + simde_bfloat16x8_private r_ = simde_bfloat16x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_uint32x4_t a = simde_test_arm_neon_random_u32x4(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_u32x4(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_bf16_u64 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + uint64_t a[2]; + } test_vec[] = { + { { UINT64_C( 5573136363242224453), UINT64_C( 5737078463222221953) } }, + { { UINT64_C( 7179080953629686673), UINT64_C( 2436896946530862435) } }, + { { UINT64_C(17320588457696865811), UINT64_C( 678590505213773476) } }, + { { UINT64_C(16360717081228888209), UINT64_C(17056337783766335670) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_uint64x2_t a = simde_vld1q_u64(test_vec[i].a); + simde_uint64x2_private a_ = simde_uint64x2_to_private(a); + simde_bfloat16x8_t r = simde_vreinterpretq_bf16_u64(a); + simde_bfloat16x8_private r_ = simde_bfloat16x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_uint64x2_t a = simde_test_arm_neon_random_u64x2(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_u64x2(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_bf16_f32 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + simde_float32_t a[4]; + } test_vec[] = { + { { SIMDE_FLOAT32_C( 7.82), SIMDE_FLOAT32_C( 904.23), SIMDE_FLOAT32_C( 301.81), SIMDE_FLOAT32_C( 823.64) } }, + { { SIMDE_FLOAT32_C( -946.55), SIMDE_FLOAT32_C( 98.67), SIMDE_FLOAT32_C( -111.44), SIMDE_FLOAT32_C( 829.16) } }, + { { SIMDE_FLOAT32_C( -237.48), SIMDE_FLOAT32_C( 597.68), SIMDE_FLOAT32_C( 765.56), SIMDE_FLOAT32_C( -16.07) } }, + { { SIMDE_FLOAT32_C( 189.22), SIMDE_FLOAT32_C( -221.30), SIMDE_FLOAT32_C( -693.03), SIMDE_FLOAT32_C( 412.06) } }, + { { SIMDE_FLOAT32_C( -936.59), SIMDE_FLOAT32_C( -105.27), SIMDE_FLOAT32_C( 962.59), SIMDE_FLOAT32_C( -821.74) } }, + { { SIMDE_FLOAT32_C( 868.84), SIMDE_FLOAT32_C( 275.62), SIMDE_FLOAT32_C( 407.21), SIMDE_FLOAT32_C( -167.39) } }, + { { SIMDE_FLOAT32_C( -743.76), SIMDE_FLOAT32_C( -246.71), SIMDE_FLOAT32_C( -65.80), SIMDE_FLOAT32_C( -251.81) } }, + { { SIMDE_FLOAT32_C( -952.86), SIMDE_FLOAT32_C( -488.09), SIMDE_FLOAT32_C( 550.29), SIMDE_FLOAT32_C( 54.97) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x4_t a = simde_vld1q_f32(test_vec[i].a); + simde_float32x4_private a_ = simde_float32x4_to_private(a); + simde_bfloat16x8_t r = simde_vreinterpretq_bf16_f32(a); + simde_bfloat16x8_private r_ = simde_bfloat16x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_float32x4_t a = simde_test_arm_neon_random_f32x4(-1000.0f, 1000.0f); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_f32x4(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_bf16_f64 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + simde_float64_t a[2]; + } test_vec[] = { + { { SIMDE_FLOAT64_C( -583.86), SIMDE_FLOAT64_C( -147.90) } }, + { { SIMDE_FLOAT64_C( -121.40), SIMDE_FLOAT64_C( -530.41) } }, + { { SIMDE_FLOAT64_C( 950.77), SIMDE_FLOAT64_C( 767.16) } }, + { { SIMDE_FLOAT64_C( -701.24), SIMDE_FLOAT64_C( -286.71) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float64x2_t a = simde_vld1q_f64(test_vec[i].a); + simde_float64x2_private a_ = simde_float64x2_to_private(a); + simde_bfloat16x8_t r = simde_vreinterpretq_bf16_f64(a); + simde_bfloat16x8_private r_ = simde_bfloat16x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_float64x2_t a = simde_test_arm_neon_random_f64x2(-1000.0, 1000.0); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_f64x2(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_s8_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 9.69), SIMDE_BFLOAT16_VALUE( 83.50), SIMDE_BFLOAT16_VALUE( -28.25), SIMDE_BFLOAT16_VALUE( -62.75) } }, + { { SIMDE_BFLOAT16_VALUE( 31.50), SIMDE_BFLOAT16_VALUE( -19.88), SIMDE_BFLOAT16_VALUE( -22.50), SIMDE_BFLOAT16_VALUE( -82.00) } }, + { { SIMDE_BFLOAT16_VALUE( 70.00), SIMDE_BFLOAT16_VALUE( -9.88), SIMDE_BFLOAT16_VALUE( -97.00), SIMDE_BFLOAT16_VALUE( -35.00) } }, + { { SIMDE_BFLOAT16_VALUE( -15.94), SIMDE_BFLOAT16_VALUE( 67.00), SIMDE_BFLOAT16_VALUE( 92.50), SIMDE_BFLOAT16_VALUE( 96.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a); + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_int8x8_t r = simde_vreinterpret_s8_bf16(a); + simde_int8x8_private r_ = simde_int8x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_s16_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 9.69), SIMDE_BFLOAT16_VALUE( 83.50), SIMDE_BFLOAT16_VALUE( -28.25), SIMDE_BFLOAT16_VALUE( -62.75) } }, + { { SIMDE_BFLOAT16_VALUE( 31.50), SIMDE_BFLOAT16_VALUE( -19.88), SIMDE_BFLOAT16_VALUE( -22.50), SIMDE_BFLOAT16_VALUE( -82.00) } }, + { { SIMDE_BFLOAT16_VALUE( 70.00), SIMDE_BFLOAT16_VALUE( -9.88), SIMDE_BFLOAT16_VALUE( -97.00), SIMDE_BFLOAT16_VALUE( -35.00) } }, + { { SIMDE_BFLOAT16_VALUE( -15.94), SIMDE_BFLOAT16_VALUE( 67.00), SIMDE_BFLOAT16_VALUE( 92.50), SIMDE_BFLOAT16_VALUE( 96.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a); + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_int16x4_t r = simde_vreinterpret_s16_bf16(a); + simde_int16x4_private r_ = simde_int16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_s32_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 9.69), SIMDE_BFLOAT16_VALUE( 83.50), SIMDE_BFLOAT16_VALUE( -28.25), SIMDE_BFLOAT16_VALUE( -62.75) } }, + { { SIMDE_BFLOAT16_VALUE( 31.50), SIMDE_BFLOAT16_VALUE( -19.88), SIMDE_BFLOAT16_VALUE( -22.50), SIMDE_BFLOAT16_VALUE( -82.00) } }, + { { SIMDE_BFLOAT16_VALUE( 70.00), SIMDE_BFLOAT16_VALUE( -9.88), SIMDE_BFLOAT16_VALUE( -97.00), SIMDE_BFLOAT16_VALUE( -35.00) } }, + { { SIMDE_BFLOAT16_VALUE( -15.94), SIMDE_BFLOAT16_VALUE( 67.00), SIMDE_BFLOAT16_VALUE( 92.50), SIMDE_BFLOAT16_VALUE( 96.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a); + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_int32x2_t r = simde_vreinterpret_s32_bf16(a); + simde_int32x2_private r_ = simde_int32x2_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_s64_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 9.69), SIMDE_BFLOAT16_VALUE( 83.50), SIMDE_BFLOAT16_VALUE( -28.25), SIMDE_BFLOAT16_VALUE( -62.75) } }, + { { SIMDE_BFLOAT16_VALUE( 31.50), SIMDE_BFLOAT16_VALUE( -19.88), SIMDE_BFLOAT16_VALUE( -22.50), SIMDE_BFLOAT16_VALUE( -82.00) } }, + { { SIMDE_BFLOAT16_VALUE( 70.00), SIMDE_BFLOAT16_VALUE( -9.88), SIMDE_BFLOAT16_VALUE( -97.00), SIMDE_BFLOAT16_VALUE( -35.00) } }, + { { SIMDE_BFLOAT16_VALUE( -15.94), SIMDE_BFLOAT16_VALUE( 67.00), SIMDE_BFLOAT16_VALUE( 92.50), SIMDE_BFLOAT16_VALUE( 96.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a); + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_int64x1_t r = simde_vreinterpret_s64_bf16(a); + simde_int64x1_private r_ = simde_int64x1_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_u8_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 9.69), SIMDE_BFLOAT16_VALUE( 83.50), SIMDE_BFLOAT16_VALUE( -28.25), SIMDE_BFLOAT16_VALUE( -62.75) } }, + { { SIMDE_BFLOAT16_VALUE( 31.50), SIMDE_BFLOAT16_VALUE( -19.88), SIMDE_BFLOAT16_VALUE( -22.50), SIMDE_BFLOAT16_VALUE( -82.00) } }, + { { SIMDE_BFLOAT16_VALUE( 70.00), SIMDE_BFLOAT16_VALUE( -9.88), SIMDE_BFLOAT16_VALUE( -97.00), SIMDE_BFLOAT16_VALUE( -35.00) } }, + { { SIMDE_BFLOAT16_VALUE( -15.94), SIMDE_BFLOAT16_VALUE( 67.00), SIMDE_BFLOAT16_VALUE( 92.50), SIMDE_BFLOAT16_VALUE( 96.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a); + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_uint8x8_t r = simde_vreinterpret_u8_bf16(a); + simde_uint8x8_private r_ = simde_uint8x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_u16_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 9.69), SIMDE_BFLOAT16_VALUE( 83.50), SIMDE_BFLOAT16_VALUE( -28.25), SIMDE_BFLOAT16_VALUE( -62.75) } }, + { { SIMDE_BFLOAT16_VALUE( 31.50), SIMDE_BFLOAT16_VALUE( -19.88), SIMDE_BFLOAT16_VALUE( -22.50), SIMDE_BFLOAT16_VALUE( -82.00) } }, + { { SIMDE_BFLOAT16_VALUE( 70.00), SIMDE_BFLOAT16_VALUE( -9.88), SIMDE_BFLOAT16_VALUE( -97.00), SIMDE_BFLOAT16_VALUE( -35.00) } }, + { { SIMDE_BFLOAT16_VALUE( -15.94), SIMDE_BFLOAT16_VALUE( 67.00), SIMDE_BFLOAT16_VALUE( 92.50), SIMDE_BFLOAT16_VALUE( 96.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a); + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_uint16x4_t r = simde_vreinterpret_u16_bf16(a); + simde_uint16x4_private r_ = simde_uint16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_u32_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 9.69), SIMDE_BFLOAT16_VALUE( 83.50), SIMDE_BFLOAT16_VALUE( -28.25), SIMDE_BFLOAT16_VALUE( -62.75) } }, + { { SIMDE_BFLOAT16_VALUE( 31.50), SIMDE_BFLOAT16_VALUE( -19.88), SIMDE_BFLOAT16_VALUE( -22.50), SIMDE_BFLOAT16_VALUE( -82.00) } }, + { { SIMDE_BFLOAT16_VALUE( 70.00), SIMDE_BFLOAT16_VALUE( -9.88), SIMDE_BFLOAT16_VALUE( -97.00), SIMDE_BFLOAT16_VALUE( -35.00) } }, + { { SIMDE_BFLOAT16_VALUE( -15.94), SIMDE_BFLOAT16_VALUE( 67.00), SIMDE_BFLOAT16_VALUE( 92.50), SIMDE_BFLOAT16_VALUE( 96.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a); + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_uint32x2_t r = simde_vreinterpret_u32_bf16(a); + simde_uint32x2_private r_ = simde_uint32x2_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_u64_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 9.69), SIMDE_BFLOAT16_VALUE( 83.50), SIMDE_BFLOAT16_VALUE( -28.25), SIMDE_BFLOAT16_VALUE( -62.75) } }, + { { SIMDE_BFLOAT16_VALUE( 31.50), SIMDE_BFLOAT16_VALUE( -19.88), SIMDE_BFLOAT16_VALUE( -22.50), SIMDE_BFLOAT16_VALUE( -82.00) } }, + { { SIMDE_BFLOAT16_VALUE( 70.00), SIMDE_BFLOAT16_VALUE( -9.88), SIMDE_BFLOAT16_VALUE( -97.00), SIMDE_BFLOAT16_VALUE( -35.00) } }, + { { SIMDE_BFLOAT16_VALUE( -15.94), SIMDE_BFLOAT16_VALUE( 67.00), SIMDE_BFLOAT16_VALUE( 92.50), SIMDE_BFLOAT16_VALUE( 96.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a); + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_uint64x1_t r = simde_vreinterpret_u64_bf16(a); + simde_uint64x1_private r_ = simde_uint64x1_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_f32_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 9.69), SIMDE_BFLOAT16_VALUE( 83.50), SIMDE_BFLOAT16_VALUE( -28.25), SIMDE_BFLOAT16_VALUE( -62.75) } }, + { { SIMDE_BFLOAT16_VALUE( 31.50), SIMDE_BFLOAT16_VALUE( -19.88), SIMDE_BFLOAT16_VALUE( -22.50), SIMDE_BFLOAT16_VALUE( -82.00) } }, + { { SIMDE_BFLOAT16_VALUE( 70.00), SIMDE_BFLOAT16_VALUE( -9.88), SIMDE_BFLOAT16_VALUE( -97.00), SIMDE_BFLOAT16_VALUE( -35.00) } }, + { { SIMDE_BFLOAT16_VALUE( -15.94), SIMDE_BFLOAT16_VALUE( 67.00), SIMDE_BFLOAT16_VALUE( 92.50), SIMDE_BFLOAT16_VALUE( 96.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a); + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_float32x2_t r = simde_vreinterpret_f32_bf16(a); + simde_float32x2_private r_ = simde_float32x2_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_f64_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 9.69), SIMDE_BFLOAT16_VALUE( 83.50), SIMDE_BFLOAT16_VALUE( -28.25), SIMDE_BFLOAT16_VALUE( -62.75) } }, + { { SIMDE_BFLOAT16_VALUE( 31.50), SIMDE_BFLOAT16_VALUE( -19.88), SIMDE_BFLOAT16_VALUE( -22.50), SIMDE_BFLOAT16_VALUE( -82.00) } }, + { { SIMDE_BFLOAT16_VALUE( 70.00), SIMDE_BFLOAT16_VALUE( -9.88), SIMDE_BFLOAT16_VALUE( -97.00), SIMDE_BFLOAT16_VALUE( -35.00) } }, + { { SIMDE_BFLOAT16_VALUE( -15.94), SIMDE_BFLOAT16_VALUE( 67.00), SIMDE_BFLOAT16_VALUE( 92.50), SIMDE_BFLOAT16_VALUE( 96.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a); + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_float64x1_t r = simde_vreinterpret_f64_bf16(a); + simde_float64x1_private r_ = simde_float64x1_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_s8_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 80.00), SIMDE_BFLOAT16_VALUE( -44.00), SIMDE_BFLOAT16_VALUE( 33.25), SIMDE_BFLOAT16_VALUE( 29.12), + SIMDE_BFLOAT16_VALUE( -20.25), SIMDE_BFLOAT16_VALUE( 11.06), SIMDE_BFLOAT16_VALUE( 69.50), SIMDE_BFLOAT16_VALUE( 69.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.62), SIMDE_BFLOAT16_VALUE( -94.00), SIMDE_BFLOAT16_VALUE( -84.50), SIMDE_BFLOAT16_VALUE( -16.75), + SIMDE_BFLOAT16_VALUE( -35.25), SIMDE_BFLOAT16_VALUE( -58.75), SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -63.00) } }, + { { SIMDE_BFLOAT16_VALUE( 6.09), SIMDE_BFLOAT16_VALUE( -77.50), SIMDE_BFLOAT16_VALUE( -58.00), SIMDE_BFLOAT16_VALUE( -40.50), + SIMDE_BFLOAT16_VALUE( -99.50), SIMDE_BFLOAT16_VALUE( 26.50), SIMDE_BFLOAT16_VALUE( -49.00), SIMDE_BFLOAT16_VALUE( 55.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.00), SIMDE_BFLOAT16_VALUE( -36.25), SIMDE_BFLOAT16_VALUE( 58.00), SIMDE_BFLOAT16_VALUE( 71.00), + SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -0.30), SIMDE_BFLOAT16_VALUE( -49.75), SIMDE_BFLOAT16_VALUE( 30.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_int8x16_t r = simde_vreinterpretq_s8_bf16(a); + simde_int8x16_private r_ = simde_int8x16_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_s16_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 80.00), SIMDE_BFLOAT16_VALUE( -44.00), SIMDE_BFLOAT16_VALUE( 33.25), SIMDE_BFLOAT16_VALUE( 29.12), + SIMDE_BFLOAT16_VALUE( -20.25), SIMDE_BFLOAT16_VALUE( 11.06), SIMDE_BFLOAT16_VALUE( 69.50), SIMDE_BFLOAT16_VALUE( 69.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.62), SIMDE_BFLOAT16_VALUE( -94.00), SIMDE_BFLOAT16_VALUE( -84.50), SIMDE_BFLOAT16_VALUE( -16.75), + SIMDE_BFLOAT16_VALUE( -35.25), SIMDE_BFLOAT16_VALUE( -58.75), SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -63.00) } }, + { { SIMDE_BFLOAT16_VALUE( 6.09), SIMDE_BFLOAT16_VALUE( -77.50), SIMDE_BFLOAT16_VALUE( -58.00), SIMDE_BFLOAT16_VALUE( -40.50), + SIMDE_BFLOAT16_VALUE( -99.50), SIMDE_BFLOAT16_VALUE( 26.50), SIMDE_BFLOAT16_VALUE( -49.00), SIMDE_BFLOAT16_VALUE( 55.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.00), SIMDE_BFLOAT16_VALUE( -36.25), SIMDE_BFLOAT16_VALUE( 58.00), SIMDE_BFLOAT16_VALUE( 71.00), + SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -0.30), SIMDE_BFLOAT16_VALUE( -49.75), SIMDE_BFLOAT16_VALUE( 30.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_int16x8_t r = simde_vreinterpretq_s16_bf16(a); + simde_int16x8_private r_ = simde_int16x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_s32_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 80.00), SIMDE_BFLOAT16_VALUE( -44.00), SIMDE_BFLOAT16_VALUE( 33.25), SIMDE_BFLOAT16_VALUE( 29.12), + SIMDE_BFLOAT16_VALUE( -20.25), SIMDE_BFLOAT16_VALUE( 11.06), SIMDE_BFLOAT16_VALUE( 69.50), SIMDE_BFLOAT16_VALUE( 69.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.62), SIMDE_BFLOAT16_VALUE( -94.00), SIMDE_BFLOAT16_VALUE( -84.50), SIMDE_BFLOAT16_VALUE( -16.75), + SIMDE_BFLOAT16_VALUE( -35.25), SIMDE_BFLOAT16_VALUE( -58.75), SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -63.00) } }, + { { SIMDE_BFLOAT16_VALUE( 6.09), SIMDE_BFLOAT16_VALUE( -77.50), SIMDE_BFLOAT16_VALUE( -58.00), SIMDE_BFLOAT16_VALUE( -40.50), + SIMDE_BFLOAT16_VALUE( -99.50), SIMDE_BFLOAT16_VALUE( 26.50), SIMDE_BFLOAT16_VALUE( -49.00), SIMDE_BFLOAT16_VALUE( 55.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.00), SIMDE_BFLOAT16_VALUE( -36.25), SIMDE_BFLOAT16_VALUE( 58.00), SIMDE_BFLOAT16_VALUE( 71.00), + SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -0.30), SIMDE_BFLOAT16_VALUE( -49.75), SIMDE_BFLOAT16_VALUE( 30.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_int32x4_t r = simde_vreinterpretq_s32_bf16(a); + simde_int32x4_private r_ = simde_int32x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_s64_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 80.00), SIMDE_BFLOAT16_VALUE( -44.00), SIMDE_BFLOAT16_VALUE( 33.25), SIMDE_BFLOAT16_VALUE( 29.12), + SIMDE_BFLOAT16_VALUE( -20.25), SIMDE_BFLOAT16_VALUE( 11.06), SIMDE_BFLOAT16_VALUE( 69.50), SIMDE_BFLOAT16_VALUE( 69.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.62), SIMDE_BFLOAT16_VALUE( -94.00), SIMDE_BFLOAT16_VALUE( -84.50), SIMDE_BFLOAT16_VALUE( -16.75), + SIMDE_BFLOAT16_VALUE( -35.25), SIMDE_BFLOAT16_VALUE( -58.75), SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -63.00) } }, + { { SIMDE_BFLOAT16_VALUE( 6.09), SIMDE_BFLOAT16_VALUE( -77.50), SIMDE_BFLOAT16_VALUE( -58.00), SIMDE_BFLOAT16_VALUE( -40.50), + SIMDE_BFLOAT16_VALUE( -99.50), SIMDE_BFLOAT16_VALUE( 26.50), SIMDE_BFLOAT16_VALUE( -49.00), SIMDE_BFLOAT16_VALUE( 55.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.00), SIMDE_BFLOAT16_VALUE( -36.25), SIMDE_BFLOAT16_VALUE( 58.00), SIMDE_BFLOAT16_VALUE( 71.00), + SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -0.30), SIMDE_BFLOAT16_VALUE( -49.75), SIMDE_BFLOAT16_VALUE( 30.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_int64x2_t r = simde_vreinterpretq_s64_bf16(a); + simde_int64x2_private r_ = simde_int64x2_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_u8_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 80.00), SIMDE_BFLOAT16_VALUE( -44.00), SIMDE_BFLOAT16_VALUE( 33.25), SIMDE_BFLOAT16_VALUE( 29.12), + SIMDE_BFLOAT16_VALUE( -20.25), SIMDE_BFLOAT16_VALUE( 11.06), SIMDE_BFLOAT16_VALUE( 69.50), SIMDE_BFLOAT16_VALUE( 69.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.62), SIMDE_BFLOAT16_VALUE( -94.00), SIMDE_BFLOAT16_VALUE( -84.50), SIMDE_BFLOAT16_VALUE( -16.75), + SIMDE_BFLOAT16_VALUE( -35.25), SIMDE_BFLOAT16_VALUE( -58.75), SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -63.00) } }, + { { SIMDE_BFLOAT16_VALUE( 6.09), SIMDE_BFLOAT16_VALUE( -77.50), SIMDE_BFLOAT16_VALUE( -58.00), SIMDE_BFLOAT16_VALUE( -40.50), + SIMDE_BFLOAT16_VALUE( -99.50), SIMDE_BFLOAT16_VALUE( 26.50), SIMDE_BFLOAT16_VALUE( -49.00), SIMDE_BFLOAT16_VALUE( 55.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.00), SIMDE_BFLOAT16_VALUE( -36.25), SIMDE_BFLOAT16_VALUE( 58.00), SIMDE_BFLOAT16_VALUE( 71.00), + SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -0.30), SIMDE_BFLOAT16_VALUE( -49.75), SIMDE_BFLOAT16_VALUE( 30.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_uint8x16_t r = simde_vreinterpretq_u8_bf16(a); + simde_uint8x16_private r_ = simde_uint8x16_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_u16_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 80.00), SIMDE_BFLOAT16_VALUE( -44.00), SIMDE_BFLOAT16_VALUE( 33.25), SIMDE_BFLOAT16_VALUE( 29.12), + SIMDE_BFLOAT16_VALUE( -20.25), SIMDE_BFLOAT16_VALUE( 11.06), SIMDE_BFLOAT16_VALUE( 69.50), SIMDE_BFLOAT16_VALUE( 69.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.62), SIMDE_BFLOAT16_VALUE( -94.00), SIMDE_BFLOAT16_VALUE( -84.50), SIMDE_BFLOAT16_VALUE( -16.75), + SIMDE_BFLOAT16_VALUE( -35.25), SIMDE_BFLOAT16_VALUE( -58.75), SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -63.00) } }, + { { SIMDE_BFLOAT16_VALUE( 6.09), SIMDE_BFLOAT16_VALUE( -77.50), SIMDE_BFLOAT16_VALUE( -58.00), SIMDE_BFLOAT16_VALUE( -40.50), + SIMDE_BFLOAT16_VALUE( -99.50), SIMDE_BFLOAT16_VALUE( 26.50), SIMDE_BFLOAT16_VALUE( -49.00), SIMDE_BFLOAT16_VALUE( 55.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.00), SIMDE_BFLOAT16_VALUE( -36.25), SIMDE_BFLOAT16_VALUE( 58.00), SIMDE_BFLOAT16_VALUE( 71.00), + SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -0.30), SIMDE_BFLOAT16_VALUE( -49.75), SIMDE_BFLOAT16_VALUE( 30.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_uint16x8_t r = simde_vreinterpretq_u16_bf16(a); + simde_uint16x8_private r_ = simde_uint16x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_u32_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 80.00), SIMDE_BFLOAT16_VALUE( -44.00), SIMDE_BFLOAT16_VALUE( 33.25), SIMDE_BFLOAT16_VALUE( 29.12), + SIMDE_BFLOAT16_VALUE( -20.25), SIMDE_BFLOAT16_VALUE( 11.06), SIMDE_BFLOAT16_VALUE( 69.50), SIMDE_BFLOAT16_VALUE( 69.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.62), SIMDE_BFLOAT16_VALUE( -94.00), SIMDE_BFLOAT16_VALUE( -84.50), SIMDE_BFLOAT16_VALUE( -16.75), + SIMDE_BFLOAT16_VALUE( -35.25), SIMDE_BFLOAT16_VALUE( -58.75), SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -63.00) } }, + { { SIMDE_BFLOAT16_VALUE( 6.09), SIMDE_BFLOAT16_VALUE( -77.50), SIMDE_BFLOAT16_VALUE( -58.00), SIMDE_BFLOAT16_VALUE( -40.50), + SIMDE_BFLOAT16_VALUE( -99.50), SIMDE_BFLOAT16_VALUE( 26.50), SIMDE_BFLOAT16_VALUE( -49.00), SIMDE_BFLOAT16_VALUE( 55.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.00), SIMDE_BFLOAT16_VALUE( -36.25), SIMDE_BFLOAT16_VALUE( 58.00), SIMDE_BFLOAT16_VALUE( 71.00), + SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -0.30), SIMDE_BFLOAT16_VALUE( -49.75), SIMDE_BFLOAT16_VALUE( 30.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_uint32x4_t r = simde_vreinterpretq_u32_bf16(a); + simde_uint32x4_private r_ = simde_uint32x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_u64_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 80.00), SIMDE_BFLOAT16_VALUE( -44.00), SIMDE_BFLOAT16_VALUE( 33.25), SIMDE_BFLOAT16_VALUE( 29.12), + SIMDE_BFLOAT16_VALUE( -20.25), SIMDE_BFLOAT16_VALUE( 11.06), SIMDE_BFLOAT16_VALUE( 69.50), SIMDE_BFLOAT16_VALUE( 69.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.62), SIMDE_BFLOAT16_VALUE( -94.00), SIMDE_BFLOAT16_VALUE( -84.50), SIMDE_BFLOAT16_VALUE( -16.75), + SIMDE_BFLOAT16_VALUE( -35.25), SIMDE_BFLOAT16_VALUE( -58.75), SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -63.00) } }, + { { SIMDE_BFLOAT16_VALUE( 6.09), SIMDE_BFLOAT16_VALUE( -77.50), SIMDE_BFLOAT16_VALUE( -58.00), SIMDE_BFLOAT16_VALUE( -40.50), + SIMDE_BFLOAT16_VALUE( -99.50), SIMDE_BFLOAT16_VALUE( 26.50), SIMDE_BFLOAT16_VALUE( -49.00), SIMDE_BFLOAT16_VALUE( 55.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.00), SIMDE_BFLOAT16_VALUE( -36.25), SIMDE_BFLOAT16_VALUE( 58.00), SIMDE_BFLOAT16_VALUE( 71.00), + SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -0.30), SIMDE_BFLOAT16_VALUE( -49.75), SIMDE_BFLOAT16_VALUE( 30.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_uint64x2_t r = simde_vreinterpretq_u64_bf16(a); + simde_uint64x2_private r_ = simde_uint64x2_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_f32_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 80.00), SIMDE_BFLOAT16_VALUE( -44.00), SIMDE_BFLOAT16_VALUE( 33.25), SIMDE_BFLOAT16_VALUE( 29.12), + SIMDE_BFLOAT16_VALUE( -20.25), SIMDE_BFLOAT16_VALUE( 11.06), SIMDE_BFLOAT16_VALUE( 69.50), SIMDE_BFLOAT16_VALUE( 69.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.62), SIMDE_BFLOAT16_VALUE( -94.00), SIMDE_BFLOAT16_VALUE( -84.50), SIMDE_BFLOAT16_VALUE( -16.75), + SIMDE_BFLOAT16_VALUE( -35.25), SIMDE_BFLOAT16_VALUE( -58.75), SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -63.00) } }, + { { SIMDE_BFLOAT16_VALUE( 6.09), SIMDE_BFLOAT16_VALUE( -77.50), SIMDE_BFLOAT16_VALUE( -58.00), SIMDE_BFLOAT16_VALUE( -40.50), + SIMDE_BFLOAT16_VALUE( -99.50), SIMDE_BFLOAT16_VALUE( 26.50), SIMDE_BFLOAT16_VALUE( -49.00), SIMDE_BFLOAT16_VALUE( 55.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.00), SIMDE_BFLOAT16_VALUE( -36.25), SIMDE_BFLOAT16_VALUE( 58.00), SIMDE_BFLOAT16_VALUE( 71.00), + SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -0.30), SIMDE_BFLOAT16_VALUE( -49.75), SIMDE_BFLOAT16_VALUE( 30.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_float32x4_t r = simde_vreinterpretq_f32_bf16(a); + simde_float32x4_private r_ = simde_float32x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_f64_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 80.00), SIMDE_BFLOAT16_VALUE( -44.00), SIMDE_BFLOAT16_VALUE( 33.25), SIMDE_BFLOAT16_VALUE( 29.12), + SIMDE_BFLOAT16_VALUE( -20.25), SIMDE_BFLOAT16_VALUE( 11.06), SIMDE_BFLOAT16_VALUE( 69.50), SIMDE_BFLOAT16_VALUE( 69.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.62), SIMDE_BFLOAT16_VALUE( -94.00), SIMDE_BFLOAT16_VALUE( -84.50), SIMDE_BFLOAT16_VALUE( -16.75), + SIMDE_BFLOAT16_VALUE( -35.25), SIMDE_BFLOAT16_VALUE( -58.75), SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -63.00) } }, + { { SIMDE_BFLOAT16_VALUE( 6.09), SIMDE_BFLOAT16_VALUE( -77.50), SIMDE_BFLOAT16_VALUE( -58.00), SIMDE_BFLOAT16_VALUE( -40.50), + SIMDE_BFLOAT16_VALUE( -99.50), SIMDE_BFLOAT16_VALUE( 26.50), SIMDE_BFLOAT16_VALUE( -49.00), SIMDE_BFLOAT16_VALUE( 55.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.00), SIMDE_BFLOAT16_VALUE( -36.25), SIMDE_BFLOAT16_VALUE( 58.00), SIMDE_BFLOAT16_VALUE( 71.00), + SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -0.30), SIMDE_BFLOAT16_VALUE( -49.75), SIMDE_BFLOAT16_VALUE( 30.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_float64x2_t r = simde_vreinterpretq_f64_bf16(a); + simde_float64x2_private r_ = simde_float64x2_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_bf16_p8 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + simde_poly8_t a[8]; + } test_vec[] = { + { { SIMDE_POLY8_C(244), SIMDE_POLY8_C(238), SIMDE_POLY8_C( 48), SIMDE_POLY8_C( 80), SIMDE_POLY8_C(193), SIMDE_POLY8_C( 25), SIMDE_POLY8_C(124), SIMDE_POLY8_C(164) } }, + { { SIMDE_POLY8_C(237), SIMDE_POLY8_C(216), SIMDE_POLY8_C(213), SIMDE_POLY8_C(196), SIMDE_POLY8_C(129), SIMDE_POLY8_C( 77), SIMDE_POLY8_C(246), SIMDE_POLY8_C( 33) } }, + { { SIMDE_POLY8_C( 57), SIMDE_POLY8_C(101), SIMDE_POLY8_C( 86), SIMDE_POLY8_C(221), SIMDE_POLY8_C(207), SIMDE_POLY8_C( 72), SIMDE_POLY8_C(148), SIMDE_POLY8_C(228) } }, + { { SIMDE_POLY8_C( 82), SIMDE_POLY8_C( 82), SIMDE_POLY8_C(149), SIMDE_POLY8_C( 38), SIMDE_POLY8_C( 59), SIMDE_POLY8_C(197), SIMDE_POLY8_C(198), SIMDE_POLY8_C( 47) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_poly8x8_t a = simde_vld1_p8(test_vec[i].a); + simde_poly8x8_private a_ = simde_poly8x8_to_private(a); + simde_bfloat16x4_t r = simde_vreinterpret_bf16_p8(a); + simde_bfloat16x4_private r_ = simde_bfloat16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_poly8x8_t a = simde_test_arm_neon_random_p8x8(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_p8x8(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_bf16_p16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + simde_poly16_t a[4]; + } test_vec[] = { + { { SIMDE_POLY16_C(13600), SIMDE_POLY16_C(32053), SIMDE_POLY16_C( 4635), SIMDE_POLY16_C(32043) } }, + { { SIMDE_POLY16_C(10507), SIMDE_POLY16_C(46629), SIMDE_POLY16_C(39072), SIMDE_POLY16_C(55899) } }, + { { SIMDE_POLY16_C(59130), SIMDE_POLY16_C(20421), SIMDE_POLY16_C(38878), SIMDE_POLY16_C(12985) } }, + { { SIMDE_POLY16_C(53027), SIMDE_POLY16_C(42572), SIMDE_POLY16_C(30763), SIMDE_POLY16_C(19332) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_poly16x4_t a = simde_vld1_p16(test_vec[i].a); + simde_poly16x4_private a_ = simde_poly16x4_to_private(a); + simde_bfloat16x4_t r = simde_vreinterpret_bf16_p16(a); + simde_bfloat16x4_private r_ = simde_bfloat16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_poly16x4_t a = simde_test_arm_neon_random_p16x4(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_p16x4(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_bf16_p64 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + simde_poly64_t a[1]; + } test_vec[] = { + { { SIMDE_POLY64_C( 9204660904461523583) } }, + { { SIMDE_POLY64_C( 4739275422767344560) } }, + { { SIMDE_POLY64_C( 6584180791968875294) } }, + { { SIMDE_POLY64_C( 7421150329967090969) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_poly64x1_t a = simde_vld1_p64(test_vec[i].a); + simde_poly64x1_private a_ = simde_poly64x1_to_private(a); + simde_bfloat16x4_t r = simde_vreinterpret_bf16_p64(a); + simde_bfloat16x4_private r_ = simde_bfloat16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_poly64x1_t a = simde_test_arm_neon_random_p64x1(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_p64x1(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_bf16_p8 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + simde_poly8_t a[16]; + } test_vec[] = { + { { SIMDE_POLY8_C(193), SIMDE_POLY8_C(249), SIMDE_POLY8_C(215), SIMDE_POLY8_C(129), SIMDE_POLY8_C( 25), SIMDE_POLY8_C(121), SIMDE_POLY8_C(148), SIMDE_POLY8_C( 9), + SIMDE_POLY8_C(196), SIMDE_POLY8_C( 42), SIMDE_POLY8_C( 50), SIMDE_POLY8_C(174), SIMDE_POLY8_C( 21), SIMDE_POLY8_C(129), SIMDE_POLY8_C( 81), SIMDE_POLY8_C( 84) } }, + { { SIMDE_POLY8_C(145), SIMDE_POLY8_C( 70), SIMDE_POLY8_C(237), SIMDE_POLY8_C(143), SIMDE_POLY8_C(107), SIMDE_POLY8_C(100), SIMDE_POLY8_C( 54), SIMDE_POLY8_C(171), + SIMDE_POLY8_C( 27), SIMDE_POLY8_C(144), SIMDE_POLY8_C( 23), SIMDE_POLY8_C( 45), SIMDE_POLY8_C(186), SIMDE_POLY8_C(238), SIMDE_POLY8_C(202), SIMDE_POLY8_C(123) } }, + { { SIMDE_POLY8_C(232), SIMDE_POLY8_C(161), SIMDE_POLY8_C(253), SIMDE_POLY8_C( 1), SIMDE_POLY8_C( 26), SIMDE_POLY8_C(145), SIMDE_POLY8_C( 10), SIMDE_POLY8_C(222), + SIMDE_POLY8_C(187), SIMDE_POLY8_C( 60), SIMDE_POLY8_C(141), SIMDE_POLY8_C(208), SIMDE_POLY8_C(190), SIMDE_POLY8_C(222), SIMDE_POLY8_C( 36), SIMDE_POLY8_C( 79) } }, + { { SIMDE_POLY8_C( 36), SIMDE_POLY8_C( 18), SIMDE_POLY8_C(222), SIMDE_POLY8_C(144), SIMDE_POLY8_C(118), SIMDE_POLY8_C( 21), SIMDE_POLY8_C( 59), SIMDE_POLY8_C(145), + SIMDE_POLY8_C(165), SIMDE_POLY8_C( 83), SIMDE_POLY8_C(190), SIMDE_POLY8_C( 95), SIMDE_POLY8_C( 65), SIMDE_POLY8_C(136), SIMDE_POLY8_C(219), SIMDE_POLY8_C( 41) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_poly8x16_t a = simde_vld1q_p8(test_vec[i].a); + simde_poly8x16_private a_ = simde_poly8x16_to_private(a); + simde_bfloat16x8_t r = simde_vreinterpretq_bf16_p8(a); + simde_bfloat16x8_private r_ = simde_bfloat16x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_poly8x16_t a = simde_test_arm_neon_random_p8x16(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_p8x16(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_bf16_p16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + simde_poly16_t a[8]; + } test_vec[] = { + { { SIMDE_POLY16_C( 572), SIMDE_POLY16_C(30216), SIMDE_POLY16_C(59273), SIMDE_POLY16_C(22462), SIMDE_POLY16_C(13522), SIMDE_POLY16_C(59565), SIMDE_POLY16_C(17100), SIMDE_POLY16_C(10467) } }, + { { SIMDE_POLY16_C( 3921), SIMDE_POLY16_C( 681), SIMDE_POLY16_C(38730), SIMDE_POLY16_C(53192), SIMDE_POLY16_C(48358), SIMDE_POLY16_C(44569), SIMDE_POLY16_C(34768), SIMDE_POLY16_C( 3281) } }, + { { SIMDE_POLY16_C(55689), SIMDE_POLY16_C( 4995), SIMDE_POLY16_C(16832), SIMDE_POLY16_C(37482), SIMDE_POLY16_C( 6006), SIMDE_POLY16_C(17019), SIMDE_POLY16_C(24153), SIMDE_POLY16_C(43627) } }, + { { SIMDE_POLY16_C( 5229), SIMDE_POLY16_C(47277), SIMDE_POLY16_C(30124), SIMDE_POLY16_C(37511), SIMDE_POLY16_C(41010), SIMDE_POLY16_C( 576), SIMDE_POLY16_C( 4391), SIMDE_POLY16_C(45326) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_poly16x8_t a = simde_vld1q_p16(test_vec[i].a); + simde_poly16x8_private a_ = simde_poly16x8_to_private(a); + simde_bfloat16x8_t r = simde_vreinterpretq_bf16_p16(a); + simde_bfloat16x8_private r_ = simde_bfloat16x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_poly16x8_t a = simde_test_arm_neon_random_p16x8(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_p16x8(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_bf16_p64 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + simde_poly64_t a[2]; + } test_vec[] = { + { { SIMDE_POLY64_C(14356834236249269357), SIMDE_POLY64_C( 8898177028376904860) } }, + { { SIMDE_POLY64_C(15147100063394539816), SIMDE_POLY64_C( 6014547296417606131) } }, + { { SIMDE_POLY64_C(10974884149388723418), SIMDE_POLY64_C( 1457743428534419682) } }, + { { SIMDE_POLY64_C( 7686951286865078426), SIMDE_POLY64_C( 4587813852950392434) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_poly64x2_t a = simde_vld1q_p64(test_vec[i].a); + simde_poly64x2_private a_ = simde_poly64x2_to_private(a); + simde_bfloat16x8_t r = simde_vreinterpretq_bf16_p64(a); + simde_bfloat16x8_private r_ = simde_bfloat16x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_poly64x2_t a = simde_test_arm_neon_random_p64x2(); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_p64x2(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_p8_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 9.69), SIMDE_BFLOAT16_VALUE( 83.50), SIMDE_BFLOAT16_VALUE( -28.25), SIMDE_BFLOAT16_VALUE( -62.75) } }, + { { SIMDE_BFLOAT16_VALUE( 31.50), SIMDE_BFLOAT16_VALUE( -19.88), SIMDE_BFLOAT16_VALUE( -22.50), SIMDE_BFLOAT16_VALUE( -82.00) } }, + { { SIMDE_BFLOAT16_VALUE( 70.00), SIMDE_BFLOAT16_VALUE( -9.88), SIMDE_BFLOAT16_VALUE( -97.00), SIMDE_BFLOAT16_VALUE( -35.00) } }, + { { SIMDE_BFLOAT16_VALUE( -15.94), SIMDE_BFLOAT16_VALUE( 67.00), SIMDE_BFLOAT16_VALUE( 92.50), SIMDE_BFLOAT16_VALUE( 96.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a); + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_poly8x8_t r = simde_vreinterpret_p8_bf16(a); + simde_poly8x8_private r_ = simde_poly8x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_p16_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 9.69), SIMDE_BFLOAT16_VALUE( 83.50), SIMDE_BFLOAT16_VALUE( -28.25), SIMDE_BFLOAT16_VALUE( -62.75) } }, + { { SIMDE_BFLOAT16_VALUE( 31.50), SIMDE_BFLOAT16_VALUE( -19.88), SIMDE_BFLOAT16_VALUE( -22.50), SIMDE_BFLOAT16_VALUE( -82.00) } }, + { { SIMDE_BFLOAT16_VALUE( 70.00), SIMDE_BFLOAT16_VALUE( -9.88), SIMDE_BFLOAT16_VALUE( -97.00), SIMDE_BFLOAT16_VALUE( -35.00) } }, + { { SIMDE_BFLOAT16_VALUE( -15.94), SIMDE_BFLOAT16_VALUE( 67.00), SIMDE_BFLOAT16_VALUE( 92.50), SIMDE_BFLOAT16_VALUE( 96.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a); + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_poly16x4_t r = simde_vreinterpret_p16_bf16(a); + simde_poly16x4_private r_ = simde_poly16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpret_p64_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[4]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 9.69), SIMDE_BFLOAT16_VALUE( 83.50), SIMDE_BFLOAT16_VALUE( -28.25), SIMDE_BFLOAT16_VALUE( -62.75) } }, + { { SIMDE_BFLOAT16_VALUE( 31.50), SIMDE_BFLOAT16_VALUE( -19.88), SIMDE_BFLOAT16_VALUE( -22.50), SIMDE_BFLOAT16_VALUE( -82.00) } }, + { { SIMDE_BFLOAT16_VALUE( 70.00), SIMDE_BFLOAT16_VALUE( -9.88), SIMDE_BFLOAT16_VALUE( -97.00), SIMDE_BFLOAT16_VALUE( -35.00) } }, + { { SIMDE_BFLOAT16_VALUE( -15.94), SIMDE_BFLOAT16_VALUE( 67.00), SIMDE_BFLOAT16_VALUE( 92.50), SIMDE_BFLOAT16_VALUE( 96.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a); + simde_bfloat16x4_private a_ = simde_bfloat16x4_to_private(a); + simde_poly64x1_t r = simde_vreinterpret_p64_bf16(a); + simde_poly64x1_private r_ = simde_poly64x1_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_p8_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 80.00), SIMDE_BFLOAT16_VALUE( -44.00), SIMDE_BFLOAT16_VALUE( 33.25), SIMDE_BFLOAT16_VALUE( 29.12), + SIMDE_BFLOAT16_VALUE( -20.25), SIMDE_BFLOAT16_VALUE( 11.06), SIMDE_BFLOAT16_VALUE( 69.50), SIMDE_BFLOAT16_VALUE( 69.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.62), SIMDE_BFLOAT16_VALUE( -94.00), SIMDE_BFLOAT16_VALUE( -84.50), SIMDE_BFLOAT16_VALUE( -16.75), + SIMDE_BFLOAT16_VALUE( -35.25), SIMDE_BFLOAT16_VALUE( -58.75), SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -63.00) } }, + { { SIMDE_BFLOAT16_VALUE( 6.09), SIMDE_BFLOAT16_VALUE( -77.50), SIMDE_BFLOAT16_VALUE( -58.00), SIMDE_BFLOAT16_VALUE( -40.50), + SIMDE_BFLOAT16_VALUE( -99.50), SIMDE_BFLOAT16_VALUE( 26.50), SIMDE_BFLOAT16_VALUE( -49.00), SIMDE_BFLOAT16_VALUE( 55.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.00), SIMDE_BFLOAT16_VALUE( -36.25), SIMDE_BFLOAT16_VALUE( 58.00), SIMDE_BFLOAT16_VALUE( 71.00), + SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -0.30), SIMDE_BFLOAT16_VALUE( -49.75), SIMDE_BFLOAT16_VALUE( 30.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_poly8x16_t r = simde_vreinterpretq_p8_bf16(a); + simde_poly8x16_private r_ = simde_poly8x16_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_p16_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 80.00), SIMDE_BFLOAT16_VALUE( -44.00), SIMDE_BFLOAT16_VALUE( 33.25), SIMDE_BFLOAT16_VALUE( 29.12), + SIMDE_BFLOAT16_VALUE( -20.25), SIMDE_BFLOAT16_VALUE( 11.06), SIMDE_BFLOAT16_VALUE( 69.50), SIMDE_BFLOAT16_VALUE( 69.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.62), SIMDE_BFLOAT16_VALUE( -94.00), SIMDE_BFLOAT16_VALUE( -84.50), SIMDE_BFLOAT16_VALUE( -16.75), + SIMDE_BFLOAT16_VALUE( -35.25), SIMDE_BFLOAT16_VALUE( -58.75), SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -63.00) } }, + { { SIMDE_BFLOAT16_VALUE( 6.09), SIMDE_BFLOAT16_VALUE( -77.50), SIMDE_BFLOAT16_VALUE( -58.00), SIMDE_BFLOAT16_VALUE( -40.50), + SIMDE_BFLOAT16_VALUE( -99.50), SIMDE_BFLOAT16_VALUE( 26.50), SIMDE_BFLOAT16_VALUE( -49.00), SIMDE_BFLOAT16_VALUE( 55.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.00), SIMDE_BFLOAT16_VALUE( -36.25), SIMDE_BFLOAT16_VALUE( 58.00), SIMDE_BFLOAT16_VALUE( 71.00), + SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -0.30), SIMDE_BFLOAT16_VALUE( -49.75), SIMDE_BFLOAT16_VALUE( 30.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_poly16x8_t r = simde_vreinterpretq_p16_bf16(a); + simde_poly16x8_private r_ = simde_poly16x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vreinterpretq_p64_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16_t a[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 80.00), SIMDE_BFLOAT16_VALUE( -44.00), SIMDE_BFLOAT16_VALUE( 33.25), SIMDE_BFLOAT16_VALUE( 29.12), + SIMDE_BFLOAT16_VALUE( -20.25), SIMDE_BFLOAT16_VALUE( 11.06), SIMDE_BFLOAT16_VALUE( 69.50), SIMDE_BFLOAT16_VALUE( 69.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.62), SIMDE_BFLOAT16_VALUE( -94.00), SIMDE_BFLOAT16_VALUE( -84.50), SIMDE_BFLOAT16_VALUE( -16.75), + SIMDE_BFLOAT16_VALUE( -35.25), SIMDE_BFLOAT16_VALUE( -58.75), SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -63.00) } }, + { { SIMDE_BFLOAT16_VALUE( 6.09), SIMDE_BFLOAT16_VALUE( -77.50), SIMDE_BFLOAT16_VALUE( -58.00), SIMDE_BFLOAT16_VALUE( -40.50), + SIMDE_BFLOAT16_VALUE( -99.50), SIMDE_BFLOAT16_VALUE( 26.50), SIMDE_BFLOAT16_VALUE( -49.00), SIMDE_BFLOAT16_VALUE( 55.00) } }, + { { SIMDE_BFLOAT16_VALUE( -25.00), SIMDE_BFLOAT16_VALUE( -36.25), SIMDE_BFLOAT16_VALUE( 58.00), SIMDE_BFLOAT16_VALUE( 71.00), + SIMDE_BFLOAT16_VALUE( 50.50), SIMDE_BFLOAT16_VALUE( -0.30), SIMDE_BFLOAT16_VALUE( -49.75), SIMDE_BFLOAT16_VALUE( 30.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a); + simde_bfloat16x8_private a_ = simde_bfloat16x8_to_private(a); + simde_poly64x2_t r = simde_vreinterpretq_p64_bf16(a); + simde_poly64x2_private r_ = simde_poly64x2_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + fputs(" { ", SIMDE_CODEGEN_FP); + simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_f32_s8) SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_f64_s8) @@ -18800,7 +20699,66 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_u64_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_f64_p128) SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_p8_p128) SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_p16_p128) + SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_bf16_p128) + SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_p128_bf16) #endif /* !defined(SIMDE_TARGET_NOT_SUPPORT_INT128_TYPE) */ + +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_bf16_s8) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_bf16_s16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_bf16_s32) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_bf16_s64) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_bf16_u8) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_bf16_u16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_bf16_u32) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_bf16_u64) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_bf16_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_bf16_f64) + +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_bf16_s8) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_bf16_s16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_bf16_s32) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_bf16_s64) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_bf16_u8) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_bf16_u16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_bf16_u32) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_bf16_u64) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_bf16_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_bf16_f64) + +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_s8_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_s16_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_s32_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_s64_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_u8_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_u16_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_u32_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_u64_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_f32_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_f64_bf16) + +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_s8_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_s16_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_s32_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_s64_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_u8_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_u16_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_u32_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_u64_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_f32_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_f64_bf16) + +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_bf16_p8) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_bf16_p16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_bf16_p64) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_bf16_p8) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_bf16_p16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_bf16_p64) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_p8_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_p16_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_p64_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_p8_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_p16_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_p64_bf16) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/set_lane.c b/test/arm/neon/set_lane.c index 2d669afcc..c9d050f90 100644 --- a/test/arm/neon/set_lane.c +++ b/test/arm/neon/set_lane.c @@ -2096,6 +2096,124 @@ test_simde_vsetq_lane_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vset_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16 a; + simde_bfloat16 v[4]; + int lane; + simde_bfloat16 r[4]; + } test_vec[] = { + { SIMDE_BFLOAT16_VALUE( 45.50), + { SIMDE_BFLOAT16_VALUE( 63.75), SIMDE_BFLOAT16_VALUE( 46.25), SIMDE_BFLOAT16_VALUE( -35.75), SIMDE_BFLOAT16_VALUE( 58.75) }, + INT32_C( 1), + { SIMDE_BFLOAT16_VALUE( 63.75), SIMDE_BFLOAT16_VALUE( 45.50), SIMDE_BFLOAT16_VALUE( -35.75), SIMDE_BFLOAT16_VALUE( 58.75) } }, + { SIMDE_BFLOAT16_VALUE( -9.12), + { SIMDE_BFLOAT16_VALUE( -87.50), SIMDE_BFLOAT16_VALUE( 82.00), SIMDE_BFLOAT16_VALUE( 83.50), SIMDE_BFLOAT16_VALUE( -16.25) }, + INT32_C( 0), + { SIMDE_BFLOAT16_VALUE( -9.12), SIMDE_BFLOAT16_VALUE( 82.00), SIMDE_BFLOAT16_VALUE( 83.50), SIMDE_BFLOAT16_VALUE( -16.25) } }, + { SIMDE_BFLOAT16_VALUE( -62.75), + { SIMDE_BFLOAT16_VALUE( 52.25), SIMDE_BFLOAT16_VALUE( -45.75), SIMDE_BFLOAT16_VALUE( -13.56), SIMDE_BFLOAT16_VALUE( -91.50) }, + INT32_C( 1), + { SIMDE_BFLOAT16_VALUE( 52.25), SIMDE_BFLOAT16_VALUE( -62.75), SIMDE_BFLOAT16_VALUE( -13.56), SIMDE_BFLOAT16_VALUE( -91.50) } }, + { SIMDE_BFLOAT16_VALUE( 11.75), + { SIMDE_BFLOAT16_VALUE( 25.75), SIMDE_BFLOAT16_VALUE( 39.75), SIMDE_BFLOAT16_VALUE( 10.75), SIMDE_BFLOAT16_VALUE( 19.00) }, + INT32_C( 3), + { SIMDE_BFLOAT16_VALUE( 25.75), SIMDE_BFLOAT16_VALUE( 39.75), SIMDE_BFLOAT16_VALUE( 10.75), SIMDE_BFLOAT16_VALUE( 11.75) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16 a = test_vec[i].a; + simde_bfloat16x4_t v = simde_vld1_bf16(test_vec[i].v); + simde_bfloat16x4_t r; + SIMDE_CONSTIFY_4_(simde_vset_lane_bf16, r, (HEDLEY_UNREACHABLE(), v), test_vec[i].lane, a, v); + + simde_test_arm_neon_assert_equal_bf16x4(r, simde_vld1_bf16(test_vec[i].r), 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16_t a = simde_test_codegen_random_bf16(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_bfloat16x4_t v = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + int lane = simde_test_codegen_random_i8() & 3; + simde_bfloat16x4_t r; + SIMDE_CONSTIFY_4_(simde_vset_lane_bf16, r, (HEDLEY_UNREACHABLE(), v), lane, a, v); + + simde_test_codegen_write_bf16(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x4(2, v, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_codegen_write_i32(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x4(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vsetq_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16 a; + simde_bfloat16 v[8]; + int lane; + simde_bfloat16 r[8]; + } test_vec[] = { + { SIMDE_BFLOAT16_VALUE( 33.50), + { SIMDE_BFLOAT16_VALUE( 85.50), SIMDE_BFLOAT16_VALUE( -63.50), SIMDE_BFLOAT16_VALUE( 81.50), SIMDE_BFLOAT16_VALUE( -2.86), + SIMDE_BFLOAT16_VALUE( 77.00), SIMDE_BFLOAT16_VALUE( 33.00), SIMDE_BFLOAT16_VALUE( -84.50), SIMDE_BFLOAT16_VALUE( -81.00) }, + INT32_C( 5), + { SIMDE_BFLOAT16_VALUE( 85.50), SIMDE_BFLOAT16_VALUE( -63.50), SIMDE_BFLOAT16_VALUE( 81.50), SIMDE_BFLOAT16_VALUE( -2.86), + SIMDE_BFLOAT16_VALUE( 77.00), SIMDE_BFLOAT16_VALUE( 33.50), SIMDE_BFLOAT16_VALUE( -84.50), SIMDE_BFLOAT16_VALUE( -81.00) } }, + { SIMDE_BFLOAT16_VALUE( 10.12), + { SIMDE_BFLOAT16_VALUE( -52.75), SIMDE_BFLOAT16_VALUE( 49.00), SIMDE_BFLOAT16_VALUE( 2.70), SIMDE_BFLOAT16_VALUE( 59.25), + SIMDE_BFLOAT16_VALUE( -37.50), SIMDE_BFLOAT16_VALUE( -69.00), SIMDE_BFLOAT16_VALUE( -81.50), SIMDE_BFLOAT16_VALUE( 53.25) }, + INT32_C( 5), + { SIMDE_BFLOAT16_VALUE( -52.75), SIMDE_BFLOAT16_VALUE( 49.00), SIMDE_BFLOAT16_VALUE( 2.70), SIMDE_BFLOAT16_VALUE( 59.25), + SIMDE_BFLOAT16_VALUE( -37.50), SIMDE_BFLOAT16_VALUE( 10.12), SIMDE_BFLOAT16_VALUE( -81.50), SIMDE_BFLOAT16_VALUE( 53.25) } }, + { SIMDE_BFLOAT16_VALUE( 83.50), + { SIMDE_BFLOAT16_VALUE( 30.00), SIMDE_BFLOAT16_VALUE( 35.25), SIMDE_BFLOAT16_VALUE( 37.50), SIMDE_BFLOAT16_VALUE( -64.00), + SIMDE_BFLOAT16_VALUE( -48.25), SIMDE_BFLOAT16_VALUE( -37.50), SIMDE_BFLOAT16_VALUE( -89.00), SIMDE_BFLOAT16_VALUE( -71.00) }, + INT32_C( 6), + { SIMDE_BFLOAT16_VALUE( 30.00), SIMDE_BFLOAT16_VALUE( 35.25), SIMDE_BFLOAT16_VALUE( 37.50), SIMDE_BFLOAT16_VALUE( -64.00), + SIMDE_BFLOAT16_VALUE( -48.25), SIMDE_BFLOAT16_VALUE( -37.50), SIMDE_BFLOAT16_VALUE( 83.50), SIMDE_BFLOAT16_VALUE( -71.00) } }, + { SIMDE_BFLOAT16_VALUE( 11.06), + { SIMDE_BFLOAT16_VALUE( 62.75), SIMDE_BFLOAT16_VALUE( -93.00), SIMDE_BFLOAT16_VALUE( 47.75), SIMDE_BFLOAT16_VALUE( 44.00), + SIMDE_BFLOAT16_VALUE( 4.03), SIMDE_BFLOAT16_VALUE( 24.75), SIMDE_BFLOAT16_VALUE( -22.88), SIMDE_BFLOAT16_VALUE( 19.50) }, + INT32_C( 6), + { SIMDE_BFLOAT16_VALUE( 62.75), SIMDE_BFLOAT16_VALUE( -93.00), SIMDE_BFLOAT16_VALUE( 47.75), SIMDE_BFLOAT16_VALUE( 44.00), + SIMDE_BFLOAT16_VALUE( 4.03), SIMDE_BFLOAT16_VALUE( 24.75), SIMDE_BFLOAT16_VALUE( 11.06), SIMDE_BFLOAT16_VALUE( 19.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16 a = test_vec[i].a; + simde_bfloat16x8_t v = simde_vld1q_bf16(test_vec[i].v); + simde_bfloat16x8_t r; + SIMDE_CONSTIFY_8_(simde_vsetq_lane_bf16, r, (HEDLEY_UNREACHABLE(), v), test_vec[i].lane, a, v); + + simde_test_arm_neon_assert_equal_bf16x8(r, simde_vld1q_bf16(test_vec[i].r), 1); + } + + return 0; +#else + fputc('\n', stdout); + for (int i = 0 ; i < 4 ; i++) { + simde_bfloat16_t a = simde_test_codegen_random_bf16(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + simde_bfloat16x8_t v = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0)); + int lane = simde_test_codegen_random_i8() & 7; + simde_bfloat16x8_t r; + SIMDE_CONSTIFY_8_(simde_vsetq_lane_bf16, r, (HEDLEY_UNREACHABLE(), v), lane, a, v); + + simde_test_codegen_write_bf16(2, a, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x8(2, v, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_codegen_write_i32(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + HEDLEY_DIAGNOSTIC_POP SIMDE_TEST_FUNC_LIST_BEGIN @@ -2129,6 +2247,9 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vset_lane_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vsetq_lane_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vsetq_lane_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vsetq_lane_p64) + +SIMDE_TEST_FUNC_LIST_ENTRY(vset_lane_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vsetq_lane_bf16) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/st1_lane.c b/test/arm/neon/st1_lane.c index 1babe0637..a3dd42e40 100644 --- a/test/arm/neon/st1_lane.c +++ b/test/arm/neon/st1_lane.c @@ -1552,6 +1552,102 @@ test_simde_vst1q_lane_p64 (SIMDE_MUNIT_TEST_ARGS) { return 0; } +static int +test_simde_vst1_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16 a; + simde_bfloat16 val[4]; + int lane; + } test_vec[] = { + { SIMDE_BFLOAT16_VALUE( 85.175), + { SIMDE_BFLOAT16_VALUE( 1.091), SIMDE_BFLOAT16_VALUE( - 78.385), SIMDE_BFLOAT16_VALUE( 23.855), SIMDE_BFLOAT16_VALUE( 85.175) }, + INT8_C( 3) }, + { SIMDE_BFLOAT16_VALUE( - 64.034), + { SIMDE_BFLOAT16_VALUE( - 64.034), SIMDE_BFLOAT16_VALUE( - 51.901), SIMDE_BFLOAT16_VALUE( - 47.801), SIMDE_BFLOAT16_VALUE( - 74.037) }, + INT8_C( 0) }, + { SIMDE_BFLOAT16_VALUE( 99.952), + { SIMDE_BFLOAT16_VALUE( 31.399), SIMDE_BFLOAT16_VALUE( - 69.493), SIMDE_BFLOAT16_VALUE( 39.299), SIMDE_BFLOAT16_VALUE( 99.952) }, + INT8_C( 3) }, + { SIMDE_BFLOAT16_VALUE( - 55.804), + { SIMDE_BFLOAT16_VALUE( 31.333), SIMDE_BFLOAT16_VALUE( - 55.804), SIMDE_BFLOAT16_VALUE( - 16.597), SIMDE_BFLOAT16_VALUE( - 83.723) }, + INT8_C( 1) }, + { SIMDE_BFLOAT16_VALUE( - 89.293), + { SIMDE_BFLOAT16_VALUE( - 29.785), SIMDE_BFLOAT16_VALUE( - 89.293), SIMDE_BFLOAT16_VALUE( - 65.019), SIMDE_BFLOAT16_VALUE( - 74.124) }, + INT8_C( 1) }, + { SIMDE_BFLOAT16_VALUE( 81.242), + { SIMDE_BFLOAT16_VALUE( 26.817), SIMDE_BFLOAT16_VALUE( - 9.372), SIMDE_BFLOAT16_VALUE( 43.833), SIMDE_BFLOAT16_VALUE( 81.242) }, + INT8_C( 3) }, + { SIMDE_BFLOAT16_VALUE( - 59.960), + { SIMDE_BFLOAT16_VALUE( 5.886), SIMDE_BFLOAT16_VALUE( - 59.960), SIMDE_BFLOAT16_VALUE( - 88.952), SIMDE_BFLOAT16_VALUE( - 12.921) }, + INT8_C( 1) }, + { SIMDE_BFLOAT16_VALUE( - 86.830), + { SIMDE_BFLOAT16_VALUE( - 90.057), SIMDE_BFLOAT16_VALUE( 75.838), SIMDE_BFLOAT16_VALUE( - 86.830), SIMDE_BFLOAT16_VALUE( 59.157) }, + INT8_C( 2) }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4_t val = simde_vld1_bf16(test_vec[i].val); + simde_bfloat16 a; + SIMDE_CONSTIFY_4_NO_RESULT_(simde_vst1_lane_bf16, HEDLEY_UNREACHABLE(), test_vec[i].lane, &a, val); + + simde_assert_equal_bf16(a, test_vec[i].a, 1); + } + + return 0; +} + +static int +test_simde_vst1q_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16 a; + simde_bfloat16 val[8]; + int lane; + } test_vec[] = { + { SIMDE_BFLOAT16_VALUE( - 64.026), + { SIMDE_BFLOAT16_VALUE( 77.636), SIMDE_BFLOAT16_VALUE( - 64.026), SIMDE_BFLOAT16_VALUE( - 11.443), SIMDE_BFLOAT16_VALUE( - 39.884), + SIMDE_BFLOAT16_VALUE( - 87.713), SIMDE_BFLOAT16_VALUE( - 22.005), SIMDE_BFLOAT16_VALUE( 71.493), SIMDE_BFLOAT16_VALUE( 94.947) }, + INT8_C( 1) }, + { SIMDE_BFLOAT16_VALUE( 63.436), + { SIMDE_BFLOAT16_VALUE( 63.436), SIMDE_BFLOAT16_VALUE( - 60.792), SIMDE_BFLOAT16_VALUE( 3.439), SIMDE_BFLOAT16_VALUE( 69.299), + SIMDE_BFLOAT16_VALUE( 60.921), SIMDE_BFLOAT16_VALUE( - 17.081), SIMDE_BFLOAT16_VALUE( 12.053), SIMDE_BFLOAT16_VALUE( - 66.784) }, + INT8_C( 0) }, + { SIMDE_BFLOAT16_VALUE( 32.004), + { SIMDE_BFLOAT16_VALUE( 49.966), SIMDE_BFLOAT16_VALUE( 90.559), SIMDE_BFLOAT16_VALUE( - 6.561), SIMDE_BFLOAT16_VALUE( - 4.223), + SIMDE_BFLOAT16_VALUE( 32.004), SIMDE_BFLOAT16_VALUE( 31.066), SIMDE_BFLOAT16_VALUE( 60.932), SIMDE_BFLOAT16_VALUE( - 85.011) }, + INT8_C( 4) }, + { SIMDE_BFLOAT16_VALUE( - 56.576), + { SIMDE_BFLOAT16_VALUE( 18.785), SIMDE_BFLOAT16_VALUE( - 14.403), SIMDE_BFLOAT16_VALUE( 43.277), SIMDE_BFLOAT16_VALUE( 82.202), + SIMDE_BFLOAT16_VALUE( 72.540), SIMDE_BFLOAT16_VALUE( 14.761), SIMDE_BFLOAT16_VALUE( - 56.576), SIMDE_BFLOAT16_VALUE( - 71.628) }, + INT8_C( 6) }, + { SIMDE_BFLOAT16_VALUE( - 76.518), + { SIMDE_BFLOAT16_VALUE( 96.881), SIMDE_BFLOAT16_VALUE( - 76.518), SIMDE_BFLOAT16_VALUE( 80.572), SIMDE_BFLOAT16_VALUE( 23.751), + SIMDE_BFLOAT16_VALUE( - 89.697), SIMDE_BFLOAT16_VALUE( 42.687), SIMDE_BFLOAT16_VALUE( - 55.036), SIMDE_BFLOAT16_VALUE( 46.427) }, + INT8_C( 1) }, + { SIMDE_BFLOAT16_VALUE( - 91.933), + { SIMDE_BFLOAT16_VALUE( - 5.377), SIMDE_BFLOAT16_VALUE( 33.082), SIMDE_BFLOAT16_VALUE( 34.890), SIMDE_BFLOAT16_VALUE( - 91.933), + SIMDE_BFLOAT16_VALUE( 93.006), SIMDE_BFLOAT16_VALUE( - 95.231), SIMDE_BFLOAT16_VALUE( 89.548), SIMDE_BFLOAT16_VALUE( 25.629) }, + INT8_C( 3) }, + { SIMDE_BFLOAT16_VALUE( - 36.496), + { SIMDE_BFLOAT16_VALUE( - 23.493), SIMDE_BFLOAT16_VALUE( - 36.496), SIMDE_BFLOAT16_VALUE( 87.220), SIMDE_BFLOAT16_VALUE( 52.231), + SIMDE_BFLOAT16_VALUE( 16.211), SIMDE_BFLOAT16_VALUE( 42.745), SIMDE_BFLOAT16_VALUE( - 69.936), SIMDE_BFLOAT16_VALUE( - 27.078) }, + INT8_C( 1) }, + { SIMDE_BFLOAT16_VALUE( - 88.096), + { SIMDE_BFLOAT16_VALUE( - 89.050), SIMDE_BFLOAT16_VALUE( - 75.299), SIMDE_BFLOAT16_VALUE( - 44.416), SIMDE_BFLOAT16_VALUE( - 88.096), + SIMDE_BFLOAT16_VALUE( - 91.574), SIMDE_BFLOAT16_VALUE( - 27.581), SIMDE_BFLOAT16_VALUE( - 28.933), SIMDE_BFLOAT16_VALUE( - 97.993) }, + INT8_C( 3) }, + + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8_t val = simde_vld1q_bf16(test_vec[i].val); + simde_bfloat16 a; + SIMDE_CONSTIFY_8_NO_RESULT_(simde_vst1q_lane_bf16, HEDLEY_UNREACHABLE(), test_vec[i].lane, &a, val); + simde_assert_equal_bf16(a, test_vec[i].a, 1); + } + + return 0; +} + HEDLEY_DIAGNOSTIC_POP SIMDE_TEST_FUNC_LIST_BEGIN @@ -1585,6 +1681,9 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vst1_lane_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vst1q_lane_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vst1q_lane_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vst1q_lane_p64) + +SIMDE_TEST_FUNC_LIST_ENTRY(vst1_lane_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vst1q_lane_bf16) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/st1_x2.c b/test/arm/neon/st1_x2.c index 80cf49a75..9e7bb0ed1 100644 --- a/test/arm/neon/st1_x2.c +++ b/test/arm/neon/st1_x2.c @@ -953,6 +953,64 @@ test_simde_vst1_p64_x2 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vst1_bf16_x2 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16 val[2][4]; + simde_bfloat16 r[8]; + } test_vec[] = { + { { { SIMDE_BFLOAT16_VALUE( - 49.565), SIMDE_BFLOAT16_VALUE( - 3.779), SIMDE_BFLOAT16_VALUE( - 4.526), SIMDE_BFLOAT16_VALUE( 54.137) }, + { SIMDE_BFLOAT16_VALUE( 93.243), SIMDE_BFLOAT16_VALUE( 77.887), SIMDE_BFLOAT16_VALUE( 67.064), SIMDE_BFLOAT16_VALUE( - 88.528) } }, + { SIMDE_BFLOAT16_VALUE( - 49.565), SIMDE_BFLOAT16_VALUE( - 3.779), SIMDE_BFLOAT16_VALUE( - 4.526), SIMDE_BFLOAT16_VALUE( 54.137), SIMDE_BFLOAT16_VALUE( 93.243), SIMDE_BFLOAT16_VALUE( 77.887), SIMDE_BFLOAT16_VALUE( 67.064), SIMDE_BFLOAT16_VALUE( - 88.528) } }, + { { { SIMDE_BFLOAT16_VALUE( - 20.795), SIMDE_BFLOAT16_VALUE( 75.008), SIMDE_BFLOAT16_VALUE( - 10.786), SIMDE_BFLOAT16_VALUE( 61.695) }, + { SIMDE_BFLOAT16_VALUE( - 13.619), SIMDE_BFLOAT16_VALUE( 27.128), SIMDE_BFLOAT16_VALUE( - 26.152), SIMDE_BFLOAT16_VALUE( 86.900) } }, + { SIMDE_BFLOAT16_VALUE( - 20.795), SIMDE_BFLOAT16_VALUE( 75.008), SIMDE_BFLOAT16_VALUE( - 10.786), SIMDE_BFLOAT16_VALUE( 61.695), SIMDE_BFLOAT16_VALUE( - 13.619), SIMDE_BFLOAT16_VALUE( 27.128), SIMDE_BFLOAT16_VALUE( - 26.152), SIMDE_BFLOAT16_VALUE( 86.900) } }, + { { { SIMDE_BFLOAT16_VALUE( 2.070), SIMDE_BFLOAT16_VALUE( 76.065), SIMDE_BFLOAT16_VALUE( - 55.688), SIMDE_BFLOAT16_VALUE( 21.829) }, + { SIMDE_BFLOAT16_VALUE( - 92.596), SIMDE_BFLOAT16_VALUE( 28.101), SIMDE_BFLOAT16_VALUE( - 53.959), SIMDE_BFLOAT16_VALUE( - 93.775) } }, + { SIMDE_BFLOAT16_VALUE( 2.070), SIMDE_BFLOAT16_VALUE( 76.065), SIMDE_BFLOAT16_VALUE( - 55.688), SIMDE_BFLOAT16_VALUE( 21.829), SIMDE_BFLOAT16_VALUE( - 92.596), SIMDE_BFLOAT16_VALUE( 28.101), SIMDE_BFLOAT16_VALUE( - 53.959), SIMDE_BFLOAT16_VALUE( - 93.775) } }, + { { { SIMDE_BFLOAT16_VALUE( 35.951), SIMDE_BFLOAT16_VALUE( 62.015), SIMDE_BFLOAT16_VALUE( 90.532), SIMDE_BFLOAT16_VALUE( 31.925) }, + { SIMDE_BFLOAT16_VALUE( - 46.722), SIMDE_BFLOAT16_VALUE( - 97.917), SIMDE_BFLOAT16_VALUE( 38.448), SIMDE_BFLOAT16_VALUE( - 24.373) } }, + { SIMDE_BFLOAT16_VALUE( 35.951), SIMDE_BFLOAT16_VALUE( 62.015), SIMDE_BFLOAT16_VALUE( 90.532), SIMDE_BFLOAT16_VALUE( 31.925), SIMDE_BFLOAT16_VALUE( - 46.722), SIMDE_BFLOAT16_VALUE( - 97.917), SIMDE_BFLOAT16_VALUE( 38.448), SIMDE_BFLOAT16_VALUE( - 24.373) } }, + { { { SIMDE_BFLOAT16_VALUE( - 51.687), SIMDE_BFLOAT16_VALUE( 48.322), SIMDE_BFLOAT16_VALUE( 69.086), SIMDE_BFLOAT16_VALUE( - 54.351) }, + { SIMDE_BFLOAT16_VALUE( - 64.082), SIMDE_BFLOAT16_VALUE( - 98.147), SIMDE_BFLOAT16_VALUE( - 46.114), SIMDE_BFLOAT16_VALUE( - 18.794) } }, + { SIMDE_BFLOAT16_VALUE( - 51.687), SIMDE_BFLOAT16_VALUE( 48.322), SIMDE_BFLOAT16_VALUE( 69.086), SIMDE_BFLOAT16_VALUE( - 54.351), SIMDE_BFLOAT16_VALUE( - 64.082), SIMDE_BFLOAT16_VALUE( - 98.147), SIMDE_BFLOAT16_VALUE( - 46.114), SIMDE_BFLOAT16_VALUE( - 18.794) } }, + { { { SIMDE_BFLOAT16_VALUE( 68.290), SIMDE_BFLOAT16_VALUE( 85.741), SIMDE_BFLOAT16_VALUE( - 41.817), SIMDE_BFLOAT16_VALUE( - 53.220) }, + { SIMDE_BFLOAT16_VALUE( - 75.047), SIMDE_BFLOAT16_VALUE( 76.317), SIMDE_BFLOAT16_VALUE( - 59.770), SIMDE_BFLOAT16_VALUE( 34.185) } }, + { SIMDE_BFLOAT16_VALUE( 68.290), SIMDE_BFLOAT16_VALUE( 85.741), SIMDE_BFLOAT16_VALUE( - 41.817), SIMDE_BFLOAT16_VALUE( - 53.220), SIMDE_BFLOAT16_VALUE( - 75.047), SIMDE_BFLOAT16_VALUE( 76.317), SIMDE_BFLOAT16_VALUE( - 59.770), SIMDE_BFLOAT16_VALUE( 34.185) } }, + { { { SIMDE_BFLOAT16_VALUE( - 15.653), SIMDE_BFLOAT16_VALUE( - 73.326), SIMDE_BFLOAT16_VALUE( - 11.883), SIMDE_BFLOAT16_VALUE( - 37.580) }, + { SIMDE_BFLOAT16_VALUE( - 25.858), SIMDE_BFLOAT16_VALUE( - 61.674), SIMDE_BFLOAT16_VALUE( 40.814), SIMDE_BFLOAT16_VALUE( - 12.611) } }, + { SIMDE_BFLOAT16_VALUE( - 15.653), SIMDE_BFLOAT16_VALUE( - 73.326), SIMDE_BFLOAT16_VALUE( - 11.883), SIMDE_BFLOAT16_VALUE( - 37.580), SIMDE_BFLOAT16_VALUE( - 25.858), SIMDE_BFLOAT16_VALUE( - 61.674), SIMDE_BFLOAT16_VALUE( 40.814), SIMDE_BFLOAT16_VALUE( - 12.611) } }, + { { { SIMDE_BFLOAT16_VALUE( - 22.246), SIMDE_BFLOAT16_VALUE( - 57.414), SIMDE_BFLOAT16_VALUE( - 85.821), SIMDE_BFLOAT16_VALUE( 94.244) }, + { SIMDE_BFLOAT16_VALUE( - 24.985), SIMDE_BFLOAT16_VALUE( 26.320), SIMDE_BFLOAT16_VALUE( 45.671), SIMDE_BFLOAT16_VALUE( 30.999) } }, + { SIMDE_BFLOAT16_VALUE( - 22.246), SIMDE_BFLOAT16_VALUE( - 57.414), SIMDE_BFLOAT16_VALUE( - 85.821), SIMDE_BFLOAT16_VALUE( 94.244), SIMDE_BFLOAT16_VALUE( - 24.985), SIMDE_BFLOAT16_VALUE( 26.320), SIMDE_BFLOAT16_VALUE( 45.671), SIMDE_BFLOAT16_VALUE( 30.999) } }, + }; + + for (size_t i = 0; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + simde_bfloat16x4x2_t val = {{ + simde_vld1_bf16(test_vec[i].val[0]), + simde_vld1_bf16(test_vec[i].val[1]), + }}; + simde_bfloat16 r_[8]; + simde_vst1_bf16_x2(r_, val); + simde_assert_equal_i(0, simde_memcmp(r_, test_vec[i].r, sizeof(test_vec[i].r))); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_bfloat16x2_t val[2] = simde_test_arm_neon_random_bf16x2(-100.0f, 100.0f); + simde_bfloat16x8_t r = simde_vst1_bf16_x2(val[2]); + + simde_test_arm_neon_write_bf16x2(2, val[2], SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x8(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -971,6 +1029,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vst1_u64_x2) SIMDE_TEST_FUNC_LIST_ENTRY(vst1_p8_x2) SIMDE_TEST_FUNC_LIST_ENTRY(vst1_p16_x2) SIMDE_TEST_FUNC_LIST_ENTRY(vst1_p64_x2) +SIMDE_TEST_FUNC_LIST_ENTRY(vst1_bf16_x2) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/st1_x3.c b/test/arm/neon/st1_x3.c index 957c6dde7..f49285b8f 100644 --- a/test/arm/neon/st1_x3.c +++ b/test/arm/neon/st1_x3.c @@ -1225,6 +1225,89 @@ test_simde_vst1_p64_x3 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vst1_bf16_x3 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16 val[3][4]; + simde_bfloat16 r[12]; + } test_vec[] = { + { { { SIMDE_BFLOAT16_VALUE( 29.597), SIMDE_BFLOAT16_VALUE( - 97.375), SIMDE_BFLOAT16_VALUE( - 37.290), SIMDE_BFLOAT16_VALUE( 83.451) }, + { SIMDE_BFLOAT16_VALUE( 58.071), SIMDE_BFLOAT16_VALUE( 9.615), SIMDE_BFLOAT16_VALUE( - 92.703), SIMDE_BFLOAT16_VALUE( - 13.746) }, + { SIMDE_BFLOAT16_VALUE( 82.251), SIMDE_BFLOAT16_VALUE( 31.216), SIMDE_BFLOAT16_VALUE( 5.814), SIMDE_BFLOAT16_VALUE( 14.340) } }, + { SIMDE_BFLOAT16_VALUE( 29.597), SIMDE_BFLOAT16_VALUE( - 97.375), SIMDE_BFLOAT16_VALUE( - 37.290), SIMDE_BFLOAT16_VALUE( 83.451), + SIMDE_BFLOAT16_VALUE( 58.071), SIMDE_BFLOAT16_VALUE( 9.615), SIMDE_BFLOAT16_VALUE( - 92.703), SIMDE_BFLOAT16_VALUE( - 13.746), + SIMDE_BFLOAT16_VALUE( 82.251), SIMDE_BFLOAT16_VALUE( 31.216), SIMDE_BFLOAT16_VALUE( 5.814), SIMDE_BFLOAT16_VALUE( 14.340) } }, + { { { SIMDE_BFLOAT16_VALUE( - 61.888), SIMDE_BFLOAT16_VALUE( 47.875), SIMDE_BFLOAT16_VALUE( - 89.222), SIMDE_BFLOAT16_VALUE( 78.391) }, + { SIMDE_BFLOAT16_VALUE( 7.891), SIMDE_BFLOAT16_VALUE( - 86.814), SIMDE_BFLOAT16_VALUE( 7.232), SIMDE_BFLOAT16_VALUE( 87.625) }, + { SIMDE_BFLOAT16_VALUE( - 59.898), SIMDE_BFLOAT16_VALUE( 99.002), SIMDE_BFLOAT16_VALUE( 38.867), SIMDE_BFLOAT16_VALUE( - 11.673) } }, + { SIMDE_BFLOAT16_VALUE( - 61.888), SIMDE_BFLOAT16_VALUE( 47.875), SIMDE_BFLOAT16_VALUE( - 89.222), SIMDE_BFLOAT16_VALUE( 78.391), + SIMDE_BFLOAT16_VALUE( 7.891), SIMDE_BFLOAT16_VALUE( - 86.814), SIMDE_BFLOAT16_VALUE( 7.232), SIMDE_BFLOAT16_VALUE( 87.625), + SIMDE_BFLOAT16_VALUE( - 59.898), SIMDE_BFLOAT16_VALUE( 99.002), SIMDE_BFLOAT16_VALUE( 38.867), SIMDE_BFLOAT16_VALUE( - 11.673) } }, + { { { SIMDE_BFLOAT16_VALUE( - 30.571), SIMDE_BFLOAT16_VALUE( - 70.230), SIMDE_BFLOAT16_VALUE( 40.374), SIMDE_BFLOAT16_VALUE( - 20.532) }, + { SIMDE_BFLOAT16_VALUE( - 53.791), SIMDE_BFLOAT16_VALUE( - 27.304), SIMDE_BFLOAT16_VALUE( - 92.472), SIMDE_BFLOAT16_VALUE( 61.997) }, + { SIMDE_BFLOAT16_VALUE( - 84.356), SIMDE_BFLOAT16_VALUE( 57.986), SIMDE_BFLOAT16_VALUE( - 40.919), SIMDE_BFLOAT16_VALUE( 59.208) } }, + { SIMDE_BFLOAT16_VALUE( - 30.571), SIMDE_BFLOAT16_VALUE( - 70.230), SIMDE_BFLOAT16_VALUE( 40.374), SIMDE_BFLOAT16_VALUE( - 20.532), + SIMDE_BFLOAT16_VALUE( - 53.791), SIMDE_BFLOAT16_VALUE( - 27.304), SIMDE_BFLOAT16_VALUE( - 92.472), SIMDE_BFLOAT16_VALUE( 61.997), + SIMDE_BFLOAT16_VALUE( - 84.356), SIMDE_BFLOAT16_VALUE( 57.986), SIMDE_BFLOAT16_VALUE( - 40.919), SIMDE_BFLOAT16_VALUE( 59.208) } }, + { { { SIMDE_BFLOAT16_VALUE( 44.416), SIMDE_BFLOAT16_VALUE( - 23.810), SIMDE_BFLOAT16_VALUE( - 15.844), SIMDE_BFLOAT16_VALUE( - 72.400) }, + { SIMDE_BFLOAT16_VALUE( 39.332), SIMDE_BFLOAT16_VALUE( 94.084), SIMDE_BFLOAT16_VALUE( 69.027), SIMDE_BFLOAT16_VALUE( 27.132) }, + { SIMDE_BFLOAT16_VALUE( - 53.948), SIMDE_BFLOAT16_VALUE( - 6.196), SIMDE_BFLOAT16_VALUE( 93.667), SIMDE_BFLOAT16_VALUE( - 14.595) } }, + { SIMDE_BFLOAT16_VALUE( 44.416), SIMDE_BFLOAT16_VALUE( - 23.810), SIMDE_BFLOAT16_VALUE( - 15.844), SIMDE_BFLOAT16_VALUE( - 72.400), + SIMDE_BFLOAT16_VALUE( 39.332), SIMDE_BFLOAT16_VALUE( 94.084), SIMDE_BFLOAT16_VALUE( 69.027), SIMDE_BFLOAT16_VALUE( 27.132), + SIMDE_BFLOAT16_VALUE( - 53.948), SIMDE_BFLOAT16_VALUE( - 6.196), SIMDE_BFLOAT16_VALUE( 93.667), SIMDE_BFLOAT16_VALUE( - 14.595) } }, + { { { SIMDE_BFLOAT16_VALUE( - 82.639), SIMDE_BFLOAT16_VALUE( - 31.640), SIMDE_BFLOAT16_VALUE( 38.749), SIMDE_BFLOAT16_VALUE( - 86.594) }, + { SIMDE_BFLOAT16_VALUE( 49.953), SIMDE_BFLOAT16_VALUE( 35.426), SIMDE_BFLOAT16_VALUE( 78.108), SIMDE_BFLOAT16_VALUE( 30.009) }, + { SIMDE_BFLOAT16_VALUE( 15.917), SIMDE_BFLOAT16_VALUE( - 35.664), SIMDE_BFLOAT16_VALUE( - 94.160), SIMDE_BFLOAT16_VALUE( - 24.487) } }, + { SIMDE_BFLOAT16_VALUE( - 82.639), SIMDE_BFLOAT16_VALUE( - 31.640), SIMDE_BFLOAT16_VALUE( 38.749), SIMDE_BFLOAT16_VALUE( - 86.594), + SIMDE_BFLOAT16_VALUE( 49.953), SIMDE_BFLOAT16_VALUE( 35.426), SIMDE_BFLOAT16_VALUE( 78.108), SIMDE_BFLOAT16_VALUE( 30.009), + SIMDE_BFLOAT16_VALUE( 15.917), SIMDE_BFLOAT16_VALUE( - 35.664), SIMDE_BFLOAT16_VALUE( - 94.160), SIMDE_BFLOAT16_VALUE( - 24.487) } }, + { { { SIMDE_BFLOAT16_VALUE( - 53.177), SIMDE_BFLOAT16_VALUE( 32.005), SIMDE_BFLOAT16_VALUE( 86.184), SIMDE_BFLOAT16_VALUE( 76.077) }, + { SIMDE_BFLOAT16_VALUE( 6.572), SIMDE_BFLOAT16_VALUE( - 52.085), SIMDE_BFLOAT16_VALUE( 48.290), SIMDE_BFLOAT16_VALUE( 75.600) }, + { SIMDE_BFLOAT16_VALUE( 81.474), SIMDE_BFLOAT16_VALUE( - 76.981), SIMDE_BFLOAT16_VALUE( - 76.144), SIMDE_BFLOAT16_VALUE( 91.779) } }, + { SIMDE_BFLOAT16_VALUE( - 53.177), SIMDE_BFLOAT16_VALUE( 32.005), SIMDE_BFLOAT16_VALUE( 86.184), SIMDE_BFLOAT16_VALUE( 76.077), + SIMDE_BFLOAT16_VALUE( 6.572), SIMDE_BFLOAT16_VALUE( - 52.085), SIMDE_BFLOAT16_VALUE( 48.290), SIMDE_BFLOAT16_VALUE( 75.600), + SIMDE_BFLOAT16_VALUE( 81.474), SIMDE_BFLOAT16_VALUE( - 76.981), SIMDE_BFLOAT16_VALUE( - 76.144), SIMDE_BFLOAT16_VALUE( 91.779) } }, + { { { SIMDE_BFLOAT16_VALUE( 52.159), SIMDE_BFLOAT16_VALUE( 24.957), SIMDE_BFLOAT16_VALUE( 64.016), SIMDE_BFLOAT16_VALUE( 36.756) }, + { SIMDE_BFLOAT16_VALUE( 65.380), SIMDE_BFLOAT16_VALUE( - 22.729), SIMDE_BFLOAT16_VALUE( 0.877), SIMDE_BFLOAT16_VALUE( 71.132) }, + { SIMDE_BFLOAT16_VALUE( 84.184), SIMDE_BFLOAT16_VALUE( 1.688), SIMDE_BFLOAT16_VALUE( 13.012), SIMDE_BFLOAT16_VALUE( - 96.029) } }, + { SIMDE_BFLOAT16_VALUE( 52.159), SIMDE_BFLOAT16_VALUE( 24.957), SIMDE_BFLOAT16_VALUE( 64.016), SIMDE_BFLOAT16_VALUE( 36.756), + SIMDE_BFLOAT16_VALUE( 65.380), SIMDE_BFLOAT16_VALUE( - 22.729), SIMDE_BFLOAT16_VALUE( 0.877), SIMDE_BFLOAT16_VALUE( 71.132), + SIMDE_BFLOAT16_VALUE( 84.184), SIMDE_BFLOAT16_VALUE( 1.688), SIMDE_BFLOAT16_VALUE( 13.012), SIMDE_BFLOAT16_VALUE( - 96.029) } }, + { { { SIMDE_BFLOAT16_VALUE( - 42.841), SIMDE_BFLOAT16_VALUE( - 57.189), SIMDE_BFLOAT16_VALUE( 82.362), SIMDE_BFLOAT16_VALUE( - 76.770) }, + { SIMDE_BFLOAT16_VALUE( 44.180), SIMDE_BFLOAT16_VALUE( 81.552), SIMDE_BFLOAT16_VALUE( 36.064), SIMDE_BFLOAT16_VALUE( 37.831) }, + { SIMDE_BFLOAT16_VALUE( - 86.197), SIMDE_BFLOAT16_VALUE( 7.055), SIMDE_BFLOAT16_VALUE( - 65.114), SIMDE_BFLOAT16_VALUE( - 27.135) } }, + { SIMDE_BFLOAT16_VALUE( - 42.841), SIMDE_BFLOAT16_VALUE( - 57.189), SIMDE_BFLOAT16_VALUE( 82.362), SIMDE_BFLOAT16_VALUE( - 76.770), + SIMDE_BFLOAT16_VALUE( 44.180), SIMDE_BFLOAT16_VALUE( 81.552), SIMDE_BFLOAT16_VALUE( 36.064), SIMDE_BFLOAT16_VALUE( 37.831), + SIMDE_BFLOAT16_VALUE( - 86.197), SIMDE_BFLOAT16_VALUE( 7.055), SIMDE_BFLOAT16_VALUE( - 65.114), SIMDE_BFLOAT16_VALUE( - 27.135) } }, + }; + + for (size_t i = 0; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + simde_bfloat16x4x3_t val = {{ + simde_vld1_bf16(test_vec[i].val[0]), + simde_vld1_bf16(test_vec[i].val[1]), + simde_vld1_bf16(test_vec[i].val[2]), + }}; + simde_bfloat16 r_[12]; + simde_vst1_bf16_x3(r_, val); + simde_assert_equal_i(0, simde_memcmp(r_, test_vec[i].r, sizeof(test_vec[i].r))); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_bfloat16x3_t val[3] = simde_test_arm_neon_random_bf16x3(-100.0f, 100.0f); + simde_bfloat16x12_t r = simde_vst1_bf16_x3(val[3]); + + simde_test_arm_neon_write_bf16x3(2, val[3], SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x12(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -1243,6 +1326,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vst1_u64_x3) SIMDE_TEST_FUNC_LIST_ENTRY(vst1_p8_x3) SIMDE_TEST_FUNC_LIST_ENTRY(vst1_p16_x3) SIMDE_TEST_FUNC_LIST_ENTRY(vst1_p64_x3) +SIMDE_TEST_FUNC_LIST_ENTRY(vst1_bf16_x3) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/st1_x4.c b/test/arm/neon/st1_x4.c index ada02c5ca..f580e0928 100644 --- a/test/arm/neon/st1_x4.c +++ b/test/arm/neon/st1_x4.c @@ -1417,6 +1417,106 @@ test_simde_vst1_p64_x4 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vst1_bf16_x4 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16 val[4][4]; + simde_bfloat16 r[16]; + } test_vec[] = { + { { { SIMDE_BFLOAT16_VALUE( 82.328), SIMDE_BFLOAT16_VALUE( 70.920), SIMDE_BFLOAT16_VALUE( - 2.164), SIMDE_BFLOAT16_VALUE( 20.248) }, + { SIMDE_BFLOAT16_VALUE( 17.827), SIMDE_BFLOAT16_VALUE( - 14.465), SIMDE_BFLOAT16_VALUE( - 88.806), SIMDE_BFLOAT16_VALUE( 79.077) }, + { SIMDE_BFLOAT16_VALUE( 1.568), SIMDE_BFLOAT16_VALUE( - 20.954), SIMDE_BFLOAT16_VALUE( - 34.479), SIMDE_BFLOAT16_VALUE( - 40.339) }, + { SIMDE_BFLOAT16_VALUE( 35.388), SIMDE_BFLOAT16_VALUE( 7.745), SIMDE_BFLOAT16_VALUE( 48.873), SIMDE_BFLOAT16_VALUE( - 89.095) } }, + { SIMDE_BFLOAT16_VALUE( 82.328), SIMDE_BFLOAT16_VALUE( 70.920), SIMDE_BFLOAT16_VALUE( - 2.164), SIMDE_BFLOAT16_VALUE( 20.248), + SIMDE_BFLOAT16_VALUE( 17.827), SIMDE_BFLOAT16_VALUE( - 14.465), SIMDE_BFLOAT16_VALUE( - 88.806), SIMDE_BFLOAT16_VALUE( 79.077), + SIMDE_BFLOAT16_VALUE( 1.568), SIMDE_BFLOAT16_VALUE( - 20.954), SIMDE_BFLOAT16_VALUE( - 34.479), SIMDE_BFLOAT16_VALUE( - 40.339), + SIMDE_BFLOAT16_VALUE( 35.388), SIMDE_BFLOAT16_VALUE( 7.745), SIMDE_BFLOAT16_VALUE( 48.873), SIMDE_BFLOAT16_VALUE( - 89.095) } }, + { { { SIMDE_BFLOAT16_VALUE( - 85.226), SIMDE_BFLOAT16_VALUE( 68.050), SIMDE_BFLOAT16_VALUE( - 79.246), SIMDE_BFLOAT16_VALUE( - 6.999) }, + { SIMDE_BFLOAT16_VALUE( - 57.697), SIMDE_BFLOAT16_VALUE( - 37.357), SIMDE_BFLOAT16_VALUE( - 77.997), SIMDE_BFLOAT16_VALUE( - 49.541) }, + { SIMDE_BFLOAT16_VALUE( - 97.845), SIMDE_BFLOAT16_VALUE( - 58.594), SIMDE_BFLOAT16_VALUE( 49.242), SIMDE_BFLOAT16_VALUE( 38.316) }, + { SIMDE_BFLOAT16_VALUE( - 4.874), SIMDE_BFLOAT16_VALUE( 31.136), SIMDE_BFLOAT16_VALUE( 51.676), SIMDE_BFLOAT16_VALUE( - 89.351) } }, + { SIMDE_BFLOAT16_VALUE( - 85.226), SIMDE_BFLOAT16_VALUE( 68.050), SIMDE_BFLOAT16_VALUE( - 79.246), SIMDE_BFLOAT16_VALUE( - 6.999), + SIMDE_BFLOAT16_VALUE( - 57.697), SIMDE_BFLOAT16_VALUE( - 37.357), SIMDE_BFLOAT16_VALUE( - 77.997), SIMDE_BFLOAT16_VALUE( - 49.541), + SIMDE_BFLOAT16_VALUE( - 97.845), SIMDE_BFLOAT16_VALUE( - 58.594), SIMDE_BFLOAT16_VALUE( 49.242), SIMDE_BFLOAT16_VALUE( 38.316), + SIMDE_BFLOAT16_VALUE( - 4.874), SIMDE_BFLOAT16_VALUE( 31.136), SIMDE_BFLOAT16_VALUE( 51.676), SIMDE_BFLOAT16_VALUE( - 89.351) } }, + { { { SIMDE_BFLOAT16_VALUE( - 30.265), SIMDE_BFLOAT16_VALUE( - 14.175), SIMDE_BFLOAT16_VALUE( 36.709), SIMDE_BFLOAT16_VALUE( 19.621) }, + { SIMDE_BFLOAT16_VALUE( 43.887), SIMDE_BFLOAT16_VALUE( - 72.313), SIMDE_BFLOAT16_VALUE( 75.465), SIMDE_BFLOAT16_VALUE( - 60.500) }, + { SIMDE_BFLOAT16_VALUE( - 4.007), SIMDE_BFLOAT16_VALUE( 97.670), SIMDE_BFLOAT16_VALUE( - 48.236), SIMDE_BFLOAT16_VALUE( 41.558) }, + { SIMDE_BFLOAT16_VALUE( - 87.828), SIMDE_BFLOAT16_VALUE( 55.865), SIMDE_BFLOAT16_VALUE( 40.049), SIMDE_BFLOAT16_VALUE( - 99.926) } }, + { SIMDE_BFLOAT16_VALUE( - 30.265), SIMDE_BFLOAT16_VALUE( - 14.175), SIMDE_BFLOAT16_VALUE( 36.709), SIMDE_BFLOAT16_VALUE( 19.621), + SIMDE_BFLOAT16_VALUE( 43.887), SIMDE_BFLOAT16_VALUE( - 72.313), SIMDE_BFLOAT16_VALUE( 75.465), SIMDE_BFLOAT16_VALUE( - 60.500), + SIMDE_BFLOAT16_VALUE( - 4.007), SIMDE_BFLOAT16_VALUE( 97.670), SIMDE_BFLOAT16_VALUE( - 48.236), SIMDE_BFLOAT16_VALUE( 41.558), + SIMDE_BFLOAT16_VALUE( - 87.828), SIMDE_BFLOAT16_VALUE( 55.865), SIMDE_BFLOAT16_VALUE( 40.049), SIMDE_BFLOAT16_VALUE( - 99.926) } }, + { { { SIMDE_BFLOAT16_VALUE( - 44.272), SIMDE_BFLOAT16_VALUE( 10.085), SIMDE_BFLOAT16_VALUE( - 12.450), SIMDE_BFLOAT16_VALUE( 58.234) }, + { SIMDE_BFLOAT16_VALUE( - 92.323), SIMDE_BFLOAT16_VALUE( - 72.811), SIMDE_BFLOAT16_VALUE( - 75.942), SIMDE_BFLOAT16_VALUE( - 33.709) }, + { SIMDE_BFLOAT16_VALUE( - 54.556), SIMDE_BFLOAT16_VALUE( - 96.713), SIMDE_BFLOAT16_VALUE( - 44.482), SIMDE_BFLOAT16_VALUE( 86.965) }, + { SIMDE_BFLOAT16_VALUE( 91.324), SIMDE_BFLOAT16_VALUE( - 40.202), SIMDE_BFLOAT16_VALUE( - 14.814), SIMDE_BFLOAT16_VALUE( 88.549) } }, + { SIMDE_BFLOAT16_VALUE( - 44.272), SIMDE_BFLOAT16_VALUE( 10.085), SIMDE_BFLOAT16_VALUE( - 12.450), SIMDE_BFLOAT16_VALUE( 58.234), + SIMDE_BFLOAT16_VALUE( - 92.323), SIMDE_BFLOAT16_VALUE( - 72.811), SIMDE_BFLOAT16_VALUE( - 75.942), SIMDE_BFLOAT16_VALUE( - 33.709), + SIMDE_BFLOAT16_VALUE( - 54.556), SIMDE_BFLOAT16_VALUE( - 96.713), SIMDE_BFLOAT16_VALUE( - 44.482), SIMDE_BFLOAT16_VALUE( 86.965), + SIMDE_BFLOAT16_VALUE( 91.324), SIMDE_BFLOAT16_VALUE( - 40.202), SIMDE_BFLOAT16_VALUE( - 14.814), SIMDE_BFLOAT16_VALUE( 88.549) } }, + { { { SIMDE_BFLOAT16_VALUE( 2.562), SIMDE_BFLOAT16_VALUE( - 38.287), SIMDE_BFLOAT16_VALUE( - 35.816), SIMDE_BFLOAT16_VALUE( 15.466) }, + { SIMDE_BFLOAT16_VALUE( 18.376), SIMDE_BFLOAT16_VALUE( - 90.001), SIMDE_BFLOAT16_VALUE( 64.324), SIMDE_BFLOAT16_VALUE( - 33.166) }, + { SIMDE_BFLOAT16_VALUE( - 69.347), SIMDE_BFLOAT16_VALUE( 26.212), SIMDE_BFLOAT16_VALUE( - 90.466), SIMDE_BFLOAT16_VALUE( - 27.484) }, + { SIMDE_BFLOAT16_VALUE( - 55.925), SIMDE_BFLOAT16_VALUE( - 34.864), SIMDE_BFLOAT16_VALUE( - 97.656), SIMDE_BFLOAT16_VALUE( - 7.985) } }, + { SIMDE_BFLOAT16_VALUE( 2.562), SIMDE_BFLOAT16_VALUE( - 38.287), SIMDE_BFLOAT16_VALUE( - 35.816), SIMDE_BFLOAT16_VALUE( 15.466), + SIMDE_BFLOAT16_VALUE( 18.376), SIMDE_BFLOAT16_VALUE( - 90.001), SIMDE_BFLOAT16_VALUE( 64.324), SIMDE_BFLOAT16_VALUE( - 33.166), + SIMDE_BFLOAT16_VALUE( - 69.347), SIMDE_BFLOAT16_VALUE( 26.212), SIMDE_BFLOAT16_VALUE( - 90.466), SIMDE_BFLOAT16_VALUE( - 27.484), + SIMDE_BFLOAT16_VALUE( - 55.925), SIMDE_BFLOAT16_VALUE( - 34.864), SIMDE_BFLOAT16_VALUE( - 97.656), SIMDE_BFLOAT16_VALUE( - 7.985) } }, + { { { SIMDE_BFLOAT16_VALUE( 52.345), SIMDE_BFLOAT16_VALUE( - 67.483), SIMDE_BFLOAT16_VALUE( 35.701), SIMDE_BFLOAT16_VALUE( 91.753) }, + { SIMDE_BFLOAT16_VALUE( 19.358), SIMDE_BFLOAT16_VALUE( - 88.690), SIMDE_BFLOAT16_VALUE( 47.635), SIMDE_BFLOAT16_VALUE( 8.845) }, + { SIMDE_BFLOAT16_VALUE( - 20.974), SIMDE_BFLOAT16_VALUE( 4.303), SIMDE_BFLOAT16_VALUE( - 69.975), SIMDE_BFLOAT16_VALUE( - 29.454) }, + { SIMDE_BFLOAT16_VALUE( 18.539), SIMDE_BFLOAT16_VALUE( 11.611), SIMDE_BFLOAT16_VALUE( - 30.865), SIMDE_BFLOAT16_VALUE( 45.777) } }, + { SIMDE_BFLOAT16_VALUE( 52.345), SIMDE_BFLOAT16_VALUE( - 67.483), SIMDE_BFLOAT16_VALUE( 35.701), SIMDE_BFLOAT16_VALUE( 91.753), + SIMDE_BFLOAT16_VALUE( 19.358), SIMDE_BFLOAT16_VALUE( - 88.690), SIMDE_BFLOAT16_VALUE( 47.635), SIMDE_BFLOAT16_VALUE( 8.845), + SIMDE_BFLOAT16_VALUE( - 20.974), SIMDE_BFLOAT16_VALUE( 4.303), SIMDE_BFLOAT16_VALUE( - 69.975), SIMDE_BFLOAT16_VALUE( - 29.454), + SIMDE_BFLOAT16_VALUE( 18.539), SIMDE_BFLOAT16_VALUE( 11.611), SIMDE_BFLOAT16_VALUE( - 30.865), SIMDE_BFLOAT16_VALUE( 45.777) } }, + { { { SIMDE_BFLOAT16_VALUE( - 6.544), SIMDE_BFLOAT16_VALUE( 72.545), SIMDE_BFLOAT16_VALUE( - 38.100), SIMDE_BFLOAT16_VALUE( 66.147) }, + { SIMDE_BFLOAT16_VALUE( - 39.990), SIMDE_BFLOAT16_VALUE( 59.395), SIMDE_BFLOAT16_VALUE( 58.133), SIMDE_BFLOAT16_VALUE( 62.227) }, + { SIMDE_BFLOAT16_VALUE( 17.801), SIMDE_BFLOAT16_VALUE( 50.002), SIMDE_BFLOAT16_VALUE( 92.224), SIMDE_BFLOAT16_VALUE( - 44.924) }, + { SIMDE_BFLOAT16_VALUE( 11.046), SIMDE_BFLOAT16_VALUE( 54.927), SIMDE_BFLOAT16_VALUE( - 65.414), SIMDE_BFLOAT16_VALUE( - 73.599) } }, + { SIMDE_BFLOAT16_VALUE( - 6.544), SIMDE_BFLOAT16_VALUE( 72.545), SIMDE_BFLOAT16_VALUE( - 38.100), SIMDE_BFLOAT16_VALUE( 66.147), + SIMDE_BFLOAT16_VALUE( - 39.990), SIMDE_BFLOAT16_VALUE( 59.395), SIMDE_BFLOAT16_VALUE( 58.133), SIMDE_BFLOAT16_VALUE( 62.227), + SIMDE_BFLOAT16_VALUE( 17.801), SIMDE_BFLOAT16_VALUE( 50.002), SIMDE_BFLOAT16_VALUE( 92.224), SIMDE_BFLOAT16_VALUE( - 44.924), + SIMDE_BFLOAT16_VALUE( 11.046), SIMDE_BFLOAT16_VALUE( 54.927), SIMDE_BFLOAT16_VALUE( - 65.414), SIMDE_BFLOAT16_VALUE( - 73.599) } }, + { { { SIMDE_BFLOAT16_VALUE( - 96.039), SIMDE_BFLOAT16_VALUE( 20.111), SIMDE_BFLOAT16_VALUE( - 49.906), SIMDE_BFLOAT16_VALUE( - 73.928) }, + { SIMDE_BFLOAT16_VALUE( 70.164), SIMDE_BFLOAT16_VALUE( 52.349), SIMDE_BFLOAT16_VALUE( 46.465), SIMDE_BFLOAT16_VALUE( 59.387) }, + { SIMDE_BFLOAT16_VALUE( - 74.522), SIMDE_BFLOAT16_VALUE( - 64.090), SIMDE_BFLOAT16_VALUE( - 64.099), SIMDE_BFLOAT16_VALUE( 19.591) }, + { SIMDE_BFLOAT16_VALUE( 39.551), SIMDE_BFLOAT16_VALUE( - 75.560), SIMDE_BFLOAT16_VALUE( - 12.722), SIMDE_BFLOAT16_VALUE( - 45.531) } }, + { SIMDE_BFLOAT16_VALUE( - 96.039), SIMDE_BFLOAT16_VALUE( 20.111), SIMDE_BFLOAT16_VALUE( - 49.906), SIMDE_BFLOAT16_VALUE( - 73.928), + SIMDE_BFLOAT16_VALUE( 70.164), SIMDE_BFLOAT16_VALUE( 52.349), SIMDE_BFLOAT16_VALUE( 46.465), SIMDE_BFLOAT16_VALUE( 59.387), + SIMDE_BFLOAT16_VALUE( - 74.522), SIMDE_BFLOAT16_VALUE( - 64.090), SIMDE_BFLOAT16_VALUE( - 64.099), SIMDE_BFLOAT16_VALUE( 19.591), + SIMDE_BFLOAT16_VALUE( 39.551), SIMDE_BFLOAT16_VALUE( - 75.560), SIMDE_BFLOAT16_VALUE( - 12.722), SIMDE_BFLOAT16_VALUE( - 45.531) } }, + }; + + for (size_t i = 0; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + simde_bfloat16x4x4_t val = {{ + simde_vld1_bf16(test_vec[i].val[0]), + simde_vld1_bf16(test_vec[i].val[1]), + simde_vld1_bf16(test_vec[i].val[2]), + simde_vld1_bf16(test_vec[i].val[3]), + }}; + simde_bfloat16 r_[16]; + simde_vst1_bf16_x4(r_, val); + simde_assert_equal_i(0, simde_memcmp(r_, test_vec[i].r, sizeof(test_vec[i].r))); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_bfloat16x4_t val[4] = simde_test_arm_neon_random_bf16x4(-100.0f, 100.0f); + simde_bfloat16x16_t r = simde_vst1_bf16_x4(val[4]); + + simde_test_arm_neon_write_bf16x4(2, val[4], SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x16(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -1435,6 +1535,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vst1_u64_x4) SIMDE_TEST_FUNC_LIST_ENTRY(vst1_p8_x4) SIMDE_TEST_FUNC_LIST_ENTRY(vst1_p16_x4) SIMDE_TEST_FUNC_LIST_ENTRY(vst1_p64_x4) +SIMDE_TEST_FUNC_LIST_ENTRY(vst1_bf16_x4) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/st1q_x2.c b/test/arm/neon/st1q_x2.c index fd34a1e52..2be9b772e 100644 --- a/test/arm/neon/st1q_x2.c +++ b/test/arm/neon/st1q_x2.c @@ -1225,6 +1225,104 @@ test_simde_vst1q_p64_x2 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vst1q_bf16_x2 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16 val[2][8]; + simde_bfloat16 r[16]; + } test_vec[] = { + { { { SIMDE_BFLOAT16_VALUE( - 20.956), SIMDE_BFLOAT16_VALUE( - 58.964), SIMDE_BFLOAT16_VALUE( - 74.395), SIMDE_BFLOAT16_VALUE( - 58.069), + SIMDE_BFLOAT16_VALUE( - 73.918), SIMDE_BFLOAT16_VALUE( - 88.889), SIMDE_BFLOAT16_VALUE( - 89.387), SIMDE_BFLOAT16_VALUE( 26.229) }, + { SIMDE_BFLOAT16_VALUE( 67.698), SIMDE_BFLOAT16_VALUE( 18.105), SIMDE_BFLOAT16_VALUE( 25.021), SIMDE_BFLOAT16_VALUE( 34.669), + SIMDE_BFLOAT16_VALUE( - 49.404), SIMDE_BFLOAT16_VALUE( - 56.913), SIMDE_BFLOAT16_VALUE( 84.184), SIMDE_BFLOAT16_VALUE( 59.094) } }, + { SIMDE_BFLOAT16_VALUE( - 20.956), SIMDE_BFLOAT16_VALUE( - 58.964), SIMDE_BFLOAT16_VALUE( - 74.395), SIMDE_BFLOAT16_VALUE( - 58.069), + SIMDE_BFLOAT16_VALUE( - 73.918), SIMDE_BFLOAT16_VALUE( - 88.889), SIMDE_BFLOAT16_VALUE( - 89.387), SIMDE_BFLOAT16_VALUE( 26.229), + SIMDE_BFLOAT16_VALUE( 67.698), SIMDE_BFLOAT16_VALUE( 18.105), SIMDE_BFLOAT16_VALUE( 25.021), SIMDE_BFLOAT16_VALUE( 34.669), + SIMDE_BFLOAT16_VALUE( - 49.404), SIMDE_BFLOAT16_VALUE( - 56.913), SIMDE_BFLOAT16_VALUE( 84.184), SIMDE_BFLOAT16_VALUE( 59.094) } }, + { { { SIMDE_BFLOAT16_VALUE( 2.598), SIMDE_BFLOAT16_VALUE( - 70.000), SIMDE_BFLOAT16_VALUE( 41.157), SIMDE_BFLOAT16_VALUE( - 83.059), + SIMDE_BFLOAT16_VALUE( - 90.002), SIMDE_BFLOAT16_VALUE( 21.783), SIMDE_BFLOAT16_VALUE( 70.489), SIMDE_BFLOAT16_VALUE( 17.433) }, + { SIMDE_BFLOAT16_VALUE( - 86.074), SIMDE_BFLOAT16_VALUE( 41.189), SIMDE_BFLOAT16_VALUE( 63.234), SIMDE_BFLOAT16_VALUE( 12.204), + SIMDE_BFLOAT16_VALUE( 7.910), SIMDE_BFLOAT16_VALUE( - 15.107), SIMDE_BFLOAT16_VALUE( - 16.136), SIMDE_BFLOAT16_VALUE( 13.310) } }, + { SIMDE_BFLOAT16_VALUE( 2.598), SIMDE_BFLOAT16_VALUE( - 70.000), SIMDE_BFLOAT16_VALUE( 41.157), SIMDE_BFLOAT16_VALUE( - 83.059), + SIMDE_BFLOAT16_VALUE( - 90.002), SIMDE_BFLOAT16_VALUE( 21.783), SIMDE_BFLOAT16_VALUE( 70.489), SIMDE_BFLOAT16_VALUE( 17.433), + SIMDE_BFLOAT16_VALUE( - 86.074), SIMDE_BFLOAT16_VALUE( 41.189), SIMDE_BFLOAT16_VALUE( 63.234), SIMDE_BFLOAT16_VALUE( 12.204), + SIMDE_BFLOAT16_VALUE( 7.910), SIMDE_BFLOAT16_VALUE( - 15.107), SIMDE_BFLOAT16_VALUE( - 16.136), SIMDE_BFLOAT16_VALUE( 13.310) } }, + { { { SIMDE_BFLOAT16_VALUE( - 58.406), SIMDE_BFLOAT16_VALUE( - 64.859), SIMDE_BFLOAT16_VALUE( - 31.395), SIMDE_BFLOAT16_VALUE( 12.432), + SIMDE_BFLOAT16_VALUE( - 14.707), SIMDE_BFLOAT16_VALUE( 84.786), SIMDE_BFLOAT16_VALUE( - 39.961), SIMDE_BFLOAT16_VALUE( 98.967) }, + { SIMDE_BFLOAT16_VALUE( 28.677), SIMDE_BFLOAT16_VALUE( 63.490), SIMDE_BFLOAT16_VALUE( 74.828), SIMDE_BFLOAT16_VALUE( 21.706), + SIMDE_BFLOAT16_VALUE( 22.304), SIMDE_BFLOAT16_VALUE( 71.547), SIMDE_BFLOAT16_VALUE( 80.978), SIMDE_BFLOAT16_VALUE( 16.394) } }, + { SIMDE_BFLOAT16_VALUE( - 58.406), SIMDE_BFLOAT16_VALUE( - 64.859), SIMDE_BFLOAT16_VALUE( - 31.395), SIMDE_BFLOAT16_VALUE( 12.432), + SIMDE_BFLOAT16_VALUE( - 14.707), SIMDE_BFLOAT16_VALUE( 84.786), SIMDE_BFLOAT16_VALUE( - 39.961), SIMDE_BFLOAT16_VALUE( 98.967), + SIMDE_BFLOAT16_VALUE( 28.677), SIMDE_BFLOAT16_VALUE( 63.490), SIMDE_BFLOAT16_VALUE( 74.828), SIMDE_BFLOAT16_VALUE( 21.706), + SIMDE_BFLOAT16_VALUE( 22.304), SIMDE_BFLOAT16_VALUE( 71.547), SIMDE_BFLOAT16_VALUE( 80.978), SIMDE_BFLOAT16_VALUE( 16.394) } }, + { { { SIMDE_BFLOAT16_VALUE( 97.804), SIMDE_BFLOAT16_VALUE( 73.823), SIMDE_BFLOAT16_VALUE( - 8.059), SIMDE_BFLOAT16_VALUE( 93.096), + SIMDE_BFLOAT16_VALUE( 90.504), SIMDE_BFLOAT16_VALUE( - 2.398), SIMDE_BFLOAT16_VALUE( 30.759), SIMDE_BFLOAT16_VALUE( - 94.855) }, + { SIMDE_BFLOAT16_VALUE( - 5.801), SIMDE_BFLOAT16_VALUE( - 68.562), SIMDE_BFLOAT16_VALUE( - 54.678), SIMDE_BFLOAT16_VALUE( 22.048), + SIMDE_BFLOAT16_VALUE( - 71.055), SIMDE_BFLOAT16_VALUE( - 30.977), SIMDE_BFLOAT16_VALUE( 18.382), SIMDE_BFLOAT16_VALUE( 11.761) } }, + { SIMDE_BFLOAT16_VALUE( 97.804), SIMDE_BFLOAT16_VALUE( 73.823), SIMDE_BFLOAT16_VALUE( - 8.059), SIMDE_BFLOAT16_VALUE( 93.096), + SIMDE_BFLOAT16_VALUE( 90.504), SIMDE_BFLOAT16_VALUE( - 2.398), SIMDE_BFLOAT16_VALUE( 30.759), SIMDE_BFLOAT16_VALUE( - 94.855), + SIMDE_BFLOAT16_VALUE( - 5.801), SIMDE_BFLOAT16_VALUE( - 68.562), SIMDE_BFLOAT16_VALUE( - 54.678), SIMDE_BFLOAT16_VALUE( 22.048), + SIMDE_BFLOAT16_VALUE( - 71.055), SIMDE_BFLOAT16_VALUE( - 30.977), SIMDE_BFLOAT16_VALUE( 18.382), SIMDE_BFLOAT16_VALUE( 11.761) } }, + { { { SIMDE_BFLOAT16_VALUE( 55.035), SIMDE_BFLOAT16_VALUE( 94.504), SIMDE_BFLOAT16_VALUE( 21.867), SIMDE_BFLOAT16_VALUE( 60.556), + SIMDE_BFLOAT16_VALUE( - 21.374), SIMDE_BFLOAT16_VALUE( 82.466), SIMDE_BFLOAT16_VALUE( 84.824), SIMDE_BFLOAT16_VALUE( 31.885) }, + { SIMDE_BFLOAT16_VALUE( 17.599), SIMDE_BFLOAT16_VALUE( - 18.858), SIMDE_BFLOAT16_VALUE( - 97.376), SIMDE_BFLOAT16_VALUE( - 85.414), + SIMDE_BFLOAT16_VALUE( - 37.173), SIMDE_BFLOAT16_VALUE( 36.083), SIMDE_BFLOAT16_VALUE( 51.414), SIMDE_BFLOAT16_VALUE( 42.445) } }, + { SIMDE_BFLOAT16_VALUE( 55.035), SIMDE_BFLOAT16_VALUE( 94.504), SIMDE_BFLOAT16_VALUE( 21.867), SIMDE_BFLOAT16_VALUE( 60.556), + SIMDE_BFLOAT16_VALUE( - 21.374), SIMDE_BFLOAT16_VALUE( 82.466), SIMDE_BFLOAT16_VALUE( 84.824), SIMDE_BFLOAT16_VALUE( 31.885), + SIMDE_BFLOAT16_VALUE( 17.599), SIMDE_BFLOAT16_VALUE( - 18.858), SIMDE_BFLOAT16_VALUE( - 97.376), SIMDE_BFLOAT16_VALUE( - 85.414), + SIMDE_BFLOAT16_VALUE( - 37.173), SIMDE_BFLOAT16_VALUE( 36.083), SIMDE_BFLOAT16_VALUE( 51.414), SIMDE_BFLOAT16_VALUE( 42.445) } }, + { { { SIMDE_BFLOAT16_VALUE( - 58.353), SIMDE_BFLOAT16_VALUE( 94.351), SIMDE_BFLOAT16_VALUE( - 72.718), SIMDE_BFLOAT16_VALUE( 44.738), + SIMDE_BFLOAT16_VALUE( 88.331), SIMDE_BFLOAT16_VALUE( 93.544), SIMDE_BFLOAT16_VALUE( 79.940), SIMDE_BFLOAT16_VALUE( - 29.844) }, + { SIMDE_BFLOAT16_VALUE( - 64.679), SIMDE_BFLOAT16_VALUE( - 31.234), SIMDE_BFLOAT16_VALUE( 25.402), SIMDE_BFLOAT16_VALUE( 61.429), + SIMDE_BFLOAT16_VALUE( - 80.532), SIMDE_BFLOAT16_VALUE( 19.659), SIMDE_BFLOAT16_VALUE( - 67.325), SIMDE_BFLOAT16_VALUE( 54.634) } }, + { SIMDE_BFLOAT16_VALUE( - 58.353), SIMDE_BFLOAT16_VALUE( 94.351), SIMDE_BFLOAT16_VALUE( - 72.718), SIMDE_BFLOAT16_VALUE( 44.738), + SIMDE_BFLOAT16_VALUE( 88.331), SIMDE_BFLOAT16_VALUE( 93.544), SIMDE_BFLOAT16_VALUE( 79.940), SIMDE_BFLOAT16_VALUE( - 29.844), + SIMDE_BFLOAT16_VALUE( - 64.679), SIMDE_BFLOAT16_VALUE( - 31.234), SIMDE_BFLOAT16_VALUE( 25.402), SIMDE_BFLOAT16_VALUE( 61.429), + SIMDE_BFLOAT16_VALUE( - 80.532), SIMDE_BFLOAT16_VALUE( 19.659), SIMDE_BFLOAT16_VALUE( - 67.325), SIMDE_BFLOAT16_VALUE( 54.634) } }, + { { { SIMDE_BFLOAT16_VALUE( - 99.773), SIMDE_BFLOAT16_VALUE( 27.004), SIMDE_BFLOAT16_VALUE( 53.708), SIMDE_BFLOAT16_VALUE( 12.664), + SIMDE_BFLOAT16_VALUE( 66.275), SIMDE_BFLOAT16_VALUE( - 0.836), SIMDE_BFLOAT16_VALUE( - 22.661), SIMDE_BFLOAT16_VALUE( 72.602) }, + { SIMDE_BFLOAT16_VALUE( 25.260), SIMDE_BFLOAT16_VALUE( - 83.782), SIMDE_BFLOAT16_VALUE( - 61.087), SIMDE_BFLOAT16_VALUE( - 38.948), + SIMDE_BFLOAT16_VALUE( - 78.380), SIMDE_BFLOAT16_VALUE( 6.817), SIMDE_BFLOAT16_VALUE( - 82.373), SIMDE_BFLOAT16_VALUE( - 60.011) } }, + { SIMDE_BFLOAT16_VALUE( - 99.773), SIMDE_BFLOAT16_VALUE( 27.004), SIMDE_BFLOAT16_VALUE( 53.708), SIMDE_BFLOAT16_VALUE( 12.664), + SIMDE_BFLOAT16_VALUE( 66.275), SIMDE_BFLOAT16_VALUE( - 0.836), SIMDE_BFLOAT16_VALUE( - 22.661), SIMDE_BFLOAT16_VALUE( 72.602), + SIMDE_BFLOAT16_VALUE( 25.260), SIMDE_BFLOAT16_VALUE( - 83.782), SIMDE_BFLOAT16_VALUE( - 61.087), SIMDE_BFLOAT16_VALUE( - 38.948), + SIMDE_BFLOAT16_VALUE( - 78.380), SIMDE_BFLOAT16_VALUE( 6.817), SIMDE_BFLOAT16_VALUE( - 82.373), SIMDE_BFLOAT16_VALUE( - 60.011) } }, + { { { SIMDE_BFLOAT16_VALUE( - 53.476), SIMDE_BFLOAT16_VALUE( 8.724), SIMDE_BFLOAT16_VALUE( - 88.674), SIMDE_BFLOAT16_VALUE( - 48.309), + SIMDE_BFLOAT16_VALUE( - 3.562), SIMDE_BFLOAT16_VALUE( 14.309), SIMDE_BFLOAT16_VALUE( - 99.801), SIMDE_BFLOAT16_VALUE( - 11.703) }, + { SIMDE_BFLOAT16_VALUE( - 62.913), SIMDE_BFLOAT16_VALUE( - 43.056), SIMDE_BFLOAT16_VALUE( - 65.766), SIMDE_BFLOAT16_VALUE( 92.099), + SIMDE_BFLOAT16_VALUE( 73.066), SIMDE_BFLOAT16_VALUE( 29.509), SIMDE_BFLOAT16_VALUE( - 77.995), SIMDE_BFLOAT16_VALUE( - 81.816) } }, + { SIMDE_BFLOAT16_VALUE( - 53.476), SIMDE_BFLOAT16_VALUE( 8.724), SIMDE_BFLOAT16_VALUE( - 88.674), SIMDE_BFLOAT16_VALUE( - 48.309), + SIMDE_BFLOAT16_VALUE( - 3.562), SIMDE_BFLOAT16_VALUE( 14.309), SIMDE_BFLOAT16_VALUE( - 99.801), SIMDE_BFLOAT16_VALUE( - 11.703), + SIMDE_BFLOAT16_VALUE( - 62.913), SIMDE_BFLOAT16_VALUE( - 43.056), SIMDE_BFLOAT16_VALUE( - 65.766), SIMDE_BFLOAT16_VALUE( 92.099), + SIMDE_BFLOAT16_VALUE( 73.066), SIMDE_BFLOAT16_VALUE( 29.509), SIMDE_BFLOAT16_VALUE( - 77.995), SIMDE_BFLOAT16_VALUE( - 81.816) } }, + }; + + for (size_t i = 0; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + simde_bfloat16x8x2_t val = {{ + simde_vld1q_bf16(test_vec[i].val[0]), + simde_vld1q_bf16(test_vec[i].val[1]), + }}; + simde_bfloat16 r_[16]; + simde_vst1q_bf16_x2(r_, val); + simde_assert_equal_i(0, simde_memcmp(r_, test_vec[i].r, sizeof(test_vec[i].r))); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_bfloat16x2_t val[2] = simde_test_arm_neon_random_bf16x2(-100.0f, 100.0f); + simde_bfloat16x16_t r = simde_vst1q_bf16_x2(val[2]); + + simde_test_arm_neon_write_bf16x2(2, val[2], SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x16(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -1243,6 +1341,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vst1q_u64_x2) SIMDE_TEST_FUNC_LIST_ENTRY(vst1q_p8_x2) SIMDE_TEST_FUNC_LIST_ENTRY(vst1q_p16_x2) SIMDE_TEST_FUNC_LIST_ENTRY(vst1q_p64_x2) +SIMDE_TEST_FUNC_LIST_ENTRY(vst1q_bf16_x2) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/st1q_x3.c b/test/arm/neon/st1q_x3.c index b21e4615c..188f35b39 100644 --- a/test/arm/neon/st1q_x3.c +++ b/test/arm/neon/st1q_x3.c @@ -1577,6 +1577,137 @@ test_simde_vst1q_p64_x3 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vst1q_bf16_x3 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16 val[3][8]; + simde_bfloat16 r[24]; + } test_vec[] = { + { { { SIMDE_BFLOAT16_VALUE( - 78.006), SIMDE_BFLOAT16_VALUE( - 86.214), SIMDE_BFLOAT16_VALUE( 79.768), SIMDE_BFLOAT16_VALUE( - 58.640), + SIMDE_BFLOAT16_VALUE( 95.290), SIMDE_BFLOAT16_VALUE( - 58.694), SIMDE_BFLOAT16_VALUE( - 66.494), SIMDE_BFLOAT16_VALUE( 14.402) }, + { SIMDE_BFLOAT16_VALUE( - 73.147), SIMDE_BFLOAT16_VALUE( 86.011), SIMDE_BFLOAT16_VALUE( - 57.821), SIMDE_BFLOAT16_VALUE( 39.575), + SIMDE_BFLOAT16_VALUE( - 71.723), SIMDE_BFLOAT16_VALUE( - 56.950), SIMDE_BFLOAT16_VALUE( - 64.715), SIMDE_BFLOAT16_VALUE( 57.900) }, + { SIMDE_BFLOAT16_VALUE( 61.685), SIMDE_BFLOAT16_VALUE( - 81.983), SIMDE_BFLOAT16_VALUE( 15.196), SIMDE_BFLOAT16_VALUE( - 22.643), + SIMDE_BFLOAT16_VALUE( 73.963), SIMDE_BFLOAT16_VALUE( 69.945), SIMDE_BFLOAT16_VALUE( - 18.252), SIMDE_BFLOAT16_VALUE( 6.208) } }, + { SIMDE_BFLOAT16_VALUE( - 78.006), SIMDE_BFLOAT16_VALUE( - 86.214), SIMDE_BFLOAT16_VALUE( 79.768), SIMDE_BFLOAT16_VALUE( - 58.640), + SIMDE_BFLOAT16_VALUE( 95.290), SIMDE_BFLOAT16_VALUE( - 58.694), SIMDE_BFLOAT16_VALUE( - 66.494), SIMDE_BFLOAT16_VALUE( 14.402), + SIMDE_BFLOAT16_VALUE( - 73.147), SIMDE_BFLOAT16_VALUE( 86.011), SIMDE_BFLOAT16_VALUE( - 57.821), SIMDE_BFLOAT16_VALUE( 39.575), + SIMDE_BFLOAT16_VALUE( - 71.723), SIMDE_BFLOAT16_VALUE( - 56.950), SIMDE_BFLOAT16_VALUE( - 64.715), SIMDE_BFLOAT16_VALUE( 57.900), + SIMDE_BFLOAT16_VALUE( 61.685), SIMDE_BFLOAT16_VALUE( - 81.983), SIMDE_BFLOAT16_VALUE( 15.196), SIMDE_BFLOAT16_VALUE( - 22.643), + SIMDE_BFLOAT16_VALUE( 73.963), SIMDE_BFLOAT16_VALUE( 69.945), SIMDE_BFLOAT16_VALUE( - 18.252), SIMDE_BFLOAT16_VALUE( 6.208) } }, + { { { SIMDE_BFLOAT16_VALUE( 75.124), SIMDE_BFLOAT16_VALUE( 63.765), SIMDE_BFLOAT16_VALUE( 93.445), SIMDE_BFLOAT16_VALUE( - 2.808), + SIMDE_BFLOAT16_VALUE( 21.150), SIMDE_BFLOAT16_VALUE( - 27.804), SIMDE_BFLOAT16_VALUE( 96.600), SIMDE_BFLOAT16_VALUE( 49.484) }, + { SIMDE_BFLOAT16_VALUE( - 21.286), SIMDE_BFLOAT16_VALUE( 6.385), SIMDE_BFLOAT16_VALUE( 58.966), SIMDE_BFLOAT16_VALUE( - 25.964), + SIMDE_BFLOAT16_VALUE( 81.303), SIMDE_BFLOAT16_VALUE( 55.133), SIMDE_BFLOAT16_VALUE( 59.277), SIMDE_BFLOAT16_VALUE( 90.767) }, + { SIMDE_BFLOAT16_VALUE( - 9.851), SIMDE_BFLOAT16_VALUE( - 51.010), SIMDE_BFLOAT16_VALUE( - 57.457), SIMDE_BFLOAT16_VALUE( 76.293), + SIMDE_BFLOAT16_VALUE( - 36.636), SIMDE_BFLOAT16_VALUE( 71.898), SIMDE_BFLOAT16_VALUE( 98.888), SIMDE_BFLOAT16_VALUE( - 38.156) } }, + { SIMDE_BFLOAT16_VALUE( 75.124), SIMDE_BFLOAT16_VALUE( 63.765), SIMDE_BFLOAT16_VALUE( 93.445), SIMDE_BFLOAT16_VALUE( - 2.808), + SIMDE_BFLOAT16_VALUE( 21.150), SIMDE_BFLOAT16_VALUE( - 27.804), SIMDE_BFLOAT16_VALUE( 96.600), SIMDE_BFLOAT16_VALUE( 49.484), + SIMDE_BFLOAT16_VALUE( - 21.286), SIMDE_BFLOAT16_VALUE( 6.385), SIMDE_BFLOAT16_VALUE( 58.966), SIMDE_BFLOAT16_VALUE( - 25.964), + SIMDE_BFLOAT16_VALUE( 81.303), SIMDE_BFLOAT16_VALUE( 55.133), SIMDE_BFLOAT16_VALUE( 59.277), SIMDE_BFLOAT16_VALUE( 90.767), + SIMDE_BFLOAT16_VALUE( - 9.851), SIMDE_BFLOAT16_VALUE( - 51.010), SIMDE_BFLOAT16_VALUE( - 57.457), SIMDE_BFLOAT16_VALUE( 76.293), + SIMDE_BFLOAT16_VALUE( - 36.636), SIMDE_BFLOAT16_VALUE( 71.898), SIMDE_BFLOAT16_VALUE( 98.888), SIMDE_BFLOAT16_VALUE( - 38.156) } }, + { { { SIMDE_BFLOAT16_VALUE( 26.535), SIMDE_BFLOAT16_VALUE( - 91.027), SIMDE_BFLOAT16_VALUE( - 79.934), SIMDE_BFLOAT16_VALUE( - 46.283), + SIMDE_BFLOAT16_VALUE( - 50.743), SIMDE_BFLOAT16_VALUE( - 31.430), SIMDE_BFLOAT16_VALUE( - 40.474), SIMDE_BFLOAT16_VALUE( 52.962) }, + { SIMDE_BFLOAT16_VALUE( 54.007), SIMDE_BFLOAT16_VALUE( - 51.316), SIMDE_BFLOAT16_VALUE( - 70.698), SIMDE_BFLOAT16_VALUE( 59.510), + SIMDE_BFLOAT16_VALUE( 60.522), SIMDE_BFLOAT16_VALUE( - 83.540), SIMDE_BFLOAT16_VALUE( 72.171), SIMDE_BFLOAT16_VALUE( - 94.419) }, + { SIMDE_BFLOAT16_VALUE( - 73.925), SIMDE_BFLOAT16_VALUE( - 73.200), SIMDE_BFLOAT16_VALUE( - 12.444), SIMDE_BFLOAT16_VALUE( 72.493), + SIMDE_BFLOAT16_VALUE( 27.042), SIMDE_BFLOAT16_VALUE( 81.525), SIMDE_BFLOAT16_VALUE( - 92.143), SIMDE_BFLOAT16_VALUE( - 50.921) } }, + { SIMDE_BFLOAT16_VALUE( 26.535), SIMDE_BFLOAT16_VALUE( - 91.027), SIMDE_BFLOAT16_VALUE( - 79.934), SIMDE_BFLOAT16_VALUE( - 46.283), + SIMDE_BFLOAT16_VALUE( - 50.743), SIMDE_BFLOAT16_VALUE( - 31.430), SIMDE_BFLOAT16_VALUE( - 40.474), SIMDE_BFLOAT16_VALUE( 52.962), + SIMDE_BFLOAT16_VALUE( 54.007), SIMDE_BFLOAT16_VALUE( - 51.316), SIMDE_BFLOAT16_VALUE( - 70.698), SIMDE_BFLOAT16_VALUE( 59.510), + SIMDE_BFLOAT16_VALUE( 60.522), SIMDE_BFLOAT16_VALUE( - 83.540), SIMDE_BFLOAT16_VALUE( 72.171), SIMDE_BFLOAT16_VALUE( - 94.419), + SIMDE_BFLOAT16_VALUE( - 73.925), SIMDE_BFLOAT16_VALUE( - 73.200), SIMDE_BFLOAT16_VALUE( - 12.444), SIMDE_BFLOAT16_VALUE( 72.493), + SIMDE_BFLOAT16_VALUE( 27.042), SIMDE_BFLOAT16_VALUE( 81.525), SIMDE_BFLOAT16_VALUE( - 92.143), SIMDE_BFLOAT16_VALUE( - 50.921) } }, + { { { SIMDE_BFLOAT16_VALUE( - 45.682), SIMDE_BFLOAT16_VALUE( 52.798), SIMDE_BFLOAT16_VALUE( - 80.990), SIMDE_BFLOAT16_VALUE( - 61.788), + SIMDE_BFLOAT16_VALUE( 54.221), SIMDE_BFLOAT16_VALUE( 99.819), SIMDE_BFLOAT16_VALUE( - 53.166), SIMDE_BFLOAT16_VALUE( 62.212) }, + { SIMDE_BFLOAT16_VALUE( - 26.140), SIMDE_BFLOAT16_VALUE( - 44.258), SIMDE_BFLOAT16_VALUE( - 63.797), SIMDE_BFLOAT16_VALUE( 21.345), + SIMDE_BFLOAT16_VALUE( 43.284), SIMDE_BFLOAT16_VALUE( 49.659), SIMDE_BFLOAT16_VALUE( 83.024), SIMDE_BFLOAT16_VALUE( - 93.541) }, + { SIMDE_BFLOAT16_VALUE( - 41.983), SIMDE_BFLOAT16_VALUE( 72.431), SIMDE_BFLOAT16_VALUE( - 72.624), SIMDE_BFLOAT16_VALUE( - 68.362), + SIMDE_BFLOAT16_VALUE( - 3.439), SIMDE_BFLOAT16_VALUE( 57.763), SIMDE_BFLOAT16_VALUE( 53.732), SIMDE_BFLOAT16_VALUE( 23.477) } }, + { SIMDE_BFLOAT16_VALUE( - 45.682), SIMDE_BFLOAT16_VALUE( 52.798), SIMDE_BFLOAT16_VALUE( - 80.990), SIMDE_BFLOAT16_VALUE( - 61.788), + SIMDE_BFLOAT16_VALUE( 54.221), SIMDE_BFLOAT16_VALUE( 99.819), SIMDE_BFLOAT16_VALUE( - 53.166), SIMDE_BFLOAT16_VALUE( 62.212), + SIMDE_BFLOAT16_VALUE( - 26.140), SIMDE_BFLOAT16_VALUE( - 44.258), SIMDE_BFLOAT16_VALUE( - 63.797), SIMDE_BFLOAT16_VALUE( 21.345), + SIMDE_BFLOAT16_VALUE( 43.284), SIMDE_BFLOAT16_VALUE( 49.659), SIMDE_BFLOAT16_VALUE( 83.024), SIMDE_BFLOAT16_VALUE( - 93.541), + SIMDE_BFLOAT16_VALUE( - 41.983), SIMDE_BFLOAT16_VALUE( 72.431), SIMDE_BFLOAT16_VALUE( - 72.624), SIMDE_BFLOAT16_VALUE( - 68.362), + SIMDE_BFLOAT16_VALUE( - 3.439), SIMDE_BFLOAT16_VALUE( 57.763), SIMDE_BFLOAT16_VALUE( 53.732), SIMDE_BFLOAT16_VALUE( 23.477) } }, + { { { SIMDE_BFLOAT16_VALUE( - 82.965), SIMDE_BFLOAT16_VALUE( - 70.111), SIMDE_BFLOAT16_VALUE( - 31.957), SIMDE_BFLOAT16_VALUE( 61.018), + SIMDE_BFLOAT16_VALUE( - 27.870), SIMDE_BFLOAT16_VALUE( 71.621), SIMDE_BFLOAT16_VALUE( - 77.867), SIMDE_BFLOAT16_VALUE( - 30.557) }, + { SIMDE_BFLOAT16_VALUE( 58.953), SIMDE_BFLOAT16_VALUE( - 20.614), SIMDE_BFLOAT16_VALUE( - 60.571), SIMDE_BFLOAT16_VALUE( 63.967), + SIMDE_BFLOAT16_VALUE( - 12.960), SIMDE_BFLOAT16_VALUE( - 61.378), SIMDE_BFLOAT16_VALUE( - 20.681), SIMDE_BFLOAT16_VALUE( 73.740) }, + { SIMDE_BFLOAT16_VALUE( 77.996), SIMDE_BFLOAT16_VALUE( 4.822), SIMDE_BFLOAT16_VALUE( - 39.992), SIMDE_BFLOAT16_VALUE( 50.289), + SIMDE_BFLOAT16_VALUE( - 37.043), SIMDE_BFLOAT16_VALUE( - 89.635), SIMDE_BFLOAT16_VALUE( 33.091), SIMDE_BFLOAT16_VALUE( - 39.668) } }, + { SIMDE_BFLOAT16_VALUE( - 82.965), SIMDE_BFLOAT16_VALUE( - 70.111), SIMDE_BFLOAT16_VALUE( - 31.957), SIMDE_BFLOAT16_VALUE( 61.018), + SIMDE_BFLOAT16_VALUE( - 27.870), SIMDE_BFLOAT16_VALUE( 71.621), SIMDE_BFLOAT16_VALUE( - 77.867), SIMDE_BFLOAT16_VALUE( - 30.557), + SIMDE_BFLOAT16_VALUE( 58.953), SIMDE_BFLOAT16_VALUE( - 20.614), SIMDE_BFLOAT16_VALUE( - 60.571), SIMDE_BFLOAT16_VALUE( 63.967), + SIMDE_BFLOAT16_VALUE( - 12.960), SIMDE_BFLOAT16_VALUE( - 61.378), SIMDE_BFLOAT16_VALUE( - 20.681), SIMDE_BFLOAT16_VALUE( 73.740), + SIMDE_BFLOAT16_VALUE( 77.996), SIMDE_BFLOAT16_VALUE( 4.822), SIMDE_BFLOAT16_VALUE( - 39.992), SIMDE_BFLOAT16_VALUE( 50.289), + SIMDE_BFLOAT16_VALUE( - 37.043), SIMDE_BFLOAT16_VALUE( - 89.635), SIMDE_BFLOAT16_VALUE( 33.091), SIMDE_BFLOAT16_VALUE( - 39.668) } }, + { { { SIMDE_BFLOAT16_VALUE( 3.917), SIMDE_BFLOAT16_VALUE( 67.525), SIMDE_BFLOAT16_VALUE( - 40.144), SIMDE_BFLOAT16_VALUE( 98.412), + SIMDE_BFLOAT16_VALUE( - 5.628), SIMDE_BFLOAT16_VALUE( - 91.834), SIMDE_BFLOAT16_VALUE( 66.132), SIMDE_BFLOAT16_VALUE( - 44.698) }, + { SIMDE_BFLOAT16_VALUE( 3.461), SIMDE_BFLOAT16_VALUE( - 1.903), SIMDE_BFLOAT16_VALUE( - 7.486), SIMDE_BFLOAT16_VALUE( - 5.095), + SIMDE_BFLOAT16_VALUE( - 4.045), SIMDE_BFLOAT16_VALUE( 76.155), SIMDE_BFLOAT16_VALUE( 45.573), SIMDE_BFLOAT16_VALUE( - 17.845) }, + { SIMDE_BFLOAT16_VALUE( - 69.007), SIMDE_BFLOAT16_VALUE( - 91.001), SIMDE_BFLOAT16_VALUE( 47.281), SIMDE_BFLOAT16_VALUE( - 6.930), + SIMDE_BFLOAT16_VALUE( - 31.826), SIMDE_BFLOAT16_VALUE( - 9.605), SIMDE_BFLOAT16_VALUE( - 8.507), SIMDE_BFLOAT16_VALUE( - 69.550) } }, + { SIMDE_BFLOAT16_VALUE( 3.917), SIMDE_BFLOAT16_VALUE( 67.525), SIMDE_BFLOAT16_VALUE( - 40.144), SIMDE_BFLOAT16_VALUE( 98.412), + SIMDE_BFLOAT16_VALUE( - 5.628), SIMDE_BFLOAT16_VALUE( - 91.834), SIMDE_BFLOAT16_VALUE( 66.132), SIMDE_BFLOAT16_VALUE( - 44.698), + SIMDE_BFLOAT16_VALUE( 3.461), SIMDE_BFLOAT16_VALUE( - 1.903), SIMDE_BFLOAT16_VALUE( - 7.486), SIMDE_BFLOAT16_VALUE( - 5.095), + SIMDE_BFLOAT16_VALUE( - 4.045), SIMDE_BFLOAT16_VALUE( 76.155), SIMDE_BFLOAT16_VALUE( 45.573), SIMDE_BFLOAT16_VALUE( - 17.845), + SIMDE_BFLOAT16_VALUE( - 69.007), SIMDE_BFLOAT16_VALUE( - 91.001), SIMDE_BFLOAT16_VALUE( 47.281), SIMDE_BFLOAT16_VALUE( - 6.930), + SIMDE_BFLOAT16_VALUE( - 31.826), SIMDE_BFLOAT16_VALUE( - 9.605), SIMDE_BFLOAT16_VALUE( - 8.507), SIMDE_BFLOAT16_VALUE( - 69.550) } }, + { { { SIMDE_BFLOAT16_VALUE( - 83.740), SIMDE_BFLOAT16_VALUE( - 6.331), SIMDE_BFLOAT16_VALUE( - 89.045), SIMDE_BFLOAT16_VALUE( - 94.435), + SIMDE_BFLOAT16_VALUE( - 65.111), SIMDE_BFLOAT16_VALUE( - 70.456), SIMDE_BFLOAT16_VALUE( 11.289), SIMDE_BFLOAT16_VALUE( 7.177) }, + { SIMDE_BFLOAT16_VALUE( - 90.849), SIMDE_BFLOAT16_VALUE( - 95.953), SIMDE_BFLOAT16_VALUE( - 42.247), SIMDE_BFLOAT16_VALUE( 14.309), + SIMDE_BFLOAT16_VALUE( - 95.825), SIMDE_BFLOAT16_VALUE( - 22.270), SIMDE_BFLOAT16_VALUE( 83.373), SIMDE_BFLOAT16_VALUE( - 79.802) }, + { SIMDE_BFLOAT16_VALUE( - 22.035), SIMDE_BFLOAT16_VALUE( - 92.921), SIMDE_BFLOAT16_VALUE( 43.906), SIMDE_BFLOAT16_VALUE( 26.805), + SIMDE_BFLOAT16_VALUE( 51.738), SIMDE_BFLOAT16_VALUE( - 42.852), SIMDE_BFLOAT16_VALUE( 5.828), SIMDE_BFLOAT16_VALUE( 44.079) } }, + { SIMDE_BFLOAT16_VALUE( - 83.740), SIMDE_BFLOAT16_VALUE( - 6.331), SIMDE_BFLOAT16_VALUE( - 89.045), SIMDE_BFLOAT16_VALUE( - 94.435), + SIMDE_BFLOAT16_VALUE( - 65.111), SIMDE_BFLOAT16_VALUE( - 70.456), SIMDE_BFLOAT16_VALUE( 11.289), SIMDE_BFLOAT16_VALUE( 7.177), + SIMDE_BFLOAT16_VALUE( - 90.849), SIMDE_BFLOAT16_VALUE( - 95.953), SIMDE_BFLOAT16_VALUE( - 42.247), SIMDE_BFLOAT16_VALUE( 14.309), + SIMDE_BFLOAT16_VALUE( - 95.825), SIMDE_BFLOAT16_VALUE( - 22.270), SIMDE_BFLOAT16_VALUE( 83.373), SIMDE_BFLOAT16_VALUE( - 79.802), + SIMDE_BFLOAT16_VALUE( - 22.035), SIMDE_BFLOAT16_VALUE( - 92.921), SIMDE_BFLOAT16_VALUE( 43.906), SIMDE_BFLOAT16_VALUE( 26.805), + SIMDE_BFLOAT16_VALUE( 51.738), SIMDE_BFLOAT16_VALUE( - 42.852), SIMDE_BFLOAT16_VALUE( 5.828), SIMDE_BFLOAT16_VALUE( 44.079) } }, + { { { SIMDE_BFLOAT16_VALUE( - 16.629), SIMDE_BFLOAT16_VALUE( 51.044), SIMDE_BFLOAT16_VALUE( 19.393), SIMDE_BFLOAT16_VALUE( 55.131), + SIMDE_BFLOAT16_VALUE( - 43.901), SIMDE_BFLOAT16_VALUE( 70.204), SIMDE_BFLOAT16_VALUE( 97.396), SIMDE_BFLOAT16_VALUE( 81.774) }, + { SIMDE_BFLOAT16_VALUE( - 65.652), SIMDE_BFLOAT16_VALUE( 84.250), SIMDE_BFLOAT16_VALUE( - 73.434), SIMDE_BFLOAT16_VALUE( 83.066), + SIMDE_BFLOAT16_VALUE( 98.140), SIMDE_BFLOAT16_VALUE( 10.456), SIMDE_BFLOAT16_VALUE( - 74.473), SIMDE_BFLOAT16_VALUE( 36.574) }, + { SIMDE_BFLOAT16_VALUE( - 30.153), SIMDE_BFLOAT16_VALUE( 52.521), SIMDE_BFLOAT16_VALUE( - 21.877), SIMDE_BFLOAT16_VALUE( 99.308), + SIMDE_BFLOAT16_VALUE( - 78.712), SIMDE_BFLOAT16_VALUE( - 45.652), SIMDE_BFLOAT16_VALUE( - 23.870), SIMDE_BFLOAT16_VALUE( 33.651) } }, + { SIMDE_BFLOAT16_VALUE( - 16.629), SIMDE_BFLOAT16_VALUE( 51.044), SIMDE_BFLOAT16_VALUE( 19.393), SIMDE_BFLOAT16_VALUE( 55.131), + SIMDE_BFLOAT16_VALUE( - 43.901), SIMDE_BFLOAT16_VALUE( 70.204), SIMDE_BFLOAT16_VALUE( 97.396), SIMDE_BFLOAT16_VALUE( 81.774), + SIMDE_BFLOAT16_VALUE( - 65.652), SIMDE_BFLOAT16_VALUE( 84.250), SIMDE_BFLOAT16_VALUE( - 73.434), SIMDE_BFLOAT16_VALUE( 83.066), + SIMDE_BFLOAT16_VALUE( 98.140), SIMDE_BFLOAT16_VALUE( 10.456), SIMDE_BFLOAT16_VALUE( - 74.473), SIMDE_BFLOAT16_VALUE( 36.574), + SIMDE_BFLOAT16_VALUE( - 30.153), SIMDE_BFLOAT16_VALUE( 52.521), SIMDE_BFLOAT16_VALUE( - 21.877), SIMDE_BFLOAT16_VALUE( 99.308), + SIMDE_BFLOAT16_VALUE( - 78.712), SIMDE_BFLOAT16_VALUE( - 45.652), SIMDE_BFLOAT16_VALUE( - 23.870), SIMDE_BFLOAT16_VALUE( 33.651) } }, + }; + + for (size_t i = 0; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + simde_bfloat16x8x3_t val = {{ + simde_vld1q_bf16(test_vec[i].val[0]), + simde_vld1q_bf16(test_vec[i].val[1]), + simde_vld1q_bf16(test_vec[i].val[2]), + }}; + simde_bfloat16 r_[24]; + simde_vst1q_bf16_x3(r_, val); + simde_assert_equal_i(0, simde_memcmp(r_, test_vec[i].r, sizeof(test_vec[i].r))); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_bfloat16x3_t val[3] = simde_test_arm_neon_random_bf16x3(-100.0f, 100.0f); + simde_bfloat16x24_t r = simde_vst1q_bf16_x3(val[3]); + + simde_test_arm_neon_write_bf16x3(2, val[3], SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x24(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -1595,6 +1726,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vst1q_u64_x3) SIMDE_TEST_FUNC_LIST_ENTRY(vst1q_p8_x3) SIMDE_TEST_FUNC_LIST_ENTRY(vst1q_p16_x3) SIMDE_TEST_FUNC_LIST_ENTRY(vst1q_p64_x3) +SIMDE_TEST_FUNC_LIST_ENTRY(vst1q_bf16_x3) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/st1q_x4.c b/test/arm/neon/st1q_x4.c index 832b94a88..d96a1bca4 100644 --- a/test/arm/neon/st1q_x4.c +++ b/test/arm/neon/st1q_x4.c @@ -1897,6 +1897,170 @@ test_simde_vst1q_p64_x4 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vst1q_bf16_x4 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16 val[4][8]; + simde_bfloat16 r[32]; + } test_vec[] = { + { { { SIMDE_BFLOAT16_VALUE( - 22.750), SIMDE_BFLOAT16_VALUE( 61.096), SIMDE_BFLOAT16_VALUE( 69.465), SIMDE_BFLOAT16_VALUE( 61.036), + SIMDE_BFLOAT16_VALUE( 97.235), SIMDE_BFLOAT16_VALUE( 49.615), SIMDE_BFLOAT16_VALUE( - 97.607), SIMDE_BFLOAT16_VALUE( - 78.562) }, + { SIMDE_BFLOAT16_VALUE( - 60.626), SIMDE_BFLOAT16_VALUE( - 21.392), SIMDE_BFLOAT16_VALUE( 32.623), SIMDE_BFLOAT16_VALUE( - 22.547), + SIMDE_BFLOAT16_VALUE( 99.897), SIMDE_BFLOAT16_VALUE( 65.091), SIMDE_BFLOAT16_VALUE( - 5.726), SIMDE_BFLOAT16_VALUE( 95.620) }, + { SIMDE_BFLOAT16_VALUE( - 23.061), SIMDE_BFLOAT16_VALUE( - 37.099), SIMDE_BFLOAT16_VALUE( - 36.446), SIMDE_BFLOAT16_VALUE( - 62.836), + SIMDE_BFLOAT16_VALUE( 11.655), SIMDE_BFLOAT16_VALUE( - 63.088), SIMDE_BFLOAT16_VALUE( 11.587), SIMDE_BFLOAT16_VALUE( 29.929) }, + { SIMDE_BFLOAT16_VALUE( - 71.852), SIMDE_BFLOAT16_VALUE( 31.326), SIMDE_BFLOAT16_VALUE( - 83.956), SIMDE_BFLOAT16_VALUE( - 18.453), + SIMDE_BFLOAT16_VALUE( 97.022), SIMDE_BFLOAT16_VALUE( - 67.287), SIMDE_BFLOAT16_VALUE( 14.241), SIMDE_BFLOAT16_VALUE( 27.963) } }, + { SIMDE_BFLOAT16_VALUE( - 22.750), SIMDE_BFLOAT16_VALUE( 61.096), SIMDE_BFLOAT16_VALUE( 69.465), SIMDE_BFLOAT16_VALUE( 61.036), + SIMDE_BFLOAT16_VALUE( 97.235), SIMDE_BFLOAT16_VALUE( 49.615), SIMDE_BFLOAT16_VALUE( - 97.607), SIMDE_BFLOAT16_VALUE( - 78.562), + SIMDE_BFLOAT16_VALUE( - 60.626), SIMDE_BFLOAT16_VALUE( - 21.392), SIMDE_BFLOAT16_VALUE( 32.623), SIMDE_BFLOAT16_VALUE( - 22.547), + SIMDE_BFLOAT16_VALUE( 99.897), SIMDE_BFLOAT16_VALUE( 65.091), SIMDE_BFLOAT16_VALUE( - 5.726), SIMDE_BFLOAT16_VALUE( 95.620), + SIMDE_BFLOAT16_VALUE( - 23.061), SIMDE_BFLOAT16_VALUE( - 37.099), SIMDE_BFLOAT16_VALUE( - 36.446), SIMDE_BFLOAT16_VALUE( - 62.836), + SIMDE_BFLOAT16_VALUE( 11.655), SIMDE_BFLOAT16_VALUE( - 63.088), SIMDE_BFLOAT16_VALUE( 11.587), SIMDE_BFLOAT16_VALUE( 29.929), + SIMDE_BFLOAT16_VALUE( - 71.852), SIMDE_BFLOAT16_VALUE( 31.326), SIMDE_BFLOAT16_VALUE( - 83.956), SIMDE_BFLOAT16_VALUE( - 18.453), + SIMDE_BFLOAT16_VALUE( 97.022), SIMDE_BFLOAT16_VALUE( - 67.287), SIMDE_BFLOAT16_VALUE( 14.241), SIMDE_BFLOAT16_VALUE( 27.963) } }, + { { { SIMDE_BFLOAT16_VALUE( 29.494), SIMDE_BFLOAT16_VALUE( - 56.304), SIMDE_BFLOAT16_VALUE( 67.254), SIMDE_BFLOAT16_VALUE( - 54.309), + SIMDE_BFLOAT16_VALUE( 34.087), SIMDE_BFLOAT16_VALUE( 62.655), SIMDE_BFLOAT16_VALUE( 4.600), SIMDE_BFLOAT16_VALUE( 82.017) }, + { SIMDE_BFLOAT16_VALUE( 78.796), SIMDE_BFLOAT16_VALUE( 85.632), SIMDE_BFLOAT16_VALUE( 35.246), SIMDE_BFLOAT16_VALUE( - 37.467), + SIMDE_BFLOAT16_VALUE( - 62.638), SIMDE_BFLOAT16_VALUE( 42.445), SIMDE_BFLOAT16_VALUE( 81.230), SIMDE_BFLOAT16_VALUE( - 93.667) }, + { SIMDE_BFLOAT16_VALUE( - 90.629), SIMDE_BFLOAT16_VALUE( 12.454), SIMDE_BFLOAT16_VALUE( - 62.277), SIMDE_BFLOAT16_VALUE( 44.996), + SIMDE_BFLOAT16_VALUE( - 70.130), SIMDE_BFLOAT16_VALUE( 62.518), SIMDE_BFLOAT16_VALUE( - 77.188), SIMDE_BFLOAT16_VALUE( 84.320) }, + { SIMDE_BFLOAT16_VALUE( - 71.327), SIMDE_BFLOAT16_VALUE( 15.545), SIMDE_BFLOAT16_VALUE( - 81.861), SIMDE_BFLOAT16_VALUE( - 5.166), + SIMDE_BFLOAT16_VALUE( 77.928), SIMDE_BFLOAT16_VALUE( 24.877), SIMDE_BFLOAT16_VALUE( 90.124), SIMDE_BFLOAT16_VALUE( 77.249) } }, + { SIMDE_BFLOAT16_VALUE( 29.494), SIMDE_BFLOAT16_VALUE( - 56.304), SIMDE_BFLOAT16_VALUE( 67.254), SIMDE_BFLOAT16_VALUE( - 54.309), + SIMDE_BFLOAT16_VALUE( 34.087), SIMDE_BFLOAT16_VALUE( 62.655), SIMDE_BFLOAT16_VALUE( 4.600), SIMDE_BFLOAT16_VALUE( 82.017), + SIMDE_BFLOAT16_VALUE( 78.796), SIMDE_BFLOAT16_VALUE( 85.632), SIMDE_BFLOAT16_VALUE( 35.246), SIMDE_BFLOAT16_VALUE( - 37.467), + SIMDE_BFLOAT16_VALUE( - 62.638), SIMDE_BFLOAT16_VALUE( 42.445), SIMDE_BFLOAT16_VALUE( 81.230), SIMDE_BFLOAT16_VALUE( - 93.667), + SIMDE_BFLOAT16_VALUE( - 90.629), SIMDE_BFLOAT16_VALUE( 12.454), SIMDE_BFLOAT16_VALUE( - 62.277), SIMDE_BFLOAT16_VALUE( 44.996), + SIMDE_BFLOAT16_VALUE( - 70.130), SIMDE_BFLOAT16_VALUE( 62.518), SIMDE_BFLOAT16_VALUE( - 77.188), SIMDE_BFLOAT16_VALUE( 84.320), + SIMDE_BFLOAT16_VALUE( - 71.327), SIMDE_BFLOAT16_VALUE( 15.545), SIMDE_BFLOAT16_VALUE( - 81.861), SIMDE_BFLOAT16_VALUE( - 5.166), + SIMDE_BFLOAT16_VALUE( 77.928), SIMDE_BFLOAT16_VALUE( 24.877), SIMDE_BFLOAT16_VALUE( 90.124), SIMDE_BFLOAT16_VALUE( 77.249) } }, + { { { SIMDE_BFLOAT16_VALUE( 68.706), SIMDE_BFLOAT16_VALUE( 43.754), SIMDE_BFLOAT16_VALUE( 33.900), SIMDE_BFLOAT16_VALUE( - 54.873), + SIMDE_BFLOAT16_VALUE( 32.555), SIMDE_BFLOAT16_VALUE( - 92.535), SIMDE_BFLOAT16_VALUE( 86.201), SIMDE_BFLOAT16_VALUE( - 78.143) }, + { SIMDE_BFLOAT16_VALUE( 89.252), SIMDE_BFLOAT16_VALUE( 0.337), SIMDE_BFLOAT16_VALUE( - 2.470), SIMDE_BFLOAT16_VALUE( 87.685), + SIMDE_BFLOAT16_VALUE( 1.848), SIMDE_BFLOAT16_VALUE( - 82.342), SIMDE_BFLOAT16_VALUE( 39.805), SIMDE_BFLOAT16_VALUE( - 50.227) }, + { SIMDE_BFLOAT16_VALUE( 68.212), SIMDE_BFLOAT16_VALUE( - 71.435), SIMDE_BFLOAT16_VALUE( - 92.714), SIMDE_BFLOAT16_VALUE( - 1.382), + SIMDE_BFLOAT16_VALUE( - 97.050), SIMDE_BFLOAT16_VALUE( 5.653), SIMDE_BFLOAT16_VALUE( 73.429), SIMDE_BFLOAT16_VALUE( - 41.560) }, + { SIMDE_BFLOAT16_VALUE( - 89.561), SIMDE_BFLOAT16_VALUE( - 97.387), SIMDE_BFLOAT16_VALUE( - 37.457), SIMDE_BFLOAT16_VALUE( 97.624), + SIMDE_BFLOAT16_VALUE( 54.484), SIMDE_BFLOAT16_VALUE( - 60.017), SIMDE_BFLOAT16_VALUE( 37.871), SIMDE_BFLOAT16_VALUE( - 10.636) } }, + { SIMDE_BFLOAT16_VALUE( 68.706), SIMDE_BFLOAT16_VALUE( 43.754), SIMDE_BFLOAT16_VALUE( 33.900), SIMDE_BFLOAT16_VALUE( - 54.873), + SIMDE_BFLOAT16_VALUE( 32.555), SIMDE_BFLOAT16_VALUE( - 92.535), SIMDE_BFLOAT16_VALUE( 86.201), SIMDE_BFLOAT16_VALUE( - 78.143), + SIMDE_BFLOAT16_VALUE( 89.252), SIMDE_BFLOAT16_VALUE( 0.337), SIMDE_BFLOAT16_VALUE( - 2.470), SIMDE_BFLOAT16_VALUE( 87.685), + SIMDE_BFLOAT16_VALUE( 1.848), SIMDE_BFLOAT16_VALUE( - 82.342), SIMDE_BFLOAT16_VALUE( 39.805), SIMDE_BFLOAT16_VALUE( - 50.227), + SIMDE_BFLOAT16_VALUE( 68.212), SIMDE_BFLOAT16_VALUE( - 71.435), SIMDE_BFLOAT16_VALUE( - 92.714), SIMDE_BFLOAT16_VALUE( - 1.382), + SIMDE_BFLOAT16_VALUE( - 97.050), SIMDE_BFLOAT16_VALUE( 5.653), SIMDE_BFLOAT16_VALUE( 73.429), SIMDE_BFLOAT16_VALUE( - 41.560), + SIMDE_BFLOAT16_VALUE( - 89.561), SIMDE_BFLOAT16_VALUE( - 97.387), SIMDE_BFLOAT16_VALUE( - 37.457), SIMDE_BFLOAT16_VALUE( 97.624), + SIMDE_BFLOAT16_VALUE( 54.484), SIMDE_BFLOAT16_VALUE( - 60.017), SIMDE_BFLOAT16_VALUE( 37.871), SIMDE_BFLOAT16_VALUE( - 10.636) } }, + { { { SIMDE_BFLOAT16_VALUE( - 16.854), SIMDE_BFLOAT16_VALUE( - 55.538), SIMDE_BFLOAT16_VALUE( 51.151), SIMDE_BFLOAT16_VALUE( 14.679), + SIMDE_BFLOAT16_VALUE( 66.667), SIMDE_BFLOAT16_VALUE( - 91.282), SIMDE_BFLOAT16_VALUE( - 61.208), SIMDE_BFLOAT16_VALUE( - 94.220) }, + { SIMDE_BFLOAT16_VALUE( 49.161), SIMDE_BFLOAT16_VALUE( - 46.703), SIMDE_BFLOAT16_VALUE( 2.994), SIMDE_BFLOAT16_VALUE( 49.628), + SIMDE_BFLOAT16_VALUE( - 12.308), SIMDE_BFLOAT16_VALUE( - 25.366), SIMDE_BFLOAT16_VALUE( 65.516), SIMDE_BFLOAT16_VALUE( 69.138) }, + { SIMDE_BFLOAT16_VALUE( 97.529), SIMDE_BFLOAT16_VALUE( 3.577), SIMDE_BFLOAT16_VALUE( - 60.264), SIMDE_BFLOAT16_VALUE( 14.990), + SIMDE_BFLOAT16_VALUE( - 75.640), SIMDE_BFLOAT16_VALUE( 40.417), SIMDE_BFLOAT16_VALUE( 85.723), SIMDE_BFLOAT16_VALUE( - 53.491) }, + { SIMDE_BFLOAT16_VALUE( 98.333), SIMDE_BFLOAT16_VALUE( - 14.058), SIMDE_BFLOAT16_VALUE( - 92.582), SIMDE_BFLOAT16_VALUE( 76.277), + SIMDE_BFLOAT16_VALUE( 28.806), SIMDE_BFLOAT16_VALUE( 9.371), SIMDE_BFLOAT16_VALUE( - 61.503), SIMDE_BFLOAT16_VALUE( 26.682) } }, + { SIMDE_BFLOAT16_VALUE( - 16.854), SIMDE_BFLOAT16_VALUE( - 55.538), SIMDE_BFLOAT16_VALUE( 51.151), SIMDE_BFLOAT16_VALUE( 14.679), + SIMDE_BFLOAT16_VALUE( 66.667), SIMDE_BFLOAT16_VALUE( - 91.282), SIMDE_BFLOAT16_VALUE( - 61.208), SIMDE_BFLOAT16_VALUE( - 94.220), + SIMDE_BFLOAT16_VALUE( 49.161), SIMDE_BFLOAT16_VALUE( - 46.703), SIMDE_BFLOAT16_VALUE( 2.994), SIMDE_BFLOAT16_VALUE( 49.628), + SIMDE_BFLOAT16_VALUE( - 12.308), SIMDE_BFLOAT16_VALUE( - 25.366), SIMDE_BFLOAT16_VALUE( 65.516), SIMDE_BFLOAT16_VALUE( 69.138), + SIMDE_BFLOAT16_VALUE( 97.529), SIMDE_BFLOAT16_VALUE( 3.577), SIMDE_BFLOAT16_VALUE( - 60.264), SIMDE_BFLOAT16_VALUE( 14.990), + SIMDE_BFLOAT16_VALUE( - 75.640), SIMDE_BFLOAT16_VALUE( 40.417), SIMDE_BFLOAT16_VALUE( 85.723), SIMDE_BFLOAT16_VALUE( - 53.491), + SIMDE_BFLOAT16_VALUE( 98.333), SIMDE_BFLOAT16_VALUE( - 14.058), SIMDE_BFLOAT16_VALUE( - 92.582), SIMDE_BFLOAT16_VALUE( 76.277), + SIMDE_BFLOAT16_VALUE( 28.806), SIMDE_BFLOAT16_VALUE( 9.371), SIMDE_BFLOAT16_VALUE( - 61.503), SIMDE_BFLOAT16_VALUE( 26.682) } }, + { { { SIMDE_BFLOAT16_VALUE( - 64.940), SIMDE_BFLOAT16_VALUE( 10.855), SIMDE_BFLOAT16_VALUE( 13.588), SIMDE_BFLOAT16_VALUE( - 42.166), + SIMDE_BFLOAT16_VALUE( 37.677), SIMDE_BFLOAT16_VALUE( 54.544), SIMDE_BFLOAT16_VALUE( - 41.338), SIMDE_BFLOAT16_VALUE( 54.156) }, + { SIMDE_BFLOAT16_VALUE( - 96.818), SIMDE_BFLOAT16_VALUE( 38.055), SIMDE_BFLOAT16_VALUE( - 67.285), SIMDE_BFLOAT16_VALUE( 34.219), + SIMDE_BFLOAT16_VALUE( 31.020), SIMDE_BFLOAT16_VALUE( 7.521), SIMDE_BFLOAT16_VALUE( - 27.190), SIMDE_BFLOAT16_VALUE( - 93.042) }, + { SIMDE_BFLOAT16_VALUE( - 35.381), SIMDE_BFLOAT16_VALUE( 50.805), SIMDE_BFLOAT16_VALUE( - 16.495), SIMDE_BFLOAT16_VALUE( - 19.288), + SIMDE_BFLOAT16_VALUE( 36.437), SIMDE_BFLOAT16_VALUE( - 75.663), SIMDE_BFLOAT16_VALUE( - 62.035), SIMDE_BFLOAT16_VALUE( 94.778) }, + { SIMDE_BFLOAT16_VALUE( - 77.789), SIMDE_BFLOAT16_VALUE( 86.230), SIMDE_BFLOAT16_VALUE( 21.458), SIMDE_BFLOAT16_VALUE( - 76.976), + SIMDE_BFLOAT16_VALUE( 59.077), SIMDE_BFLOAT16_VALUE( - 13.310), SIMDE_BFLOAT16_VALUE( - 38.537), SIMDE_BFLOAT16_VALUE( 85.016) } }, + { SIMDE_BFLOAT16_VALUE( - 64.940), SIMDE_BFLOAT16_VALUE( 10.855), SIMDE_BFLOAT16_VALUE( 13.588), SIMDE_BFLOAT16_VALUE( - 42.166), + SIMDE_BFLOAT16_VALUE( 37.677), SIMDE_BFLOAT16_VALUE( 54.544), SIMDE_BFLOAT16_VALUE( - 41.338), SIMDE_BFLOAT16_VALUE( 54.156), + SIMDE_BFLOAT16_VALUE( - 96.818), SIMDE_BFLOAT16_VALUE( 38.055), SIMDE_BFLOAT16_VALUE( - 67.285), SIMDE_BFLOAT16_VALUE( 34.219), + SIMDE_BFLOAT16_VALUE( 31.020), SIMDE_BFLOAT16_VALUE( 7.521), SIMDE_BFLOAT16_VALUE( - 27.190), SIMDE_BFLOAT16_VALUE( - 93.042), + SIMDE_BFLOAT16_VALUE( - 35.381), SIMDE_BFLOAT16_VALUE( 50.805), SIMDE_BFLOAT16_VALUE( - 16.495), SIMDE_BFLOAT16_VALUE( - 19.288), + SIMDE_BFLOAT16_VALUE( 36.437), SIMDE_BFLOAT16_VALUE( - 75.663), SIMDE_BFLOAT16_VALUE( - 62.035), SIMDE_BFLOAT16_VALUE( 94.778), + SIMDE_BFLOAT16_VALUE( - 77.789), SIMDE_BFLOAT16_VALUE( 86.230), SIMDE_BFLOAT16_VALUE( 21.458), SIMDE_BFLOAT16_VALUE( - 76.976), + SIMDE_BFLOAT16_VALUE( 59.077), SIMDE_BFLOAT16_VALUE( - 13.310), SIMDE_BFLOAT16_VALUE( - 38.537), SIMDE_BFLOAT16_VALUE( 85.016) } }, + { { { SIMDE_BFLOAT16_VALUE( - 16.344), SIMDE_BFLOAT16_VALUE( 61.588), SIMDE_BFLOAT16_VALUE( 49.037), SIMDE_BFLOAT16_VALUE( 45.929), + SIMDE_BFLOAT16_VALUE( 40.688), SIMDE_BFLOAT16_VALUE( - 27.802), SIMDE_BFLOAT16_VALUE( 27.455), SIMDE_BFLOAT16_VALUE( 93.667) }, + { SIMDE_BFLOAT16_VALUE( - 65.739), SIMDE_BFLOAT16_VALUE( 98.667), SIMDE_BFLOAT16_VALUE( - 77.640), SIMDE_BFLOAT16_VALUE( 19.827), + SIMDE_BFLOAT16_VALUE( 11.358), SIMDE_BFLOAT16_VALUE( - 21.520), SIMDE_BFLOAT16_VALUE( - 71.888), SIMDE_BFLOAT16_VALUE( 29.715) }, + { SIMDE_BFLOAT16_VALUE( 3.421), SIMDE_BFLOAT16_VALUE( - 85.829), SIMDE_BFLOAT16_VALUE( 42.144), SIMDE_BFLOAT16_VALUE( 52.252), + SIMDE_BFLOAT16_VALUE( - 34.443), SIMDE_BFLOAT16_VALUE( - 81.291), SIMDE_BFLOAT16_VALUE( - 35.565), SIMDE_BFLOAT16_VALUE( - 95.472) }, + { SIMDE_BFLOAT16_VALUE( - 51.527), SIMDE_BFLOAT16_VALUE( - 14.435), SIMDE_BFLOAT16_VALUE( 81.290), SIMDE_BFLOAT16_VALUE( 98.495), + SIMDE_BFLOAT16_VALUE( 41.063), SIMDE_BFLOAT16_VALUE( - 8.915), SIMDE_BFLOAT16_VALUE( - 77.131), SIMDE_BFLOAT16_VALUE( - 97.806) } }, + { SIMDE_BFLOAT16_VALUE( - 16.344), SIMDE_BFLOAT16_VALUE( 61.588), SIMDE_BFLOAT16_VALUE( 49.037), SIMDE_BFLOAT16_VALUE( 45.929), + SIMDE_BFLOAT16_VALUE( 40.688), SIMDE_BFLOAT16_VALUE( - 27.802), SIMDE_BFLOAT16_VALUE( 27.455), SIMDE_BFLOAT16_VALUE( 93.667), + SIMDE_BFLOAT16_VALUE( - 65.739), SIMDE_BFLOAT16_VALUE( 98.667), SIMDE_BFLOAT16_VALUE( - 77.640), SIMDE_BFLOAT16_VALUE( 19.827), + SIMDE_BFLOAT16_VALUE( 11.358), SIMDE_BFLOAT16_VALUE( - 21.520), SIMDE_BFLOAT16_VALUE( - 71.888), SIMDE_BFLOAT16_VALUE( 29.715), + SIMDE_BFLOAT16_VALUE( 3.421), SIMDE_BFLOAT16_VALUE( - 85.829), SIMDE_BFLOAT16_VALUE( 42.144), SIMDE_BFLOAT16_VALUE( 52.252), + SIMDE_BFLOAT16_VALUE( - 34.443), SIMDE_BFLOAT16_VALUE( - 81.291), SIMDE_BFLOAT16_VALUE( - 35.565), SIMDE_BFLOAT16_VALUE( - 95.472), + SIMDE_BFLOAT16_VALUE( - 51.527), SIMDE_BFLOAT16_VALUE( - 14.435), SIMDE_BFLOAT16_VALUE( 81.290), SIMDE_BFLOAT16_VALUE( 98.495), + SIMDE_BFLOAT16_VALUE( 41.063), SIMDE_BFLOAT16_VALUE( - 8.915), SIMDE_BFLOAT16_VALUE( - 77.131), SIMDE_BFLOAT16_VALUE( - 97.806) } }, + { { { SIMDE_BFLOAT16_VALUE( - 38.560), SIMDE_BFLOAT16_VALUE( - 8.666), SIMDE_BFLOAT16_VALUE( - 83.413), SIMDE_BFLOAT16_VALUE( 36.428), + SIMDE_BFLOAT16_VALUE( 95.115), SIMDE_BFLOAT16_VALUE( - 54.473), SIMDE_BFLOAT16_VALUE( - 54.310), SIMDE_BFLOAT16_VALUE( 9.862) }, + { SIMDE_BFLOAT16_VALUE( - 43.918), SIMDE_BFLOAT16_VALUE( 65.519), SIMDE_BFLOAT16_VALUE( 33.255), SIMDE_BFLOAT16_VALUE( - 76.838), + SIMDE_BFLOAT16_VALUE( 32.376), SIMDE_BFLOAT16_VALUE( 88.754), SIMDE_BFLOAT16_VALUE( - 99.571), SIMDE_BFLOAT16_VALUE( 97.359) }, + { SIMDE_BFLOAT16_VALUE( 0.759), SIMDE_BFLOAT16_VALUE( 63.569), SIMDE_BFLOAT16_VALUE( - 74.335), SIMDE_BFLOAT16_VALUE( - 84.602), + SIMDE_BFLOAT16_VALUE( 72.495), SIMDE_BFLOAT16_VALUE( - 60.829), SIMDE_BFLOAT16_VALUE( - 29.063), SIMDE_BFLOAT16_VALUE( - 66.901) }, + { SIMDE_BFLOAT16_VALUE( - 68.887), SIMDE_BFLOAT16_VALUE( - 41.060), SIMDE_BFLOAT16_VALUE( 36.083), SIMDE_BFLOAT16_VALUE( - 79.810), + SIMDE_BFLOAT16_VALUE( 51.686), SIMDE_BFLOAT16_VALUE( - 67.010), SIMDE_BFLOAT16_VALUE( 29.773), SIMDE_BFLOAT16_VALUE( 23.022) } }, + { SIMDE_BFLOAT16_VALUE( - 38.560), SIMDE_BFLOAT16_VALUE( - 8.666), SIMDE_BFLOAT16_VALUE( - 83.413), SIMDE_BFLOAT16_VALUE( 36.428), + SIMDE_BFLOAT16_VALUE( 95.115), SIMDE_BFLOAT16_VALUE( - 54.473), SIMDE_BFLOAT16_VALUE( - 54.310), SIMDE_BFLOAT16_VALUE( 9.862), + SIMDE_BFLOAT16_VALUE( - 43.918), SIMDE_BFLOAT16_VALUE( 65.519), SIMDE_BFLOAT16_VALUE( 33.255), SIMDE_BFLOAT16_VALUE( - 76.838), + SIMDE_BFLOAT16_VALUE( 32.376), SIMDE_BFLOAT16_VALUE( 88.754), SIMDE_BFLOAT16_VALUE( - 99.571), SIMDE_BFLOAT16_VALUE( 97.359), + SIMDE_BFLOAT16_VALUE( 0.759), SIMDE_BFLOAT16_VALUE( 63.569), SIMDE_BFLOAT16_VALUE( - 74.335), SIMDE_BFLOAT16_VALUE( - 84.602), + SIMDE_BFLOAT16_VALUE( 72.495), SIMDE_BFLOAT16_VALUE( - 60.829), SIMDE_BFLOAT16_VALUE( - 29.063), SIMDE_BFLOAT16_VALUE( - 66.901), + SIMDE_BFLOAT16_VALUE( - 68.887), SIMDE_BFLOAT16_VALUE( - 41.060), SIMDE_BFLOAT16_VALUE( 36.083), SIMDE_BFLOAT16_VALUE( - 79.810), + SIMDE_BFLOAT16_VALUE( 51.686), SIMDE_BFLOAT16_VALUE( - 67.010), SIMDE_BFLOAT16_VALUE( 29.773), SIMDE_BFLOAT16_VALUE( 23.022) } }, + { { { SIMDE_BFLOAT16_VALUE( - 99.229), SIMDE_BFLOAT16_VALUE( 33.337), SIMDE_BFLOAT16_VALUE( - 34.145), SIMDE_BFLOAT16_VALUE( - 18.231), + SIMDE_BFLOAT16_VALUE( - 6.066), SIMDE_BFLOAT16_VALUE( 62.125), SIMDE_BFLOAT16_VALUE( - 30.190), SIMDE_BFLOAT16_VALUE( 93.279) }, + { SIMDE_BFLOAT16_VALUE( - 4.053), SIMDE_BFLOAT16_VALUE( - 16.454), SIMDE_BFLOAT16_VALUE( 43.954), SIMDE_BFLOAT16_VALUE( - 0.170), + SIMDE_BFLOAT16_VALUE( 20.261), SIMDE_BFLOAT16_VALUE( 4.405), SIMDE_BFLOAT16_VALUE( 67.841), SIMDE_BFLOAT16_VALUE( - 94.517) }, + { SIMDE_BFLOAT16_VALUE( - 12.337), SIMDE_BFLOAT16_VALUE( 41.336), SIMDE_BFLOAT16_VALUE( - 44.534), SIMDE_BFLOAT16_VALUE( - 99.256), + SIMDE_BFLOAT16_VALUE( 33.547), SIMDE_BFLOAT16_VALUE( - 71.183), SIMDE_BFLOAT16_VALUE( - 76.108), SIMDE_BFLOAT16_VALUE( - 9.130) }, + { SIMDE_BFLOAT16_VALUE( 36.006), SIMDE_BFLOAT16_VALUE( 42.039), SIMDE_BFLOAT16_VALUE( 31.550), SIMDE_BFLOAT16_VALUE( 33.704), + SIMDE_BFLOAT16_VALUE( - 41.349), SIMDE_BFLOAT16_VALUE( - 86.501), SIMDE_BFLOAT16_VALUE( 55.249), SIMDE_BFLOAT16_VALUE( 80.615) } }, + { SIMDE_BFLOAT16_VALUE( - 99.229), SIMDE_BFLOAT16_VALUE( 33.337), SIMDE_BFLOAT16_VALUE( - 34.145), SIMDE_BFLOAT16_VALUE( - 18.231), + SIMDE_BFLOAT16_VALUE( - 6.066), SIMDE_BFLOAT16_VALUE( 62.125), SIMDE_BFLOAT16_VALUE( - 30.190), SIMDE_BFLOAT16_VALUE( 93.279), + SIMDE_BFLOAT16_VALUE( - 4.053), SIMDE_BFLOAT16_VALUE( - 16.454), SIMDE_BFLOAT16_VALUE( 43.954), SIMDE_BFLOAT16_VALUE( - 0.170), + SIMDE_BFLOAT16_VALUE( 20.261), SIMDE_BFLOAT16_VALUE( 4.405), SIMDE_BFLOAT16_VALUE( 67.841), SIMDE_BFLOAT16_VALUE( - 94.517), + SIMDE_BFLOAT16_VALUE( - 12.337), SIMDE_BFLOAT16_VALUE( 41.336), SIMDE_BFLOAT16_VALUE( - 44.534), SIMDE_BFLOAT16_VALUE( - 99.256), + SIMDE_BFLOAT16_VALUE( 33.547), SIMDE_BFLOAT16_VALUE( - 71.183), SIMDE_BFLOAT16_VALUE( - 76.108), SIMDE_BFLOAT16_VALUE( - 9.130), + SIMDE_BFLOAT16_VALUE( 36.006), SIMDE_BFLOAT16_VALUE( 42.039), SIMDE_BFLOAT16_VALUE( 31.550), SIMDE_BFLOAT16_VALUE( 33.704), + SIMDE_BFLOAT16_VALUE( - 41.349), SIMDE_BFLOAT16_VALUE( - 86.501), SIMDE_BFLOAT16_VALUE( 55.249), SIMDE_BFLOAT16_VALUE( 80.615) } }, + }; + + for (size_t i = 0; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + simde_bfloat16x8x4_t val = {{ + simde_vld1q_bf16(test_vec[i].val[0]), + simde_vld1q_bf16(test_vec[i].val[1]), + simde_vld1q_bf16(test_vec[i].val[2]), + simde_vld1q_bf16(test_vec[i].val[3]), + }}; + simde_bfloat16 r_[32]; + simde_vst1q_bf16_x4(r_, val); + simde_assert_equal_i(0, simde_memcmp(r_, test_vec[i].r, sizeof(test_vec[i].r))); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_bfloat16x4_t val[4] = simde_test_arm_neon_random_bf16x4(-100.0f, 100.0f); + simde_bfloat16x32_t r = simde_vst1q_bf16_x4(val[4]); + + simde_test_arm_neon_write_bf16x4(2, val[4], SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x32(2, r, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -1915,6 +2079,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vst1q_u64_x4) SIMDE_TEST_FUNC_LIST_ENTRY(vst1q_p8_x4) SIMDE_TEST_FUNC_LIST_ENTRY(vst1q_p16_x4) SIMDE_TEST_FUNC_LIST_ENTRY(vst1q_p64_x4) +SIMDE_TEST_FUNC_LIST_ENTRY(vst1q_bf16_x4) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/st2.c b/test/arm/neon/st2.c index 7b8f42d49..8f8cdc0da 100644 --- a/test/arm/neon/st2.c +++ b/test/arm/neon/st2.c @@ -1947,6 +1947,110 @@ test_simde_vst2q_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vst2_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16 r0[4]; + simde_bfloat16 r1[4]; + simde_bfloat16 a[8]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(-4.40), SIMDE_BFLOAT16_VALUE(6.50), SIMDE_BFLOAT16_VALUE(-1.60), SIMDE_BFLOAT16_VALUE(5.90) }, + { SIMDE_BFLOAT16_VALUE(1.60), SIMDE_BFLOAT16_VALUE(-0.50), SIMDE_BFLOAT16_VALUE(0.90), SIMDE_BFLOAT16_VALUE(-6.80) }, + { SIMDE_BFLOAT16_VALUE(-4.40), SIMDE_BFLOAT16_VALUE(1.60), SIMDE_BFLOAT16_VALUE(6.50), SIMDE_BFLOAT16_VALUE(-0.50), SIMDE_BFLOAT16_VALUE(-1.60), SIMDE_BFLOAT16_VALUE(0.90), SIMDE_BFLOAT16_VALUE(5.90), SIMDE_BFLOAT16_VALUE(-6.80) } }, + { { SIMDE_BFLOAT16_VALUE(-1.50), SIMDE_BFLOAT16_VALUE(-2.80), SIMDE_BFLOAT16_VALUE(5.20), SIMDE_BFLOAT16_VALUE(1.50) }, + { SIMDE_BFLOAT16_VALUE(2.60), SIMDE_BFLOAT16_VALUE(4.80), SIMDE_BFLOAT16_VALUE(3.20), SIMDE_BFLOAT16_VALUE(8.90) }, + { SIMDE_BFLOAT16_VALUE(-1.50), SIMDE_BFLOAT16_VALUE(2.60), SIMDE_BFLOAT16_VALUE(-2.80), SIMDE_BFLOAT16_VALUE(4.80), SIMDE_BFLOAT16_VALUE(5.20), SIMDE_BFLOAT16_VALUE(3.20), SIMDE_BFLOAT16_VALUE(1.50), SIMDE_BFLOAT16_VALUE(8.90) } }, + { { SIMDE_BFLOAT16_VALUE(-1.10), SIMDE_BFLOAT16_VALUE(-7.60), SIMDE_BFLOAT16_VALUE(-4.60), SIMDE_BFLOAT16_VALUE(0.20) }, + { SIMDE_BFLOAT16_VALUE(-2.60), SIMDE_BFLOAT16_VALUE(7.70), SIMDE_BFLOAT16_VALUE(-0.80), SIMDE_BFLOAT16_VALUE(5.00) }, + { SIMDE_BFLOAT16_VALUE(-1.10), SIMDE_BFLOAT16_VALUE(-2.60), SIMDE_BFLOAT16_VALUE(-7.60), SIMDE_BFLOAT16_VALUE(7.70), SIMDE_BFLOAT16_VALUE(-4.60), SIMDE_BFLOAT16_VALUE(-0.80), SIMDE_BFLOAT16_VALUE(0.20), SIMDE_BFLOAT16_VALUE(5.00) } }, + { { SIMDE_BFLOAT16_VALUE(-8.60), SIMDE_BFLOAT16_VALUE(-9.10), SIMDE_BFLOAT16_VALUE(2.90), SIMDE_BFLOAT16_VALUE(5.60) }, + { SIMDE_BFLOAT16_VALUE(-3.60), SIMDE_BFLOAT16_VALUE(-3.30), SIMDE_BFLOAT16_VALUE(2.20), SIMDE_BFLOAT16_VALUE(-6.00) }, + { SIMDE_BFLOAT16_VALUE(-8.60), SIMDE_BFLOAT16_VALUE(-3.60), SIMDE_BFLOAT16_VALUE(-9.10), SIMDE_BFLOAT16_VALUE(-3.30), SIMDE_BFLOAT16_VALUE(2.90), SIMDE_BFLOAT16_VALUE(2.20), SIMDE_BFLOAT16_VALUE(5.60), SIMDE_BFLOAT16_VALUE(-6.00) } }, + { { SIMDE_BFLOAT16_VALUE(-5.00), SIMDE_BFLOAT16_VALUE(-9.70), SIMDE_BFLOAT16_VALUE(-6.50), SIMDE_BFLOAT16_VALUE(-2.80) }, + { SIMDE_BFLOAT16_VALUE(0.70), SIMDE_BFLOAT16_VALUE(-9.40), SIMDE_BFLOAT16_VALUE(-5.20), SIMDE_BFLOAT16_VALUE(-2.80) }, + { SIMDE_BFLOAT16_VALUE(-5.00), SIMDE_BFLOAT16_VALUE(0.70), SIMDE_BFLOAT16_VALUE(-9.70), SIMDE_BFLOAT16_VALUE(-9.40), SIMDE_BFLOAT16_VALUE(-6.50), SIMDE_BFLOAT16_VALUE(-5.20), SIMDE_BFLOAT16_VALUE(-2.80), SIMDE_BFLOAT16_VALUE(-2.80) } }, + { { SIMDE_BFLOAT16_VALUE(-2.20), SIMDE_BFLOAT16_VALUE(-9.90), SIMDE_BFLOAT16_VALUE(-2.50), SIMDE_BFLOAT16_VALUE(-7.40) }, + { SIMDE_BFLOAT16_VALUE(-6.10), SIMDE_BFLOAT16_VALUE(4.40), SIMDE_BFLOAT16_VALUE(10.00), SIMDE_BFLOAT16_VALUE(9.20) }, + { SIMDE_BFLOAT16_VALUE(-2.20), SIMDE_BFLOAT16_VALUE(-6.10), SIMDE_BFLOAT16_VALUE(-9.90), SIMDE_BFLOAT16_VALUE(4.40), SIMDE_BFLOAT16_VALUE(-2.50), SIMDE_BFLOAT16_VALUE(10.00), SIMDE_BFLOAT16_VALUE(-7.40), SIMDE_BFLOAT16_VALUE(9.20) } }, + { { SIMDE_BFLOAT16_VALUE(1.20), SIMDE_BFLOAT16_VALUE(-2.30), SIMDE_BFLOAT16_VALUE(-3.50), SIMDE_BFLOAT16_VALUE(-0.90) }, + { SIMDE_BFLOAT16_VALUE(-3.70), SIMDE_BFLOAT16_VALUE(-0.50), SIMDE_BFLOAT16_VALUE(-5.50), SIMDE_BFLOAT16_VALUE(7.30) }, + { SIMDE_BFLOAT16_VALUE(1.20), SIMDE_BFLOAT16_VALUE(-3.70), SIMDE_BFLOAT16_VALUE(-2.30), SIMDE_BFLOAT16_VALUE(-0.50), SIMDE_BFLOAT16_VALUE(-3.50), SIMDE_BFLOAT16_VALUE(-5.50), SIMDE_BFLOAT16_VALUE(-0.90), SIMDE_BFLOAT16_VALUE(7.30) } }, + { { SIMDE_BFLOAT16_VALUE(-8.40), SIMDE_BFLOAT16_VALUE(-2.50), SIMDE_BFLOAT16_VALUE(-0.60), SIMDE_BFLOAT16_VALUE(0.20) }, + { SIMDE_BFLOAT16_VALUE(-1.70), SIMDE_BFLOAT16_VALUE(-3.70), SIMDE_BFLOAT16_VALUE(8.20), SIMDE_BFLOAT16_VALUE(4.20) }, + { SIMDE_BFLOAT16_VALUE(-8.40), SIMDE_BFLOAT16_VALUE(-1.70), SIMDE_BFLOAT16_VALUE(-2.50), SIMDE_BFLOAT16_VALUE(-3.70), SIMDE_BFLOAT16_VALUE(-0.60), SIMDE_BFLOAT16_VALUE(8.20), SIMDE_BFLOAT16_VALUE(0.20), SIMDE_BFLOAT16_VALUE(4.20) } }, + { { SIMDE_BFLOAT16_VALUE(-5.00), SIMDE_BFLOAT16_VALUE(8.80), SIMDE_BFLOAT16_VALUE(5.50), SIMDE_BFLOAT16_VALUE(-7.90) }, + { SIMDE_BFLOAT16_VALUE(-6.00), SIMDE_BFLOAT16_VALUE(-7.30), SIMDE_BFLOAT16_VALUE(9.30), SIMDE_BFLOAT16_VALUE(9.30) }, + { SIMDE_BFLOAT16_VALUE(-5.00), SIMDE_BFLOAT16_VALUE(-6.00), SIMDE_BFLOAT16_VALUE(8.80), SIMDE_BFLOAT16_VALUE(-7.30), SIMDE_BFLOAT16_VALUE(5.50), SIMDE_BFLOAT16_VALUE(9.30), SIMDE_BFLOAT16_VALUE(-7.90), SIMDE_BFLOAT16_VALUE(9.30) } }, + { { SIMDE_BFLOAT16_VALUE(-9.70), SIMDE_BFLOAT16_VALUE(-3.10), SIMDE_BFLOAT16_VALUE(-7.50), SIMDE_BFLOAT16_VALUE(9.60) }, + { SIMDE_BFLOAT16_VALUE(5.00), SIMDE_BFLOAT16_VALUE(-5.00), SIMDE_BFLOAT16_VALUE(-3.40), SIMDE_BFLOAT16_VALUE(0.40) }, + { SIMDE_BFLOAT16_VALUE(-9.70), SIMDE_BFLOAT16_VALUE(5.00), SIMDE_BFLOAT16_VALUE(-3.10), SIMDE_BFLOAT16_VALUE(-5.00), SIMDE_BFLOAT16_VALUE(-7.50), SIMDE_BFLOAT16_VALUE(-3.40), SIMDE_BFLOAT16_VALUE(9.60), SIMDE_BFLOAT16_VALUE(0.40) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4x2_t r_ = { { simde_vld1_bf16(test_vec[i].r0), + simde_vld1_bf16(test_vec[i].r1) } }; + + simde_bfloat16 a_[8]; + simde_vst2_bf16(a_, r_); + + simde_assert_equal_i(0, simde_memcmp(a_, test_vec[i].a, sizeof(test_vec[i].a))); + } + + return 0; +} + +static int +test_simde_vst2q_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16 r0[8]; + simde_bfloat16 r1[8]; + simde_bfloat16 a[16]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE(1.20), SIMDE_BFLOAT16_VALUE(-2.10), SIMDE_BFLOAT16_VALUE(-5.20), SIMDE_BFLOAT16_VALUE(6.00), SIMDE_BFLOAT16_VALUE(-2.60), SIMDE_BFLOAT16_VALUE(-7.50), SIMDE_BFLOAT16_VALUE(-0.90), SIMDE_BFLOAT16_VALUE(-2.10) }, + { SIMDE_BFLOAT16_VALUE(-5.90), SIMDE_BFLOAT16_VALUE(-2.10), SIMDE_BFLOAT16_VALUE(6.50), SIMDE_BFLOAT16_VALUE(9.60), SIMDE_BFLOAT16_VALUE(4.80), SIMDE_BFLOAT16_VALUE(-8.70), SIMDE_BFLOAT16_VALUE(0.20), SIMDE_BFLOAT16_VALUE(-5.80) }, + { SIMDE_BFLOAT16_VALUE(1.20), SIMDE_BFLOAT16_VALUE(-5.90), SIMDE_BFLOAT16_VALUE(-2.10), SIMDE_BFLOAT16_VALUE(-2.10), SIMDE_BFLOAT16_VALUE(-5.20), SIMDE_BFLOAT16_VALUE(6.50), SIMDE_BFLOAT16_VALUE(6.00), SIMDE_BFLOAT16_VALUE(9.60), SIMDE_BFLOAT16_VALUE(-2.60), SIMDE_BFLOAT16_VALUE(4.80), SIMDE_BFLOAT16_VALUE(-7.50), SIMDE_BFLOAT16_VALUE(-8.70), SIMDE_BFLOAT16_VALUE(-0.90), SIMDE_BFLOAT16_VALUE(0.20), SIMDE_BFLOAT16_VALUE(-2.10), SIMDE_BFLOAT16_VALUE(-5.80) } }, + { { SIMDE_BFLOAT16_VALUE(-6.80), SIMDE_BFLOAT16_VALUE(-7.90), SIMDE_BFLOAT16_VALUE(8.80), SIMDE_BFLOAT16_VALUE(-9.70), SIMDE_BFLOAT16_VALUE(5.20), SIMDE_BFLOAT16_VALUE(0.10), SIMDE_BFLOAT16_VALUE(7.60), SIMDE_BFLOAT16_VALUE(-9.80) }, + { SIMDE_BFLOAT16_VALUE(-6.70), SIMDE_BFLOAT16_VALUE(-7.30), SIMDE_BFLOAT16_VALUE(1.60), SIMDE_BFLOAT16_VALUE(8.00), SIMDE_BFLOAT16_VALUE(1.90), SIMDE_BFLOAT16_VALUE(3.70), SIMDE_BFLOAT16_VALUE(9.80), SIMDE_BFLOAT16_VALUE(-2.80) }, + { SIMDE_BFLOAT16_VALUE(-6.80), SIMDE_BFLOAT16_VALUE(-6.70), SIMDE_BFLOAT16_VALUE(-7.90), SIMDE_BFLOAT16_VALUE(-7.30), SIMDE_BFLOAT16_VALUE(8.80), SIMDE_BFLOAT16_VALUE(1.60), SIMDE_BFLOAT16_VALUE(-9.70), SIMDE_BFLOAT16_VALUE(8.00), SIMDE_BFLOAT16_VALUE(5.20), SIMDE_BFLOAT16_VALUE(1.90), SIMDE_BFLOAT16_VALUE(0.10), SIMDE_BFLOAT16_VALUE(3.70), SIMDE_BFLOAT16_VALUE(7.60), SIMDE_BFLOAT16_VALUE(9.80), SIMDE_BFLOAT16_VALUE(-9.80), SIMDE_BFLOAT16_VALUE(-2.80) } }, + { { SIMDE_BFLOAT16_VALUE(-9.70), SIMDE_BFLOAT16_VALUE(-4.90), SIMDE_BFLOAT16_VALUE(5.50), SIMDE_BFLOAT16_VALUE(6.70), SIMDE_BFLOAT16_VALUE(-8.90), SIMDE_BFLOAT16_VALUE(-8.90), SIMDE_BFLOAT16_VALUE(2.80), SIMDE_BFLOAT16_VALUE(3.90) }, + { SIMDE_BFLOAT16_VALUE(4.80), SIMDE_BFLOAT16_VALUE(-9.60), SIMDE_BFLOAT16_VALUE(6.10), SIMDE_BFLOAT16_VALUE(5.40), SIMDE_BFLOAT16_VALUE(-1.40), SIMDE_BFLOAT16_VALUE(-6.40), SIMDE_BFLOAT16_VALUE(0.40), SIMDE_BFLOAT16_VALUE(-0.70) }, + { SIMDE_BFLOAT16_VALUE(-9.70), SIMDE_BFLOAT16_VALUE(4.80), SIMDE_BFLOAT16_VALUE(-4.90), SIMDE_BFLOAT16_VALUE(-9.60), SIMDE_BFLOAT16_VALUE(5.50), SIMDE_BFLOAT16_VALUE(6.10), SIMDE_BFLOAT16_VALUE(6.70), SIMDE_BFLOAT16_VALUE(5.40), SIMDE_BFLOAT16_VALUE(-8.90), SIMDE_BFLOAT16_VALUE(-1.40), SIMDE_BFLOAT16_VALUE(-8.90), SIMDE_BFLOAT16_VALUE(-6.40), SIMDE_BFLOAT16_VALUE(2.80), SIMDE_BFLOAT16_VALUE(0.40), SIMDE_BFLOAT16_VALUE(3.90), SIMDE_BFLOAT16_VALUE(-0.70) } }, + { { SIMDE_BFLOAT16_VALUE(-2.70), SIMDE_BFLOAT16_VALUE(1.50), SIMDE_BFLOAT16_VALUE(3.30), SIMDE_BFLOAT16_VALUE(-7.40), SIMDE_BFLOAT16_VALUE(9.40), SIMDE_BFLOAT16_VALUE(2.10), SIMDE_BFLOAT16_VALUE(-2.00), SIMDE_BFLOAT16_VALUE(-9.90) }, + { SIMDE_BFLOAT16_VALUE(-3.80), SIMDE_BFLOAT16_VALUE(-0.20), SIMDE_BFLOAT16_VALUE(-5.50), SIMDE_BFLOAT16_VALUE(0.60), SIMDE_BFLOAT16_VALUE(0.50), SIMDE_BFLOAT16_VALUE(2.60), SIMDE_BFLOAT16_VALUE(7.90), SIMDE_BFLOAT16_VALUE(-6.80) }, + { SIMDE_BFLOAT16_VALUE(-2.70), SIMDE_BFLOAT16_VALUE(-3.80), SIMDE_BFLOAT16_VALUE(1.50), SIMDE_BFLOAT16_VALUE(-0.20), SIMDE_BFLOAT16_VALUE(3.30), SIMDE_BFLOAT16_VALUE(-5.50), SIMDE_BFLOAT16_VALUE(-7.40), SIMDE_BFLOAT16_VALUE(0.60), SIMDE_BFLOAT16_VALUE(9.40), SIMDE_BFLOAT16_VALUE(0.50), SIMDE_BFLOAT16_VALUE(2.10), SIMDE_BFLOAT16_VALUE(2.60), SIMDE_BFLOAT16_VALUE(-2.00), SIMDE_BFLOAT16_VALUE(7.90), SIMDE_BFLOAT16_VALUE(-9.90), SIMDE_BFLOAT16_VALUE(-6.80) } }, + { { SIMDE_BFLOAT16_VALUE(4.60), SIMDE_BFLOAT16_VALUE(9.20), SIMDE_BFLOAT16_VALUE(5.40), SIMDE_BFLOAT16_VALUE(-6.10), SIMDE_BFLOAT16_VALUE(-9.60), SIMDE_BFLOAT16_VALUE(2.10), SIMDE_BFLOAT16_VALUE(-5.10), SIMDE_BFLOAT16_VALUE(7.80) }, + { SIMDE_BFLOAT16_VALUE(0.90), SIMDE_BFLOAT16_VALUE(4.50), SIMDE_BFLOAT16_VALUE(-2.00), SIMDE_BFLOAT16_VALUE(-8.00), SIMDE_BFLOAT16_VALUE(-9.50), SIMDE_BFLOAT16_VALUE(-5.20), SIMDE_BFLOAT16_VALUE(3.90), SIMDE_BFLOAT16_VALUE(0.80) }, + { SIMDE_BFLOAT16_VALUE(4.60), SIMDE_BFLOAT16_VALUE(0.90), SIMDE_BFLOAT16_VALUE(9.20), SIMDE_BFLOAT16_VALUE(4.50), SIMDE_BFLOAT16_VALUE(5.40), SIMDE_BFLOAT16_VALUE(-2.00), SIMDE_BFLOAT16_VALUE(-6.10), SIMDE_BFLOAT16_VALUE(-8.00), SIMDE_BFLOAT16_VALUE(-9.60), SIMDE_BFLOAT16_VALUE(-9.50), SIMDE_BFLOAT16_VALUE(2.10), SIMDE_BFLOAT16_VALUE(-5.20), SIMDE_BFLOAT16_VALUE(-5.10), SIMDE_BFLOAT16_VALUE(3.90), SIMDE_BFLOAT16_VALUE(7.80), SIMDE_BFLOAT16_VALUE(0.80) } }, + { { SIMDE_BFLOAT16_VALUE(10.00), SIMDE_BFLOAT16_VALUE(-7.60), SIMDE_BFLOAT16_VALUE(-1.20), SIMDE_BFLOAT16_VALUE(5.10), SIMDE_BFLOAT16_VALUE(6.10), SIMDE_BFLOAT16_VALUE(4.50), SIMDE_BFLOAT16_VALUE(1.40), SIMDE_BFLOAT16_VALUE(-5.50) }, + { SIMDE_BFLOAT16_VALUE(3.90), SIMDE_BFLOAT16_VALUE(-5.10), SIMDE_BFLOAT16_VALUE(1.10), SIMDE_BFLOAT16_VALUE(0.00), SIMDE_BFLOAT16_VALUE(1.00), SIMDE_BFLOAT16_VALUE(4.20), SIMDE_BFLOAT16_VALUE(3.20), SIMDE_BFLOAT16_VALUE(-8.50) }, + { SIMDE_BFLOAT16_VALUE(10.00), SIMDE_BFLOAT16_VALUE(3.90), SIMDE_BFLOAT16_VALUE(-7.60), SIMDE_BFLOAT16_VALUE(-5.10), SIMDE_BFLOAT16_VALUE(-1.20), SIMDE_BFLOAT16_VALUE(1.10), SIMDE_BFLOAT16_VALUE(5.10), SIMDE_BFLOAT16_VALUE(0.00), SIMDE_BFLOAT16_VALUE(6.10), SIMDE_BFLOAT16_VALUE(1.00), SIMDE_BFLOAT16_VALUE(4.50), SIMDE_BFLOAT16_VALUE(4.20), SIMDE_BFLOAT16_VALUE(1.40), SIMDE_BFLOAT16_VALUE(3.20), SIMDE_BFLOAT16_VALUE(-5.50), SIMDE_BFLOAT16_VALUE(-8.50) } }, + { { SIMDE_BFLOAT16_VALUE(9.30), SIMDE_BFLOAT16_VALUE(2.40), SIMDE_BFLOAT16_VALUE(7.90), SIMDE_BFLOAT16_VALUE(-3.10), SIMDE_BFLOAT16_VALUE(-0.20), SIMDE_BFLOAT16_VALUE(-1.80), SIMDE_BFLOAT16_VALUE(-7.10), SIMDE_BFLOAT16_VALUE(-5.00) }, + { SIMDE_BFLOAT16_VALUE(8.10), SIMDE_BFLOAT16_VALUE(5.20), SIMDE_BFLOAT16_VALUE(3.80), SIMDE_BFLOAT16_VALUE(0.30), SIMDE_BFLOAT16_VALUE(-4.20), SIMDE_BFLOAT16_VALUE(-8.30), SIMDE_BFLOAT16_VALUE(9.90), SIMDE_BFLOAT16_VALUE(5.80) }, + { SIMDE_BFLOAT16_VALUE(9.30), SIMDE_BFLOAT16_VALUE(8.10), SIMDE_BFLOAT16_VALUE(2.40), SIMDE_BFLOAT16_VALUE(5.20), SIMDE_BFLOAT16_VALUE(7.90), SIMDE_BFLOAT16_VALUE(3.80), SIMDE_BFLOAT16_VALUE(-3.10), SIMDE_BFLOAT16_VALUE(0.30), SIMDE_BFLOAT16_VALUE(-0.20), SIMDE_BFLOAT16_VALUE(-4.20), SIMDE_BFLOAT16_VALUE(-1.80), SIMDE_BFLOAT16_VALUE(-8.30), SIMDE_BFLOAT16_VALUE(-7.10), SIMDE_BFLOAT16_VALUE(9.90), SIMDE_BFLOAT16_VALUE(-5.00), SIMDE_BFLOAT16_VALUE(5.80) } }, + { { SIMDE_BFLOAT16_VALUE(9.30), SIMDE_BFLOAT16_VALUE(3.10), SIMDE_BFLOAT16_VALUE(8.20), SIMDE_BFLOAT16_VALUE(9.70), SIMDE_BFLOAT16_VALUE(-5.00), SIMDE_BFLOAT16_VALUE(0.90), SIMDE_BFLOAT16_VALUE(-7.20), SIMDE_BFLOAT16_VALUE(-4.20) }, + { SIMDE_BFLOAT16_VALUE(8.90), SIMDE_BFLOAT16_VALUE(8.00), SIMDE_BFLOAT16_VALUE(-0.10), SIMDE_BFLOAT16_VALUE(-3.40), SIMDE_BFLOAT16_VALUE(4.20), SIMDE_BFLOAT16_VALUE(7.80), SIMDE_BFLOAT16_VALUE(2.20), SIMDE_BFLOAT16_VALUE(-6.00) }, + { SIMDE_BFLOAT16_VALUE(9.30), SIMDE_BFLOAT16_VALUE(8.90), SIMDE_BFLOAT16_VALUE(3.10), SIMDE_BFLOAT16_VALUE(8.00), SIMDE_BFLOAT16_VALUE(8.20), SIMDE_BFLOAT16_VALUE(-0.10), SIMDE_BFLOAT16_VALUE(9.70), SIMDE_BFLOAT16_VALUE(-3.40), SIMDE_BFLOAT16_VALUE(-5.00), SIMDE_BFLOAT16_VALUE(4.20), SIMDE_BFLOAT16_VALUE(0.90), SIMDE_BFLOAT16_VALUE(7.80), SIMDE_BFLOAT16_VALUE(-7.20), SIMDE_BFLOAT16_VALUE(2.20), SIMDE_BFLOAT16_VALUE(-4.20), SIMDE_BFLOAT16_VALUE(-6.00) } }, + { { SIMDE_BFLOAT16_VALUE(-6.90), SIMDE_BFLOAT16_VALUE(4.60), SIMDE_BFLOAT16_VALUE(-2.80), SIMDE_BFLOAT16_VALUE(-1.00), SIMDE_BFLOAT16_VALUE(3.80), SIMDE_BFLOAT16_VALUE(-4.90), SIMDE_BFLOAT16_VALUE(-8.50), SIMDE_BFLOAT16_VALUE(-10.00) }, + { SIMDE_BFLOAT16_VALUE(-7.50), SIMDE_BFLOAT16_VALUE(2.30), SIMDE_BFLOAT16_VALUE(2.80), SIMDE_BFLOAT16_VALUE(3.30), SIMDE_BFLOAT16_VALUE(-0.80), SIMDE_BFLOAT16_VALUE(-2.00), SIMDE_BFLOAT16_VALUE(-4.80), SIMDE_BFLOAT16_VALUE(-8.80) }, + { SIMDE_BFLOAT16_VALUE(-6.90), SIMDE_BFLOAT16_VALUE(-7.50), SIMDE_BFLOAT16_VALUE(4.60), SIMDE_BFLOAT16_VALUE(2.30), SIMDE_BFLOAT16_VALUE(-2.80), SIMDE_BFLOAT16_VALUE(2.80), SIMDE_BFLOAT16_VALUE(-1.00), SIMDE_BFLOAT16_VALUE(3.30), SIMDE_BFLOAT16_VALUE(3.80), SIMDE_BFLOAT16_VALUE(-0.80), SIMDE_BFLOAT16_VALUE(-4.90), SIMDE_BFLOAT16_VALUE(-2.00), SIMDE_BFLOAT16_VALUE(-8.50), SIMDE_BFLOAT16_VALUE(-4.80), SIMDE_BFLOAT16_VALUE(-10.00), SIMDE_BFLOAT16_VALUE(-8.80) } }, + { { SIMDE_BFLOAT16_VALUE(4.20), SIMDE_BFLOAT16_VALUE(5.50), SIMDE_BFLOAT16_VALUE(3.10), SIMDE_BFLOAT16_VALUE(-8.20), SIMDE_BFLOAT16_VALUE(0.10), SIMDE_BFLOAT16_VALUE(2.80), SIMDE_BFLOAT16_VALUE(9.40), SIMDE_BFLOAT16_VALUE(9.10) }, + { SIMDE_BFLOAT16_VALUE(6.60), SIMDE_BFLOAT16_VALUE(2.10), SIMDE_BFLOAT16_VALUE(-8.90), SIMDE_BFLOAT16_VALUE(-6.70), SIMDE_BFLOAT16_VALUE(-4.00), SIMDE_BFLOAT16_VALUE(-2.60), SIMDE_BFLOAT16_VALUE(-9.20), SIMDE_BFLOAT16_VALUE(-3.20) }, + { SIMDE_BFLOAT16_VALUE(4.20), SIMDE_BFLOAT16_VALUE(6.60), SIMDE_BFLOAT16_VALUE(5.50), SIMDE_BFLOAT16_VALUE(2.10), SIMDE_BFLOAT16_VALUE(3.10), SIMDE_BFLOAT16_VALUE(-8.90), SIMDE_BFLOAT16_VALUE(-8.20), SIMDE_BFLOAT16_VALUE(-6.70), SIMDE_BFLOAT16_VALUE(0.10), SIMDE_BFLOAT16_VALUE(-4.00), SIMDE_BFLOAT16_VALUE(2.80), SIMDE_BFLOAT16_VALUE(-2.60), SIMDE_BFLOAT16_VALUE(9.40), SIMDE_BFLOAT16_VALUE(-9.20), SIMDE_BFLOAT16_VALUE(9.10), SIMDE_BFLOAT16_VALUE(-3.20) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8x2_t r_ = { { simde_vld1q_bf16(test_vec[i].r0), + simde_vld1q_bf16(test_vec[i].r1) } }; + + simde_bfloat16 a_[16]; + simde_vst2q_bf16(a_, r_); + + simde_assert_equal_i(0, simde_memcmp(a_, test_vec[i].a, sizeof(test_vec[i].a))); + } + + return 0; +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -1980,6 +2084,9 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vst2_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vst2q_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vst2q_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vst2q_p64) + +SIMDE_TEST_FUNC_LIST_ENTRY(vst2_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vst2q_bf16) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/st2_lane.c b/test/arm/neon/st2_lane.c index 98121747a..fc5bed555 100644 --- a/test/arm/neon/st2_lane.c +++ b/test/arm/neon/st2_lane.c @@ -1677,6 +1677,130 @@ test_simde_vst2q_lane_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vst2_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t a[2]; + simde_bfloat16_t val[2][4]; + int lane; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( - 96.699), SIMDE_BFLOAT16_VALUE( 96.081) }, + { { SIMDE_BFLOAT16_VALUE( - 86.059), SIMDE_BFLOAT16_VALUE( 10.093), SIMDE_BFLOAT16_VALUE( - 96.699), SIMDE_BFLOAT16_VALUE( 92.682) }, + { SIMDE_BFLOAT16_VALUE( 94.074), SIMDE_BFLOAT16_VALUE( - 25.535), SIMDE_BFLOAT16_VALUE( 96.081), SIMDE_BFLOAT16_VALUE( 79.156) } }, + INT8_C( 2) }, + { { SIMDE_BFLOAT16_VALUE( 24.214), SIMDE_BFLOAT16_VALUE( 72.416) }, + { { SIMDE_BFLOAT16_VALUE( 56.403), SIMDE_BFLOAT16_VALUE( - 41.539), SIMDE_BFLOAT16_VALUE( 24.214), SIMDE_BFLOAT16_VALUE( 0.721) }, + { SIMDE_BFLOAT16_VALUE( 11.102), SIMDE_BFLOAT16_VALUE( 82.747), SIMDE_BFLOAT16_VALUE( 72.416), SIMDE_BFLOAT16_VALUE( 25.862) } }, + INT8_C( 2) }, + { { SIMDE_BFLOAT16_VALUE( - 41.215), SIMDE_BFLOAT16_VALUE( - 10.097) }, + { { SIMDE_BFLOAT16_VALUE( 8.693), SIMDE_BFLOAT16_VALUE( - 45.955), SIMDE_BFLOAT16_VALUE( - 41.215), SIMDE_BFLOAT16_VALUE( 47.533) }, + { SIMDE_BFLOAT16_VALUE( 26.757), SIMDE_BFLOAT16_VALUE( - 10.266), SIMDE_BFLOAT16_VALUE( - 10.097), SIMDE_BFLOAT16_VALUE( - 73.201) } }, + INT8_C( 2) }, + { { SIMDE_BFLOAT16_VALUE( - 14.688), SIMDE_BFLOAT16_VALUE( 26.052) }, + { { SIMDE_BFLOAT16_VALUE( - 13.883), SIMDE_BFLOAT16_VALUE( 25.378), SIMDE_BFLOAT16_VALUE( 82.439), SIMDE_BFLOAT16_VALUE( - 14.688) }, + { SIMDE_BFLOAT16_VALUE( 75.364), SIMDE_BFLOAT16_VALUE( - 98.234), SIMDE_BFLOAT16_VALUE( 21.632), SIMDE_BFLOAT16_VALUE( 26.052) } }, + INT8_C( 3) }, + { { SIMDE_BFLOAT16_VALUE( - 56.396), SIMDE_BFLOAT16_VALUE( - 13.528) }, + { { SIMDE_BFLOAT16_VALUE( 53.363), SIMDE_BFLOAT16_VALUE( 54.407), SIMDE_BFLOAT16_VALUE( - 56.396), SIMDE_BFLOAT16_VALUE( - 23.778) }, + { SIMDE_BFLOAT16_VALUE( 46.186), SIMDE_BFLOAT16_VALUE( - 25.159), SIMDE_BFLOAT16_VALUE( - 13.528), SIMDE_BFLOAT16_VALUE( - 47.334) } }, + INT8_C( 2) }, + { { SIMDE_BFLOAT16_VALUE( - 68.946), SIMDE_BFLOAT16_VALUE( - 82.937) }, + { { SIMDE_BFLOAT16_VALUE( 30.751), SIMDE_BFLOAT16_VALUE( 12.829), SIMDE_BFLOAT16_VALUE( - 68.946), SIMDE_BFLOAT16_VALUE( 10.480) }, + { SIMDE_BFLOAT16_VALUE( 58.238), SIMDE_BFLOAT16_VALUE( 3.858), SIMDE_BFLOAT16_VALUE( - 82.937), SIMDE_BFLOAT16_VALUE( - 2.434) } }, + INT8_C( 2) }, + { { SIMDE_BFLOAT16_VALUE( 4.407), SIMDE_BFLOAT16_VALUE( - 66.972) }, + { { SIMDE_BFLOAT16_VALUE( - 94.165), SIMDE_BFLOAT16_VALUE( 4.407), SIMDE_BFLOAT16_VALUE( - 78.247), SIMDE_BFLOAT16_VALUE( 4.932) }, + { SIMDE_BFLOAT16_VALUE( 57.296), SIMDE_BFLOAT16_VALUE( - 66.972), SIMDE_BFLOAT16_VALUE( - 76.884), SIMDE_BFLOAT16_VALUE( - 1.070) } }, + INT8_C( 1) }, + { { SIMDE_BFLOAT16_VALUE( - 49.253), SIMDE_BFLOAT16_VALUE( - 68.363) }, + { { SIMDE_BFLOAT16_VALUE( - 42.453), SIMDE_BFLOAT16_VALUE( 76.770), SIMDE_BFLOAT16_VALUE( - 49.253), SIMDE_BFLOAT16_VALUE( 42.268) }, + { SIMDE_BFLOAT16_VALUE( - 25.787), SIMDE_BFLOAT16_VALUE( - 28.102), SIMDE_BFLOAT16_VALUE( - 68.363), SIMDE_BFLOAT16_VALUE( - 67.189) } }, + INT8_C( 2) }, + }; + + for (size_t i = 0; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + simde_bfloat16x4x2_t val = { + {simde_vld1_bf16(test_vec[i].val[0]), simde_vld1_bf16(test_vec[i].val[1])}}; + simde_bfloat16_t a[2]; + SIMDE_CONSTIFY_4_NO_RESULT_(simde_vst2_lane_bf16, HEDLEY_UNREACHABLE(), + test_vec[i].lane, a, val); + simde_assert_equal_bf16(a[0], test_vec[i].a[0], 1); + simde_assert_equal_bf16(a[1], test_vec[i].a[1], 1); + } + + return 0; +} + +static int +test_simde_vst2q_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t a[2]; + simde_bfloat16_t val[2][8]; + int lane; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( - 90.393), SIMDE_BFLOAT16_VALUE( 63.104) }, + { { SIMDE_BFLOAT16_VALUE( - 38.257), SIMDE_BFLOAT16_VALUE( - 31.638), SIMDE_BFLOAT16_VALUE( - 97.258), SIMDE_BFLOAT16_VALUE( - 70.618), + SIMDE_BFLOAT16_VALUE( - 11.335), SIMDE_BFLOAT16_VALUE( - 8.280), SIMDE_BFLOAT16_VALUE( 23.083), SIMDE_BFLOAT16_VALUE( - 90.393) }, + { SIMDE_BFLOAT16_VALUE( 74.360), SIMDE_BFLOAT16_VALUE( 51.715), SIMDE_BFLOAT16_VALUE( - 79.402), SIMDE_BFLOAT16_VALUE( 71.628), + SIMDE_BFLOAT16_VALUE( 50.051), SIMDE_BFLOAT16_VALUE( - 51.089), SIMDE_BFLOAT16_VALUE( - 33.431), SIMDE_BFLOAT16_VALUE( 63.104) } }, + INT8_C( 7) }, + { { SIMDE_BFLOAT16_VALUE( 64.040), SIMDE_BFLOAT16_VALUE( - 67.280) }, + { { SIMDE_BFLOAT16_VALUE( 41.175), SIMDE_BFLOAT16_VALUE( 72.644), SIMDE_BFLOAT16_VALUE( 64.040), SIMDE_BFLOAT16_VALUE( - 54.404), + SIMDE_BFLOAT16_VALUE( 97.772), SIMDE_BFLOAT16_VALUE( 58.590), SIMDE_BFLOAT16_VALUE( - 28.472), SIMDE_BFLOAT16_VALUE( - 67.625) }, + { SIMDE_BFLOAT16_VALUE( - 80.611), SIMDE_BFLOAT16_VALUE( 99.705), SIMDE_BFLOAT16_VALUE( - 67.280), SIMDE_BFLOAT16_VALUE( 5.574), + SIMDE_BFLOAT16_VALUE( - 20.029), SIMDE_BFLOAT16_VALUE( - 35.226), SIMDE_BFLOAT16_VALUE( - 1.819), SIMDE_BFLOAT16_VALUE( - 62.990) } }, + INT8_C( 2) }, + { { SIMDE_BFLOAT16_VALUE( 23.024), SIMDE_BFLOAT16_VALUE( - 77.316) }, + { { SIMDE_BFLOAT16_VALUE( 94.862), SIMDE_BFLOAT16_VALUE( - 53.113), SIMDE_BFLOAT16_VALUE( 76.880), SIMDE_BFLOAT16_VALUE( - 24.592), + SIMDE_BFLOAT16_VALUE( 23.024), SIMDE_BFLOAT16_VALUE( - 86.319), SIMDE_BFLOAT16_VALUE( - 49.922), SIMDE_BFLOAT16_VALUE( 74.371) }, + { SIMDE_BFLOAT16_VALUE( - 35.182), SIMDE_BFLOAT16_VALUE( 91.375), SIMDE_BFLOAT16_VALUE( - 30.442), SIMDE_BFLOAT16_VALUE( 62.763), + SIMDE_BFLOAT16_VALUE( - 77.316), SIMDE_BFLOAT16_VALUE( - 98.725), SIMDE_BFLOAT16_VALUE( 77.730), SIMDE_BFLOAT16_VALUE( - 6.752) } }, + INT8_C( 4) }, + { { SIMDE_BFLOAT16_VALUE( - 89.098), SIMDE_BFLOAT16_VALUE( - 47.386) }, + { { SIMDE_BFLOAT16_VALUE( - 37.183), SIMDE_BFLOAT16_VALUE( - 99.478), SIMDE_BFLOAT16_VALUE( - 72.315), SIMDE_BFLOAT16_VALUE( 60.865), + SIMDE_BFLOAT16_VALUE( 90.711), SIMDE_BFLOAT16_VALUE( 33.609), SIMDE_BFLOAT16_VALUE( 22.229), SIMDE_BFLOAT16_VALUE( - 89.098) }, + { SIMDE_BFLOAT16_VALUE( 18.834), SIMDE_BFLOAT16_VALUE( - 38.890), SIMDE_BFLOAT16_VALUE( 1.151), SIMDE_BFLOAT16_VALUE( - 50.932), + SIMDE_BFLOAT16_VALUE( 16.869), SIMDE_BFLOAT16_VALUE( 72.770), SIMDE_BFLOAT16_VALUE( 43.215), SIMDE_BFLOAT16_VALUE( - 47.386) } }, + INT8_C( 7) }, + { { SIMDE_BFLOAT16_VALUE( - 74.604), SIMDE_BFLOAT16_VALUE( 83.519) }, + { { SIMDE_BFLOAT16_VALUE( - 87.245), SIMDE_BFLOAT16_VALUE( - 66.241), SIMDE_BFLOAT16_VALUE( - 49.725), SIMDE_BFLOAT16_VALUE( - 74.604), + SIMDE_BFLOAT16_VALUE( 52.094), SIMDE_BFLOAT16_VALUE( - 95.107), SIMDE_BFLOAT16_VALUE( 95.169), SIMDE_BFLOAT16_VALUE( 80.442) }, + { SIMDE_BFLOAT16_VALUE( 4.494), SIMDE_BFLOAT16_VALUE( 93.210), SIMDE_BFLOAT16_VALUE( 18.867), SIMDE_BFLOAT16_VALUE( 83.519), + SIMDE_BFLOAT16_VALUE( - 54.371), SIMDE_BFLOAT16_VALUE( - 96.968), SIMDE_BFLOAT16_VALUE( 31.350), SIMDE_BFLOAT16_VALUE( 84.978) } }, + INT8_C( 3) }, + { { SIMDE_BFLOAT16_VALUE( 11.757), SIMDE_BFLOAT16_VALUE( - 92.199) }, + { { SIMDE_BFLOAT16_VALUE( 11.757), SIMDE_BFLOAT16_VALUE( 28.988), SIMDE_BFLOAT16_VALUE( - 67.095), SIMDE_BFLOAT16_VALUE( - 58.193), + SIMDE_BFLOAT16_VALUE( 45.038), SIMDE_BFLOAT16_VALUE( - 42.819), SIMDE_BFLOAT16_VALUE( - 88.284), SIMDE_BFLOAT16_VALUE( 53.437) }, + { SIMDE_BFLOAT16_VALUE( - 92.199), SIMDE_BFLOAT16_VALUE( 12.165), SIMDE_BFLOAT16_VALUE( 3.097), SIMDE_BFLOAT16_VALUE( 69.414), + SIMDE_BFLOAT16_VALUE( - 22.656), SIMDE_BFLOAT16_VALUE( 5.711), SIMDE_BFLOAT16_VALUE( - 39.886), SIMDE_BFLOAT16_VALUE( 37.784) } }, + INT8_C( 0) }, + { { SIMDE_BFLOAT16_VALUE( 19.626), SIMDE_BFLOAT16_VALUE( 24.723) }, + { { SIMDE_BFLOAT16_VALUE( - 4.744), SIMDE_BFLOAT16_VALUE( 15.391), SIMDE_BFLOAT16_VALUE( 19.626), SIMDE_BFLOAT16_VALUE( 64.213), + SIMDE_BFLOAT16_VALUE( 92.541), SIMDE_BFLOAT16_VALUE( 24.957), SIMDE_BFLOAT16_VALUE( 42.707), SIMDE_BFLOAT16_VALUE( - 42.789) }, + { SIMDE_BFLOAT16_VALUE( - 35.790), SIMDE_BFLOAT16_VALUE( 98.414), SIMDE_BFLOAT16_VALUE( 24.723), SIMDE_BFLOAT16_VALUE( - 2.908), + SIMDE_BFLOAT16_VALUE( 8.083), SIMDE_BFLOAT16_VALUE( - 46.904), SIMDE_BFLOAT16_VALUE( - 37.831), SIMDE_BFLOAT16_VALUE( - 59.362) } }, + INT8_C( 2) }, + { { SIMDE_BFLOAT16_VALUE( 64.222), SIMDE_BFLOAT16_VALUE( - 33.836) }, + { { SIMDE_BFLOAT16_VALUE( - 31.643), SIMDE_BFLOAT16_VALUE( - 36.586), SIMDE_BFLOAT16_VALUE( 64.222), SIMDE_BFLOAT16_VALUE( - 73.531), + SIMDE_BFLOAT16_VALUE( - 64.852), SIMDE_BFLOAT16_VALUE( 22.974), SIMDE_BFLOAT16_VALUE( - 27.821), SIMDE_BFLOAT16_VALUE( - 62.560) }, + { SIMDE_BFLOAT16_VALUE( - 78.721), SIMDE_BFLOAT16_VALUE( 35.577), SIMDE_BFLOAT16_VALUE( - 33.836), SIMDE_BFLOAT16_VALUE( 54.532), + SIMDE_BFLOAT16_VALUE( - 39.138), SIMDE_BFLOAT16_VALUE( - 98.477), SIMDE_BFLOAT16_VALUE( - 49.646), SIMDE_BFLOAT16_VALUE( - 72.783) } }, + INT8_C( 2) }, + }; + + for (size_t i = 0; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + simde_bfloat16x8x2_t val = { + {simde_vld1q_bf16(test_vec[i].val[0]), simde_vld1q_bf16(test_vec[i].val[1])}}; + simde_bfloat16_t a[2]; + SIMDE_CONSTIFY_8_NO_RESULT_(simde_vst2q_lane_bf16, HEDLEY_UNREACHABLE(), + test_vec[i].lane, a, val); + simde_assert_equal_bf16(a[0], test_vec[i].a[0], 1); + simde_assert_equal_bf16(a[1], test_vec[i].a[1], 1); + } + + return 0; +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -1711,6 +1835,9 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vst2_lane_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vst2q_lane_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vst2q_lane_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vst2q_lane_p64) + +SIMDE_TEST_FUNC_LIST_ENTRY(vst2_lane_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vst2q_lane_bf16) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/st3.c b/test/arm/neon/st3.c index 9c64b051a..7f70c4d3a 100644 --- a/test/arm/neon/st3.c +++ b/test/arm/neon/st3.c @@ -6216,6 +6216,240 @@ test_simde_vst3q_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vst3_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16 r0[4]; + simde_bfloat16 r1[4]; + simde_bfloat16 r2[4]; + simde_bfloat16 a[12]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 96.588), SIMDE_BFLOAT16_VALUE( - 1.777), SIMDE_BFLOAT16_VALUE( 46.463), SIMDE_BFLOAT16_VALUE( 56.300) }, + { SIMDE_BFLOAT16_VALUE( 56.067), SIMDE_BFLOAT16_VALUE( 76.113), SIMDE_BFLOAT16_VALUE( - 80.190), SIMDE_BFLOAT16_VALUE( - 59.487) }, + { SIMDE_BFLOAT16_VALUE( - 85.440), SIMDE_BFLOAT16_VALUE( 11.955), SIMDE_BFLOAT16_VALUE( 31.790), SIMDE_BFLOAT16_VALUE( - 31.309) }, + { SIMDE_BFLOAT16_VALUE( 96.588), SIMDE_BFLOAT16_VALUE( 56.067), SIMDE_BFLOAT16_VALUE( - 85.440), SIMDE_BFLOAT16_VALUE( - 1.777), + SIMDE_BFLOAT16_VALUE( 76.113), SIMDE_BFLOAT16_VALUE( 11.955), SIMDE_BFLOAT16_VALUE( 46.463), SIMDE_BFLOAT16_VALUE( - 80.190), + SIMDE_BFLOAT16_VALUE( 31.790), SIMDE_BFLOAT16_VALUE( 56.300), SIMDE_BFLOAT16_VALUE( - 59.487), SIMDE_BFLOAT16_VALUE( - 31.309) } }, + { { SIMDE_BFLOAT16_VALUE( - 63.610), SIMDE_BFLOAT16_VALUE( 8.056), SIMDE_BFLOAT16_VALUE( - 12.504), SIMDE_BFLOAT16_VALUE( 76.738) }, + { SIMDE_BFLOAT16_VALUE( - 48.058), SIMDE_BFLOAT16_VALUE( - 5.714), SIMDE_BFLOAT16_VALUE( - 3.043), SIMDE_BFLOAT16_VALUE( 60.984) }, + { SIMDE_BFLOAT16_VALUE( - 90.940), SIMDE_BFLOAT16_VALUE( 77.403), SIMDE_BFLOAT16_VALUE( - 57.046), SIMDE_BFLOAT16_VALUE( 37.511) }, + { SIMDE_BFLOAT16_VALUE( - 63.610), SIMDE_BFLOAT16_VALUE( - 48.058), SIMDE_BFLOAT16_VALUE( - 90.940), SIMDE_BFLOAT16_VALUE( 8.056), + SIMDE_BFLOAT16_VALUE( - 5.714), SIMDE_BFLOAT16_VALUE( 77.403), SIMDE_BFLOAT16_VALUE( - 12.504), SIMDE_BFLOAT16_VALUE( - 3.043), + SIMDE_BFLOAT16_VALUE( - 57.046), SIMDE_BFLOAT16_VALUE( 76.738), SIMDE_BFLOAT16_VALUE( 60.984), SIMDE_BFLOAT16_VALUE( 37.511) } }, + { { SIMDE_BFLOAT16_VALUE( 93.849), SIMDE_BFLOAT16_VALUE( 43.255), SIMDE_BFLOAT16_VALUE( 95.638), SIMDE_BFLOAT16_VALUE( - 54.607) }, + { SIMDE_BFLOAT16_VALUE( 99.776), SIMDE_BFLOAT16_VALUE( 59.886), SIMDE_BFLOAT16_VALUE( 53.777), SIMDE_BFLOAT16_VALUE( - 64.378) }, + { SIMDE_BFLOAT16_VALUE( - 44.354), SIMDE_BFLOAT16_VALUE( 90.343), SIMDE_BFLOAT16_VALUE( - 22.346), SIMDE_BFLOAT16_VALUE( - 70.759) }, + { SIMDE_BFLOAT16_VALUE( 93.849), SIMDE_BFLOAT16_VALUE( 99.776), SIMDE_BFLOAT16_VALUE( - 44.354), SIMDE_BFLOAT16_VALUE( 43.255), + SIMDE_BFLOAT16_VALUE( 59.886), SIMDE_BFLOAT16_VALUE( 90.343), SIMDE_BFLOAT16_VALUE( 95.638), SIMDE_BFLOAT16_VALUE( 53.777), + SIMDE_BFLOAT16_VALUE( - 22.346), SIMDE_BFLOAT16_VALUE( - 54.607), SIMDE_BFLOAT16_VALUE( - 64.378), SIMDE_BFLOAT16_VALUE( - 70.759) } }, + { { SIMDE_BFLOAT16_VALUE( 82.593), SIMDE_BFLOAT16_VALUE( - 78.757), SIMDE_BFLOAT16_VALUE( - 89.472), SIMDE_BFLOAT16_VALUE( - 65.210) }, + { SIMDE_BFLOAT16_VALUE( 71.127), SIMDE_BFLOAT16_VALUE( 81.667), SIMDE_BFLOAT16_VALUE( - 51.422), SIMDE_BFLOAT16_VALUE( 71.658) }, + { SIMDE_BFLOAT16_VALUE( - 37.830), SIMDE_BFLOAT16_VALUE( - 63.633), SIMDE_BFLOAT16_VALUE( 47.933), SIMDE_BFLOAT16_VALUE( 6.764) }, + { SIMDE_BFLOAT16_VALUE( 82.593), SIMDE_BFLOAT16_VALUE( 71.127), SIMDE_BFLOAT16_VALUE( - 37.830), SIMDE_BFLOAT16_VALUE( - 78.757), + SIMDE_BFLOAT16_VALUE( 81.667), SIMDE_BFLOAT16_VALUE( - 63.633), SIMDE_BFLOAT16_VALUE( - 89.472), SIMDE_BFLOAT16_VALUE( - 51.422), + SIMDE_BFLOAT16_VALUE( 47.933), SIMDE_BFLOAT16_VALUE( - 65.210), SIMDE_BFLOAT16_VALUE( 71.658), SIMDE_BFLOAT16_VALUE( 6.764) } }, + { { SIMDE_BFLOAT16_VALUE( - 18.391), SIMDE_BFLOAT16_VALUE( 36.835), SIMDE_BFLOAT16_VALUE( 22.395), SIMDE_BFLOAT16_VALUE( 6.510) }, + { SIMDE_BFLOAT16_VALUE( 44.811), SIMDE_BFLOAT16_VALUE( - 12.385), SIMDE_BFLOAT16_VALUE( - 7.166), SIMDE_BFLOAT16_VALUE( - 93.173) }, + { SIMDE_BFLOAT16_VALUE( 14.253), SIMDE_BFLOAT16_VALUE( 90.608), SIMDE_BFLOAT16_VALUE( - 83.326), SIMDE_BFLOAT16_VALUE( - 35.862) }, + { SIMDE_BFLOAT16_VALUE( - 18.391), SIMDE_BFLOAT16_VALUE( 44.811), SIMDE_BFLOAT16_VALUE( 14.253), SIMDE_BFLOAT16_VALUE( 36.835), + SIMDE_BFLOAT16_VALUE( - 12.385), SIMDE_BFLOAT16_VALUE( 90.608), SIMDE_BFLOAT16_VALUE( 22.395), SIMDE_BFLOAT16_VALUE( - 7.166), + SIMDE_BFLOAT16_VALUE( - 83.326), SIMDE_BFLOAT16_VALUE( 6.510), SIMDE_BFLOAT16_VALUE( - 93.173), SIMDE_BFLOAT16_VALUE( - 35.862) } }, + { { SIMDE_BFLOAT16_VALUE( 29.457), SIMDE_BFLOAT16_VALUE( 71.643), SIMDE_BFLOAT16_VALUE( - 73.821), SIMDE_BFLOAT16_VALUE( - 57.149) }, + { SIMDE_BFLOAT16_VALUE( 53.561), SIMDE_BFLOAT16_VALUE( 52.606), SIMDE_BFLOAT16_VALUE( - 93.208), SIMDE_BFLOAT16_VALUE( 61.772) }, + { SIMDE_BFLOAT16_VALUE( 29.595), SIMDE_BFLOAT16_VALUE( - 0.911), SIMDE_BFLOAT16_VALUE( - 25.184), SIMDE_BFLOAT16_VALUE( - 63.522) }, + { SIMDE_BFLOAT16_VALUE( 29.457), SIMDE_BFLOAT16_VALUE( 53.561), SIMDE_BFLOAT16_VALUE( 29.595), SIMDE_BFLOAT16_VALUE( 71.643), + SIMDE_BFLOAT16_VALUE( 52.606), SIMDE_BFLOAT16_VALUE( - 0.911), SIMDE_BFLOAT16_VALUE( - 73.821), SIMDE_BFLOAT16_VALUE( - 93.208), + SIMDE_BFLOAT16_VALUE( - 25.184), SIMDE_BFLOAT16_VALUE( - 57.149), SIMDE_BFLOAT16_VALUE( 61.772), SIMDE_BFLOAT16_VALUE( - 63.522) } }, + { { SIMDE_BFLOAT16_VALUE( - 25.263), SIMDE_BFLOAT16_VALUE( - 21.565), SIMDE_BFLOAT16_VALUE( 30.769), SIMDE_BFLOAT16_VALUE( 63.051) }, + { SIMDE_BFLOAT16_VALUE( 9.949), SIMDE_BFLOAT16_VALUE( 3.818), SIMDE_BFLOAT16_VALUE( 91.706), SIMDE_BFLOAT16_VALUE( - 56.254) }, + { SIMDE_BFLOAT16_VALUE( - 62.534), SIMDE_BFLOAT16_VALUE( 15.090), SIMDE_BFLOAT16_VALUE( 33.667), SIMDE_BFLOAT16_VALUE( - 11.503) }, + { SIMDE_BFLOAT16_VALUE( - 25.263), SIMDE_BFLOAT16_VALUE( 9.949), SIMDE_BFLOAT16_VALUE( - 62.534), SIMDE_BFLOAT16_VALUE( - 21.565), + SIMDE_BFLOAT16_VALUE( 3.818), SIMDE_BFLOAT16_VALUE( 15.090), SIMDE_BFLOAT16_VALUE( 30.769), SIMDE_BFLOAT16_VALUE( 91.706), + SIMDE_BFLOAT16_VALUE( 33.667), SIMDE_BFLOAT16_VALUE( 63.051), SIMDE_BFLOAT16_VALUE( - 56.254), SIMDE_BFLOAT16_VALUE( - 11.503) } }, + { { SIMDE_BFLOAT16_VALUE( 8.202), SIMDE_BFLOAT16_VALUE( - 16.555), SIMDE_BFLOAT16_VALUE( 92.084), SIMDE_BFLOAT16_VALUE( 72.240) }, + { SIMDE_BFLOAT16_VALUE( - 95.149), SIMDE_BFLOAT16_VALUE( - 39.732), SIMDE_BFLOAT16_VALUE( - 56.675), SIMDE_BFLOAT16_VALUE( - 0.718) }, + { SIMDE_BFLOAT16_VALUE( 73.858), SIMDE_BFLOAT16_VALUE( - 78.753), SIMDE_BFLOAT16_VALUE( - 19.882), SIMDE_BFLOAT16_VALUE( 17.845) }, + { SIMDE_BFLOAT16_VALUE( 8.202), SIMDE_BFLOAT16_VALUE( - 95.149), SIMDE_BFLOAT16_VALUE( 73.858), SIMDE_BFLOAT16_VALUE( - 16.555), + SIMDE_BFLOAT16_VALUE( - 39.732), SIMDE_BFLOAT16_VALUE( - 78.753), SIMDE_BFLOAT16_VALUE( 92.084), SIMDE_BFLOAT16_VALUE( - 56.675), + SIMDE_BFLOAT16_VALUE( - 19.882), SIMDE_BFLOAT16_VALUE( 72.240), SIMDE_BFLOAT16_VALUE( - 0.718), SIMDE_BFLOAT16_VALUE( 17.845) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4x3_t r_ = { { simde_vld1_bf16(test_vec[i].r0), + simde_vld1_bf16(test_vec[i].r1), + simde_vld1_bf16(test_vec[i].r2), } }; + + simde_bfloat16 a_[12]; + simde_vst3_bf16(a_, r_); + simde_assert_equal_i(0, simde_memcmp(a_, test_vec[i].a, sizeof(test_vec[i].a))); + + r_ = simde_vld3_bf16(a_); + simde_test_arm_neon_assert_equal_bf16x4(r_.val[0], simde_vld1_bf16(test_vec[i].r0), 1); + simde_test_arm_neon_assert_equal_bf16x4(r_.val[1], simde_vld1_bf16(test_vec[i].r1), 1); + simde_test_arm_neon_assert_equal_bf16x4(r_.val[2], simde_vld1_bf16(test_vec[i].r2), 1); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_bfloat16x4_t r0 = simde_test_arm_neon_random_bf16x4(-100.0f, 100.0f); + simde_bfloat16x4_t r1 = simde_test_arm_neon_random_bf16x4(-100.0f, 100.0f); + simde_bfloat16x4_t r2 = simde_test_arm_neon_random_bf16x4(-100.0f, 100.0f); + simde_bfloat16x12_t a = simde_vst3_bf16(r0, r1, r2); + + simde_test_arm_neon_write_bf16x4(2, r0, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x4(2, r1, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x4(2, r2, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x12(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vst3q_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16 r0[8]; + simde_bfloat16 r1[8]; + simde_bfloat16 r2[8]; + simde_bfloat16 a[24]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 58.181), SIMDE_BFLOAT16_VALUE( - 74.070), SIMDE_BFLOAT16_VALUE( 2.770), SIMDE_BFLOAT16_VALUE( 89.824), + SIMDE_BFLOAT16_VALUE( - 73.116), SIMDE_BFLOAT16_VALUE( 77.533), SIMDE_BFLOAT16_VALUE( - 71.575), SIMDE_BFLOAT16_VALUE( 68.580) }, + { SIMDE_BFLOAT16_VALUE( 27.343), SIMDE_BFLOAT16_VALUE( 89.326), SIMDE_BFLOAT16_VALUE( - 80.249), SIMDE_BFLOAT16_VALUE( - 44.763), + SIMDE_BFLOAT16_VALUE( 75.289), SIMDE_BFLOAT16_VALUE( - 8.705), SIMDE_BFLOAT16_VALUE( 79.289), SIMDE_BFLOAT16_VALUE( - 12.997) }, + { SIMDE_BFLOAT16_VALUE( 88.201), SIMDE_BFLOAT16_VALUE( - 99.297), SIMDE_BFLOAT16_VALUE( 94.888), SIMDE_BFLOAT16_VALUE( - 94.830), + SIMDE_BFLOAT16_VALUE( - 82.408), SIMDE_BFLOAT16_VALUE( - 38.270), SIMDE_BFLOAT16_VALUE( 33.263), SIMDE_BFLOAT16_VALUE( 12.688) }, + { SIMDE_BFLOAT16_VALUE( 58.181), SIMDE_BFLOAT16_VALUE( 27.343), SIMDE_BFLOAT16_VALUE( 88.201), SIMDE_BFLOAT16_VALUE( - 74.070), + SIMDE_BFLOAT16_VALUE( 89.326), SIMDE_BFLOAT16_VALUE( - 99.297), SIMDE_BFLOAT16_VALUE( 2.770), SIMDE_BFLOAT16_VALUE( - 80.249), + SIMDE_BFLOAT16_VALUE( 94.888), SIMDE_BFLOAT16_VALUE( 89.824), SIMDE_BFLOAT16_VALUE( - 44.763), SIMDE_BFLOAT16_VALUE( - 94.830), + SIMDE_BFLOAT16_VALUE( - 73.116), SIMDE_BFLOAT16_VALUE( 75.289), SIMDE_BFLOAT16_VALUE( - 82.408), SIMDE_BFLOAT16_VALUE( 77.533), + SIMDE_BFLOAT16_VALUE( - 8.705), SIMDE_BFLOAT16_VALUE( - 38.270), SIMDE_BFLOAT16_VALUE( - 71.575), SIMDE_BFLOAT16_VALUE( 79.289), + SIMDE_BFLOAT16_VALUE( 33.263), SIMDE_BFLOAT16_VALUE( 68.580), SIMDE_BFLOAT16_VALUE( - 12.997), SIMDE_BFLOAT16_VALUE( 12.688) } }, + { { SIMDE_BFLOAT16_VALUE( - 68.228), SIMDE_BFLOAT16_VALUE( - 30.795), SIMDE_BFLOAT16_VALUE( - 93.060), SIMDE_BFLOAT16_VALUE( 88.656), + SIMDE_BFLOAT16_VALUE( 71.174), SIMDE_BFLOAT16_VALUE( - 83.014), SIMDE_BFLOAT16_VALUE( 34.681), SIMDE_BFLOAT16_VALUE( - 81.096) }, + { SIMDE_BFLOAT16_VALUE( 80.371), SIMDE_BFLOAT16_VALUE( 94.314), SIMDE_BFLOAT16_VALUE( - 28.329), SIMDE_BFLOAT16_VALUE( - 76.339), + SIMDE_BFLOAT16_VALUE( 13.986), SIMDE_BFLOAT16_VALUE( 15.222), SIMDE_BFLOAT16_VALUE( 76.136), SIMDE_BFLOAT16_VALUE( - 47.982) }, + { SIMDE_BFLOAT16_VALUE( - 71.178), SIMDE_BFLOAT16_VALUE( - 44.770), SIMDE_BFLOAT16_VALUE( - 67.133), SIMDE_BFLOAT16_VALUE( 84.421), + SIMDE_BFLOAT16_VALUE( - 74.326), SIMDE_BFLOAT16_VALUE( - 0.009), SIMDE_BFLOAT16_VALUE( - 15.213), SIMDE_BFLOAT16_VALUE( 78.007) }, + { SIMDE_BFLOAT16_VALUE( - 68.228), SIMDE_BFLOAT16_VALUE( 80.371), SIMDE_BFLOAT16_VALUE( - 71.178), SIMDE_BFLOAT16_VALUE( - 30.795), + SIMDE_BFLOAT16_VALUE( 94.314), SIMDE_BFLOAT16_VALUE( - 44.770), SIMDE_BFLOAT16_VALUE( - 93.060), SIMDE_BFLOAT16_VALUE( - 28.329), + SIMDE_BFLOAT16_VALUE( - 67.133), SIMDE_BFLOAT16_VALUE( 88.656), SIMDE_BFLOAT16_VALUE( - 76.339), SIMDE_BFLOAT16_VALUE( 84.421), + SIMDE_BFLOAT16_VALUE( 71.174), SIMDE_BFLOAT16_VALUE( 13.986), SIMDE_BFLOAT16_VALUE( - 74.326), SIMDE_BFLOAT16_VALUE( - 83.014), + SIMDE_BFLOAT16_VALUE( 15.222), SIMDE_BFLOAT16_VALUE( - 0.009), SIMDE_BFLOAT16_VALUE( 34.681), SIMDE_BFLOAT16_VALUE( 76.136), + SIMDE_BFLOAT16_VALUE( - 15.213), SIMDE_BFLOAT16_VALUE( - 81.096), SIMDE_BFLOAT16_VALUE( - 47.982), SIMDE_BFLOAT16_VALUE( 78.007) } }, + { { SIMDE_BFLOAT16_VALUE( - 99.134), SIMDE_BFLOAT16_VALUE( - 13.860), SIMDE_BFLOAT16_VALUE( - 92.713), SIMDE_BFLOAT16_VALUE( - 86.987), + SIMDE_BFLOAT16_VALUE( - 46.071), SIMDE_BFLOAT16_VALUE( - 46.428), SIMDE_BFLOAT16_VALUE( - 55.358), SIMDE_BFLOAT16_VALUE( 14.468) }, + { SIMDE_BFLOAT16_VALUE( - 16.248), SIMDE_BFLOAT16_VALUE( - 50.317), SIMDE_BFLOAT16_VALUE( - 57.890), SIMDE_BFLOAT16_VALUE( 13.081), + SIMDE_BFLOAT16_VALUE( 58.363), SIMDE_BFLOAT16_VALUE( 4.390), SIMDE_BFLOAT16_VALUE( 3.684), SIMDE_BFLOAT16_VALUE( - 18.959) }, + { SIMDE_BFLOAT16_VALUE( 85.928), SIMDE_BFLOAT16_VALUE( 31.159), SIMDE_BFLOAT16_VALUE( 77.301), SIMDE_BFLOAT16_VALUE( 10.011), + SIMDE_BFLOAT16_VALUE( - 90.228), SIMDE_BFLOAT16_VALUE( - 85.132), SIMDE_BFLOAT16_VALUE( 25.086), SIMDE_BFLOAT16_VALUE( - 86.977) }, + { SIMDE_BFLOAT16_VALUE( - 99.134), SIMDE_BFLOAT16_VALUE( - 16.248), SIMDE_BFLOAT16_VALUE( 85.928), SIMDE_BFLOAT16_VALUE( - 13.860), + SIMDE_BFLOAT16_VALUE( - 50.317), SIMDE_BFLOAT16_VALUE( 31.159), SIMDE_BFLOAT16_VALUE( - 92.713), SIMDE_BFLOAT16_VALUE( - 57.890), + SIMDE_BFLOAT16_VALUE( 77.301), SIMDE_BFLOAT16_VALUE( - 86.987), SIMDE_BFLOAT16_VALUE( 13.081), SIMDE_BFLOAT16_VALUE( 10.011), + SIMDE_BFLOAT16_VALUE( - 46.071), SIMDE_BFLOAT16_VALUE( 58.363), SIMDE_BFLOAT16_VALUE( - 90.228), SIMDE_BFLOAT16_VALUE( - 46.428), + SIMDE_BFLOAT16_VALUE( 4.390), SIMDE_BFLOAT16_VALUE( - 85.132), SIMDE_BFLOAT16_VALUE( - 55.358), SIMDE_BFLOAT16_VALUE( 3.684), + SIMDE_BFLOAT16_VALUE( 25.086), SIMDE_BFLOAT16_VALUE( 14.468), SIMDE_BFLOAT16_VALUE( - 18.959), SIMDE_BFLOAT16_VALUE( - 86.977) } }, + { { SIMDE_BFLOAT16_VALUE( 30.458), SIMDE_BFLOAT16_VALUE( - 38.116), SIMDE_BFLOAT16_VALUE( - 23.410), SIMDE_BFLOAT16_VALUE( - 76.968), + SIMDE_BFLOAT16_VALUE( 94.449), SIMDE_BFLOAT16_VALUE( - 25.593), SIMDE_BFLOAT16_VALUE( - 22.524), SIMDE_BFLOAT16_VALUE( 61.018) }, + { SIMDE_BFLOAT16_VALUE( 52.150), SIMDE_BFLOAT16_VALUE( 3.559), SIMDE_BFLOAT16_VALUE( - 11.531), SIMDE_BFLOAT16_VALUE( - 16.763), + SIMDE_BFLOAT16_VALUE( 58.053), SIMDE_BFLOAT16_VALUE( 59.411), SIMDE_BFLOAT16_VALUE( - 87.074), SIMDE_BFLOAT16_VALUE( 76.655) }, + { SIMDE_BFLOAT16_VALUE( 31.620), SIMDE_BFLOAT16_VALUE( - 8.034), SIMDE_BFLOAT16_VALUE( 77.915), SIMDE_BFLOAT16_VALUE( 90.009), + SIMDE_BFLOAT16_VALUE( 40.231), SIMDE_BFLOAT16_VALUE( - 28.817), SIMDE_BFLOAT16_VALUE( - 12.330), SIMDE_BFLOAT16_VALUE( - 39.982) }, + { SIMDE_BFLOAT16_VALUE( 30.458), SIMDE_BFLOAT16_VALUE( 52.150), SIMDE_BFLOAT16_VALUE( 31.620), SIMDE_BFLOAT16_VALUE( - 38.116), + SIMDE_BFLOAT16_VALUE( 3.559), SIMDE_BFLOAT16_VALUE( - 8.034), SIMDE_BFLOAT16_VALUE( - 23.410), SIMDE_BFLOAT16_VALUE( - 11.531), + SIMDE_BFLOAT16_VALUE( 77.915), SIMDE_BFLOAT16_VALUE( - 76.968), SIMDE_BFLOAT16_VALUE( - 16.763), SIMDE_BFLOAT16_VALUE( 90.009), + SIMDE_BFLOAT16_VALUE( 94.449), SIMDE_BFLOAT16_VALUE( 58.053), SIMDE_BFLOAT16_VALUE( 40.231), SIMDE_BFLOAT16_VALUE( - 25.593), + SIMDE_BFLOAT16_VALUE( 59.411), SIMDE_BFLOAT16_VALUE( - 28.817), SIMDE_BFLOAT16_VALUE( - 22.524), SIMDE_BFLOAT16_VALUE( - 87.074), + SIMDE_BFLOAT16_VALUE( - 12.330), SIMDE_BFLOAT16_VALUE( 61.018), SIMDE_BFLOAT16_VALUE( 76.655), SIMDE_BFLOAT16_VALUE( - 39.982) } }, + { { SIMDE_BFLOAT16_VALUE( 3.549), SIMDE_BFLOAT16_VALUE( - 62.385), SIMDE_BFLOAT16_VALUE( - 33.808), SIMDE_BFLOAT16_VALUE( 25.597), + SIMDE_BFLOAT16_VALUE( - 26.574), SIMDE_BFLOAT16_VALUE( 78.316), SIMDE_BFLOAT16_VALUE( 6.102), SIMDE_BFLOAT16_VALUE( 23.670) }, + { SIMDE_BFLOAT16_VALUE( - 9.134), SIMDE_BFLOAT16_VALUE( 38.254), SIMDE_BFLOAT16_VALUE( 59.581), SIMDE_BFLOAT16_VALUE( 25.105), + SIMDE_BFLOAT16_VALUE( 24.218), SIMDE_BFLOAT16_VALUE( - 76.984), SIMDE_BFLOAT16_VALUE( - 55.415), SIMDE_BFLOAT16_VALUE( 57.498) }, + { SIMDE_BFLOAT16_VALUE( 75.669), SIMDE_BFLOAT16_VALUE( 51.566), SIMDE_BFLOAT16_VALUE( 76.383), SIMDE_BFLOAT16_VALUE( - 88.090), + SIMDE_BFLOAT16_VALUE( - 39.212), SIMDE_BFLOAT16_VALUE( - 12.840), SIMDE_BFLOAT16_VALUE( - 66.692), SIMDE_BFLOAT16_VALUE( - 49.509) }, + { SIMDE_BFLOAT16_VALUE( 3.549), SIMDE_BFLOAT16_VALUE( - 9.134), SIMDE_BFLOAT16_VALUE( 75.669), SIMDE_BFLOAT16_VALUE( - 62.385), + SIMDE_BFLOAT16_VALUE( 38.254), SIMDE_BFLOAT16_VALUE( 51.566), SIMDE_BFLOAT16_VALUE( - 33.808), SIMDE_BFLOAT16_VALUE( 59.581), + SIMDE_BFLOAT16_VALUE( 76.383), SIMDE_BFLOAT16_VALUE( 25.597), SIMDE_BFLOAT16_VALUE( 25.105), SIMDE_BFLOAT16_VALUE( - 88.090), + SIMDE_BFLOAT16_VALUE( - 26.574), SIMDE_BFLOAT16_VALUE( 24.218), SIMDE_BFLOAT16_VALUE( - 39.212), SIMDE_BFLOAT16_VALUE( 78.316), + SIMDE_BFLOAT16_VALUE( - 76.984), SIMDE_BFLOAT16_VALUE( - 12.840), SIMDE_BFLOAT16_VALUE( 6.102), SIMDE_BFLOAT16_VALUE( - 55.415), + SIMDE_BFLOAT16_VALUE( - 66.692), SIMDE_BFLOAT16_VALUE( 23.670), SIMDE_BFLOAT16_VALUE( 57.498), SIMDE_BFLOAT16_VALUE( - 49.509) } }, + { { SIMDE_BFLOAT16_VALUE( 77.925), SIMDE_BFLOAT16_VALUE( 25.899), SIMDE_BFLOAT16_VALUE( 36.333), SIMDE_BFLOAT16_VALUE( 28.714), + SIMDE_BFLOAT16_VALUE( - 36.012), SIMDE_BFLOAT16_VALUE( - 29.170), SIMDE_BFLOAT16_VALUE( - 11.929), SIMDE_BFLOAT16_VALUE( 80.628) }, + { SIMDE_BFLOAT16_VALUE( - 83.488), SIMDE_BFLOAT16_VALUE( 9.307), SIMDE_BFLOAT16_VALUE( 58.801), SIMDE_BFLOAT16_VALUE( 94.273), + SIMDE_BFLOAT16_VALUE( - 86.784), SIMDE_BFLOAT16_VALUE( 18.524), SIMDE_BFLOAT16_VALUE( 82.621), SIMDE_BFLOAT16_VALUE( - 81.155) }, + { SIMDE_BFLOAT16_VALUE( 4.254), SIMDE_BFLOAT16_VALUE( 15.849), SIMDE_BFLOAT16_VALUE( 96.241), SIMDE_BFLOAT16_VALUE( - 5.090), + SIMDE_BFLOAT16_VALUE( 47.936), SIMDE_BFLOAT16_VALUE( - 88.844), SIMDE_BFLOAT16_VALUE( 93.898), SIMDE_BFLOAT16_VALUE( - 39.333) }, + { SIMDE_BFLOAT16_VALUE( 77.925), SIMDE_BFLOAT16_VALUE( - 83.488), SIMDE_BFLOAT16_VALUE( 4.254), SIMDE_BFLOAT16_VALUE( 25.899), + SIMDE_BFLOAT16_VALUE( 9.307), SIMDE_BFLOAT16_VALUE( 15.849), SIMDE_BFLOAT16_VALUE( 36.333), SIMDE_BFLOAT16_VALUE( 58.801), + SIMDE_BFLOAT16_VALUE( 96.241), SIMDE_BFLOAT16_VALUE( 28.714), SIMDE_BFLOAT16_VALUE( 94.273), SIMDE_BFLOAT16_VALUE( - 5.090), + SIMDE_BFLOAT16_VALUE( - 36.012), SIMDE_BFLOAT16_VALUE( - 86.784), SIMDE_BFLOAT16_VALUE( 47.936), SIMDE_BFLOAT16_VALUE( - 29.170), + SIMDE_BFLOAT16_VALUE( 18.524), SIMDE_BFLOAT16_VALUE( - 88.844), SIMDE_BFLOAT16_VALUE( - 11.929), SIMDE_BFLOAT16_VALUE( 82.621), + SIMDE_BFLOAT16_VALUE( 93.898), SIMDE_BFLOAT16_VALUE( 80.628), SIMDE_BFLOAT16_VALUE( - 81.155), SIMDE_BFLOAT16_VALUE( - 39.333) } }, + { { SIMDE_BFLOAT16_VALUE( - 60.634), SIMDE_BFLOAT16_VALUE( 75.923), SIMDE_BFLOAT16_VALUE( - 88.231), SIMDE_BFLOAT16_VALUE( - 87.014), + SIMDE_BFLOAT16_VALUE( 31.833), SIMDE_BFLOAT16_VALUE( - 64.054), SIMDE_BFLOAT16_VALUE( 59.268), SIMDE_BFLOAT16_VALUE( - 10.180) }, + { SIMDE_BFLOAT16_VALUE( 89.023), SIMDE_BFLOAT16_VALUE( - 72.712), SIMDE_BFLOAT16_VALUE( 78.505), SIMDE_BFLOAT16_VALUE( 11.950), + SIMDE_BFLOAT16_VALUE( 37.332), SIMDE_BFLOAT16_VALUE( - 36.100), SIMDE_BFLOAT16_VALUE( - 81.490), SIMDE_BFLOAT16_VALUE( 70.182) }, + { SIMDE_BFLOAT16_VALUE( 83.870), SIMDE_BFLOAT16_VALUE( - 68.922), SIMDE_BFLOAT16_VALUE( - 62.692), SIMDE_BFLOAT16_VALUE( - 32.504), + SIMDE_BFLOAT16_VALUE( - 81.255), SIMDE_BFLOAT16_VALUE( 91.033), SIMDE_BFLOAT16_VALUE( - 71.163), SIMDE_BFLOAT16_VALUE( - 22.896) }, + { SIMDE_BFLOAT16_VALUE( - 60.634), SIMDE_BFLOAT16_VALUE( 89.023), SIMDE_BFLOAT16_VALUE( 83.870), SIMDE_BFLOAT16_VALUE( 75.923), + SIMDE_BFLOAT16_VALUE( - 72.712), SIMDE_BFLOAT16_VALUE( - 68.922), SIMDE_BFLOAT16_VALUE( - 88.231), SIMDE_BFLOAT16_VALUE( 78.505), + SIMDE_BFLOAT16_VALUE( - 62.692), SIMDE_BFLOAT16_VALUE( - 87.014), SIMDE_BFLOAT16_VALUE( 11.950), SIMDE_BFLOAT16_VALUE( - 32.504), + SIMDE_BFLOAT16_VALUE( 31.833), SIMDE_BFLOAT16_VALUE( 37.332), SIMDE_BFLOAT16_VALUE( - 81.255), SIMDE_BFLOAT16_VALUE( - 64.054), + SIMDE_BFLOAT16_VALUE( - 36.100), SIMDE_BFLOAT16_VALUE( 91.033), SIMDE_BFLOAT16_VALUE( 59.268), SIMDE_BFLOAT16_VALUE( - 81.490), + SIMDE_BFLOAT16_VALUE( - 71.163), SIMDE_BFLOAT16_VALUE( - 10.180), SIMDE_BFLOAT16_VALUE( 70.182), SIMDE_BFLOAT16_VALUE( - 22.896) } }, + { { SIMDE_BFLOAT16_VALUE( 30.680), SIMDE_BFLOAT16_VALUE( 70.181), SIMDE_BFLOAT16_VALUE( 61.927), SIMDE_BFLOAT16_VALUE( 89.100), + SIMDE_BFLOAT16_VALUE( - 41.719), SIMDE_BFLOAT16_VALUE( 79.129), SIMDE_BFLOAT16_VALUE( 27.325), SIMDE_BFLOAT16_VALUE( - 19.893) }, + { SIMDE_BFLOAT16_VALUE( - 95.074), SIMDE_BFLOAT16_VALUE( 39.687), SIMDE_BFLOAT16_VALUE( - 65.504), SIMDE_BFLOAT16_VALUE( 87.309), + SIMDE_BFLOAT16_VALUE( - 63.357), SIMDE_BFLOAT16_VALUE( 37.794), SIMDE_BFLOAT16_VALUE( 30.688), SIMDE_BFLOAT16_VALUE( 3.602) }, + { SIMDE_BFLOAT16_VALUE( - 90.304), SIMDE_BFLOAT16_VALUE( - 57.865), SIMDE_BFLOAT16_VALUE( 1.237), SIMDE_BFLOAT16_VALUE( 95.036), + SIMDE_BFLOAT16_VALUE( - 46.211), SIMDE_BFLOAT16_VALUE( 17.337), SIMDE_BFLOAT16_VALUE( 24.755), SIMDE_BFLOAT16_VALUE( 20.183) }, + { SIMDE_BFLOAT16_VALUE( 30.680), SIMDE_BFLOAT16_VALUE( - 95.074), SIMDE_BFLOAT16_VALUE( - 90.304), SIMDE_BFLOAT16_VALUE( 70.181), + SIMDE_BFLOAT16_VALUE( 39.687), SIMDE_BFLOAT16_VALUE( - 57.865), SIMDE_BFLOAT16_VALUE( 61.927), SIMDE_BFLOAT16_VALUE( - 65.504), + SIMDE_BFLOAT16_VALUE( 1.237), SIMDE_BFLOAT16_VALUE( 89.100), SIMDE_BFLOAT16_VALUE( 87.309), SIMDE_BFLOAT16_VALUE( 95.036), + SIMDE_BFLOAT16_VALUE( - 41.719), SIMDE_BFLOAT16_VALUE( - 63.357), SIMDE_BFLOAT16_VALUE( - 46.211), SIMDE_BFLOAT16_VALUE( 79.129), + SIMDE_BFLOAT16_VALUE( 37.794), SIMDE_BFLOAT16_VALUE( 17.337), SIMDE_BFLOAT16_VALUE( 27.325), SIMDE_BFLOAT16_VALUE( 30.688), + SIMDE_BFLOAT16_VALUE( 24.755), SIMDE_BFLOAT16_VALUE( - 19.893), SIMDE_BFLOAT16_VALUE( 3.602), SIMDE_BFLOAT16_VALUE( 20.183) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8x3_t r_ = { { simde_vld1q_bf16(test_vec[i].r0), + simde_vld1q_bf16(test_vec[i].r1), + simde_vld1q_bf16(test_vec[i].r2), } }; + + simde_bfloat16 a_[24]; + simde_vst3q_bf16(a_, r_); + simde_assert_equal_i(0, simde_memcmp(a_, test_vec[i].a, sizeof(test_vec[i].a))); + + r_ = simde_vld3q_bf16(a_); + simde_test_arm_neon_assert_equal_bf16x8(r_.val[0], simde_vld1q_bf16(test_vec[i].r0), 1); + simde_test_arm_neon_assert_equal_bf16x8(r_.val[1], simde_vld1q_bf16(test_vec[i].r1), 1); + simde_test_arm_neon_assert_equal_bf16x8(r_.val[2], simde_vld1q_bf16(test_vec[i].r2), 1); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_bfloat16x8_t r0 = simde_test_arm_neon_random_bf16x8(-100.0f, 100.0f); + simde_bfloat16x8_t r1 = simde_test_arm_neon_random_bf16x8(-100.0f, 100.0f); + simde_bfloat16x8_t r2 = simde_test_arm_neon_random_bf16x8(-100.0f, 100.0f); + simde_bfloat16x24_t a = simde_vst3q_bf16(r0, r1, r2); + + simde_test_arm_neon_write_bf16x8(2, r0, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x8(2, r1, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, r2, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x24(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -6249,6 +6483,8 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vst3_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vst3q_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vst3q_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vst3q_p64) +SIMDE_TEST_FUNC_LIST_ENTRY(vst3_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vst3q_bf16) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/st3_lane.c b/test/arm/neon/st3_lane.c index b22d31c52..51c6ae6b6 100644 --- a/test/arm/neon/st3_lane.c +++ b/test/arm/neon/st3_lane.c @@ -1767,6 +1767,160 @@ test_simde_vst3q_lane_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vst3_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t a[3]; + simde_bfloat16_t val[3][4]; + int lane; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( - 94.290), SIMDE_BFLOAT16_VALUE( - 50.509), SIMDE_BFLOAT16_VALUE( 23.704) }, + { { SIMDE_BFLOAT16_VALUE( - 0.571), SIMDE_BFLOAT16_VALUE( - 94.290), SIMDE_BFLOAT16_VALUE( 93.093), SIMDE_BFLOAT16_VALUE( 89.891) }, + { SIMDE_BFLOAT16_VALUE( - 59.956), SIMDE_BFLOAT16_VALUE( - 50.509), SIMDE_BFLOAT16_VALUE( 35.194), SIMDE_BFLOAT16_VALUE( 22.787) }, + { SIMDE_BFLOAT16_VALUE( - 24.560), SIMDE_BFLOAT16_VALUE( 23.704), SIMDE_BFLOAT16_VALUE( - 11.110), SIMDE_BFLOAT16_VALUE( - 19.691) } }, + INT8_C( 1) }, + { { SIMDE_BFLOAT16_VALUE( - 6.814), SIMDE_BFLOAT16_VALUE( - 31.127), SIMDE_BFLOAT16_VALUE( - 34.824) }, + { { SIMDE_BFLOAT16_VALUE( - 17.965), SIMDE_BFLOAT16_VALUE( - 6.814), SIMDE_BFLOAT16_VALUE( - 65.421), SIMDE_BFLOAT16_VALUE( 26.500) }, + { SIMDE_BFLOAT16_VALUE( 84.515), SIMDE_BFLOAT16_VALUE( - 31.127), SIMDE_BFLOAT16_VALUE( 85.025), SIMDE_BFLOAT16_VALUE( - 51.272) }, + { SIMDE_BFLOAT16_VALUE( - 38.529), SIMDE_BFLOAT16_VALUE( - 34.824), SIMDE_BFLOAT16_VALUE( - 81.647), SIMDE_BFLOAT16_VALUE( 47.194) } }, + INT8_C( 1) }, + { { SIMDE_BFLOAT16_VALUE( - 73.789), SIMDE_BFLOAT16_VALUE( - 3.383), SIMDE_BFLOAT16_VALUE( - 13.801) }, + { { SIMDE_BFLOAT16_VALUE( - 94.005), SIMDE_BFLOAT16_VALUE( - 35.738), SIMDE_BFLOAT16_VALUE( - 73.789), SIMDE_BFLOAT16_VALUE( - 45.230) }, + { SIMDE_BFLOAT16_VALUE( 12.330), SIMDE_BFLOAT16_VALUE( 74.051), SIMDE_BFLOAT16_VALUE( - 3.383), SIMDE_BFLOAT16_VALUE( - 10.054) }, + { SIMDE_BFLOAT16_VALUE( - 64.841), SIMDE_BFLOAT16_VALUE( 8.563), SIMDE_BFLOAT16_VALUE( - 13.801), SIMDE_BFLOAT16_VALUE( 10.504) } }, + INT8_C( 2) }, + { { SIMDE_BFLOAT16_VALUE( 0.435), SIMDE_BFLOAT16_VALUE( 62.466), SIMDE_BFLOAT16_VALUE( 94.721) }, + { { SIMDE_BFLOAT16_VALUE( 0.435), SIMDE_BFLOAT16_VALUE( - 13.638), SIMDE_BFLOAT16_VALUE( 0.530), SIMDE_BFLOAT16_VALUE( - 61.496) }, + { SIMDE_BFLOAT16_VALUE( 62.466), SIMDE_BFLOAT16_VALUE( 24.828), SIMDE_BFLOAT16_VALUE( 9.968), SIMDE_BFLOAT16_VALUE( - 50.721) }, + { SIMDE_BFLOAT16_VALUE( 94.721), SIMDE_BFLOAT16_VALUE( 44.136), SIMDE_BFLOAT16_VALUE( 78.905), SIMDE_BFLOAT16_VALUE( - 55.458) } }, + INT8_C( 0) }, + { { SIMDE_BFLOAT16_VALUE( - 22.144), SIMDE_BFLOAT16_VALUE( 90.977), SIMDE_BFLOAT16_VALUE( - 5.890) }, + { { SIMDE_BFLOAT16_VALUE( 26.172), SIMDE_BFLOAT16_VALUE( - 89.305), SIMDE_BFLOAT16_VALUE( - 59.818), SIMDE_BFLOAT16_VALUE( - 22.144) }, + { SIMDE_BFLOAT16_VALUE( - 44.719), SIMDE_BFLOAT16_VALUE( - 60.282), SIMDE_BFLOAT16_VALUE( 94.935), SIMDE_BFLOAT16_VALUE( 90.977) }, + { SIMDE_BFLOAT16_VALUE( 80.867), SIMDE_BFLOAT16_VALUE( - 45.339), SIMDE_BFLOAT16_VALUE( - 19.747), SIMDE_BFLOAT16_VALUE( - 5.890) } }, + INT8_C( 3) }, + { { SIMDE_BFLOAT16_VALUE( 23.224), SIMDE_BFLOAT16_VALUE( 49.585), SIMDE_BFLOAT16_VALUE( 78.018) }, + { { SIMDE_BFLOAT16_VALUE( - 48.686), SIMDE_BFLOAT16_VALUE( 23.224), SIMDE_BFLOAT16_VALUE( 40.332), SIMDE_BFLOAT16_VALUE( 74.959) }, + { SIMDE_BFLOAT16_VALUE( - 65.641), SIMDE_BFLOAT16_VALUE( 49.585), SIMDE_BFLOAT16_VALUE( 6.886), SIMDE_BFLOAT16_VALUE( 98.862) }, + { SIMDE_BFLOAT16_VALUE( - 29.125), SIMDE_BFLOAT16_VALUE( 78.018), SIMDE_BFLOAT16_VALUE( - 4.487), SIMDE_BFLOAT16_VALUE( 50.278) } }, + INT8_C( 1) }, + { { SIMDE_BFLOAT16_VALUE( - 90.627), SIMDE_BFLOAT16_VALUE( - 1.372), SIMDE_BFLOAT16_VALUE( - 87.387) }, + { { SIMDE_BFLOAT16_VALUE( - 58.435), SIMDE_BFLOAT16_VALUE( 67.021), SIMDE_BFLOAT16_VALUE( - 90.627), SIMDE_BFLOAT16_VALUE( 69.960) }, + { SIMDE_BFLOAT16_VALUE( 62.852), SIMDE_BFLOAT16_VALUE( 29.780), SIMDE_BFLOAT16_VALUE( - 1.372), SIMDE_BFLOAT16_VALUE( 41.058) }, + { SIMDE_BFLOAT16_VALUE( 43.350), SIMDE_BFLOAT16_VALUE( - 69.931), SIMDE_BFLOAT16_VALUE( - 87.387), SIMDE_BFLOAT16_VALUE( 98.569) } }, + INT8_C( 2) }, + { { SIMDE_BFLOAT16_VALUE( 33.021), SIMDE_BFLOAT16_VALUE( 22.025), SIMDE_BFLOAT16_VALUE( 69.528) }, + { { SIMDE_BFLOAT16_VALUE( 40.864), SIMDE_BFLOAT16_VALUE( 81.943), SIMDE_BFLOAT16_VALUE( - 40.609), SIMDE_BFLOAT16_VALUE( 33.021) }, + { SIMDE_BFLOAT16_VALUE( 93.909), SIMDE_BFLOAT16_VALUE( 69.201), SIMDE_BFLOAT16_VALUE( 43.541), SIMDE_BFLOAT16_VALUE( 22.025) }, + { SIMDE_BFLOAT16_VALUE( 45.748), SIMDE_BFLOAT16_VALUE( - 89.541), SIMDE_BFLOAT16_VALUE( 49.879), SIMDE_BFLOAT16_VALUE( 69.528) } }, + INT8_C( 3) }, + }; + + for (size_t i = 0; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + simde_bfloat16x4x3_t val = {{simde_vld1_bf16(test_vec[i].val[0]), + simde_vld1_bf16(test_vec[i].val[1]), + simde_vld1_bf16(test_vec[i].val[2])}}; + simde_bfloat16_t a[3]; + SIMDE_CONSTIFY_4_NO_RESULT_(simde_vst3_lane_bf16, HEDLEY_UNREACHABLE(), + test_vec[i].lane, a, val); + + simde_assert_equal_bf16(a[0], test_vec[i].a[0], 1); + simde_assert_equal_bf16(a[1], test_vec[i].a[1], 1); + simde_assert_equal_bf16(a[2], test_vec[i].a[2], 1); + } + + return 0; +} + +static int +test_simde_vst3q_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t a[3]; + simde_bfloat16_t val[3][8]; + int lane; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 56.833), SIMDE_BFLOAT16_VALUE( 73.442), SIMDE_BFLOAT16_VALUE( - 22.618) }, + { { SIMDE_BFLOAT16_VALUE( 90.228), SIMDE_BFLOAT16_VALUE( 1.415), SIMDE_BFLOAT16_VALUE( - 54.694), SIMDE_BFLOAT16_VALUE( 41.258), + SIMDE_BFLOAT16_VALUE( 74.577), SIMDE_BFLOAT16_VALUE( 13.483), SIMDE_BFLOAT16_VALUE( 56.833), SIMDE_BFLOAT16_VALUE( 68.200) }, + { SIMDE_BFLOAT16_VALUE( - 65.650), SIMDE_BFLOAT16_VALUE( - 68.388), SIMDE_BFLOAT16_VALUE( - 13.278), SIMDE_BFLOAT16_VALUE( - 65.890), + SIMDE_BFLOAT16_VALUE( 16.926), SIMDE_BFLOAT16_VALUE( - 26.315), SIMDE_BFLOAT16_VALUE( 73.442), SIMDE_BFLOAT16_VALUE( 26.641) }, + { SIMDE_BFLOAT16_VALUE( - 42.649), SIMDE_BFLOAT16_VALUE( 80.336), SIMDE_BFLOAT16_VALUE( 27.756), SIMDE_BFLOAT16_VALUE( 8.267), + SIMDE_BFLOAT16_VALUE( 24.942), SIMDE_BFLOAT16_VALUE( 96.066), SIMDE_BFLOAT16_VALUE( - 22.618), SIMDE_BFLOAT16_VALUE( - 58.346) } }, + INT8_C( 6) }, + { { SIMDE_BFLOAT16_VALUE( - 74.185), SIMDE_BFLOAT16_VALUE( - 78.069), SIMDE_BFLOAT16_VALUE( - 86.364) }, + { { SIMDE_BFLOAT16_VALUE( - 69.189), SIMDE_BFLOAT16_VALUE( - 74.185), SIMDE_BFLOAT16_VALUE( 5.043), SIMDE_BFLOAT16_VALUE( - 18.088), + SIMDE_BFLOAT16_VALUE( 14.723), SIMDE_BFLOAT16_VALUE( 9.202), SIMDE_BFLOAT16_VALUE( 78.389), SIMDE_BFLOAT16_VALUE( - 87.305) }, + { SIMDE_BFLOAT16_VALUE( - 12.507), SIMDE_BFLOAT16_VALUE( - 78.069), SIMDE_BFLOAT16_VALUE( - 96.953), SIMDE_BFLOAT16_VALUE( - 96.401), + SIMDE_BFLOAT16_VALUE( 42.165), SIMDE_BFLOAT16_VALUE( 75.353), SIMDE_BFLOAT16_VALUE( - 82.128), SIMDE_BFLOAT16_VALUE( 17.448) }, + { SIMDE_BFLOAT16_VALUE( 57.653), SIMDE_BFLOAT16_VALUE( - 86.364), SIMDE_BFLOAT16_VALUE( 30.786), SIMDE_BFLOAT16_VALUE( - 50.101), + SIMDE_BFLOAT16_VALUE( 60.669), SIMDE_BFLOAT16_VALUE( - 26.173), SIMDE_BFLOAT16_VALUE( 10.148), SIMDE_BFLOAT16_VALUE( - 92.619) } }, + INT8_C( 1) }, + { { SIMDE_BFLOAT16_VALUE( - 30.210), SIMDE_BFLOAT16_VALUE( - 13.667), SIMDE_BFLOAT16_VALUE( - 47.603) }, + { { SIMDE_BFLOAT16_VALUE( - 96.908), SIMDE_BFLOAT16_VALUE( - 14.691), SIMDE_BFLOAT16_VALUE( 67.605), SIMDE_BFLOAT16_VALUE( 52.785), + SIMDE_BFLOAT16_VALUE( 10.770), SIMDE_BFLOAT16_VALUE( 49.923), SIMDE_BFLOAT16_VALUE( 79.174), SIMDE_BFLOAT16_VALUE( - 30.210) }, + { SIMDE_BFLOAT16_VALUE( - 86.230), SIMDE_BFLOAT16_VALUE( - 40.180), SIMDE_BFLOAT16_VALUE( 81.322), SIMDE_BFLOAT16_VALUE( - 4.303), + SIMDE_BFLOAT16_VALUE( - 25.810), SIMDE_BFLOAT16_VALUE( 19.169), SIMDE_BFLOAT16_VALUE( - 7.542), SIMDE_BFLOAT16_VALUE( - 13.667) }, + { SIMDE_BFLOAT16_VALUE( 48.690), SIMDE_BFLOAT16_VALUE( - 84.400), SIMDE_BFLOAT16_VALUE( - 42.388), SIMDE_BFLOAT16_VALUE( - 71.989), + SIMDE_BFLOAT16_VALUE( 81.668), SIMDE_BFLOAT16_VALUE( 61.074), SIMDE_BFLOAT16_VALUE( 68.365), SIMDE_BFLOAT16_VALUE( - 47.603) } }, + INT8_C( 7) }, + { { SIMDE_BFLOAT16_VALUE( - 74.022), SIMDE_BFLOAT16_VALUE( 72.818), SIMDE_BFLOAT16_VALUE( 75.403) }, + { { SIMDE_BFLOAT16_VALUE( 65.684), SIMDE_BFLOAT16_VALUE( 92.561), SIMDE_BFLOAT16_VALUE( - 76.038), SIMDE_BFLOAT16_VALUE( 75.659), + SIMDE_BFLOAT16_VALUE( - 74.022), SIMDE_BFLOAT16_VALUE( 74.037), SIMDE_BFLOAT16_VALUE( - 67.037), SIMDE_BFLOAT16_VALUE( 61.026) }, + { SIMDE_BFLOAT16_VALUE( 43.862), SIMDE_BFLOAT16_VALUE( - 42.260), SIMDE_BFLOAT16_VALUE( - 8.530), SIMDE_BFLOAT16_VALUE( 15.388), + SIMDE_BFLOAT16_VALUE( 72.818), SIMDE_BFLOAT16_VALUE( - 3.493), SIMDE_BFLOAT16_VALUE( 29.692), SIMDE_BFLOAT16_VALUE( 78.968) }, + { SIMDE_BFLOAT16_VALUE( - 91.120), SIMDE_BFLOAT16_VALUE( 22.041), SIMDE_BFLOAT16_VALUE( - 61.013), SIMDE_BFLOAT16_VALUE( - 71.187), + SIMDE_BFLOAT16_VALUE( 75.403), SIMDE_BFLOAT16_VALUE( 95.292), SIMDE_BFLOAT16_VALUE( 21.707), SIMDE_BFLOAT16_VALUE( - 88.034) } }, + INT8_C( 4) }, + { { SIMDE_BFLOAT16_VALUE( 66.250), SIMDE_BFLOAT16_VALUE( 86.996), SIMDE_BFLOAT16_VALUE( - 40.809) }, + { { SIMDE_BFLOAT16_VALUE( 56.098), SIMDE_BFLOAT16_VALUE( - 69.469), SIMDE_BFLOAT16_VALUE( - 38.141), SIMDE_BFLOAT16_VALUE( 95.730), + SIMDE_BFLOAT16_VALUE( 66.250), SIMDE_BFLOAT16_VALUE( 88.246), SIMDE_BFLOAT16_VALUE( - 73.861), SIMDE_BFLOAT16_VALUE( 88.929) }, + { SIMDE_BFLOAT16_VALUE( 91.342), SIMDE_BFLOAT16_VALUE( 25.976), SIMDE_BFLOAT16_VALUE( 27.770), SIMDE_BFLOAT16_VALUE( 57.030), + SIMDE_BFLOAT16_VALUE( 86.996), SIMDE_BFLOAT16_VALUE( 24.429), SIMDE_BFLOAT16_VALUE( 36.571), SIMDE_BFLOAT16_VALUE( 25.024) }, + { SIMDE_BFLOAT16_VALUE( - 51.937), SIMDE_BFLOAT16_VALUE( 0.024), SIMDE_BFLOAT16_VALUE( 26.121), SIMDE_BFLOAT16_VALUE( 82.133), + SIMDE_BFLOAT16_VALUE( - 40.809), SIMDE_BFLOAT16_VALUE( - 89.179), SIMDE_BFLOAT16_VALUE( - 45.771), SIMDE_BFLOAT16_VALUE( - 76.817) } }, + INT8_C( 4) }, + { { SIMDE_BFLOAT16_VALUE( 41.869), SIMDE_BFLOAT16_VALUE( - 27.827), SIMDE_BFLOAT16_VALUE( - 92.856) }, + { { SIMDE_BFLOAT16_VALUE( - 35.175), SIMDE_BFLOAT16_VALUE( 47.619), SIMDE_BFLOAT16_VALUE( 41.869), SIMDE_BFLOAT16_VALUE( 17.848), + SIMDE_BFLOAT16_VALUE( - 56.188), SIMDE_BFLOAT16_VALUE( - 50.409), SIMDE_BFLOAT16_VALUE( 65.876), SIMDE_BFLOAT16_VALUE( - 32.688) }, + { SIMDE_BFLOAT16_VALUE( 3.311), SIMDE_BFLOAT16_VALUE( - 49.604), SIMDE_BFLOAT16_VALUE( - 27.827), SIMDE_BFLOAT16_VALUE( - 2.760), + SIMDE_BFLOAT16_VALUE( 20.012), SIMDE_BFLOAT16_VALUE( 66.946), SIMDE_BFLOAT16_VALUE( 31.788), SIMDE_BFLOAT16_VALUE( - 52.736) }, + { SIMDE_BFLOAT16_VALUE( - 93.576), SIMDE_BFLOAT16_VALUE( 4.057), SIMDE_BFLOAT16_VALUE( - 92.856), SIMDE_BFLOAT16_VALUE( 68.167), + SIMDE_BFLOAT16_VALUE( - 17.311), SIMDE_BFLOAT16_VALUE( - 69.405), SIMDE_BFLOAT16_VALUE( 82.245), SIMDE_BFLOAT16_VALUE( - 7.897) } }, + INT8_C( 2) }, + { { SIMDE_BFLOAT16_VALUE( 84.635), SIMDE_BFLOAT16_VALUE( - 34.646), SIMDE_BFLOAT16_VALUE( - 57.874) }, + { { SIMDE_BFLOAT16_VALUE( 81.549), SIMDE_BFLOAT16_VALUE( - 2.028), SIMDE_BFLOAT16_VALUE( 84.635), SIMDE_BFLOAT16_VALUE( - 29.533), + SIMDE_BFLOAT16_VALUE( - 38.208), SIMDE_BFLOAT16_VALUE( 73.008), SIMDE_BFLOAT16_VALUE( 35.951), SIMDE_BFLOAT16_VALUE( - 30.779) }, + { SIMDE_BFLOAT16_VALUE( 42.215), SIMDE_BFLOAT16_VALUE( - 27.247), SIMDE_BFLOAT16_VALUE( - 34.646), SIMDE_BFLOAT16_VALUE( - 1.564), + SIMDE_BFLOAT16_VALUE( 71.796), SIMDE_BFLOAT16_VALUE( - 51.547), SIMDE_BFLOAT16_VALUE( 32.523), SIMDE_BFLOAT16_VALUE( - 43.421) }, + { SIMDE_BFLOAT16_VALUE( 0.439), SIMDE_BFLOAT16_VALUE( 13.866), SIMDE_BFLOAT16_VALUE( - 57.874), SIMDE_BFLOAT16_VALUE( - 87.206), + SIMDE_BFLOAT16_VALUE( - 61.660), SIMDE_BFLOAT16_VALUE( 80.530), SIMDE_BFLOAT16_VALUE( - 56.810), SIMDE_BFLOAT16_VALUE( - 20.126) } }, + INT8_C( 2) }, + { { SIMDE_BFLOAT16_VALUE( - 78.288), SIMDE_BFLOAT16_VALUE( 36.942), SIMDE_BFLOAT16_VALUE( 21.455) }, + { { SIMDE_BFLOAT16_VALUE( - 1.116), SIMDE_BFLOAT16_VALUE( 88.525), SIMDE_BFLOAT16_VALUE( - 54.747), SIMDE_BFLOAT16_VALUE( 70.086), + SIMDE_BFLOAT16_VALUE( - 0.981), SIMDE_BFLOAT16_VALUE( - 78.288), SIMDE_BFLOAT16_VALUE( - 64.328), SIMDE_BFLOAT16_VALUE( 72.247) }, + { SIMDE_BFLOAT16_VALUE( 50.505), SIMDE_BFLOAT16_VALUE( 62.460), SIMDE_BFLOAT16_VALUE( 55.021), SIMDE_BFLOAT16_VALUE( 63.023), + SIMDE_BFLOAT16_VALUE( 46.784), SIMDE_BFLOAT16_VALUE( 36.942), SIMDE_BFLOAT16_VALUE( - 96.105), SIMDE_BFLOAT16_VALUE( - 30.818) }, + { SIMDE_BFLOAT16_VALUE( - 28.408), SIMDE_BFLOAT16_VALUE( - 39.921), SIMDE_BFLOAT16_VALUE( 8.839), SIMDE_BFLOAT16_VALUE( - 70.832), + SIMDE_BFLOAT16_VALUE( 33.768), SIMDE_BFLOAT16_VALUE( 21.455), SIMDE_BFLOAT16_VALUE( - 89.062), SIMDE_BFLOAT16_VALUE( 97.215) } }, + INT8_C( 5) }, + }; + + for (size_t i = 0; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + simde_bfloat16x8x3_t val = {{simde_vld1q_bf16(test_vec[i].val[0]), + simde_vld1q_bf16(test_vec[i].val[1]), + simde_vld1q_bf16(test_vec[i].val[2])}}; + simde_bfloat16_t a[3]; + SIMDE_CONSTIFY_8_NO_RESULT_(simde_vst3q_lane_bf16, HEDLEY_UNREACHABLE(), + test_vec[i].lane, a, val); + + simde_assert_equal_bf16(a[0], test_vec[i].a[0], 1); + simde_assert_equal_bf16(a[1], test_vec[i].a[1], 1); + simde_assert_equal_bf16(a[2], test_vec[i].a[2], 1); + } + + return 0; +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -1800,6 +1954,9 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vst3_lane_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vst3q_lane_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vst3q_lane_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vst3q_lane_p64) + +SIMDE_TEST_FUNC_LIST_ENTRY(vst3_lane_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vst3q_lane_bf16) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/st4.c b/test/arm/neon/st4.c index d3865c85b..9daa974f1 100644 --- a/test/arm/neon/st4.c +++ b/test/arm/neon/st4.c @@ -7714,6 +7714,298 @@ test_simde_vst4q_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vst4_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16 r0[4]; + simde_bfloat16 r1[4]; + simde_bfloat16 r2[4]; + simde_bfloat16 r3[4]; + simde_bfloat16 a[16]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( - 47.024), SIMDE_BFLOAT16_VALUE( 6.719), SIMDE_BFLOAT16_VALUE( 41.219), SIMDE_BFLOAT16_VALUE( 13.593) }, + { SIMDE_BFLOAT16_VALUE( - 94.191), SIMDE_BFLOAT16_VALUE( 54.699), SIMDE_BFLOAT16_VALUE( 93.339), SIMDE_BFLOAT16_VALUE( - 70.910) }, + { SIMDE_BFLOAT16_VALUE( - 57.135), SIMDE_BFLOAT16_VALUE( - 74.250), SIMDE_BFLOAT16_VALUE( 44.190), SIMDE_BFLOAT16_VALUE( - 50.049) }, + { SIMDE_BFLOAT16_VALUE( 4.436), SIMDE_BFLOAT16_VALUE( 57.399), SIMDE_BFLOAT16_VALUE( 71.170), SIMDE_BFLOAT16_VALUE( - 90.745) }, + { SIMDE_BFLOAT16_VALUE( - 47.024), SIMDE_BFLOAT16_VALUE( - 94.191), SIMDE_BFLOAT16_VALUE( - 57.135), SIMDE_BFLOAT16_VALUE( 4.436), + SIMDE_BFLOAT16_VALUE( 6.719), SIMDE_BFLOAT16_VALUE( 54.699), SIMDE_BFLOAT16_VALUE( - 74.250), SIMDE_BFLOAT16_VALUE( 57.399), + SIMDE_BFLOAT16_VALUE( 41.219), SIMDE_BFLOAT16_VALUE( 93.339), SIMDE_BFLOAT16_VALUE( 44.190), SIMDE_BFLOAT16_VALUE( 71.170), + SIMDE_BFLOAT16_VALUE( 13.593), SIMDE_BFLOAT16_VALUE( - 70.910), SIMDE_BFLOAT16_VALUE( - 50.049), SIMDE_BFLOAT16_VALUE( - 90.745) } }, + { { SIMDE_BFLOAT16_VALUE( - 57.272), SIMDE_BFLOAT16_VALUE( - 89.707), SIMDE_BFLOAT16_VALUE( 23.428), SIMDE_BFLOAT16_VALUE( - 9.662) }, + { SIMDE_BFLOAT16_VALUE( - 66.994), SIMDE_BFLOAT16_VALUE( - 28.587), SIMDE_BFLOAT16_VALUE( - 24.075), SIMDE_BFLOAT16_VALUE( 72.816) }, + { SIMDE_BFLOAT16_VALUE( 87.704), SIMDE_BFLOAT16_VALUE( 11.476), SIMDE_BFLOAT16_VALUE( - 9.653), SIMDE_BFLOAT16_VALUE( 93.611) }, + { SIMDE_BFLOAT16_VALUE( 96.922), SIMDE_BFLOAT16_VALUE( 35.294), SIMDE_BFLOAT16_VALUE( 9.081), SIMDE_BFLOAT16_VALUE( 56.455) }, + { SIMDE_BFLOAT16_VALUE( - 57.272), SIMDE_BFLOAT16_VALUE( - 66.994), SIMDE_BFLOAT16_VALUE( 87.704), SIMDE_BFLOAT16_VALUE( 96.922), + SIMDE_BFLOAT16_VALUE( - 89.707), SIMDE_BFLOAT16_VALUE( - 28.587), SIMDE_BFLOAT16_VALUE( 11.476), SIMDE_BFLOAT16_VALUE( 35.294), + SIMDE_BFLOAT16_VALUE( 23.428), SIMDE_BFLOAT16_VALUE( - 24.075), SIMDE_BFLOAT16_VALUE( - 9.653), SIMDE_BFLOAT16_VALUE( 9.081), + SIMDE_BFLOAT16_VALUE( - 9.662), SIMDE_BFLOAT16_VALUE( 72.816), SIMDE_BFLOAT16_VALUE( 93.611), SIMDE_BFLOAT16_VALUE( 56.455) } }, + { { SIMDE_BFLOAT16_VALUE( - 93.105), SIMDE_BFLOAT16_VALUE( - 3.401), SIMDE_BFLOAT16_VALUE( 38.259), SIMDE_BFLOAT16_VALUE( - 77.939) }, + { SIMDE_BFLOAT16_VALUE( - 61.605), SIMDE_BFLOAT16_VALUE( - 53.766), SIMDE_BFLOAT16_VALUE( - 79.385), SIMDE_BFLOAT16_VALUE( 51.701) }, + { SIMDE_BFLOAT16_VALUE( - 13.690), SIMDE_BFLOAT16_VALUE( 61.359), SIMDE_BFLOAT16_VALUE( - 48.410), SIMDE_BFLOAT16_VALUE( 83.577) }, + { SIMDE_BFLOAT16_VALUE( - 31.493), SIMDE_BFLOAT16_VALUE( 67.547), SIMDE_BFLOAT16_VALUE( - 49.486), SIMDE_BFLOAT16_VALUE( - 70.863) }, + { SIMDE_BFLOAT16_VALUE( - 93.105), SIMDE_BFLOAT16_VALUE( - 61.605), SIMDE_BFLOAT16_VALUE( - 13.690), SIMDE_BFLOAT16_VALUE( - 31.493), + SIMDE_BFLOAT16_VALUE( - 3.401), SIMDE_BFLOAT16_VALUE( - 53.766), SIMDE_BFLOAT16_VALUE( 61.359), SIMDE_BFLOAT16_VALUE( 67.547), + SIMDE_BFLOAT16_VALUE( 38.259), SIMDE_BFLOAT16_VALUE( - 79.385), SIMDE_BFLOAT16_VALUE( - 48.410), SIMDE_BFLOAT16_VALUE( - 49.486), + SIMDE_BFLOAT16_VALUE( - 77.939), SIMDE_BFLOAT16_VALUE( 51.701), SIMDE_BFLOAT16_VALUE( 83.577), SIMDE_BFLOAT16_VALUE( - 70.863) } }, + { { SIMDE_BFLOAT16_VALUE( - 59.131), SIMDE_BFLOAT16_VALUE( - 86.919), SIMDE_BFLOAT16_VALUE( 79.472), SIMDE_BFLOAT16_VALUE( - 8.816) }, + { SIMDE_BFLOAT16_VALUE( 1.504), SIMDE_BFLOAT16_VALUE( - 19.699), SIMDE_BFLOAT16_VALUE( - 54.045), SIMDE_BFLOAT16_VALUE( 80.818) }, + { SIMDE_BFLOAT16_VALUE( 96.502), SIMDE_BFLOAT16_VALUE( 74.467), SIMDE_BFLOAT16_VALUE( - 62.320), SIMDE_BFLOAT16_VALUE( - 13.596) }, + { SIMDE_BFLOAT16_VALUE( 93.177), SIMDE_BFLOAT16_VALUE( - 66.739), SIMDE_BFLOAT16_VALUE( - 38.338), SIMDE_BFLOAT16_VALUE( 99.656) }, + { SIMDE_BFLOAT16_VALUE( - 59.131), SIMDE_BFLOAT16_VALUE( 1.504), SIMDE_BFLOAT16_VALUE( 96.502), SIMDE_BFLOAT16_VALUE( 93.177), + SIMDE_BFLOAT16_VALUE( - 86.919), SIMDE_BFLOAT16_VALUE( - 19.699), SIMDE_BFLOAT16_VALUE( 74.467), SIMDE_BFLOAT16_VALUE( - 66.739), + SIMDE_BFLOAT16_VALUE( 79.472), SIMDE_BFLOAT16_VALUE( - 54.045), SIMDE_BFLOAT16_VALUE( - 62.320), SIMDE_BFLOAT16_VALUE( - 38.338), + SIMDE_BFLOAT16_VALUE( - 8.816), SIMDE_BFLOAT16_VALUE( 80.818), SIMDE_BFLOAT16_VALUE( - 13.596), SIMDE_BFLOAT16_VALUE( 99.656) } }, + { { SIMDE_BFLOAT16_VALUE( - 37.162), SIMDE_BFLOAT16_VALUE( 16.071), SIMDE_BFLOAT16_VALUE( 53.822), SIMDE_BFLOAT16_VALUE( 26.764) }, + { SIMDE_BFLOAT16_VALUE( 12.408), SIMDE_BFLOAT16_VALUE( 83.245), SIMDE_BFLOAT16_VALUE( - 72.788), SIMDE_BFLOAT16_VALUE( 33.763) }, + { SIMDE_BFLOAT16_VALUE( 62.702), SIMDE_BFLOAT16_VALUE( 47.064), SIMDE_BFLOAT16_VALUE( - 22.343), SIMDE_BFLOAT16_VALUE( - 73.798) }, + { SIMDE_BFLOAT16_VALUE( 47.563), SIMDE_BFLOAT16_VALUE( - 15.230), SIMDE_BFLOAT16_VALUE( - 20.486), SIMDE_BFLOAT16_VALUE( 9.512) }, + { SIMDE_BFLOAT16_VALUE( - 37.162), SIMDE_BFLOAT16_VALUE( 12.408), SIMDE_BFLOAT16_VALUE( 62.702), SIMDE_BFLOAT16_VALUE( 47.563), + SIMDE_BFLOAT16_VALUE( 16.071), SIMDE_BFLOAT16_VALUE( 83.245), SIMDE_BFLOAT16_VALUE( 47.064), SIMDE_BFLOAT16_VALUE( - 15.230), + SIMDE_BFLOAT16_VALUE( 53.822), SIMDE_BFLOAT16_VALUE( - 72.788), SIMDE_BFLOAT16_VALUE( - 22.343), SIMDE_BFLOAT16_VALUE( - 20.486), + SIMDE_BFLOAT16_VALUE( 26.764), SIMDE_BFLOAT16_VALUE( 33.763), SIMDE_BFLOAT16_VALUE( - 73.798), SIMDE_BFLOAT16_VALUE( 9.512) } }, + { { SIMDE_BFLOAT16_VALUE( 81.267), SIMDE_BFLOAT16_VALUE( - 14.419), SIMDE_BFLOAT16_VALUE( - 86.910), SIMDE_BFLOAT16_VALUE( 96.117) }, + { SIMDE_BFLOAT16_VALUE( 63.922), SIMDE_BFLOAT16_VALUE( - 13.784), SIMDE_BFLOAT16_VALUE( 60.900), SIMDE_BFLOAT16_VALUE( - 46.465) }, + { SIMDE_BFLOAT16_VALUE( - 8.848), SIMDE_BFLOAT16_VALUE( - 38.930), SIMDE_BFLOAT16_VALUE( - 83.013), SIMDE_BFLOAT16_VALUE( - 82.394) }, + { SIMDE_BFLOAT16_VALUE( - 76.512), SIMDE_BFLOAT16_VALUE( 98.430), SIMDE_BFLOAT16_VALUE( - 36.632), SIMDE_BFLOAT16_VALUE( 72.951) }, + { SIMDE_BFLOAT16_VALUE( 81.267), SIMDE_BFLOAT16_VALUE( 63.922), SIMDE_BFLOAT16_VALUE( - 8.848), SIMDE_BFLOAT16_VALUE( - 76.512), + SIMDE_BFLOAT16_VALUE( - 14.419), SIMDE_BFLOAT16_VALUE( - 13.784), SIMDE_BFLOAT16_VALUE( - 38.930), SIMDE_BFLOAT16_VALUE( 98.430), + SIMDE_BFLOAT16_VALUE( - 86.910), SIMDE_BFLOAT16_VALUE( 60.900), SIMDE_BFLOAT16_VALUE( - 83.013), SIMDE_BFLOAT16_VALUE( - 36.632), + SIMDE_BFLOAT16_VALUE( 96.117), SIMDE_BFLOAT16_VALUE( - 46.465), SIMDE_BFLOAT16_VALUE( - 82.394), SIMDE_BFLOAT16_VALUE( 72.951) } }, + { { SIMDE_BFLOAT16_VALUE( - 59.414), SIMDE_BFLOAT16_VALUE( - 0.156), SIMDE_BFLOAT16_VALUE( 25.048), SIMDE_BFLOAT16_VALUE( 72.088) }, + { SIMDE_BFLOAT16_VALUE( - 6.793), SIMDE_BFLOAT16_VALUE( 3.483), SIMDE_BFLOAT16_VALUE( - 70.169), SIMDE_BFLOAT16_VALUE( - 17.526) }, + { SIMDE_BFLOAT16_VALUE( - 45.584), SIMDE_BFLOAT16_VALUE( 48.819), SIMDE_BFLOAT16_VALUE( 99.172), SIMDE_BFLOAT16_VALUE( - 28.748) }, + { SIMDE_BFLOAT16_VALUE( 87.589), SIMDE_BFLOAT16_VALUE( 24.842), SIMDE_BFLOAT16_VALUE( 68.343), SIMDE_BFLOAT16_VALUE( 86.487) }, + { SIMDE_BFLOAT16_VALUE( - 59.414), SIMDE_BFLOAT16_VALUE( - 6.793), SIMDE_BFLOAT16_VALUE( - 45.584), SIMDE_BFLOAT16_VALUE( 87.589), + SIMDE_BFLOAT16_VALUE( - 0.156), SIMDE_BFLOAT16_VALUE( 3.483), SIMDE_BFLOAT16_VALUE( 48.819), SIMDE_BFLOAT16_VALUE( 24.842), + SIMDE_BFLOAT16_VALUE( 25.048), SIMDE_BFLOAT16_VALUE( - 70.169), SIMDE_BFLOAT16_VALUE( 99.172), SIMDE_BFLOAT16_VALUE( 68.343), + SIMDE_BFLOAT16_VALUE( 72.088), SIMDE_BFLOAT16_VALUE( - 17.526), SIMDE_BFLOAT16_VALUE( - 28.748), SIMDE_BFLOAT16_VALUE( 86.487) } }, + { { SIMDE_BFLOAT16_VALUE( - 20.140), SIMDE_BFLOAT16_VALUE( - 42.975), SIMDE_BFLOAT16_VALUE( 95.423), SIMDE_BFLOAT16_VALUE( 44.578) }, + { SIMDE_BFLOAT16_VALUE( - 89.956), SIMDE_BFLOAT16_VALUE( 30.266), SIMDE_BFLOAT16_VALUE( - 96.275), SIMDE_BFLOAT16_VALUE( - 86.081) }, + { SIMDE_BFLOAT16_VALUE( - 51.282), SIMDE_BFLOAT16_VALUE( 69.208), SIMDE_BFLOAT16_VALUE( 62.760), SIMDE_BFLOAT16_VALUE( 60.084) }, + { SIMDE_BFLOAT16_VALUE( 50.762), SIMDE_BFLOAT16_VALUE( 51.328), SIMDE_BFLOAT16_VALUE( - 5.349), SIMDE_BFLOAT16_VALUE( 8.335) }, + { SIMDE_BFLOAT16_VALUE( - 20.140), SIMDE_BFLOAT16_VALUE( - 89.956), SIMDE_BFLOAT16_VALUE( - 51.282), SIMDE_BFLOAT16_VALUE( 50.762), + SIMDE_BFLOAT16_VALUE( - 42.975), SIMDE_BFLOAT16_VALUE( 30.266), SIMDE_BFLOAT16_VALUE( 69.208), SIMDE_BFLOAT16_VALUE( 51.328), + SIMDE_BFLOAT16_VALUE( 95.423), SIMDE_BFLOAT16_VALUE( - 96.275), SIMDE_BFLOAT16_VALUE( 62.760), SIMDE_BFLOAT16_VALUE( - 5.349), + SIMDE_BFLOAT16_VALUE( 44.578), SIMDE_BFLOAT16_VALUE( - 86.081), SIMDE_BFLOAT16_VALUE( 60.084), SIMDE_BFLOAT16_VALUE( 8.335) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x4x4_t r_ = { { simde_vld1_bf16(test_vec[i].r0), + simde_vld1_bf16(test_vec[i].r1), + simde_vld1_bf16(test_vec[i].r2), + simde_vld1_bf16(test_vec[i].r3), } }; + + simde_bfloat16 a_[16]; + simde_vst4_bf16(a_, r_); + simde_assert_equal_i(0, simde_memcmp(a_, test_vec[i].a, sizeof(test_vec[i].a))); + + r_ = simde_vld4_bf16(a_); + simde_test_arm_neon_assert_equal_bf16x4(r_.val[0], simde_vld1_bf16(test_vec[i].r0), 1); + simde_test_arm_neon_assert_equal_bf16x4(r_.val[1], simde_vld1_bf16(test_vec[i].r1), 1); + simde_test_arm_neon_assert_equal_bf16x4(r_.val[2], simde_vld1_bf16(test_vec[i].r2), 1); + simde_test_arm_neon_assert_equal_bf16x4(r_.val[3], simde_vld1_bf16(test_vec[i].r3), 1); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_bfloat16x4_t r0 = simde_test_arm_neon_random_bf16x4(-100.0f, 100.0f); + simde_bfloat16x4_t r1 = simde_test_arm_neon_random_bf16x4(-100.0f, 100.0f); + simde_bfloat16x4_t r2 = simde_test_arm_neon_random_bf16x4(-100.0f, 100.0f); + simde_bfloat16x4_t r3 = simde_test_arm_neon_random_bf16x4(-100.0f, 100.0f); + simde_bfloat16x16_t a = simde_vst4_bf16(r0, r1, r2, r3); + + simde_test_arm_neon_write_bf16x4(2, r0, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x4(2, r1, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x4(2, r2, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x4(2, r3, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x16(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + +static int +test_simde_vst4q_bf16 (SIMDE_MUNIT_TEST_ARGS) { +#if 1 + struct { + simde_bfloat16 r0[8]; + simde_bfloat16 r1[8]; + simde_bfloat16 r2[8]; + simde_bfloat16 r3[8]; + simde_bfloat16 a[32]; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( - 14.743), SIMDE_BFLOAT16_VALUE( 96.869), SIMDE_BFLOAT16_VALUE( 35.732), SIMDE_BFLOAT16_VALUE( - 11.204), + SIMDE_BFLOAT16_VALUE( - 36.507), SIMDE_BFLOAT16_VALUE( - 87.762), SIMDE_BFLOAT16_VALUE( - 30.140), SIMDE_BFLOAT16_VALUE( 40.553) }, + { SIMDE_BFLOAT16_VALUE( 90.636), SIMDE_BFLOAT16_VALUE( - 74.102), SIMDE_BFLOAT16_VALUE( - 11.935), SIMDE_BFLOAT16_VALUE( 76.173), + SIMDE_BFLOAT16_VALUE( - 60.016), SIMDE_BFLOAT16_VALUE( - 12.468), SIMDE_BFLOAT16_VALUE( - 42.341), SIMDE_BFLOAT16_VALUE( - 48.188) }, + { SIMDE_BFLOAT16_VALUE( - 65.064), SIMDE_BFLOAT16_VALUE( - 77.067), SIMDE_BFLOAT16_VALUE( - 3.798), SIMDE_BFLOAT16_VALUE( 78.248), + SIMDE_BFLOAT16_VALUE( - 75.705), SIMDE_BFLOAT16_VALUE( - 81.300), SIMDE_BFLOAT16_VALUE( 41.755), SIMDE_BFLOAT16_VALUE( 0.822) }, + { SIMDE_BFLOAT16_VALUE( 45.696), SIMDE_BFLOAT16_VALUE( - 91.718), SIMDE_BFLOAT16_VALUE( 81.433), SIMDE_BFLOAT16_VALUE( 42.239), + SIMDE_BFLOAT16_VALUE( 70.791), SIMDE_BFLOAT16_VALUE( 21.361), SIMDE_BFLOAT16_VALUE( 51.896), SIMDE_BFLOAT16_VALUE( - 38.175) }, + { SIMDE_BFLOAT16_VALUE( - 14.743), SIMDE_BFLOAT16_VALUE( 90.636), SIMDE_BFLOAT16_VALUE( - 65.064), SIMDE_BFLOAT16_VALUE( 45.696), + SIMDE_BFLOAT16_VALUE( 96.869), SIMDE_BFLOAT16_VALUE( - 74.102), SIMDE_BFLOAT16_VALUE( - 77.067), SIMDE_BFLOAT16_VALUE( - 91.718), + SIMDE_BFLOAT16_VALUE( 35.732), SIMDE_BFLOAT16_VALUE( - 11.935), SIMDE_BFLOAT16_VALUE( - 3.798), SIMDE_BFLOAT16_VALUE( 81.433), + SIMDE_BFLOAT16_VALUE( - 11.204), SIMDE_BFLOAT16_VALUE( 76.173), SIMDE_BFLOAT16_VALUE( 78.248), SIMDE_BFLOAT16_VALUE( 42.239), + SIMDE_BFLOAT16_VALUE( - 36.507), SIMDE_BFLOAT16_VALUE( - 60.016), SIMDE_BFLOAT16_VALUE( - 75.705), SIMDE_BFLOAT16_VALUE( 70.791), + SIMDE_BFLOAT16_VALUE( - 87.762), SIMDE_BFLOAT16_VALUE( - 12.468), SIMDE_BFLOAT16_VALUE( - 81.300), SIMDE_BFLOAT16_VALUE( 21.361), + SIMDE_BFLOAT16_VALUE( - 30.140), SIMDE_BFLOAT16_VALUE( - 42.341), SIMDE_BFLOAT16_VALUE( 41.755), SIMDE_BFLOAT16_VALUE( 51.896), + SIMDE_BFLOAT16_VALUE( 40.553), SIMDE_BFLOAT16_VALUE( - 48.188), SIMDE_BFLOAT16_VALUE( 0.822), SIMDE_BFLOAT16_VALUE( - 38.175) } }, + { { SIMDE_BFLOAT16_VALUE( 20.836), SIMDE_BFLOAT16_VALUE( - 6.255), SIMDE_BFLOAT16_VALUE( 79.168), SIMDE_BFLOAT16_VALUE( 29.039), + SIMDE_BFLOAT16_VALUE( 96.927), SIMDE_BFLOAT16_VALUE( 41.696), SIMDE_BFLOAT16_VALUE( - 42.924), SIMDE_BFLOAT16_VALUE( - 7.066) }, + { SIMDE_BFLOAT16_VALUE( 14.370), SIMDE_BFLOAT16_VALUE( 7.192), SIMDE_BFLOAT16_VALUE( - 88.540), SIMDE_BFLOAT16_VALUE( 13.116), + SIMDE_BFLOAT16_VALUE( 64.603), SIMDE_BFLOAT16_VALUE( - 63.088), SIMDE_BFLOAT16_VALUE( - 11.758), SIMDE_BFLOAT16_VALUE( 14.850) }, + { SIMDE_BFLOAT16_VALUE( 27.807), SIMDE_BFLOAT16_VALUE( 11.530), SIMDE_BFLOAT16_VALUE( - 32.331), SIMDE_BFLOAT16_VALUE( - 44.759), + SIMDE_BFLOAT16_VALUE( 24.258), SIMDE_BFLOAT16_VALUE( - 86.786), SIMDE_BFLOAT16_VALUE( - 94.826), SIMDE_BFLOAT16_VALUE( 48.908) }, + { SIMDE_BFLOAT16_VALUE( 20.925), SIMDE_BFLOAT16_VALUE( 99.983), SIMDE_BFLOAT16_VALUE( - 59.823), SIMDE_BFLOAT16_VALUE( 71.958), + SIMDE_BFLOAT16_VALUE( 63.444), SIMDE_BFLOAT16_VALUE( 71.547), SIMDE_BFLOAT16_VALUE( 68.404), SIMDE_BFLOAT16_VALUE( 32.576) }, + { SIMDE_BFLOAT16_VALUE( 20.836), SIMDE_BFLOAT16_VALUE( 14.370), SIMDE_BFLOAT16_VALUE( 27.807), SIMDE_BFLOAT16_VALUE( 20.925), + SIMDE_BFLOAT16_VALUE( - 6.255), SIMDE_BFLOAT16_VALUE( 7.192), SIMDE_BFLOAT16_VALUE( 11.530), SIMDE_BFLOAT16_VALUE( 99.983), + SIMDE_BFLOAT16_VALUE( 79.168), SIMDE_BFLOAT16_VALUE( - 88.540), SIMDE_BFLOAT16_VALUE( - 32.331), SIMDE_BFLOAT16_VALUE( - 59.823), + SIMDE_BFLOAT16_VALUE( 29.039), SIMDE_BFLOAT16_VALUE( 13.116), SIMDE_BFLOAT16_VALUE( - 44.759), SIMDE_BFLOAT16_VALUE( 71.958), + SIMDE_BFLOAT16_VALUE( 96.927), SIMDE_BFLOAT16_VALUE( 64.603), SIMDE_BFLOAT16_VALUE( 24.258), SIMDE_BFLOAT16_VALUE( 63.444), + SIMDE_BFLOAT16_VALUE( 41.696), SIMDE_BFLOAT16_VALUE( - 63.088), SIMDE_BFLOAT16_VALUE( - 86.786), SIMDE_BFLOAT16_VALUE( 71.547), + SIMDE_BFLOAT16_VALUE( - 42.924), SIMDE_BFLOAT16_VALUE( - 11.758), SIMDE_BFLOAT16_VALUE( - 94.826), SIMDE_BFLOAT16_VALUE( 68.404), + SIMDE_BFLOAT16_VALUE( - 7.066), SIMDE_BFLOAT16_VALUE( 14.850), SIMDE_BFLOAT16_VALUE( 48.908), SIMDE_BFLOAT16_VALUE( 32.576) } }, + { { SIMDE_BFLOAT16_VALUE( - 98.651), SIMDE_BFLOAT16_VALUE( 8.370), SIMDE_BFLOAT16_VALUE( 5.212), SIMDE_BFLOAT16_VALUE( - 39.002), + SIMDE_BFLOAT16_VALUE( - 50.855), SIMDE_BFLOAT16_VALUE( 9.832), SIMDE_BFLOAT16_VALUE( 64.681), SIMDE_BFLOAT16_VALUE( 53.110) }, + { SIMDE_BFLOAT16_VALUE( 56.471), SIMDE_BFLOAT16_VALUE( 66.543), SIMDE_BFLOAT16_VALUE( - 19.108), SIMDE_BFLOAT16_VALUE( 57.884), + SIMDE_BFLOAT16_VALUE( 8.069), SIMDE_BFLOAT16_VALUE( - 92.092), SIMDE_BFLOAT16_VALUE( 21.120), SIMDE_BFLOAT16_VALUE( - 28.746) }, + { SIMDE_BFLOAT16_VALUE( - 33.477), SIMDE_BFLOAT16_VALUE( 94.776), SIMDE_BFLOAT16_VALUE( 39.423), SIMDE_BFLOAT16_VALUE( - 14.126), + SIMDE_BFLOAT16_VALUE( - 86.375), SIMDE_BFLOAT16_VALUE( - 35.066), SIMDE_BFLOAT16_VALUE( 93.908), SIMDE_BFLOAT16_VALUE( - 70.598) }, + { SIMDE_BFLOAT16_VALUE( - 47.494), SIMDE_BFLOAT16_VALUE( - 73.328), SIMDE_BFLOAT16_VALUE( - 6.515), SIMDE_BFLOAT16_VALUE( 64.596), + SIMDE_BFLOAT16_VALUE( - 85.478), SIMDE_BFLOAT16_VALUE( - 93.767), SIMDE_BFLOAT16_VALUE( - 96.092), SIMDE_BFLOAT16_VALUE( - 43.609) }, + { SIMDE_BFLOAT16_VALUE( - 98.651), SIMDE_BFLOAT16_VALUE( 56.471), SIMDE_BFLOAT16_VALUE( - 33.477), SIMDE_BFLOAT16_VALUE( - 47.494), + SIMDE_BFLOAT16_VALUE( 8.370), SIMDE_BFLOAT16_VALUE( 66.543), SIMDE_BFLOAT16_VALUE( 94.776), SIMDE_BFLOAT16_VALUE( - 73.328), + SIMDE_BFLOAT16_VALUE( 5.212), SIMDE_BFLOAT16_VALUE( - 19.108), SIMDE_BFLOAT16_VALUE( 39.423), SIMDE_BFLOAT16_VALUE( - 6.515), + SIMDE_BFLOAT16_VALUE( - 39.002), SIMDE_BFLOAT16_VALUE( 57.884), SIMDE_BFLOAT16_VALUE( - 14.126), SIMDE_BFLOAT16_VALUE( 64.596), + SIMDE_BFLOAT16_VALUE( - 50.855), SIMDE_BFLOAT16_VALUE( 8.069), SIMDE_BFLOAT16_VALUE( - 86.375), SIMDE_BFLOAT16_VALUE( - 85.478), + SIMDE_BFLOAT16_VALUE( 9.832), SIMDE_BFLOAT16_VALUE( - 92.092), SIMDE_BFLOAT16_VALUE( - 35.066), SIMDE_BFLOAT16_VALUE( - 93.767), + SIMDE_BFLOAT16_VALUE( 64.681), SIMDE_BFLOAT16_VALUE( 21.120), SIMDE_BFLOAT16_VALUE( 93.908), SIMDE_BFLOAT16_VALUE( - 96.092), + SIMDE_BFLOAT16_VALUE( 53.110), SIMDE_BFLOAT16_VALUE( - 28.746), SIMDE_BFLOAT16_VALUE( - 70.598), SIMDE_BFLOAT16_VALUE( - 43.609) } }, + { { SIMDE_BFLOAT16_VALUE( 32.009), SIMDE_BFLOAT16_VALUE( - 70.333), SIMDE_BFLOAT16_VALUE( 5.538), SIMDE_BFLOAT16_VALUE( 82.520), + SIMDE_BFLOAT16_VALUE( - 40.966), SIMDE_BFLOAT16_VALUE( - 11.607), SIMDE_BFLOAT16_VALUE( - 54.581), SIMDE_BFLOAT16_VALUE( 51.136) }, + { SIMDE_BFLOAT16_VALUE( - 80.277), SIMDE_BFLOAT16_VALUE( 70.486), SIMDE_BFLOAT16_VALUE( - 49.720), SIMDE_BFLOAT16_VALUE( 84.405), + SIMDE_BFLOAT16_VALUE( - 38.234), SIMDE_BFLOAT16_VALUE( 47.061), SIMDE_BFLOAT16_VALUE( - 27.953), SIMDE_BFLOAT16_VALUE( - 35.272) }, + { SIMDE_BFLOAT16_VALUE( 37.433), SIMDE_BFLOAT16_VALUE( 84.527), SIMDE_BFLOAT16_VALUE( 41.358), SIMDE_BFLOAT16_VALUE( - 69.610), + SIMDE_BFLOAT16_VALUE( 51.678), SIMDE_BFLOAT16_VALUE( - 94.404), SIMDE_BFLOAT16_VALUE( - 16.678), SIMDE_BFLOAT16_VALUE( 76.803) }, + { SIMDE_BFLOAT16_VALUE( - 82.082), SIMDE_BFLOAT16_VALUE( - 90.814), SIMDE_BFLOAT16_VALUE( - 62.857), SIMDE_BFLOAT16_VALUE( - 73.589), + SIMDE_BFLOAT16_VALUE( 77.514), SIMDE_BFLOAT16_VALUE( - 67.143), SIMDE_BFLOAT16_VALUE( - 66.907), SIMDE_BFLOAT16_VALUE( 66.753) }, + { SIMDE_BFLOAT16_VALUE( 32.009), SIMDE_BFLOAT16_VALUE( - 80.277), SIMDE_BFLOAT16_VALUE( 37.433), SIMDE_BFLOAT16_VALUE( - 82.082), + SIMDE_BFLOAT16_VALUE( - 70.333), SIMDE_BFLOAT16_VALUE( 70.486), SIMDE_BFLOAT16_VALUE( 84.527), SIMDE_BFLOAT16_VALUE( - 90.814), + SIMDE_BFLOAT16_VALUE( 5.538), SIMDE_BFLOAT16_VALUE( - 49.720), SIMDE_BFLOAT16_VALUE( 41.358), SIMDE_BFLOAT16_VALUE( - 62.857), + SIMDE_BFLOAT16_VALUE( 82.520), SIMDE_BFLOAT16_VALUE( 84.405), SIMDE_BFLOAT16_VALUE( - 69.610), SIMDE_BFLOAT16_VALUE( - 73.589), + SIMDE_BFLOAT16_VALUE( - 40.966), SIMDE_BFLOAT16_VALUE( - 38.234), SIMDE_BFLOAT16_VALUE( 51.678), SIMDE_BFLOAT16_VALUE( 77.514), + SIMDE_BFLOAT16_VALUE( - 11.607), SIMDE_BFLOAT16_VALUE( 47.061), SIMDE_BFLOAT16_VALUE( - 94.404), SIMDE_BFLOAT16_VALUE( - 67.143), + SIMDE_BFLOAT16_VALUE( - 54.581), SIMDE_BFLOAT16_VALUE( - 27.953), SIMDE_BFLOAT16_VALUE( - 16.678), SIMDE_BFLOAT16_VALUE( - 66.907), + SIMDE_BFLOAT16_VALUE( 51.136), SIMDE_BFLOAT16_VALUE( - 35.272), SIMDE_BFLOAT16_VALUE( 76.803), SIMDE_BFLOAT16_VALUE( 66.753) } }, + { { SIMDE_BFLOAT16_VALUE( 13.527), SIMDE_BFLOAT16_VALUE( 15.879), SIMDE_BFLOAT16_VALUE( - 25.658), SIMDE_BFLOAT16_VALUE( 64.222), + SIMDE_BFLOAT16_VALUE( 72.758), SIMDE_BFLOAT16_VALUE( 17.152), SIMDE_BFLOAT16_VALUE( 61.595), SIMDE_BFLOAT16_VALUE( - 25.744) }, + { SIMDE_BFLOAT16_VALUE( 73.965), SIMDE_BFLOAT16_VALUE( 66.305), SIMDE_BFLOAT16_VALUE( - 82.679), SIMDE_BFLOAT16_VALUE( - 48.114), + SIMDE_BFLOAT16_VALUE( 35.804), SIMDE_BFLOAT16_VALUE( 11.885), SIMDE_BFLOAT16_VALUE( - 98.287), SIMDE_BFLOAT16_VALUE( 61.933) }, + { SIMDE_BFLOAT16_VALUE( - 79.049), SIMDE_BFLOAT16_VALUE( 99.270), SIMDE_BFLOAT16_VALUE( - 46.729), SIMDE_BFLOAT16_VALUE( 30.358), + SIMDE_BFLOAT16_VALUE( 46.057), SIMDE_BFLOAT16_VALUE( - 87.368), SIMDE_BFLOAT16_VALUE( 82.236), SIMDE_BFLOAT16_VALUE( - 81.438) }, + { SIMDE_BFLOAT16_VALUE( 31.502), SIMDE_BFLOAT16_VALUE( 72.068), SIMDE_BFLOAT16_VALUE( - 3.689), SIMDE_BFLOAT16_VALUE( 42.230), + SIMDE_BFLOAT16_VALUE( 9.827), SIMDE_BFLOAT16_VALUE( 27.830), SIMDE_BFLOAT16_VALUE( - 62.111), SIMDE_BFLOAT16_VALUE( - 46.971) }, + { SIMDE_BFLOAT16_VALUE( 13.527), SIMDE_BFLOAT16_VALUE( 73.965), SIMDE_BFLOAT16_VALUE( - 79.049), SIMDE_BFLOAT16_VALUE( 31.502), + SIMDE_BFLOAT16_VALUE( 15.879), SIMDE_BFLOAT16_VALUE( 66.305), SIMDE_BFLOAT16_VALUE( 99.270), SIMDE_BFLOAT16_VALUE( 72.068), + SIMDE_BFLOAT16_VALUE( - 25.658), SIMDE_BFLOAT16_VALUE( - 82.679), SIMDE_BFLOAT16_VALUE( - 46.729), SIMDE_BFLOAT16_VALUE( - 3.689), + SIMDE_BFLOAT16_VALUE( 64.222), SIMDE_BFLOAT16_VALUE( - 48.114), SIMDE_BFLOAT16_VALUE( 30.358), SIMDE_BFLOAT16_VALUE( 42.230), + SIMDE_BFLOAT16_VALUE( 72.758), SIMDE_BFLOAT16_VALUE( 35.804), SIMDE_BFLOAT16_VALUE( 46.057), SIMDE_BFLOAT16_VALUE( 9.827), + SIMDE_BFLOAT16_VALUE( 17.152), SIMDE_BFLOAT16_VALUE( 11.885), SIMDE_BFLOAT16_VALUE( - 87.368), SIMDE_BFLOAT16_VALUE( 27.830), + SIMDE_BFLOAT16_VALUE( 61.595), SIMDE_BFLOAT16_VALUE( - 98.287), SIMDE_BFLOAT16_VALUE( 82.236), SIMDE_BFLOAT16_VALUE( - 62.111), + SIMDE_BFLOAT16_VALUE( - 25.744), SIMDE_BFLOAT16_VALUE( 61.933), SIMDE_BFLOAT16_VALUE( - 81.438), SIMDE_BFLOAT16_VALUE( - 46.971) } }, + { { SIMDE_BFLOAT16_VALUE( - 98.937), SIMDE_BFLOAT16_VALUE( - 75.185), SIMDE_BFLOAT16_VALUE( 51.461), SIMDE_BFLOAT16_VALUE( 34.040), + SIMDE_BFLOAT16_VALUE( - 18.490), SIMDE_BFLOAT16_VALUE( 2.435), SIMDE_BFLOAT16_VALUE( - 31.936), SIMDE_BFLOAT16_VALUE( - 44.440) }, + { SIMDE_BFLOAT16_VALUE( 51.617), SIMDE_BFLOAT16_VALUE( 92.309), SIMDE_BFLOAT16_VALUE( - 32.479), SIMDE_BFLOAT16_VALUE( 64.487), + SIMDE_BFLOAT16_VALUE( 33.205), SIMDE_BFLOAT16_VALUE( 26.250), SIMDE_BFLOAT16_VALUE( - 8.956), SIMDE_BFLOAT16_VALUE( 43.765) }, + { SIMDE_BFLOAT16_VALUE( - 80.764), SIMDE_BFLOAT16_VALUE( - 42.445), SIMDE_BFLOAT16_VALUE( - 77.677), SIMDE_BFLOAT16_VALUE( 54.417), + SIMDE_BFLOAT16_VALUE( - 58.892), SIMDE_BFLOAT16_VALUE( 67.912), SIMDE_BFLOAT16_VALUE( - 19.769), SIMDE_BFLOAT16_VALUE( - 94.018) }, + { SIMDE_BFLOAT16_VALUE( 32.228), SIMDE_BFLOAT16_VALUE( - 45.404), SIMDE_BFLOAT16_VALUE( - 11.380), SIMDE_BFLOAT16_VALUE( 85.317), + SIMDE_BFLOAT16_VALUE( 32.872), SIMDE_BFLOAT16_VALUE( - 10.946), SIMDE_BFLOAT16_VALUE( 93.337), SIMDE_BFLOAT16_VALUE( 94.934) }, + { SIMDE_BFLOAT16_VALUE( - 98.937), SIMDE_BFLOAT16_VALUE( 51.617), SIMDE_BFLOAT16_VALUE( - 80.764), SIMDE_BFLOAT16_VALUE( 32.228), + SIMDE_BFLOAT16_VALUE( - 75.185), SIMDE_BFLOAT16_VALUE( 92.309), SIMDE_BFLOAT16_VALUE( - 42.445), SIMDE_BFLOAT16_VALUE( - 45.404), + SIMDE_BFLOAT16_VALUE( 51.461), SIMDE_BFLOAT16_VALUE( - 32.479), SIMDE_BFLOAT16_VALUE( - 77.677), SIMDE_BFLOAT16_VALUE( - 11.380), + SIMDE_BFLOAT16_VALUE( 34.040), SIMDE_BFLOAT16_VALUE( 64.487), SIMDE_BFLOAT16_VALUE( 54.417), SIMDE_BFLOAT16_VALUE( 85.317), + SIMDE_BFLOAT16_VALUE( - 18.490), SIMDE_BFLOAT16_VALUE( 33.205), SIMDE_BFLOAT16_VALUE( - 58.892), SIMDE_BFLOAT16_VALUE( 32.872), + SIMDE_BFLOAT16_VALUE( 2.435), SIMDE_BFLOAT16_VALUE( 26.250), SIMDE_BFLOAT16_VALUE( 67.912), SIMDE_BFLOAT16_VALUE( - 10.946), + SIMDE_BFLOAT16_VALUE( - 31.936), SIMDE_BFLOAT16_VALUE( - 8.956), SIMDE_BFLOAT16_VALUE( - 19.769), SIMDE_BFLOAT16_VALUE( 93.337), + SIMDE_BFLOAT16_VALUE( - 44.440), SIMDE_BFLOAT16_VALUE( 43.765), SIMDE_BFLOAT16_VALUE( - 94.018), SIMDE_BFLOAT16_VALUE( 94.934) } }, + { { SIMDE_BFLOAT16_VALUE( - 82.721), SIMDE_BFLOAT16_VALUE( - 5.083), SIMDE_BFLOAT16_VALUE( 28.116), SIMDE_BFLOAT16_VALUE( - 2.078), + SIMDE_BFLOAT16_VALUE( - 8.045), SIMDE_BFLOAT16_VALUE( 98.088), SIMDE_BFLOAT16_VALUE( 77.205), SIMDE_BFLOAT16_VALUE( - 86.702) }, + { SIMDE_BFLOAT16_VALUE( - 75.686), SIMDE_BFLOAT16_VALUE( - 67.078), SIMDE_BFLOAT16_VALUE( 38.647), SIMDE_BFLOAT16_VALUE( - 7.111), + SIMDE_BFLOAT16_VALUE( - 74.933), SIMDE_BFLOAT16_VALUE( - 54.055), SIMDE_BFLOAT16_VALUE( - 51.905), SIMDE_BFLOAT16_VALUE( 53.734) }, + { SIMDE_BFLOAT16_VALUE( - 39.474), SIMDE_BFLOAT16_VALUE( 89.193), SIMDE_BFLOAT16_VALUE( - 72.210), SIMDE_BFLOAT16_VALUE( - 42.032), + SIMDE_BFLOAT16_VALUE( 61.321), SIMDE_BFLOAT16_VALUE( - 12.021), SIMDE_BFLOAT16_VALUE( - 35.830), SIMDE_BFLOAT16_VALUE( - 85.851) }, + { SIMDE_BFLOAT16_VALUE( 64.970), SIMDE_BFLOAT16_VALUE( 85.757), SIMDE_BFLOAT16_VALUE( 28.273), SIMDE_BFLOAT16_VALUE( 77.789), + SIMDE_BFLOAT16_VALUE( 50.825), SIMDE_BFLOAT16_VALUE( 95.876), SIMDE_BFLOAT16_VALUE( 44.735), SIMDE_BFLOAT16_VALUE( - 28.570) }, + { SIMDE_BFLOAT16_VALUE( - 82.721), SIMDE_BFLOAT16_VALUE( - 75.686), SIMDE_BFLOAT16_VALUE( - 39.474), SIMDE_BFLOAT16_VALUE( 64.970), + SIMDE_BFLOAT16_VALUE( - 5.083), SIMDE_BFLOAT16_VALUE( - 67.078), SIMDE_BFLOAT16_VALUE( 89.193), SIMDE_BFLOAT16_VALUE( 85.757), + SIMDE_BFLOAT16_VALUE( 28.116), SIMDE_BFLOAT16_VALUE( 38.647), SIMDE_BFLOAT16_VALUE( - 72.210), SIMDE_BFLOAT16_VALUE( 28.273), + SIMDE_BFLOAT16_VALUE( - 2.078), SIMDE_BFLOAT16_VALUE( - 7.111), SIMDE_BFLOAT16_VALUE( - 42.032), SIMDE_BFLOAT16_VALUE( 77.789), + SIMDE_BFLOAT16_VALUE( - 8.045), SIMDE_BFLOAT16_VALUE( - 74.933), SIMDE_BFLOAT16_VALUE( 61.321), SIMDE_BFLOAT16_VALUE( 50.825), + SIMDE_BFLOAT16_VALUE( 98.088), SIMDE_BFLOAT16_VALUE( - 54.055), SIMDE_BFLOAT16_VALUE( - 12.021), SIMDE_BFLOAT16_VALUE( 95.876), + SIMDE_BFLOAT16_VALUE( 77.205), SIMDE_BFLOAT16_VALUE( - 51.905), SIMDE_BFLOAT16_VALUE( - 35.830), SIMDE_BFLOAT16_VALUE( 44.735), + SIMDE_BFLOAT16_VALUE( - 86.702), SIMDE_BFLOAT16_VALUE( 53.734), SIMDE_BFLOAT16_VALUE( - 85.851), SIMDE_BFLOAT16_VALUE( - 28.570) } }, + { { SIMDE_BFLOAT16_VALUE( 56.021), SIMDE_BFLOAT16_VALUE( - 47.189), SIMDE_BFLOAT16_VALUE( 34.633), SIMDE_BFLOAT16_VALUE( - 48.482), + SIMDE_BFLOAT16_VALUE( - 13.024), SIMDE_BFLOAT16_VALUE( - 68.164), SIMDE_BFLOAT16_VALUE( - 38.493), SIMDE_BFLOAT16_VALUE( - 96.972) }, + { SIMDE_BFLOAT16_VALUE( 14.297), SIMDE_BFLOAT16_VALUE( 60.328), SIMDE_BFLOAT16_VALUE( - 55.132), SIMDE_BFLOAT16_VALUE( 61.549), + SIMDE_BFLOAT16_VALUE( 25.753), SIMDE_BFLOAT16_VALUE( 72.855), SIMDE_BFLOAT16_VALUE( 28.394), SIMDE_BFLOAT16_VALUE( 58.315) }, + { SIMDE_BFLOAT16_VALUE( - 52.297), SIMDE_BFLOAT16_VALUE( - 59.309), SIMDE_BFLOAT16_VALUE( 39.064), SIMDE_BFLOAT16_VALUE( 92.546), + SIMDE_BFLOAT16_VALUE( 29.222), SIMDE_BFLOAT16_VALUE( 18.830), SIMDE_BFLOAT16_VALUE( 78.006), SIMDE_BFLOAT16_VALUE( - 34.477) }, + { SIMDE_BFLOAT16_VALUE( 48.515), SIMDE_BFLOAT16_VALUE( 6.778), SIMDE_BFLOAT16_VALUE( 83.115), SIMDE_BFLOAT16_VALUE( - 15.075), + SIMDE_BFLOAT16_VALUE( - 64.544), SIMDE_BFLOAT16_VALUE( - 5.615), SIMDE_BFLOAT16_VALUE( - 79.529), SIMDE_BFLOAT16_VALUE( - 20.122) }, + { SIMDE_BFLOAT16_VALUE( 56.021), SIMDE_BFLOAT16_VALUE( 14.297), SIMDE_BFLOAT16_VALUE( - 52.297), SIMDE_BFLOAT16_VALUE( 48.515), + SIMDE_BFLOAT16_VALUE( - 47.189), SIMDE_BFLOAT16_VALUE( 60.328), SIMDE_BFLOAT16_VALUE( - 59.309), SIMDE_BFLOAT16_VALUE( 6.778), + SIMDE_BFLOAT16_VALUE( 34.633), SIMDE_BFLOAT16_VALUE( - 55.132), SIMDE_BFLOAT16_VALUE( 39.064), SIMDE_BFLOAT16_VALUE( 83.115), + SIMDE_BFLOAT16_VALUE( - 48.482), SIMDE_BFLOAT16_VALUE( 61.549), SIMDE_BFLOAT16_VALUE( 92.546), SIMDE_BFLOAT16_VALUE( - 15.075), + SIMDE_BFLOAT16_VALUE( - 13.024), SIMDE_BFLOAT16_VALUE( 25.753), SIMDE_BFLOAT16_VALUE( 29.222), SIMDE_BFLOAT16_VALUE( - 64.544), + SIMDE_BFLOAT16_VALUE( - 68.164), SIMDE_BFLOAT16_VALUE( 72.855), SIMDE_BFLOAT16_VALUE( 18.830), SIMDE_BFLOAT16_VALUE( - 5.615), + SIMDE_BFLOAT16_VALUE( - 38.493), SIMDE_BFLOAT16_VALUE( 28.394), SIMDE_BFLOAT16_VALUE( 78.006), SIMDE_BFLOAT16_VALUE( - 79.529), + SIMDE_BFLOAT16_VALUE( - 96.972), SIMDE_BFLOAT16_VALUE( 58.315), SIMDE_BFLOAT16_VALUE( - 34.477), SIMDE_BFLOAT16_VALUE( - 20.122) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_bfloat16x8x4_t r_ = { { simde_vld1q_bf16(test_vec[i].r0), + simde_vld1q_bf16(test_vec[i].r1), + simde_vld1q_bf16(test_vec[i].r2), + simde_vld1q_bf16(test_vec[i].r3), } }; + + simde_bfloat16 a_[32]; + simde_vst4q_bf16(a_, r_); + simde_assert_equal_i(0, simde_memcmp(a_, test_vec[i].a, sizeof(test_vec[i].a))); + + r_ = simde_vld4q_bf16(a_); + simde_test_arm_neon_assert_equal_bf16x8(r_.val[0], simde_vld1q_bf16(test_vec[i].r0), 1); + simde_test_arm_neon_assert_equal_bf16x8(r_.val[1], simde_vld1q_bf16(test_vec[i].r1), 1); + simde_test_arm_neon_assert_equal_bf16x8(r_.val[2], simde_vld1q_bf16(test_vec[i].r2), 1); + simde_test_arm_neon_assert_equal_bf16x8(r_.val[3], simde_vld1q_bf16(test_vec[i].r3), 1); + } + + return 0; + +#else + fputc('\n', stdout); + for (int i = 0 ; i < 8 ; i++) { + simde_bfloat16x8_t r0 = simde_test_arm_neon_random_bf16x8(-100.0f, 100.0f); + simde_bfloat16x8_t r1 = simde_test_arm_neon_random_bf16x8(-100.0f, 100.0f); + simde_bfloat16x8_t r2 = simde_test_arm_neon_random_bf16x8(-100.0f, 100.0f); + simde_bfloat16x8_t r3 = simde_test_arm_neon_random_bf16x8(-100.0f, 100.0f); + simde_bfloat16x32_t a = simde_vst4q_bf16(r0, r1, r2, r3); + + simde_test_arm_neon_write_bf16x8(2, r0, SIMDE_TEST_VEC_POS_FIRST); + simde_test_arm_neon_write_bf16x8(2, r1, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, r2, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x8(2, r3, SIMDE_TEST_VEC_POS_MIDDLE); + simde_test_arm_neon_write_bf16x32(2, a, SIMDE_TEST_VEC_POS_LAST); + } + return 1; +#endif +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_BEGIN @@ -7748,6 +8040,9 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vst4_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vst4q_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vst4q_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vst4q_p64) + +SIMDE_TEST_FUNC_LIST_ENTRY(vst4_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vst4q_bf16) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/st4_lane.c b/test/arm/neon/st4_lane.c index c62203208..805c7fc28 100644 --- a/test/arm/neon/st4_lane.c +++ b/test/arm/neon/st4_lane.c @@ -1953,6 +1953,188 @@ test_simde_vst4q_lane_p64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vst4_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t a[4]; + simde_bfloat16_t val[4][4]; + int lane; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( 60.083), SIMDE_BFLOAT16_VALUE( 58.683), SIMDE_BFLOAT16_VALUE( 26.432), SIMDE_BFLOAT16_VALUE( 26.942) }, + { { SIMDE_BFLOAT16_VALUE( 51.260), SIMDE_BFLOAT16_VALUE( 43.575), SIMDE_BFLOAT16_VALUE( 60.083), SIMDE_BFLOAT16_VALUE( 6.426) }, + { SIMDE_BFLOAT16_VALUE( - 54.660), SIMDE_BFLOAT16_VALUE( - 98.247), SIMDE_BFLOAT16_VALUE( 58.683), SIMDE_BFLOAT16_VALUE( - 59.385) }, + { SIMDE_BFLOAT16_VALUE( - 2.564), SIMDE_BFLOAT16_VALUE( 8.979), SIMDE_BFLOAT16_VALUE( 26.432), SIMDE_BFLOAT16_VALUE( 65.683) }, + { SIMDE_BFLOAT16_VALUE( - 27.627), SIMDE_BFLOAT16_VALUE( - 39.374), SIMDE_BFLOAT16_VALUE( 26.942), SIMDE_BFLOAT16_VALUE( 46.466) } }, + INT8_C( 2) }, + { { SIMDE_BFLOAT16_VALUE( - 37.067), SIMDE_BFLOAT16_VALUE( 55.701), SIMDE_BFLOAT16_VALUE( - 31.523), SIMDE_BFLOAT16_VALUE( 65.176) }, + { { SIMDE_BFLOAT16_VALUE( - 6.453), SIMDE_BFLOAT16_VALUE( 99.709), SIMDE_BFLOAT16_VALUE( - 82.488), SIMDE_BFLOAT16_VALUE( - 37.067) }, + { SIMDE_BFLOAT16_VALUE( 54.797), SIMDE_BFLOAT16_VALUE( 11.286), SIMDE_BFLOAT16_VALUE( - 73.371), SIMDE_BFLOAT16_VALUE( 55.701) }, + { SIMDE_BFLOAT16_VALUE( - 24.340), SIMDE_BFLOAT16_VALUE( 63.362), SIMDE_BFLOAT16_VALUE( 5.424), SIMDE_BFLOAT16_VALUE( - 31.523) }, + { SIMDE_BFLOAT16_VALUE( - 43.884), SIMDE_BFLOAT16_VALUE( 18.129), SIMDE_BFLOAT16_VALUE( 58.203), SIMDE_BFLOAT16_VALUE( 65.176) } }, + INT8_C( 3) }, + { { SIMDE_BFLOAT16_VALUE( - 28.720), SIMDE_BFLOAT16_VALUE( - 49.573), SIMDE_BFLOAT16_VALUE( 24.949), SIMDE_BFLOAT16_VALUE( 49.280) }, + { { SIMDE_BFLOAT16_VALUE( 61.070), SIMDE_BFLOAT16_VALUE( - 5.625), SIMDE_BFLOAT16_VALUE( - 72.174), SIMDE_BFLOAT16_VALUE( - 28.720) }, + { SIMDE_BFLOAT16_VALUE( 40.072), SIMDE_BFLOAT16_VALUE( - 46.993), SIMDE_BFLOAT16_VALUE( - 84.710), SIMDE_BFLOAT16_VALUE( - 49.573) }, + { SIMDE_BFLOAT16_VALUE( 77.467), SIMDE_BFLOAT16_VALUE( - 72.848), SIMDE_BFLOAT16_VALUE( - 83.441), SIMDE_BFLOAT16_VALUE( 24.949) }, + { SIMDE_BFLOAT16_VALUE( - 55.436), SIMDE_BFLOAT16_VALUE( - 24.861), SIMDE_BFLOAT16_VALUE( 3.198), SIMDE_BFLOAT16_VALUE( 49.280) } }, + INT8_C( 3) }, + { { SIMDE_BFLOAT16_VALUE( 51.625), SIMDE_BFLOAT16_VALUE( 97.892), SIMDE_BFLOAT16_VALUE( - 17.597), SIMDE_BFLOAT16_VALUE( 5.577) }, + { { SIMDE_BFLOAT16_VALUE( 33.135), SIMDE_BFLOAT16_VALUE( 16.293), SIMDE_BFLOAT16_VALUE( - 26.543), SIMDE_BFLOAT16_VALUE( 51.625) }, + { SIMDE_BFLOAT16_VALUE( 81.686), SIMDE_BFLOAT16_VALUE( 51.696), SIMDE_BFLOAT16_VALUE( - 3.389), SIMDE_BFLOAT16_VALUE( 97.892) }, + { SIMDE_BFLOAT16_VALUE( - 88.988), SIMDE_BFLOAT16_VALUE( 33.960), SIMDE_BFLOAT16_VALUE( - 25.360), SIMDE_BFLOAT16_VALUE( - 17.597) }, + { SIMDE_BFLOAT16_VALUE( - 9.130), SIMDE_BFLOAT16_VALUE( - 32.157), SIMDE_BFLOAT16_VALUE( 22.866), SIMDE_BFLOAT16_VALUE( 5.577) } }, + INT8_C( 3) }, + { { SIMDE_BFLOAT16_VALUE( - 15.048), SIMDE_BFLOAT16_VALUE( 26.311), SIMDE_BFLOAT16_VALUE( - 35.219), SIMDE_BFLOAT16_VALUE( - 43.204) }, + { { SIMDE_BFLOAT16_VALUE( - 15.048), SIMDE_BFLOAT16_VALUE( 61.508), SIMDE_BFLOAT16_VALUE( 97.472), SIMDE_BFLOAT16_VALUE( 66.229) }, + { SIMDE_BFLOAT16_VALUE( 26.311), SIMDE_BFLOAT16_VALUE( - 60.377), SIMDE_BFLOAT16_VALUE( 34.214), SIMDE_BFLOAT16_VALUE( - 88.647) }, + { SIMDE_BFLOAT16_VALUE( - 35.219), SIMDE_BFLOAT16_VALUE( - 74.942), SIMDE_BFLOAT16_VALUE( - 75.514), SIMDE_BFLOAT16_VALUE( 85.620) }, + { SIMDE_BFLOAT16_VALUE( - 43.204), SIMDE_BFLOAT16_VALUE( - 55.337), SIMDE_BFLOAT16_VALUE( 10.157), SIMDE_BFLOAT16_VALUE( 62.595) } }, + INT8_C( 0) }, + { { SIMDE_BFLOAT16_VALUE( 38.903), SIMDE_BFLOAT16_VALUE( - 77.987), SIMDE_BFLOAT16_VALUE( 20.926), SIMDE_BFLOAT16_VALUE( 9.521) }, + { { SIMDE_BFLOAT16_VALUE( 7.294), SIMDE_BFLOAT16_VALUE( 38.903), SIMDE_BFLOAT16_VALUE( 66.733), SIMDE_BFLOAT16_VALUE( 44.944) }, + { SIMDE_BFLOAT16_VALUE( - 96.975), SIMDE_BFLOAT16_VALUE( - 77.987), SIMDE_BFLOAT16_VALUE( - 39.390), SIMDE_BFLOAT16_VALUE( - 30.978) }, + { SIMDE_BFLOAT16_VALUE( 28.002), SIMDE_BFLOAT16_VALUE( 20.926), SIMDE_BFLOAT16_VALUE( - 14.789), SIMDE_BFLOAT16_VALUE( 24.786) }, + { SIMDE_BFLOAT16_VALUE( - 99.879), SIMDE_BFLOAT16_VALUE( 9.521), SIMDE_BFLOAT16_VALUE( - 88.263), SIMDE_BFLOAT16_VALUE( 1.612) } }, + INT8_C( 1) }, + { { SIMDE_BFLOAT16_VALUE( - 7.449), SIMDE_BFLOAT16_VALUE( 16.069), SIMDE_BFLOAT16_VALUE( 25.206), SIMDE_BFLOAT16_VALUE( 48.665) }, + { { SIMDE_BFLOAT16_VALUE( - 94.903), SIMDE_BFLOAT16_VALUE( - 7.449), SIMDE_BFLOAT16_VALUE( 42.096), SIMDE_BFLOAT16_VALUE( - 68.648) }, + { SIMDE_BFLOAT16_VALUE( - 6.593), SIMDE_BFLOAT16_VALUE( 16.069), SIMDE_BFLOAT16_VALUE( 0.945), SIMDE_BFLOAT16_VALUE( - 9.970) }, + { SIMDE_BFLOAT16_VALUE( - 77.854), SIMDE_BFLOAT16_VALUE( 25.206), SIMDE_BFLOAT16_VALUE( - 53.484), SIMDE_BFLOAT16_VALUE( 32.713) }, + { SIMDE_BFLOAT16_VALUE( - 73.085), SIMDE_BFLOAT16_VALUE( 48.665), SIMDE_BFLOAT16_VALUE( - 24.966), SIMDE_BFLOAT16_VALUE( 80.918) } }, + INT8_C( 1) }, + { { SIMDE_BFLOAT16_VALUE( 69.111), SIMDE_BFLOAT16_VALUE( - 96.976), SIMDE_BFLOAT16_VALUE( - 44.445), SIMDE_BFLOAT16_VALUE( - 63.048) }, + { { SIMDE_BFLOAT16_VALUE( 13.879), SIMDE_BFLOAT16_VALUE( - 95.193), SIMDE_BFLOAT16_VALUE( 98.700), SIMDE_BFLOAT16_VALUE( 69.111) }, + { SIMDE_BFLOAT16_VALUE( - 87.658), SIMDE_BFLOAT16_VALUE( - 62.304), SIMDE_BFLOAT16_VALUE( 59.211), SIMDE_BFLOAT16_VALUE( - 96.976) }, + { SIMDE_BFLOAT16_VALUE( 27.387), SIMDE_BFLOAT16_VALUE( 47.095), SIMDE_BFLOAT16_VALUE( - 84.285), SIMDE_BFLOAT16_VALUE( - 44.445) }, + { SIMDE_BFLOAT16_VALUE( - 79.622), SIMDE_BFLOAT16_VALUE( - 44.543), SIMDE_BFLOAT16_VALUE( 19.639), SIMDE_BFLOAT16_VALUE( - 63.048) } }, + INT8_C( 3) }, + }; + + for (size_t i = 0; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + simde_bfloat16x4x4_t val = {{simde_vld1_bf16(test_vec[i].val[0]), + simde_vld1_bf16(test_vec[i].val[1]), + simde_vld1_bf16(test_vec[i].val[2]), + simde_vld1_bf16(test_vec[i].val[3])}}; + simde_bfloat16_t a[4]; + SIMDE_CONSTIFY_4_NO_RESULT_(simde_vst4_lane_bf16, HEDLEY_UNREACHABLE(), + test_vec[i].lane, a, val); + + simde_assert_equal_bf16(a[0], test_vec[i].a[0], 1); + simde_assert_equal_bf16(a[1], test_vec[i].a[1], 1); + simde_assert_equal_bf16(a[2], test_vec[i].a[2], 1); + simde_assert_equal_bf16(a[3], test_vec[i].a[3], 1); + } + + return 0; +} + +static int +test_simde_vst4q_lane_bf16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_bfloat16_t a[4]; + simde_bfloat16_t val[4][8]; + int lane; + } test_vec[] = { + { { SIMDE_BFLOAT16_VALUE( - 98.770), SIMDE_BFLOAT16_VALUE( 14.613), SIMDE_BFLOAT16_VALUE( - 84.301), SIMDE_BFLOAT16_VALUE( 5.731) }, + { { SIMDE_BFLOAT16_VALUE( - 98.770), SIMDE_BFLOAT16_VALUE( 72.336), SIMDE_BFLOAT16_VALUE( 54.135), SIMDE_BFLOAT16_VALUE( 2.463), + SIMDE_BFLOAT16_VALUE( 22.308), SIMDE_BFLOAT16_VALUE( 96.431), SIMDE_BFLOAT16_VALUE( - 70.869), SIMDE_BFLOAT16_VALUE( - 60.824) }, + { SIMDE_BFLOAT16_VALUE( 14.613), SIMDE_BFLOAT16_VALUE( - 44.363), SIMDE_BFLOAT16_VALUE( 22.697), SIMDE_BFLOAT16_VALUE( - 35.818), + SIMDE_BFLOAT16_VALUE( 3.415), SIMDE_BFLOAT16_VALUE( - 49.499), SIMDE_BFLOAT16_VALUE( 88.012), SIMDE_BFLOAT16_VALUE( - 62.649) }, + { SIMDE_BFLOAT16_VALUE( - 84.301), SIMDE_BFLOAT16_VALUE( 83.781), SIMDE_BFLOAT16_VALUE( 77.145), SIMDE_BFLOAT16_VALUE( 90.152), + SIMDE_BFLOAT16_VALUE( - 39.448), SIMDE_BFLOAT16_VALUE( - 61.272), SIMDE_BFLOAT16_VALUE( - 36.164), SIMDE_BFLOAT16_VALUE( - 80.754) }, + { SIMDE_BFLOAT16_VALUE( 5.731), SIMDE_BFLOAT16_VALUE( 35.555), SIMDE_BFLOAT16_VALUE( 50.103), SIMDE_BFLOAT16_VALUE( 5.404), + SIMDE_BFLOAT16_VALUE( - 91.869), SIMDE_BFLOAT16_VALUE( - 74.373), SIMDE_BFLOAT16_VALUE( 44.386), SIMDE_BFLOAT16_VALUE( 93.547) } }, + INT8_C( 0) }, + { { SIMDE_BFLOAT16_VALUE( 33.229), SIMDE_BFLOAT16_VALUE( 61.127), SIMDE_BFLOAT16_VALUE( 84.941), SIMDE_BFLOAT16_VALUE( - 60.142) }, + { { SIMDE_BFLOAT16_VALUE( 19.711), SIMDE_BFLOAT16_VALUE( 18.155), SIMDE_BFLOAT16_VALUE( 57.075), SIMDE_BFLOAT16_VALUE( 33.229), + SIMDE_BFLOAT16_VALUE( 76.025), SIMDE_BFLOAT16_VALUE( 51.787), SIMDE_BFLOAT16_VALUE( - 94.944), SIMDE_BFLOAT16_VALUE( - 15.758) }, + { SIMDE_BFLOAT16_VALUE( - 66.362), SIMDE_BFLOAT16_VALUE( - 34.575), SIMDE_BFLOAT16_VALUE( - 83.725), SIMDE_BFLOAT16_VALUE( 61.127), + SIMDE_BFLOAT16_VALUE( - 69.232), SIMDE_BFLOAT16_VALUE( - 49.809), SIMDE_BFLOAT16_VALUE( - 88.043), SIMDE_BFLOAT16_VALUE( - 6.273) }, + { SIMDE_BFLOAT16_VALUE( 99.864), SIMDE_BFLOAT16_VALUE( 93.575), SIMDE_BFLOAT16_VALUE( - 44.208), SIMDE_BFLOAT16_VALUE( 84.941), + SIMDE_BFLOAT16_VALUE( 88.583), SIMDE_BFLOAT16_VALUE( - 27.809), SIMDE_BFLOAT16_VALUE( 82.999), SIMDE_BFLOAT16_VALUE( 43.553) }, + { SIMDE_BFLOAT16_VALUE( - 9.077), SIMDE_BFLOAT16_VALUE( - 27.498), SIMDE_BFLOAT16_VALUE( - 91.044), SIMDE_BFLOAT16_VALUE( - 60.142), + SIMDE_BFLOAT16_VALUE( - 8.960), SIMDE_BFLOAT16_VALUE( - 42.727), SIMDE_BFLOAT16_VALUE( 83.794), SIMDE_BFLOAT16_VALUE( - 14.626) } }, + INT8_C( 3) }, + { { SIMDE_BFLOAT16_VALUE( - 52.785), SIMDE_BFLOAT16_VALUE( 50.278), SIMDE_BFLOAT16_VALUE( 80.135), SIMDE_BFLOAT16_VALUE( 70.735) }, + { { SIMDE_BFLOAT16_VALUE( - 94.777), SIMDE_BFLOAT16_VALUE( - 52.785), SIMDE_BFLOAT16_VALUE( 1.541), SIMDE_BFLOAT16_VALUE( 6.163), + SIMDE_BFLOAT16_VALUE( 42.017), SIMDE_BFLOAT16_VALUE( 1.317), SIMDE_BFLOAT16_VALUE( 16.236), SIMDE_BFLOAT16_VALUE( - 96.325) }, + { SIMDE_BFLOAT16_VALUE( - 54.833), SIMDE_BFLOAT16_VALUE( 50.278), SIMDE_BFLOAT16_VALUE( 36.420), SIMDE_BFLOAT16_VALUE( 7.185), + SIMDE_BFLOAT16_VALUE( - 47.910), SIMDE_BFLOAT16_VALUE( - 92.387), SIMDE_BFLOAT16_VALUE( - 70.291), SIMDE_BFLOAT16_VALUE( - 87.456) }, + { SIMDE_BFLOAT16_VALUE( 98.589), SIMDE_BFLOAT16_VALUE( 80.135), SIMDE_BFLOAT16_VALUE( 90.248), SIMDE_BFLOAT16_VALUE( - 57.291), + SIMDE_BFLOAT16_VALUE( 78.782), SIMDE_BFLOAT16_VALUE( - 18.645), SIMDE_BFLOAT16_VALUE( 44.035), SIMDE_BFLOAT16_VALUE( - 69.060) }, + { SIMDE_BFLOAT16_VALUE( - 4.907), SIMDE_BFLOAT16_VALUE( 70.735), SIMDE_BFLOAT16_VALUE( 60.495), SIMDE_BFLOAT16_VALUE( 46.837), + SIMDE_BFLOAT16_VALUE( 48.727), SIMDE_BFLOAT16_VALUE( 11.956), SIMDE_BFLOAT16_VALUE( 63.488), SIMDE_BFLOAT16_VALUE( 54.092) } }, + INT8_C( 1) }, + { { SIMDE_BFLOAT16_VALUE( 44.476), SIMDE_BFLOAT16_VALUE( 37.690), SIMDE_BFLOAT16_VALUE( - 71.366), SIMDE_BFLOAT16_VALUE( 65.597) }, + { { SIMDE_BFLOAT16_VALUE( 7.966), SIMDE_BFLOAT16_VALUE( - 89.954), SIMDE_BFLOAT16_VALUE( 44.476), SIMDE_BFLOAT16_VALUE( 93.979), + SIMDE_BFLOAT16_VALUE( - 92.909), SIMDE_BFLOAT16_VALUE( - 70.967), SIMDE_BFLOAT16_VALUE( - 95.756), SIMDE_BFLOAT16_VALUE( 4.963) }, + { SIMDE_BFLOAT16_VALUE( - 29.745), SIMDE_BFLOAT16_VALUE( - 67.014), SIMDE_BFLOAT16_VALUE( 37.690), SIMDE_BFLOAT16_VALUE( - 76.656), + SIMDE_BFLOAT16_VALUE( - 51.753), SIMDE_BFLOAT16_VALUE( 7.929), SIMDE_BFLOAT16_VALUE( - 70.420), SIMDE_BFLOAT16_VALUE( 43.684) }, + { SIMDE_BFLOAT16_VALUE( 44.722), SIMDE_BFLOAT16_VALUE( 15.111), SIMDE_BFLOAT16_VALUE( - 71.366), SIMDE_BFLOAT16_VALUE( - 97.766), + SIMDE_BFLOAT16_VALUE( 89.998), SIMDE_BFLOAT16_VALUE( 21.407), SIMDE_BFLOAT16_VALUE( - 19.366), SIMDE_BFLOAT16_VALUE( - 60.287) }, + { SIMDE_BFLOAT16_VALUE( - 34.807), SIMDE_BFLOAT16_VALUE( - 87.033), SIMDE_BFLOAT16_VALUE( 65.597), SIMDE_BFLOAT16_VALUE( - 27.301), + SIMDE_BFLOAT16_VALUE( - 70.444), SIMDE_BFLOAT16_VALUE( 60.262), SIMDE_BFLOAT16_VALUE( - 19.955), SIMDE_BFLOAT16_VALUE( - 71.415) } }, + INT8_C( 2) }, + { { SIMDE_BFLOAT16_VALUE( 22.061), SIMDE_BFLOAT16_VALUE( - 54.172), SIMDE_BFLOAT16_VALUE( - 54.779), SIMDE_BFLOAT16_VALUE( - 43.246) }, + { { SIMDE_BFLOAT16_VALUE( 43.494), SIMDE_BFLOAT16_VALUE( 62.681), SIMDE_BFLOAT16_VALUE( 38.498), SIMDE_BFLOAT16_VALUE( - 23.142), + SIMDE_BFLOAT16_VALUE( 57.776), SIMDE_BFLOAT16_VALUE( - 16.032), SIMDE_BFLOAT16_VALUE( 22.061), SIMDE_BFLOAT16_VALUE( - 47.440) }, + { SIMDE_BFLOAT16_VALUE( 8.881), SIMDE_BFLOAT16_VALUE( - 4.877), SIMDE_BFLOAT16_VALUE( 93.213), SIMDE_BFLOAT16_VALUE( - 68.090), + SIMDE_BFLOAT16_VALUE( - 32.443), SIMDE_BFLOAT16_VALUE( - 46.325), SIMDE_BFLOAT16_VALUE( - 54.172), SIMDE_BFLOAT16_VALUE( - 13.517) }, + { SIMDE_BFLOAT16_VALUE( 77.177), SIMDE_BFLOAT16_VALUE( - 77.041), SIMDE_BFLOAT16_VALUE( 32.358), SIMDE_BFLOAT16_VALUE( - 42.327), + SIMDE_BFLOAT16_VALUE( 95.672), SIMDE_BFLOAT16_VALUE( 94.045), SIMDE_BFLOAT16_VALUE( - 54.779), SIMDE_BFLOAT16_VALUE( - 2.682) }, + { SIMDE_BFLOAT16_VALUE( - 84.388), SIMDE_BFLOAT16_VALUE( - 25.734), SIMDE_BFLOAT16_VALUE( 86.870), SIMDE_BFLOAT16_VALUE( 59.016), + SIMDE_BFLOAT16_VALUE( 59.342), SIMDE_BFLOAT16_VALUE( 28.672), SIMDE_BFLOAT16_VALUE( - 43.246), SIMDE_BFLOAT16_VALUE( 97.343) } }, + INT8_C( 6) }, + { { SIMDE_BFLOAT16_VALUE( - 20.805), SIMDE_BFLOAT16_VALUE( 71.371), SIMDE_BFLOAT16_VALUE( - 89.862), SIMDE_BFLOAT16_VALUE( 25.312) }, + { { SIMDE_BFLOAT16_VALUE( - 71.695), SIMDE_BFLOAT16_VALUE( - 40.345), SIMDE_BFLOAT16_VALUE( - 20.805), SIMDE_BFLOAT16_VALUE( 38.667), + SIMDE_BFLOAT16_VALUE( 20.408), SIMDE_BFLOAT16_VALUE( - 86.972), SIMDE_BFLOAT16_VALUE( - 56.312), SIMDE_BFLOAT16_VALUE( 76.247) }, + { SIMDE_BFLOAT16_VALUE( 39.998), SIMDE_BFLOAT16_VALUE( - 79.719), SIMDE_BFLOAT16_VALUE( 71.371), SIMDE_BFLOAT16_VALUE( 7.846), + SIMDE_BFLOAT16_VALUE( - 94.570), SIMDE_BFLOAT16_VALUE( - 53.312), SIMDE_BFLOAT16_VALUE( - 72.990), SIMDE_BFLOAT16_VALUE( 58.388) }, + { SIMDE_BFLOAT16_VALUE( 8.013), SIMDE_BFLOAT16_VALUE( - 9.782), SIMDE_BFLOAT16_VALUE( - 89.862), SIMDE_BFLOAT16_VALUE( - 67.543), + SIMDE_BFLOAT16_VALUE( 13.264), SIMDE_BFLOAT16_VALUE( 29.069), SIMDE_BFLOAT16_VALUE( - 49.153), SIMDE_BFLOAT16_VALUE( 26.139) }, + { SIMDE_BFLOAT16_VALUE( - 18.425), SIMDE_BFLOAT16_VALUE( - 61.420), SIMDE_BFLOAT16_VALUE( 25.312), SIMDE_BFLOAT16_VALUE( - 25.551), + SIMDE_BFLOAT16_VALUE( 6.080), SIMDE_BFLOAT16_VALUE( 38.418), SIMDE_BFLOAT16_VALUE( 13.340), SIMDE_BFLOAT16_VALUE( - 56.124) } }, + INT8_C( 2) }, + { { SIMDE_BFLOAT16_VALUE( 78.600), SIMDE_BFLOAT16_VALUE( 61.792), SIMDE_BFLOAT16_VALUE( - 25.973), SIMDE_BFLOAT16_VALUE( 76.425) }, + { { SIMDE_BFLOAT16_VALUE( 18.958), SIMDE_BFLOAT16_VALUE( 64.729), SIMDE_BFLOAT16_VALUE( 1.914), SIMDE_BFLOAT16_VALUE( 85.223), + SIMDE_BFLOAT16_VALUE( 96.281), SIMDE_BFLOAT16_VALUE( 78.600), SIMDE_BFLOAT16_VALUE( 71.180), SIMDE_BFLOAT16_VALUE( 43.076) }, + { SIMDE_BFLOAT16_VALUE( - 82.493), SIMDE_BFLOAT16_VALUE( - 47.753), SIMDE_BFLOAT16_VALUE( - 9.341), SIMDE_BFLOAT16_VALUE( 31.656), + SIMDE_BFLOAT16_VALUE( - 38.949), SIMDE_BFLOAT16_VALUE( 61.792), SIMDE_BFLOAT16_VALUE( 84.671), SIMDE_BFLOAT16_VALUE( 92.457) }, + { SIMDE_BFLOAT16_VALUE( - 78.210), SIMDE_BFLOAT16_VALUE( 24.820), SIMDE_BFLOAT16_VALUE( 65.528), SIMDE_BFLOAT16_VALUE( 46.437), + SIMDE_BFLOAT16_VALUE( 13.524), SIMDE_BFLOAT16_VALUE( - 25.973), SIMDE_BFLOAT16_VALUE( - 0.656), SIMDE_BFLOAT16_VALUE( - 10.110) }, + { SIMDE_BFLOAT16_VALUE( 50.870), SIMDE_BFLOAT16_VALUE( - 85.824), SIMDE_BFLOAT16_VALUE( - 65.392), SIMDE_BFLOAT16_VALUE( 38.653), + SIMDE_BFLOAT16_VALUE( 91.978), SIMDE_BFLOAT16_VALUE( 76.425), SIMDE_BFLOAT16_VALUE( 16.142), SIMDE_BFLOAT16_VALUE( 29.744) } }, + INT8_C( 5) }, + { { SIMDE_BFLOAT16_VALUE( - 42.908), SIMDE_BFLOAT16_VALUE( 47.841), SIMDE_BFLOAT16_VALUE( 45.710), SIMDE_BFLOAT16_VALUE( - 13.391) }, + { { SIMDE_BFLOAT16_VALUE( - 33.961), SIMDE_BFLOAT16_VALUE( 18.906), SIMDE_BFLOAT16_VALUE( - 56.106), SIMDE_BFLOAT16_VALUE( 57.120), + SIMDE_BFLOAT16_VALUE( - 69.166), SIMDE_BFLOAT16_VALUE( 2.556), SIMDE_BFLOAT16_VALUE( - 71.425), SIMDE_BFLOAT16_VALUE( - 42.908) }, + { SIMDE_BFLOAT16_VALUE( 4.074), SIMDE_BFLOAT16_VALUE( 74.119), SIMDE_BFLOAT16_VALUE( 78.984), SIMDE_BFLOAT16_VALUE( - 24.515), + SIMDE_BFLOAT16_VALUE( - 21.240), SIMDE_BFLOAT16_VALUE( - 59.624), SIMDE_BFLOAT16_VALUE( 91.931), SIMDE_BFLOAT16_VALUE( 47.841) }, + { SIMDE_BFLOAT16_VALUE( 74.533), SIMDE_BFLOAT16_VALUE( - 22.329), SIMDE_BFLOAT16_VALUE( - 3.682), SIMDE_BFLOAT16_VALUE( 71.406), + SIMDE_BFLOAT16_VALUE( 65.214), SIMDE_BFLOAT16_VALUE( 18.547), SIMDE_BFLOAT16_VALUE( - 64.480), SIMDE_BFLOAT16_VALUE( 45.710) }, + { SIMDE_BFLOAT16_VALUE( 99.987), SIMDE_BFLOAT16_VALUE( 73.572), SIMDE_BFLOAT16_VALUE( 43.785), SIMDE_BFLOAT16_VALUE( 25.305), + SIMDE_BFLOAT16_VALUE( - 43.854), SIMDE_BFLOAT16_VALUE( 87.175), SIMDE_BFLOAT16_VALUE( 6.221), SIMDE_BFLOAT16_VALUE( - 13.391) } }, + INT8_C( 7) }, + }; + + for (size_t i = 0; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + simde_bfloat16x8x4_t val = {{simde_vld1q_bf16(test_vec[i].val[0]), + simde_vld1q_bf16(test_vec[i].val[1]), + simde_vld1q_bf16(test_vec[i].val[2]), + simde_vld1q_bf16(test_vec[i].val[3])}}; + simde_bfloat16_t a[4]; + SIMDE_CONSTIFY_8_NO_RESULT_(simde_vst4q_lane_bf16, HEDLEY_UNREACHABLE(), + test_vec[i].lane, a, val); + + simde_assert_equal_bf16(a[0], test_vec[i].a[0], 1); + simde_assert_equal_bf16(a[1], test_vec[i].a[1], 1); + simde_assert_equal_bf16(a[2], test_vec[i].a[2], 1); + simde_assert_equal_bf16(a[3], test_vec[i].a[3], 1); + } + + return 0; +} + #endif /* !defined(SIMDE_BUG_INTEL_857088) */ HEDLEY_DIAGNOSTIC_POP @@ -1989,6 +2171,9 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vst4_lane_p64) SIMDE_TEST_FUNC_LIST_ENTRY(vst4q_lane_p8) SIMDE_TEST_FUNC_LIST_ENTRY(vst4q_lane_p16) SIMDE_TEST_FUNC_LIST_ENTRY(vst4q_lane_p64) + +SIMDE_TEST_FUNC_LIST_ENTRY(vst4_lane_bf16) +SIMDE_TEST_FUNC_LIST_ENTRY(vst4q_lane_bf16) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/test-neon.h b/test/arm/neon/test-neon.h index aa9019df1..72c20390f 100644 --- a/test/arm/neon/test-neon.h +++ b/test/arm/neon/test-neon.h @@ -83,7 +83,6 @@ HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION return simde_vld1##modifier##_##symbol_identifier(&(values[pos])); \ } - HEDLEY_DIAGNOSTIC_PUSH SIMDE_DIAGNOSTIC_DISABLE_CPP98_COMPAT_PEDANTIC_ SIMDE_TEST_ARM_NEON_GENERATE_INT_TYPE_FUNCS_( int8x8_t, int8_t, 8, , i8, s8) @@ -122,6 +121,14 @@ SIMDE_TEST_ARM_NEON_GENERATE_FLOAT_TYPE_EQUAL_FUNC_(float16x4_t, simde_float16_t SIMDE_TEST_ARM_NEON_GENERATE_FLOAT_TYPE_EQUAL_FUNC_(float16x8_t, simde_float16_t, simde_float16, 8, q, f16) #endif +#if SIMDE_BFLOAT16_API == SIMDE_BFLOAT16_API_BF16 +SIMDE_TEST_ARM_NEON_GENERATE_FLOAT_TYPE_FUNCS_(bfloat16x4_t, simde_bfloat16_t, simde_bfloat16, 4, , bf16) +SIMDE_TEST_ARM_NEON_GENERATE_FLOAT_TYPE_FUNCS_(bfloat16x8_t, simde_bfloat16_t, simde_bfloat16, 8, q, bf16) +#else +SIMDE_TEST_ARM_NEON_GENERATE_FLOAT_TYPE_EQUAL_FUNC_(bfloat16x4_t, simde_bfloat16_t, simde_bfloat16, 4, , bf16) +SIMDE_TEST_ARM_NEON_GENERATE_FLOAT_TYPE_EQUAL_FUNC_(bfloat16x8_t, simde_bfloat16_t, simde_bfloat16, 8, q, bf16) +#endif + HEDLEY_DIAGNOSTIC_POP #define SIMDE_TEST_ARM_NEON_GENERATE_X2_VECTOR_INT_TYPE_FUNCS_(NT, ET, element_count, modifier, symbol_identifier, neon_identifier) \ @@ -258,6 +265,14 @@ SIMDE_TEST_ARM_NEON_GENERATE_X2_VECTOR_FLOAT_TYPE_EQUAL_FUNC_(float16x4x2_t, sim SIMDE_TEST_ARM_NEON_GENERATE_X2_VECTOR_FLOAT_TYPE_EQUAL_FUNC_(float16x8x2_t, simde_float16_t, simde_float16, 8, q, f16) #endif +#if SIMDE_BFLOAT16_API == SIMDE_BFLOAT16_API_BF16 +SIMDE_TEST_ARM_NEON_GENERATE_X2_VECTOR_FLOAT_TYPE_FUNCS_(bfloat16x4x2_t, simde_bfloat16_t, simde_bfloat16, 4, , bf16) +SIMDE_TEST_ARM_NEON_GENERATE_X2_VECTOR_FLOAT_TYPE_FUNCS_(bfloat16x8x2_t, simde_bfloat16_t, simde_bfloat16, 8, q, bf16) +#else +SIMDE_TEST_ARM_NEON_GENERATE_X2_VECTOR_FLOAT_TYPE_EQUAL_FUNC_(bfloat16x4x2_t, simde_bfloat16_t, simde_bfloat16, 4, , bf16) +SIMDE_TEST_ARM_NEON_GENERATE_X2_VECTOR_FLOAT_TYPE_EQUAL_FUNC_(bfloat16x8x2_t, simde_bfloat16_t, simde_bfloat16, 8, q, bf16) +#endif + HEDLEY_DIAGNOSTIC_POP #endif @@ -412,6 +427,14 @@ SIMDE_TEST_ARM_NEON_GENERATE_X3_VECTOR_FLOAT_TYPE_EQUAL_FUNC_(float16x4x3_t, sim SIMDE_TEST_ARM_NEON_GENERATE_X3_VECTOR_FLOAT_TYPE_EQUAL_FUNC_(float16x8x3_t, simde_float16_t, simde_float16, 8, q, f16) #endif +#if SIMDE_BFLOAT16_API == SIMDE_BFLOAT16_API_BF16 +SIMDE_TEST_ARM_NEON_GENERATE_X3_VECTOR_FLOAT_TYPE_FUNCS_(bfloat16x4x3_t, simde_bfloat16_t, simde_bfloat16, 4, , bf16) +SIMDE_TEST_ARM_NEON_GENERATE_X3_VECTOR_FLOAT_TYPE_FUNCS_(bfloat16x8x3_t, simde_bfloat16_t, simde_bfloat16, 8, q, bf16) +#else +SIMDE_TEST_ARM_NEON_GENERATE_X3_VECTOR_FLOAT_TYPE_EQUAL_FUNC_(bfloat16x4x3_t, simde_bfloat16_t, simde_bfloat16, 4, , bf16) +SIMDE_TEST_ARM_NEON_GENERATE_X3_VECTOR_FLOAT_TYPE_EQUAL_FUNC_(bfloat16x8x3_t, simde_bfloat16_t, simde_bfloat16, 8, q, bf16) +#endif + HEDLEY_DIAGNOSTIC_POP #endif @@ -583,6 +606,14 @@ SIMDE_TEST_ARM_NEON_GENERATE_X4_VECTOR_FLOAT_TYPE_EQUAL_FUNC_(float16x4x4_t, sim SIMDE_TEST_ARM_NEON_GENERATE_X4_VECTOR_FLOAT_TYPE_EQUAL_FUNC_(float16x8x4_t, simde_float16_t, simde_float16, 8, q, f16) #endif +#if SIMDE_BFLOAT16_API == SIMDE_BFLOAT16_API_BF16 +SIMDE_TEST_ARM_NEON_GENERATE_X4_VECTOR_FLOAT_TYPE_FUNCS_(bfloat16x4x4_t, simde_bfloat16_t, simde_bfloat16, 4, , bf16) +SIMDE_TEST_ARM_NEON_GENERATE_X4_VECTOR_FLOAT_TYPE_FUNCS_(bfloat16x8x4_t, simde_bfloat16_t, simde_bfloat16, 8, q, bf16) +#else +SIMDE_TEST_ARM_NEON_GENERATE_X4_VECTOR_FLOAT_TYPE_EQUAL_FUNC_(bfloat16x4x4_t, simde_bfloat16_t, simde_bfloat16, 4, , bf16) +SIMDE_TEST_ARM_NEON_GENERATE_X4_VECTOR_FLOAT_TYPE_EQUAL_FUNC_(bfloat16x8x4_t, simde_bfloat16_t, simde_bfloat16, 8, q, bf16) +#endif + HEDLEY_DIAGNOSTIC_POP #endif @@ -706,6 +737,15 @@ HEDLEY_DIAGNOSTIC_POP #define simde_test_arm_neon_assert_equal_p16x8x4(a, b) do { if (simde_test_arm_neon_assert_equal_p16x8x4_(a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0) #define simde_test_arm_neon_assert_equal_p64x2x4(a, b) do { if (simde_test_arm_neon_assert_equal_p64x2x4_(a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0) +#define simde_test_arm_neon_assert_equal_bf16x4(a, b, precision) do { if (simde_test_arm_neon_assert_equal_bf16x4_(a, b, simde_test_bf16_precision_to_slop(precision), __FILE__, __LINE__, #a, #b)) { return 1; } } while (0) +#define simde_test_arm_neon_assert_equal_bf16x8(a, b, precision) do { if (simde_test_arm_neon_assert_equal_bf16x8_(a, b, simde_test_bf16_precision_to_slop(precision), __FILE__, __LINE__, #a, #b)) { return 1; } } while (0) +#define simde_test_arm_neon_assert_equal_bf16x4x2(a, b, precision) do { if (simde_test_arm_neon_assert_equal_bf16x4x2_(a, b, simde_test_bf16_precision_to_slop(precision), __FILE__, __LINE__, #a, #b)) { return 1; } } while (0) +#define simde_test_arm_neon_assert_equal_bf16x8x2(a, b, precision) do { if (simde_test_arm_neon_assert_equal_bf16x8x2_(a, b, simde_test_bf16_precision_to_slop(precision), __FILE__, __LINE__, #a, #b)) { return 1; } } while (0) +#define simde_test_arm_neon_assert_equal_bf16x4x3(a, b, precision) do { if (simde_test_arm_neon_assert_equal_bf16x4x3_(a, b, simde_test_bf16_precision_to_slop(precision), __FILE__, __LINE__, #a, #b)) { return 1; } } while (0) +#define simde_test_arm_neon_assert_equal_bf16x8x3(a, b, precision) do { if (simde_test_arm_neon_assert_equal_bf16x8x3_(a, b, simde_test_bf16_precision_to_slop(precision), __FILE__, __LINE__, #a, #b)) { return 1; } } while (0) +#define simde_test_arm_neon_assert_equal_bf16x4x4(a, b, precision) do { if (simde_test_arm_neon_assert_equal_bf16x4x4_(a, b, simde_test_bf16_precision_to_slop(precision), __FILE__, __LINE__, #a, #b)) { return 1; } } while (0) +#define simde_test_arm_neon_assert_equal_bf16x8x4(a, b, precision) do { if (simde_test_arm_neon_assert_equal_bf16x8x4_(a, b, simde_test_bf16_precision_to_slop(precision), __FILE__, __LINE__, #a, #b)) { return 1; } } while (0) + /* HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION */ HEDLEY_DIAGNOSTIC_POP diff --git a/test/test.h b/test/test.h index c604b555e..d9ac6015d 100644 --- a/test/test.h +++ b/test/test.h @@ -4,6 +4,7 @@ #include "../simde/hedley.h" #include "../simde/simde-common.h" #include "../simde/simde-f16.h" +#include "../simde/simde-bf16.h" #include #include @@ -159,6 +160,18 @@ simde_test_codegen_f64(size_t buf_len, char buf[HEDLEY_ARRAY_PARAM(buf_len)], si } } +static void +simde_test_codegen_bf16(size_t buf_len, char buf[HEDLEY_ARRAY_PARAM(buf_len)], simde_bfloat16 value) { + simde_float32 valuef = simde_bfloat16_to_float32(value); + if (simde_isnanbf(value)) { + simde_test_codegen_snprintf_(buf, buf_len, " SIMDE_NANBF"); + } else if (simde_isinfbf(value)) { + simde_test_codegen_snprintf_(buf, buf_len, "%5cSIMDE_INFINITYBF", valuef < 0 ? '-' : ' '); + } else { + simde_test_codegen_snprintf_(buf, buf_len, "SIMDE_BFLOAT16_VALUE(%9.2f)", HEDLEY_STATIC_CAST(double, valuef)); + } +} + static void simde_test_codegen_i8(size_t buf_len, char buf[HEDLEY_ARRAY_PARAM(buf_len)], int8_t value) { if (value == INT8_MIN) { @@ -335,6 +348,17 @@ simde_test_codegen_random_f64(simde_float64 min, simde_float64 max) { return simde_math_round(v * SIMDE_FLOAT64_C(100.0)) / SIMDE_FLOAT64_C(100.0); } +static simde_bfloat16 +simde_test_codegen_random_bf16(simde_bfloat16 min, simde_bfloat16 max) { + return + simde_bfloat16_from_float32( + simde_test_codegen_random_f32( + simde_bfloat16_to_float32(min), + simde_bfloat16_to_float32(max) + ) + ); +} + typedef enum SimdeTestVecFloatMask { SIMDE_TEST_VEC_FLOAT_DEFAULT = 0, SIMDE_TEST_VEC_FLOAT_PAIR = 1, @@ -468,6 +492,19 @@ simde_test_codegen_random_vf64_full( vec_type); } +static void +simde_test_codegen_random_vbf16_full( + size_t test_sets, size_t vectors_per_set, size_t elements_per_vector, + simde_bfloat16 values[HEDLEY_ARRAY_PARAM(test_sets * vectors_per_set * elements_per_vector)], + simde_bfloat16 min, simde_bfloat16 max, + SimdeTestVecFloatType vec_type) { + simde_test_codegen_random_vfX_full_(test_sets, vectors_per_set, elements_per_vector, + sizeof(simde_bfloat16), values, + HEDLEY_STATIC_CAST(simde_float64, simde_bfloat16_to_float32(min)), + HEDLEY_STATIC_CAST(simde_float64, simde_bfloat16_to_float32(max)), + vec_type); +} + static void simde_test_codegen_random_vf16(size_t elem_count, simde_float16 values[HEDLEY_ARRAY_PARAM(elem_count)], simde_float16 min, simde_float16 max) { for (size_t i = 0 ; i < elem_count ; i++) { @@ -489,6 +526,13 @@ simde_test_codegen_random_vf64(size_t elem_count, simde_float64 values[HEDLEY_AR } } +static void +simde_test_codegen_random_vbf16(size_t elem_count, simde_bfloat16 values[HEDLEY_ARRAY_PARAM(elem_count)], simde_bfloat16 min, simde_bfloat16 max) { + for (size_t i = 0 ; i < elem_count ; i++) { + values[i] = simde_test_codegen_random_bf16(min, max); + } +} + #define SIMDE_TEST_CODEGEN_GENERATE_RANDOM_INT_FUNC_(T, symbol_identifier) \ static T simde_test_codegen_random_##symbol_identifier(void) { \ T r; \ @@ -571,6 +615,7 @@ SIMDE_TEST_CODEGEN_GENERATE_RANDOM_INT_FUNC_(simde_poly64, p64) SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_(simde_float16, f16, 4) SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_(simde_float32, f32, 4) SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_(simde_float64, f64, 4) +SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_(simde_bfloat16, bf16, 4) SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_(int8_t, i8, 8) SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_(int16_t, i16, 8) SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_(int32_t, i32, 8) @@ -597,6 +642,7 @@ SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_(simde_poly64, p64, 4) #define simde_test_codegen_write_1vp8(indent, elem_count, values) simde_test_codegen_write_vp8_full( (indent), (elem_count), #values, (values), SIMDE_TEST_VEC_POS_SINGLE) #define simde_test_codegen_write_1vp16(indent, elem_count, values) simde_test_codegen_write_vp16_full((indent), (elem_count), #values, (values), SIMDE_TEST_VEC_POS_SINGLE) #define simde_test_codegen_write_1vp64(indent, elem_count, values) simde_test_codegen_write_vp64_full((indent), (elem_count), #values, (values), SIMDE_TEST_VEC_POS_SINGLE) +#define simde_test_codegen_write_1vbf16(indent, elem_count, values) simde_test_codegen_write_vbf16_full((indent), (elem_count), #values, (values), SIMDE_TEST_VEC_POS_SINGLE) #define SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_(T, symbol_identifier) \ static void \ @@ -659,6 +705,7 @@ SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_(simde_float64, f64) SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_(simde_poly8, p8) SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_(simde_poly16, p16) SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_(simde_poly64, p64) +SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_(simde_bfloat16, bf16) #define simde_test_codegen_write_1i8(indent, value) simde_test_codegen_write_i8_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE) #define simde_test_codegen_write_1i16(indent, value) simde_test_codegen_write_i16_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE) @@ -674,6 +721,7 @@ SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_(simde_poly64, p64) #define simde_test_codegen_write_1p8(indent, value) simde_test_codegen_write_p8_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE) #define simde_test_codegen_write_1p16(indent, value) simde_test_codegen_write_p16_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE) #define simde_test_codegen_write_1p64(indent, value) simde_test_codegen_write_p64_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE) +#define simde_test_codegen_write_1bf16(indent, value) simde_test_codegen_write_bf16_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE) HEDLEY_DIAGNOSTIC_PUSH SIMDE_DIAGNOSTIC_DISABLE_FLOAT_EQUAL_ @@ -729,6 +777,15 @@ simde_test_equal_f64(simde_float64 a, simde_float64 b, simde_float64 slop) { } } +static int +simde_test_equal_bf16(simde_bfloat16 a, simde_bfloat16 b, simde_bfloat16 slop) { + simde_float32 + af = simde_bfloat16_to_float32(a), + bf = simde_bfloat16_to_float32(b), + slopf = simde_bfloat16_to_float32(slop); + return simde_test_equal_f32(af, bf, slopf); +} + HEDLEY_DIAGNOSTIC_POP static simde_float16 @@ -746,6 +803,11 @@ simde_test_f64_precision_to_slop(int precision) { return HEDLEY_UNLIKELY(precision == INT_MAX) ? SIMDE_FLOAT64_C(0.0) : simde_math_pow(SIMDE_FLOAT64_C(10.0), -HEDLEY_STATIC_CAST(double, precision)); } +static simde_bfloat16 +simde_test_bf16_precision_to_slop(int precision) { + return HEDLEY_UNLIKELY(precision == INT_MAX) ? SIMDE_BFLOAT16_VALUE(0.0) : simde_bfloat16_from_float32(simde_math_powf(SIMDE_FLOAT32_C(10.0), -HEDLEY_STATIC_CAST(float, precision))); +} + static int simde_assert_equal_vf16_( size_t vec_len, simde_float16 const a[HEDLEY_ARRAY_PARAM(vec_len)], simde_float16 const b[HEDLEY_ARRAY_PARAM(vec_len)], simde_float16 slop, @@ -836,6 +898,42 @@ simde_assert_equal_f64_(simde_float64 a, simde_float64 b, simde_float64 slop, } #define simde_assert_equal_f64(a, b, precision) do { if (simde_assert_equal_f64_(a, b, simde_test_f64_precision_to_slop(precision), __FILE__, __LINE__, #a, #b)) { return 1; } } while (0) +static int +simde_assert_equal_vbf16_( + size_t vec_len, simde_bfloat16 const a[HEDLEY_ARRAY_PARAM(vec_len)], simde_bfloat16 const b[HEDLEY_ARRAY_PARAM(vec_len)], simde_bfloat16 slop, + const char* filename, int line, const char* astr, const char* bstr) { + simde_float32 slop_ = simde_bfloat16_to_float32(slop); + for (size_t i = 0 ; i < vec_len ; i++) { + simde_float32 a_ = simde_bfloat16_to_float32(a[i]); + simde_float32 b_ = simde_bfloat16_to_float32(b[i]); + + if (HEDLEY_UNLIKELY(!simde_test_equal_f32(a_, b_, slop_))) { + simde_test_debug_printf_("%s:%d: assertion failed: %s[%zu] ~= %s[%zu] (%f ~= %f)\n", + filename, line, astr, i, bstr, i, HEDLEY_STATIC_CAST(double, a_), + HEDLEY_STATIC_CAST(double, b_)); + SIMDE_TEST_ASSERT_RETURN(1); + } + } + return 0; +} +#define simde_assert_equal_vbf16(vec_len, a, b, precision) do { if (simde_assert_equal_vbf16_(vec_len, a, b, simde_test_bf16_precision_to_slop(precision), __FILE__, __LINE__, #a, #b)) { return 1; } } while (0) + +static int +simde_assert_equal_bf16_(simde_bfloat16 a, simde_bfloat16 b, simde_bfloat16 slop, + const char* filename, int line, const char* astr, const char* bstr) { + simde_float32 a_ = simde_bfloat16_to_float32(a); + simde_float32 b_ = simde_bfloat16_to_float32(b); + simde_float32 slop_ = simde_bfloat16_to_float32(slop); + if (HEDLEY_UNLIKELY(!simde_test_equal_f32(a_, b_, slop_))) { + simde_test_debug_printf_("%s:%d: assertion failed: %s ~= %s (%f ~= %f)\n", + filename, line, astr, bstr, HEDLEY_STATIC_CAST(double, a_), + HEDLEY_STATIC_CAST(double, b_)); + SIMDE_TEST_ASSERT_RETURN(1); + } + return 0; +} +#define simde_assert_equal_bf16(a, b, precision) do { if (simde_assert_equal_bf16_(a, b, simde_test_bf16_precision_to_slop(precision), __FILE__, __LINE__, #a, #b)) { return 1; } } while (0) + static int simde_assert_equal_vp8_( size_t vec_len, simde_poly8 const a[HEDLEY_ARRAY_PARAM(vec_len)], simde_poly8 const b[HEDLEY_ARRAY_PARAM(vec_len)],