Vecmat 0.2.3
C math and linear algebra library for 2D/3D graphics, physics, and science.
Loading...
Searching...
No Matches
matrix4_ptr.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 <arm_sve.h>
6#include <string.h>
7#include <vecmat.h>
8
9#if defined(VECMAT_USE_F64)
10
11void mat4_mul_ptr_sve2(matrix4 *res, const matrix4 *a, const matrix4 *b)
12{
13 const svbool_t pg = svwhilelt_b64((uint64_t)0, (uint64_t)4);
14 matrix4 tmp;
15 const svfloat64_t a0 = svld1_f64(pg, &a->v[0]);
16 const svfloat64_t a1 = svld1_f64(pg, &a->v[4]);
17 const svfloat64_t a2 = svld1_f64(pg, &a->v[8]);
18 const svfloat64_t a3 = svld1_f64(pg, &a->v[12]);
19 for (int c = 0; c < 4; c++) {
20 svfloat64_t col = svmul_n_f64_z(pg, a0, b->v[c * 4 + 0]);
21 col = svmla_n_f64_z(pg, col, a1, b->v[c * 4 + 1]);
22 col = svmla_n_f64_z(pg, col, a2, b->v[c * 4 + 2]);
23 col = svmla_n_f64_z(pg, col, a3, b->v[c * 4 + 3]);
24 svst1_f64(pg, &tmp.v[c * 4], col);
25 }
26 memcpy(res->v, tmp.v, sizeof(tmp.v));
27}
28
30{
31 const svbool_t pg = svwhilelt_b64((uint64_t)0, (uint64_t)4);
32 const svuint64_t idx = svindex_u64(0, 4);
33 matrix4 tmp;
34 svst1_f64(pg, &tmp.v[0], svld1_gather_u64index_f64(pg, &m->v[0], idx));
35 svst1_f64(pg, &tmp.v[4], svld1_gather_u64index_f64(pg, &m->v[1], idx));
36 svst1_f64(pg, &tmp.v[8], svld1_gather_u64index_f64(pg, &m->v[2], idx));
37 svst1_f64(pg, &tmp.v[12], svld1_gather_u64index_f64(pg, &m->v[3], idx));
38 memcpy(res->v, tmp.v, sizeof(tmp.v));
39}
40
41void mat4_mul_vec4_ptr_sve2(vector4 *res, const matrix4 *m, const vector4 *v)
42{
43 const svbool_t pg = svwhilelt_b64((uint64_t)0, (uint64_t)4);
44 svfloat64_t r = svmul_n_f64_z(pg, svld1_f64(pg, &m->v[0]), v->x);
45 r = svmla_n_f64_z(pg, r, svld1_f64(pg, &m->v[4]), v->y);
46 r = svmla_n_f64_z(pg, r, svld1_f64(pg, &m->v[8]), v->z);
47 r = svmla_n_f64_z(pg, r, svld1_f64(pg, &m->v[12]), v->w);
48 svst1_f64(pg, res->v, r);
49}
50
51void mat4_mul_vec3_ptr_sve2(vector3 *res, const matrix4 *m, const vector3 *v, vm_float_t w)
52{
53 const svbool_t pg = svwhilelt_b64((uint64_t)0, (uint64_t)4);
54 svfloat64_t r = svmul_n_f64_z(pg, svld1_f64(pg, &m->v[0]), v->x);
55 r = svmla_n_f64_z(pg, r, svld1_f64(pg, &m->v[4]), v->y);
56 r = svmla_n_f64_z(pg, r, svld1_f64(pg, &m->v[8]), v->z);
57 r = svmla_n_f64_z(pg, r, svld1_f64(pg, &m->v[12]), w);
58 double t[4];
59 svst1_f64(pg, t, r);
60 res->x = t[0];
61 res->y = t[1];
62 res->z = t[2];
63}
64
65#else /* float */
66
67void mat4_mul_ptr_sve2(matrix4 *res, const matrix4 *a, const matrix4 *b)
68{
69 const svbool_t pg = svwhilelt_b32((uint32_t)0, (uint32_t)4);
70 matrix4 tmp;
71 const svfloat32_t a0 = svld1_f32(pg, &a->v[0]);
72 const svfloat32_t a1 = svld1_f32(pg, &a->v[4]);
73 const svfloat32_t a2 = svld1_f32(pg, &a->v[8]);
74 const svfloat32_t a3 = svld1_f32(pg, &a->v[12]);
75 for (int c = 0; c < 4; c++) {
76 svfloat32_t col = svmul_n_f32_z(pg, a0, b->v[c * 4 + 0]);
77 col = svmla_n_f32_z(pg, col, a1, b->v[c * 4 + 1]);
78 col = svmla_n_f32_z(pg, col, a2, b->v[c * 4 + 2]);
79 col = svmla_n_f32_z(pg, col, a3, b->v[c * 4 + 3]);
80 svst1_f32(pg, &tmp.v[c * 4], col);
81 }
82 memcpy(res->v, tmp.v, sizeof(tmp.v));
83}
84
85void mat4_transpose_ptr_sve2(matrix4 *res, const matrix4 *m)
86{
87 const svbool_t pg = svwhilelt_b32((uint32_t)0, (uint32_t)4);
88 const svuint32_t idx = svindex_u32(0, 4);
89 matrix4 tmp;
90 svst1_f32(pg, &tmp.v[0], svld1_gather_u32index_f32(pg, &m->v[0], idx));
91 svst1_f32(pg, &tmp.v[4], svld1_gather_u32index_f32(pg, &m->v[1], idx));
92 svst1_f32(pg, &tmp.v[8], svld1_gather_u32index_f32(pg, &m->v[2], idx));
93 svst1_f32(pg, &tmp.v[12], svld1_gather_u32index_f32(pg, &m->v[3], idx));
94 memcpy(res->v, tmp.v, sizeof(tmp.v));
95}
96
97void mat4_mul_vec4_ptr_sve2(vector4 *res, const matrix4 *m, const vector4 *v)
98{
99 const svbool_t pg = svwhilelt_b32((uint32_t)0, (uint32_t)4);
100 svfloat32_t r = svmul_n_f32_z(pg, svld1_f32(pg, &m->v[0]), v->x);
101 r = svmla_n_f32_z(pg, r, svld1_f32(pg, &m->v[4]), v->y);
102 r = svmla_n_f32_z(pg, r, svld1_f32(pg, &m->v[8]), v->z);
103 r = svmla_n_f32_z(pg, r, svld1_f32(pg, &m->v[12]), v->w);
104 svst1_f32(pg, res->v, r);
105}
106
107void mat4_mul_vec3_ptr_sve2(vector3 *res, const matrix4 *m, const vector3 *v, vm_float_t w)
108{
109 const svbool_t pg = svwhilelt_b32((uint32_t)0, (uint32_t)4);
110 svfloat32_t r = svmul_n_f32_z(pg, svld1_f32(pg, &m->v[0]), v->x);
111 r = svmla_n_f32_z(pg, r, svld1_f32(pg, &m->v[4]), v->y);
112 r = svmla_n_f32_z(pg, r, svld1_f32(pg, &m->v[8]), v->z);
113 r = svmla_n_f32_z(pg, r, svld1_f32(pg, &m->v[12]), w);
114 float t[4];
115 svst1_f32(pg, t, r);
116 res->x = t[0];
117 res->y = t[1];
118 res->z = t[2];
119}
120
121#endif
void mat4_mul_vec4_ptr_sve2(vector4 *res, const matrix4 *m, const vector4 *v)
Definition matrix4_ptr.c:41
void mat4_transpose_ptr_sve2(matrix4 *res, const matrix4 *m)
Definition matrix4_ptr.c:29
void mat4_mul_ptr_sve2(matrix4 *res, const matrix4 *a, const matrix4 *b)
Definition matrix4_ptr.c:11
void mat4_mul_vec3_ptr_sve2(vector3 *res, const matrix4 *m, const vector3 *v, vm_float_t w)
Definition matrix4_ptr.c:51
vm_float_t v[VECMAT_MAT4_SIZE]
Definition vecmat.h:271
vm_float_t z
Definition vecmat.h:139
vm_float_t y
Definition vecmat.h:138
vm_float_t x
Definition vecmat.h:137
vm_float_t z
Definition vecmat.h:150
vm_float_t v[VECMAT_VEC4_SIZE]
Definition vecmat.h:153
vm_float_t x
Definition vecmat.h:148
vm_float_t y
Definition vecmat.h:149
vm_float_t w
Definition vecmat.h:151
double vm_float_t
Definition vecmat.h:79