Vecmat 0.2.3
C math and linear algebra library for 2D/3D graphics, physics, and science.
Loading...
Searching...
No Matches
dispatch.c
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2025-2026 Igal Alkon
2// SPDX-FileCopyrightText: 2026 ALKONTEK <git@alkontek.com>
3// SPDX-License-Identifier: BSD-3-Clause
4
5#include "cpu.h"
6
7#define VECMAT_FN_PTR(name, params, args) name##_fn name##_ = name##_scalar;
9#undef VECMAT_FN_PTR
10
11static int dispatch_ready;
12
13#if defined(VECMAT_ENABLE_SVE2)
14#define VECMAT_PICK_SVE2(name) \
15 if ((features & VM_CPU_SVE2) != 0) { \
16 fn = name##_sve2; \
17 } else
18#else
19#define VECMAT_PICK_SVE2(name)
20#endif
21
22#if defined(VECMAT_ENABLE_SVE)
23#define VECMAT_PICK_SVE(name) \
24 if ((features & VM_CPU_SVE) != 0) { \
25 fn = name##_sve; \
26 } else
27#else
28#define VECMAT_PICK_SVE(name)
29#endif
30
31#if defined(VECMAT_ENABLE_AVX512)
32#define VECMAT_PICK_AVX512(name) \
33 if ((features & VM_CPU_AVX512) != 0) { \
34 fn = name##_avx512; \
35 } else
36#else
37#define VECMAT_PICK_AVX512(name)
38#endif
39
40#if defined(VECMAT_ENABLE_AVX2)
41#define VECMAT_PICK_AVX2(name) \
42 if ((features & VM_CPU_AVX2) != 0) { \
43 fn = name##_avx2; \
44 } else
45#else
46#define VECMAT_PICK_AVX2(name)
47#endif
48
49#if defined(VECMAT_ENABLE_AVX)
50#define VECMAT_PICK_AVX(name) \
51 if ((features & VM_CPU_AVX) != 0) { \
52 fn = name##_avx; \
53 } else
54#else
55#define VECMAT_PICK_AVX(name)
56#endif
57
58#define VECMAT_PICK(name) \
59 do { \
60 name##_fn fn = name##_scalar; \
61 VECMAT_PICK_SVE2(name) \
62 VECMAT_PICK_SVE(name) \
63 VECMAT_PICK_AVX512(name) \
64 VECMAT_PICK_AVX2(name) \
65 VECMAT_PICK_AVX(name) \
66 { /* scalar already set */ } \
67 name##_ = fn; \
68 } while (0)
69
70static void vm_cpu_bind(const vm_cpu_features_t features)
71{
72#define VECMAT_BIND(name, params, args) VECMAT_PICK(name);
74#undef VECMAT_BIND
75}
76
77void vm_cpu_init(void)
78{
80 return;
83}
#define VECMAT_FN_PTR(name, params, args)
Definition dispatch.c:7
static int dispatch_ready
Definition dispatch.c:11
#define VECMAT_BIND(name, params, args)
static void vm_cpu_bind(const vm_cpu_features_t features)
Definition dispatch.c:70
void vm_cpu_init(void)
Definition dispatch.c:77
#define VECMAT_DISPATCH_LIST(X)
uint32_t vm_cpu_features_t
Definition vecmat.h:452
vm_cpu_features_t vm_cpu_selected_features(void)
Definition cpu.c:175