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_sve(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 matrix4 tmp;
32 for (int i = 0; i < 4; i++) {
33 for (int j = 0; j < 4; j++)
34 tmp.v[i * 4 + j] = m->v[j * 4 + i];
35 }
36 memcpy(res->v, tmp.v, sizeof(tmp.v));
37}
38
39void mat4_mul_vec4_ptr_sve(vector4 *res, const matrix4 *m, const vector4 *v)
40{
41 const svbool_t pg = svwhilelt_b64((uint64_t)0, (uint64_t)4);
42 svfloat64_t r = svmul_n_f64_z(pg, svld1_f64(pg, &m->v[0]), v->x);
43 r = svmla_n_f64_z(pg, r, svld1_f64(pg, &m->v[4]), v->y);
44 r = svmla_n_f64_z(pg, r, svld1_f64(pg, &m->v[8]), v->z);
45 r = svmla_n_f64_z(pg, r, svld1_f64(pg, &m->v[12]), v->w);
46 svst1_f64(pg, res->v, r);
47}
48
49void mat4_mul_vec3_ptr_sve(vector3 *res, const matrix4 *m, const vector3 *v, vm_float_t w)
50{
51 const svbool_t pg = svwhilelt_b64((uint64_t)0, (uint64_t)4);
52 svfloat64_t r = svmul_n_f64_z(pg, svld1_f64(pg, &m->v[0]), v->x);
53 r = svmla_n_f64_z(pg, r, svld1_f64(pg, &m->v[4]), v->y);
54 r = svmla_n_f64_z(pg, r, svld1_f64(pg, &m->v[8]), v->z);
55 r = svmla_n_f64_z(pg, r, svld1_f64(pg, &m->v[12]), w);
56 double t[4];
57 svst1_f64(pg, t, r);
58 res->x = t[0];
59 res->y = t[1];
60 res->z = t[2];
61}
62
63#else /* float */
64
65void mat4_mul_ptr_sve(matrix4 *res, const matrix4 *a, const matrix4 *b)
66{
67 const svbool_t pg = svwhilelt_b32((uint32_t)0, (uint32_t)4);
68 matrix4 tmp;
69 const svfloat32_t a0 = svld1_f32(pg, &a->v[0]);
70 const svfloat32_t a1 = svld1_f32(pg, &a->v[4]);
71 const svfloat32_t a2 = svld1_f32(pg, &a->v[8]);
72 const svfloat32_t a3 = svld1_f32(pg, &a->v[12]);
73 for (int c = 0; c < 4; c++) {
74 svfloat32_t col = svmul_n_f32_z(pg, a0, b->v[c * 4 + 0]);
75 col = svmla_n_f32_z(pg, col, a1, b->v[c * 4 + 1]);
76 col = svmla_n_f32_z(pg, col, a2, b->v[c * 4 + 2]);
77 col = svmla_n_f32_z(pg, col, a3, b->v[c * 4 + 3]);
78 svst1_f32(pg, &tmp.v[c * 4], col);
79 }
80 memcpy(res->v, tmp.v, sizeof(tmp.v));
81}
82
83void mat4_transpose_ptr_sve(matrix4 *res, const matrix4 *m)
84{
85 matrix4 tmp;
86 for (int i = 0; i < 4; i++) {
87 for (int j = 0; j < 4; j++)
88 tmp.v[i * 4 + j] = m->v[j * 4 + i];
89 }
90 memcpy(res->v, tmp.v, sizeof(tmp.v));
91}
92
93void mat4_mul_vec4_ptr_sve(vector4 *res, const matrix4 *m, const vector4 *v)
94{
95 const svbool_t pg = svwhilelt_b32((uint32_t)0, (uint32_t)4);
96 svfloat32_t r = svmul_n_f32_z(pg, svld1_f32(pg, &m->v[0]), v->x);
97 r = svmla_n_f32_z(pg, r, svld1_f32(pg, &m->v[4]), v->y);
98 r = svmla_n_f32_z(pg, r, svld1_f32(pg, &m->v[8]), v->z);
99 r = svmla_n_f32_z(pg, r, svld1_f32(pg, &m->v[12]), v->w);
100 svst1_f32(pg, res->v, r);
101}
102
103void mat4_mul_vec3_ptr_sve(vector3 *res, const matrix4 *m, const vector3 *v, vm_float_t w)
104{
105 const svbool_t pg = svwhilelt_b32((uint32_t)0, (uint32_t)4);
106 svfloat32_t r = svmul_n_f32_z(pg, svld1_f32(pg, &m->v[0]), v->x);
107 r = svmla_n_f32_z(pg, r, svld1_f32(pg, &m->v[4]), v->y);
108 r = svmla_n_f32_z(pg, r, svld1_f32(pg, &m->v[8]), v->z);
109 r = svmla_n_f32_z(pg, r, svld1_f32(pg, &m->v[12]), w);
110 float t[4];
111 svst1_f32(pg, t, r);
112 res->x = t[0];
113 res->y = t[1];
114 res->z = t[2];
115}
116
117#endif
void mat4_mul_ptr_sve(matrix4 *res, const matrix4 *a, const matrix4 *b)
Definition matrix4_ptr.c:11
void mat4_transpose_ptr_sve(matrix4 *res, const matrix4 *m)
Definition matrix4_ptr.c:29
void mat4_mul_vec3_ptr_sve(vector3 *res, const matrix4 *m, const vector3 *v, vm_float_t w)
Definition matrix4_ptr.c:49
void mat4_mul_vec4_ptr_sve(vector4 *res, const matrix4 *m, const vector4 *v)
Definition matrix4_ptr.c:39
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