inline float32x4x4_t identity<float32x4x4_t>() { return float32x4x4_t( float32x4_t(1.0f, 0.0f, 0.0f, 0.0f), float32x4_t(0.0f, 1.0f, 0.0f, 0.0f), float32x4_t(0.0f, 0.0f, 1.0f, 0.0f), float32x4_t(0.0f, 0.0f, 0.0f, 1.0f) ); }
inline float32x4x4_t transpose(float32x4x4_t const & m) { return float32x4x4_t( float32x4_t(m.x.x, m.y.x, m.z.x, m.w.x), float32x4_t(m.x.y, m.y.y, m.z.y, m.w.y), float32x4_t(m.x.z, m.y.z, m.z.z, m.w.z), float32x4_t(m.x.w, m.y.w, m.z.w, m.w.w) ); }
//__attribute__ ((noinline)) inline vector<float, 4> cmin(vector<float, 4> const& v) noexcept { using vector_type = typename vector_traits<float, 4>::vector_type; auto tmp(vpmin_f32(vget_low_f32(float32x4_t(v.data_)), vget_high_f32(float32x4_t(v.data_)))); tmp = vpmin_f32(tmp, tmp); return { vector_type(vcombine_f32(tmp, tmp)) }; }