9#if defined(VECMAT_USE_F64)
11static svbool_t
pg4(
void)
13 return svwhilelt_b64((uint64_t)0, (uint64_t)4);
16static svfloat64_t
hadamard_div(svbool_t pg, svfloat64_t a, svfloat64_t b)
18 const svfloat64_t zero = svdup_n_f64(0.0);
19 const svbool_t eqz = svcmpeq_f64(pg, b, zero);
20 const svfloat64_t safe = svsel_f64(eqz, svdup_n_f64(1.0), b);
21 return svsel_f64(eqz, zero, svdiv_f64_z(pg, a, safe));
24static svfloat64_t
sign4(svbool_t pg, svfloat64_t x)
26 const svfloat64_t zero = svdup_n_f64(0.0);
27 const svfloat64_t one = svdup_n_f64(1.0);
28 svfloat64_t r = svsel_f64(svcmpgt_f64(pg, x, zero), one, zero);
29 return svsel_f64(svcmplt_f64(pg, x, zero), svneg_f64_z(pg, one), r);
34 const svbool_t pg =
pg4();
35 svst1_f64(pg, res->
v, svadd_f64_z(pg, svld1_f64(pg, a->
v), svld1_f64(pg, b->
v)));
40 const svbool_t pg =
pg4();
41 svst1_f64(pg, res->
v, svsub_f64_z(pg, svld1_f64(pg, a->
v), svld1_f64(pg, b->
v)));
46 const svbool_t pg =
pg4();
47 svst1_f64(pg, res->
v, svmul_f64_z(pg, svld1_f64(pg, a->
v), svld1_f64(pg, b->
v)));
52 const svbool_t pg =
pg4();
53 svst1_f64(pg, res->
v, svmul_n_f64_z(pg, svld1_f64(pg, v->
v), s));
58 const svbool_t pg =
pg4();
60 svst1_f64(pg, res->
v, svdup_n_f64(0.0));
63 svst1_f64(pg, res->
v, svdiv_n_f64_z(pg, svld1_f64(pg, v->
v), s));
68 const svbool_t pg =
pg4();
69 svst1_f64(pg, res->
v, svneg_f64_z(pg, svld1_f64(pg, v->
v)));
74 const svbool_t pg =
pg4();
75 svst1_f64(pg, res->
v, svabs_f64_z(pg, svld1_f64(pg, v->
v)));
80 const svbool_t pg =
pg4();
81 const svfloat64_t x = svld1_f64(pg, v->
v);
82 const double len2 = svaddv_f64(pg, svmul_f64_z(pg, x, x));
87 const svfloat64_t s = svdup_n_f64(len2);
88 svfloat64_t e = svrsqrte_f64(s);
89 e = svmul_f64_z(pg, e, svrsqrts_f64(s, svmul_f64_z(pg, e, e)));
90 e = svmul_f64_z(pg, e, svrsqrts_f64(s, svmul_f64_z(pg, e, e)));
91 svst1_f64(pg, res->
v, svmul_f64_z(pg, x, e));
96 const svbool_t pg =
pg4();
97 svst1_f64(pg, res->
v, svmin_f64_z(pg, svld1_f64(pg, a->
v), svld1_f64(pg, b->
v)));
102 const svbool_t pg =
pg4();
103 svst1_f64(pg, res->
v, svmax_f64_z(pg, svld1_f64(pg, a->
v), svld1_f64(pg, b->
v)));
108 const svbool_t pg =
pg4();
109 const svfloat64_t va = svld1_f64(pg, a->
v);
110 const svfloat64_t d = svsub_f64_z(pg, svld1_f64(pg, b->
v), va);
111 svst1_f64(pg, res->
v, svmla_n_f64_z(pg, va, d, t));
117 const svbool_t pg =
pg4();
118 svfloat64_t x = svld1_f64(pg, v->
v);
119 x = svmax_f64_z(pg, svld1_f64(pg, min->
v), x);
120 x = svmin_f64_z(pg, svld1_f64(pg, max->
v), x);
121 svst1_f64(pg, res->
v, x);
126 const svbool_t pg =
pg4();
127 svst1_f64(pg, res->
v,
hadamard_div(pg, svld1_f64(pg, a->
v), svld1_f64(pg, b->
v)));
132 const svbool_t pg =
pg4();
133 svst1_f64(pg, res->
v, svadd_n_f64_z(pg, svld1_f64(pg, v->
v), s));
138 const svbool_t pg =
pg4();
139 svst1_f64(pg, res->
v, svsub_n_f64_z(pg, svld1_f64(pg, v->
v), s));
144 const svbool_t pg =
pg4();
145 svfloat64_t x = svmax_n_f64_z(pg, svld1_f64(pg, v->
v), min);
146 svst1_f64(pg, res->
v, svmin_n_f64_z(pg, x, max));
151 const svbool_t pg =
pg4();
152 svfloat64_t x = svmax_n_f64_z(pg, svld1_f64(pg, v->
v), 0.0);
153 svst1_f64(pg, res->
v, svmin_n_f64_z(pg, x, 1.0));
158 const svbool_t pg =
pg4();
159 svst1_f64(pg, res->
v,
sign4(pg, svld1_f64(pg, v->
v)));
164 const svbool_t pg =
pg4();
165 svst1_f64(pg, res->
v, svrintm_f64_z(pg, svld1_f64(pg, v->
v)));
170 const svbool_t pg =
pg4();
171 svst1_f64(pg, res->
v, svrintp_f64_z(pg, svld1_f64(pg, v->
v)));
176 const svbool_t pg =
pg4();
177 svst1_f64(pg, res->
v, svrinta_f64_z(pg, svld1_f64(pg, v->
v)));
182 const svbool_t pg =
pg4();
183 const svfloat64_t x = svld1_f64(pg, v->
v);
184 svst1_f64(pg, res->
v, svsub_f64_z(pg, x, svrintm_f64_z(pg, x)));
189 const svbool_t pg =
pg4();
191 svst1_f64(pg, res->
v, svmul_n_f64_z(pg, svld1_f64(pg, v->
v), 1.0 / v->
w));
194 svst1_f64(pg, res->
v, svdup_n_f64(0.0));
198static svfloat64_t
quat_mul4(svbool_t pg, svfloat64_t a, svfloat64_t b)
200 const uint64_t i1[4] = {3, 2, 1, 0};
201 const uint64_t i2[4] = {2, 3, 0, 1};
202 const uint64_t i3[4] = {1, 0, 3, 2};
203 const svuint64_t lane = svindex_u64(0, 1);
204 const svbool_t n13 = svorr_z(pg, svcmpeq_n_u64(pg, lane, 1), svcmpeq_n_u64(pg, lane, 3));
205 const svbool_t n23 = svorr_z(pg, svcmpeq_n_u64(pg, lane, 2), svcmpeq_n_u64(pg, lane, 3));
206 const svbool_t n03 = svorr_z(pg, svcmpeq_n_u64(pg, lane, 0), svcmpeq_n_u64(pg, lane, 3));
208 svfloat64_t t1 = svtbl_f64(b, svld1_u64(pg, i1));
209 svfloat64_t t2 = svtbl_f64(b, svld1_u64(pg, i2));
210 svfloat64_t t3 = svtbl_f64(b, svld1_u64(pg, i3));
211 t1 = svneg_f64_m(t1, n13, t1);
212 t2 = svneg_f64_m(t2, n23, t2);
213 t3 = svneg_f64_m(t3, n03, t3);
216 svst1_f64(pg, aa, a);
217 svfloat64_t r = svmul_n_f64_z(pg, b, aa[3]);
218 r = svmla_n_f64_z(pg, r, t1, aa[0]);
219 r = svmla_n_f64_z(pg, r, t2, aa[1]);
220 r = svmla_n_f64_z(pg, r, t3, aa[2]);
226 const svbool_t pg =
pg4();
227 svst1_f64(pg, res->
v,
quat_mul4(pg, svld1_f64(pg, a->
v), svld1_f64(pg, b->
v)));
237static svbool_t
pg4(
void)
239 return svwhilelt_b32((uint32_t)0, (uint32_t)4);
242static svfloat32_t
hadamard_div(svbool_t pg, svfloat32_t a, svfloat32_t b)
244 const svfloat32_t zero = svdup_n_f32(0.0f);
245 const svbool_t eqz = svcmpeq_f32(pg, b, zero);
246 const svfloat32_t safe = svsel_f32(eqz, svdup_n_f32(1.0f), b);
247 return svsel_f32(eqz, zero, svdiv_f32_z(pg, a, safe));
250static svfloat32_t
sign4(svbool_t pg, svfloat32_t x)
252 const svfloat32_t zero = svdup_n_f32(0.0f);
253 const svfloat32_t one = svdup_n_f32(1.0f);
254 svfloat32_t r = svsel_f32(svcmpgt_f32(pg, x, zero), one, zero);
255 return svsel_f32(svcmplt_f32(pg, x, zero), svneg_f32_z(pg, one), r);
260 const svbool_t pg =
pg4();
261 svst1_f32(pg, res->
v, svadd_f32_z(pg, svld1_f32(pg, a->
v), svld1_f32(pg, b->
v)));
266 const svbool_t pg =
pg4();
267 svst1_f32(pg, res->
v, svsub_f32_z(pg, svld1_f32(pg, a->
v), svld1_f32(pg, b->
v)));
272 const svbool_t pg =
pg4();
273 svst1_f32(pg, res->
v, svmul_f32_z(pg, svld1_f32(pg, a->
v), svld1_f32(pg, b->
v)));
278 const svbool_t pg =
pg4();
279 svst1_f32(pg, res->
v, svmul_n_f32_z(pg, svld1_f32(pg, v->
v), s));
284 const svbool_t pg =
pg4();
286 svst1_f32(pg, res->
v, svdup_n_f32(0.0f));
289 svst1_f32(pg, res->
v, svdiv_n_f32_z(pg, svld1_f32(pg, v->
v), s));
294 const svbool_t pg =
pg4();
295 svst1_f32(pg, res->
v, svneg_f32_z(pg, svld1_f32(pg, v->
v)));
300 const svbool_t pg =
pg4();
301 svst1_f32(pg, res->
v, svabs_f32_z(pg, svld1_f32(pg, v->
v)));
306 const svbool_t pg =
pg4();
307 const svfloat32_t x = svld1_f32(pg, v->
v);
308 const float len2 = svaddv_f32(pg, svmul_f32_z(pg, x, x));
313 const svfloat32_t s = svdup_n_f32(len2);
314 svfloat32_t e = svrsqrte_f32(s);
315 e = svmul_f32_z(pg, e, svrsqrts_f32(s, svmul_f32_z(pg, e, e)));
316 svst1_f32(pg, res->
v, svmul_f32_z(pg, x, e));
321 const svbool_t pg =
pg4();
322 svst1_f32(pg, res->
v, svmin_f32_z(pg, svld1_f32(pg, a->
v), svld1_f32(pg, b->
v)));
327 const svbool_t pg =
pg4();
328 svst1_f32(pg, res->
v, svmax_f32_z(pg, svld1_f32(pg, a->
v), svld1_f32(pg, b->
v)));
333 const svbool_t pg =
pg4();
334 const svfloat32_t va = svld1_f32(pg, a->
v);
335 const svfloat32_t d = svsub_f32_z(pg, svld1_f32(pg, b->
v), va);
336 svst1_f32(pg, res->
v, svmla_n_f32_z(pg, va, d, t));
341 const svbool_t pg =
pg4();
342 svfloat32_t x = svld1_f32(pg, v->
v);
343 x = svmax_f32_z(pg, svld1_f32(pg, min->
v), x);
344 x = svmin_f32_z(pg, svld1_f32(pg, max->
v), x);
345 svst1_f32(pg, res->
v, x);
350 const svbool_t pg =
pg4();
351 svst1_f32(pg, res->
v,
hadamard_div(pg, svld1_f32(pg, a->
v), svld1_f32(pg, b->
v)));
356 const svbool_t pg =
pg4();
357 svst1_f32(pg, res->
v, svadd_n_f32_z(pg, svld1_f32(pg, v->
v), s));
362 const svbool_t pg =
pg4();
363 svst1_f32(pg, res->
v, svsub_n_f32_z(pg, svld1_f32(pg, v->
v), s));
368 const svbool_t pg =
pg4();
369 svfloat32_t x = svmax_n_f32_z(pg, svld1_f32(pg, v->
v), min);
370 svst1_f32(pg, res->
v, svmin_n_f32_z(pg, x, max));
375 const svbool_t pg =
pg4();
376 svfloat32_t x = svmax_n_f32_z(pg, svld1_f32(pg, v->
v), 0.0f);
377 svst1_f32(pg, res->
v, svmin_n_f32_z(pg, x, 1.0f));
382 const svbool_t pg =
pg4();
383 svst1_f32(pg, res->
v,
sign4(pg, svld1_f32(pg, v->
v)));
388 const svbool_t pg =
pg4();
389 svst1_f32(pg, res->
v, svrintm_f32_z(pg, svld1_f32(pg, v->
v)));
394 const svbool_t pg =
pg4();
395 svst1_f32(pg, res->
v, svrintp_f32_z(pg, svld1_f32(pg, v->
v)));
400 const svbool_t pg =
pg4();
401 svst1_f32(pg, res->
v, svrinta_f32_z(pg, svld1_f32(pg, v->
v)));
406 const svbool_t pg =
pg4();
407 const svfloat32_t x = svld1_f32(pg, v->
v);
408 svst1_f32(pg, res->
v, svsub_f32_z(pg, x, svrintm_f32_z(pg, x)));
413 const svbool_t pg =
pg4();
415 svst1_f32(pg, res->
v, svmul_n_f32_z(pg, svld1_f32(pg, v->
v), 1.0f / v->
w));
418 svst1_f32(pg, res->
v, svdup_n_f32(0.0f));
422static svfloat32_t
quat_mul4(svbool_t pg, svfloat32_t a, svfloat32_t b)
424 const uint32_t i1[4] = {3, 2, 1, 0};
425 const uint32_t i2[4] = {2, 3, 0, 1};
426 const uint32_t i3[4] = {1, 0, 3, 2};
427 const svuint32_t lane = svindex_u32(0, 1);
428 const svbool_t n13 = svorr_z(pg, svcmpeq_n_u32(pg, lane, 1), svcmpeq_n_u32(pg, lane, 3));
429 const svbool_t n23 = svorr_z(pg, svcmpeq_n_u32(pg, lane, 2), svcmpeq_n_u32(pg, lane, 3));
430 const svbool_t n03 = svorr_z(pg, svcmpeq_n_u32(pg, lane, 0), svcmpeq_n_u32(pg, lane, 3));
432 svfloat32_t t1 = svtbl_f32(b, svld1_u32(pg, i1));
433 svfloat32_t t2 = svtbl_f32(b, svld1_u32(pg, i2));
434 svfloat32_t t3 = svtbl_f32(b, svld1_u32(pg, i3));
435 t1 = svneg_f32_m(t1, n13, t1);
436 t2 = svneg_f32_m(t2, n23, t2);
437 t3 = svneg_f32_m(t3, n03, t3);
440 svst1_f32(pg, aa, a);
441 svfloat32_t r = svmul_n_f32_z(pg, b, aa[3]);
442 r = svmla_n_f32_z(pg, r, t1, aa[0]);
443 r = svmla_n_f32_z(pg, r, t2, aa[1]);
444 r = svmla_n_f32_z(pg, r, t3, aa[2]);
450 const svbool_t pg =
pg4();
451 svst1_f32(pg, res->
v,
quat_mul4(pg, svld1_f32(pg, a->
v), svld1_f32(pg, b->
v)));
static __m256d hadamard_div(__m256d a, __m256d b)
static __m256d sign4(__m256d x)
void vec4_neg_ptr_sve2(vector4 *res, const vector4 *v)
void vec4_abs_ptr_sve2(vector4 *res, const vector4 *v)
void quat_normalize_ptr_sve2(quaternion *res, const quaternion *q)
void vec4_homogenize_ptr_sve2(vector4 *res, const vector4 *v)
void vec4_round_ptr_sve2(vector4 *res, const vector4 *v)
void vec4_lerp_ptr_sve2(vector4 *res, const vector4 *a, const vector4 *b, vm_float_t t)
void quat_mul_ptr_sve2(quaternion *res, const quaternion *a, const quaternion *b)
void vec4_ceil_ptr_sve2(vector4 *res, const vector4 *v)
void vec4_sub_ptr_sve2(vector4 *res, const vector4 *a, const vector4 *b)
void vec4_div_scalar_ptr_sve2(vector4 *res, const vector4 *v, vm_float_t s)
void vec4_clamp_ptr_sve2(vector4 *res, const vector4 *v, const vector4 *min, const vector4 *max)
void vec4_max_ptr_sve2(vector4 *res, const vector4 *a, const vector4 *b)
void vec4_normalize_ptr_sve2(vector4 *res, const vector4 *v)
void vec4_add_ptr_sve2(vector4 *res, const vector4 *a, const vector4 *b)
void vec4_mul_scalar_ptr_sve2(vector4 *res, const vector4 *v, vm_float_t s)
void vec4_clamp_scalar_ptr_sve2(vector4 *res, const vector4 *v, vm_float_t min, vm_float_t max)
void vec4_div_ptr_sve2(vector4 *res, const vector4 *a, const vector4 *b)
void vec4_add_scalar_ptr_sve2(vector4 *res, const vector4 *v, vm_float_t s)
void vec4_sign_ptr_sve2(vector4 *res, const vector4 *v)
void vec4_mul_ptr_sve2(vector4 *res, const vector4 *a, const vector4 *b)
void vec4_saturate_ptr_sve2(vector4 *res, const vector4 *v)
void vec4_fract_ptr_sve2(vector4 *res, const vector4 *v)
void vec4_sub_scalar_ptr_sve2(vector4 *res, const vector4 *v, vm_float_t s)
void vec4_floor_ptr_sve2(vector4 *res, const vector4 *v)
void vec4_min_ptr_sve2(vector4 *res, const vector4 *a, const vector4 *b)
static svbool_t pg4(void)
static svfloat64_t quat_mul4(svbool_t pg, svfloat64_t a, svfloat64_t b)
vm_float_t v[VECMAT_QUAT_SIZE]
vm_float_t v[VECMAT_VEC4_SIZE]