NEON backend for VectorF32 on AArch64: one float32x4_t per vector (Len * Packing <= 4), with a vectorised sin/cos port of the SSE helpers. VectorF16 gets a native float16x8_t path when the target has ARMv8.2-FP16 arithmetic. Without it VectorF16 aliases VectorF32, which converts fp16 <-> fp32 on Load/Store. The scalar fallback gains the batched Dot that MatrixRowMajor relies on. Test tiers added for armv8-a and armv8.2-a+fp16. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
18 lines
No EOL
634 B
C++
Executable file
18 lines
No EOL
634 B
C++
Executable file
//SPDX-License-Identifier: LGPL-3.0-only
|
|
//SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts®
|
|
|
|
export module Crafter.Math:Basic;
|
|
import std;
|
|
import :VectorF32;
|
|
|
|
namespace Crafter {
|
|
template<typename T>
|
|
constexpr T ToRadian(T degrees) {
|
|
return degrees * (std::numbers::pi / 180);
|
|
}
|
|
|
|
#if (defined(__x86_64) && !defined(__AVX512FP16__)) || defined(__riscv_vector) || (defined(__aarch64__) && defined(__ARM_NEON) && !defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)) || !defined(__FLT16_MAX__)
|
|
export template <std::uint32_t Len, std::uint32_t Packing>
|
|
using VectorF16 = VectorF32<Len, Packing>;
|
|
#endif
|
|
} |