| 1871 | } |
| 1872 | |
| 1873 | inline vec_float VecCross3D(const vec_float& v1, const vec_float& v2) |
| 1874 | { |
| 1875 | #if defined(TERATHON_SSE) |
| 1876 | |
| 1877 | vec_float c = _mm_mul_ps(v1, _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 0, 2, 1))); |
| 1878 | c = _mm_sub_ps(c, _mm_mul_ps(_mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 0, 2, 1)), v2)); |
| 1879 | return (_mm_shuffle_ps(c, c, _MM_SHUFFLE(3, 0, 2, 1))); |
| 1880 | |
| 1881 | #elif defined(TERATHON_NEON) |
| 1882 | |
| 1883 | static const uint32 mask[4] = {0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF}; |
| 1884 | |
| 1885 | vec_uint32 m = vld1q_u32(mask); |
| 1886 | |
| 1887 | float32x4x2_t u1 = vuzpq_f32(v1, v1); |
| 1888 | float32x4x2_t u2 = vuzpq_f32(v2, v2); |
| 1889 | vec_float w1 = vbslq_f32(m, u1.val[0], u1.val[1]); |
| 1890 | vec_float w2 = vbslq_f32(m, u2.val[0], u2.val[1]); |
| 1891 | vec_float r = vfmsq_f32(vmulq_f32(v1, w2), w1, v2); |
| 1892 | float32x4x2_t s = vuzpq_f32(r, r); |
| 1893 | return (vbslq_f32(m, s.val[0], s.val[1])); |
| 1894 | |
| 1895 | #endif |
| 1896 | } |
| 1897 | |
| 1898 | inline vec_float VecTransformVector3D(const vec_float& c1, const vec_float& c2, const vec_float& c3, const vec_float& v) |
| 1899 | { |
no outgoing calls
no test coverage detected