9#if defined(VECMAT_USE_F64)
13 const svbool_t pg = svwhilelt_b64((uint64_t)0, (uint64_t)4);
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);
26 memcpy(res->
v, tmp.
v,
sizeof(tmp.
v));
31 const svbool_t pg = svwhilelt_b64((uint64_t)0, (uint64_t)4);
32 const svuint64_t idx = svindex_u64(0, 4);
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));
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);
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);
69 const svbool_t pg = svwhilelt_b32((uint32_t)0, (uint32_t)4);
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);
82 memcpy(res->
v, tmp.
v,
sizeof(tmp.
v));
87 const svbool_t pg = svwhilelt_b32((uint32_t)0, (uint32_t)4);
88 const svuint32_t idx = svindex_u32(0, 4);
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));
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);
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);
void mat4_mul_vec4_ptr_sve2(vector4 *res, const matrix4 *m, const vector4 *v)
void mat4_transpose_ptr_sve2(matrix4 *res, const matrix4 *m)
void mat4_mul_ptr_sve2(matrix4 *res, const matrix4 *a, const matrix4 *b)
void mat4_mul_vec3_ptr_sve2(vector3 *res, const matrix4 *m, const vector3 *v, vm_float_t w)
vm_float_t v[VECMAT_MAT4_SIZE]
vm_float_t v[VECMAT_VEC4_SIZE]